OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
main_l2extract.c
Go to the documentation of this file.
1 /*
2  Modification history:
3  Programmer Organization Date Description of change
4  -------------- ------------ -------- ---------------------
5  Joel Gales Futuretech 08/10/03 Original Development
6 
7  */
8 
9 /*
10  Revision 2.0.2 12/06/17
11  Add support for prodlist for netcdf4 files
12  J. Gales
13 
14  Revision 1.000 01/08/13
15  Don't read control points if lonlatinterp == 0
16  J. Gales
17 
18  Revision 0.993 05/21/10
19  Fix east/westmost lon for extracts crossing dateline
20  J. Gales
21 
22  Revision 0.992 09/26/08
23  Only print prodlist (arg 9) if it exists
24  J. Gales
25 
26  Revision 0.991 06/18/08
27  Don't extract on "pxls" dimention for OCTS
28  J. Gales
29 
30  Revision 0.990 12/05/06
31  Fix slat,clat,...,slon,clon,...,& lon/lat boundary metadata
32  J. Gales
33 
34  Revision 0.983 08/08/06
35  Make cntl_pt_cols 1-based
36  J. Gales
37 
38  Revision 0.982 06/15/06
39  Set octs only if Level 1
40  J. Gales
41 
42  Revision 0.981 06/01/06
43  Make sure sscan is odd and escan is even if OCTS
44  J. Gales
45 
46  Revision 0.98 05/30/06
47  Fix problem with OCTS L1A extraction
48  J. Gales
49  */
50 
51 
52 #include <stdio.h>
53 #include <math.h>
54 #include <time.h>
55 #include <string.h>
56 #include <unistd.h>
57 #include "hdf.h"
58 #include "mfhdf.h"
59 #include <genutils.h>
60 
61 #include "l2extract.h"
62 #include <timeutils.h>
63 
64 int main(int argc, char *argv[]) {
65 
66  int32 i;
67  int32 j;
68  int32 k;
69  int32 n;
70  int32 jds;
71  int32 sds_id;
72  int32 dims[8];
73  int32 dims_w[256][8];
74  int32 dims_lonlat[2];
75  int32 rank;
76  int32 nelem;
77  int32 dtype;
78  int32 nattrs;
79  int32 status;
80  int32 LAC_start;
81  int32 i32;
82  int32 lonlatinterp = 1;
83 
84  int32 zero = 0;
85  // int32 one = 1;
86 
87  int32 vg_ref;
88  int32 vgid_r;
89  int32 vgid_w;
90  int32 tag;
91  int32 ref;
92  // int32 listlen = 0;
93  int32 npixl;
94  int32 nscans;
95  // int32 nread;
96  // int32 nwrite;
97  int32 sscan, escan, nscan;
98  int32 spix, epix;
99  // int32 maskout;
100  // int32 fldsize;
101  int32 octs = 0;
102  int32 seawifs_l1a = 0;
103 
104  int32 startyear = 0, cenyear = 0, endyear = 0;
105  int32 startday = 0, cenday = 0, endday = 0;
106  int32 startmsec = 0, cenmsec = 0, endmsec = 0;
107  float64 utime;
108 
109  float32 northern_lat = -90.0;
110  float32 southern_lat = +90.0;
111  float32 western_lon = +180.0;
112  float32 eastern_lon = -180.0;
113 
114  static char buffer[2048];
115  static char buf2[2048];
116  static char prodlist[2048];
117  static char geophyslist[2048];
118 
119  static char fieldname[FIELDNAMELENMAX];
120  static char attrname[FIELDNAMELENMAX];
121  char *infile, *outfile; // , parm_list[1024];
122 
123  char *data;
124  char *data2;
125 
126  int32 HDFfid_r;
127  int32 sd_id_r;
128  int32 HDFfid_w;
129  int32 sd_id_w;
130  int32 sds_id_w;
131  int32 ndatasets;
132  int32 nglobal_attr;
133  int32 count;
134  int32 dim_id_r;
135  int32 dim_id_w;
136  int32 start[8] = {0, 0, 0, 0, 0, 0, 0, 0};
137  int32 edge[8] = {0, 0, 0, 0, 0, 0, 0, 0};
138  int32 start_w[8] = {0, 0, 0, 0, 0, 0, 0, 0};
139  // int32 maxsize;
140  int32 n_cntl_pnts;
141  int32 pix_sub, sc_sub;
142  float32 f32, delta;
143 
144  int32 ntilts;
145  int16 old_tilt_flags[20];
146  int16 old_tilt_ranges[20][2];
147  int16 new_tilt_flags[20];
148  int16 new_tilt_ranges[20][2];
149  int16 stilt, etilt;
150 
151  int32 nvgrp = 3;
152  char *vgrpname[] = {"Scan-Line Attributes",
153  "Geophysical Data",
154  "Navigation Data"};
155 
156  float32 lllon, lllat, lrlon, lrlat, ullon, ullat, urlon, urlat;
157  float32 sclon, sclat, cclon, cclat, eclon, eclat;
158  float32 csolz;
159 
160  char cntl_pt_cols_buf[4 * 4096];
161  char *ver = "2.0.2";
162  // char proc_con[2048];
163  char title[128];
164 
165  float32 f32_buf[4096];
166  float32 spline_arr[4096];
167 
168  uint8 datelinecross = 0;
169 
170  printf("This is version %s of %s (compiled on %s %s)\n",
171  ver, "l2extract", __DATE__, __TIME__);
172 
173  /*** check Usage ***/
174 
175  if (argc < 8) {
176  printf("\n\n\nUsage: <%s> ", argv[0]);
177  printf("infile spix epix sscan escan pix_sub sc_sub outfile <prodlist>"
178  "\n where:"
179  "\n\tinfile - input l2 data HDF file"
180  "\n\tspix - start pixel number (1-based)"
181  "\n\tepix - end pixel number (1-based)"
182  "\n\tsscan - start line (1-based)"
183  "\n\tescan - end line (1-based)"
184  "\n\tpix_sub - pixel subsampling rate"
185  "\n\tsc_sub - scan line subsampling rate"
186  "\n\toutfile - output file name"
187  "\n\tprodlist - product list, comma separated (optional)"
188  "\n");
189  printf("\nNote: Enter line number NOT scan number!\n");
190 
191  exit(EXIT_FAILURE);
192  }
193 
194  /*** load input parameters into local variables */
195 
196  infile = argv[1];
197  outfile = argv[8];
198  spix = atoi(argv[2]);
199  epix = atoi(argv[3]);
200  sscan = atoi(argv[4]);
201  escan = atoi(argv[5]);
202  pix_sub = atoi(argv[6]);
203  sc_sub = atoi(argv[7]);
204 
205  if (pix_sub != 1 || sc_sub != 1) {
206  printf("Subsampling not yet implemented.\n");
207  exit(EXIT_FAILURE);
208  }
209 
210  prodlist[0] = 0;
211  if (argv[9] != NULL) {
212  strcpy(prodlist, ",l2_flags,");
213  strcat(prodlist, argv[9]);
214  strcat(prodlist, ",");
215  printf("prodlist: %s\n", argv[9]);
216  }
217 
218  // if it is not HDF4 then try netCDF
219  if (!Hishdf(infile)) {
220  return extractNetCDF(infile, outfile, spix, epix, sscan, escan, prodlist);
221  }
222 
223  HDFfid_r = Hopen(infile, DFACC_READ, 0);
224  status = Vstart(HDFfid_r);
225  sd_id_r = SDstart(infile, DFACC_RDONLY);
226 
227  /* Get number of scan lines */
228  /* ------------------------ */
229  status = SDreadattr(sd_id_r, SDfindattr(sd_id_r, "Number of Scan Lines"),
230  (VOIDP) & i32);
231 
232  /* Read Title, Check if OCTS L1 */
233  /* ---------------------------- */
234  status = SDreadattr(sd_id_r, SDfindattr(sd_id_r, "Title"), (VOIDP) title);
235  if (strncmp(title, "OCTS", 4) == 0) octs = 1;
236  if (strstr(title, "Level-2") != 0) octs = 0;
237  if (strcmp(title, "SeaWiFS Level-1A Data") == 0) seawifs_l1a = 1;
238 
239  /* If OCTS make sure sscan is odd and escan is even */
240  /* ------------------------------------------------ */
241  if (octs == 1) {
242  if ((sscan % 2) == 0) sscan -= 1;
243  if ((escan % 2) == 1) escan -= 1;
244  printf("Actual OCTS sscan: %d\n", sscan);
245  printf("Actual OCTS escan: %d\n", escan);
246  }
247 
248  /* Determine number of datasets in input files */
249  SDfileinfo(sd_id_r, &ndatasets, &nglobal_attr);
250 
251  if (sscan == -1 && spix == -1) lonlatinterp = 0;
252 
253  if (sscan == -1) {
254  sscan = 1;
255  escan = i32;
256  }
257 
258  if (escan > i32 * (octs + 1)) {
259  printf("escan: %d greater than # of scan lines: %d\n", escan, i32);
260  exit(BOUNDS_ERROR);
261  }
262 
263  status = SDreadattr(sd_id_r, SDfindattr(sd_id_r, "Pixels per Scan Line"),
264  (VOIDP) & i32);
265 
266  if (spix == -1) {
267  spix = 1;
268  epix = i32;
269  }
270 
271  if (epix > i32) {
272  printf("epix: %d greater than # of pixels per scan: %d\n", epix, i32);
273  exit(BOUNDS_ERROR);
274  }
275 
276  printf("sscan: %d escan: %d\n", sscan, escan);
277  nscan = escan - sscan + 1;
278 
279 
280  /* Create output HDF file */
281  /* ---------------------- */
282  HDFfid_w = Hopen(outfile, DFACC_CREATE, 0);
283  status = Vstart(HDFfid_w);
284  sd_id_w = SDstart(outfile, DFACC_RDWR);
285 
286 
287  /* For each dataset (CREATE) ... */
288  /* ----------------------------- */
289  vg_ref = Vfind(HDFfid_r, "Geophysical Data");
290  vgid_r = Vattach(HDFfid_r, vg_ref, "r");
291  strcpy(geophyslist, ",");
292  for (i = 0; i < Vntagrefs(vgid_r); i++) {
293  status = Vgettagref(vgid_r, i, &tag, &ref);
294  sds_id = SDselect(sd_id_r, SDreftoindex(sd_id_r, ref));
295  status = SDgetinfo(sds_id, buffer, &rank, dims, &dtype, &nattrs);
296  SDendaccess(sds_id);
297  strcat(geophyslist, buffer);
298  strcat(geophyslist, ",");
299  }
300  Vdetach(vgid_r);
301 
302 
303  for (jds = 0; jds < ndatasets; jds++) {
304  sds_id = SDselect(sd_id_r, jds);
305  status = SDgetinfo(sds_id, fieldname, &rank, dims, &dtype, &nattrs);
306 
307  printf("Name: %s rank: %d type: %d\n", fieldname, rank, dtype);
308 
309  /* Check if L2 product field & in prodlist */
310  /* --------------------------------------- */
311  if (prodlist[0] != 0) {
312 
313  strcpy(buffer, ",");
314  strcat(buffer, fieldname);
315  strcat(buffer, ",");
316 
317  if (strstr(geophyslist, buffer) == NULL) goto LBL1;
318  if (strstr(prodlist, buffer) == NULL) continue;
319  }
320 
321  LBL1:
322 
323 
324  /* Determine extract dimensions */
325  /* ---------------------------- */
326  for (i = 0; i < rank; i++) {
327  dim_id_r = SDgetdimid(sds_id, i);
328  dim_id_w = SDgetdimid(sds_id_w, i);
329  SDdiminfo(dim_id_r, buffer, &count, &i32, &i32);
330 
331  dims_w[jds][i] = dims[i];
332 
333  if (octs == 1) {
334  /* OCTS */
335 
336  if (strcmp(fieldname, "samp_table") == 0) continue;
337 
338  if (strcmp(buffer, "rec") == 0) {
339  dims_w[jds][i] = (escan - sscan + 1) / 2;
340  }
341 
342  if (strcmp(buffer, "lines") == 0) {
343  dims_w[jds][i] = escan - sscan + 1;
344  }
345 
346  if (strcmp(buffer, "blines") == 0) {
347  dims_w[jds][i] = 5 * (escan - sscan + 1);
348  }
349 
350  if (strcmp(buffer, "nsamp") == 0) {
351  dims_w[jds][i] = epix - spix + 1;
352  }
353 
354  // if (strcmp(buffer, "pxls") == 0) {
355  // dims_w[jds][i] = (epix - spix + 1) / 20 + 1;
356  //}
357 
358  } else {
359  if (strcmp(buffer, "Number of Scan Lines") == 0) {
360  dims_w[jds][i] = escan - sscan + 1;
361  }
362 
363  if (strcmp(buffer, "Pixels per Scan Line") == 0) {
364  dims_w[jds][i] = epix - spix + 1;
365  }
366 
367  if (strcmp(buffer, "Number of Pixel Control Points") == 0) {
368  if (lonlatinterp) {
369  n_cntl_pnts = count;
370  dims_w[jds][i] = epix - spix + 1;
371  }
372  }
373 
374  }
375  }
376 
377  for (k = 0; k < rank; k++) printf("%d\n", dims_w[jds][k]);
378  printf("---------------\n");
379 
380  /* Create extract SDS */
381  /* ------------------ */
382  sds_id_w = SDcreate(sd_id_w, fieldname, dtype, rank, dims_w[jds]);
383  if (sds_id_w == -1) {
384  printf("Field: %s cannot be created\n", fieldname);
385  exit(EXIT_FAILURE);
386  }
387 
388  /* Set dimension names */
389  /* ------------------- */
390  for (i = 0; i < rank; i++) {
391  dim_id_r = SDgetdimid(sds_id, i);
392  dim_id_w = SDgetdimid(sds_id_w, i);
393  SDdiminfo(dim_id_r, buffer, &count, &i32, &i32);
394  SDsetdimname(dim_id_w, buffer);
395  }
396 
397  /* Read & Write SDS attributes */
398  /* --------------------------- */
399  for (i = 0; i < nattrs; i++) {
400  status = SDreadattr(sds_id, i, (VOIDP) buf2);
401  status = SDattrinfo(sds_id, i, attrname, &dtype, &count);
402  status = SDsetattr(sds_id_w, attrname, dtype, count, (VOIDP) buf2);
403  }
404 
405 
406  /* Get lon/lat control points */
407  /* -------------------------- */
408  if (strcmp(fieldname, "cntl_pt_cols") == 0 && lonlatinterp == 1) {
409  status = SDreaddata(sds_id, start, NULL, dims, (VOIDP) cntl_pt_cols_buf);
410 
411  /* Convert cntl pnts from I32 to F32 */
412  /* --------------------------------- */
413  for (i = 0; i < n_cntl_pnts; i++) {
414  memcpy(&i32, &cntl_pt_cols_buf[4 * i], sizeof (int32));
415  f32 = (float32) i32;
416  memcpy(&cntl_pt_cols_buf[4 * i], &f32, sizeof (float32));
417  }
418  }
419 
420  SDendaccess(sds_id_w);
421  SDendaccess(sds_id);
422  } /* End Create SD */
423  /* printf("-----------------------------\n");*/
424 
425 
426  /* Get #scan lines, #pixels per scan */
427  /* --------------------------------- */
428  for (i = 0; i < nglobal_attr; i++) {
429  status = SDattrinfo(sd_id_r, i, buffer, &dtype, &count);
430  data = (char *) calloc(count, DFKNTsize(dtype));
431  status = SDreadattr(sd_id_r, i, (VOIDP) data);
432 
433  if (strcmp(buffer, "Number of Scan Lines") == 0) {
434  memcpy(&nscans, data, 4);
435  }
436 
437  if (strcmp(buffer, "Pixels per Scan Line") == 0) {
438  memcpy(&npixl, data, 4);
439  }
440  free(data);
441  }
442 
443 
444  /* Copy Datasets */
445  /* ------------- */
446  n = 0;
447 
448  for (jds = 0; jds < ndatasets; jds++) {
449  sds_id = SDselect(sd_id_r, jds);
450  status = SDgetinfo(sds_id, fieldname, &rank, dims, &dtype, &nattrs);
451 
452 
453  /* Check if L2 product field & in prodlist */
454  /* --------------------------------------- */
455  if (prodlist[0] != 0) {
456 
457  strcpy(buffer, ",");
458  strcat(buffer, fieldname);
459  strcat(buffer, ",");
460 
461  if (strstr(geophyslist, buffer) == NULL) goto LBL2;
462  if (strstr(prodlist, buffer) == NULL) continue;
463  }
464 
465  LBL2:
466 
467  printf("[Copy] %s\n", fieldname);
468 
469  sds_id_w = SDselect(sd_id_w, n++);
470 
471 
472  /* Determine start & nelem */
473  /* ----------------------- */
474  for (i = 0; i < rank; i++) {
475  start[i] = 0;
476 
477  dim_id_w = SDgetdimid(sds_id_w, i);
478  SDdiminfo(dim_id_w, buffer, &count, &i32, &nattrs);
479  SDsetdimname(dim_id_w, buffer);
480 
481  if (octs == 1) {
482  /* OCTS */
483  if (strcmp(fieldname, "samp_table_") != 0) {
484 
485  if (strcmp(buffer, "rec") == 0) {
486  start[i] = (sscan - 1) / 2;
487  }
488 
489  if (strcmp(buffer, "lines") == 0) {
490  start[i] = sscan - 1;
491  }
492 
493  if (strcmp(buffer, "blines") == 0) {
494  start[i] = 5 * (sscan - 1);
495  }
496 
497  if (strcmp(buffer, "nsamp") == 0) {
498  start[i] = spix - 1;
499  }
500 
501  // if (strcmp(buffer, "pxls") == 0) {
502  // start[i] = (spix - 1) / 20;
503  //}
504  }
505  } else {
506  if (strcmp(buffer, "Number of Scan Lines") == 0) {
507  start[i] = sscan - 1;
508  }
509 
510  if (strcmp(buffer, "Pixels per Scan Line") == 0) {
511  start[i] = spix - 1;
512  }
513  }
514 
515  if (i == 0)
516  nelem = dims_w[jds][i];
517  else
518  nelem *= dims_w[jds][i];
519  }
520 
521 
522  if (seawifs_l1a == 0) {
523  if (strcmp(fieldname, "slat") == 0 ||
524  strcmp(fieldname, "slon") == 0 ||
525  strcmp(fieldname, "elon") == 0 ||
526  strcmp(fieldname, "elat") == 0 ||
527  strcmp(fieldname, "clon") == 0 ||
528  strcmp(fieldname, "clat") == 0) {
529  continue;
530  }
531  }
532 
533 
534  /* Allocate data buffer */
535  /* -------------------- */
536  if (strcmp(fieldname, "latitude") == 0 ||
537  strcmp(fieldname, "longitude") == 0)
538  nelem = nscans * npixl;
539 
540  data = (char *) calloc(nelem, DFKNTsize(dtype));
541 
542 
543  if (strcmp(fieldname, "cntl_pt_cols") == 0 && lonlatinterp == 1) {
544  for (i = 0; i < dims_w[jds][0]; i++) {
545  i32 = i + 1;
546  memcpy(&data[i * 4], &i32, 4);
547  }
548  /* Latitude */
549  /* -------- */
550  } else if (strcmp(fieldname, "latitude") == 0 && lonlatinterp == 1) {
551  dims_lonlat[0] = dims_w[jds][0];
552  dims_lonlat[1] = n_cntl_pnts;
553 
554  for (i = 0; i < dims_w[jds][0]; i++) {
555  start[0] = i + sscan - 1;
556  edge[0] = 1;
557  edge[1] = dims_lonlat[1];
558  status = SDreaddata(sds_id, start, NULL, edge,
559  (VOIDP) & data[4 * i * npixl]);
560  }
561 
562  /* Interpolate Latitude */
563  /* -------------------- */
564  for (j = 0; j < dims_w[jds][0]; j++) {
565  spline((float *) cntl_pt_cols_buf,
566  (float *) &data[j * 4 * npixl],
567  n_cntl_pnts,
568  1e30, 1e30,
569  spline_arr);
570  for (i = spix - 1; i < epix; i++) {
571  splint((float *) cntl_pt_cols_buf,
572  (float *) &data[j * 4 * npixl],
573  spline_arr,
574  n_cntl_pnts,
575  i + 1.0,
576  &f32_buf[i - spix + 1]);
577 
578  /* Determine northmost & southmost lat */
579  /* ----------------------------------- */
580  if (f32_buf[i - spix + 1] > northern_lat) northern_lat = f32_buf[i - spix + 1];
581  if (f32_buf[i - spix + 1] < southern_lat) southern_lat = f32_buf[i - spix + 1];
582  }
583 
584  memcpy(&data[j * 4 * dims_w[jds][1]], f32_buf, 4 * dims_w[jds][1]);
585  }
586 
587  /* Longitude */
588  /* --------- */
589  } else if (strcmp(fieldname, "longitude") == 0 && lonlatinterp == 1) {
590  dims_lonlat[0] = dims_w[jds][0];
591  dims_lonlat[1] = n_cntl_pnts;
592 
593  for (i = 0; i < dims_w[jds][0]; i++) {
594  start[0] = i + sscan - 1;
595  edge[0] = 1;
596  edge[1] = dims_lonlat[1];
597  status = SDreaddata(sds_id, start, NULL, edge,
598  (VOIDP) & data[4 * i * npixl]);
599  }
600 
601  /* Interpolate Longitude */
602  /* --------------------- */
603  for (j = 0; j < dims_w[jds][0]; j++) {
604 
605  /* Remove any dateline discontinuity in the longitudes */
606  /* --------------------------------------------------- */
607  for (i = 1; i < dims_lonlat[1]; i++) {
608  memcpy(&f32_buf[1], &data[4 * (j * npixl + i)], 4);
609  memcpy(&f32_buf[0], &data[4 * (j * npixl + i - 1)], 4);
610  delta = f32_buf[1] - f32_buf[0];
611  if (delta < -180) {
612  f32_buf[1] += 360;
613  datelinecross = 1;
614  } else if (delta > 180) {
615  f32_buf[1] -= 360;
616  datelinecross = 1;
617  }
618  memcpy(&data[4 * (j * npixl + i)], &f32_buf[1], 4);
619  }
620 
621  spline((float *) cntl_pt_cols_buf,
622  (float *) &data[j * 4 * npixl],
623  n_cntl_pnts,
624  1e30, 1e30,
625  spline_arr);
626  for (i = spix - 1; i < epix; i++) {
627  splint((float *) cntl_pt_cols_buf,
628  (float *) &data[j * 4 * npixl],
629  spline_arr,
630  n_cntl_pnts,
631  i + 1.0,
632  &f32_buf[i - spix + 1]);
633  if (f32_buf[i - spix + 1] > +180) f32_buf[i - spix + 1] -= 360;
634  if (f32_buf[i - spix + 1] < -180) f32_buf[i - spix + 1] += 360;
635 
636  /* Determine eastmost & westmost lon */
637  /* --------------------------------- */
638  if (f32_buf[i - spix + 1] > eastern_lon) eastern_lon = f32_buf[i - spix + 1];
639  if (f32_buf[i - spix + 1] < western_lon) western_lon = f32_buf[i - spix + 1];
640  }
641  memcpy(&data[j * 4 * dims_w[jds][1]], f32_buf, 4 * dims_w[jds][1]);
642  }
643 
644  } else {
645  status = SDreaddata(sds_id, start, NULL, dims_w[jds], (VOIDP) data);
646  if (status == -1) {
647  printf("read status: %d for %s\n\n", status, fieldname);
648  exit(EXIT_FAILURE);
649  }
650  }
651 
652 
653 
654  /* Modify time/date fields */
655  /* ----------------------- */
656  if (strcmp(fieldname, "year") == 0) {
657  memcpy(&startyear, &data[0], 4);
658  memcpy(&cenyear, &data[4 * (dims_w[jds][0] / 2)], 4);
659  memcpy(&endyear, &data[4 * (dims_w[jds][0] - 1)], 4);
660  }
661 
662  if (strcmp(fieldname, "day") == 0) {
663  memcpy(&startday, &data[0], 4);
664  memcpy(&cenday, &data[4 * (dims_w[jds][0] / 2)], 4);
665  memcpy(&endday, &data[4 * (dims_w[jds][0] - 1)], 4);
666  }
667 
668  if (strcmp(fieldname, "msec") == 0) {
669  memcpy(&startmsec, &data[0], 4);
670  memcpy(&cenmsec, &data[4 * (dims_w[jds][0] / 2)], 4);
671  memcpy(&endmsec, &data[4 * (dims_w[jds][0] - 1)], 4);
672  }
673 
674  if (strcmp(fieldname, "longitude") == 0) {
675  memcpy(&ullon, &data[0], 4);
676  memcpy(&lllon, &data[4 * (dims_w[jds][1]*(dims_w[jds][0] - 1))], 4);
677 
678  memcpy(&urlon, &data[4 * (dims_w[jds][1] - 1)], 4);
679  memcpy(&lrlon, &data[4 * (dims_w[jds][0] * dims_w[jds][1] - 1)], 4);
680 
681  memcpy(&cclon, &data[4 * (dims_w[jds][1] * dims_w[jds][0] / 2 -
682  dims_w[jds][1] / 2)], 4);
683  memcpy(&sclon, &data[4 * (dims_w[jds][1] / 2)], 4);
684  memcpy(&eclon, &data[4 * (dims_w[jds][1] * dims_w[jds][0] -
685  dims_w[jds][1] / 2)], 4);
686  }
687 
688  if (strcmp(fieldname, "latitude") == 0) {
689  memcpy(&ullat, &data[0], 4);
690  memcpy(&lllat, &data[4 * (dims_w[jds][1]*(dims_w[jds][0] - 1))], 4);
691 
692  memcpy(&urlat, &data[4 * (dims_w[jds][1] - 1)], 4);
693  memcpy(&lrlat, &data[4 * (dims_w[jds][0] * dims_w[jds][1] - 1)], 4);
694 
695  memcpy(&cclat, &data[4 * (dims_w[jds][1] * dims_w[jds][0] / 2 -
696  dims_w[jds][1] / 2)], 4);
697  memcpy(&sclat, &data[4 * (dims_w[jds][1] / 2)], 4);
698  memcpy(&eclat, &data[4 * (dims_w[jds][1] * dims_w[jds][0] -
699  dims_w[jds][1] / 2)], 4);
700  }
701 
702  if (octs == 1) {
703  if (strcmp(fieldname, "lon") == 0) {
704  memcpy(&ullon, &data[0], 4);
705  memcpy(&lllon, &data[4 * (dims_w[jds][0] - 1) * dims_w[jds][1]], 4);
706 
707  memcpy(&urlon, &data[4 * (dims_w[jds][1] - 1)], 4);
708  memcpy(&lrlon, &data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1]
709  + dims_w[jds][1] - 1)], 4);
710 
711  memcpy(&cclon, &data[4 * ((dims_w[jds][0] / 2) * dims_w[jds][1]
712  + dims_w[jds][1] / 2)], 4);
713  memcpy(&sclon, &data[4 * (dims_w[jds][1] / 2)], 4);
714  memcpy(&eclon, &data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1]
715  + dims_w[jds][1] / 2)], 4);
716  }
717 
718  if (strcmp(fieldname, "lat") == 0) {
719  memcpy(&ullat, &data[0], 4);
720  memcpy(&lllat, &data[4 * (dims_w[jds][0] - 1) * dims_w[jds][1]], 4);
721 
722  memcpy(&urlat, &data[4 * (dims_w[jds][1] - 1)], 4);
723  memcpy(&lrlat, &data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1]
724  + dims_w[jds][1] - 1)], 4);
725 
726  memcpy(&cclat, &data[4 * ((dims_w[jds][0] / 2) * dims_w[jds][1]
727  + dims_w[jds][1] / 2)], 4);
728  memcpy(&sclat, &data[4 * (dims_w[jds][1] / 2)], 4);
729  memcpy(&eclat, &data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1]
730  + dims_w[jds][1] / 2)], 4);
731  }
732  }
733 
734  if (strcmp(fieldname, "csol_z") == 0) {
735  memcpy(&csolz, &data[4 * (dims_w[jds][0] / 2)], 4);
736  }
737 
738  if (strcmp(fieldname, "ntilts") == 0) {
739  memcpy(&ntilts, data, 4);
740  }
741 
742  if (strcmp(fieldname, "tilt_flags") == 0) {
743  memcpy(old_tilt_flags, data, 2 * 20);
744  }
745 
746  if (strcmp(fieldname, "tilt_ranges") == 0) {
747 
748  memset(new_tilt_flags, 0, 2 * 20);
749  memset(new_tilt_ranges, 0, 2 * 2 * 20);
750  memcpy(old_tilt_ranges, data, 2 * 2 * 20);
751 
752  for (i = 0; i < ntilts; i++) {
753  if (sscan >= old_tilt_ranges[i][0] &&
754  sscan <= old_tilt_ranges[i][1]) {
755  stilt = i;
756  }
757 
758  if (escan >= old_tilt_ranges[i][0] &&
759  escan <= old_tilt_ranges[i][1]) {
760  etilt = i;
761  }
762  }
763  ntilts = etilt - stilt + 1;
764 
765  for (i = 0; i < ntilts; i++) {
766  new_tilt_ranges[i][0] = old_tilt_ranges[stilt + i][0] - sscan + 1;
767  new_tilt_ranges[i][1] = old_tilt_ranges[stilt + i][1] - sscan + 1;
768 
769  if (new_tilt_ranges[i][0] < 1) new_tilt_ranges[i][0] = 1;
770  if (new_tilt_ranges[i][1] < 1) new_tilt_ranges[i][0] = 1;
771 
772  if (new_tilt_ranges[i][0] > nscan) new_tilt_ranges[i][0] = nscan;
773  if (new_tilt_ranges[i][1] > nscan) new_tilt_ranges[i][1] = nscan;
774 
775  new_tilt_flags[i] = old_tilt_flags[stilt + i];
776  new_tilt_flags[i] = old_tilt_flags[stilt + i];
777  }
778 
779  memcpy(data, new_tilt_ranges, 2 * 2 * 20);
780  }
781 
782 
783  /* Write extract field */
784  /* ------------------- */
785  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data);
786  if (status == -1) {
787  printf("write status: %d\n\n", status);
788  exit(EXIT_FAILURE);
789  }
790 
791 
792  /* Write slon,elon,clon */
793  /* -------------------- */
794  if (strcmp(fieldname, "longitude") == 0) {
795  data2 = (char *) calloc(dims_w[jds][0], DFKNTsize(dtype));
796 
797  /* slon */
798  for (j = 0; j < dims_w[jds][0]; j++) {
799  k = DFKNTsize(dtype);
800  memcpy(&data2[k * j], &data[k * j * dims_w[jds][1]], DFKNTsize(dtype));
801  }
802  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "slon"));
803  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
804  if (status == -1) {
805  printf("write status: %d\n\n", status);
806  exit(EXIT_FAILURE);
807  }
808 
809  /* elon */
810  for (j = 0; j < dims_w[jds][0]; j++) {
811  k = DFKNTsize(dtype);
812  memcpy(&data2[k * j], &data[k * (j * dims_w[jds][1] + dims_w[jds][1] - 1)], DFKNTsize(dtype));
813  }
814  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "elon"));
815  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
816  if (status == -1) {
817  printf("write status: %d\n\n", status);
818  exit(EXIT_FAILURE);
819  }
820 
821  /* clon */
822  for (j = 0; j < dims_w[jds][0]; j++) {
823  k = DFKNTsize(dtype);
824  memcpy(&data2[k * j], &data[k * (j * dims_w[jds][1] + dims_w[jds][1] / 2)], DFKNTsize(dtype));
825  }
826  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "clon"));
827  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
828  if (status == -1) {
829  printf("write status: %d\n\n", status);
830  exit(EXIT_FAILURE);
831  }
832  free(data2);
833  }
834 
835 
836  /* Write slat,elat,clat */
837  /* -------------------- */
838  if (strcmp(fieldname, "latitude") == 0) {
839  data2 = (char *) calloc(dims_w[jds][0], DFKNTsize(dtype));
840 
841  /* slat */
842  for (j = 0; j < dims_w[jds][0]; j++) {
843  k = DFKNTsize(dtype);
844  memcpy(&data2[k * j], &data[k * j * dims_w[jds][1]], DFKNTsize(dtype));
845  }
846  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "slat"));
847  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
848  if (status == -1) {
849  printf("write status: %d\n\n", status);
850  exit(EXIT_FAILURE);
851  }
852 
853  /* elat */
854  for (j = 0; j < dims_w[jds][0]; j++) {
855  k = DFKNTsize(dtype);
856  memcpy(&data2[k * j], &data[k * (j * dims_w[jds][1] + dims_w[jds][1] - 1)], DFKNTsize(dtype));
857  }
858  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "elat"));
859  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
860  if (status == -1) {
861  printf("write status: %d\n\n", status);
862  exit(EXIT_FAILURE);
863  }
864 
865  /* clat */
866  for (j = 0; j < dims_w[jds][0]; j++) {
867  k = DFKNTsize(dtype);
868  memcpy(&data2[k * j], &data[k * (j * dims_w[jds][1] + dims_w[jds][1] / 2)], DFKNTsize(dtype));
869  }
870  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "clat"));
871  status = SDwritedata(sds_id_w, start_w, NULL, dims_w[jds], (VOIDP) data2);
872  if (status == -1) {
873  printf("write status: %d\n\n", status);
874  exit(EXIT_FAILURE);
875  }
876  free(data2);
877  }
878 
879 
880  free(data);
881 
882  SDendaccess(sds_id);
883  SDendaccess(sds_id_w);
884 
885  } /* Dataset Loop */
886 
887 
888 
889  /* Correct "tilt" fields */
890  /* --------------------- */
891  sds_id = SDselect(sd_id_w, SDnametoindex(sd_id_w, "ntilts"));
892  if (sds_id != -1) {
893  status = SDgetinfo(sds_id, fieldname, &rank, dims, &dtype, &nattrs);
894  status = SDwritedata(sds_id, &zero, NULL, dims, (VOIDP) & ntilts);
895  if (status == -1) {
896  printf("write ntilts status: %d\n\n", status);
897  exit(EXIT_FAILURE);
898  }
899  }
900 
901  sds_id = SDselect(sd_id_w, SDnametoindex(sd_id_w, "tilt_flags"));
902  if (sds_id != -1) {
903  status = SDgetinfo(sds_id, fieldname, &rank, dims, &dtype, &nattrs);
904  status = SDwritedata(sds_id, &zero, NULL, dims,
905  (VOIDP) new_tilt_flags);
906  if (status == -1) {
907  printf("write tilt_flags status: %d for %d\n\n", status, jds);
908  exit(EXIT_FAILURE);
909  }
910  }
911 
912 
913  /* If Seawifs L1A determine geo limits */
914  /* ----------------------------------- */
915  if (seawifs_l1a) {
916 
917  start_w[0] = 0;
918  dims_w[0][0] = epix - spix + 1;
919  data2 = (char *) calloc(dims_w[0][0], sizeof (float));
920 
921  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "slon"));
922  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
923 
924  memcpy(&ullon, &data2[0], sizeof (float));
925  memcpy(&lllon, &data2[sizeof (float)*(epix - spix)], sizeof (float));
926 
927  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "clon"));
928  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
929 
930  memcpy(&sclon, &data2[0], sizeof (float));
931  memcpy(&eclon, &data2[sizeof (float)*(epix - spix)], sizeof (float));
932  memcpy(&cclon, &data2[sizeof (float)*(epix - spix) / 2], sizeof (float));
933 
934  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "elon"));
935  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
936 
937  memcpy(&urlon, &data2[0], sizeof (float));
938  memcpy(&lrlon, &data2[sizeof (float)*(epix - spix)], sizeof (float));
939 
940  eastern_lon = -180.0;
941  western_lon = +180.0;
942  if (ullon > eastern_lon) eastern_lon = ullon;
943  if (lllon > eastern_lon) eastern_lon = lllon;
944  if (sclon > eastern_lon) eastern_lon = sclon;
945  if (eclon > eastern_lon) eastern_lon = eclon;
946  if (urlon > eastern_lon) eastern_lon = urlon;
947  if (lrlon > eastern_lon) eastern_lon = lrlon;
948 
949  if (ullon < western_lon) western_lon = ullon;
950  if (lllon < western_lon) western_lon = lllon;
951  if (sclon < western_lon) western_lon = sclon;
952  if (eclon < western_lon) western_lon = eclon;
953  if (urlon < western_lon) western_lon = urlon;
954  if (lrlon < western_lon) western_lon = lrlon;
955 
956 
957 
958  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "slat"));
959  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
960 
961  memcpy(&ullat, &data2[0], sizeof (float));
962  memcpy(&lllat, &data2[sizeof (float)*(epix - spix)], sizeof (float));
963 
964  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "clat"));
965  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
966 
967  memcpy(&sclat, &data2[0], sizeof (float));
968  memcpy(&eclat, &data2[sizeof (float)*(epix - spix)], sizeof (float));
969  memcpy(&cclat, &data2[sizeof (float)*(epix - spix) / 2], sizeof (float));
970 
971  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, "elat"));
972  status = SDreaddata(sds_id_w, start_w, NULL, dims_w[0], (VOIDP) data2);
973 
974  memcpy(&urlat, &data2[0], sizeof (float));
975  memcpy(&lrlat, &data2[sizeof (float)*(epix - spix)], sizeof (float));
976 
977  northern_lat = -90.0;
978  southern_lat = +90.0;
979  if (ullat > northern_lat) northern_lat = ullat;
980  if (lllat > northern_lat) northern_lat = lllat;
981  if (sclat > northern_lat) northern_lat = sclat;
982  if (eclat > northern_lat) northern_lat = eclat;
983  if (urlat > northern_lat) northern_lat = urlat;
984  if (lrlat > northern_lat) northern_lat = lrlat;
985 
986  if (ullat < southern_lat) southern_lat = ullat;
987  if (lllat < southern_lat) southern_lat = lllat;
988  if (sclat < southern_lat) southern_lat = sclat;
989  if (eclat < southern_lat) southern_lat = eclat;
990  if (urlat < southern_lat) southern_lat = urlat;
991  if (lrlat < southern_lat) southern_lat = lrlat;
992 
993  /*
994  if (strcmp(buffer, "Scene Center Solar Zenith") == 0) {
995  memcpy(data, &csolz, 4);
996  }
997 
998  if (strcmp(buffer, "Easternmost Longitude") == 0 && lonlatinterp == 1) {
999  memcpy(data, &eastern_lon, 4);
1000  }
1001  if (strcmp(buffer, "Westernmost Longitude") == 0 && lonlatinterp == 1) {
1002  memcpy(data, &western_lon, 4);
1003  }
1004  */
1005 
1006  } else {
1007  if (datelinecross == 1) {
1008  eastern_lon = lllon;
1009  western_lon = lrlon;
1010  }
1011  }
1012 
1013 
1014  /* Write Global Attributes */
1015  /* ----------------------- */
1016  for (i = 0; i < nglobal_attr; i++) {
1017  status = SDattrinfo(sd_id_r, i, buffer, &dtype, &count);
1018 
1019  data = (char *) calloc(count, DFKNTsize(dtype));
1020 
1021  status = SDreadattr(sd_id_r, i, (VOIDP) data);
1022 
1023  if (strcmp(buffer, "Number of Scan Lines") == 0) {
1024  if (octs == 1)
1025  i32 = (escan - sscan + 1) / 2;
1026  else
1027  i32 = escan - sscan + 1;
1028  memcpy(data, &i32, 4);
1029  }
1030 
1031  if (strcmp(buffer, "Pixels per Scan Line") == 0) {
1032  i32 = epix - spix + 1;
1033  memcpy(data, &i32, 4);
1034  }
1035 
1036  if (strcmp(buffer, "Number of Scan Control Points") == 0 && lonlatinterp == 1) {
1037  i32 = escan - sscan + 1;
1038  memcpy(data, &i32, 4);
1039  }
1040 
1041  if (strcmp(buffer, "Number of Pixel Control Points") == 0 && lonlatinterp == 1) {
1042  i32 = epix - spix + 1;
1043  memcpy(data, &i32, 4);
1044  }
1045 
1046  if (strcmp(buffer, "Scene Center Scan Line") == 0) {
1047  i32 = (escan - sscan + 1) / 2 + 1; /*((escan - sscan + 1) % 2);*/
1048  memcpy(data, &i32, 4);
1049  }
1050 
1051  if (strcmp(buffer, "Start Time") == 0) {
1052  if (startyear != 0) {
1053  utime = yds2unix(startyear, startday, startmsec / ((double) 1000.0));
1054  memcpy(data, ydhmsf(utime, 'G'), 17);
1055  }
1056  }
1057  if (strcmp(buffer, "Start Year") == 0) {
1058  if (startyear != 0) memcpy(data, &startyear, 4);
1059  }
1060  if (strcmp(buffer, "Start Day") == 0) {
1061  if (startday != 0) memcpy(data, &startday, 4);
1062  }
1063  if (strcmp(buffer, "Start Millisec") == 0) {
1064  if (startmsec != 0) memcpy(data, &startmsec, 4);
1065  }
1066 
1067 
1068  if (strcmp(buffer, "End Time") == 0) {
1069  if (endyear != 0) {
1070  utime = yds2unix(endyear, endday, endmsec / ((double) 1000.0));
1071  memcpy(data, ydhmsf(utime, 'G'), 17);
1072  }
1073  }
1074  if (strcmp(buffer, "End Year") == 0) {
1075  if (endyear != 0) memcpy(data, &endyear, 4);
1076  }
1077  if (strcmp(buffer, "End Day") == 0) {
1078  if (endday != 0) memcpy(data, &endday, 4);
1079  }
1080  if (strcmp(buffer, "End Millisec") == 0) {
1081  if (endmsec != 0) memcpy(data, &endmsec, 4);
1082  }
1083 
1084  if (strcmp(buffer, "Scene Center Time") == 0) {
1085  if (cenyear != 0) {
1086  utime = yds2unix(cenyear, cenday, cenmsec / ((double) 1000.0));
1087  memcpy(data, ydhmsf(utime, 'G'), 17);
1088  }
1089  }
1090 
1091 
1092  if (strcmp(buffer, "Upper Left Longitude") == 0) {
1093  memcpy(data, &ullon, 4);
1094  }
1095  if (strcmp(buffer, "Upper Right Longitude") == 0) {
1096  memcpy(data, &urlon, 4);
1097  }
1098  if (strcmp(buffer, "Upper Left Latitude") == 0) {
1099  memcpy(data, &ullat, 4);
1100  }
1101  if (strcmp(buffer, "Upper Right Latitude") == 0) {
1102  memcpy(data, &urlat, 4);
1103  }
1104  if (strcmp(buffer, "Start Center Longitude") == 0) {
1105  memcpy(data, &sclon, 4);
1106  }
1107  if (strcmp(buffer, "Start Center Latitude") == 0) {
1108  memcpy(data, &sclat, 4);
1109  }
1110  if (strcmp(buffer, "Scene Center Longitude") == 0) {
1111  memcpy(data, &cclon, 4);
1112  }
1113  if (strcmp(buffer, "Scene Center Latitude") == 0) {
1114  memcpy(data, &cclat, 4);
1115  }
1116  if (strcmp(buffer, "Scene Center Solar Zenith") == 0) {
1117  memcpy(data, &csolz, 4);
1118  }
1119  if (strcmp(buffer, "Lower Left Longitude") == 0) {
1120  memcpy(data, &lllon, 4);
1121  }
1122  if (strcmp(buffer, "Lower Right Longitude") == 0) {
1123  memcpy(data, &lrlon, 4);
1124  }
1125  if (strcmp(buffer, "Lower Left Latitude") == 0) {
1126  memcpy(data, &lllat, 4);
1127  }
1128  if (strcmp(buffer, "Lower Right Latitude") == 0) {
1129  memcpy(data, &lrlat, 4);
1130  }
1131  if (strcmp(buffer, "End Center Longitude") == 0) {
1132  memcpy(data, &eclon, 4);
1133  }
1134  if (strcmp(buffer, "End Center Latitude") == 0) {
1135  memcpy(data, &eclat, 4);
1136  }
1137 
1138  if (strcmp(buffer, "Northernmost Latitude") == 0 && lonlatinterp == 1) {
1139  memcpy(data, &northern_lat, 4);
1140  }
1141  if (strcmp(buffer, "Southernmost Latitude") == 0 && lonlatinterp == 1) {
1142  memcpy(data, &southern_lat, 4);
1143  }
1144  if (strcmp(buffer, "Easternmost Longitude") == 0 && lonlatinterp == 1) {
1145  memcpy(data, &eastern_lon, 4);
1146  }
1147  if (strcmp(buffer, "Westernmost Longitude") == 0 && lonlatinterp == 1) {
1148  memcpy(data, &western_lon, 4);
1149  }
1150 
1151  if (strcmp(buffer, "LAC Pixel Start Number") == 0) {
1152  status = SDreadattr(sd_id_r, i + 1, (VOIDP) & i32);
1153  memcpy(&LAC_start, data, 4);
1154  LAC_start += i32 * (spix - 1);
1155  memcpy(data, &LAC_start, 4);
1156  }
1157 
1158  status = SDsetattr(sd_id_w, buffer, dtype, count, (VOIDP) data);
1159 
1160  /* Set Creation Time to current time
1161  ("Processing Time" is copied from input file */
1162  if (strcmp(buffer, "Processing Time") == 0) {
1163  get_time(data);
1164  status = SDsetattr(sd_id_w, "Creation Time", dtype, count, (VOIDP) data);
1165  }
1166 
1167  /* printf("%d %d\n", i, status);*/
1168  free(data);
1169  }
1170 
1171 
1172  /* Write extract attributes if Level 1 */
1173  /* ----------------------------------- */
1174  for (i = 0; i < nglobal_attr; i++) {
1175  status = SDattrinfo(sd_id_r, i, buffer, &dtype, &count);
1176 
1177  data = (char *) calloc(count, DFKNTsize(dtype));
1178 
1179  status = SDreadattr(sd_id_r, i, (VOIDP) data);
1180 
1181  if (strcmp(buffer, "Title") == 0) {
1182 
1183  if (strstr(data, "Level-1A") != NULL) {
1184 
1185  /* Set Extract Pixel Offset Attribute */
1186  /* ---------------------------------- */
1187  i32 = spix - 1;
1188  status = SDsetattr(sd_id_w, "Extract Pixel Offset", DFNT_INT32, 1,
1189  (VOIDP) & i32);
1190 
1191  /* Set Extract Pixel Count Attribute */
1192  /* --------------------------------- */
1193  i32 = epix - spix + 1;
1194  status = SDsetattr(sd_id_w, "Extract Pixel Count", DFNT_INT32, 1,
1195  (VOIDP) & i32);
1196 
1197  /* Set Extract Line Offset Attribute */
1198  /* --------------------------------- */
1199  i32 = sscan - 1;
1200  status = SDsetattr(sd_id_w, "Extract Line Offset", DFNT_INT32, 1,
1201  (VOIDP) & i32);
1202 
1203  /* Set Extract Line Count Attribute */
1204  /* -------------------------------- */
1205  i32 = escan - sscan + 1;
1206  status = SDsetattr(sd_id_w, "Extract Line Count", DFNT_INT32, 1,
1207  (VOIDP) & i32);
1208  }
1209  free(data);
1210  break;
1211  }
1212  }
1213 
1214 
1215  /* Build and fill Vgroups */
1216  /* ---------------------- */
1217  for (j = 0; j < nvgrp; j++) {
1218  vg_ref = Vfind(HDFfid_r, vgrpname[j]);
1219  vgid_r = Vattach(HDFfid_r, vg_ref, "r");
1220  vgid_w = Vattach(HDFfid_w, -1, "w");
1221  Vgetname(vgid_r, buffer);
1222  Vsetname(vgid_w, buffer);
1223  Vgetclass(vgid_r, buffer);
1224  Vsetclass(vgid_w, buffer);
1225 
1226  for (i = 0; i < Vntagrefs(vgid_r); i++) {
1227  status = Vgettagref(vgid_r, i, &tag, &ref);
1228  sds_id = SDselect(sd_id_r, SDreftoindex(sd_id_r, ref));
1229  status = SDgetinfo(sds_id, fieldname, &rank, dims, &dtype, &nattrs);
1230 
1231 
1232  /* Check if L2 product field & in prodlist */
1233  /* --------------------------------------- */
1234  if (prodlist[0] != 0 &&
1235  strcmp(vgrpname[j], "Geophysical Data") == 0) {
1236 
1237  strcpy(buf2, ",");
1238  strcat(buf2, fieldname);
1239  strcat(buf2, ",");
1240 
1241  if (strstr(prodlist, buf2) == NULL) goto LBL3;
1242  }
1243 
1244  sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, fieldname));
1245  Vaddtagref(vgid_w, DFTAG_NDG, SDidtoref(sds_id_w));
1246 
1247  SDendaccess(sds_id_w);
1248  LBL3:
1249  SDendaccess(sds_id);
1250  }
1251  Vdetach(vgid_r);
1252  Vdetach(vgid_w);
1253  }
1254 
1255 
1256  SDend(sd_id_r);
1257  Hclose(HDFfid_r);
1258  Vend(HDFfid_r);
1259 
1260  SDend(sd_id_w);
1261  Hclose(HDFfid_w);
1262  Vend(HDFfid_w);
1263 
1264  return 0;
1265 }
char * ydhmsf(double dtime, char zone)
Definition: ydhmsf.c:12
integer, parameter int16
Definition: cubeio.f90:3
int extractNetCDF(const char *infile, const char *outfile, int spix, int epix, int sscan, int escan, const char *prodlist)
int j
Definition: decode_rs.h:73
int status
Definition: l1_czcs_hdf.c:32
double yds2unix(int16_t year, int16_t day, double secs)
Definition: yds2unix.c:7
#define NULL
Definition: decode_rs.h:63
subroutine spline(s, x, y, n, in, t, il, iu, vl, vu, e, u)
Definition: phs.f:1348
HDF4 data type of the output SDS Default is DFNT_FLOAT32 Common types used DFNT_INT32
int32 nscan
Definition: l1_czcs_hdf.c:19
int main(int argc, char *argv[])
int32_t prodlist(int32_t sensorID, int32_t evalmask, const char *inprod, const char *defprod, char outprod[L1_MAXPROD][32])
void get_time(char *pr_time)
Definition: get_time.c:28
const double delta
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude data
Definition: HISTORY.txt:356
#define BOUNDS_ERROR
dtype
Definition: DDataset.hpp:31
int32 spix
Definition: l1_czcs_hdf.c:21
Extra metadata that will be written to the HDF4 file l2prod rank
subroutine splint(xa, ya, y2a, n, x, y)
int32 epix
Definition: l1_czcs_hdf.c:23
int i
Definition: decode_rs.h:71
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")
int k
Definition: decode_rs.h:73
float32 f32
Definition: l2bin.cpp:104
int count
Definition: decode_rs.h:79