9 return (
Rrs / (0.52 + 1.7 *
Rrs));
17 return (
Rrs * 0.52 / (1 - 1.7 *
Rrs));
35 void rhown_red(
char *fqfile,
float chl,
float aw[],
float bbw[],
float Rrs[],
36 float wave[], int32_t nwave, int32_t ib_red,
float rhown[]) {
37 static int firstCall = 1;
39 static float eta = 0.5;
40 float static chl_min = 0.2;
41 float static chl_max = 30.;
43 float aw_red, apg_red, bb5;
51 ib5 =
windex(555, wave, nwave);
52 if (
fabs(555 - wave[ib5]) > 15) {
53 printf(
"%s line %d: can't find reasonable green band\n", __FILE__, __LINE__);
54 printf(
"looking for 555, found %f\n", wave[ib5]);
61 chl_in =
MAX(
MIN(chl, chl_max), chl_min);
70 foqint_morel(fqfile, wave, nwave, 0.0, 0.0, 0.0, chl_in, foq);
74 apg_red = exp(log(chl) * 0.9389 - 3.7589);
75 apg_red =
MIN(
MAX(apg_red, 0.0), 0.5);
80 bb5 = (-0.00182 + 2.058 * Rrs5);
83 bb = bb5 * pow((wave[ib5] / wave[ib_red]), eta) + bbw[ib_red];
86 salbedo = bb / (
a + bb);
87 Rrs_red = foq[ib_red] * salbedo;
90 rhown[ib_red] =
PI*Rrs_red;
108 void rhown_nir(
char *fqfile,
float chl,
float aw[],
float bbw[],
float Rrs[],
float wave[],
109 int32_t nwave,
float solz,
float senz,
float phi,
110 int32_t nir_s, int32_t nir_l,
float rhown[],l2str *l2rec, int32_t ip) {
111 static int firstCall = 1;
116 uncertainty_t *uncertainty=l2rec->l1rec->uncertainty;
118 float *dchl=
NULL,*drhown=
NULL,*covariance;
121 dchl=&uncertainty->dchl;
122 drhown=uncertainty->drhown_nir;
123 if(
input->proc_uncertainty==2)
124 covariance=uncertainty->covaraince_matrix;
126 covariance=uncertainty->pixel_covariance;
129 float a6, aw6, apg6, bbp6;
131 float static chl_min = 0.2;
132 float static chl_max = 30.;
136 float Rrs2, Rrs5, Rrs6, Rrs6_star;
138 int32_t dnir =
MAX(nir_l - nir_s, 1);
144 float dRrs2, dRrs5, dRrs6, dRrs6_star;
148 float dRrs_nir, Rrs_below;
151 ib6 =
windex(670, wave, nwave);
152 if (
fabs(670 - wave[ib6]) > 50) {
153 printf(
"%s line %d: can't find reasonable red band\n", __FILE__, __LINE__);
154 printf(
"looking for 670, found %f\n", wave[ib6]);
158 ib5 =
windex(555, wave, nwave);
159 if (
fabs(555 - wave[ib5]) > 15) {
160 printf(
"%s line %d: can't find reasonable green band\n", __FILE__, __LINE__);
161 printf(
"looking for 555, found %f\n", wave[ib5]);
164 ib2 =
windex(443, wave, nwave);
165 if (
fabs(443 - wave[ib2]) > 5) {
166 printf(
"%s line %d: can't find reasonable blue band\n", __FILE__, __LINE__);
167 printf(
"looking for 443, found %f\n", wave[ib2]);
178 for (ib = nir_s; ib <= nir_l; ib += dnir){
186 chl =
MAX(
MIN(chl, chl_max), chl_min);
188 if(uncertainty && (
fabs(chl-chl_max)<0.00001 ||
fabs(chl-chl_min)<0.00001))
192 apg6 = exp(log(chl) * 0.9389 - 3.7589);
193 apg6 =
MIN(
MAX(apg6, 0.0), 0.5);
200 da6=apg6*0.9389*1.0/chl* (*dchl);
208 dRrs2 = 0.52 * pow(Rrs2 /
Rrs[ib2], 2) * sqrt(covariance[ib2*nwave+ib2]);
209 dRrs5 = 0.52 * pow(Rrs5 /
Rrs[ib5], 2) * sqrt(covariance[ib5*nwave+ib5]);
210 dRrs6 = 0.52 * pow(Rrs6 /
Rrs[ib6], 2) * sqrt(covariance[ib6*nwave+ib6]);
218 if (Rrs5 > 0.0 && Rrs2 > 0.0) {
219 eta = 2.0 * (1. - 1.2 * exp(-0.9 * (Rrs2 / Rrs5)));
220 eta =
MIN(
MAX(eta, 0.0), 1.0);
226 deta=2.4*0.9*exp(-0.9 * (Rrs2 / Rrs5))* sqrt( pow(dRrs2/Rrs5,2)+ pow(Rrs2*dRrs5/(Rrs5*Rrs5),2)-2*Rrs2/pow(Rrs5,3)*covariance[ib2*nwave+ib5]);
231 Rrs6_star = Rrs6 / foq[ib6];
233 dRrs6_star=dRrs6/foq[ib6];
235 bbp6 = (Rrs6_star * a6 / (1. - Rrs6_star)) - bbw[ib6];
237 dbbp6= sqrt( pow(Rrs6_star*da6/(1-Rrs6_star),2) + pow(dRrs6_star*a6/pow(1-Rrs6_star,2) ,2) );
240 for (ib = nir_s; ib <= nir_l; ib += dnir) {
253 bb = bbp6 * pow((wave[ib6] / wave[ib]), eta) + bbw[ib];
256 dbb=pow((wave[ib6] / wave[ib]), eta)* sqrt( dbbp6*dbbp6 + pow(bbp6*log(wave[ib6]/wave[ib])*deta,2) );
259 salbedo = bb / (
a + bb);
261 dsalbedo=salbedo*salbedo* sqrt( pow(da/bb,2) + pow(
a*dbb/(bb*bb),2) );
264 Rrs_nir = foq[ib6] * salbedo;
266 dRrs_nir=foq[ib6] *dsalbedo;
271 rhown[ib] =
PI*Rrs_nir;
273 drhown[ib]=
PI*1/0.52* Rrs_nir*Rrs_nir/(Rrs_below*Rrs_below)*dRrs_nir;
287 int32_t nwave,
float aw[],
float bbw[],
float chl,
288 float solz,
float senz,
float phi,
float rhown[],l2str *l2rec, int32_t ip) {
291 rhown_red(fqfile, chl, aw, bbw,
Rrs, wave, nwave, nir_l, rhown);
293 rhown_nir(fqfile, chl, aw, bbw,
Rrs, wave, nwave,
solz,
senz, phi, nir_s, nir_l, rhown, l2rec,ip);