11 int atmocor2(l2str *l2rec, aestr *aerec, int32_t ip) {
12 static int firstCall = 1;
13 static int want_nirRrs = 0;
14 static int want_nirLw = 0;
15 static int want_mumm = 0;
16 static int want_ramp = 1;
17 static int32_t aer_iter_max = 1;
18 static int32_t aer_iter_min = 1;
21 static float radeg =
RADEG;
24 static float p0 =
STDPR;
25 static float df = 0.33;
26 static float cbot = 0.7;
27 static float ctop = 1.3;
28 static float seed_chl = 0.0;
29 static float seed_green = 0.0;
30 static float seed_red = 0.0;
31 static float nir_chg = 0.02;
40 static int32_t swir_s;
41 static int32_t swir_l;
45 static int32_t aer_base;
49 int32_t nWaveCovariance = 1;
51 l1str *
l1rec = l2rec->l1rec;
53 uncertainty_t *uncertainty=
l1rec->uncertainty;
54 int32_t proc_uncertainty =
input->proc_uncertainty;
57 int32_t brdf_opt =
input->brdf_opt;
58 int32_t aer_opt =
input->aer_opt;
59 int32_t glint_opt =
input->glint_opt;
60 int32_t cirrus_opt =
input->cirrus_opt;
62 float *Fo =
l1rec->Fo;
63 float *Fobar =
l1file->Fobar;
64 float fsol =
l1rec->fsol;
67 float delphi =
l1rec->delphi[ip];
68 float ws =
l1rec->ws [ip];
69 float gc =
l1rec->glint_coef[ip];
71 int32_t *aermodmin = &l2rec->aermodmin[ip];
72 int32_t *aermodmax = &l2rec->aermodmax[ip];
73 float *aermodrat = &l2rec->aerratio [ip];
74 int32_t *aermodmin2 = &l2rec->aermodmin2[ip];
75 int32_t *aermodmax2 = &l2rec->aermodmax2[ip];
76 float *aermodrat2 = &l2rec->aerratio2 [ip];
77 float *
eps = &l2rec->eps [ip];
80 float *Lw = &l2rec->Lw [ip *
l1file->nbands];
81 float *nLw = &l2rec->nLw [ip *
l1file->nbands];
82 float *La = &l2rec->La [ip *
l1file->nbands];
83 float *taua = &l2rec->taua [ip *
l1file->nbands];
86 float *brdf = &l2rec->brdf [ip *
l1file->nbands];
87 float *
Rrs = &l2rec->Rrs [ip *
l1file->nbands];
99 float last_dtaua_aer_l, *derv_taua_l, **derv_rhorc, *derv_rhow_l, *derv_rh;
101 float *derv_Lg_taua=
NULL;
102 float *drhown_nir=
NULL;
104 float *covariance_matrix;
105 static float *corr_coef_rhot;
107 float *
F1, *F1_temp, *
F2, **COV, **corr_nir;
108 static float *delta_Lt =
NULL;
113 float *tLw_nir, *dtLw_nir, *last_tLw_nir, *dlast_tLw_nir;
114 int32_t ib, ipb,inir,iw,
i,
j, ix1, ix2;
116 int32_t iter, iter_max, iter_min, last_iter, iter_reset;
120 float *Ltemp, *dLtemp;
123 float refl_nir = 0, last_refl_nir = 0;
127 static int nbands_ac=2;
128 static int *acbands_index=
NULL;
130 if (firstCall == 1) {
133 if ((wave = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
134 printf(
"-E- : Error allocating memory to wave\n");
137 for (ib = 0; ib < nwave; ib++) {
138 wave[ib] =
l1file->fwave[ib];
146 if(!
input->acbands_index)
147 input->acbands_index=(
int *)malloc(nbands_ac*
sizeof(
int));
148 acbands_index=
input->acbands_index;
153 if (nir_s < 0 || nir_l < 0) {
154 printf(
"Aerosol selection bands %d and %d not available for this sensor\n",
159 printf(
"Invalid aerosol selection bands: long (%d) must be greater than short (%d).\n",
163 if (wave[nir_s] < 600) {
164 printf(
"Aerosol selection band(s) must be greater than 600nm");
170 daer =
MAX(nir_l - nir_s, 1);
171 cslp = 1. / (ctop - cbot);
173 printf(
"Aerosol selection bands %d and %d\n",
l1file->iwave[aer_s],
l1file->iwave[aer_l]);
182 aer_iter_max =
input->aer_iter_max;
183 printf(
"NIR correction enabled.\n");
189 aer_iter_max =
input->aer_iter_max;
190 printf(
"MUMM correction enabled.\n");
196 aer_iter_max =
input->aer_iter_max;
199 if (swir_s < 0 || swir_l < 0) {
200 printf(
"Aerosol selection bands %d and %d not available for this sensor\n",
204 printf(
"NIR/SWIR switching correction enabled.\n");
209 aer_iter_max =
input->aer_iter_max;
210 input->nbands_ac=nbands_ac;
211 acbands_index[0]=
windex(
input->aer_wave_short,wave,nwave);
212 acbands_index[1]=
windex(
input->aer_wave_long,wave,nwave);
213 printf(
"NIR correction enabled --> for multi-scattering epsilon.\n");
218 aer_iter_max =
input->aer_iter_max;
220 nbands_ac=
input->nbands_ac;
222 if(
input->mbac_wave[0]<
input->aer_wave_short){
223 printf(
"%s line %d: the first mbac wavelength %d shouldn't be shorter than aer_wave_short %d \n", __FILE__, __LINE__,
input->mbac_wave[0],
input->aer_wave_short);
226 for(ib=0;ib<nbands_ac;ib++){
228 for(iw=aer_s;iw<nwave;iw++){
234 if(!acbands_index[ib]){
235 printf(
"%s line %d: the band %d specified in mbac_wave doesn't exist \n", __FILE__, __LINE__,
input->mbac_wave[ib]);
238 acbands_index[ib]=
windex(
input->mbac_wave[ib],wave,nwave);
241 printf(
"NIR correction enabled --> for spectral matching.\n");
244 if (
input->aer_rrs_short >= 0.0 &&
input->aer_rrs_long >= 0.0) {
247 aer_iter_max =
input->aer_iter_max;
248 printf(
"NIR correction via input Rrs enabled.\n");
252 if (
input->aer_iter_max < 1)
254 if ( want_nirLw || want_nirRrs) {
261 printf(
"%s line %d: can't find red band\n", __FILE__, __LINE__);
269 printf(
"%s line %d: can't find green band\n", __FILE__, __LINE__);
276 if ((delta_Lt = (
float *)calloc(nwave,
sizeof(
float))) ==
NULL) {
277 printf(
"-E- : Error allocating memory to delta_Lt\n");
280 corr_coef_rhot = uncertainty->corr_coef_rhot;
284 if ((taur = (
float *)calloc(nwave,
sizeof(
float))) ==
NULL) {
285 printf(
"-E- : Error allocating memory to taur\n");
288 if ((tLw = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
289 printf(
"-E- : Error allocating memory to tLw\n");
292 if ((
rhown_nir = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
293 printf(
"-E- : Error allocating memory to rhown_nir\n");
296 if ((tLw_nir = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
297 printf(
"-E- : Error allocating memory to tLw_nir\n");
300 if ((last_tLw_nir = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
301 printf(
"-E- : Error allocating memory to last_tLw_nir\n");
304 if ((Ltemp = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
305 printf(
"-E- : Error allocating memory to Ltemp\n");
308 if ((mbac_w = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
309 printf(
"-E- : Error allocating memory to mbac_w\n");
312 if ((radref = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
313 printf(
"-E- : Error allocating memory to radref\n");
319 derv_Lg_taua=uncertainty->derv_Lg_taua;
320 drhown_nir=uncertainty->drhown_nir;
321 dchl=&uncertainty->dchl;
322 Rrs_unc = &l2rec->Rrs_unc[ip *
l1file->nbands];
323 uncertainty->dRrs=Rrs_unc;
324 if (proc_uncertainty == 2) {
325 covariance_matrix = &l2rec->covariance_matrix[ip *
l1file->nbands *
l1file->nbands];
326 uncertainty->covaraince_matrix = covariance_matrix;
328 covariance_matrix = uncertainty->pixel_covariance;
330 dsensor = &uncertainty->dsensor[ip * nwave];
331 dLr = &uncertainty->dLr[ip * nwave];
332 dtg_sol = &uncertainty->dtg_sol[ip * nwave];
333 dtg_sen = &uncertainty->dtg_sen[ip * nwave];
334 dt_sol = &uncertainty->dt_sol[ip * nwave];
335 dt_sen = &uncertainty->dt_sen[ip * nwave];
336 dvc = &uncertainty->dvc[ip * nwave];
339 if ((last_dtaua = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
340 printf(
"-E- : Error allocating memory to Lunc\n");
343 if ((dtaua = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
344 printf(
"-E- : Error allocating memory to Lunc\n");
348 if ((dLtemp = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
349 printf(
"-E- : Error allocating memory to dLtemp\n");
352 if ((dlast_tLw_nir = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
354 printf(
"-E- : Error allocating memory to last_tLw_nir\n");
357 if ((dtLw = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
358 printf(
"-E- : Error allocating memory to tLw\n");
361 if ((dtLw_nir = (
float *) calloc(nwave,
sizeof(
float))) ==
NULL) {
362 printf(
"-E- : Error allocating memory to dtLw_nir\n");
365 if ((derv_taua_l = (
float *)calloc(nwave,
sizeof(
float))) ==
NULL) {
366 printf(
"-E- : Error allocating memory to derv_taua_l\n");
369 if ((derv_rhow_l = (
float *)calloc(nwave,
sizeof(
float))) ==
NULL) {
370 printf(
"-E- : Error allocating memory to derv_rhow_l\n");
373 if ((derv_rh = (
float *)calloc(nwave,
sizeof(
float))) ==
NULL) {
374 printf(
"-E- : Error allocating memory to derv_rh\n");
377 if ((derv_rhorc = (
float **)calloc(nwave,
sizeof(
float *))) ==
NULL) {
378 printf(
"-E- : Error allocating memory to derv_rhorc\n");
381 for (ib = 0; ib < nwave; ib++) {
382 if ((derv_rhorc[ib] = (
float *)calloc(nbands_ac,
sizeof(
float))) ==
NULL) {
383 printf(
"-E- : Error allocating memory to derv_rhorc[%d]\n", ib);
391 F1 = (
float *)malloc(dim *
sizeof(
float));
392 F1_temp = (
float *)malloc(dim *
sizeof(
float));
393 F2 = (
float *)malloc(dim *
sizeof(
float));
394 COV = (
float **)malloc(dim *
sizeof(
float *));
395 for (ib = 0; ib < dim; ib++)
396 COV[ib] = (
float *)malloc(dim *
sizeof(
float));
398 for (ib = 0; ib < dim; ib++)
399 for (iw = 0; iw < dim; iw++)
402 corr_nir = (
float **)malloc(nwave *
sizeof(
float *));
403 for (ib = 0; ib < nwave; ib++)
404 corr_nir[ib] = (
float *)malloc(nbands_ac *
sizeof(
float));
405 for (ib = 0; ib < nwave; ib++)
406 for (iw = 0; iw < nbands_ac; iw++)
407 corr_nir[ib][iw] = 0;
409 for (iw = 0; iw < nwave; iw++) {
410 for (ib = 0; ib < nbands_ac; ib++) {
411 if ((acbands_index[ib]) >= iw)
412 corr_nir[iw][ib] = corr_coef_rhot[iw * nwave + acbands_index[ib]];
414 corr_nir[iw][ib] = corr_coef_rhot[acbands_index[ib] * nwave + iw];
425 for (ib = 0; ib < nwave; ib++) {
426 ipb = ip * nwave + ib;
436 if (glint_opt != 2) TLg [ib] = 0.0;
440 l2rec->eps[ip] = badval;
442 if (l2rec->l1rec->Lt[ipb] <= 0.0)
443 if (wave[ib] < 1000) nneg++;
452 dvc[ib] = dvc[ib] / tg[ib] /
l1rec->polcor[ipb];
477 for (ib = 0; ib < nwave; ib++)
478 free(derv_rhorc[ib]);
484 for (ib = 0; ib < dim; ib++)
488 for (ib = 0; ib < nwave; ib++)
499 airmass = 1.0 /
mu0 + 1.0 /
mu;
503 for (ib = 0; ib < nwave; ib++) {
505 ipb = ip * nwave + ib;
511 Ltemp[ib] = l2rec->l1rec->Lt[ipb];
515 Ltemp[ib] = Ltemp[ib] / tg[ib];
520 if (cirrus_opt) Ltemp[ib] -=
l1rec->rho_cirrus[ip] / Ka * Fo[ib] *
mu0 /
pi;
523 Ltemp[ib] /=
l1rec->polcor[ipb];
526 Ltemp[ib] -=
l1rec->tLf[ipb];
529 Ltemp[ib] -=
l1rec->Lr[ipb];
532 if (
input->oxaband_opt == 1) {
533 Ltemp[ib] /=
l1rec->t_o2[ipb];
539 dLt = (1 - l2rec->l1rec->Lt[ipb] * uncertainty->derv_pol[ipb] /
l1rec->polcor[ipb]);
540 dLt *= (1 /
l1rec->tg_sol[ipb] /
l1rec->tg_sen[ipb] /
l1rec->polcor[ipb]);
541 dLt = pow(dLt * dsensor[ib], 2);
543 dLt += pow( l2rec->l1rec->Lt[ipb] /
l1rec->tg_sol[ipb] / pow(
l1rec->tg_sen[ipb], 2) /
l1rec->polcor[ipb] * dtg_sen[ib], 2);
544 dLt += pow( l2rec->l1rec->Lt[ipb] /
l1rec->tg_sen[ipb] / pow(
l1rec->tg_sol[ipb], 2) /
l1rec->polcor[ipb] * dtg_sol[ib], 2);
546 dLtemp[ib] = dLt + dLr[ib] * dLr[ib];
548 radref[ib]=
pi/(Fo[ib] *
mu0);
553 if (brdf_opt < FOQMOREL && brdf_opt >
NOBRDF)
554 ocbrdf(l2rec, ip, brdf_opt, wave, nwvis,
solz,
senz, delphi, ws, -1.0,
NULL,
NULL, brdf);
560 iter_max = aer_iter_max;
561 iter_min = aer_iter_min;
563 last_refl_nir = 100.;
567 if (glint_opt == 1 &&
l1rec->glint_coef[ip] > glint_min) {
568 iter_max =
MAX(2, iter_max);
569 iter_min =
MAX(2, iter_min);
572 if (glint_opt == 2) {
588 daer =
MAX(aer_l - aer_s, 1);
592 if (want_nirLw || want_nirRrs) {
593 for (ib = 0; ib < nwave; ib++) {
594 last_tLw_nir[ib] = 0.0;
600 dlast_tLw_nir[ib] = 0.;
603 Rrs[green] = seed_green;
613 for(ib=0;ib<nbands_ac;ib++)
614 mbac_w[acbands_index[ib]]=1.;
618 for (ib = 0; ib < nwave; ib++)
619 delta_Lt[ib] = sqrt(dLtemp[ib] + dvc[ib] * dvc[ib]);
627 last_dtaua_aer_l = dtaua[aer_l];
630 for (ib = 0; ib < nwave; ib++) {
633 dtLw[ib] = sqrt(dLtemp[ib]);
634 last_dtaua[ib] = dtaua[ib];
639 if (want_glintcorr) {
642 glint_rad(iter, nwave, aer_s, aer_l,
gc, airmass,
mu0, Fo, taur, taua, tLw, TLg, uncertainty);
644 for (ib = 0; ib < nwave; ib++) {
655 for (ib = aer_s; ib <= aer_l; ib += daer) {
658 tLw_nir[ib] =
rhown_nir[ib] /
pi * Fo[ib] *
mu0 * t_sol[ib] * t_sen[ib] / brdf[ib];
661 if (tLw_nir[ib] > tLw[ib] && tLw[ib] > 0.0)
662 tLw_nir[ib] = tLw[ib];
665 tLw[ib] -= tLw_nir[ib];
675 for (ib = aer_s; ib <= aer_l; ib += daer) {
678 tLw_nir[ib] =
rhown_nir[ib] /
pi * Fo[ib] *
mu0 * t_sol[ib] * t_sen[ib] / brdf[ib];
681 tLw[ib] -= tLw_nir[ib];
690 get_rhown_eval(
input->fqfile,
Rrs, wave, aer_s, aer_l, nwave, &
l1rec->sw_a_avg[ipb], &
l1rec->sw_bb_avg[ipb], chl,
solz,
senz, delphi,
rhown_nir, l2rec,ip);
692 for (ib = aer_s; ib <= aer_l; ib += daer) {
695 tLw_nir[ib] =
rhown_nir[ib] /
pi * Fo[ib] *
mu0 * t_sol[ib] * t_sen[ib] / brdf[ib];
697 dtLw_nir[ib] = Fo[ib] *
mu0 / (
pi * brdf[ib]) *
698 sqrt(pow(
rhown_nir[ib] * t_sol[ib] * dt_sen[ib], 2) +
699 pow(
rhown_nir[ib] * t_sen[ib] * dt_sol[ib], 2) +
700 pow(t_sen[ib] * t_sol[ib] * drhown_nir[ib], 2));
703 tLw_nir[ib] = (1.0 - df) * tLw_nir[ib] + df * last_tLw_nir[ib];
706 dtLw_nir[ib] = sqrt( pow((1. - df) * dtLw_nir[ib], 2) + pow(df * dlast_tLw_nir[ib], 2));
710 if (chl > 0.0 && chl <= cbot) {
715 else if ((chl > cbot) && (chl < ctop)) {
716 tLw_nir[ib] *= (cslp * chl + cint);
718 dtLw_nir[ib] *= (cslp * chl + cint);
723 tLw[ib] -= tLw_nir[ib];
726 if(uncertainty && tLw_nir[aer_l] > 0.){
727 for (ib = 0; ib <nbands_ac; ib ++){
728 inir=acbands_index[ib];
729 uncertainty->ratio_rhow[ib] = tLw_nir[inir] / tLw_nir[aer_l] * (Fo[aer_l] / Fo[inir]);
735 if (aer_opt ==
AERRHMSEPS &&
fabs(uncertainty->derv_Lg_taua[aer_s]) > 0.) {
736 uncertainty->derv_eps_taua_s = -1/ (Ltemp[aer_l] - TLg[aer_l] - tLw_nir[aer_l]) * derv_Lg_taua[aer_s];
737 uncertainty->derv_eps_taua_s *= (Fo[aer_l] / Fo[aer_s]);
739 uncertainty->derv_eps_taua_l = (Ltemp[aer_s] - TLg[aer_s] - tLw_nir[aer_s]) /
740 pow(Ltemp[aer_l] - TLg[aer_l] - tLw_nir[aer_l], 2) *
742 uncertainty->derv_eps_taua_l *= (Fo[aer_l] / Fo[aer_s]);
743 uncertainty->derv_eps_taua_l+=uncertainty->derv_eps_taua_s;
746 for (ib = 0; ib < nwave; ib++)
747 uncertainty->derv_Lg_taua[ib] *= radref[ib];
753 status =
aerosol(l2rec, aer_opt, aerec, ip, wave, nwave, aer_s, aer_l, Fo, tLw,
754 La, t_sol, t_sen,
eps, taua, aermodmin, aermodmax, aermodrat,
755 aermodmin2, aermodmax2, aermodrat2, mbac_w);
757 for (ib = 0; ib < nwave; ib++) {
759 ipb = ip * nwave + ib;
774 for (ib = 0; ib < nwave; ib++) {
777 tLw[ib] = tLw[ib] - La[ib];
778 Lw [ib] = tLw[ib] / t_sen[ib] *
tg_sol[ib];
779 nLw[ib] = Lw [ib] / t_sol[ib] /
tg_sol[ib] /
mu0 / fsol * brdf[ib];
783 dt_sen[ib] = pow(uncertainty->derv_tsen_taua_l[ib] * last_dtaua_aer_l, 2);
785 for(inir=0;inir<nbands_ac;inir++){
786 i=acbands_index[inir];
787 dt_sen[ib] += pow(uncertainty->derv_tsen_rhorc[ib][inir] * sqrt(dLtemp[
i]) * radref[
i], 2);
790 dt_sen[ib] += pow(uncertainty->derv_tsen_rhow_l[ib] * dtLw_nir[aer_l] * radref[aer_l], 2);
791 dt_sen[ib] += pow(uncertainty->derv_tsen_rh[ib] * uncertainty->drh[ip],2);
794 for(inir=0;inir<nbands_ac;inir++){
795 i=acbands_index[inir];
796 dt_sen[ib] += pow(uncertainty->derv_tsen_rhorc[ib][inir] *radref[
i]* dvc[
i], 2);
800 for(inir=0;inir<nbands_ac;inir++){
801 i=acbands_index[inir];
802 dt_sen[ib] +=2*corr_nir[
i][nbands_ac - 1] *(uncertainty->derv_tsen_rhorc[ib][inir] * radref[
i] * dvc[
i] *uncertainty->derv_tsen_rhorc[ib][nbands_ac - 1] * radref[aer_l] * dvc[aer_l]);
807 dt_sen[ib] = sqrt(dt_sen[ib]);
810 dt_sol[ib] = pow(uncertainty->derv_tsol_taua_l[ib] * last_dtaua_aer_l, 2);
812 for(inir=0;inir<nbands_ac;inir++){
813 i=acbands_index[inir];
814 dt_sol[ib] += pow(uncertainty->derv_tsol_rhorc[ib][inir] * sqrt(dLtemp[
i]) * radref[
i], 2);
817 dt_sol[ib] += pow(uncertainty->derv_tsol_rhow_l[ib] * dtLw_nir[aer_l] * radref[aer_l], 2);
818 dt_sol[ib] += pow(uncertainty->derv_tsol_rh[ib] * uncertainty->drh[ip], 2);
821 for(inir=0;inir<nbands_ac;inir++){
822 i=acbands_index[inir];
823 dt_sol[ib] += pow(uncertainty->derv_tsol_rhorc[ib][inir] * radref[
i]* dvc[
i], 2);
826 for(inir=0;inir<nbands_ac;inir++){
827 i=acbands_index[inir];
829 2 * corr_nir[
i][nbands_ac - 1] *
830 (uncertainty->derv_tsol_rhorc[ib][inir] * radref[
i] * dvc[
i] *
831 uncertainty->derv_tsol_rhorc[ib][nbands_ac - 1] * radref[aer_l] * dvc[aer_l]);
836 dt_sol[ib] = sqrt(dt_sol[ib]);
839 derv_taua_l[ib] = -derv_Lg_taua[ib] / (t_sol[ib] * t_sen[ib]) * (1 / radref[ib]);
840 derv_taua_l[ib] += -uncertainty->derv_La_taua_l[ib] / (t_sol[ib] * t_sen[ib]);
842 (-tLw[ib] / (t_sol[ib] * t_sen[ib] * t_sen[ib]) * uncertainty->derv_tsen_taua_l[ib]);
844 (-tLw[ib] / (t_sol[ib] * t_sol[ib] * t_sen[ib]) * uncertainty->derv_tsol_taua_l[ib]);
846 for (inir = 0; inir < nbands_ac; inir++) {
847 derv_rhorc[ib][inir] =
848 -uncertainty->derv_La_rhorc[ib][inir] / (t_sol[ib] * t_sen[ib]);
849 derv_rhorc[ib][inir] += (-tLw[ib] / (t_sol[ib] * t_sen[ib] * t_sen[ib]) *
850 uncertainty->derv_tsen_rhorc[ib][inir]);
851 derv_rhorc[ib][inir] += (-tLw[ib] / (t_sol[ib] * t_sol[ib] * t_sen[ib]) *
852 uncertainty->derv_tsol_rhorc[ib][inir]);
855 derv_rhow_l[ib] = -uncertainty->derv_La_rhow_l[ib] / (t_sol[ib] * t_sen[ib]);
857 (-tLw[ib] / (t_sol[ib] * t_sen[ib] * t_sen[ib]) * uncertainty->derv_tsen_rhow_l[ib]);
859 (-tLw[ib] / (t_sol[ib] * t_sol[ib] * t_sen[ib]) * uncertainty->derv_tsol_rhow_l[ib]);
861 derv_rh[ib] = -uncertainty->derv_La_rh[ib] / (t_sol[ib] * t_sen[ib]);
863 (-tLw[ib] / (t_sol[ib] * t_sen[ib] * t_sen[ib]) * uncertainty->derv_tsen_rh[ib]);
865 (-tLw[ib] / (t_sol[ib] * t_sol[ib] * t_sen[ib]) * uncertainty->derv_tsol_rh[ib]);
871 dtaua[ib] = pow(uncertainty->derv_taua_taua_l[ib] * last_dtaua_aer_l, 2);
872 for (inir = 0; inir < nbands_ac; inir++) {
873 i = acbands_index[inir];
875 pow(uncertainty->derv_taua_rhorc[ib][inir] * sqrt(dLtemp[
i]) * radref[
i], 2);
878 dtaua[ib] += pow(uncertainty->derv_taua_rhow_l[ib] * dtLw_nir[aer_l] * radref[aer_l], 2);
879 dtaua[ib] += pow(uncertainty->derv_taua_rh[ib] * uncertainty->drh[ip], 2);
882 for (inir = 0; inir < nbands_ac; inir++) {
883 i = acbands_index[inir];
884 dtaua[ib] += pow(uncertainty->derv_taua_rhorc[ib][inir] * radref[
i] * dvc[
i], 2);
887 2 * corr_nir[aer_s][nbands_ac - 1] *
888 (uncertainty->derv_taua_rhorc[ib][nbands_ac - 1] * radref[aer_l] * dvc[aer_l] *
889 uncertainty->derv_taua_rhorc[ib][0] * radref[aer_s] * dvc[aer_s]);
895 dtaua[ib] = sqrt(dtaua[ib]);
908 for (ib = 0; ib < nwave; ib++) {
909 if (proc_uncertainty == 2)
910 nWaveCovariance = nwave - ib;
911 for (iw = ib; iw < ib + nWaveCovariance; iw++) {
914 F1[0] = 1 / t_sol[ib] / t_sen[ib] / radref[ib];
915 for (ix1 = 1; ix1 <= nbands_ac; ix1++)
916 F1[ix1] = derv_rhorc[ib][ix1 - 1];
917 F1[ix1] = derv_rh[ib];
918 F1[ix1 + 1] = derv_rhow_l[ib];
919 F1[ix1 + 2] = derv_taua_l[ib];
921 F2[0] = 1 / t_sol[iw] / t_sen[iw] / radref[iw];
922 for (ix1 = 1; ix1 <= nbands_ac; ix1++)
923 F2[ix1] = derv_rhorc[iw][ix1 - 1];
924 F2[ix1] = derv_rh[iw];
925 F2[ix1 + 1] = derv_rhow_l[iw];
926 F2[ix1 + 2] = derv_taua_l[iw];
928 COV[0][0] = corr_coef_rhot[ib * nwave + iw] * delta_Lt[ib] * radref[ib] *
929 delta_Lt[iw] * radref[iw];
930 for (
i = 0;
i < nbands_ac;
i++) {
931 ix1 = acbands_index[
i];
933 corr_nir[ib][
i] * delta_Lt[ib] * radref[ib] * delta_Lt[ix1] * radref[ix1];
935 COV[0][nbands_ac + 1] = 0;
936 COV[0][nbands_ac + 2] = 0;
937 COV[0][nbands_ac + 3] = 0;
939 for (
i = 0;
i < nbands_ac;
i++) {
940 ix2 = acbands_index[
i];
943 corr_nir[iw][
i] * delta_Lt[iw] * radref[iw] * delta_Lt[ix2] * radref[ix2];
945 for (
j = 0;
j < nbands_ac;
j++) {
946 ix1 = acbands_index[
j];
947 COV[
i + 1][
j + 1] = corr_nir[ix2][
j] * delta_Lt[ix2] * radref[ix2] *
948 delta_Lt[ix1] * radref[ix1];
950 COV[
i + 1][nbands_ac + 1] = 0;
951 COV[
i + 1][nbands_ac + 2] = 0;
952 COV[
i + 1][nbands_ac + 3] = 0;
955 for (ix2 = 1; ix2 < 4; ix2++)
956 for (ix1 = 0; ix1 < dim; ix1++)
957 COV[nbands_ac + ix2][ix1] = 0;
959 COV[nbands_ac + 1][nbands_ac + 1] = pow(uncertainty->drh[ip], 2);
960 COV[nbands_ac + 2][nbands_ac + 2] = pow(dtLw_nir[aer_l] * radref[aer_l], 2);
961 COV[nbands_ac + 3][nbands_ac + 3] = pow(last_dtaua_aer_l, 2);
963 for (ix1 = 0; ix1 < dim; ix1++) {
965 for (ix2 = 0; ix2 < dim; ix2++)
966 F1_temp[ix1] +=
F1[ix2] * COV[ix2][ix1];
968 covariance_matrix[ib * nwave + iw] = 0.;
969 for (ix1 = 0; ix1 < dim; ix1++)
970 covariance_matrix[ib * nwave + iw] += F1_temp[ix1] *
F2[ix1];
972 covariance_matrix[ib * nwave + iw] *=
973 (brdf[ib] * brdf[iw] / (
mu0 *
mu0) / (fsol * fsol));
981 for (ib = aer_s; ib <= aer_l; ib += daer) {
982 last_tLw_nir[ib] = tLw_nir[ib];
984 dlast_tLw_nir[ib] = dtLw_nir[ib];
986 for (ib = 0; ib < nwvis; ib++) {
987 Rrs[ib] = nLw[ib] / Fobar[ib];
989 for (iw = ib; iw < nwvis; iw++)
990 covariance_matrix[ib * nwave + iw] /= (Fobar[ib] * Fobar[iw]);
991 Rrs_unc[ib] = sqrt(covariance_matrix[ib * nwave + ib]);
1000 if (chl == badchl && iter_reset == 0 && iter < iter_max) {
1013 if (chl == badchl && iter_reset == 1 && iter < iter_max) {
1026 for (ib = 0; ib < nwave; ib++) {
1037 if (tindx >= 1.05 &&
status == 0) {
1038 for (ib = 0; ib < nwvis; ib++) {
1039 Rrs[ib] = nLw[ib] / Fobar[ib];
1043 if (chl > 0 && (chl <= 1.0 || nLw[nir_l] < 0.08)) {
1044 iter_max = aer_iter_max;
1047 daer =
MAX(aer_l - aer_s, 1);
1060 }
else if (iter < iter_min) {
1062 }
else if (want_nirLw && (
fabs(refl_nir - last_refl_nir) <
fabs(nir_chg * refl_nir) || refl_nir < 0.0)) {
1064 }
else if (want_mumm || want_nirRrs) {
1066 }
else if (iter > iter_max) {
1070 last_refl_nir = refl_nir;
1072 for (ib = aer_s; ib <= aer_l; ib ++) {
1073 if(
sensorID==
MODISA && ib<=aer_base && iter>2 && mbac_w[ib]!=0.){
1074 mbac_w[ib] = (iter*1.0/iter_max);
1075 mbac_w[ib] = exp(-7*mbac_w[ib]);
1082 l2rec->num_iter[ip] = iter;
1099 free(dlast_tLw_nir);
1106 for (ib = 0; ib < nwave; ib++)
1107 free(derv_rhorc[ib]);
1113 for (ib = 0; ib < dim; ib++)
1117 for (ib = 0; ib < nwave; ib++)
1126 if (want_nirLw || want_nirRrs || want_mumm) {
1127 for (ib = aer_s; ib <= aer_l; ib += daer) {
1128 tLw[ib] = tLw_nir[ib];
1129 Lw [ib] = tLw[ib] / t_sen[ib] *
tg_sol[ib];
1130 nLw[ib] = Lw [ib] / t_sol[ib] /
tg_sol[ib] /
mu0 / fsol * brdf[ib];
1131 Rrs[ib] = nLw[ib] / Fobar[ib];
1144 ocbrdf(l2rec, ip, brdf_opt, wave, nwvis,
solz,
senz, delphi, ws, -1.0, nLw, Fobar, brdf);
1145 for (ib = 0; ib < nwvis; ib++) {
1146 nLw[ib] = nLw[ib] * brdf[ib];
1149 Rrs_unc[ib] *= brdf[ib];
1150 for (iw = ib; iw < nwave; iw++)
1151 covariance_matrix[ib * nwave + iw] *= (brdf[ib] * brdf[iw]);
1157 for (ib = 0; ib < nwave; ib++) {
1158 if (ib != aer_s && ib != aer_l) {
1159 Rrs[ib] = nLw[ib] / Fobar[ib];
1160 l2rec->Rrs[ip * nwave + ib] =
Rrs[ib];
1165 for (ib = nwvis; ib < nwave; ib++)
1166 for (iw = ib; iw < nwave; iw++)
1167 covariance_matrix[ib * nwave + iw] /= (Fobar[ib] * Fobar[iw]);
1169 for (ib = aer_s; ib < nwave; ib += daer) {
1170 if (Rrs_unc[ib] < 0)
1173 for (iw = ib; iw < nwave; iw++)
1174 covariance_matrix[ib * nwave + iw] *= (brdf[ib] * brdf[iw]);
1184 if (*aermodmin == *aermodmax || *aermodmin2 == *aermodmax2 || dvc_fail) {
1185 for (ib = 0; ib < nwave; ib++) {
1188 for (iw = 0; iw < nwave; iw++)
1189 covariance_matrix[ib * nwave + iw] =
BAD_FLT;
1193 l2rec->chl_unc[ip] = *dchl;
1212 free(dlast_tLw_nir);
1219 for (ib = 0; ib < nwave; ib++)
1220 free(derv_rhorc[ib]);
1226 for (ib = 0; ib < dim; ib++)
1230 for (ib = 0; ib < nwave; ib++)