NASA Logo
Ocean Color Science Software

ocssw V2022
alloc_l2.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "l2_struc.h"
5 #include "l12_proto.h"
6 
7 void free_l2(l2str *l2rec) {
8  free((void *) l2rec->data);
9 }
10 
11 
12 /* --------------------------------------------------------- */
13 /* alloc_l2() - allocates 1 level-2 record to hold data for */
14 /* a single scan of "npix" pixels. */
15 
16 /* --------------------------------------------------------- */
17 int alloc_l2(l1str *l1rec, l2str *l2rec) {
18  l2rec->l1rec = l1rec;
19 
20  int32_t npix = l1rec->npix;
21  int32_t nbands = l1rec->l1file->nbands;
22  char *p;
23 
24  // look in all ofile l2prod and the default l2prod
25  // to see if we need to turn on uncertainty processing
26  if(l1rec->uncertainty) {
27  printf("ERROR: %s:%d - Why is l1rec->uncertainty not NULL", __FILE__, __LINE__);
28  exit(1);
29  }
30 
31  if(input->proc_uncertainty){
32  if(input->aer_opt!=AERRHMSEPS && input->aer_opt!=AERRHSM){
33  printf("-E- %s line %d: Unable to calculate the uncertainty for aer_opt other than -17 or -18.\n", __FILE__, __LINE__);
34  exit(FATAL_ERROR);
35  }
36 
37  l1rec->uncertainty= (uncertainty_t*) malloc(sizeof (uncertainty_t));
38  int32_t nbands_ac=bindex_get(input->aer_wave_long)-bindex_get(input->aer_wave_short)+1;
39  if (alloc_uncertainty(nbands, nbands_ac, npix, l1rec->uncertainty) != 0) {
40  printf("-E- %s line %d: Unable to allocate error record.\n", __FILE__, __LINE__);
41  exit(FATAL_ERROR);
42  }
43  }
44 
45  int32_t len = 5 * sizeof (int32_t) * npix
46  + 7 * sizeof (float)*npix
47  + 9 * sizeof (float)*npix * nbands;
48 
49  if(l1rec->uncertainty){
50  len+=sizeof (float)*npix * nbands; // for Rrs_unc
51  if(input->proc_uncertainty==2)
52  len+=sizeof(float)*npix*nbands*nbands; //for covariance matrix
53  }
54 
55 
56  if (len % 4 != 0)
57  len = len / 4 * 4 + 4;
58 
59  if ((p = (char *) malloc(len)) == NULL) {
60  fprintf(stderr,
61  "-E- %s line %d: Memory allocation failure.\n",
62  __FILE__, __LINE__);
63  return (0);
64  }
65 
66  l2rec->length = len;
67  l2rec->data = p;
68 
69  // var[npix]
70  l2rec->num_iter = (int32_t *) p;
71  p += sizeof(int32_t)*npix;
72  l2rec->aermodmin = (int32_t *) p;
73  p += sizeof(int32_t)*npix;
74  l2rec->aermodmax = (int32_t *) p;
75  p += sizeof(int32_t)*npix;
76  l2rec->aermodmin2 = (int32_t *) p;
77  p += sizeof(int32_t)*npix;
78  l2rec->aermodmax2 = (int32_t *) p;
79  p += sizeof(int32_t)*npix;
80 
81  l2rec->chl = (float *) p;
82  p += sizeof(float)*npix;
83  l2rec->eps = (float *) p;
84  p += sizeof(float)*npix;
85  l2rec->chi2 = (float *) p;
86  p += sizeof(float)*npix;
87  l2rec->aerratio = (float *) p;
88  p += sizeof(float)*npix;
89  l2rec->aerratio2 = (float *) p;
90  p += sizeof(float)*npix;
91  l2rec->aerindex = (float *) p;
92  p += sizeof(float)*npix;
93 
94  // var[npix][nbands]
95  l2rec->taua = (float *) p;
96  p += sizeof(float)*npix*nbands;
97  l2rec->La = (float *) p;
98  p += sizeof(float)*npix*nbands;
99  l2rec->Lw = (float *) p;
100  p += sizeof(float)*npix*nbands;
101  l2rec->nLw = (float *) p;
102  p += sizeof(float)*npix*nbands;
103 
104  l2rec->brdf = (float *) p;
105  p += sizeof(float)*npix*nbands;
106  l2rec->Rrs = (float *) p;
107  p += sizeof(float)*npix*nbands;
108  if(l1rec->uncertainty){
109  l2rec->Rrs_unc = (float *) p;
110  p += sizeof (float)*npix*nbands;
111  } else {
112  l2rec->Rrs_unc = NULL;
113  }
114  l2rec->outband_correction = (float *) p;
115  p += sizeof(float)*npix*nbands;
116  l2rec->a = (float *) p;
117  p += sizeof(float)*npix*nbands;
118  l2rec->bb = (float *) p;
119  p += sizeof(float)*npix*nbands;
120  l2rec->chl_unc = (float *) p;
121  p += sizeof (float)*npix;
122 
123  if(input->proc_uncertainty==2){
124  l2rec->covariance_matrix = (float *) p;
125  p += sizeof (float) * npix*nbands*nbands;
126  }else {
127  l2rec->covariance_matrix = NULL;
128  }
129 
130  if ((len - (int32_t) (p - l2rec->data)) < 0) {
131  printf("%s Line %d: bad allocation on L2 record\n", __FILE__, __LINE__);
132  exit(1);
133  }
134 
135  // init to NULL
136  l2rec->bindx = NULL;
137  l2rec->sst = NULL;
138  l2rec->Rrs_raman = NULL;
139  l2rec->tgrec = NULL;
140 
141  printf("Allocated %d bytes in L2 record.\n", (int) (p - l2rec->data));
142 
143  return (len);
144 }
void free_l2(l2str *l2rec)
Definition: alloc_l2.c:7
#define AERRHSM
Definition: l12_parms.h:37
#define NULL
Definition: decode_rs.h:63
read l1rec
instr * input
int alloc_l2(l1str *l1rec, l2str *l2rec)
Definition: alloc_l2.c:17
int bindex_get(int32_t wave)
Definition: windex.c:45
#define FATAL_ERROR
Definition: swl0_parms.h:5
#define AERRHMSEPS
Definition: l12_parms.h:36
int32_t nbands
int alloc_uncertainty(int32_t nbands, int32_t nbands_ac, int32_t npix, uncertainty_t *uncertainty)
Definition: uncertainty.c:21
int npix
Definition: get_cmp.c:28
float p[MODELMAX]
Definition: atrem_corl1.h:131