20 #include "deepblue/DbProcess.h"
52 short& snow1,
short& snow2 )
56 if (
p_->rfl_[W412] < filltest) {
66 float lat = g_->in_->latitude;
67 float lon = g_->in_->longitude;
71 float rfl[NUM_RFL_BANDS];
72 if (
p_->rfl_[W412] > filltest) {
73 for (
int ib=0; ib<NUM_RFL_BANDS; ib++) {
74 rfl[ib] =
p_->rfl_[ib]*to_modis;
77 for (
int ib=0; ib<NUM_RFL_BANDS; ib++) {
82 int ilat = (
int)((
lat + 90.)*10.0);
83 if (ilat >= 1800) ilat = 1800-1;
84 if (ilat < 0) ilat = 0;
85 int ilon = (
int)((
lon + 180.0)*10.0);
86 if (ilon >= 3600) ilon = 3600-1;
87 if (ilon < 0) ilon = 0;
88 int gzflg =
p_->gz_lut_->GEOZONE_FLAG[ilat][ilon];
90 int ix1 =
max(ix-1,0);
91 int ix2 =
min(ix+1,g_->pixels_-1);
92 int iy1 =
max(iy-1,0);
93 int iy2 =
min(iy+1,g_->lines_-1);
96 float rflmax = -999.0;
97 for (
int cx=ix1; cx<=ix2; cx++) {
98 for (
int cy=iy1; cy<=iy2; cy++) {
99 float rf =
p_->rfl_[W412][cy][cx];
101 rflmin = (
rf<rflmin) ?
rf : rflmin;
102 rflmax = (
rf>rflmax) ?
rf : rflmax;
106 if (rflmax<1.E-8 || rflmin<1.E-8 ) {
114 if (minmax_rfl > 1.2) {
117 if (
p_->sr670_ >= 0.08 && minmax_rfl > 1.15) {
122 if (
p_->sr670_ >= 0.08 ) {
160 if (
p_->sr670_ > 0.0 &&
p_->sr670_ < 0.08 ) {
164 if (
p_->rfl_[
W2250] > 0.36 && dd < 0.95) {
177 if (
lat > 60.0 &&
p_->amf_ > 7.0) {
182 if (
rfl[W488] > 0.4) {
194 if ((gzflg == 5 || gzflg == 1 || gzflg == 26 || gzflg == 27) ||
195 (
lon < 15.0 && ((
lon >-20.0 &&
lon < 55.0) && gzflg == -999))) {
197 if (
p_->sr670_ > 0.0 &&
p_->sr670_ < 0.08) {
198 if (
rfl[W488] > 0.15) {
247 float ndsi = floatfill;
260 if (ndsi > -0.2 &&
rfl[
W865] > 0.11) {
283 short&
mask,
const short snow2 )
287 if (
p_->rfl_[W412] < filltest) {
291 float lat = g_->in_->latitude;
292 float lon = g_->in_->longitude;
293 float solz = g_->in_->solar_zenith;
294 int ilat = (
int)((
lat + 90.)*10.0);
295 if (ilat >= 1800) ilat = 1800-1;
296 if (ilat < 0) ilat = 0;
297 int ilon = (
int)((
lon + 180.0)*10.0);
298 if (ilon >= 3600) ilon = 3600-1;
299 if (ilon < 0) ilon = 0;
300 int gzflg =
p_->gz_lut_->GEOZONE_FLAG[ilat][ilon];
301 int sfcstd =
p_->sp_lut_->SURFACE_ELEVATION[ilat][ilon];
302 int month = g_->in_->start_month;
304 if (
p_->ler412_ > 50.0) {
307 if (
p_->sr670_ < 0.1) {
309 p_->ler412_ > 12.0) {
313 if (
p_->sr670_ < 0.08) {
317 if (
p_->ler412_ > 40.0) {
323 if (
p_->ler412_ > 20.0) {
330 int iy1 =
max(iy-1,0);
331 int iy2 =
min(iy+1,g_->lines_-1);
332 int ix1 =
max(ix-1,0);
333 int ix2 =
min(ix+1,g_->pixels_-1);
335 float lermin = 999.0;
336 float lermax = -999.0;
337 for (
int cx=ix1; cx<=ix2; cx++) {
338 for (
int cy=iy1; cy<=iy2; cy++) {
349 if (lermax<1.E-8 || lermin<1.E-8 ) {
355 if (snow2 == 1 && gzflg == 13 &&
357 sfcstd <= 50 && minmax_ler > 1.20) {
361 if (
lat > 45 && month >= 2 && month <= 6 &&
362 snow2 == 1 && gzflg == 13 &&
p_->ndvi_ < 0.45 &&
363 sfcstd <= 50 && minmax_ler > 1.30) {
367 if (snow2 == 1 && gzflg != 13 &&
p_->ndvi_ < 0.35 &&
368 sfcstd <= 50 && minmax_ler > 1.40) {
372 if (
lat > 50 && month >= 2 && month <= 6 && snow2 == 1 &&
373 gzflg != 13 &&
p_->ndvi_ < 0.45 &&
374 sfcstd <= 50 && minmax_ler > 1.30) {
378 if (snow2 == 1 && sfcstd > 50 && minmax_ler > 1.80) {
384 if (
p_->ler412_ > filltest &&
385 p_->ler488_ > filltest &&
386 p_->ler670_ > filltest) {
388 if (
p_->ler488_/
p_->ler670_ < 0.65 &&
389 p_->ler412_ > 18.0) {
428 if (
p_->rfl_[
W1380] < filltest) {
434 int ix1 =
max(ix-1,0);
435 int ix2 =
min(ix+1,g_->pixels_-1);
436 int iy1 =
max(iy-1,0);
437 int iy2 =
min(iy+1,g_->lines_-1);
445 memset(&tler[0][0][0],0,
sizeof(tler));
446 memset(&tsr[0][0][0],0,
sizeof(tsr));
447 memset(&td[0][0][0],0,
sizeof(td));
448 for (
int cy=iy1; cy<=iy2; cy++) {
449 for (
int cx=ix1; cx<=ix2; cx++) {
461 if (
p_->rfl_[
W2250][cy][cx] < 0.035) cnt2250_1++;
462 if (
p_->rfl_[
W2250][cy][cx] < 0.065) cnt2250_2++;
465 float rat488670 =
p_->ler488_ /
p_->ler670_;
466 float rat412488 =
p_->ler412_ /
p_->ler488_;
468 if (
p_->ler412_ > 12.0) {
469 if ((
p_->sr670_ < 0.08 && cnt2250_1 == 9) ||
470 (
p_->sr670_ >= 0.08 && cnt2250_2 == 9)) {
474 if (
p_->ler412_ > 20.0 &&
478 if (
p_->ler488_ > 0.0 &&
p_->ler670_ > 0.0) {
479 rat488670 =
p_->ler488_ /
p_->ler670_;
480 if (rat488670 > 0.88) {
483 if (rat488670 > 0.7 && rat488670 < 0.88 &&
494 if (
p_->sr670_ >= 0.12 ||
p_->ler670_ > 50.0) {
497 if (rat412488/rat488670 > 0.94) {
534 if (
p_->rfl_[
W1380] < filltest) {
539 float rat412488 =
p_->ler412_ /
p_->ler488_;
543 p_->ler670_ > 24.0 &&
581 if (
p_->rfl_[
W1380] < filltest) {
586 float lat = g_->in_->latitude;
587 float lon = g_->in_->longitude;
589 int ilat = (
int)((
lat + 90.)*10.0);
590 if (ilat >= 1800) ilat = 1800-1;
591 if (ilat < 0) ilat = 0;
592 int ilon = (
int)((
lon + 180.0)*10.0);
593 if (ilon >= 3600) ilon = 3600-1;
594 if (ilon < 0) ilon = 0;
595 int gzflg =
p_->gz_lut_->GEOZONE_FLAG[ilat][ilon];
597 int ix1 =
max(ix-1,0);
598 int ix2 =
min(ix+1,g_->pixels_-1);
599 int iy1 =
max(iy-1,0);
600 int iy2 =
min(iy+1,g_->lines_-1);
606 memset(&tler[0][0][0],0,
sizeof(tler));
607 memset(&tsr[0][0][0],0,
sizeof(tsr));
608 memset(&td[0][0][0],0,
sizeof(td));
609 for (
int cy=iy1; cy<=iy2; cy++) {
610 for (
int cx=ix1; cx<=ix2; cx++) {
621 if (
p_->rfl_[
W2250][cy][cx] < 0.25) cntW2250++;
624 float rat488670 =
p_->ler488_ /
p_->ler670_;
625 float rat412488 =
p_->ler412_ /
p_->ler488_;
628 if (
p_->ler412_ > 12.0) {
629 if ((
p_->sr670_ < 0.08 && cntW2250 == 9) ||
630 (
p_->sr670_ >= 0.08 && cntW2250 == 9)) {
631 if (
p_->ler488_ > 18.0 &&
632 (rat488670 > 0.7 && rat488670 < 0.88) &&
637 if (
p_->ler488_ > 18.0 &&
638 (rat488670 > 0.7 && rat488670 < 0.88) &&
639 p_->rfl_[
W2250] < 0.22 && rat412488 < 0.8) {
642 if (
p_->ler488_ > 18.0 &&
643 p_->rfl_[
W1380] > 0.0015 && rat412488 < 0.8) {
648 if (
p_->ler488_ > 18.0 &&
649 (rat488670 > 0.9 && rat488670 < 1.06) &&
650 (rat412488 > 0.7 && rat412488 < 0.88) &&
658 if (
p_->sr670_ >= 0.12 ||
p_->rfl_[
W2250] > 0.06 ||
659 p_->ler670_ > 50.0 ||
p_->rfl_[
W1380] < 0.0005 ||
663 if (rat412488/rat488670 > 0.94) {
699 if (
p_->rfl_[W412] < filltest) {
703 float lat = g_->in_->latitude;
704 float solz = g_->in_->solar_zenith;
706 float m01_stddev = 0;
708 float m08_stddev = 0;
711 int ipmin =
max(ix-1,0);
712 int ipmax =
min(ix+1, g_->pixels_-1);
713 int ilmin =
max(iy-1,0);
714 int ilmax =
min(iy+1, g_->lines_-1);
717 for (
int il=ilmin; il<=ilmax; il++) {
718 for (
int ip=ipmin; ip<=ipmax; ip++) {
719 if (
p_->rfl_[W412][il][ip] > filltest &&
720 g_->in_->land_water[il][ip] == 0) {
721 m01_avg +=
p_->rfl_[W412][il][ip];
729 for (
int il=ilmin; il<=ilmax; il++) {
730 for (
int ip=ipmin; ip<=ipmax; ip++) {
731 if (
p_->rfl_[W412][il][ip] > filltest &&
732 g_->in_->land_water[il][ip] == 0) {
733 m01_stddev += pow((
p_->rfl_[W412][il][ip]-m01_avg),2);
738 m01_stddev = sqrt(m01_stddev/(cnt-1));
740 m01_stddev = floatfill;
744 for (
int il=ilmin; il<=ilmax; il++) {
745 for (
int ip=ipmin; ip<=ipmax; ip++) {
746 if (
p_->rfl_[
W1240][il][ip] > filltest &&
747 g_->in_->land_water[il][ip] == 0) {
748 m08_avg +=
p_->rfl_[
W1240][il][ip];
756 for (
int il=ilmin; il<=ilmax; il++) {
757 for (
int ip=ipmin; ip<=ipmax; ip++) {
758 if (
p_->rfl_[
W1240][il][ip] > filltest &&
759 g_->in_->land_water[il][ip] == 0) {
760 m08_stddev += pow((
p_->rfl_[
W1240][il][ip]-m08_avg),2);
765 m08_stddev = sqrt(m08_stddev/(cnt-1));
767 m08_stddev = floatfill;
771 if ((m01_stddev > filltest &&
773 (m08_stddev > filltest &&
778 if ((m01_stddev > filltest &&
780 (m08_stddev > filltest &&