NASA Logo
Ocean Color Science Software

ocssw V2022
uncertainty.c
Go to the documentation of this file.
1 /*
2  * alloc_uncertainty.c
3  *
4  * Created on: Aug 8, 2019
5  * Author: mzhang11
6  */
7 
8 #include <uncertainty.h>
9 #include <l1.h>
10 
11 //#include <stdio.h>
12 //#include <stdlib.h>
13 //#include "filehandle.h"
14 
15 
16 /* --------------------------------------------------------- */
17 /* alloc_uncertainty() - allocates 1 uncertainty record to hold data for */
18 /* a single scan of "npix" pixels. */
19 
20 /* --------------------------------------------------------- */
21 int alloc_uncertainty(int32_t nbands, int32_t nbands_ac, int32_t npix, uncertainty_t *uncertainty) {
22 
23  char *p;
24  int32_t len;
25  int32_t i;
26 
27  uncertainty->nbands=nbands;
28  uncertainty->nbands_ac=nbands_ac;
29  uncertainty->npix=npix;
30 
31  /* */
32  /* allocate data block as contiguous bytes */
33  /* */
34  len = 11 * sizeof (float)*npix
35  + 10 * sizeof (float)*npix * nbands
36  + 21 * sizeof (float)* nbands
37  + 1 * sizeof (float)* nbands*nbands;
38 
39 
40  /* Force to 4-byte increments for good measure */
41  len = (len / 4 + 1)*4;
42 
43  if ((p = (char *) malloc(len)) == NULL) {
44  fprintf(stderr,
45  "-E- %s line %d: Memory allocation failure.\n",
46  __FILE__, __LINE__);
47  return (0);
48  }
49 
50  /* Note: positional allocation is in order of datatype size, to
51  ensure that all 4-byte words start on 4-byte boundaries. Some
52  machines seem to have trouble if this is not done. */
53 
54  uncertainty->data = p;
55  uncertainty->length=len;
56 
57  uncertainty->dsensor =(float *) p; p+=sizeof(float)*npix*nbands;
58  uncertainty->dsyst =(float *) p; p+=sizeof(float)*npix*nbands;
59  uncertainty->dvc =(float *) p; p+=sizeof(float)*npix*nbands;
60 
61  uncertainty->dwv =(float *) p; p+=sizeof(float)*npix;
62  uncertainty->dmw =(float *) p; p+=sizeof(float)*npix;
63  uncertainty->dzw =(float *) p; p+=sizeof(float)*npix;
64  uncertainty->dws =(float *) p; p+=sizeof(float)*npix;
65  uncertainty->dwd =(float *) p; p+=sizeof(float)*npix;
66  uncertainty->doz =(float *) p; p+=sizeof(float)*npix;
67  uncertainty->dpr =(float *) p; p+=sizeof(float)*npix;
68  uncertainty->drh =(float *) p; p+=sizeof(float)*npix;
69  uncertainty->dmodrat =(float *) p; p+=sizeof(float)*npix;
70  uncertainty->dno2_tropo =(float *) p; p+=sizeof(float)*npix;
71  uncertainty->dno2_strat =(float *) p; p+=sizeof(float)*npix;
72 
73 
74  uncertainty->dLr =(float *) p; p+=sizeof(float)*npix*nbands;
75  uncertainty->dtg_sol =(float *) p; p+=sizeof(float)*npix*nbands;
76  uncertainty->dtg_sen =(float *) p; p+=sizeof(float)*npix*nbands;
77  uncertainty->dt_sol =(float *) p; p+=sizeof(float)*npix*nbands;
78  uncertainty->dt_sen =(float *) p; p+=sizeof(float)*npix*nbands;
79  uncertainty->dTLg =(float *) p; p+=sizeof(float)*npix*nbands;
80 
81  uncertainty->derv_pol =(float *) p; p+=sizeof(float)*npix*nbands;
82 
83  uncertainty->derv_La_taua_l=(float *)p; p+=sizeof(float)*nbands;
84  uncertainty->derv_La_rhow_l=(float *)p; p+=sizeof(float)*nbands;
85  uncertainty->derv_La_rh =(float *)p; p+=sizeof(float)*nbands;
86 
87  uncertainty->derv_taua_taua_l=(float *)p; p+=sizeof(float)*nbands;
88  uncertainty->derv_taua_rhow_l=(float *)p; p+=sizeof(float)*nbands;
89  uncertainty->derv_taua_rh =(float *)p; p+=sizeof(float)*nbands;
90 
91  uncertainty->derv_tsen_taua_l=(float *)p; p+=sizeof(float)*nbands;
92  uncertainty->derv_tsen_rhow_l=(float *)p; p+=sizeof(float)*nbands;
93  uncertainty->derv_tsen_rh =(float *)p; p+=sizeof(float)*nbands;
94 
95  uncertainty->derv_tsol_taua_l=(float *)p; p+=sizeof(float)*nbands;
96  uncertainty->derv_tsol_rhow_l=(float *)p; p+=sizeof(float)*nbands;
97  uncertainty->derv_tsol_rh =(float *)p; p+=sizeof(float)*nbands;
98 
99  uncertainty->derv_taua_min_rhorc_l=(float *)p; p+=sizeof(float)*nbands;
100  uncertainty->derv_taua_min_taua_l=(float *)p; p+=sizeof(float)*nbands;
101  uncertainty->derv_taua_min_rhow_l=(float *)p; p+=sizeof(float)*nbands;
102  uncertainty->derv_taua_max_rhorc_l=(float *)p; p+=sizeof(float)*nbands;
103  uncertainty->derv_taua_max_taua_l=(float *)p; p+=sizeof(float)*nbands;
104  uncertainty->derv_taua_max_rhow_l=(float *)p; p+=sizeof(float)*nbands;
105 
106 
107  uncertainty->derv_Lg_taua=(float *)p; p+=sizeof(float)*nbands;
108  uncertainty->drhown_nir =(float *)p; p+=sizeof(float)*nbands;
109  uncertainty->dbrdf =(float *)p; p+=sizeof(float)*nbands;
110 
111  uncertainty->pixel_covariance =(float * )p; p+=sizeof(float)*nbands*nbands;
112 
113 
114  if ((len - (int32_t) (p - uncertainty->data)) < 0) {
115  printf("%s Line %d: bad allocation on error record\n", __FILE__, __LINE__);
116  exit(1);
117  }
118  if (want_verbose)
119  printf("Allocated %d bytes in error record.\n", (int) (p - uncertainty->data));
120 
121  uncertainty->derv_La_rhorc =(float **)malloc(nbands*sizeof(float *));
122  uncertainty->derv_taua_rhorc=(float **)malloc(nbands*sizeof(float *));
123  uncertainty->derv_tsen_rhorc=(float **)malloc(nbands*sizeof(float *));
124  uncertainty->derv_tsol_rhorc=(float **)malloc(nbands*sizeof(float *));
125 
126  for(i=0;i<nbands;i++){
127  uncertainty->derv_La_rhorc[i]=(float *)malloc(nbands_ac*sizeof(float));
128  uncertainty->derv_taua_rhorc[i]=(float *)malloc(nbands_ac*sizeof(float));
129  uncertainty->derv_tsen_rhorc[i]=(float *)malloc(nbands_ac*sizeof(float));
130  uncertainty->derv_tsol_rhorc[i]=(float *)malloc(nbands_ac*sizeof(float));
131  }
132  uncertainty->derv_modrat_rhorc=(float *)malloc(nbands_ac*sizeof(float));
133  uncertainty->ratio_rhow =(float *)malloc(nbands_ac*sizeof(float));
134 
135  uncertainty->corr_coef_rhot =(float *)malloc(nbands*nbands*sizeof(float));
136 
137  return (0);
138 }
139 
140 int cp_uncertainty(uncertainty_t *oldrec, uncertainty_t *newrec, int32_t ip)
141 {
142  int32_t nbands=oldrec->nbands;
143  int32_t nbands_ac=oldrec->nbands_ac;
144 
145  int32_t ipb = ip * nbands;
146  memcpy(&newrec->dsensor[ipb], &oldrec->dsensor[ipb], sizeof(float)*nbands);
147  memcpy(&newrec->dsyst[ipb], &oldrec->dsyst[ipb], sizeof(float)*nbands);
148  memcpy(&newrec->dLr[ipb], &oldrec->dLr[ipb], sizeof(float)*nbands);
149  memcpy(&newrec->dtg_sol[ipb], &oldrec->dtg_sol[ipb], sizeof(float)*nbands);
150  memcpy(&newrec->dtg_sen[ipb], &oldrec->dtg_sen[ipb], sizeof(float)*nbands);
151  memcpy(&newrec->dt_sol[ipb], &oldrec->dt_sol[ipb], sizeof(float)*nbands);
152  memcpy(&newrec->dt_sen[ipb], &oldrec->dt_sen[ipb], sizeof(float)*nbands);
153  memcpy(&newrec->dTLg[ipb], &oldrec->dTLg[ipb], sizeof(float)*nbands);
154 
155  memcpy(newrec->ratio_rhow, oldrec->ratio_rhow, sizeof(float)*nbands_ac);
156 
157  newrec->dwv[ip] = oldrec->dwv[ip];
158  newrec->dws[ip] = oldrec->dws[ip];
159  newrec->doz[ip] = oldrec->doz[ip];
160  newrec->dpr[ip] = oldrec->dpr[ip];
161  newrec->drh[ip] = oldrec->drh[ip];
162 
163  newrec->derv_eps_Lrc_l=oldrec->derv_eps_Lrc_l;
164  newrec->derv_eps_Lrc_s=oldrec->derv_eps_Lrc_s;
165  newrec->derv_eps_taua_l=oldrec->derv_eps_taua_l;
166  newrec->derv_eps_taua_s=oldrec->derv_eps_taua_s;
167  newrec->derv_eps_rhow_l=oldrec->derv_eps_rhow_l;
168 
169  return 0;
170 }
171 
172 /*
173  *
174  *ifscan=1: initializing uncertainty for a scan
175  *ifscan=0: initializing uncertainty for one pixel
176  */
177 void init_uncertainty(uncertainty_t *uncertainty, int ifscan){
178  int32_t ip, ib, ipb,inir;
179 
180  int32_t npix = uncertainty->npix;
181  int32_t nbands = uncertainty->nbands;
182  int32_t nbands_ac = uncertainty->nbands_ac;
183 
184  if(ifscan){
185 
186  for(ip=0;ip<npix;ip++){
187  uncertainty->dwv[ip]=0.;
188  uncertainty->dmw[ip]=0.;
189  uncertainty->dzw[ip]=0.;
190  uncertainty->dws[ip]=0.;
191  uncertainty->dwd[ip]=0.;
192  uncertainty->doz[ip]=0.;
193  uncertainty->dpr[ip]=0.;
194  uncertainty->drh[ip]=0.;
195  uncertainty->dmodrat[ip]=0.;
196  uncertainty->dno2_tropo[ip]=0.;
197  uncertainty->dno2_strat[ip]=0.;
198 
199  for(ib=0;ib<nbands;ib++){
200  ipb=ip*nbands+ib;
201  uncertainty->dsensor[ipb]=0.0;
202  uncertainty->dsyst [ipb]=0.0;
203  uncertainty->dvc [ipb]=0.0;
204 
205  uncertainty->dLr [ipb]=0.0;
206  uncertainty->dtg_sol[ipb]=0.0;
207  uncertainty->dtg_sen [ipb]=0.0;
208  uncertainty->dt_sol [ipb]=0.0;
209  uncertainty->dt_sen [ipb]=0.0;
210  uncertainty->dTLg [ipb]=0.0;
211  uncertainty->derv_pol[ipb]=0.0;
212  }
213  }
214  }
215  else{
216 
217  uncertainty->derv_modrat_taua_l=0.;
218  uncertainty->derv_eps_Lrc_s = 0.;
219  uncertainty->derv_eps_Lrc_l = 0.;
220  uncertainty->derv_eps_taua_l = 0;
221  uncertainty->derv_eps_rhow_l = 0;
222  uncertainty->derv_eps_taua_s = 0;
223  uncertainty->dchl=0;
224 
225  for(inir=0;inir<nbands_ac;inir++){
226  uncertainty->derv_modrat_rhorc[inir]=0.;
227  uncertainty->ratio_rhow[inir]=0.;
228  }
229 
230  for(ib=0;ib<nbands;ib++){
231  uncertainty->derv_Lg_taua[ib]=0.;
232 
233  uncertainty->derv_taua_min_rhorc_l[ib]=0.;
234  uncertainty->derv_taua_max_rhorc_l[ib]=0.;
235  uncertainty->derv_taua_min_taua_l[ib]=0.;
236  uncertainty->derv_taua_max_taua_l[ib]=0.;
237 
238  uncertainty->derv_La_taua_l[ib]=0.0;
239  uncertainty->derv_taua_taua_l[ib]=0.0;
240  uncertainty->derv_tsen_taua_l[ib]=0.0;
241  uncertainty->derv_tsol_taua_l[ib]=0.0;
242 
243  for(inir=0;inir<nbands_ac;inir++){
244  uncertainty->derv_La_rhorc[ib][inir]=0.;
245  uncertainty->derv_taua_rhorc[ib][inir]=0.;
246  uncertainty->derv_tsen_rhorc[ib][inir]=0.;
247  uncertainty->derv_tsol_rhorc[ib][inir]=0.;
248  }
249 
250  uncertainty->derv_La_rhow_l[ib]=0.0;
251  uncertainty->derv_taua_rhow_l[ib]=0.0;
252  uncertainty->derv_tsen_rhow_l[ib]=0.0;
253  uncertainty->derv_tsol_rhow_l[ib]=0.0;
254  uncertainty->derv_taua_min_rhow_l [ib]=0.0;
255  uncertainty->derv_taua_max_rhow_l [ib]=0.0;
256 
257  uncertainty->derv_La_rh[ib]=0.0;
258  uncertainty->derv_taua_rh[ib]=0.0;
259  uncertainty->derv_tsen_rh[ib]=0.0;
260  uncertainty->derv_tsol_rh[ib]=0.0;
261 
262  uncertainty->drhown_nir [ib]=0.0;
263  uncertainty->dbrdf [ib]=0.0;
264  }
265  }
266  for(ib=0;ib<nbands*nbands;ib++)
267  uncertainty->pixel_covariance[ib]=0.;
268 }
269 
270 void free_uncertainty(uncertainty_t *uncertainty) {
271  int i;
272 
273  for(i=0;i<uncertainty->nbands;i++){
274  free(uncertainty->derv_La_rhorc[i]);
275  free(uncertainty->derv_taua_rhorc[i]);
276  free(uncertainty->derv_tsen_rhorc[i]);
277  free(uncertainty->derv_tsol_rhorc[i]);
278  }
279  free(uncertainty->derv_La_rhorc);
280  free(uncertainty->derv_taua_rhorc);
281  free(uncertainty->derv_tsen_rhorc);
282  free(uncertainty->derv_tsol_rhorc);
283 
284  free(uncertainty->derv_modrat_rhorc);
285  free(uncertainty->ratio_rhow);
286  free(uncertainty->corr_coef_rhot);
287 
288  free((void *) uncertainty->data);
289 
290 }
#define NULL
Definition: decode_rs.h:63
void free_uncertainty(uncertainty_t *uncertainty)
Definition: uncertainty.c:270
int cp_uncertainty(uncertainty_t *oldrec, uncertainty_t *newrec, int32_t ip)
Definition: uncertainty.c:140
int want_verbose
void init_uncertainty(uncertainty_t *uncertainty, int ifscan)
Definition: uncertainty.c:177
int32_t nbands
int alloc_uncertainty(int32_t nbands, int32_t nbands_ac, int32_t npix, uncertainty_t *uncertainty)
Definition: uncertainty.c:21
int i
Definition: decode_rs.h:71
int npix
Definition: get_cmp.c:28
float p[MODELMAX]
Definition: atrem_corl1.h:131