OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
DbAlgorithm.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2  *
3  * NAME: DbAlgorithm.cpp
4  *
5  *-----------------------------------------------------------------------
6  * *F90
7  *
8  * *DESCRIPTION:
9  *
10  * DeepBlue.f90 is the main driver for the MOD_PR04_DB process.
11  * MOD_PR04_DB reads in MOD02, MOD03, and MOD06 data, processes
12  * the data using the Deep Blue aerosol algorithm, and writes
13  * the Deep Blue data fields into the MOD04 product.
14  *
15  * *INPUT PARAMETERS: none
16  *
17  * *OUTPUT PARAMETERS: none
18  *
19  *
20  * *REFERENCES AND CREDITS
21  *
22 * Modelled on code originally developed by Mark Gray and
23 * modified by J. Wei.
24  *
25  *
26  * Created on: November 3, 2017
27  * Author: Sam Anderson, Db
28  *
29  * Modified:
30  *
31  *******************************************************************************/
32 
33 #include "deepblue/DbAlgorithm.h"
34 
35 #include <math.h>
36 #include <new> // nothrow
37 #include <algorithm> // std::sort
38 #include <iostream> // std::cout
39 #include <functional> // std::bind
40 #include <vector>
41 
42 #include <DDProcess.h>
43 
44 using namespace std;
45 
46 const float DbAlgorithm::xzlog[10] = { 0.0000000, 0.00977964, 0.0395086,
47  0.0904221, 0.164818, 0.266515, 0.401776, 0.581261, 0.824689, 1.17436 };
48 //-- these numbers correspond to satellite zenith angle
49 //-- node points of 0.,16.,30.,40.,48.,54.,58.,60. degrees
50 const float DbAlgorithm::xlog[8] = { 0.000000, 0.0395086, 0.143841, 0.266515,
51  0.401776, 0.531394, 0.635031, 0.693147 };
52 
53 const float DbAlgorithm::htab[8] = {0.0, 11.0, 20.0, 32.0, 47.0, 51.0, 71.0, 84.852};
54 const float DbAlgorithm::ttab[8] = {288.15, 216.65, 216.65, 228.65, 270.65,
55  270.65, 214.65, 186.946};
56 const float DbAlgorithm::ptab[8] = {1.0, 2.233611E-1, 5.403295E-2, 8.5666784E-3,
57  1.0945601E-3, 6.6063531E-4, 3.9046834E-5, 3.68501E-6};
58 const float DbAlgorithm::gtab[8] = {-6.5, 0.0, 1.0, 2.8, 0.0, -2.8, -2.0, 0.0};
59 
60 
61 /**************************************************************************
62  * NAME: DbAlgorithm()
63  *
64  * DESCRIPTION: Class Constructor
65  *
66  *************************************************************************/
67 
69 }
70 
71 /**************************************************************************
72 *NAME: ~DbAlgorithm()
73  *
74 *DESCRIPTION: Class Destructor
75  *
76  *************************************************************************/
77 
79 }
80 
81 /**************************************************************************
82 *NAME: initialize()
83  *
84 *DESCRIPTION: Virtual function initializes data and object classes for
85 *process operations.
86  *
87  *************************************************************************/
88 
89 int DbAlgorithm::initialize( map<string, ddata*> imap ) {
90  int status = DTDB_SUCCESS;
91 
92  lines_ = static_cast<ddval<int>*>(imap["num_lines"])->val;
93  pixels_ = static_cast<ddval<int>*>(imap["num_pixels"])->val;
94  month_ = static_cast<ddval<int>*>(imap["start_month"])->val;
95  bgascorrect_ = static_cast<ddval<bool>*>(imap["bgascorrect"])->val;
96  bglintmask_ = static_cast<ddval<bool>*>(imap["bglintmask"])->val;
97  bcloudmask_ = static_cast<ddval<bool>*>(imap["bcloudmask"])->val;
98  btest_ = false;
99 
100  status = initialize_LUT_data( imap );
101  if (status != DTDB_SUCCESS) {
102  std::cerr << "DtProcess:: LUT initialization failure" << std::endl;
103  }
104 
105  return status;
106 }
107 
108 /**************************************************************************
109 *NAME: initialize_LUT_data()
110  *
111 *DESCRIPTION: Read deep blue LUTs for land.
112  *
113  *************************************************************************/
114 
115 int DbAlgorithm::initialize_LUT_data( map<string, ddata*> imap ) {
116  int status = DTDB_SUCCESS;
117 
118  size_t num_lines = (size_t) static_cast<ddval<int>*>(imap["num_lines"])->val;
119  size_t num_pixels = (size_t) static_cast<ddval<int>*>(imap["num_pixels"])->val;
120  ddma<float,2>* plat = static_cast<ddma<float,2>*>(imap["latitude"]);
121  ddma<float,2>* plon = static_cast<ddma<float,2>*>(imap["longitude"]);
122  dateline_ = 0;
123  float eastedge = DFILL_FLOAT;
124  float westedge = DFILL_FLOAT;
125  float minlat = 90.0;
126  float maxlat = -90.0;
127  float minlon = 180.0;
128  float maxlon = -180.0;
129  for (size_t i = 0; i < num_lines; i++) {
130  for (size_t j = 0; j < num_pixels; j++) {
131  float lat = plat->pts[i][j];
132  float lon = plon->pts[i][j];
133  if (lat < DFILL_TEST || lon < DFILL_TEST)
134  continue;
135  minlat = (lat < minlat) ? lat : minlat;
136  maxlat = (lat > maxlat) ? lat : maxlat;
137  minlon = (lon < minlon) ? lon : minlon;
138  maxlon = (lon > maxlon) ? lon : maxlon;
139  }
140  }
141  if (minlon < -175.0 && maxlon > 175.0) {
142  eastedge = 180.0;
143  westedge = -180.0;
144  for (size_t i = 0; i < num_lines; i++) {
145  for (size_t j = 0; j < num_pixels; j++) {
146  float lon = plon->pts[i][j];
147  if (lon <= DFILL_TEST)
148  continue;
149  if (lon > 0.0 && lon < eastedge)
150  eastedge = lon;
151  if (lon < 0.0 && lon > westedge)
152  westedge = lon;
153  }
154  }
155  ler_start_[0] = 10*(180 + floor(eastedge) - 1);
156  if (ler_start_[0] < 0) {
157  ler_start_[0] = 0;
158  }
159  dateline_ = 3600 - ler_start_[0];
160  ler_edge_[0] = 10*(180 + (floor(westedge) + 2)) + dateline_;
161  } else {
162  ler_start_[0] = 10*(180 + (floor(minlon) - 1));
163  if (ler_start_[0] < 0) {
164  ler_start_[0] = 0;
165  }
166  ler_edge_[0] = 10*(180 + (floor(maxlon) + 2)) - ler_start_[0];
167  if (ler_edge_[0] + ler_start_[0] > 3600) {
168  ler_edge_[0] = 3600 - ler_start_[0];
169  }
170  }
171  ler_start_[1] = 10*(90 + (floor(minlat) - 1));
172  if (ler_start_[1] < 0) {
173  ler_start_[1] = 0;
174  }
175  ler_edge_[1] = 10*(90 + (floor(maxlat) + 2)) - ler_start_[1];
176  if (ler_edge_[1] + ler_start_[1] > 1800) {
177  ler_edge_[1] = 1800 - ler_start_[1];
178  }
179 
180  return status;
181 }
182 
183 /**************************************************************************
184 *NAME: process()
185  *
186 *DESCRIPTION: Virtual function executes process algorithm.
187  *
188  *************************************************************************/
189 
190 map<string, ddata*> DbAlgorithm::process(vector<size_t> start, vector<size_t> count,
191  map<string, ddata*> imap)
192 {
193  map<string, ddata*> omap;
194  int status = DTDB_SUCCESS;
195  ddval<int>* pstat = new ddval<int>(dtype::INT, status);
196  omap.insert({"status", pstat});
197  return omap;
198 }
199 
200 /**************************************************************************
201  * NAME: locate()
202  *
203  * DESCRIPTION: Perform a binary search of array xx for j such
204  * that x lies between y[j) and y[j+1).
205  * See Numerical Recipes in Fortran, Second Edition, p.110
206  * Returns values:
207  * 0 if y[1] > x and size(xx) if y[size(xx)] < x
208  * -1, 1 if x < y[1] or x > y[size(xx)] respectively.
209  *
210  *************************************************************************/
211 
212 int DbAlgorithm::locate( int size, float y[], float x, int& status)
213 {
214 // -- start binary search.
215  int jl = 0;
216  int ju = size;
217  while (ju-jl > 1) {
218  int jm = (ju + jl) / 2;
219  if (x >= y[jm]) {
220  jl = jm;
221  } else {
222  ju = jm;
223  }
224  }
225 // -- check endpoint equality, otherwise use jl from above.
226  int j = 0;
227  if (x == y[0]) {
228  j = 0;
229  } else if (x == y[size-1]) {
230  j = size-2;
231  } else {
232  j = jl;
233  }
234 // -- set status, indicate success or appropriate failure condition.
235  status = 0;
236  if (j >= size-1) status = 1;
237  if (j < 0) status = -1;
238 
239  return j;
240 }
241 
242 /**************************************************************************
243  * NAME: compute_gas_correction()
244  *
245  * DESCRIPTION: Calculate gas correction factors for each band for VIIRS.
246  * SZA and VZA are in degrees. ozone is in atm/cm, water vapor should be in
247  * cm, and surface pressure should be in atms.
248  * good status = 0, bad status = -1.
249  * Coefficients from Dr. Sayer's IDL script, viirs_new_gas_correctoin.pro.
250  * Derived from gas correction expressions from paper by Dr. Robert Levy:
251  * "The Collection 6 MODIS aerosol products over land and ocean"
252  * http://www.atmos-meas-tech.net/6/2989/2013/amt-6-2989-20 *.html
253  *
254  * Water vapor reduced by half below based on Tanre paper:
255  * D. Tanre, B. N. Holben and Y. J. Kaufman, "Atmospheric correction against
256  * algorithm for NOAA-AVHRR products: theory and application," in IEEE
257  * Transactions on Geoscience and Remote Sensing, vol. 30, no. 2, pp. 231-248, Mar 1992.
258  * doi: 10.1109/36.134074
259 
260  *************************************************************************/
261 
263  int status = DTDB_SUCCESS;
264 
265  float xvza = senz_;
266  float xsza = solz_;
267  float xwv = pwv_/2.0;
268  float xoz = oz_;
269  float xsp = ps_/1013.25; // convert to standard atmosphere
270 // float sigma = 0.0;
271 // float theta = 0.0;
272 // compute_pressure(height_, sigma, xsp, theta);
273  float amf_coeffs[4];
274  float amf_oz; // air mass factors for ozone
275  float amf_wv; // water vapor, and constant
276  float amf_cs; // species.
277  float trans_oz; // ozone transmittance
278  float trans_wv; // water vapor transmittance
279  float trans_cs; // constant species transmittance
280  float mu;
281 
282  float oz_coeffs[NTWL][2] = {{-3.09E-07, 4.71E-07},
283  {-5.72E-05, 2.99E-06,},
284  {-1.25E-04, 1.98E-05},
285  {-4.75E-05, 9.08E-05},
286  {-4.79E-05, 4.37E-05},
287  {4.18E-07, 2.24E-06},
288  {1.19E-07, 5.17E-26},
289  {0.0, 0.0},
290  {1.19E-07, 1.03E-25},
291  {-2.61E-08, 3.28E-09}};
292 
293  float wv_coeffs[NTWL][3] = {{-9.61E+00, 9.16E-01, -2.01E-02},
294  {-8.52E+00, 9.90E-01, -1.49E-03},
295  {-9.65E+00, 9.87E-01, 1.80E-04},
296  {-7.50E+00, 9.84E-01, -3.87E-03},
297  {-7.69E+00, 9.95E-01, -1.10E-02},
298  {-6.05E+00, 9.65E-01, -1.53E-02},
299  {-5.16E+00, 9.59E-01, -2.67E-02},
300  {0.0, 0.0, 0.0},
301  {-6.43E+00, 1.02E+00, -3.60E-03},
302  {-5.85E+00, 1.28E+00, -5.04E-03}};
303 
304  float cs_coeffs[NTWL] = {2.47E-04, 3.77E-04, 1.84E-03, 8.34E-04,
305  1.44E-03, 2.45E-05, 1.19E-02, 0.0, 2.13E-02, 5.32E-02};
306 // -- calculate tranmittance correction factor for VZA
307 // ---------------------------------------------------
308  for (int ib=0; ib<NTWL; ib++) {
309  if (ib == 7) { // DB uses M09, but this table does not
310  gasc_[ib] = 1;
311  continue;
312  }
313  mu = cos(xvza*DEGtoRAD);
314 // -- calculate ozone air mass factor and transmittance correction factor
315  amf_coeffs[0] = 268.45;
316  amf_coeffs[1] = 0.5;
317  amf_coeffs[2] = 115.42;
318  amf_coeffs[3] = -3.2922;
319  amf_oz = mu + amf_coeffs[0] * (pow(xvza, amf_coeffs[1]) *
320  pow((amf_coeffs[2]-xvza),amf_coeffs[3]));
321  amf_oz = 1.0 / amf_oz;
322  trans_oz = exp(oz_coeffs[ib][0] + oz_coeffs[ib][1]*amf_oz*xoz);
323 // -- calculate water vapor air mass factor
324  amf_coeffs[0] = 0.0311;
325  amf_coeffs[1] = 0.1;
326  amf_coeffs[2] = 92.471;
327  amf_coeffs[3] = -1.3814;
328  amf_wv = mu + amf_coeffs[0] * (pow(xvza,amf_coeffs[1]) *
329  pow((amf_coeffs[2]-xvza),amf_coeffs[3]));
330  amf_wv = 1.0 / amf_wv;
331  trans_wv = exp(exp(wv_coeffs[ib][0] + wv_coeffs[ib][1]*log(amf_wv*xwv) +
332  wv_coeffs[ib][2]*pow(log(amf_wv*xwv),2)));
333 // -- calculate constant species air mass factor
334  amf_coeffs[0] = 0.4567;
335  amf_coeffs[1] = 0.07;
336  amf_coeffs[2] = 96.484;
337  amf_coeffs[3] = -1.697;
338  amf_cs = mu + amf_coeffs[0] * (pow(xvza,amf_coeffs[1]) *
339  pow((amf_coeffs[2]-xvza),amf_coeffs[3]));
340  amf_cs = 1.0 / amf_cs;
341  trans_cs = exp(cs_coeffs[ib] * amf_cs * xsp);
342  gasc_[ib] = trans_oz * trans_wv * trans_cs;
343 // -- calculate tranmittance correction factor for SZA
344 // ---------------------------------------------------
345 // -- calculate ozone air mass factor and transmittance correction factor
346  mu = cos(xsza*DEGtoRAD);
347  amf_coeffs[0] = 268.45;
348  amf_coeffs[1] = 0.5;
349  amf_coeffs[2] = 115.42;
350  amf_coeffs[3] = -3.2922;
351  amf_oz = mu + amf_coeffs[0] * (pow(xsza,amf_coeffs[1]) *
352  pow((amf_coeffs[2]-xsza),amf_coeffs[3]));
353  amf_oz = 1.0 / amf_oz;
354  trans_oz = exp(oz_coeffs[ib][0]+oz_coeffs[ib][1]*amf_oz*xoz);
355 // -- calculate water vapor air mass factor
356  amf_coeffs[0] = 0.0311;
357  amf_coeffs[1] = 0.1;
358  amf_coeffs[2] = 92.471;
359  amf_coeffs[3] = -1.3814;
360  amf_wv = mu + amf_coeffs[0] * (pow(xsza,amf_coeffs[1]) *
361  pow((amf_coeffs[2]-xsza),amf_coeffs[3]));
362  amf_wv = 1.0 / amf_wv;
363  trans_wv = exp(exp(wv_coeffs[ib][0] + wv_coeffs[ib][1]*log(amf_wv*xwv) +
364  wv_coeffs[ib][2]*pow(log(amf_wv*xwv),2)));
365 // -- calculate constant species air mass factor
366  amf_coeffs[0] = 0.4567;
367  amf_coeffs[1] = 0.07;
368  amf_coeffs[2] = 96.484;
369  amf_coeffs[3] = -1.697;
370  amf_cs = mu + amf_coeffs[0] * (pow(xsza,amf_coeffs[1]) *
371  pow((amf_coeffs[2]-xsza),amf_coeffs[3]));
372  amf_cs = 1.0 / amf_cs;
373  trans_cs = exp(cs_coeffs[ib] * amf_cs * xsp);
374  gasc_[ib] = gasc_[ib] * trans_oz * trans_wv * trans_cs;
375  }
376 
377  return status;
378 }
379 
380 /**************************************************************************
381 * NAME: compute_pressure()
382 *
383 * DESCRIPTION: Compute the properties of the 1976 standard atmosphere to 86 km.
384 * AUTHOR - Ralph Carmichael, Public Domain Aeronautical Software
385 * NOTE - If alt > 86, the values returned will not be correct, but they will
386 * not be too far removed from the correct values for density.
387 * The reference document does not use the terms pressure and temperature
388 * above 86 km.
389 *
390 * alt(in) = geometric altitude, km.
391 * sigma(out) = density/sea-level standard density
392 * ps(out) = pressure/sea-level standard pressure
393 * theta(out) = temperature/sea-level standard temperature
394 *
395  *************************************************************************/
396 int DbAlgorithm::compute_pressure (float height, float& sigma,
397  float& ps, float& theta)
398 {
399  int status = DTDB_SUCCESS;
400 
401  const float REARTH = 6369.0; // radius of the Earth (km)
402  const float GMR = 34.163195; // hydrostatic constant
403  const int NTAB=8 ; // number of entries in the defining tables
404 
405  float h = 0.0; // geopotential altitude (km)
406  float tgrad = 0.0; // temperature gradient and base temp of this layer
407  float tbase = 0.0; // temperature gradient and base temp of this layer
408  float tlocal = 0.0; // local temperature
409  float deltah = 0.0; // height above base of this layer
410 //============================================================================
411 // ( 1 9 7 6 S T D. A T M O S P H E R E ) |
412 //============================================================================
413  float htab[NTAB] = {0.0, 11.0, 20.0, 32.0, 47.0, 51.0, 71.0, 84.852};
414  float ttab[NTAB] = {288.15, 216.65, 216.65, 228.65, 270.65,
415  270.65, 214.65, 186.946};
416  float ptab[NTAB] = {1.0, 2.233611E-1, 5.403295E-2, 8.5666784E-3,
417  1.0945601E-3, 6.6063531E-4, 3.9046834E-5, 3.68501E-6};
418  float gtab[NTAB] = {-6.5, 0.0, 1.0, 2.8, 0.0, -2.8, -2.0, 0.0};
419 
420  float alt = height/1000;
421  h=alt*REARTH/(alt+REARTH); // convert geometric to geopotential altitude
422 
423  int ip = 0;
424  do {
425  ip++;
426  } while (h > htab[ip] && ip < NTAB);
427  ip--;
428 
429 // temperature ratio
430  tgrad=gtab[ip];
431  tbase=ttab[ip];
432  deltah=h-htab[ip];
433  tlocal=tbase+tgrad*deltah;
434  theta=tlocal/ttab[0];
435 // pressure ratio
436  if (tgrad == 0.0) {
437  ps=ptab[ip]*exp(-GMR*deltah/tbase);
438  } else {
439  ps=ptab[ip]*pow((tbase/tlocal),(GMR/tgrad));
440  }
441 // density ratio
442  sigma=ps/theta;
443 
444  return status;
445 }
446 
447 /**************************************************************************
448  * NAME: compute_glint_angle()
449  *
450  * DESCRIPTION: Compute the glint angle
451  *
452  *************************************************************************/
453 
454 int DbAlgorithm::compute_glint_angle(float& glint_angle)
455 {
456  int status = DTDB_SUCCESS;
457 
458  glint_angle = 0.0;
459  if((solz_> 0.0) && (senz_> 0.0) && (raa_> 0.0)) {
460  glint_angle = cos(solz_*DEGtoRAD)*cos(senz_*DEGtoRAD)
461  + sin(solz_*DEGtoRAD)*sin(senz_*DEGtoRAD)*cos(raa_*DEGtoRAD);
462  glint_angle = acos(glint_angle)*RADtoDEG;
463  }
464 
465  double cc = DEGtoRAD;
466  float nr = 1.341;
467 
468  double zx = (sin(senz_*cc)*sin(raa_*cc))/
469  (cos(solz_*cc)+cos(senz_*cc));
470  double zy = (sin(solz_*cc)-sin(senz_*cc)*cos(raa_*cc))/
471  (cos(solz_*cc)+cos(senz_*cc));
472  double sigx = sqrt(0.003+0.00192*ws_);
473  double sigy = sqrt(0.00316*ws_);
474  double zeta = zx / sigx;
475  double eta = zy / sigy;
476  double p = (1.0/(2.0*M_PI*sigx*sigy))*exp(-0.5*(zeta*zeta + eta*eta));
477  double costwoomega = cos(senz_*cc)*cos(solz_*cc) -
478  sin(senz_*cc)*sin(solz_*cc)*cos(raa_*cc);
479  double cosbeta = (cos(solz_*cc)+cos(senz_*cc))/
480  (sqrt(2.0 + 2.0*costwoomega));
481  double w = 0.5 * acos(costwoomega);
482  double wp = asin(sin(w)/nr);
483  double a1 = sin(w - wp);
484  double b1 = sin(w+wp);
485  double c1 = tan(w-wp);
486  double d1 = tan(w+wp);
487  double R = 0.5*((a1*a1)/(b1*b1)+(c1*c1)/(d1*d1));
488  glint_refl_ = p*R/(4*cos(senz_*cc)*pow(cosbeta,4.0));
489 
490  return status;
491 }
492 
493 /**************************************************************************
494  * NAME: compute_scatter_angle()
495  *
496  * DESCRIPTION: Compute land scatter angle.
497  *
498  *************************************************************************/
499 
501 {
502  int status = DTDB_SUCCESS;
503 
504  scatter_angle = -cos(solz_*DEGtoRAD)*cos(senz_*DEGtoRAD)
505  +sin(solz_*DEGtoRAD)*sin(senz_*DEGtoRAD)*cos(raa_*DEGtoRAD);
506  scatter_angle = acos(scatter_angle)*RADtoDEG;
507 
508  return status;
509 }
510 
int initialize_LUT_data(map< string, ddata * > imap)
int j
Definition: decode_rs.h:73
int compute_scatter_angle(float &scat_angle)
int status
Definition: l1_czcs_hdf.c:32
static const float ttab[8]
Definition: DbAlgorithm.h:84
constexpr float DFILL_TEST
Definition: DDataset.hpp:26
boost::multi_array< T, ndim > pts
Definition: DDataset.hpp:324
static const float htab[8]
Definition: DbAlgorithm.h:83
float mu
float h[MODELMAX]
Definition: atrem_corl1.h:131
float * lat
int locate(int size, float y[], float x, int &status)
#define NTAB
Definition: cdom_morel.c:3
int compute_glint_angle(float &glint_angle)
static const float gtab[8]
Definition: DbAlgorithm.h:86
virtual ~DbAlgorithm()
Definition: DbAlgorithm.cpp:78
#define M_PI
Definition: pml_iop.h:15
constexpr float DFILL_FLOAT
Definition: DDataset.hpp:25
instead the metadata field ProcessingEnvinronment is filled in from the output of a call to the POSIX compliant function uname from within the L1B code A small bug in L1B_Tables an incorrect comparison of RVS coefficients for TEBs to RVS coefficients for RSBs was being made This was replaced with a comparison between TEB coefficients This error never resulted in an incorrect RVS correction but did lead to recalculating the coefficients for each detector in a thermal band even if the coefficients were the same for all detectors To reduce to overall size of the reflective LUT HDF fill values were eliminated from all LUTs previously dimensioned where and where NUM_TIMES is the number of time dependent table pieces In Preprocess a small error where the trailing dropped scan counter was incremented when the leading dropped scan counter should have been was fixed This counter is internal only and is not yet used for any chiefly to casting of were added to make it LINUX compatible Output of code run on LINUX machines displays differences of at most scaled sector incalculable values of the Emissive calibration factor b1
Definition: HISTORY.txt:576
int compute_gas_correction()
static const float xzlog[10]
Definition: DbAlgorithm.h:81
@ INT
signed 4 byte integer
float * lon
virtual int initialize(map< string, ddata * > imap)
Definition: DbAlgorithm.cpp:89
#define R
Definition: make_L3_v1.1.c:96
real, dimension(:,:), allocatable scatter_angle
int compute_pressure(float height, float &sigma, float &ps, float &theta)
virtual map< string, ddata * > process(vector< size_t > start, vector< size_t > count, map< string, ddata * > imap)
int i
Definition: decode_rs.h:71
msiBandIdx val
Definition: l1c_msi.cpp:34
static const float xlog[8]
Definition: DbAlgorithm.h:82
static const float ptab[8]
Definition: DbAlgorithm.h:85
float p[MODELMAX]
Definition: atrem_corl1.h:131
int count
Definition: decode_rs.h:79