ocssw V2020
get_chl.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <math.h>
3 #include "l12_proto.h"
4 #include "chl.h"
5 
6 
7 float get_chl_ocx(l2str *l2rec, float Rrs[]);
8 
9 float chl_oc2(l2str *l2rec, float Rrs[]) {
10  static int32_t *w = NULL;
11  static float *a = NULL;
12  static int ib1 = -1;
13  static int ib2 = -1;
14 
15  float rat;
16  float Rrs1, Rrs2;
17  float chl = chlbad;
18 
19  if (w == NULL) {
20  w = input->chloc2w;
21  a = input->chloc2c;
22  if (w[0] < 0 || w[1] < 0) {
23  printf("chl_oc2: algorithm coefficients not provided for this sensor.\n");
24  exit(1);
25  }
26  ib1 = bindex_get(w[0]);
27  ib2 = bindex_get(w[1]);
28  if (ib1 < 0 || ib2 < 0) {
29  printf("chl_oc2: incompatible sensor wavelengths for this algorithm\n");
30  exit(1);
31  }
32  }
33 
34  Rrs1 = Rrs[ib1];
35  Rrs2 = Rrs[ib2];
36 
37  if (Rrs1 > 0.0 && Rrs2 > 0.0 && Rrs1 / Rrs2 <= 10.0) {
38  rat = Rrs1 / Rrs2;
39  if (rat > minrat && rat < maxrat) {
40  rat = log10(rat);
41  chl = (float)
42  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
43  chl = (chl > chlmin ? chl : chlmin);
44  chl = (chl < chlmax ? chl : chlmax);
45  }
46  }
47 
48  return (chl);
49 }
50 
51 float chl_oc3(l2str *l2rec, float Rrs[]) {
52  static int32_t *w = NULL;
53  static float *a = NULL;
54  static int ib1 = -1;
55  static int ib2 = -1;
56  static int ib3 = -1;
57 
58  float rat, minRrs;
59  float Rrs1, Rrs2, Rrs3;
60  float chl = chlbad;
61 
62  if (w == NULL) {
63  w = input->chloc3w;
64  a = input->chloc3c;
65  if (w[0] < 0 || w[1] < 0 || w[2] < 0) {
66  printf("chl_oc3: algorithm coefficients not provided for this sensor.\n");
67  exit(1);
68  }
69  ib1 = bindex_get(w[0]);
70  ib2 = bindex_get(w[1]);
71  ib3 = bindex_get(w[2]);
72  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
73  printf("chl_oc3: incompatible sensor wavelengths for this algorithm\n");
74  exit(1);
75  }
76  }
77 
78  Rrs1 = Rrs[ib1];
79  Rrs2 = Rrs[ib2];
80  Rrs3 = Rrs[ib3];
81 
82  minRrs = MIN(Rrs1, Rrs2);
83 
84  if (Rrs3 > 0.0 && Rrs2 > 0.0 && minRrs > -0.001) {
85  rat = MAX(Rrs1, Rrs2) / Rrs3;
86  if (rat > minrat && rat < maxrat) {
87  rat = log10(rat);
88  chl = (float)
89  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
90  chl = (chl > chlmin ? chl : chlmin);
91  chl = (chl < chlmax ? chl : chlmax);
92  }
93  }
94 
95  return (chl);
96 }
97 
98 float chl_oc3c(l2str *l2rec, float Rrs[]) {
99  static float a[] = {0.2515, -2.3798, 1.5823, -0.6372, -0.5692};
100  static int ib1 = -1;
101  static int ib2 = -1;
102  static int ib3 = -1;
103 
104  float rat, minRrs;
105  float Rrs1, Rrs2, Rrs3;
106  float chl = chlbad;
107 
108  if (ib1 < 0) {
109  ib1 = bindex_get(443);
110  ib2 = bindex_get(490);
111  ib3 = bindex_get_555();
112 
113  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
114  printf("chl_oc3: incompatible sensor wavelengths for this algorithm\n");
115  exit(1);
116  }
117  }
118 
119  Rrs1 = Rrs[ib1];
120  Rrs2 = Rrs[ib2];
121  Rrs3 = Rrs[ib3];
122 
123  minRrs = MIN(Rrs1, Rrs2);
124 
125  if (Rrs3 > 0.0 && Rrs2 > 0.0 && minRrs > -0.001) {
126  Rrs3 = conv_rrs_to_555(Rrs3, l2rec->l1rec->l1file->fwave[ib3]);
127  rat = MAX(Rrs1, Rrs2) / Rrs3;
128  if (rat > minrat && rat < maxrat) {
129  rat = log10(rat);
130  chl = (float)
131  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
132  chl = (chl > chlmin ? chl : chlmin);
133  chl = (chl < chlmax ? chl : chlmax);
134  }
135  }
136 
137  return (chl);
138 }
139 
140 float chl_oc4(l2str *l2rec, float Rrs[]) {
141  static int32_t *w = NULL;
142  static float *a = NULL;
143  static int ib1 = -1;
144  static int ib2 = -1;
145  static int ib3 = -1;
146  static int ib4 = -1;
147 
148  float rat, minRrs;
149  float Rrs1, Rrs2, Rrs3, Rrs4;
150  float chl = chlbad;
151 
152  if (w == NULL) {
153  w = input->chloc4w;
154  a = input->chloc4c;
155  if (w[0] < 0 || w[1] < 0 || w[2] < 0 || w[3] < 0) {
156  printf("chl_oc4: algorithm coefficients not provided for this sensor.\n");
157  exit(1);
158  }
159  ib1 = bindex_get(w[0]);
160  ib2 = bindex_get(w[1]);
161  ib3 = bindex_get(w[2]);
162  ib4 = bindex_get(w[3]);
163  if (ib1 < 0 || ib2 < 0 || ib3 < 0 || ib4 < 0) {
164  printf("chl_oc4: incompatible sensor wavelengths for this algorithm\n");
165  exit(1);
166  }
167  }
168 
169  Rrs1 = Rrs[ib1];
170  Rrs2 = Rrs[ib2];
171  Rrs3 = Rrs[ib3];
172  Rrs4 = Rrs[ib4];
173 
174  minRrs = MIN(Rrs1, Rrs2);
175 
176  if (Rrs4 > 0.0 && Rrs3 > 0.0 && (Rrs2 > 0.0 || Rrs1 * Rrs2 > 0.0) && minRrs > -0.001) {
177  rat = MAX(MAX(Rrs1, Rrs2), Rrs3) / Rrs4;
178  if (rat > minrat && rat < maxrat) {
179  rat = log10(rat);
180  chl = (float)
181  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
182  chl = (chl > chlmin ? chl : chlmin);
183  chl = (chl < chlmax ? chl : chlmax);
184  }
185  }
186 
187  return (chl);
188 }
189 
190 float chl_hu2(l2str *l2rec, float Rrs[]) {
191  static float w[] = {443, 555, 670};
192  static float a[] = {-0.4287, 230.47};
193  static int ib1 = -1;
194  static int ib2 = -1;
195  static int ib3 = -1;
196 
197  float ci;
198  float Rrs1, Rrs2, Rrs3;
199  float chl = chlbad;
200 
201  if (ib1 == -1) {
202 
203  ib1 = bindex_get(443);
204  ib2 = bindex_get_555();
205  ib3 = bindex_get(670);
206  if (ib3 < 0) ib3 = bindex_get(665);
207  if (ib3 < 0) ib3 = bindex_get(655);
208  if (ib3 < 0) ib3 = bindex_get(620); // for OCM2: need to add band correction
209  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
210  printf("chl_hu: incompatible sensor wavelengths for this algorithm\n");
211  printf("chl_hu: %d %d %d\n", ib1, ib2, ib3);
212  exit(1);
213  } else {
214  printf("chl_hu: using %7.2f %7.2f %7.2f\n", l2rec->l1rec->l1file->fwave[ib1], l2rec->l1rec->l1file->fwave[ib2], l2rec->l1rec->l1file->fwave[ib3]);
215  }
216  }
217 
218  Rrs1 = Rrs[ib1];
219  Rrs2 = Rrs[ib2];
220  Rrs3 = Rrs[ib3];
221 
222  // If all Rrs are bad then the pixel is masked, so return badval. For
223  // any other case, we want to return a valid value so that OCI can decide.
224 
225  if (Rrs3 > BAD_FLT + 1 && Rrs2 > BAD_FLT + 1 && Rrs1 > BAD_FLT + 1) {
226 
227  // The chl index (ci) is negative line height; ci=0 will yield chl > 0.3,
228  // where the algorithm is not considered valid, and not used in the
229  // merged algorithm.
230 
231  ci = 0;
232 
233  // We require that the red channel Rrs is valid (may be slightly negative
234  // in clear water due to noise), and that Rrs in blue and green be positive.
235  // Cases of negative blue radiance are likely high chl anyway.
236 
237  if (Rrs3 > BAD_FLT + 1 && Rrs2 > 0.0 && Rrs1 > 0.0) {
238  // shift Rrs2 to 555
239  Rrs2 = conv_rrs_to_555(Rrs2, l2rec->l1rec->l1file->fwave[ib2]);
240  // compute index
241  ci = MIN(Rrs2 - (Rrs1 + (w[1] - w[0]) / (w[2] - w[0])*(Rrs3 - Rrs1)), 0.0);
242  // index should be negative in algorithm-validity range
243  }
244  chl = (float) pow(10.0, a[0] + a[1] * ci);
245  chl = (chl > chlmin ? chl : chlmin);
246  chl = (chl < chlmax ? chl : chlmax);
247  }
248 
249  return (chl);
250 }
251 
252 float chl_oci2(l2str *l2rec, float Rrs[]) {
253  static float t1 = 0.25;
254  static float t2 = 0.40;
255 
256  float chl1 = chlbad;
257  float chl2 = chlbad;
258  float chl = chlbad;
259 
260  chl1 = chl_hu2(l2rec, Rrs);
261  if (chl1 <= t1)
262  chl = chl1;
263  else {
264  chl2 = get_chl_ocx(l2rec, Rrs);
265  if (chl2 > 0.0) {
266  if (chl1 >= t2)
267  chl = chl2;
268  else {
269  chl = chl1 * (t2 - chl1) / (t2 - t1)
270  + chl2 * (chl1 - t1) / (t2 - t1);
271  }
272  }
273  }
274 
275  return (chl);
276 }
277 
278 float chl_hu(l2str *l2rec, float Rrs[]) {
279  static float w[] = {443, 555, 670};
280  static float a[] = {-0.4909, 191.6590};
281  static int ib1 = -1;
282  static int ib2 = -1;
283  static int ib3 = -1;
284 
285  float ci;
286  float Rrs1, Rrs2, Rrs3;
287  float chl = chlbad;
288 
289  if (ib1 == -1) {
290  ib1 = bindex_get(443);
291  ib2 = bindex_get_555();
292  ib3 = bindex_get(670);
293  if (ib3 < 0) ib3 = bindex_get(665);
294  if (ib3 < 0) ib3 = bindex_get(655);
295  if (ib3 < 0) ib3 = bindex_get(620); // for OCM2: need to add band correction
296  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
297  printf("chl_hu: incompatible sensor wavelengths for this algorithm\n");
298  printf("chl_hu: %d %d %d\n", ib1, ib2, ib3);
299  exit(1);
300  } else {
301  printf("chl_hu: using %7.2f %7.2f %7.2f\n", l2rec->l1rec->l1file->fwave[ib1], l2rec->l1rec->l1file->fwave[ib2], l2rec->l1rec->l1file->fwave[ib3]);
302  }
303  }
304 
305  Rrs1 = Rrs[ib1];
306  Rrs2 = Rrs[ib2];
307  Rrs3 = Rrs[ib3];
308 
309  // If all Rrs are bad then the pixel is masked, so return badval. For
310  // any other case, we want to return a valid value so that OCI can decide.
311 
312  if (Rrs3 > BAD_FLT + 1 && Rrs2 > BAD_FLT + 1 && Rrs1 > BAD_FLT + 1) {
313 
314  // The chl index (ci) is negative line height; ci=0 will yield chl > 0.3,
315  // where the algorithm is not considered valid, and not used in the
316  // merged algorithm.
317 
318  ci = 0;
319 
320  // We require that the red channel Rrs is valid (may be slightly negative
321  // in clear water due to noise), and that Rrs in blue and green be positive.
322  // Cases of negative blue radiance are likely high chl anyway.
323 
324  if (Rrs3 > BAD_FLT + 1 && Rrs2 > 0.0 && Rrs1 > 0.0) {
325  // shift Rrs2 to 555
326  Rrs2 = conv_rrs_to_555(Rrs2, l2rec->l1rec->l1file->fwave[ib2]);
327  // compute index
328  ci = MIN(Rrs2 - (Rrs1 + (w[1] - w[0]) / (w[2] - w[0])*(Rrs3 - Rrs1)), 0.0);
329  // index should be negative in algorithm-validity range
330  }
331  chl = (float) pow(10.0, a[0] + a[1] * ci);
332  chl = (chl > chlmin ? chl : chlmin);
333  chl = (chl < chlmax ? chl : chlmax);
334  }
335 
336  return (chl);
337 }
338 
339 float chl_oci(l2str *l2rec, float Rrs[]) {
340  static float t1 = 0.15;
341  static float t2 = 0.20;
342 
343  float chl1 = chlbad;
344  float chl2 = chlbad;
345  float chl = chlbad;
346 
347  chl1 = chl_hu(l2rec, Rrs);
348  if (chl1 <= t1)
349  chl = chl1;
350  else {
351  chl2 = get_chl_ocx(l2rec, Rrs);
352  if (chl2 > 0.0) {
353  if (chl1 >= t2)
354  chl = chl2;
355  else {
356  chl = chl1 * (t2 - chl1) / (t2 - t1)
357  + chl2 * (chl1 - t1) / (t2 - t1);
358  }
359  }
360  }
361 
362  return (chl);
363 }
364 
365 float chl_cdr(l2str *l2rec, float Rrs[]) {
366  static float chl_lo = 0.35;
367  static float chl_hi = 20.0;
368 
369  static float c_modisa[6] = {1.030e+00, 7.668e-02, 4.152e-01, 5.335e-01, -5.040e-01, 1.265e-01};
370  static float c_meris [6] = {1.0, 0.0, 0.0, 0.0, 0.0};
371  static float c_null [6] = {1.0, 0.0, 0.0, 0.0, 0.0};
372 
373  float chl1 = chlbad;
374  float chl2 = chlbad;
375  float lchl = chlbad;
376  float chl = chlbad;
377  float *c;
378  float rat;
379 
380  chl1 = get_default_chl(l2rec, Rrs);
381 
382  if (chl1 > 0.0) {
383  switch (l2rec->l1rec->l1file->sensorID) {
384  case MODISA:
385  c = c_modisa;
386  break;
387  case MERIS:
388  c = c_meris;
389  break;
390  case SEAWIFS:
391  case OCTS:
392  case OCM1:
393  case OCM2:
394  case MOS:
395  case HICO:
396  case MODIST:
397  case CZCS:
398  case OSMI:
399  case VIIRSN:
400  case VIIRSJ1:
401  case OCRVC:
402  case GOCI:
403  c = c_null;
404  break;
405  default:
406  printf("%s Line %d: need a default chlorophyll algorithm for this sensor\n",
407  __FILE__, __LINE__);
408  exit(1);
409  break;
410  }
411 
412  chl = MAX(MIN(chl_hi, chl1), chl_lo);
413  lchl = log10(chl);
414  rat = c[0] + lchl * (c[1] + lchl * c[2] + lchl * (c[3] + lchl * (c[4] + lchl * c[5])));
415 
416  chl2 = chl1 / rat;
417  }
418 
419  return (chl2);
420 }
421 
422 /*======================================================================*
423  * *
424  * Implementation of ABI Chlorophyll (Shanmugam, 2011) *
425  * A new bio-optical algorithm for the remote sensing of algal blooms *
426  * in complex ocean waters *
427  * *
428  * Journal of Geophysical Research, 116(C4), C04016. *
429  * doi:10.1029/2010JC006796 *
430  *======================================================================*/
431 
432 float chl_abi(l2str *l2rec, float nLw[]) {
433  float chl1, chl2, chl3, chl4, chl5, chl6, chl7, Z;
434  float nLw1, nLw2, nLw3;
435  float chl = chlbad;
436  static int ib1 = -1, ib2 = -1, ib3 = -1;
437 
438  if (ib1 == -1) {
439  ib1 = bindex_get(443);
440 
441  ib2 = bindex_get(488);
442  if (ib2 < 0) ib2 = bindex_get(490);
443 
444  ib3 = bindex_get(547);
445  if (ib3 < 0) ib3 = bindex_get(555);
446 
447  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
448  printf("chl_abi is not compatible with this sensor\n");
449  exit(1);
450  } else {
451  printf("Calculating chl_abi using %7.2f %7.2f %7.2f\n",
452  l2rec->l1rec->l1file->fwave[ib1],
453  l2rec->l1rec->l1file->fwave[ib2],
454  l2rec->l1rec->l1file->fwave[ib3]);
455  }
456  }
457 
458 
459 
460 
461  nLw1 = nLw[ib1]; //443nm
462  nLw2 = nLw[ib2]; //488nm
463  nLw3 = nLw[ib3]; //547nm
464  if (nLw1 >-10.0) { //condition to avoid negative nLw
465  chl1 = ((nLw2 / nLw3) - nLw1) / ((nLw2 / nLw3) + nLw1);
466  chl2 = pow(10.0, chl1);
467  chl3 = (((nLw1 * nLw2) / 47.0)*((nLw1 * nLw2) / (nLw3 * nLw3)));
468  chl4 = chl2*chl3;
469  chl5 = 0.1403 * (pow(chl4, (-0.572)));
470  chl6 = pow(chl5, 1.056);
471  Z = pow(98, 1.056);
472  chl7 = chl6 / (chl6 + Z);
473  chl = 125.0 * chl7;
474  }
475  return (chl);
476 }
477 
478 float get_default_chl(l2str *l2rec, float Rrs[]) {
479 
480  switch (l2rec->l1rec->l1file->sensorID) {
481  case MOS:
482  return (chl_oc4(l2rec, Rrs));
483  case OSMI:
484  return (chl_oc3(l2rec, Rrs));
485  case L5TM:
486  case L7ETMP:
487  case MISR:
488  return (chl_oc2(l2rec, Rrs));
489  default:
490  return (chl_oci(l2rec, Rrs));
491  }
492 }
493 
494 float get_chl_ocx(l2str *l2rec, float Rrs[]) {
495  float chl;
496 
497  chl = chlbad;
498 
499  switch (l2rec->l1rec->l1file->sensorID) {
500  case SEAWIFS:
501  case OCTS:
502  case OCM1:
503  case OCM2:
504  case MOS:
505  case MERIS:
506  case HICO:
507  case OCIA:
508  case OCI:
509  case OCIS:
510  case HAWKEYE:
511  case AVIRIS:
512  case OLCIS3A:
513  case OLCIS3B:
514  chl = chl_oc4(l2rec, Rrs);
515  break;
516  case MODIST:
517  case MODISA:
518  case CZCS:
519  case OSMI:
520  case VIIRSN:
521  case VIIRSJ1:
522  case OCRVC:
523  case GOCI:
524  case OLI:
525  case PRISM:
526  case SGLI:
527  case MSIS2A:
528  case MSIS2B:
529  chl = chl_oc3(l2rec,Rrs);
530  break;
531  case L5TM:
532  case L7ETMP:
533  case MISR:
534  chl = chl_oc2(l2rec,Rrs);
535  break;
536  default:
537  printf("%s Line %d: need a default chlorophyll algorithm for this sensor\n",
538  __FILE__,__LINE__);
539  exit(1);
540  break;
541  }
542 
543  return (chl);
544 }
545 
546 void get_chl(l2str *l2rec, int prodnum, float prod[]) {
547  int32_t ip;
548  int32_t ipb;
549 
550  int32_t nbands = l2rec->l1rec->l1file->nbands;
551  int32_t npix = l2rec->l1rec->npix;
552 
553  /* */
554  /* Compute desired products at each pixel */
555  /* */
556  for (ip = 0; ip < npix; ip++) {
557 
558  ipb = ip*nbands;
559 
560  switch (prodnum) {
561 
562  case DEFAULT_CHL:
563  prod[ip] = get_default_chl(l2rec, &l2rec->Rrs[ipb]);
564  break;
565  case CAT_chl_oc2:
566  prod[ip] = chl_oc2(l2rec, &l2rec->Rrs[ipb]);
567  break;
568  case CAT_chl_oc3:
569  prod[ip] = chl_oc3(l2rec, &l2rec->Rrs[ipb]);
570  break;
571  case CAT_chl_oc3c:
572  prod[ip] = chl_oc3c(l2rec, &l2rec->Rrs[ipb]);
573  break;
574  case CAT_chl_oc4:
575  prod[ip] = chl_oc4(l2rec, &l2rec->Rrs[ipb]);
576  break;
577  case CAT_chl_hu:
578  prod[ip] = chl_hu(l2rec, &l2rec->Rrs[ipb]);
579  break;
580  case CAT_chl_oci:
581  prod[ip] = chl_oci(l2rec, &l2rec->Rrs[ipb]);
582  break;
583  case CAT_chl_oci2:
584  prod[ip] = chl_oci2(l2rec, &l2rec->Rrs[ipb]);
585  break;
586  case CAT_chl_cdr:
587  prod[ip] = chl_cdr(l2rec, &l2rec->Rrs[ipb]);
588  break;
589  case CAT_chl_abi:
590  prod[ip] = chl_abi(l2rec, &l2rec->nLw[ipb]);
591  break;
592  default:
593  printf("Error: %s : Unknown product specifier: %d\n", __FILE__, prodnum);
594  exit(FATAL_ERROR);
595  break;
596  }
597 
598  if (prod[ip] == chlbad)
599  l2rec->l1rec->flags[ip] |= PRODFAIL;
600  }
601 }
602 
#define CAT_chl_oc3c
Definition: l2prod.h:259
#define MAX(A, B)
Definition: swl0_utils.h:26
#define MIN(x, y)
Definition: rice.h:169
#define OLCIS3A
Definition: sensorDefs.h:32
float chl_oc3c(l2str *l2rec, float Rrs[])
Definition: get_chl.c:98
#define DEFAULT_CHL
Definition: l12_parms.h:72
#define CAT_chl_oc2
Definition: l2prod.h:35
#define SGLI
Definition: sensorDefs.h:33
#define OCI
Definition: sensorDefs.h:42
#define MSIS2B
Definition: sensorDefs.h:38
#define OSMI
Definition: sensorDefs.h:16
#define NULL
Definition: decode_rs.h:63
#define VIIRSN
Definition: sensorDefs.h:23
#define L5TM
Definition: sensorDefs.h:35
#define MERIS
Definition: sensorDefs.h:22
float chl_hu(l2str *l2rec, float Rrs[])
Definition: get_chl.c:278
#define MODIST
Definition: sensorDefs.h:18
#define PRODFAIL
Definition: l2_flags.h:39
int bindex_get(int32_t wave)
Definition: windex.c:43
#define OCIA
Definition: sensorDefs.h:29
#define CAT_chl_oc4
Definition: l2prod.h:52
#define CAT_chl_cdr
Definition: l2prod.h:287
float chl_oc4(l2str *l2rec, float Rrs[])
Definition: get_chl.c:140
float chl_abi(l2str *l2rec, float nLw[])
Definition: get_chl.c:432
instr * input
float chl_cdr(l2str *l2rec, float Rrs[])
Definition: get_chl.c:365
#define BAD_FLT
Definition: jplaeriallib.h:19
#define CAT_chl_oc3
Definition: l2prod.h:75
#define CAT_chl_oci2
Definition: l2prod.h:260
#define CAT_chl_oci
Definition: l2prod.h:257
#define HAWKEYE
Definition: sensorDefs.h:39
void get_chl(l2str *l2rec, int prodnum, float prod[])
Definition: get_chl.c:546
float chl_oc2(l2str *l2rec, float Rrs[])
Definition: get_chl.c:9
#define OCIS
Definition: sensorDefs.h:43
#define FATAL_ERROR
Definition: swl0_parms.h:5
#define PRISM
Definition: sensorDefs.h:31
int bindex_get_555(void)
Definition: windex.c:55
float chl_oci(l2str *l2rec, float Rrs[])
Definition: get_chl.c:339
float chl_oci2(l2str *l2rec, float Rrs[])
Definition: get_chl.c:252
#define AVIRIS
Definition: sensorDefs.h:30
float get_chl_ocx(l2str *l2rec, float Rrs[])
Definition: get_chl.c:494
#define MOS
Definition: sensorDefs.h:13
#define MISR
Definition: sensorDefs.h:40
#define L7ETMP
Definition: sensorDefs.h:36
#define OCTS
Definition: sensorDefs.h:14
float get_default_chl(l2str *l2rec, float Rrs[])
Definition: get_chl.c:478
#define MSIS2A
Definition: sensorDefs.h:34
int32_t nbands
float chl_hu2(l2str *l2rec, float Rrs[])
Definition: get_chl.c:190
#define OCM1
Definition: sensorDefs.h:20
#define CAT_chl_hu
Definition: l2prod.h:253
float chl_oc3(l2str *l2rec, float Rrs[])
Definition: get_chl.c:51
#define CZCS
Definition: sensorDefs.h:17
#define OLCIS3B
Definition: sensorDefs.h:41
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude resolving resolving GSFcd00179 Corrected handling of fill values for[Sensor|Solar][Zenith|Azimuth] resolving MODxl01751 Changed to validate LUT version against a value retrieved from the resolving MODxl02056 Changed to calculate Solar Diffuser angles without adjustment for estimated post launch changes in the MODIS orientation relative to incidentally resolving defects MODxl01766 Also resolves MODxl01947 Changed to ignore fill values in SCI_ABNORM and SCI_STATE rather than treating them as resolving MODxl01780 Changed to use spacecraft ancillary data to recognise when the mirror encoder data is being set by side A or side B and to change calculations accordingly This removes the need for seperate LUTs for Side A and Side B data it makes the new LUTs incompatible with older versions of the and vice versa Also resolves MODxl01685 A more robust GRing algorithm is being which will create a non default GRing anytime there s even a single geolocated pixel in a granule Removed obsolete messages from seed as required for compatibility with version of the SDP toolkit Corrected test output file names to end in per delivery and then split off a new MYD_PR03 pcf file for Aqua Added AssociatedPlatformInstrumentSensor to the inventory metadata in MOD01 mcf and MOD03 mcf Created new versions named MYD01 mcf and MYD03 where AssociatedPlatformShortName is rather than Terra The program itself has been changed to read the Satellite Instrument validate it against the input L1A and LUT and to use it determine the correct files to retrieve the ephemeris and attitude data from Changed to produce a LocalGranuleID starting with MYD03 if run on Aqua data Added the Scan Type file attribute to the Geolocation copied from the L1A and attitude_angels to radians rather than degrees The accumulation of Cumulated gflags was moved from GEO_validate_earth_location c to GEO_locate_one_scan c
Definition: HISTORY.txt:464
#define HICO
Definition: sensorDefs.h:25
#define OCRVC
Definition: sensorDefs.h:24
#define SEAWIFS
Definition: sensorDefs.h:12
PGE01 indicating that PGE02 PGE01 V6 for and PGE01 V2 for MOD03 were used to produce the granule By convention adopted in all MODIS Terra PGE02 code versions are The fourth digit of the PGE02 version denotes the LUT version used to produce the granule The source of the metadata environment variable ProcessingCenter was changed from a QA LUT value to the Process Configuration A sign used in error in the second order term was changed to a
Definition: HISTORY.txt:424
#define MODISA
Definition: sensorDefs.h:19
#define VIIRSJ1
Definition: sensorDefs.h:37
int32 npix
Definition: l1_czcs_hdf.c:19
@ OLI
Definition: smeta.h:53
#define OCM2
Definition: sensorDefs.h:21
#define CAT_chl_abi
Definition: l2prod.h:323
#define GOCI
Definition: sensorDefs.h:26
float conv_rrs_to_555(float Rrs, float wave)
Definition: convert_band.c:17