NASA Logo
Ocean Color Science Software

ocssw V2022
l1subpix.c
Go to the documentation of this file.
1 /* -------------------------------------------------------------------- */
2 /* l1subpix() - sub-samples and/or crops a level-1 record in place */
3 /* */
4 /* Returns 0 on succss, 1 on error. */
5 /* */
6 /* Notes: Only record fields which are filled by the L1 read routines */
7 /* must be updated here. All other fields will be filled later */
8 /* using the sub-sampled geometry and radiances. */
9 /* */
10 /* Written By: B. A. Franz */
11 /* W. Robinson, SAIC 15Feb2017 add geom_per_band shifting */
12 /* -------------------------------------------------------------------- */
13 
14 #include <string.h>
15 #include "l1.h"
16 
17 int l1subpix(filehandle *l1file, l1str *l1rec) {
18  int32_t sp = l1file->spix;
19  int32_t ep = l1file->epix;
20  int32_t dp = l1_input->dpixl;
21  int32_t nbands = l1file->nbands;
22 
23  if ((sp == 0) && (ep == l1file->npix - 1) && dp == 1)
24  return (0);
25 
26  if (sp > ep || dp < 1 || dp > (ep - sp + 1)) {
27  fprintf(stderr,
28  "-E- %s Line %d: subpixel specification error (sp=%d,ep=%d,dp=%d).\n",
29  __FILE__, __LINE__, sp, ep, dp);
30  return (1);
31  }
32 
33  if (dp == 1) {
34 
35  int32_t length;
36 
37  l1rec->npix = ep - sp + 1;
38 
39  length = l1rec->npix * sizeof (float);
40 
41  memmove(l1rec->pixnum, &l1rec->pixnum[sp], l1rec->npix * sizeof (int32_t));
42  memmove(l1rec->slot, &l1rec->slot [sp], l1rec->npix * sizeof (unsigned char));
43  memmove(l1rec->nobs, &l1rec->nobs [sp], l1rec->npix * sizeof (int32_t));
44 
45  memmove(l1rec->lon, &l1rec->lon [sp], length);
46  memmove(l1rec->lat, &l1rec->lat [sp], length);
47  memmove(l1rec->solz, &l1rec->solz[sp], length);
48  memmove(l1rec->sola, &l1rec->sola[sp], length);
49  memmove(l1rec->senz, &l1rec->senz[sp], length);
50  memmove(l1rec->sena, &l1rec->sena[sp], length);
51 
52  memmove(l1rec->alpha, &l1rec->alpha[sp], length);
53  memmove(l1rec->height, &l1rec->height[sp], length);
54  memmove(l1rec->flags, &l1rec->flags[sp], l1rec->npix * sizeof (int32_t));
55  memmove(l1rec->hilt, &l1rec->hilt[sp], l1rec->npix * sizeof (char));
56  memmove(l1rec->stlight, &l1rec->stlight[sp], l1rec->npix * sizeof (char));
57  memmove(l1rec->navfail, &l1rec->navfail[sp], l1rec->npix * sizeof (char));
58  memmove(l1rec->navwarn, &l1rec->navwarn[sp], l1rec->npix * sizeof (char));
59 
60  memmove(l1rec->Lt, &l1rec->Lt [sp * nbands], length * nbands);
61 
62  memmove(l1rec->sw_n, &l1rec->sw_n [sp * nbands], length * nbands);
63  memmove(l1rec->sw_a, &l1rec->sw_a [sp * nbands], length * nbands);
64  memmove(l1rec->sw_bb, &l1rec->sw_bb [sp * nbands], length * nbands);
65  memmove(l1rec->sw_a_avg, &l1rec->sw_a_avg [sp * nbands], length * nbands);
66  memmove(l1rec->sw_bb_avg, &l1rec->sw_bb_avg [sp * nbands], length * nbands);
67 
68  memmove(l1rec->Ltir, &l1rec->Ltir [sp * NBANDSIR], length * NBANDSIR);
69  memmove(l1rec->Bt, &l1rec->Bt [sp * NBANDSIR], length * NBANDSIR);
70 
71  memmove(l1rec->rho_cirrus, &l1rec->rho_cirrus[sp], length);
72 
73  if (l1rec->geom_per_band != NULL) {
74  memmove(l1rec->geom_per_band->senz,
75  &l1rec->geom_per_band->senz[ sp * nbands ], length * nbands);
76  memmove(l1rec->geom_per_band->sena,
77  &l1rec->geom_per_band->sena[ sp * nbands ], length * nbands);
78  memmove(l1rec->geom_per_band->solz,
79  &l1rec->geom_per_band->solz[ sp * nbands ], length * nbands);
80  memmove(l1rec->geom_per_band->sola,
81  &l1rec->geom_per_band->sola[ sp * nbands ], length * nbands);
82  }
83 
84  /* MERIS */
85  memmove(l1rec->pixdet, &l1rec->pixdet[sp], l1rec->npix * sizeof (int32_t));
86  memmove(l1rec->radcor, &l1rec->radcor[sp * nbands], length * nbands);
87 
88  } else {
89 
90  int32_t i;
91 
92  l1rec->npix = (ep - sp) / dp + 1;
93 
94  for (i = 0; i < l1rec->npix; i++) {
95 
96  l1rec->pixnum[i] = l1rec->pixnum[i * dp + sp];
97  l1rec->slot[i] = l1rec->slot[i * dp + sp];
98  l1rec->nobs[i] = l1rec->nobs[i * dp + sp];
99 
100  l1rec->lon [i] = l1rec->lon [i * dp + sp];
101  l1rec->lat [i] = l1rec->lat [i * dp + sp];
102  l1rec->solz[i] = l1rec->solz[i * dp + sp];
103  l1rec->sola[i] = l1rec->sola[i * dp + sp];
104  l1rec->senz[i] = l1rec->senz[i * dp + sp];
105  l1rec->sena[i] = l1rec->sena[i * dp + sp];
106 
107  l1rec->alpha[i] = l1rec->alpha[i * dp + sp];
108  l1rec->height[i] = l1rec->height[i * dp + sp];
109  l1rec->flags[i] = l1rec->flags[i * dp + sp];
110 
111  l1rec->hilt [i] = l1rec->hilt [i * dp + sp];
112  l1rec->stlight[i] = l1rec->stlight[i * dp + sp];
113  l1rec->navfail[i] = l1rec->navfail[i * dp + sp];
114  l1rec->navwarn[i] = l1rec->navwarn[i * dp + sp];
115 
116  l1rec->rho_cirrus[i] = l1rec->rho_cirrus[i * dp + sp];
117 
118  memmove(&l1rec->Lt [i * nbands],
119  &l1rec->Lt [(i * dp + sp) * nbands], nbands * sizeof (float));
120 
121  memmove(&l1rec->sw_n [i * nbands],
122  &l1rec->sw_n [(i * dp + sp) * nbands], nbands * sizeof (float));
123  memmove(&l1rec->sw_a [i * nbands],
124  &l1rec->sw_a [(i * dp + sp) * nbands], nbands * sizeof (float));
125  memmove(&l1rec->sw_bb[i * nbands],
126  &l1rec->sw_bb[(i * dp + sp) * nbands], nbands * sizeof (float));
127  memmove(&l1rec->sw_a_avg [i * nbands],
128  &l1rec->sw_a_avg [(i * dp + sp) * nbands], nbands * sizeof (float));
129  memmove(&l1rec->sw_bb_avg[i * nbands],
130  &l1rec->sw_bb_avg[(i * dp + sp) * nbands], nbands * sizeof (float));
131 
132  memmove(&l1rec->Ltir [i * NBANDSIR],
133  &l1rec->Ltir [(i * dp + sp) * NBANDSIR], NBANDSIR * sizeof (float));
134 
135  memmove(&l1rec->Bt [i * NBANDSIR],
136  &l1rec->Bt [(i * dp + sp) * NBANDSIR], NBANDSIR * sizeof (float));
137 
138  if (l1rec->geom_per_band != NULL) {
139  memmove(&l1rec->geom_per_band->senz[ i * nbands ],
140  &l1rec->geom_per_band->senz[ (i * dp + sp) * nbands ],
141  nbands * sizeof (float));
142  memmove(&l1rec->geom_per_band->sena[ i * nbands ],
143  &l1rec->geom_per_band->sena[ (i * dp + sp) * nbands ],
144  nbands * sizeof (float));
145  memmove(&l1rec->geom_per_band->solz[ i * nbands ],
146  &l1rec->geom_per_band->solz[ (i * dp + sp) * nbands ],
147  nbands * sizeof (float));
148  memmove(&l1rec->geom_per_band->sola[ i * nbands ],
149  &l1rec->geom_per_band->sola[ (i * dp + sp) * nbands ],
150  nbands * sizeof (float));
151  }
152 
153  /* MERIS */
154  l1rec->pixdet[i] = l1rec->pixdet[i * dp + sp];
155  memmove(&l1rec->radcor [i * nbands],
156  &l1rec->radcor [(i * dp + sp) * nbands], nbands * sizeof (float));
157 
158  }
159  }
160 
161  return (0);
162 }
163 
int32 l1file(int32 sdfid, int32 *nsamp, int32 *nscans, int16 *dtynum)
Definition: l1stat_chk.c:586
#define NBANDSIR
Definition: filehandle.h:23
#define NULL
Definition: decode_rs.h:63
read l1rec
l1_input_t * l1_input
Definition: l1_options.c:9
float dp[MODELMAX]
int32_t nbands
int l1subpix(filehandle *l1file, l1str *l1rec)
Definition: l1subpix.c:17
int i
Definition: decode_rs.h:71