40 #include <gsl/gsl_errno.h>
41 #include <gsl/gsl_vector.h>
42 #include <gsl/gsl_blas.h>
43 #include <gsl/gsl_multifit_nlin.h>
44 #include <gsl/gsl_linalg.h>
45 #include <gsl/gsl_poly.h>
46 #include <gsl/gsl_matrix.h>
47 #include <gsl/gsl_permutation.h>
58 static int32_t LastRecNum = -1;
60 static float bbp_s_max = 5.0;
61 static float bbp_s_min = 0.0;
62 static float adg_s_max = 0.025;
63 static float adg_s_min = 0.01;
64 static float chl_max = 10.0;
65 static float chl_min = 0.03;
103 static float *uadg_s;
105 static float *ubbp_s;
106 static float *rrsdiff;
108 static float **fit_par;
109 static float *chisqr;
110 static int16 max_npar;
112 static int *siop_num;
113 static int allocateRrsRaman = 0;
117 for (
i = 0;
i < m; ++
i) {
125 for (
i = 0;
i < m; ++
i) {
146 int ncol, nrow, uncol, unrow;
149 printf(
"\nLoading basis vector from %s\n",
file);
154 printf(
"-E- %s line %d: error opening (%s) file", __FILE__, __LINE__,
file);
163 xtab = &
table[nrow * 0];
165 for (ivec = 0; ivec < ncol - 1; ivec++) {
166 ytab = &
table[nrow * (ivec + 1)];
167 for (
i = 0;
i < nx;
i++) {
177 printf(
"\nNo uncertainty basis vector file ascociated with %s\n",
file);
182 printf(
"-E- %s line %d: error opening (%s) file", __FILE__, __LINE__, ufile);
191 uxtab = &utable[unrow * 0];
193 for (ivec = 0; ivec < uncol - 1; ivec++) {
194 uytab = &utable[unrow * (ivec + 1)];
195 for (
i = 0;
i < nx;
i++) {
196 uy[ivec][
i] =
linterp(uxtab, uytab, unrow,
x[
i]);
219 for (ivec = 0; ivec <
g->aph_nvec; ivec++) {
220 g->par[ipar] = chl /
g->aph_nvec;
225 for (ivec = 0; ivec <
g->adg_nvec; ivec++) {
231 switch (
g->bbp_opt) {
241 for (ivec = 0; ivec <
g->bbp_nvec; ivec++) {
242 g->par[ipar] = 0.001;
250 if (ipar !=
g->npar &&
g->fit_opt !=
SVDSIOP) {
251 printf(
"-E- %s Line %d: number of GIOP fit parameters (%d) does not equal number of initialized parameter (%d)\n",
252 __FILE__, __LINE__,
g->npar, ipar);
267 float aw[],
float bbw[]) {
271 float def_aph_w = 443.0;
272 float def_aph_s = 0.5;
273 float def_adg_w = 443.0;
274 float def_adg_s = 0.02061;
275 float def_bbp_w = 443.0;
276 float def_bbp_s = 1.03373;
277 float def_grd[] = {0.0949, 0.0794};
281 if (
input->giop_wave[0] > 0) {
282 for (iw = 0; iw < nwave; iw++) {
283 if (
input->giop_wave[iw] <= 0)
break;
290 g->nwave =
MIN(
windex(671., wave, nwave) + 1, nwave);
291 for (iw = 0; iw <
g->nwave; iw++)
297 for (iw = 0; iw <
g->nwave; iw++) {
298 g->wave[iw] = wave[
g->bindx[iw]];
299 g->aw [iw] = aw [
g->bindx[iw]];
300 g->bbw [iw] = bbw [
g->bindx[iw]];
305 if (
input->giop_rrs_unc_opt >= 0) {
306 g->urrs_opt =
input->giop_rrs_unc_opt;
333 if (
input->giop_maxiter > 0)
334 g->maxiter =
input->giop_maxiter;
340 if (
input->giop_fit_opt > 0)
341 g->fit_opt =
input->giop_fit_opt;
347 if (
input->giop_rrs_opt > 0)
348 g->rrs_opt =
input->giop_rrs_opt;
355 if (
input->giop_grd[0] > -999.0) {
356 g->grd[0] =
input->giop_grd[0];
357 g->grd[1] =
input->giop_grd[1];
359 g->grd[0] = def_grd[0];
360 g->grd[1] = def_grd[1];
384 if (
input->giop_aph_opt > 0)
385 g->aph_opt =
input->giop_aph_opt;
387 if (
input->giop_aph_w > 0.0)
388 g->aph_w =
input->giop_aph_w;
390 g->aph_w = def_aph_w;
392 if (
input->giop_aph_s > -999.0)
393 g->aph_s =
input->giop_aph_s;
395 g->aph_s = def_aph_s;
402 if (
input->giop_adg_opt != 1)
403 g->adg_opt =
input->giop_adg_opt;
407 if (
input->giop_adg_w > 0.0)
408 g->adg_w =
input->giop_adg_w;
410 g->adg_w = def_adg_w;
412 if (
input->giop_adg_s > -999.0) {
413 g->adg_s =
input->giop_adg_s;
414 g->uadg_s =
input->giop_uadg_s;
416 g->adg_s = def_adg_s;
421 if (
input->giop_acdom_opt != 1)
422 g->acdom_opt =
input->giop_acdom_opt;
427 if (
input->giop_anap_opt != 1)
428 g->anap_opt =
input->giop_anap_opt;
436 if (
input->giop_bbp_opt != 1)
437 g->bbp_opt =
input->giop_bbp_opt;
441 if (
input->giop_bbp_w > 0.0)
442 g->bbp_w =
input->giop_bbp_w;
444 g->bbp_w = def_bbp_w;
446 if (
input->giop_bbp_s > -999.0) {
447 g->bbp_s =
input->giop_bbp_s;
448 g->ubbp_s =
input->giop_ubbp_s;
450 g->bbp_s = def_bbp_s;
455 if (
input->giop_bbph_opt != 1)
456 g->bbph_opt =
input->giop_bbph_opt;
461 if (
input->giop_bbnap_opt != 1)
462 g->bbnap_opt =
input->giop_bbnap_opt;
469 switch (
g->aph_opt) {
478 switch (
g->adg_opt) {
487 switch (
g->acdom_opt) {
496 switch (
g->anap_opt) {
505 switch (
g->bbp_opt) {
520 switch (
g->bbph_opt) {
529 switch (
g->bbnap_opt) {
543 g->npar =
g->aph_nvec +
g->adg_nvec +
g->bbp_nvec;
549 g->aph_tab_nw = nwave;
550 g->aph_tab_w = (
float *) calloc(nwave,
sizeof (
float));
554 g->adg_tab_nw = nwave;
555 g->adg_tab_w = (
float *) calloc(nwave,
sizeof (
float));
559 g->acdom_tab_nw = nwave;
560 g->acdom_tab_w = (
float *) calloc(nwave,
sizeof (
float));
564 g->anap_tab_nw = nwave;
565 g->anap_tab_w = (
float *) calloc(nwave,
sizeof (
float));
569 g->bbp_tab_nw = nwave;
570 g->bbp_tab_w = (
float *) calloc(nwave,
sizeof (
float));
574 g->bbph_tab_nw = nwave;
575 g->bbph_tab_w = (
float *) calloc(nwave,
sizeof (
float));
579 g->bbnap_tab_nw = nwave;
580 g->bbnap_tab_w = (
float *) calloc(nwave,
sizeof (
float));
586 for (iw = 0; iw < nwave; iw++) {
587 g->aph_tab_w[iw] = wave[iw];
588 g->adg_tab_w[iw] = wave[iw];
589 g->acdom_tab_w[iw] = wave[iw];
590 g->anap_tab_w[iw] = wave[iw];
591 g->bbp_tab_w[iw] = wave[iw];
592 g->bbph_tab_w[iw] = wave[iw];
593 g->bbnap_tab_w[iw] = wave[iw];
598 switch (
g->aph_opt) {
604 switch (
g->adg_opt) {
610 switch (
g->bbp_opt) {
615 switch (
g->acdom_opt) {
617 giop_int_tab_file(
g->acdom_tab_file,
g->uacdom_tab_file, nwave, wave,
g->acdom_tab_s,
g->uacdom_tab_s);
620 switch (
g->anap_opt) {
625 switch (
g->bbph_opt) {
630 switch (
g->bbnap_opt) {
632 giop_int_tab_file(
g->bbnap_tab_file,
g->ubbnap_tab_file, nwave, wave,
g->bbnap_tab_s,
g->ubbnap_tab_s);
654 void giop_model(giopstr *
g,
double par[],
int nwave,
float wave[],
float aw[],
float bbw[],
655 float foq[],
float aph[],
float adg[],
float bbp[],
656 double rrs[],
double **dfdpar,
double **parstar) {
658 int iw, iwtab, ivec, ipar;
672 if ((aphstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
673 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
677 if ((adgstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
678 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
682 if ((bbpstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
683 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
687 if ((uaphstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
688 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
692 if ((uadgstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
693 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
697 if ((ubbpstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
698 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
703 for (iw = 0; iw < nwave; iw++) {
712 switch (
g->aph_opt) {
714 aphstar[ipar] = exp(-1. * pow(wave[iw] -
g->aph_w, 2) / (2 * pow(
g->aph_s, 2)));
716 aph[iw] = par[ipar] * aphstar[ipar];
717 aph[iw + nwave] = sqrt(pow(par[ipar +
g->npar]*aphstar[ipar] ,2)
718 + pow(par[ipar]*uaphstar[ipar],2));
724 for (ivec = 0; ivec <
g->aph_nvec; ivec++) {
725 iwtab =
windex(wave[iw],
g->aph_tab_w,
g->aph_tab_nw);
726 aphstar[ipar] =
g->aph_tab_s[ivec][iwtab];
727 uaphstar[ipar] =
g->uaph_tab_s[ivec][iwtab];
728 aph[iw] += par[ipar] * aphstar[ipar];
729 aph[iw + nwave] += sqrt(pow(par[ipar +
g->npar]*aphstar[ipar],2)
730 + pow(par[ipar]*uaphstar[ipar],2));
736 switch (
g->adg_opt) {
740 adgstar[ipar] = exp(-
g->adg_s * (wave[iw] -
g->adg_w));
741 uadgstar[ipar] = sqrt(pow(
g->uadg_s*(
g->adg_w - wave[iw])*exp(-
g->adg_s * (wave[iw] -
g->adg_w)) ,2));
742 adg[iw] = par[ipar] * adgstar[ipar];
743 adg[iw + nwave] = sqrt(pow(par[ipar +
g->npar] * adgstar[ipar],2) + pow(par[ipar]*uadgstar[ipar],2));
749 for (ivec = 0; ivec <
g->adg_nvec; ivec++) {
750 iwtab =
windex(wave[iw],
g->adg_tab_w,
g->adg_tab_nw);
751 adgstar[ipar] =
g->adg_tab_s[ivec][iwtab];
752 uadgstar[ipar] =
g->uadg_tab_s[ivec][iwtab];
753 adg[iw] += par[ipar] * adgstar[ipar];
754 adg[iw + nwave] += sqrt(pow(par[ipar +
g->npar] * adgstar[ipar],2)
755 + pow(par[ipar]*uadgstar[ipar],2));
761 switch (
g->bbp_opt) {
764 iwtab =
windex(wave[iw],
g->bbp_tab_w,
g->bbp_tab_nw);
765 bbpstar[ipar] =
g->bbp_tab_s[0][iwtab];
766 bbp[iw] = bbpstar[ipar];
767 bbp[iw + nwave] = 0.0;
771 iwtab =
windex(wave[iw],
g->bbp_tab_w,
g->bbp_tab_nw);
772 bbpstar[ipar] =
g->bbp_tab_s[0][iwtab];
773 ubbpstar[ipar] =
g->ubbp_tab_s[0][iwtab];
774 bbp[iw] = bbpstar[ipar];
775 bbp[iw + nwave] = ubbpstar[ipar];
783 bbpstar[ipar] = pow((
g->bbp_w / wave[iw]),
g->bbp_s);
784 ubbpstar[ipar] = sqrt(pow(
g->ubbp_s*pow(
g->bbp_w / wave[iw],
g->bbp_s)*log(
g->bbp_w / wave[iw]),2));
785 bbp[iw] = par[ipar] * bbpstar[ipar];
786 bbp[iw + nwave] = sqrt(pow(par[ipar +
g->npar] * bbpstar[ipar],2) +
787 pow(par[ipar]*ubbpstar[ipar],2));
793 for (ivec = 0; ivec <
g->bbp_nvec; ivec++) {
794 iwtab =
windex(wave[iw],
g->bbp_tab_w,
g->bbp_tab_nw);
795 bbpstar[ipar] =
g->bbp_tab_s[ivec][iwtab];
796 ubbpstar[ipar] =
g->ubbp_tab_s[ivec][iwtab];
797 bbp[iw] += par[ipar] * bbpstar[ipar];
798 bbp[iw + nwave] += sqrt(pow(par[ipar +
g->npar] * bbpstar[ipar],2) +
799 pow(par[ipar]*ubbpstar[ipar],2));
805 a = aw [iw] + aph[iw] + adg[iw];
806 bb = bbw[iw] + bbp[iw];
809 switch (
g->rrs_opt) {
811 rrs[iw] =
g->grd[0] *
x +
g->grd[1] * pow(
x, 2);
812 dfdx =
g->grd[0] + 2 *
g->grd[1] *
x;
815 rrs[iw] = foq[iw] *
x;
820 if (dfdpar !=
NULL) {
825 dxdb =
x / bb + dxda;
827 switch (
g->aph_opt) {
829 for (ivec = 0; ivec <
g->aph_nvec; ivec++) {
830 dfdpar[iw][ipar] = dfdx * dxda * aphstar[ipar];
836 switch (
g->adg_opt) {
838 for (ivec = 0; ivec <
g->adg_nvec; ivec++) {
839 dfdpar[iw][ipar] = dfdx * dxda * adgstar[ipar];
845 switch (
g->bbp_opt) {
852 for (ivec = 0; ivec <
g->bbp_nvec; ivec++) {
853 dfdpar[iw][ipar] = dfdx * dxdb * bbpstar[ipar];
860 if (parstar !=
NULL) {
864 switch (
g->aph_opt) {
866 for (ivec = 0; ivec <
g->aph_nvec; ivec++) {
867 parstar[iw][ipar] = aphstar[ipar];
873 switch (
g->adg_opt) {
875 for (ivec = 0; ivec <
g->adg_nvec; ivec++) {
876 parstar[iw][ipar] = adgstar[ipar];
882 switch (
g->bbp_opt) {
889 for (ivec = 0; ivec <
g->bbp_nvec; ivec++) {
890 parstar[iw][ipar] = bbpstar[ipar];
912 float foq[],
float aph[],
float adg[],
float bbp[],
float acdom[],
float anap[],
float bbph[],
float bbnap[],
913 double rrs[],
double **dfdpar,
double **parstar) {
915 int iw, iwtab, idx443;
935 if ((aphstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
936 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
940 if ((acdomstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
941 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
945 if ((anapstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
946 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
950 if ((bbphstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
951 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
955 if ((bbnapstar = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
956 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_model.\n",
963 switch (
g->fit_opt) {
965 if (
g->aph_nvec !=
g->acdom_nvec ||
g->aph_nvec !=
g->anap_nvec
966 ||
g->aph_nvec !=
g->bbph_nvec ||
g->aph_nvec !=
g->bbnap_nvec
967 ||
g->acdom_nvec !=
g->anap_nvec ||
g->acdom_nvec !=
g->bbph_nvec
968 ||
g->acdom_nvec !=
g->bbnap_nvec ||
g->anap_nvec !=
g->bbph_nvec
969 ||
g->anap_nvec !=
g->bbnap_nvec ||
g->bbph_nvec !=
g->bbnap_nvec) {
971 printf(
"-E- %s line %d: SIOP tables must have same number of columns.\n",
978 idx443 =
windex(443.,
g->acdom_tab_w,
g->acdom_tab_nw);
980 for (iw = 0; iw < nwave; iw++) {
987 iwtab =
windex(wave[iw],
g->aph_tab_w,
g->aph_tab_nw);
988 aphstar[iw] =
g->aph_tab_s[isiop][iwtab];
989 aph[iw] = par[0] * aphstar[iw];
990 aph[iw + nwave] = par[
g->npar] * aphstar[iw];
993 iwtab =
windex(wave[iw],
g->acdom_tab_w,
g->acdom_tab_nw);
994 acdomstar[iw] =
g->acdom_tab_s[isiop][iwtab];
995 acdom443 =
g->acdom_tab_s[isiop][idx443];
996 acdom[iw] = par[1]*(acdomstar[iw] / acdom443);
997 acdom[iw + nwave] = par[1 +
g->npar]*(aphstar[iw] / acdom443);
999 iwtab =
windex(wave[iw],
g->anap_tab_w,
g->anap_tab_nw);
1000 anapstar[iw] =
g->anap_tab_s[isiop][iwtab];
1001 anap[iw] = par[2] * anapstar[iw];
1002 anap[iw + nwave] = par[2 +
g->npar] * aphstar[iw];
1004 adg[iw] = par[1] * acdomstar[iw] + par[2] * anapstar[iw];
1005 adg[iw + nwave] = par[1 +
g->npar] * acdomstar[iw] + par[2 +
g->npar] * anapstar[iw];
1007 iwtab =
windex(wave[iw],
g->bbph_tab_w,
g->bbph_tab_nw);
1008 bbphstar[iw] =
g->bbph_tab_s[isiop][iwtab];
1009 bbph[iw] = par[0] * bbphstar[iw];
1010 bbph[iw + nwave] = par[
g->npar] * bbphstar[iw];
1012 iwtab =
windex(wave[iw],
g->bbnap_tab_w,
g->bbnap_tab_nw);
1013 bbnapstar[iw] =
g->bbnap_tab_s[isiop][iwtab];
1014 bbnap[iw] = par[2] * bbnapstar[iw];
1015 bbnap[iw + nwave] = par[2 +
g->npar] * bbnapstar[iw];
1017 bbp[iw] = par[0] * bbphstar[iw] + par[2] * bbnapstar[iw];
1018 bbp[iw + nwave] = par[
g->npar] * bbphstar[iw] + par[2 +
g->npar] * bbnapstar[iw];
1020 a = aw [iw] + aph[iw] + adg[iw];
1021 bb = bbw[iw] + bbp[iw];
1024 switch (
g->rrs_opt) {
1026 rrs[iw] =
g->grd[0] *
x +
g->grd[1] * pow(
x, 2);
1027 dfdx =
g->grd[0] + 2 *
g->grd[1] *
x;
1030 rrs[iw] = foq[iw] *
x;
1035 if (dfdpar !=
NULL) {
1038 dxdb =
x / bb + dxda;
1040 dfdpar[iw][0] = dfdx * dxda * aphstar[iw];
1041 dfdpar[iw][1] = dfdx * dxda * acdomstar[iw];
1042 dfdpar[iw][2] = dfdx * dxdb * anapstar[iw];
1043 dfdpar[iw][3] = dfdx * dxdb * bbphstar[iw];
1044 dfdpar[iw][4] = dfdx * dxdb * bbnapstar[iw];
1049 if (parstar !=
NULL) {
1051 parstar[iw][0] = aphstar[iw];
1052 parstar[iw][1] = acdomstar[iw];
1053 parstar[iw][2] = anapstar[iw];
1054 parstar[iw][3] = bbphstar[iw];
1055 parstar[iw][4] = bbnapstar[iw];
1077 giopstr *
g = (giopstr *) (ambdata->
meta);
1079 giop_model(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, ambdata->
yfit,
NULL,
NULL);
1081 ambdata->
merit = 0.0;
1082 for (iw = 0; iw <
g->nwave; iw++) {
1083 ambdata->
merit += pow((ambdata->
y[iw] - ambdata->
yfit[iw]), 2) * ambdata->
wgt[iw];
1086 return (ambdata->
merit);
1095 double Rrs_fit[],
int16 *itercnt) {
1099 static float tol = 1.e-6;
1101 static double *
init;
1103 static int firstCall = 1;
1108 ambdata.
niter =
g->maxiter;
1110 ambdata.
npnts =
g->nwave;
1113 ambdata.
yfit = Rrs_fit;
1116 if (firstCall == 1) {
1118 if ((
init = (
double *) calloc(
g->nwave * (
g->nwave + 1), sizeof (
double))) ==
NULL) {
1119 printf(
"-E- %s line %d : error allocating memory for GIOP:gio_model.\n",
1120 __FILE__, __LINE__);
1126 for (
j = 0;
j <
g->npar + 1;
j++)
1127 for (
i = 0;
i <
g->npar;
i++)
1130 for (
i = 0;
i <
g->npar;
i++) {
1131 init[
g->npar +
i * (
g->npar + 1)] +=
g->len[
i];
1139 if (ambdata.
niter >=
g->maxiter)
1142 for (
i = 0;
i <
g->npar;
i++) {
1143 par[
i] =
init[
g->npar * isml +
i];
1146 *itercnt = ambdata.
niter;
1158 double *
y = ((fitstr *)
data)->y;
1159 double *w = ((fitstr *)
data)->w;
1160 float *aw = ((fitstr *)
data)->g->aw;
1161 float *bbw = ((fitstr *)
data)->g->bbw;
1162 float *foq = ((fitstr *)
data)->g->foq;
1163 float *wave = ((fitstr *)
data)->g->wave;
1164 size_t nwave = ((fitstr *)
data)->g->nwave;
1165 size_t npar = ((fitstr *)
data)->g->npar;
1166 giopstr *
g = ((fitstr *)
data)->g;
1176 if ((par = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1177 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1178 __FILE__, __LINE__);
1183 for (ipar = 0; ipar < npar; ipar++) {
1184 par[ipar] = gsl_vector_get(parv, ipar);
1186 if ((yfit = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1187 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1188 __FILE__, __LINE__);
1191 if ((dydpar = (
double **) calloc(nwave,
sizeof (
double *))) ==
NULL) {
1192 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1193 __FILE__, __LINE__);
1196 for (iw = 0; iw < nwave; iw++)
1197 if ((dydpar[iw] = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1198 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1199 __FILE__, __LINE__);
1204 giop_model(
g, par, nwave, wave, aw, bbw, foq, aph1, adg1, bbp1, yfit, dydpar,
NULL);
1207 for (iw = 0; iw < nwave; iw++) {
1210 sigma = sqrt(1. / w[iw]);
1214 gsl_vector_set(
f, iw, (yfit[iw] -
y[iw]) / sigma);
1218 for (ipar = 0; ipar < npar; ipar++)
1219 gsl_matrix_set(
J, iw, ipar, dydpar[iw][ipar] / sigma);
1241 float calc_uadg_s(giopstr *
g,
float Rrs1,
float Rrs2,
float uRrs1,
float uRrs2,
float covRrs1Rrs2) {
1246 switch (
g->adg_opt) {
1248 dsdr1 = -0.002 / (0.36*Rrs2 + 1.2*Rrs1 + Rrs1*Rrs1/Rrs2);
1249 dsdr2 = (0.002*Rrs1) / pow(Rrs1 + 0.6*Rrs2,2);
1250 uadg_s = pow(pow(dsdr1*uRrs1,2) + pow(dsdr2*uRrs2,2) + 2*dsdr1*dsdr2*covRrs1Rrs2, 0.5);
1253 dsdr1 = 0.0038/(log(10)*Rrs1);
1254 dsdr2 = -0.0038/(log(10)*Rrs2);
1255 uadg_s = pow(pow(dsdr1*uRrs1,2) + pow(dsdr2*uRrs2,2) +2*dsdr1*dsdr2*covRrs1Rrs2, 0.5);
1266 float calc_ubbp_s(giopstr *
g,
float Rrs1,
float Rrs2,
float uRrs1,
float uRrs2,
float covRrs1Rrs2) {
1268 float v,dvdr1,dvdr2,dsdr1,dsdr2,dsdv;
1272 switch (
g->bbp_opt) {
1275 dsdr2 = -0.8*Rrs1/pow(Rrs2,2);
1276 ubbp_s = pow( pow(dsdr1*uRrs1,2) + pow(dsdr2*uRrs2,2) + 2*dsdr1*dsdr2*covRrs1Rrs2, 0.5);
1279 v = -0.9*(Rrs1/Rrs2);
1282 dvdr2 = 0.9*(Rrs1/pow(Rrs2,2));
1285 ubbp_s = pow(pow(dsdr1*uRrs1,2) + pow(dsdr2*uRrs2,2) + 2*dsdr1*dsdr2*covRrs1Rrs2, 0.5);
1288 dsdchl = -0.768/(log(10)*
g->chl);
1289 ubbp_s = pow(pow( dsdchl*
g->uchl,2) ,0.5);
1292 dsdchl = -0.5/(log(10)*
g->chl);
1293 ubbp_s = pow(pow( dsdchl*
g->uchl,2) ,0.5);
1307 gsl_matrix *V, *Sigma_pinv, *U, *A_pinv;
1308 gsl_matrix *_tmp_mat =
NULL;
1309 gsl_vector *_tmp_vec;
1313 unsigned int n =
A->size1;
1314 unsigned int m =
A->size2;
1315 bool was_swapped =
false;
1321 _tmp_mat = gsl_matrix_alloc(m, n);
1322 gsl_matrix_transpose_memcpy(_tmp_mat,
A);
1330 V = gsl_matrix_alloc(m, m);
1331 u = gsl_vector_alloc(m);
1332 _tmp_vec = gsl_vector_alloc(m);
1333 gsl_linalg_SV_decomp(
A, V,
u, _tmp_vec);
1334 gsl_vector_free(_tmp_vec);
1337 Sigma_pinv = gsl_matrix_alloc(m, n);
1338 gsl_matrix_set_zero(Sigma_pinv);
1339 cutoff = rcond * gsl_vector_max(
u);
1341 for (
i = 0;
i < m; ++
i) {
1342 if (gsl_vector_get(
u,
i) > cutoff) {
1343 x = 1. / gsl_vector_get(
u,
i);
1348 gsl_matrix_set(Sigma_pinv,
i,
i,
x);
1352 U = gsl_matrix_alloc(n, n);
1353 gsl_matrix_set_zero(U);
1355 for (
i = 0;
i < n; ++
i) {
1356 for (
j = 0;
j < m; ++
j) {
1357 gsl_matrix_set(U,
i,
j, gsl_matrix_get(
A,
i,
j));
1361 if (_tmp_mat !=
NULL) {
1362 gsl_matrix_free(_tmp_mat);
1366 _tmp_mat = gsl_matrix_alloc(m, n);
1367 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1., V, Sigma_pinv, 0., _tmp_mat);
1370 A_pinv = gsl_matrix_alloc(n, m);
1371 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1., U, _tmp_mat, 0., A_pinv);
1374 A_pinv = gsl_matrix_alloc(m, n);
1375 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1., _tmp_mat, U, 0., A_pinv);
1378 gsl_matrix_free(_tmp_mat);
1380 gsl_matrix_free(Sigma_pinv);
1403 size_t nwave =
g->nwave;
1404 int32_t m =
g->nwave;
1405 int32_t n =
g->npar;
1410 gsl_matrix *covRrs = gsl_matrix_alloc(m,m);
1411 gsl_matrix *Jac = gsl_matrix_alloc(m,n);
1412 gsl_matrix *invJac = gsl_matrix_alloc(n,m);
1413 gsl_matrix *tmpMatrix = gsl_matrix_alloc(m,n);
1414 gsl_matrix *covPar = gsl_matrix_alloc(n,n);
1416 if ((Rrs_f = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1417 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1418 __FILE__, __LINE__);
1422 if ((dydpar = (
double **) calloc(nwave,
sizeof (
double *))) ==
NULL) {
1423 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1424 __FILE__, __LINE__);
1428 for (iw = 0; iw < nwave; iw++) {
1429 if ((dydpar[iw] = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1430 printf(
"-E- %s line %d : error allocating memory for GIOP:giop_lm_fdf.\n",
1431 __FILE__, __LINE__);
1438 switch (
g->fit_opt) {
1440 giop_model_iterate(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, acdom1, anap1, bbph1, bbnap1, Rrs_f, dydpar,
NULL);
1443 giop_model(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, Rrs_f, dydpar,
NULL);
1448 for (ix = 0; ix <
g->nwave; ix++) {
1449 for (iy = 0; iy <
g->npar; iy++) {
1450 gsl_matrix_set(Jac, ix, iy, dydpar[ix][iy]);
1455 for (ix = 0; ix <
g->nwave; ix++) {
1456 for (iy = 0; iy <
g->nwave; iy++) {
1458 gsl_matrix_set(covRrs, ix, iy, pow(uRrs[
g->bindx[ix]],2));
1460 gsl_matrix_set(covRrs, ix, iy, 0.0);
1467 gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1.0, covRrs, invJac, 0.0, tmpMatrix);
1468 gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, invJac, tmpMatrix, 0.0, covPar);
1470 for (ix = 0; ix <
g->npar; ix++){
1471 for (iy = 0; iy <
g->npar; iy++){
1473 upar[ix] = pow(gsl_matrix_get(covPar,ix,iy),0.5);
1480 gsl_matrix_free(Jac);
1481 gsl_matrix_free(covPar);
1482 gsl_matrix_free(invJac);
1483 gsl_matrix_free(covRrs);
1484 gsl_matrix_free(tmpMatrix);
1498 size_t npar =
g->npar;
1500 static gsl_multifit_function_fdf
func;
1501 const gsl_multifit_fdfsolver_type *
t;
1502 gsl_multifit_fdfsolver *
s;
1505 gsl_matrix *
J = gsl_matrix_alloc(
g->nwave, npar);
1506 gsl_matrix *cov = gsl_matrix_alloc(npar, npar);
1525 t = gsl_multifit_fdfsolver_lmsder;
1526 s = gsl_multifit_fdfsolver_alloc(
t,
g->nwave,
g->npar);
1529 x = gsl_vector_view_array(par, npar);
1530 gsl_multifit_fdfsolver_set(
s, &
func, &
x.vector);
1534 for (iter = 0; iter <
g->maxiter; iter++) {
1535 gsl_multifit_fdfsolver_iterate(
s);
1536 if (gsl_multifit_test_delta(
s->dx,
s->x, 1e-4, 1e-4) == GSL_SUCCESS) {
1544 gsl_multifit_fdfsolver_jac(
s,
J);
1545 gsl_multifit_covar(
J, 0.0, cov);
1548 sum = gsl_blas_dnrm2(
s->f);
1550 *chi = pow(sum, 2.0) / dof;
1553 c = sum / sqrt(dof);
1558 for (ipar = 0; ipar < npar; ipar++) {
1559 par[ipar] = gsl_vector_get(
s->x, ipar);
1560 par[ipar + npar] = sqrt(gsl_matrix_get(cov, ipar, ipar)) *
c;
1564 gsl_multifit_fdfsolver_free(
s);
1565 gsl_matrix_free(cov);
1582 size_t nwave =
g->nwave;
1583 size_t npar =
g->npar;
1590 gsl_matrix *
A = gsl_matrix_alloc(nwave, npar);
1591 gsl_matrix *V = gsl_matrix_alloc(npar, npar);
1592 gsl_vector *S = gsl_vector_alloc(npar);
1593 gsl_vector *W = gsl_vector_alloc(npar);
1594 gsl_vector *
x = gsl_vector_alloc(npar);
1595 gsl_vector *
b = gsl_vector_alloc(nwave);
1597 if ((rrs_fit = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1598 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1599 __FILE__, __LINE__);
1602 if ((parstar = (
double **) calloc(nwave,
sizeof (
double *))) ==
NULL) {
1603 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1604 __FILE__, __LINE__);
1607 for (iw = 0; iw < nwave; iw++)
1608 if ((parstar[iw] = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1609 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1610 __FILE__, __LINE__);
1615 giop_model(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, rrs_fit,
NULL, parstar);
1618 for (ipar = 0; ipar <
g->npar; ipar++)
1623 for (iw = 0; iw <
g->nwave; iw++) {
1626 switch (
g->rrs_opt) {
1631 if ((gsl_poly_solve_quadratic(a2, a1, a0, &u0, &u1) == 2) && u1 > 0.0)
1639 u = rrs[iw] /
g->foq[iw];
1643 gsl_vector_set(
b, iw, -(
u *
g->aw[iw] + (
u - 1.0) *
g->bbw[iw]));
1645 for (ipar = 0; ipar <
g->npar; ipar++) {
1646 if (ipar < (
g->aph_nvec +
g->adg_nvec))
1647 gsl_matrix_set(
A, iw, ipar, parstar[iw][ipar] *
u);
1649 gsl_matrix_set(
A, iw, ipar, parstar[iw][ipar]*(
u - 1.0));
1654 status = gsl_linalg_SV_decomp(
A, V, S, W);
1655 status = gsl_linalg_SV_solve(
A, V, S,
b,
x);
1659 for (ipar = 0; ipar <
g->npar; ipar++) {
1660 par[ipar] = gsl_vector_get(
x, ipar);
1703 size_t nwave =
g->nwave;
1704 size_t npar =
g->npar;
1705 size_t nvec =
g->aph_nvec;
1707 int iw, ipar, iv, smlIdx;
1712 double diffSq, diffSqSum, smlRmse, sumRrs;
1714 gsl_matrix *
A = gsl_matrix_alloc(nwave, npar);
1715 gsl_matrix *V = gsl_matrix_alloc(npar, npar);
1716 gsl_vector *S = gsl_vector_alloc(npar);
1717 gsl_vector *W = gsl_vector_alloc(npar);
1718 gsl_vector *
x = gsl_vector_alloc(npar);
1719 gsl_vector *
b = gsl_vector_alloc(nwave);
1722 if ((rrs_fit = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
1723 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1724 __FILE__, __LINE__);
1727 if ((parstar = (
double **) calloc(nwave,
sizeof (
double *))) ==
NULL) {
1728 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1729 __FILE__, __LINE__);
1732 for (iw = 0; iw < nwave; iw++) {
1733 if ((parstar[iw] = (
double *) calloc(5,
sizeof (
double))) ==
NULL) {
1734 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1735 __FILE__, __LINE__);
1739 if ((parArr = (
double *) calloc(npar * nvec,
sizeof (
double *))) ==
NULL) {
1740 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1741 __FILE__, __LINE__);
1744 if ((
rmse = (
double *) calloc(nvec,
sizeof (
double *))) ==
NULL) {
1745 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1746 __FILE__, __LINE__);
1749 if ((badSolution = (
int *) calloc(nvec,
sizeof (
int *))) ==
NULL) {
1750 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1751 __FILE__, __LINE__);
1754 if ((parFit = (
double *) calloc(npar,
sizeof (
double *))) ==
NULL) {
1755 printf(
"-E- %s line %d : error allocating memory for GIOP:fit_giop_svd.\n",
1756 __FILE__, __LINE__);
1761 for (ipar = 0; ipar <
g->npar; ipar++)
1764 for (ipar = 0; ipar < 3; ipar++)
1769 for (iv = 0; iv < nvec; iv++)
1774 for (iv = 0; iv < nvec; iv++) {
1779 giop_model_iterate(
g, parFit,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, acdom1, anap1, bbph1, bbnap1, rrs_fit,
NULL, parstar);
1782 for (iw = 0; iw <
g->nwave; iw++) {
1785 switch (
g->rrs_opt) {
1790 if ((gsl_poly_solve_quadratic(a2, a1, a0, &u0, &u1) == 2) && u1 > 0.0)
1798 u = rrs[iw] /
g->foq[iw];
1802 gsl_vector_set(
b, iw, -(
g->aw[iw] *
u +
g->bbw[iw]*(
u - 1.0)));
1809 gsl_matrix_set(
A, iw, 0, parstar[iw][0] *
u + parstar[iw][3]*(
u - 1.0));
1810 gsl_matrix_set(
A, iw, 1, parstar[iw][1] *
u);
1811 gsl_matrix_set(
A, iw, 2, parstar[iw][2] *
u + parstar[iw][4]*(
u - 1.0));
1817 status = gsl_linalg_SV_decomp(
A, V, S, W);
1818 status = gsl_linalg_SV_solve(
A, V, S,
b,
x);
1821 for (ipar = 0; ipar < npar; ipar++) {
1825 if (gsl_vector_get(
x, ipar) < 0.0 ||
status != 0) {
1826 badSolution[iv] = 1;
1827 for (ipar = 0; ipar < npar; ipar++) {
1828 parArr[iv * npar + ipar] =
BAD_FLT;
1832 }
else if (gsl_vector_get(
x, ipar) >= 0.0) {
1833 badSolution[iv] = 0;
1834 parArr[iv * npar + ipar] = gsl_vector_get(
x, ipar);
1846 for (iv = 0; iv < nvec; iv++) {
1850 for (ipar = 0; ipar < npar; ipar++) {
1854 parFit[ipar] = parArr[iv * npar + ipar];
1859 giop_model_iterate(
g, parFit,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, acdom1, anap1, bbph1, bbnap1, rrs_fit,
NULL, parstar);
1866 for (iw = 0; iw <
g->nwave; iw++) {
1867 diffSq = pow((rrs_fit[iw] - rrs[iw]), 2);
1868 diffSqSum += diffSq;
1873 if (badSolution[iv]) {
1877 rmse[iv] = pow((diffSqSum / (
g->nwave - 1)), 0.5);
1886 for (iv = 0; iv < nvec; iv++) {
1887 if (
rmse[iv] < smlRmse) {
1895 g->siopIdx = smlIdx;
1899 if (
rmse[smlIdx] != 999 && badSolution[smlIdx] != 1) {
1901 for (ipar = 0; ipar < npar; ipar++) {
1902 par[ipar] = parArr[smlIdx * npar + ipar];
1910 for (ipar = 0; ipar < npar; ipar++) {
1939 float32 chl = badval;
1942 float uchl2_temp = badval;
1945 switch (
g->aph_opt) {
1952 for (ipar = 0; ipar <
g->aph_nvec; ipar++) {
1954 uchl2_temp += pow(par[ipar +
g->npar],2);
1956 *uchl = pow(uchl2_temp,0.5);
1970 return (
Rrs / (0.52 + 1.7 *
Rrs));
1980 dydr = 0.52 / pow(0.52 + 1.7*
Rrs, 2.);
1981 return pow(pow(dydr*uRrs,2.),0.5);
1990 return ( (0.52 * rrs_s) / (1.0 - 1.7 * rrs_s));
2000 dydr = 0.52/pow(1. - 1.7*rrs_s,2.);
2001 return pow(pow(dydr*urrs_s,2.), 0.5);
2010 float tab_bbp[],
float tab_ubbp[],
int tab_nwave) {
2014 float Rrs1, Rrs2, Rrs3;
2015 float uRrs1, uRrs2, uRrs3, covRrs1Rrs2, covRrs1Rrs3, covRrs2Rrs3;
2018 uRrs2_new = (
float*) calloc(1,
sizeof(
float));
2020 float bbp555_lh = badval;
2021 float ubbp555_lh = 0;
2023 float *wave = l2rec->l1rec->l1file->fwave;
2024 int32 nwave = l2rec->l1rec->l1file->nbands;
2029 for (iw = 0; iw < tab_nwave; iw++) {
2030 g->bbp_tab_w[iw] = wave[iw];
2031 tab_ubbp[iw] = badval;
2035 float alh[2] = {-2.5770 , 281.27};
2037 float ualh[3] = {2.4819E-2, 20.777, 0.24852};
2039 i1 =
windex(490.0, wave, nwave);
2040 i2 =
windex(555.0, wave, nwave);
2041 i3 =
windex(670.0, wave, nwave);
2043 Rrs1 = l2rec->Rrs[ipb2 + i1];
2044 Rrs2 = l2rec->Rrs[ipb2 + i2];
2045 Rrs3 = l2rec->Rrs[ipb2 + i3];
2047 uRrs1 =
g->uRrs_a[i1];
2048 uRrs2 =
g->uRrs_a[i2];
2049 uRrs3 =
g->uRrs_a[i3];
2055 Rrs2 =
conv_rrs_to_555(Rrs2, l2rec->l1rec->l1file->fwave[i2], uRrs2, uRrs2_new);
2059 LH = Rrs2 - (0.64*Rrs1 + 0.36*Rrs3 );
2060 uLH = sqrt( pow(0.64*uRrs1,2) + pow(*uRrs2_new,2) +
2061 pow(0.36*uRrs3,2) - 2*0.64*covRrs1Rrs2 -
2062 2*0.64*0.36*covRrs1Rrs3 - 0.36*covRrs2Rrs3);
2065 bbp555_lh = pow(10.,alh[0] + alh[1]*
LH);
2067 ubbp555_lh = sqrt(pow(log(10)*ualh[0]*bbp555_lh,2) +
2068 pow(
LH*log(10)*ualh[1]*bbp555_lh,2) +
2069 pow(uLH*alh[1]*log(10)*bbp555_lh,2) +
2070 2*ualh[2]*pow(log(10)*bbp555_lh,2));
2072 if (bbp555_lh < 0) {
2080 i1 =
windex(443.0, wave, nwave);
2081 i2 =
windex(550.0, wave, nwave);
2084 Rrs1 = l2rec->Rrs[ipb2 + i1];
2085 Rrs2 = l2rec->Rrs[ipb2 + i2];
2086 uRrs1 =
g->uRrs_a[i1];
2087 uRrs2 =
g->uRrs_a[i2];
2090 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
2095 g->bbp_s =
MAX(
MIN(2.0 * (1.0 - 1.2 * exp(-0.9 * Rrs1 / Rrs2)), bbp_s_max), bbp_s_min);
2096 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
2097 g->ubbp_s =
calc_ubbp_s(
g, Rrs1, Rrs2, uRrs1, *uRrs2_new, covRrs1Rrs2);
2101 }
else if (Rrs2 > 0.0) {
2102 g->bbp_s = bbp_s_min;
2109 for (iw = 0; iw < tab_nwave; iw++) {
2110 g->bbp_tab_w[iw] = wave[iw];
2115 for (iw = 0; iw < tab_nwave; iw++) {
2116 g->bbp_tab_w[iw] = wave[iw];
2117 tab_bbp[iw] = bbp555_lh*pow(555./tab_wave[iw],
g->bbp_s);
2118 tab_ubbp[iw] = sqrt(
2119 pow(bbp555_lh*
g->ubbp_s*pow(555./tab_wave[iw],
g->bbp_s)*log(555./tab_wave[iw]),2)
2120 + pow(ubbp555_lh*pow(555./tab_wave[iw],
g->bbp_s),2));
2133 float tab_bbp[],
float tab_ubbp[],
int tab_nwave) {
2138 float uRrs1, uRrs2,covRrs1Rrs2;
2140 float bbp555_chl = badval;
2141 float ubbp555_chl = 0;
2143 float *wave = l2rec->l1rec->l1file->fwave;
2144 int32 nwave = l2rec->l1rec->l1file->nbands;
2149 for (iw = 0; iw < tab_nwave; iw++) {
2150 g->bbp_tab_w[iw] = wave[iw];
2151 tab_ubbp[iw] = badval;
2155 float achl[2] = {0, 0};
2157 float uachl[2] = {1E-4, 0.02};
2159 i1 =
windex(550.0, wave, nwave);
2161 achl[0] = 2.267E-3 - 5.058E-6 * (l2rec->l1rec->l1file->fwave[i1] - 550.);
2162 achl[1] = 0.565 - 4.86E-4 * (l2rec->l1rec->l1file->fwave[i1] - 550.);
2165 bbp555_chl = achl[0]*pow(
g->chl,achl[1]);
2166 ubbp555_chl = sqrt(
g->uchl*pow(achl[0]*achl[1]*pow(
g->chl,(achl[1]-1)),2) +
2167 pow(uachl[0]*pow(
g->chl,achl[1]),2) +
2168 pow(uachl[1]* log(
g->chl)*achl[0]*pow(
g->chl,achl[1]),2));
2171 if (bbp555_chl < 0) {
2179 i1 =
windex(443.0, wave, nwave);
2180 i2 =
windex(550.0, wave, nwave);
2183 Rrs1 = l2rec->Rrs[ipb2 + i1];
2184 Rrs2 = l2rec->Rrs[ipb2 + i2];
2185 uRrs1 =
g->uRrs_a[i1];
2186 uRrs2 =
g->uRrs_a[i2];
2189 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
2194 g->bbp_s =
MAX(
MIN(2.0 * (1.0 - 1.2 * exp(-0.9 * Rrs1 / Rrs2)), bbp_s_max), bbp_s_min);
2195 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
2196 g->ubbp_s =
calc_ubbp_s(
g, Rrs1, Rrs2, uRrs1, uRrs2, covRrs1Rrs2);
2200 }
else if (Rrs2 > 0.0) {
2201 g->bbp_s = bbp_s_min;
2208 for (iw = 0; iw < tab_nwave; iw++) {
2209 g->bbp_tab_w[iw] = wave[iw];
2214 for (iw = 0; iw < tab_nwave; iw++) {
2215 g->bbp_tab_w[iw] = wave[iw];
2216 tab_bbp[iw] = bbp555_chl*pow(555./tab_wave[iw],
g->bbp_s);
2217 tab_ubbp[iw] = sqrt(
2218 pow(bbp555_chl*
g->ubbp_s*pow(555./tab_wave[iw],
g->bbp_s)*log(555./tab_wave[iw]),2)
2219 + pow(ubbp555_chl*pow(555./tab_wave[iw],
g->bbp_s),2));
2231 static int firstCall = 1;
2232 static giopstr giopctl;
2233 static giopstr *
g = &giopctl;
2248 float uRrs1, uRrs2, covRrs1Rrs2;
2255 int32 ipar, ip, iw, ib, ipb, ipb2, ierr;
2258 l1str *
l1rec = l2rec->l1rec;
2259 uncertainty_t *uncertainty=
l1rec->uncertainty;
2261 float *wave =
l1rec->l1file->fwave;
2262 int32 nwave =
l1rec->l1file->nbands;
2267 float dudtau, dtaudchl,dudchl,dvdchl,daphdchl;
2275 if ((bbw = calloc(nwave,
sizeof (
float))) ==
NULL) {
2276 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2277 __FILE__, __LINE__);
2280 if ((aw = calloc(nwave,
sizeof (
float))) ==
NULL) {
2281 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2282 __FILE__, __LINE__);
2285 if ((foq = calloc(nwave,
sizeof (
float))) ==
NULL) {
2286 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2287 __FILE__, __LINE__);
2290 if ((aph1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2291 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2292 __FILE__, __LINE__);
2295 if ((acdom1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2296 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2297 __FILE__, __LINE__);
2300 if ((anap1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2301 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2302 __FILE__, __LINE__);
2305 if ((adg1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2306 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2307 __FILE__, __LINE__);
2310 if ((bbph1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2311 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2312 __FILE__, __LINE__);
2315 if ((bbnap1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2316 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2317 __FILE__, __LINE__);
2320 if ((bbp1 = calloc(2 * nwave,
sizeof (
float))) ==
NULL) {
2321 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2322 __FILE__, __LINE__);
2325 if ((
g->wave = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2326 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2327 __FILE__, __LINE__);
2330 if ((
g->bindx = (
int *) calloc(nwave,
sizeof (
int))) ==
NULL) {
2331 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2332 __FILE__, __LINE__);
2335 if ((
g->aw = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2336 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2337 __FILE__, __LINE__);
2340 if ((
g->bbw = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2341 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2342 __FILE__, __LINE__);
2345 if ((
g->wts = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2346 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2347 __FILE__, __LINE__);
2350 if ((
g->foq = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2351 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2352 __FILE__, __LINE__);
2355 if ((
g->par = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
2356 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2357 __FILE__, __LINE__);
2360 if ((
g->len = (
double *) calloc(nwave,
sizeof (
double))) ==
NULL) {
2361 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2362 __FILE__, __LINE__);
2365 if ((
g->Rrs_a = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2366 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2367 __FILE__, __LINE__);
2370 if ((
g->uRrs_a = (
float *) calloc(nwave,
sizeof (
float))) ==
NULL) {
2371 printf(
"-E- %s line %d : error allocating memory in init_iop_flag.\n",
2372 __FILE__, __LINE__);
2382 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2383 __FILE__, __LINE__);
2387 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2388 __FILE__, __LINE__);
2391 if ((mRrs = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2392 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2393 __FILE__, __LINE__);
2396 if ((
a = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2397 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2398 __FILE__, __LINE__);
2401 if ((a_unc = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2402 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2403 __FILE__, __LINE__);
2406 if ((aph = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2407 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2408 __FILE__, __LINE__);
2411 if ((acdom = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2412 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2413 __FILE__, __LINE__);
2416 if ((anap = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2417 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2418 __FILE__, __LINE__);
2421 if ((adg = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2422 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2423 __FILE__, __LINE__);
2426 if ((bbph = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2427 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2428 __FILE__, __LINE__);
2431 if ((bbnap = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2432 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2433 __FILE__, __LINE__);
2436 if ((bbp = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2437 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2438 __FILE__, __LINE__);
2441 if ((bb = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2442 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2443 __FILE__, __LINE__);
2446 if ((bb_unc = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2447 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2448 __FILE__, __LINE__);
2451 if ((chl = calloc(
npix * 2,
sizeof (
float))) ==
NULL) {
2452 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2453 __FILE__, __LINE__);
2456 if ((rrsdiff = calloc(
npix,
sizeof (
float))) ==
NULL) {
2457 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2458 __FILE__, __LINE__);
2461 if ((aph_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2462 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2463 __FILE__, __LINE__);
2466 if ((adg_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2467 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2468 __FILE__, __LINE__);
2471 if ((uadg_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2472 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2473 __FILE__, __LINE__);
2476 if ((bbp_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2477 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2478 __FILE__, __LINE__);
2481 if ((ubbp_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2482 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2483 __FILE__, __LINE__);
2487 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2488 __FILE__, __LINE__);
2491 if ((siop_num = calloc(
npix,
sizeof (
int))) ==
NULL) {
2492 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2493 __FILE__, __LINE__);
2497 if ((chisqr = calloc(
npix,
sizeof (
float))) ==
NULL) {
2498 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2499 __FILE__, __LINE__);
2506 if (l2rec->Rrs_raman ==
NULL) {
2509 printf(
"No Raman scattering correction applied to Rrs. \n");
2512 allocateRrsRaman = 1;
2514 l1rec->l1file->nbands * sizeof (
float),
"Rrs_ram");
2519 if ((par = calloc(2 * nwave,
sizeof (
double))) ==
NULL) {
2520 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2521 __FILE__, __LINE__);
2525 if ((upar = calloc(
g->npar, sizeof (
double))) ==
NULL) {
2526 printf(
"-E- %s line %d : error allocating memory for GIOP:run_giop.\n",
2527 __FILE__, __LINE__);
2560 if (allocateRrsRaman) {
2561 free(l2rec->Rrs_raman);
2563 l1rec->l1file->nbands * sizeof (
float),
"Rrs_ram");
2567 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2568 __FILE__, __LINE__);
2572 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2573 __FILE__, __LINE__);
2576 if ((mRrs = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2577 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2578 __FILE__, __LINE__);
2581 if ((
a = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2582 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2583 __FILE__, __LINE__);
2586 if ((a_unc = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2587 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2588 __FILE__, __LINE__);
2591 if ((aph = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2592 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2593 __FILE__, __LINE__);
2596 if ((acdom = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2597 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2598 __FILE__, __LINE__);
2601 if ((anap = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2602 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2603 __FILE__, __LINE__);
2606 if ((adg = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2607 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2608 __FILE__, __LINE__);
2611 if ((bbph = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2612 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2613 __FILE__, __LINE__);
2616 if ((bbnap = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2617 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2618 __FILE__, __LINE__);
2621 if ((bbp = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2622 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2623 __FILE__, __LINE__);
2626 if ((bb = calloc(
npix * nwave * 2,
sizeof (
float))) ==
NULL) {
2627 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2628 __FILE__, __LINE__);
2631 if ((bb_unc = calloc(
npix * nwave,
sizeof (
float))) ==
NULL) {
2632 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2633 __FILE__, __LINE__);
2636 if ((chl = calloc(
npix * 2,
sizeof (
float))) ==
NULL) {
2637 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2638 __FILE__, __LINE__);
2641 if ((rrsdiff = calloc(
npix,
sizeof (
float))) ==
NULL) {
2642 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2643 __FILE__, __LINE__);
2646 if ((aph_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2647 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2648 __FILE__, __LINE__);
2651 if ((adg_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2652 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2653 __FILE__, __LINE__);
2656 if ((uadg_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2657 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2658 __FILE__, __LINE__);
2661 if ((bbp_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2662 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2663 __FILE__, __LINE__);
2666 if ((ubbp_s = calloc(
npix,
sizeof (
float))) ==
NULL) {
2667 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2668 __FILE__, __LINE__);
2672 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2673 __FILE__, __LINE__);
2676 if ((siop_num = calloc(
npix,
sizeof (
int))) ==
NULL) {
2677 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2678 __FILE__, __LINE__);
2682 if ((chisqr = calloc(
npix,
sizeof (
float))) ==
NULL) {
2683 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2684 __FILE__, __LINE__);
2690 if ((Rrs_a = calloc(nwave,
sizeof (
double))) ==
NULL) {
2691 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2692 __FILE__, __LINE__);
2695 if ((uRrs_a = calloc(nwave,
sizeof (
double))) ==
NULL) {
2696 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2697 __FILE__, __LINE__);
2700 if ((Rrs_b = calloc(nwave,
sizeof (
double))) ==
NULL) {
2701 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2702 __FILE__, __LINE__);
2705 if ((uRrs_b = calloc(nwave,
sizeof (
double))) ==
NULL) {
2706 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2707 __FILE__, __LINE__);
2710 if ((rrs_diff = calloc(nwave,
sizeof (
double))) ==
NULL) {
2711 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2712 __FILE__, __LINE__);
2715 if ((Rrs_f = calloc(nwave,
sizeof (
double))) ==
NULL) {
2716 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2717 __FILE__, __LINE__);
2720 if ((wts = calloc(nwave,
sizeof (
double))) ==
NULL) {
2721 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2722 __FILE__, __LINE__);
2725 if ((uRrs = calloc(nwave,
sizeof (
double))) ==
NULL) {
2726 printf(
"-E- %s line %d : error allocating memory for GIOP.\n",
2727 __FILE__, __LINE__);
2733 if (
input->giop_iterate > 0) {
2734 g->adg_s =
input->giop_adg_s;
2735 g->bbp_s =
input->giop_bbp_s;
2739 for (ip = 0; ip <
l1rec->npix; ip++) {
2742 ipb2 = ip *
l1rec->l1file->nbands;
2743 ierr =
l1rec->npix * nwave + ipb;
2747 for (ib = 0; ib < nwave; ib++) {
2748 a [ipb + ib] = badval;
2749 a_unc [ipb + ib] = 0.0;
2750 bb [ipb + ib] = badval;
2751 bb_unc [ipb + ib] = 0.0;
2752 aph [ipb + ib] = badval;
2753 adg [ipb + ib] = badval;
2754 acdom [ipb + ib] = badval;
2755 anap[ipb + ib] = badval;
2756 bbp [ipb + ib] = badval;
2757 bbph[ipb + ib] = badval;
2758 bbnap [ipb + ib] = badval;
2759 mRrs[ipb + ib] = badval;
2760 a [ierr + ib] = 0.0;
2761 bb [ierr + ib] = 0.0;
2762 aph [ierr + ib] = 0.0;
2763 adg [ierr + ib] = 0.0;
2764 acdom [ierr + ib] = 0.0;
2765 anap [ierr + ib] = 0.0;
2766 bbp [ierr + ib] = 0.0;
2767 bbph [ierr + ib] = 0.0;
2768 bbnap [ierr + ib] = 0.0;
2776 rrsdiff[ip] = badval;
2777 chisqr[ip] = badval;
2786 for (ipar = 0; ipar <
g->npar; ipar++)
2787 fit_par[ip][ipar] = badval;
2792 if (
l1rec->mask[ip]) {
2800 for (iw = 0; iw < nwave; iw++) {
2801 aw [iw] =
l1rec->sw_a [ipb2 + iw];
2802 bbw[iw] =
l1rec->sw_bb[ipb2 + iw];
2804 for (iw = 0; iw <
g->nwave; iw++) {
2805 g->aw [iw] = aw [
g->bindx[iw]];
2806 g->bbw[iw] = bbw [
g->bindx[iw]];
2810 for (iw = 0; iw < nwave; iw++) {
2811 g->Rrs_a[iw] = l2rec->Rrs[ipb2 + iw];
2813 switch (
g->urrs_opt) {
2815 g->uRrs_a[iw] = 0.0;
2819 g->uRrs_a[iw] = l2rec->Rrs_unc[ipb2 + iw];
2821 g->uRrs_a[iw] = 0.0;
2825 g->uRrs_a[iw] =
g->Rrs_a[iw]*
input->giop_rrs_unc[iw];
2828 g->uRrs_a[iw] =
input->giop_rrs_unc[iw];
2831 g->uRrs_a[iw] = 0.0;
2838 for (iw = 0; iw <
g->nwave; iw++) {
2840 switch (
g->urrs_opt) {
2843 g->wts[iw] = 1./pow(
g->uRrs_a[
g->bindx[iw]], 2);
2851 g->wts[iw] = 1./pow(
g->uRrs_a[
g->bindx[iw]], 2);
2863 aph_s[ip] =
g->aph_s;
2864 adg_s[ip] =
g->adg_s;
2865 bbp_s[ip] =
g->bbp_s;
2866 uadg_s[ip] =
g->uadg_s;
2867 ubbp_s[ip] =
g->ubbp_s;
2872 g->chl =
MAX(
MIN(l2rec->chl[ip], chl_max), chl_min);
2877 g->uchl = l2rec->chl_unc[ip];
2882 switch (
g->rrs_opt) {
2885 for (iw = 0; iw <
g->nwave; iw++) {
2886 g->foq[iw] = foq[
g->bindx[iw]];
2893 switch (
g->aph_opt) {
2896 for (iw = 0; iw < nwave; iw++) {
2897 g->aph_tab_w[iw] = wave[iw];
2906 dudchl = dudtau*dtaudchl;
2908 daphdchl = dudchl*
g->aph_tab_s[0][iw] + dvdchl*aph_norm;
2909 g->uaph_tab_s[0][iw] = sqrt(pow(daphdchl*
g->uchl,2));
2911 g->aph_tab_nw = nwave;
2916 for (iw = 0; iw < nwave; iw++) {
2917 g->aph_tab_w[iw] = wave[iw];
2919 g->uaph_tab_s[0][iw] = 0;
2921 g->aph_tab_nw = nwave;
2928 switch (
g->adg_opt) {
2931 i1 =
windex(443.0, wave, nwave);
2932 i2 =
windex(550.0, wave, nwave);
2935 Rrs1 = l2rec->Rrs[ipb2 + i1];
2936 Rrs2 = l2rec->Rrs[ipb2 + i2];
2937 uRrs1 =
g->uRrs_a[i1];
2938 uRrs2 =
g->uRrs_a[i2];
2940 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
2946 g->adg_s =
MAX(
MIN(0.015 + 0.002 / (0.6 + Rrs1 / Rrs2), adg_s_max), adg_s_min);
2947 if (
g->adg_s != adg_s_min ||
g->adg_s != adg_s_max) {
2948 g->uadg_s =
calc_uadg_s(
g, Rrs1, Rrs2, uRrs1, uRrs2, covRrs1Rrs2);
2952 }
else if (Rrs2 > 0.0) {
2953 g->adg_s = adg_s_min;
2963 i1 =
windex(412.0, wave, nwave);
2964 i2 =
windex(550.0, wave, nwave);
2967 Rrs1 = l2rec->Rrs[ipb2 + i1];
2968 Rrs2 = l2rec->Rrs[ipb2 + i2];
2969 uRrs1 =
g->uRrs_a[i1];
2970 uRrs2 =
g->uRrs_a[i2];
2972 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
2973 g->adg_s =
MAX(
MIN(0.015 + 0.0038 * log10(Rrs1 / Rrs2), adg_s_max), adg_s_min);
2974 if (
g->adg_s != adg_s_min ||
g->adg_s != adg_s_max) {
2975 g->uadg_s =
calc_uadg_s(
g, Rrs1, Rrs2, uRrs1, uRrs2, covRrs1Rrs2);
2979 }
else if (Rrs2 > 0.0) {
2980 g->adg_s = adg_s_min;
2992 switch (
g->bbp_opt) {
2995 i1 =
windex(490.0, wave, nwave);
2996 i2 =
windex(550.0, wave, nwave);
2997 Rrs1 = l2rec->Rrs[ipb2 + i1] - l2rec->Rrs_raman[ipb2 + i1];
2998 Rrs2 = l2rec->Rrs[ipb2 + i2] - l2rec->Rrs_raman[ipb2 + i2];
2999 uRrs1 =
g->uRrs_a[i1];
3000 uRrs2 =
g->uRrs_a[i2];
3002 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
3003 g->bbp_s =
MAX(
MIN(0.8 * (Rrs1 / Rrs2) + 0.2, bbp_s_max), bbp_s_min);
3004 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
3005 g->ubbp_s =
calc_ubbp_s(
g, Rrs1, Rrs2, uRrs1, uRrs2, covRrs1Rrs2);
3009 }
else if (Rrs2 > 0.0) {
3010 g->bbp_s = bbp_s_min;
3019 i1 =
windex(443.0, wave, nwave);
3020 i2 =
windex(550.0, wave, nwave);
3023 Rrs1 = l2rec->Rrs[ipb2 + i1];
3024 Rrs2 = l2rec->Rrs[ipb2 + i2];
3025 uRrs1 =
g->uRrs_a[i1];
3026 uRrs2 =
g->uRrs_a[i2];
3029 if (Rrs1 > 0.0 && Rrs2 > 0.0) {
3034 g->bbp_s =
MAX(
MIN(2.0 * (1.0 - 1.2 * exp(-0.9 * Rrs1 / Rrs2)), bbp_s_max), bbp_s_min);
3035 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
3036 g->ubbp_s =
calc_ubbp_s(
g, Rrs1, Rrs2, uRrs1, uRrs2, covRrs1Rrs2);
3040 }
else if (Rrs2 > 0.0) {
3041 g->bbp_s = bbp_s_min;
3050 if (l2rec->chl[ip] > 0.0) {
3051 g->bbp_s =
MAX(
MIN(1.0 - 0.768 * log10(
g->chl), bbp_s_max), bbp_s_min);
3052 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
3065 if (l2rec->chl[ip] > 0.0) {
3066 g->bbp_s =
MAX(
MIN(0.5 * (0.3 - log10(
g->chl)), bbp_s_max), bbp_s_min);
3067 if (
g->bbp_s != bbp_s_min ||
g->bbp_s != bbp_s_max) {
3085 printf(
"GIOP message: bbp slope uncertainties not computed during interface to LAS model.\n");
3086 printf(
" ubbp_s uncertainty values set to: %f.\n",
g->ubbp_s);
3092 if (
get_bbp_las(l2rec, ip,
g->bbp_tab_w,
g->bbp_tab_s[0],
g->bbp_tab_nw) == 0) {
3097 printf(
"GIOP message: bbp slope uncertainties not computed during interface to LAS model.\n");
3098 printf(
" ubbp_s uncertainty values set to: %f.\n",
g->ubbp_s);
3103 if (
get_bbp_qaa(l2rec, ip,
g->bbp_tab_w,
g->bbp_tab_s[0],
g->bbp_tab_nw) == 0) {
3108 printf(
"GIOP message: bbp slope uncertainties not computed during interface to QAA model.\n");
3109 printf(
" ubbp_s uncertainty values set to: %f.\n",
g->ubbp_s);
3113 if (
get_bbp_lh(l2rec,
g, ipb2,
g->bbp_tab_w,
g->bbp_tab_s[0],
g->ubbp_tab_s[0],
g->bbp_tab_nw) == 0) {
3120 if (
get_bbp_chl(l2rec,
g, ipb2,
g->bbp_tab_w,
g->bbp_tab_s[0],
g->ubbp_tab_s[0],
g->bbp_tab_nw) == 0) {
3130 aph_s[ip] =
g->aph_s;
3131 adg_s[ip] =
g->adg_s;
3132 bbp_s[ip] =
g->bbp_s;
3133 uadg_s[ip] =
g->uadg_s;
3134 ubbp_s[ip] =
g->ubbp_s;
3143 for (iw = 0; iw <
g->nwave; iw++) {
3145 Rrs_a[iw] = l2rec->Rrs[ipb2 + ib] - l2rec->Rrs_raman[ipb2 + ib];
3149 wts [iw] =
g->wts[iw];
3151 if (Rrs_b[iw] > 0.0) {
3158 if (bndcnt < g->npar) {
3167 for (ipar = 0; ipar <
g->npar; ipar++) {
3168 par[ipar] =
g->par[ipar];
3169 par[ipar +
g->npar] = 0.0;
3175 switch (
g->fit_opt) {
3193 printf(
"%s Line %d: Unknown optimization method for GIOP %d\n",
3194 __FILE__, __LINE__,
g->fit_opt);
3209 if (itercnt >=
g->maxiter)
3216 for (ipar = 0; ipar <
g->npar; ipar++) {
3217 if (isfinite(par[ipar +
g->npar]))
3219 par[ipar+
g->npar] = sqrt(pow(upar[ipar],2) +pow(par[ipar+
g->npar],2));
3224 for (ipar = 0; ipar <
g->npar; ipar++) {
3225 if (isfinite(par[ipar]))
3226 fit_par[ip][ipar] = par[ipar];
3233 switch (
g->fit_opt) {
3235 giop_model_iterate(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, acdom1, anap1, bbph1, bbnap1, Rrs_f,
NULL,
NULL);
3238 giop_model(
g, par,
g->nwave,
g->wave,
g->aw,
g->bbw,
g->foq, aph1, adg1, bbp1, Rrs_f,
NULL,
NULL);
3245 for (iw = 0; iw <
g->nwave; iw++) {
3246 if (!isfinite(Rrs_f[iw])) {
3259 for (iw = 0; iw <
g->nwave; iw++) {
3260 if (
g->wave[iw] >= 400 &&
g->wave[iw] <= 600) {
3261 if (
fabs(Rrs_b[iw]) > 1e-7 &&
fabs(Rrs_f[iw] - Rrs_b[iw]) > 1e-5)
3262 rrsdiff[ip] +=
fabs(Rrs_f[iw] - Rrs_b[iw]) /
fabs(Rrs_b[iw]);
3265 rrsdiff[ip] /=
g->nwave;
3266 if (rrsdiff[ip] >
input->giop_rrs_diff) {
3276 switch (
g->fit_opt) {
3278 giop_model_iterate(
g, par, nwave, wave, aw, bbw, foq, aph1, adg1, bbp1, acdom1, anap1, bbph1, bbnap1, Rrs_f,
NULL,
NULL);
3282 for (ib = 0; ib < nwave; ib++) {
3284 if (isfinite(aph1[ib])) {
3285 aph[ipb + ib] = aph1[ib];
3286 aph[ierr + ib] = aph1[ib + nwave];
3290 if (isfinite(acdom1[ib])) {
3291 acdom[ipb + ib] = acdom1[ib];
3292 acdom[ierr + ib] = acdom1[ib + nwave];
3296 if (isfinite(anap1[ib])) {
3297 anap[ipb + ib] = anap1[ib];
3298 anap[ierr + ib] = anap1[ib + nwave];
3302 if (isfinite(aph1[ib]) && isfinite(acdom1[ib]) && isfinite(anap1[ib])) {
3303 adg[ipb + ib] = acdom1[ib] + anap1[ib];
3304 adg[ierr + ib] = pow(pow(adg1[ib + nwave],2) + pow(acdom1[ib + nwave],2),0.5);
3305 a[ipb + ib] = aw[ib] + aph1[ib] + acdom1[ib] + anap1[ib];
3306 a[ierr + ib] = pow( pow(aph1[ib + nwave],2) + pow(adg1[ib + nwave],2) + pow(acdom1[ib + nwave],2) ,0.5 );
3310 if (isfinite(bbnap1[ib])) {
3311 bbnap [ipb + ib] = bbnap1[ib];
3312 bbnap [ierr + ib] = bbnap1[ib + nwave];
3316 if (isfinite(bbph1[ib])) {
3317 bbph [ipb + ib] = bbph1[ib];
3318 bbph [ierr + ib] = bbph1[ib + nwave];
3322 if (isfinite(bbph1[ib]) && isfinite(bbnap1[ib])) {
3323 bbp[ipb + ib] = bbph1[ib] + bbnap1[ib];
3324 bbp[ierr + ib] = pow(pow(bbph1[ib + nwave],2) + pow(bbnap1[ib + nwave],2),0.5);
3325 bb [ipb + ib] = bbw[ib] + bbph1[ib] + bbnap1[ib];
3326 bb [ierr + ib] = pow(pow(bbph1[ib + nwave],2) + pow(bbnap[ib + nwave],2),0.5);
3334 &bb[ipb], &bbp[ipb], &iopf[ip]);
3337 siop_num[ip] = 1 +
g->siopIdx;
3346 giop_model(
g, par, nwave, wave, aw, bbw, foq, aph1, adg1, bbp1, Rrs_f,
NULL,
NULL);
3348 for (ib = 0; ib < nwave; ib++) {
3352 if (isfinite(aph1[ib])) {
3353 aph[ipb + ib] = aph1[ib];
3354 aph[ierr + ib] = aph1[ib + nwave];
3358 if (isfinite(adg1[ib])) {
3359 adg[ipb + ib] = adg1[ib];
3360 adg[ierr + ib] = adg1[ib + nwave];
3364 if (isfinite(aph1[ib]) && isfinite(adg1[ib])) {
3365 a[ipb + ib] = aw[ib] + aph1[ib] + adg1[ib];
3366 a[ierr + ib] = pow( pow(aph1[ib + nwave],2) + pow(adg1[ib + nwave],2), 0.5 );
3367 a_unc[ipb + ib] = pow( pow(aph1[ib + nwave],2) + pow(adg1[ib + nwave],2), 0.5 );
3372 if (isfinite(bbp1[ib])) {
3373 bbp[ipb + ib] = bbp1[ib];
3374 bbp[ierr + ib] = bbp1[ib + nwave];
3375 bb [ipb + ib] = bbw[ib] + bbp1[ib];
3376 bb [ierr + ib] = bbp1[ib + nwave];
3377 bb_unc[ipb + ib] = bbp1[ib + nwave];
3385 &bb[ipb], &bbp[ipb], &iopf[ip]);
3401 for (ip = 0; ip <
l1rec->npix; ip++)
3405 LastRecNum =
l1rec->iscan;
3421 static void extract_band_3d(
float *in_buf,
float *out_buf,
int numPixels,
int numBands) {
3422 float * out_ptr = out_buf;
3423 for (
int pix = 0; pix < numPixels; pix++) {
3424 float *in_ptr = in_buf + pix * numBands;
3425 for (
int band_3d = 0; band_3d <
input->nwavelengths_3d; band_3d++) {
3426 int band =
input->wavelength_3d_index[band_3d];
3427 *out_ptr = in_ptr[
band];
3438 static void extract_band_3d_unc(
float *in_buf,
float *out_buf,
int numPixels,
int numBands) {
3439 float * out_ptr = out_buf;
3440 for (
int pix = 0; pix < numPixels; pix++) {
3441 float *in_ptr = in_buf + (pix * numBands + numPixels*numBands) ;
3442 for (
int band_3d = 0; band_3d <
input->nwavelengths_3d; band_3d++) {
3443 int band =
input->wavelength_3d_index[band_3d];
3444 *out_ptr = in_ptr[
band];
3455 int prodID =
p->cat_ix;
3456 int ib =
p->prod_ix;
3458 int32_t ip, ipb, ierr;
3459 l1str *
l1rec = l2rec->l1rec;
3463 switch (
input->giop_fit_opt) {
3476 printf(
"-E- %s line %d : products acdom, anap, bbph and bbnap are only applicable with giop_fit_opt=SVDSIOP.\n",
3477 __FILE__, __LINE__);
3490 extract_band_3d(aph, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3494 extract_band_3d(adg, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3498 extract_band_3d(acdom, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3502 extract_band_3d(anap, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3506 extract_band_3d(bbp, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3510 extract_band_3d(
a, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3514 extract_band_3d(bb, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3518 extract_band_3d(bbph, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3522 extract_band_3d(bbph, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3526 extract_band_3d_unc(
a, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3530 extract_band_3d_unc(aph, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3534 extract_band_3d_unc(adg, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3538 extract_band_3d_unc(acdom, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3542 extract_band_3d_unc(anap, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3546 extract_band_3d_unc(bb, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3550 extract_band_3d_unc(bbp, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3554 extract_band_3d_unc(bbph, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3558 extract_band_3d_unc(bbnap, prod, l2rec->l1rec->npix, l2rec->l1rec->l1file->nbands);
3562 printf(
"-E- %s line %d : product ID %d passed to GIOP does not support 3D data sets.\n",
3563 __FILE__, __LINE__, prodID);
3569 for (ip = 0; ip <
l1rec->npix; ip++) {
3571 ipb = ip *
l1rec->l1file->nbands + ib;
3572 ierr =
l1rec->npix *
l1rec->l1file->nbands + ipb;
3577 prod[ip] = (
float) mRrs[ipb];
3581 prod[ip] = (
float) aph[ipb];
3585 prod[ip] = (
float) adg[ipb];
3589 prod[ip] = (
float) bbp[ipb];
3593 prod[ip] = (
float)
a[ipb];
3597 prod[ip] = (
float) bb[ipb];
3601 prod[ip] = (
float) acdom[ipb];
3605 prod[ip] = (
float) anap[ipb];
3609 prod[ip] = (
float) bbph[ipb];
3613 prod[ip] = (
float) bbnap[ipb];
3617 prod[ip] = (
float) chl[ip];
3621 prod[ip] = (
int) siop_num[ip];
3625 prod[ip] = (
float) aph[ierr];
3629 prod[ip] = (
float) adg[ierr];
3633 prod[ip] = (
float) adg[ierr];
3637 prod[ip] = (
float) adg[ierr];
3641 prod[ip] = (
float) bbp[ierr];
3645 prod[ip] = (
float) bbph[ierr];
3649 prod[ip] = (
float) bbnap[ierr];
3653 prod[ip] = (
float)
a[ierr];
3657 prod[ip] = (
float) bb[ierr];
3665 prod[ip] = (
float) aph_s[ip];
3669 prod[ip] = (
float) adg_s[ip];
3673 prod[ip] = (
float) uadg_s[ip];
3677 prod[ip] = (
float) bbp_s[ip];
3681 prod[ip] = (
float) ubbp_s[ip];
3685 prod[ip] = (
float) rrsdiff[ip];
3689 prod[ip] = (
float) chisqr[ip];
3693 if (ib >= max_npar) {
3694 printf(
"-E- %s line %d : output request for GIOP fit parameter %d exceeds number of fit parameters %d.\n",
3695 __FILE__, __LINE__, ib, max_npar);
3698 prod[ip] = (
float) fit_par[ip][ib];
3702 printf(
"-E- %s line %d : erroneous product ID %d passed to GIOP.\n",
3703 __FILE__, __LINE__, prodID);
3718 if (!
giop_ran(l2rec->l1rec->iscan))
3730 if (!
giop_ran(l2rec->l1rec->iscan))
3742 int32_t ib, ip, ipb, ipb2;
3744 int32_t
nbands = l2rec->l1rec->l1file->nbands;
3745 int32_t
npix = l2rec->l1rec->npix;
3747 if (!
giop_ran(l2rec->l1rec->iscan))
3750 for (ip = 0; ip <
npix; ip++) {
3751 for (ib = 0; ib <
nbands; ib++) {
3754 l2rec->a [ipb2] = (
float)
a[ipb];
3755 l2rec->bb[ipb2] = (
float) bb[ipb];