OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
DtLutNetcdf.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * NAME: DtLutNetcdf.cpp
3  *
4  * DESCRIPTION: Object class that generates a netCDF4 LUT for NASA Dark Target
5  * aerosols algorithm
6  *
7  * Created on: April 25, 2017
8  * Author: Sam Anderson
9  *
10  *
11  ******************************************************************************/
12 
13 #include "darktarget/DtLutNetcdf.h"
14 
15 #include <string>
16 #include <sstream>
17 #include <fstream>
18 #include <iostream>
19 #include <mfhdf.h>
20 #include <libgen.h>
21 
22 #include <DDProcess.h>
23 #include <DDOptions.h>
24 
25 /**************************************************************************
26  * NAME: DtLutNetcdf()
27  *
28  * DESCRIPTION: Class Constructor
29  *
30  *************************************************************************/
31 
33 }
34 
35 /**************************************************************************
36  * NAME: ~DtLutNetcdf()
37  *
38  * DESCRIPTION: Class Destructor
39  *
40  *************************************************************************/
41 
43 }
44 
45 /**************************************************************************
46  * NAME: initialize()
47  *
48  * DESCRIPTION: Initializes data and object classes for granule
49  *
50  *************************************************************************/
51 
53  return DTDB_SUCCESS;
54 }
55 
56 
57 /**************************************************************************
58  * NAME: create_dt_nc4_lut()
59  *
60  * DESCRIPTION: Create dark target aerosol netCDF4 LUT.
61  *
62  *************************************************************************/
63 
65 
66  int status = DTDB_SUCCESS;
67  int istatus = DTDB_SUCCESS;
68  int num_good = 0;
69 
71  string filepath = path + "/VIIRS_DARKTARGET_LUT_" + "version_source" + ".nc";
72 
73  NcFile* nc_output;
74 
75  try {
76  nc_output = new NcFile( filepath, NcFile::replace );
77  }
78  catch( NcException& e) {
79  e.what();
80  cerr << "DtLutNetcdf:: Failure creating granule netCDF4 LUT file: " + filepath + "." << endl;
81  return DTDB_FAIL;
82  }
83 
84  nc_output->putAtt( "title", "VIIRS DARKTARGET LUTs" );
85 
86  write_global_attributes( nc_output );
87 
88 // Read input files and create LUTs
89 
91  istatus = read_gas_correction_file( gc_lut );
92  if ( istatus != DTDB_SUCCESS ) {
93  cerr << "DtLutNetcdf:: Failure reading Gas Correction file " << endl;
94  status = istatus;
95  }
96  istatus = write_gas_correction_lut( nc_output, gc_lut );
97  if ( istatus != DTDB_SUCCESS ) {
98  cerr << "DtLutNetcdf:: Failure writing Gas Correction file to netCDF4 LUT file " << endl;
99  status = istatus;
100  }
101  delete gc_lut;
102  if (istatus == DTDB_SUCCESS) {
103  num_good++;
104  cerr << "DtLutNetcdf:: Created " + LUT_GAS_CORRECTION << endl;
105  }
106 
107  dtLandAerosolLUT* la_lut = new dtLandAerosolLUT;
108  istatus = read_land_aerosol_file( INPUT_LAND_W0466, 0, la_lut );
109  if ( istatus != DTDB_SUCCESS ) {
110  cerr << "DtLutNetcdf:: Failure reading land aerosol file " << endl;
111  status = istatus;
112  }
113  istatus = read_land_aerosol_file( INPUT_LAND_W0554, 1, la_lut );
114  if ( istatus != DTDB_SUCCESS ) {
115  cerr << "DtLutNetcdf:: Failure reading land aerosol file " << endl;
116  status = istatus;
117  }
118  istatus = read_land_aerosol_file( INPUT_LAND_W0645, 2, la_lut );
119  if ( istatus != DTDB_SUCCESS ) {
120  cerr << "DtLutNetcdf:: Failure reading land aerosol file " << endl;
121  status = istatus;
122  }
123  istatus = read_land_aerosol_file( INPUT_LAND_W2113, 3, la_lut );
124  if ( istatus != DTDB_SUCCESS ) {
125  cerr << "DtLutNetcdf:: Failure reading land aerosol file " << endl;
126  status = istatus;
127  }
128  istatus = read_land_aerosol_map( INPUT_LAND_MAP, la_lut );
129  if ( istatus != DTDB_SUCCESS ) {
130  cerr << "DtLutNetcdf:: Failure reading land aerosol map file " << endl;
131  status = istatus;
132  }
133  istatus = write_land_aerosol_lut( nc_output, la_lut );
134  if ( istatus != DTDB_SUCCESS ) {
135  cerr << "DtLutNetcdf:: Failure writing land aerosol file to netCDF4 LUT file " << endl;
136  status = istatus;
137  }
138  delete la_lut;
139  if (istatus == DTDB_SUCCESS) {
140  num_good++;
141  cerr << "DtLutNetcdf:: Created " + LUT_LAND_AEROSOL << endl;
142  }
143 
144  dtOceanAerosolLUT* oa_lut = new dtOceanAerosolLUT;
145  istatus = read_ocean_small_aerosol_file( INPUT_OCEAN_SMALL1, 0, oa_lut );
146  if ( istatus != DTDB_SUCCESS ) {
147  cerr << "DtLutNetcdf:: Failure reading ocean small aerosol file " << endl;
148  status = istatus;
149  }
150  istatus = read_ocean_small_aerosol_file( INPUT_OCEAN_SMALL2, 1, oa_lut );
151  if ( istatus != DTDB_SUCCESS ) {
152  cerr << "DtLutNetcdf:: Failure reading ocean small aerosol file " << endl;
153  status = istatus;
154  }
155  istatus = read_ocean_small_aerosol_file( INPUT_OCEAN_SMALL3, 2, oa_lut );
156  if ( istatus != DTDB_SUCCESS ) {
157  cerr << "DtLutNetcdf:: Failure reading ocean small aerosol file " << endl;
158  status = istatus;
159  }
160  istatus = read_ocean_small_aerosol_file( INPUT_OCEAN_SMALL4, 3, oa_lut );
161  if ( istatus != DTDB_SUCCESS ) {
162  cerr << "DtLutNetcdf:: Failure reading ocean small aerosol file " << endl;
163  status = istatus;
164  }
165 
166  istatus = read_ocean_big_aerosol_file( INPUT_OCEAN_BIG1, 0, oa_lut );
167  if ( istatus != DTDB_SUCCESS ) {
168  cerr << "DtLutNetcdf:: Failure reading ocean big aerosol file " << endl;
169  status = istatus;
170  }
171  istatus = read_ocean_big_aerosol_file( INPUT_OCEAN_BIG2, 1, oa_lut );
172  if ( istatus != DTDB_SUCCESS ) {
173  cerr << "DtLutNetcdf:: Failure reading ocean big aerosol file " << endl;
174  status = istatus;
175  }
176  istatus = read_ocean_big_aerosol_file( INPUT_OCEAN_BIG3, 2, oa_lut );
177  if ( istatus != DTDB_SUCCESS ) {
178  cerr << "DtLutNetcdf:: Failure reading ocean big aerosol file " << endl;
179  status = istatus;
180  }
181  istatus = read_ocean_big_aerosol_file( INPUT_OCEAN_BIG4, 3, oa_lut );
182  if ( istatus != DTDB_SUCCESS ) {
183  cerr << "DtLutNetcdf:: Failure reading ocean big aerosol file " << endl;
184  status = istatus;
185  }
186  istatus = write_ocean_aerosol_lut( nc_output, oa_lut );
187  if ( istatus != DTDB_SUCCESS ) {
188  cerr << "DtLutNetcdf:: Failure writing ocean big aerosol file to netCDF4 LUT file " << endl;
189  status = istatus;
190  }
191  delete oa_lut;
192  if (istatus == DTDB_SUCCESS) {
193  num_good++;
194  cerr << "DtLutNetcdf:: Created " + LUT_OCEAN_AEROSOL << endl;
195  }
196 
197  dtWaterVaporLUT* wv_lut = new dtWaterVaporLUT;
198  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_1, 1, wv_lut );
199  if ( istatus != DTDB_SUCCESS ) {
200  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
201  status = istatus;
202  }
203 
204  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_2, 2, wv_lut );
205  if ( istatus != DTDB_SUCCESS ) {
206  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
207  status = istatus;
208  }
209 
210  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_3, 3, wv_lut );
211  if ( istatus != DTDB_SUCCESS ) {
212  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
213  status = istatus;
214  }
215 
216  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_4, 4, wv_lut );
217  if ( istatus != DTDB_SUCCESS ) {
218  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
219  status = istatus;
220  }
221 
222  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_5, 5, wv_lut );
223  if ( istatus != DTDB_SUCCESS ) {
224  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
225  status = istatus;
226  }
227 
228  istatus = read_transm_h2o_file( INPUT_TRANSM_H2O_6, 6, wv_lut );
229  if ( istatus != DTDB_SUCCESS ) {
230  cerr << "DtLutNetcdf:: Failure reading Transmission H20 file " << endl;
231  status = istatus;
232  }
233 /*
234  istatus = read_weight_table_file( INPUT_WEIGHT_TABLE, wv_lut );
235  if ( istatus != DTDB_SUCCESS ) {
236  cerr << "DtLutNetcdf:: Failure reading weight table file " << endl;
237  status = istatus;
238  }
239 
240  istatus = read_ch2_reflectance_file( INPUT_REFL_CH2, wv_lut );
241  if ( istatus != DTDB_SUCCESS ) {
242  cerr << "DtLutNetcdf:: Failure reading CH2 reflectance file " << endl;
243  status = istatus;
244  }
245 
246  istatus = read_ch19_to_ch2_ratio_file( INPUT_RATIO_CH19_TO_CH2, wv_lut );
247  if ( istatus != DTDB_SUCCESS ) {
248  cerr << "DtLutNetcdf:: Failure reading ch19_to_ch2_ratio file " << endl;
249  status = istatus;
250  }
251 */
252  istatus = write_water_vapor_lut( nc_output, wv_lut );
253  if ( istatus != DTDB_SUCCESS ) {
254  cerr << "DtLutNetcdf:: Failure writing Water Vapor files to netCDF4 LUT file " << endl;
255  status = istatus;
256  }
257  delete wv_lut;
258  if (istatus == DTDB_SUCCESS) {
259  num_good++;
260  cerr << "DtLutNetcdf:: Created " + LUT_WATER_VAPOR << endl;
261  }
262 
263  delete nc_output;
264 
265  return status;
266 }
267 
268 /**************************************************************************
269  * NAME: read_grib_lut()
270  *
271  * DESCRIPTION: Read darktarget GRIB LUT.
272  *
273  *************************************************************************/
274 
276 {
277  int status = DTDB_SUCCESS;
278 
279  string filepath = get_option(INPUT_GRIB);
280  if(! filepath.empty()) {
281  if (!Hishdf(filepath.c_str())) {
282  status = read_grib_bin( filepath, &gc_lut );
283  if (status != DTDB_SUCCESS) {
284  cerr << "DtLutNetcdf::read_grib_lut(): " <<
285  "Failure reading GRIB binary ancillary file." << endl;
286  return status;
287  }
288  }
289  else {
290  status = read_grib_hdf( filepath, &gc_lut );
291  if (status != DTDB_SUCCESS) {
292  cerr << "DtLutNetcdf::read_grib_lut(): " <<
293  "Failure reading GRIB hdf4 ancillary file." << endl;
294  return status;
295  }
296  string filepath = get_option(INPUT_OZONE);
297  if(! filepath.empty()) {
298  status = read_ozone( filepath, &gc_lut );
299  if (status != DTDB_SUCCESS) {
300  cerr << "DtLutNetcdf::read_ozone(): " <<
301  "Failure reading hdf4 ozone ancillary file." << endl;
302  return status;
303  }
304  }
305  else {
306  cerr << "DtLutNetcdf::read_grib_lut(): " <<
307  "Failure obtaining GRIB ozone input file path." << endl;
308  return DTDB_FAIL;
309  }
310  }
311  }
312  else {
313  cerr << "DtLutNetcdf::read_grib_lut(): " <<
314  "Failure obtaining GRIB input file path." << endl;
315  return DTDB_FAIL;
316  }
317 
318  return status;
319 }
320 
321 /**************************************************************************
322  * NAME: read_grib_bin()
323  *
324  * DESCRIPTION: Read GRIB binary file.
325  *
326  *************************************************************************/
327 
328 int DtLutNetcdf::read_grib_bin( const string filepath, dtGribLUT* grib_lut )
329 {
330  int status = DTDB_SUCCESS;
331 
332  GDAS* gdas = new GDAS;
333  bool isFileBigEndian = false;
334  std::ifstream fin(filepath.c_str(), std::ios::in | std::ios::binary);
335  if(fin.is_open()) {
336  fin.read( (char*) gdas->data, GRIB_ARRAY_SIZE);
337  bool good = fin.good();
338  fin.close();
339  if(!good) {
340  cerr << "DtLutNetcdf::read_grib_bin() Error reading LUT data " << INPUT_GRIB << endl;
341  return DTDB_FAIL;
342  }
343  }
344  else {
345  cerr << "DtLutNetcdf::read_grib_bin() Error opening LUT file " << INPUT_GRIB << endl;
346  return DTDB_FAIL;
347  }
348  if ( isPlatformLittleEndian() && isFileBigEndian) {
349  for ( int i=0; i<DATA_BINS; i++) {
350  for ( int j=0; j<LAT_BINS; j++) {
351  for ( int k=0; k<LON_BINS; k++) {
352  byteSwap( gdas->data[i][j][k] );
353  }
354  }
355  }
356  }
357  memcpy(grib_lut->pwat, gdas->data[50], GRIB_ROW_SIZE);
358  memcpy(grib_lut->ugrd, gdas->data[51], GRIB_ROW_SIZE);
359  memcpy(grib_lut->vgrd, gdas->data[52], GRIB_ROW_SIZE);
360  memcpy(grib_lut->ozone, gdas->data[54], GRIB_ROW_SIZE);
361 
362  delete gdas;
363  return status;
364 }
365 
366 /**************************************************************************
367  * NAME: read_grib_hdf()
368  *
369  * DESCRIPTION: Read GRIB HDF file.
370  *
371  *************************************************************************/
372 
373 int DtLutNetcdf::read_grib_hdf( const string filepath, dtGribLUT* grib_lut )
374 {
375  int status = DTDB_SUCCESS;
376 
377  int sdfid = SDstart(filepath.c_str(), DFACC_RDONLY);
378  int vfid = Hopen(filepath.c_str(), DFACC_RDONLY, 0);
379  Vstart(vfid);
380  int vgroup_ref = Vfind(vfid, "Geophysical Data");
381  int vgid = Vattach(vfid, vgroup_ref, "r");
382  int nrefs = Vntagrefs(vgid);
383  int tag[32];
384  int ref[32];
385  Vgettagrefs(vgid, tag, ref, nrefs);
386  for (int iRef=0; iRef<nrefs; iRef++) {
387  if ((tag[iRef]!=DFTAG_NDG) && (tag[iRef]!=DFTAG_SD)) {
388  continue;
389  }
390  int index = SDreftoindex(sdfid, ref[iRef]);
391  int sdsid = SDselect(sdfid, index);
392  int rank = 0;
393  int numtype = 0;
394  int numatt = 0;
395  int dims[2] = {0,0};
396  int start[2] = {0,0};
397  char name[32];
398  SDgetinfo(sdsid, name, &rank, dims, &numtype, &numatt);
399  string sname = string(name);
400  if (sname == "z_wind") {
401  status = SDreaddata(sdsid, start, (int*)NULL, dims, (void*) grib_lut->ugrd);
402  if (status != DTDB_SUCCESS) {
403  cerr << "DtLutNetcdf::read_grib_hdf(): " <<
404  "Failure reading hdf4 z_wind ancillary data." << endl;
405  return status;
406  }
407  }
408  if (sname == "m_wind") {
409  status = SDreaddata(sdsid, start, (int*)NULL, dims, (void*) grib_lut->vgrd);
410  if (status != DTDB_SUCCESS) {
411  cerr << "DtLutNetcdf::read_grib_hdf(): " <<
412  "Failure reading hdf4 m_wind ancillary data." << endl;
413  return status;
414  }
415  }
416  if (sname == "p_water") {
417  status = SDreaddata(sdsid, start, (int*)NULL, dims, (void*) grib_lut->pwat);
418  if (status != DTDB_SUCCESS) {
419  cerr << "DtLutNetcdf::read_grib_hdf(): " <<
420  "Failure reading hdf4 p_water ancillary data." << endl;
421  return status;
422  }
423  }
424  }
425  Vdetach(vgid);
426  Vend (vfid);
427  SDend(sdfid);
428  Hclose (vfid);
429 
430  return status;
431 }
432 
433 /**************************************************************************
434  * NAME: read_ozone()
435  *
436  * DESCRIPTION: Read ozone HDF file.
437  *
438  *************************************************************************/
439 
440 int DtLutNetcdf::read_ozone( const string filepath, dtGribLUT* grib_lut )
441 {
442  int status = DTDB_SUCCESS;
443 
444  int sdfid = SDstart(filepath.c_str(), DFACC_RDONLY);
445  int vfid = Hopen(filepath.c_str(), DFACC_RDONLY, 0);
446  status = Vstart(vfid);
447  int vgroup_ref = Vfind(vfid, "Geophysical Data");
448  int vgid = Vattach(vfid, vgroup_ref, "r");
449  int nrefs = Vntagrefs(vgid);
450  int tag[32];
451  int ref[32];
452  Vgettagrefs(vgid, tag, ref, nrefs);
453  for (int iRef=0; iRef<nrefs; iRef++) {
454  if ((tag[iRef]!=DFTAG_NDG) && (tag[iRef]!=DFTAG_SD)) {
455  continue;
456  }
457  int index = SDreftoindex(sdfid, ref[iRef]);
458  int sdsid = SDselect(sdfid, index);
459  int rank = 0;
460  int numtype = 0;
461  int numatt = 0;
462  int dims[2] = {0,0};
463  int start[2] = {0,0};
464  char name[32];
465  SDgetinfo(sdsid, name, &rank, dims, &numtype, &numatt);
466  string sname = string(name);
467  if (sname == "ozone") {
468  status = SDreaddata(sdsid, start, (int*)NULL, dims, (void*) grib_lut->ozone);
469  if (status != DTDB_SUCCESS) {
470  cerr << "DtLutNetcdf::read_ozone(): " <<
471  "Failure reading hdf4 ozone ancillary data." << endl;
472  return status;
473  }
474  }
475  }
476  Vdetach(vgid);
477  Vend (vfid);
478  SDend(sdfid);
479  Hclose (vfid);
480 
481  return status;
482 }
483 
484 /**************************************************************************
485  * NAME: read_gas_correction_file()
486  *
487  * DESCRIPTION: Read darktarget gas correction LUT.
488  *
489  *************************************************************************/
490 
492 {
493  int status = DTDB_SUCCESS;
494 
495  string filePath = get_option(INPUT_GAS_CORRECTION);
496  if(filePath.empty()) {
497  cerr << "DtGranule::read_gas_correction_file() Invalid path for gas correction file." << endl;
498  return DTDB_FAIL;
499  }
500  ifstream fin(filePath.c_str());
501  if(!fin) {
502  std::cout << "DtGranule::read_gas_correction_file() Error opening gas correction file." << endl;
503  return DTDB_FAIL;
504  }
505  string line;
506  getline(fin, line);
507  int i = 0;
508  while (getline(fin, line)) {
509  stringstream ss(line);
510  ss >> gc_lut->MBAND[i] >> gc_lut->VBAND[i] >> gc_lut->WAVE[i] >> gc_lut->MOL[i] >>
511  gc_lut->OPT_O3_CLIM[i] >> gc_lut->OPT_H2O_CLIM[i] >>
512  gc_lut->OPT_CO2_CLIM[i] >> gc_lut->O3_COEF[i][0] >> gc_lut->O3_COEF[i][1] >>
513  gc_lut->H2O_COEF[i][0] >> gc_lut->H2O_COEF[i][1] >> gc_lut->H2O_COEF[i][2];
514  i++;
515  }
516 
517  return status;
518 }
519 
520 /**************************************************************************
521  * NAME: read_land_aerosol_file()
522  *
523  * DESCRIPTION: Read Land Aerosol LUT.
524  *
525  *************************************************************************/
526 
527 int DtLutNetcdf::read_land_aerosol_file( const string groupname, int wnum,
528  dtLandAerosolLUT* la_lut )
529 {
530  int status = DTDB_SUCCESS;
531 
532  string filePath = get_option(groupname);
533 
534  if(filePath.empty()) {
535  cerr << "DtLutNetcdf::read_aerosol_file() Invalid path for aerosol LUT file." << endl;
536  return DTDB_FAIL;
537  }
538  ifstream fin(filePath.c_str());
539  if(!fin) {
540  std::cout << "DtLutNetcdf::read_aerosol_file() Error opening aerosol LUT file." << endl;
541  return DTDB_FAIL;
542  }
543  string line;
544  string dummy;
545  for (int iTab=0; iTab<NLTABLE; iTab++) {
546 // Reads observation zenith angles(the),and observation azimuth angles
547 // from look-up tables
548  getline(fin, line);
549  stringstream ss(line);
550  ss >> dummy;
551  for (int i=0; i<NLTHE; i++) {
552  ss >> la_lut->THE_NL[i];
553  }
554  getline(fin, line);
555  ss.clear();
556  ss.str(line);
557  ss >> dummy;
558  for (int i=0; i<NLPHI; i++) {
559  ss >> la_lut->PHI_NL[i];
560  }
561 // Reads wavelength(wav),optical thickness(opth),solar zenith angle(thet0),
562 // reflectance ofatmosphere(sbarw) from look-up tables.
563  for (int iTau=0; iTau<NLTAU; iTau++) {
564  getline(fin, line);
565  getline(fin, line);
566  ss.clear();
567  ss.str(line);
568  ss >> dummy >> la_lut->SSA_NL0[iTab][wnum][iTau];
569  ss >> dummy >> la_lut->QEXT_NL0[iTab][wnum][iTau];
570  ss >> dummy >> la_lut->BEXT_NL0[iTab][wnum][iTau];
571  ss >> dummy >> la_lut->VEXT_NL0[iTab][wnum][iTau];
572  ss >> dummy >> la_lut->MEXT_NL0[iTab][wnum][iTau];
573  ss >> dummy >> la_lut->MASSCOEF_NL0[iTab][wnum][iTau];
574  getline(fin, line);
575  ss.clear();
576  ss.str(line);
577  ss >> dummy >> la_lut->WAV_NL[wnum];
578  ss >> dummy >> la_lut->OPTH_NL0[iTab][wnum][iTau];
579  ss >> dummy >> la_lut->ROD[wnum];
580  ss >> dummy >> la_lut->GOD[wnum];
581  for (int iThet0=0; iThet0<NLTHET0; iThet0++) {
582  getline(fin, line);
583  ss.clear();
584  ss.str(line);
585  ss >> dummy >> la_lut->THET0_NL[iThet0];
586  ss >> dummy >> la_lut->MU0_NL[iThet0];
587  ss >> dummy >> la_lut->SBAR_NL0[iTab][wnum][iTau][iThet0];
588  ss >> dummy >> la_lut->Fd_NL0[iTab][wnum][iTau][iThet0];
589 // Reads transmission as a function of observation zenith angle,
590 // optical thickness
591  getline(fin, line);
592  ss.clear();
593  ss.str(line);
594  ss >> dummy;
595  for (int iThe=0; iThe<NLTHE; iThe++) {
596  ss >> la_lut->T_NL0[iTab][wnum][iTau][iThet0][iThe];
597  }
598  getline(fin, line);
599  for (int iThe=0; iThe<NLTHE; iThe++) {
600  getline(fin, line);
601  ss.clear();
602  ss.str(line);
603 // Reads atmospheric radiance (int) as a function of solar zenith angle,
604 // optical thickness, height, observation zenith angle and azimuth angle
605 // from look-up table.
606  for (int iPhi=0; iPhi<NLPHI; iPhi++) {
607  ss >> la_lut->INT_NL0[iTab][wnum][iTau][iThet0][iThe][iPhi];
608  }
609  }
610  }
611  }
612 // Set extinction parameters for "AOD = 0.0" case
613  la_lut->QEXT_NL0[iTab][wnum][0] = la_lut->QEXT_NL0[iTab][wnum][1];
614  la_lut->BEXT_NL0[iTab][wnum][0] = la_lut->BEXT_NL0[iTab][wnum][1];
615  la_lut->VEXT_NL0[iTab][wnum][0] = la_lut->VEXT_NL0[iTab][wnum][1];
616  la_lut->MEXT_NL0[iTab][wnum][0] = la_lut->MEXT_NL0[iTab][wnum][1];
617  la_lut->MASSCOEF_NL0[iTab][wnum][0] = la_lut->MASSCOEF_NL0[iTab][wnum][1];
618  }
619  for (int iTab=0; iTab<NLTABLE; iTab++) {
620  for (int iTau=0; iTau<NLTAU; iTau++) {
621  for (int iWav=0; iWav<NLUTWAV; iWav++) {
622  la_lut->EXTNORM_NL0[iTab][iWav][iTau] =
623  la_lut->QEXT_NL0[iTab][iWav][iTau] /
624  la_lut->QEXT_NL0[iTab][IW550][iTau];
625  }
626  }
627  }
628 
629  return status;
630 }
631 
632 /**************************************************************************
633  * NAME: read_land_aerosol_map()
634  *
635  * DESCRIPTION: Subroutine AEROSOL_MAP reads
636  * the aerosol map (1 degree resolution)
637  * to determine expected aerosol type at
638  * a given location and season
639  *
640  *************************************************************************/
641 
642 int DtLutNetcdf::read_land_aerosol_map( const string groupname,
643  dtLandAerosolLUT* la_lut )
644 {
645  int status = DTDB_SUCCESS;
646 
647  string filePath = get_option(groupname);
648  if(filePath.empty()) {
649  cerr << "DtLutNetcdf::read_aerosol_map() Invalid path for aerosol LUT file." << endl;
650  return DTDB_FAIL;
651  }
652  ifstream fin(filePath.c_str());
653  if(!fin) {
654  std::cout << "DtLutNetcdf::read_aerosol_map() Error opening aerosol LUT file." << endl;
655  return DTDB_FAIL;
656  }
657 
658  string line;
659 
660  for (int iS=0; iS<NUM_SEASONS; iS++) {
661  getline(fin, line);
662  for (int iLat=0; iLat<NUM_LATS; iLat++) {
663  for (int iLon=0; iLon<NUM_LONS-1; iLon++) {
664  getline(fin, line, ',');
665  stringstream ss(line);
666  ss >> la_lut->AEROSOL_ALL[iS][iLat][iLon];
667  }
668  getline(fin, line);
669  stringstream ss(line);
670  ss >> la_lut->AEROSOL_ALL[iS][iLat][NUM_LONS-1];
671  }
672  }
673 
674  return status;
675 }
676 
677 /**************************************************************************
678  * NAME: read_smalll_aerosol_file()
679  *
680  * DESCRIPTION: Read Small Ocean Aerosol LUT.
681  *
682  *************************************************************************/
683 
684 int DtLutNetcdf::read_ocean_small_aerosol_file(const string groupname, int iLut,
685  dtOceanAerosolLUT* oa_lut )
686 {
687  int status = DTDB_SUCCESS;
688 
689  string filePath = get_option(groupname);
690  if(filePath.empty()) {
691  cerr << "DtProcessOcean::read_small_aerosol_file() Invalid path for aerosol LUT file." << endl;
692  return DTDB_FAIL;
693  }
694  ifstream fin(filePath.c_str());
695  if(!fin) {
696  std::cout << "DtProcessOcean::read_small_aerosol_file() Error opening aerosol LUT file." << endl;
697  return DTDB_FAIL;
698  }
699  string line;
700  string aline;
701  string dummy;
702  float TR, QSCT;
703  for (int iWav=0; iWav<NWAV; iWav++) {
704  getline(fin, line);
705  getline(fin, line);
706  stringstream ss(line);
707  ss >> dummy >> oa_lut->WAVE[iWav];
708  getline(fin, line);
709  getline(fin, line);
710  getline(fin, line);
711  getline(fin, line);
712  getline(fin, line);
713  getline(fin, line);
714  ss.clear();
715  ss.str(line);
716  ss >> dummy >> TR;
717  ss >> dummy >> oa_lut->TAUAS[iWav][0][0];
718  getline(fin, line);
719  getline(fin, line);
720  getline(fin, line);
721  getline(fin, line);
722  for (int il=0; il<2; il++) {
723  getline(fin, line);
724  aline += line;
725  }
726  ss.clear();
727  ss.str(aline);
728  ss >> dummy;
729  for (int iTho=0; iTho<NTH0; iTho++) {
730  ss >> oa_lut->THET0[iTho];
731  }
732  getline(fin, line);
733  getline(fin, line);
734  getline(fin, line);
735  getline(fin, line);
736  getline(fin, line);
737  getline(fin, line);
738  getline(fin, line);
739  getline(fin, line);
740  aline.clear();
741  for (int il=0; il<2; il++) {
742  getline(fin, line);
743  aline += line;
744  }
745  ss.clear();
746  ss.str(aline);
747  ss >> dummy;
748  for (int iTho=0; iTho<NTH0; iTho++) {
749  ss >> oa_lut->ALBEDO_R_RAY[iWav][iTho];
750  }
751  aline.clear();
752  for (int il=0; il<2; il++) {
753  getline(fin, line);
754  aline += line;
755  }
756  ss.clear();
757  ss.str(aline);
758  ss >> dummy;
759  for (int iTho=0; iTho<NTH0; iTho++) {
760  ss >> oa_lut->ALBEDO_T_RAY[iWav][iTho];
761  }
762  getline(fin, line);
763  for (int iTho=0; iTho<NTH0; iTho++) {
764  getline(fin, line);
765  aline.clear();
766  for (int il=0; il<3; il++) {
767  getline(fin, line);
768  aline += line;
769  }
770  ss.clear();
771  ss.str(aline);
772  ss >> dummy >> dummy;
773  for (int iTh=0; iTh<NTHET; iTh++) {
774  ss >> oa_lut->THET[iTh];
775  }
776  for (int iPhi=0; iPhi<NPHI; iPhi++) {
777  aline.clear();
778  for (int il=0; il<3; il++) {
779  getline(fin, line);
780  aline += line;
781  }
782  ss.clear();
783  ss.str(aline);
784  ss >> oa_lut->JPHI[iPhi];
785  for (int iTh=0; iTh<NTHET; iTh++) {
786  ss >> oa_lut->REF_RAYALL[iWav][iLut][iTho][iTh][iPhi];
787  }
788  }
789  }
790  }
791  for (int iCase=0; iCase<NUMCASES; iCase++) {
792  for (int iWav=0; iWav<NWAV; iWav++) {
793  for (int iTau=1; iTau<NAOT; iTau++) {
794  getline(fin, line);
795  getline(fin, line);
796  stringstream ss(line);
797  ss >> dummy >> oa_lut->WAVE[iWav];
798  getline(fin, line);
799  getline(fin, line);
800  getline(fin, line);
801  getline(fin, line);
802  ss.clear();
803  ss.str(line);
804  ss >> dummy >> oa_lut->RGSS[iCase] >> dummy >> oa_lut->SIGMAS[iCase];
805  getline(fin, line);
806  getline(fin, line);
807  ss.clear();
808  ss.str(line);
809  ss >> dummy >> oa_lut->EFFRADSMALL[iCase];
810  getline(fin, line);
811  ss.clear();
812  ss.str(line);
813  ss >> dummy >> dummy >> dummy >> oa_lut->MOMENTSSMALL[iCase][0][iLut] >>
814  dummy >> dummy >> dummy >> oa_lut->MOMENTSSMALL[iCase][1][iLut];
815  getline(fin, line);
816  ss.clear();
817  ss.str(line);
818  ss >> dummy >> dummy >> dummy >> oa_lut->MOMENTSSMALL[iCase][2][iLut] >>
819  dummy >> dummy >> dummy >> oa_lut->MOMENTSSMALL[iCase][3][iLut];
820  getline(fin, line);
821  ss.clear();
822  ss.str(line);
823  ss >> dummy >> dummy >> dummy >> oa_lut->ALBEDOSMALL[iWav][iCase][iLut] >>
824  dummy >> dummy >> dummy >> oa_lut->ASSYMSMALL[iWav][iCase][iLut];
825  getline(fin, line);
826  ss.clear();
827  ss.str(line);
828  ss >> dummy >> oa_lut->CCNSMALL[iCase][iLut] >>
829  dummy >> dummy >> dummy >> oa_lut->BACKSCTTSMALL[iWav][iCase][iLut];
830  getline(fin, line);
831  ss.clear();
832  ss.str(line);
833  ss >> dummy >> dummy >> QSCT >>
834  dummy >> dummy >> oa_lut->EXTSMALL[iWav][iCase][iLut];
835  getline(fin, line);
836  getline(fin, line);
837  getline(fin, line);
838  getline(fin, line);
839  getline(fin, line);
840  getline(fin, line);
841  ss.clear();
842  ss.str(line);
843  ss >> dummy >> TR ;
844  ss >> dummy >> oa_lut->TAUAS[iWav][iCase][iTau];
845  getline(fin, line);
846  getline(fin, line);
847  getline(fin, line);
848  getline(fin, line);
849  aline.clear();
850  for (int il=0; il<2; il++) {
851  getline(fin, line);
852  aline += line;
853  }
854  ss.clear();
855  ss.str(aline);
856  ss >> dummy;
857  for (int iTho=0; iTho<NTH0; iTho++) {
858  ss >> oa_lut->THET0[iTho];
859  }
860  getline(fin, line);
861  getline(fin, line);
862  getline(fin, line);
863  getline(fin, line);
864  getline(fin, line);
865  getline(fin, line);
866  getline(fin, line);
867  getline(fin, line);
868  aline.clear();
869  for (int il=0; il<2; il++) {
870  getline(fin, line);
871  aline += line;
872  }
873  ss.clear();
874  ss.str(aline);
875  ss >> dummy;
876  for (int iTho=0; iTho<NTH0; iTho++) {
877  ss >> oa_lut->ALBEDO_R_SMALL[iWav][iCase][iTau][iLut][iTho];
878  }
879  aline.clear();
880  for (int il=0; il<2; il++) {
881  getline(fin, line);
882  aline += line;
883  }
884  ss.clear();
885  ss.str(aline);
886  ss >> dummy;
887  for (int iTho=0; iTho<NTH0; iTho++) {
888  ss >> oa_lut->ALBEDO_T_SMALL[iWav][iCase][iTau][iLut][iTho];
889  }
890  getline(fin, line);
891  for (int iTho=0; iTho<NTH0; iTho++) {
892  getline(fin, line);
893  aline.clear();
894  for (int il=0; il<3; il++) {
895  getline(fin, line);
896  aline += line;
897  }
898  ss.clear();
899  ss.str(aline);
900  ss >> dummy >> dummy;
901  for (int iTh=0; iTh<NTHET; iTh++) {
902  ss >> oa_lut->THET[iTh];
903  }
904  for (int iPhi=0; iPhi<NPHI; iPhi++) {
905  aline.clear();
906  for (int il=0; il<3; il++) {
907  getline(fin, line);
908  aline += line;
909  }
910  ss.clear();
911  ss.str(aline);
912  ss >> oa_lut->JPHI[iPhi];
913  for (int iTh=0; iTh<NTHET; iTh++) {
914  ss >> oa_lut->AINTS[iWav][iCase][iTau][iLut][iTho][iTh][iPhi];
915  }
916  }
917  }
918  }
919 // Fill the array for albedo and transmission for all cases tau=0
920  oa_lut->TAUAS[iWav][iCase][0]=oa_lut->TAUAS[iWav][0][0];
921  for (int iTho=0; iTho<NTH0; iTho++) {
922  oa_lut->ALBEDO_R_SMALL[iWav][iCase][0][iLut][iTho] = oa_lut->ALBEDO_R_RAY[iWav][iTho];
923  oa_lut->ALBEDO_T_SMALL[iWav][iCase][0][iLut][iTho] = oa_lut->ALBEDO_T_RAY[iWav][iTho];
924  }
925  }
926  }
927  for (int iPhi=0; iPhi<NPHI; iPhi++) {
928  oa_lut->PHC[iPhi] = (float) oa_lut->JPHI[iPhi];
929  }
930 
931  return status;
932 }
933 
934 /**************************************************************************
935  * NAME: read_big_aerosol_file()
936  *
937  * DESCRIPTION: Read Big Ocean Aerosol LUT.
938  *
939  *************************************************************************/
940 
941 int DtLutNetcdf::read_ocean_big_aerosol_file(const string groupname, int iLut,
942  dtOceanAerosolLUT* oa_lut )
943 {
944  int status = DTDB_SUCCESS;
945 
946  string filePath = get_option(groupname);
947  if(filePath.empty()) {
948  cerr << "DtProcessOcean::read_ocean_big_aerosol_file() Invalid path for aerosol LUT file." << endl;
949  return DTDB_FAIL;
950  }
951  ifstream fin(filePath.c_str());
952  if(!fin) {
953  std::cout << "DtProcessOcean::big_ocean_small_aerosol_file() Error opening aerosol LUT file." << endl;
954  return DTDB_FAIL;
955  }
956  string line;
957  string aline;
958  string dummy;
959  float TR, QSCT;
960  for (int iCase=0; iCase<NUMCASEB; iCase++) {
961  for (int iWav=0; iWav<NWAV; iWav++) {
962  for (int iTau=1; iTau<NAOT; iTau++) {
963  getline(fin, line);
964  getline(fin, line);
965  stringstream ss(line);
966  ss >> dummy >> oa_lut->WAVE[iWav];
967  getline(fin, line);
968  getline(fin, line);
969  getline(fin, line);
970  ss.clear();
971  ss.str(line);
972  ss >> dummy >> dummy >> oa_lut->RGSB[iCase]
973  >> dummy >> oa_lut->SIGMAB[iCase];
974  getline(fin, line);
975  getline(fin, line);
976  getline(fin, line);
977  ss.clear();
978  ss.str(line);
979  ss >> dummy >> oa_lut->EFFRADBIG[iCase];
980  getline(fin, line);
981  ss.clear();
982  ss.str(line);
983  ss >> dummy >> dummy >> dummy >> oa_lut->MOMENTSBIG[iCase][0][iLut] >>
984  dummy >> dummy >> dummy >> oa_lut->MOMENTSBIG[iCase][1][iLut];
985  getline(fin, line);
986  ss.clear();
987  ss.str(line);
988  ss >> dummy >> dummy >> dummy >> oa_lut->MOMENTSBIG[iCase][2][iLut] >>
989  dummy >> dummy >> dummy >> oa_lut->MOMENTSBIG[iCase][3][iLut];
990  getline(fin, line);
991  ss.clear();
992  ss.str(line);
993  ss >> dummy >> dummy >> dummy >> oa_lut->ALBEDOBIG[iWav][iCase][iLut] >>
994  dummy >> dummy >> dummy >> oa_lut->ASSYMBIG[iWav][iCase][iLut];
995  getline(fin, line);
996  ss.clear();
997  ss.str(line);
998  ss >> dummy >> dummy >> dummy >> dummy >>
999  dummy >> oa_lut->BACKSCTTBIG[iWav][iCase][iLut];
1000  getline(fin, line);
1001  ss.clear();
1002  ss.str(line);
1003  ss >> dummy >> dummy >> QSCT >>
1004  dummy >> dummy >> oa_lut->EXTBIG[iWav][iCase][iLut];
1005  getline(fin, line);
1006  getline(fin, line);
1007  getline(fin, line);
1008  getline(fin, line);
1009  getline(fin, line);
1010  getline(fin, line);
1011  ss.clear();
1012  ss.str(line);
1013  ss >> dummy >> TR ;
1014  ss >> dummy >> oa_lut->TAUAB[iWav][iCase][iTau];
1015  getline(fin, line);
1016  getline(fin, line);
1017  getline(fin, line);
1018  getline(fin, line);
1019  aline.clear();
1020  for (int il=0; il<2; il++) {
1021  getline(fin, line);
1022  aline += line;
1023  }
1024  ss.clear();
1025  ss.str(aline);
1026  ss >> dummy;
1027  for (int iTho=0; iTho<NTH0; iTho++) {
1028  ss >> oa_lut->THET0[iTho];
1029  }
1030  getline(fin, line);
1031  getline(fin, line);
1032  getline(fin, line);
1033  getline(fin, line);
1034  getline(fin, line);
1035  getline(fin, line);
1036  getline(fin, line);
1037  getline(fin, line);
1038  aline.clear();
1039  for (int il=0; il<2; il++) {
1040  getline(fin, line);
1041  aline += line;
1042  }
1043  ss.clear();
1044  ss.str(aline);
1045  ss >> dummy;
1046  for (int iTho=0; iTho<NTH0; iTho++) {
1047  ss >> oa_lut->ALBEDO_R_BIG[iWav][iCase][iTau][iLut][iTho];
1048  }
1049  aline.clear();
1050  for (int il=0; il<2; il++) {
1051  getline(fin, line);
1052  aline += line;
1053  }
1054  ss.clear();
1055  ss.str(aline);
1056  ss >> dummy;
1057  for (int iTho=0; iTho<NTH0; iTho++) {
1058  ss >> oa_lut->ALBEDO_T_BIG[iWav][iCase][iTau][iLut][iTho];
1059  }
1060  getline(fin, line);
1061  for (int iTho=0; iTho<NTH0; iTho++) {
1062  getline(fin, line);
1063  aline.clear();
1064  for (int il=0; il<3; il++) {
1065  getline(fin, line);
1066  aline += line;
1067  }
1068  ss.clear();
1069  ss.str(aline);
1070  ss >> dummy >> dummy;
1071  for (int iTh=0; iTh<NTHET; iTh++) {
1072  ss >> oa_lut->THET[iTh];
1073  }
1074  for (int iPhi=0; iPhi<NPHI; iPhi++) {
1075  aline.clear();
1076  for (int il=0; il<3; il++) {
1077  getline(fin, line);
1078  aline += line;
1079  }
1080  ss.clear();
1081  ss.str(aline);
1082  ss >> oa_lut->JPHI[iPhi];
1083  for (int iTh=0; iTh<NTHET; iTh++) {
1084  ss >> oa_lut->AINTB[iWav][iCase][iTau][iLut][iTho][iTh][iPhi];
1085  }
1086  }
1087  }
1088  }
1089  }
1090  }
1091 
1092  return status;
1093 }
1094 
1095 
1096 /**************************************************************************
1097  * NAME: read_transm_h2o_file()
1098  *
1099  * DESCRIPTION: Reads TRANSM_H2O ascii file
1100  *
1101  *************************************************************************/
1102 
1103 int DtLutNetcdf::read_transm_h2o_file( const string groupname, const int num,
1104  dtWaterVaporLUT* wv_lut )
1105 {
1106  int status = DTDB_SUCCESS;
1107 
1108  string filePath = get_option(groupname);
1109  if(filePath.empty()) {
1110  cerr << "DtLutNetcdf::read_transm_h2o_file() Invalid path for LUT file." << endl;
1111  return DTDB_FAIL;
1112  }
1113  ifstream fin(filePath.c_str());
1114  if(!fin) {
1115  std::cout << "DtLutNetcdf::read_transm_h2o_file() Error opening LUT file." << endl;
1116  return DTDB_FAIL;
1117  }
1118  string line;
1119  for (int iR=0; iR<TRANSM_H2O_ROWS; iR++) {
1120  getline(fin, line);
1121  stringstream ss(line);
1122  for (int iV=0; iV<TRANSM_H2O_VALS; iV++) {
1123  ss >> wv_lut->TRANSM_H20[num-1][iR][iV];
1124  }
1125  }
1126 
1127  return status;
1128 }
1129 
1130 /**************************************************************************
1131  * NAME: read_ch19_to_ch2_ratio_file()
1132  *
1133  * DESCRIPTION: Reads ch19-to-ch2 ratio ascii file
1134  *
1135  *************************************************************************/
1136 
1137 int DtLutNetcdf::read_ch19_to_ch2_ratio_file( const string groupname,
1138  dtWaterVaporLUT* wv_lut )
1139 {
1140  int status = DTDB_SUCCESS;
1141 
1142  string filePath = get_option(groupname);
1143  if(filePath.empty()) {
1144  std::cout <<
1145  "DtLutNetcdf::read_ch19_to_ch2_ratio_file() Invalid path for LUT file." << endl;
1146  return DTDB_FAIL;
1147  }
1148  ifstream fin(filePath.c_str());
1149  if(!fin) {
1150  std::cout <<
1151  "DtLutNetcdf::read_ch19_to_ch2_ratio_file() Error opening LUT file." << endl;
1152  return DTDB_FAIL;
1153  }
1154  string line;
1155  for (int iR=0; iR<REFL_CH2_ROWS; iR++) {
1156  getline(fin, line);
1157  stringstream ss(line);
1158  for (int iV=0; iV<REFL_CH2_VALS; iV++) {
1159  ss >> wv_lut->RATIO_CH19_TO_CH2[iR][iV];
1160  }
1161  }
1162 
1163  return status;
1164 }
1165 
1166 /**************************************************************************
1167  * NAME: read_ch2_reflectance_file()
1168  *
1169  * DESCRIPTION: Reads ch2 reflectance ascii file
1170  *
1171  *************************************************************************/
1172 
1173 int DtLutNetcdf::read_ch2_reflectance_file( const string groupname,
1174  dtWaterVaporLUT* wv_lut )
1175 {
1176  int status = DTDB_SUCCESS;
1177 
1178  string filePath = get_option(groupname);
1179  if(filePath.empty()) {
1180  std::cout <<
1181  "DtLutNetcdf::read_ch2_file() Invalid path for LUT file." << endl;
1182  return DTDB_FAIL;
1183  }
1184  ifstream fin(filePath.c_str());
1185  if(!fin) {
1186  std::cout <<
1187  "DtLutNetcdf::read_ch2_file() Error opening LUT file." << endl;
1188  return DTDB_FAIL;
1189  }
1190  string line;
1191  for (int iR=0; iR<REFL_CH2_ROWS; iR++) {
1192  getline(fin, line);
1193  stringstream ss(line);
1194  for (int iV=0; iV<REFL_CH2_VALS; iV++) {
1195  ss >> wv_lut->REFL_CH2[iR][iV];
1196  }
1197  }
1198 
1199  return status;
1200 }
1201 
1202 /**************************************************************************
1203  * NAME: read_weight_table_file()
1204  *
1205  * DESCRIPTION: Reads weight table ascii file
1206  *
1207  *************************************************************************/
1208 
1209 int DtLutNetcdf::read_weight_table_file( const string groupname,
1210  dtWaterVaporLUT* wv_lut )
1211 {
1212  int status = DTDB_SUCCESS;
1213 
1214  string filePath = get_option(groupname);
1215  if(filePath.empty()) {
1216  std::cout <<
1217  "DtLutNetcdf::read_weight_table_file() Invalid path for LUT file." << endl;
1218  return DTDB_FAIL;
1219  }
1220  ifstream fin(filePath.c_str());
1221  if(!fin) {
1222  std::cout <<
1223  "DtLutNetcdf::read_weight_table_file() Error opening LUT file." << endl;
1224  return DTDB_FAIL;
1225  }
1226  string line;
1227  getline(fin, line);
1228  for (int iR=0; iR<TRANSM_H2O_ROWS; iR++) {
1229  getline(fin, line);
1230  stringstream ss(line);
1231  for (int iV=0; iV<WEIGHT_VALS; iV++) {
1232  ss >> wv_lut->WEIGHTS[iR][iV];
1233  }
1234  }
1235 
1236  return status;
1237 }
1238 
1239 /**************************************************************************
1240  * NAME: write_gas_correction_lut()
1241  *
1242  * DESCRIPTION: Write gas correction LUT to NetCDF4 file.
1243  *
1244  *************************************************************************/
1245 
1247  dtGasCorrectionLUT* gc_lut )
1248 {
1249  NcGroup lut_grp = nc_output->addGroup( LUT_GAS_CORRECTION );
1250 
1251  num_gc_dt_bands_dim_ = lut_grp.addDim( "Dim_Bands", NUM_DT_BANDS );
1252  num_gc_O3_coef_dim_ = lut_grp.addDim( "Dim_O3_Coefficients", O3_COEFS );
1253  num_gc_H2O_coef_dim_ = lut_grp.addDim( "Dim_H2O_Coefficients", H2O_COEFS );
1254 
1255  vector<NcDim> O3_dims;
1256  O3_dims.push_back(num_gc_dt_bands_dim_);
1257  O3_dims.push_back(num_gc_O3_coef_dim_);
1258 
1259  vector<NcDim> H2O_dims;
1260  H2O_dims.push_back(num_gc_dt_bands_dim_);
1261  H2O_dims.push_back(num_gc_H2O_coef_dim_);
1262 
1263  NcVar var = lut_grp.addVar( "MBAND", ncInt, num_gc_dt_bands_dim_ );
1264  var.putVar( gc_lut->MBAND );
1265 
1266  var = lut_grp.addVar( "VBAND", ncInt, num_gc_dt_bands_dim_ );
1267  var.putVar( gc_lut->VBAND );
1268 
1269  var = lut_grp.addVar( "WAVE", ncFloat, num_gc_dt_bands_dim_ );
1270  var.putVar( gc_lut->WAVE );
1271 
1272  var = lut_grp.addVar( "MOL", ncFloat, num_gc_dt_bands_dim_ );
1273  var.putVar( gc_lut->MOL );
1274 
1275  var = lut_grp.addVar( "OPT_O3_CLIM", ncFloat, num_gc_dt_bands_dim_ );
1276  var.putVar( gc_lut->OPT_O3_CLIM );
1277 
1278  var = lut_grp.addVar( "OPT_H2O_CLIM", ncFloat, num_gc_dt_bands_dim_ );
1279  var.putVar( gc_lut->OPT_H2O_CLIM );
1280 
1281  var = lut_grp.addVar( "OPT_CO2_CLIM", ncFloat, num_gc_dt_bands_dim_ );
1282  var.putVar( gc_lut->OPT_CO2_CLIM );
1283 
1284  var = lut_grp.addVar( "O3_COEF", ncFloat, O3_dims );
1285  var.putVar( gc_lut->O3_COEF );
1286 
1287  var = lut_grp.addVar( "H2O_COEF", ncFloat, H2O_dims );
1288  var.putVar( gc_lut->H2O_COEF );
1289 
1290  return DTDB_SUCCESS;
1291 }
1292 
1293 
1294 /**************************************************************************
1295  * NAME: write_land_aerosol_lut()
1296  *
1297  * DESCRIPTION: Write land aerosol LUT to NetCDF4 file.
1298  *
1299  *************************************************************************/
1300 
1302  dtLandAerosolLUT* la_lut )
1303 {
1304  NcGroup lut_grp = nc_output->addGroup( LUT_LAND_AEROSOL );
1305 
1306  num_land_lats_dim_ = lut_grp.addDim( "Dim_Latitude", NUM_LATS );
1307  num_land_lons_dim_ = lut_grp.addDim( "Dim_Longitude", NUM_LONS );
1308  num_land_phi_dim_ = lut_grp.addDim( "Dim_Phi", NLPHI );
1309  num_land_the_dim_ = lut_grp.addDim( "Dim_Theta", NLTHE );
1310  num_land_thet0_dim_ = lut_grp.addDim( "Dim_SZA", NLTHET0 );
1311  num_land_tau_dim_ = lut_grp.addDim( "Dim_Tau", NLTAU );
1312  num_land_wav_dim_ = lut_grp.addDim( "Dim_Bands", NLUTWAV );
1313  num_land_table_dim_ = lut_grp.addDim( "Dim_Tables", NLTABLE );
1314  num_land_size_dim_ = lut_grp.addDim( "Dim_Sizes", NLSIZE );
1315  num_land_season_dim_ = lut_grp.addDim( "Dim_Seasons", NUM_SEASONS );
1316 
1317  vector<NcDim> map_dims;
1318  map_dims.push_back(num_land_season_dim_);
1319  map_dims.push_back(num_land_lats_dim_);
1320  map_dims.push_back(num_land_lons_dim_);
1321 
1322  vector<NcDim> tab3_dims;
1323  tab3_dims.push_back(num_land_table_dim_);
1324  tab3_dims.push_back(num_land_wav_dim_);
1325  tab3_dims.push_back(num_land_tau_dim_);
1326 
1327  vector<NcDim> tab4_dims;
1328  tab4_dims.push_back(num_land_table_dim_);
1329  tab4_dims.push_back(num_land_wav_dim_);
1330  tab4_dims.push_back(num_land_tau_dim_);
1331  tab4_dims.push_back(num_land_thet0_dim_);
1332 
1333  vector<NcDim> tab5_dims;
1334  tab5_dims.push_back(num_land_table_dim_);
1335  tab5_dims.push_back(num_land_wav_dim_);
1336  tab5_dims.push_back(num_land_tau_dim_);
1337  tab5_dims.push_back(num_land_thet0_dim_);
1338  tab5_dims.push_back(num_land_the_dim_);
1339 
1340  vector<NcDim> tab6_dims;
1341  tab6_dims.push_back(num_land_table_dim_);
1342  tab6_dims.push_back(num_land_wav_dim_);
1343  tab6_dims.push_back(num_land_tau_dim_);
1344  tab6_dims.push_back(num_land_thet0_dim_);
1345  tab6_dims.push_back(num_land_the_dim_);
1346  tab6_dims.push_back(num_land_phi_dim_);
1347 
1348  vector<NcDim> siz3_dims;
1349  siz3_dims.push_back(num_land_size_dim_);
1350  siz3_dims.push_back(num_land_wav_dim_);
1351  siz3_dims.push_back(num_land_tau_dim_);
1352 
1353  vector<NcDim> siz4_dims;
1354  siz4_dims.push_back(num_land_size_dim_);
1355  siz4_dims.push_back(num_land_wav_dim_);
1356  siz4_dims.push_back(num_land_tau_dim_);
1357  siz4_dims.push_back(num_land_thet0_dim_);
1358 
1359  vector<NcDim> siz5_dims;
1360  siz5_dims.push_back(num_land_size_dim_);
1361  siz5_dims.push_back(num_land_wav_dim_);
1362  siz5_dims.push_back(num_land_tau_dim_);
1363  siz5_dims.push_back(num_land_thet0_dim_);
1364  siz5_dims.push_back(num_land_the_dim_);
1365 
1366  vector<NcDim> siz6_dims;
1367  siz6_dims.push_back(num_land_size_dim_);
1368  siz6_dims.push_back(num_land_wav_dim_);
1369  siz6_dims.push_back(num_land_tau_dim_);
1370  siz6_dims.push_back(num_land_thet0_dim_);
1371  siz6_dims.push_back(num_land_the_dim_);
1372  siz6_dims.push_back(num_land_phi_dim_);
1373 
1374  NcVar var = lut_grp.addVar( "AEROSOL_ALL", ncInt, map_dims );
1375  var.putVar( la_lut->AEROSOL_ALL );
1376 
1377  var = lut_grp.addVar( "PHI_NL", ncFloat, num_land_phi_dim_ );
1378  var.putVar( la_lut->PHI_NL );
1379 
1380  var = lut_grp.addVar( "THE_NL", ncFloat, num_land_the_dim_ );
1381  var.putVar( la_lut->THE_NL );
1382 
1383  var = lut_grp.addVar( "THET0_NL", ncFloat, num_land_thet0_dim_ );
1384  var.putVar( la_lut->THET0_NL );
1385 
1386  var = lut_grp.addVar( "MU0_NL", ncFloat, num_land_thet0_dim_ );
1387  var.putVar( la_lut->MU0_NL );
1388 
1389  var = lut_grp.addVar( "WAV_NL", ncFloat, num_land_wav_dim_ );
1390  var.putVar( la_lut->WAV_NL );
1391 
1392  var = lut_grp.addVar( "OPTH_NL0", ncFloat, tab3_dims );
1393  var.putVar( la_lut->OPTH_NL0 );
1394 
1395  var = lut_grp.addVar( "MASSCOEF_NL0", ncFloat, tab3_dims );
1396  var.putVar( la_lut->MASSCOEF_NL0 );
1397 
1398  var = lut_grp.addVar( "EXTNORM_NL0", ncFloat, tab3_dims );
1399  var.putVar( la_lut->EXTNORM_NL0 );
1400 
1401  var = lut_grp.addVar( "SSA_NL0", ncFloat, tab3_dims );
1402  var.putVar( la_lut->SSA_NL0 );
1403 
1404  var = lut_grp.addVar( "QEXT_NL0", ncFloat, tab3_dims );
1405  var.putVar( la_lut->QEXT_NL0 );
1406 
1407  var = lut_grp.addVar( "BEXT_NL0", ncFloat, tab3_dims );
1408  var.putVar( la_lut->BEXT_NL0 );
1409 
1410  var = lut_grp.addVar( "VEXT_NL0", ncFloat, tab3_dims );
1411  var.putVar( la_lut->VEXT_NL0 );
1412 
1413  var = lut_grp.addVar( "MEXT_NL0", ncFloat, tab3_dims );
1414  var.putVar( la_lut->MEXT_NL0 );
1415 
1416  var = lut_grp.addVar( "SBAR_NL0", ncFloat, tab4_dims );
1417  var.putVar( la_lut->SBAR_NL0 );
1418 
1419  var = lut_grp.addVar( "INT_NL0", ncFloat, tab6_dims );
1420  var.putVar( la_lut->INT_NL0 );
1421 
1422  var = lut_grp.addVar( "Fd_NL0", ncFloat, tab4_dims );
1423  var.putVar( la_lut->Fd_NL0 );
1424 
1425  var = lut_grp.addVar( "T_NL0", ncFloat, tab5_dims );
1426  var.putVar( la_lut->T_NL0 );
1427 
1428  var = lut_grp.addVar( "OMEGA0", ncFloat, tab3_dims );
1429  var.putVar( la_lut->OMEGA0 );
1430 
1431  var = lut_grp.addVar( "ROD", ncFloat, num_land_wav_dim_ );
1432  var.putVar( la_lut->ROD );
1433 
1434  var = lut_grp.addVar( "GOD", ncFloat, num_land_wav_dim_ );
1435  var.putVar( la_lut->GOD );
1436 
1437  return DTDB_SUCCESS;
1438 }
1439 
1440 /**************************************************************************
1441  * NAME: write_ocean_aerosol_lut()
1442  *
1443  * DESCRIPTION: Write ocean aerosol LUT to NetCDF4 file.
1444  *
1445  *************************************************************************/
1446 
1448  dtOceanAerosolLUT* oa_lut )
1449 {
1450  NcGroup lut_grp = nc_output->addGroup( LUT_OCEAN_AEROSOL );
1451 
1452  num_ocean_phi_dim_ = lut_grp.addDim( "Dim_Phi", NPHI );
1453  num_ocean_the_dim_ = lut_grp.addDim( "Dim_Theta", NTHET );
1454  num_ocean_thet0_dim_ = lut_grp.addDim( "Dim_SZA", NTH0 );
1455  num_ocean_tau_dim_ = lut_grp.addDim( "Dim_Tau", NAOT );
1456  num_ocean_wave_dim_ = lut_grp.addDim( "Dim_Bands", NWAV );
1457  num_ocean_cases_dim_ = lut_grp.addDim( "Dim_Small_Cases", NUM_CASES_SMALL );
1458  num_ocean_caseb_dim_ = lut_grp.addDim( "Dim_Large_Cases", NUM_CASES_BIG );
1459  num_ocean_wslut_dim_ = lut_grp.addDim( "Dim_Wind_LUT_bins", NUM_LUTS );
1460  num_ocean_moments_dim_ = lut_grp.addDim( "Dim_Moments", 4 );
1461 
1462  vector<NcDim> moments_dims;
1463  moments_dims.push_back(num_ocean_cases_dim_);
1464  moments_dims.push_back(num_ocean_moments_dim_);
1465  moments_dims.push_back(num_ocean_wslut_dim_);
1466 
1467  vector<NcDim> tab2s_dims;
1468  tab2s_dims.push_back(num_ocean_cases_dim_);
1469  tab2s_dims.push_back(num_ocean_wslut_dim_);
1470 
1471  vector<NcDim> tab3s_dims;
1472  tab3s_dims.push_back(num_ocean_wave_dim_);
1473  tab3s_dims.push_back(num_ocean_cases_dim_);
1474  tab3s_dims.push_back(num_ocean_wslut_dim_);
1475 
1476  vector<NcDim> tau3s_dims;
1477  tau3s_dims.push_back(num_ocean_wave_dim_);
1478  tau3s_dims.push_back(num_ocean_cases_dim_);
1479  tau3s_dims.push_back(num_ocean_tau_dim_);
1480 
1481  vector<NcDim> tab5s_dims;
1482  tab5s_dims.push_back(num_ocean_wave_dim_);
1483  tab5s_dims.push_back(num_ocean_cases_dim_);
1484  tab5s_dims.push_back(num_ocean_tau_dim_);
1485  tab5s_dims.push_back(num_ocean_wslut_dim_);
1486  tab5s_dims.push_back(num_ocean_thet0_dim_);
1487 
1488  vector<NcDim> tab7s_dims;
1489  tab7s_dims.push_back(num_ocean_wave_dim_);
1490  tab7s_dims.push_back(num_ocean_cases_dim_);
1491  tab7s_dims.push_back(num_ocean_tau_dim_);
1492  tab7s_dims.push_back(num_ocean_wslut_dim_);
1493  tab7s_dims.push_back(num_ocean_thet0_dim_);
1494  tab7s_dims.push_back(num_ocean_the_dim_);
1495  tab7s_dims.push_back(num_ocean_phi_dim_);
1496 
1497  NcVar var = lut_grp.addVar( "JPHI", ncInt, num_ocean_phi_dim_ );
1498  var.putVar( oa_lut->JPHI );
1499 
1500  var = lut_grp.addVar( "PHC", ncFloat, num_ocean_phi_dim_ );
1501  var.putVar( oa_lut->PHC );
1502 
1503  var = lut_grp.addVar( "THET", ncFloat, num_ocean_the_dim_ );
1504  var.putVar( oa_lut->THET );
1505 
1506  var = lut_grp.addVar( "THET0", ncFloat, num_ocean_thet0_dim_ );
1507  var.putVar( oa_lut->THET0 );
1508 
1509  var = lut_grp.addVar( "WAVE", ncFloat, num_ocean_wave_dim_ );
1510  var.putVar( oa_lut->WAVE );
1511 
1512  var = lut_grp.addVar( "EXTSMALL", ncFloat, tab3s_dims );
1513  var.putVar( oa_lut->EXTSMALL );
1514 
1515  var = lut_grp.addVar( "RGSS", ncFloat, num_ocean_cases_dim_ );
1516  var.putVar( oa_lut->RGSS );
1517 
1518  var = lut_grp.addVar( "SIGMAS", ncFloat, num_ocean_cases_dim_ );
1519  var.putVar( oa_lut->SIGMAS );
1520 
1521  var = lut_grp.addVar( "MOMENTSSMALL", ncFloat, moments_dims );
1522  var.putVar( oa_lut->MOMENTSSMALL );
1523 
1524  var = lut_grp.addVar( "CCNSMALL", ncFloat, tab2s_dims );
1525  var.putVar( oa_lut->CCNSMALL );
1526 
1527  var = lut_grp.addVar( "BACKSCTTSMALL", ncFloat, tab3s_dims );
1528  var.putVar( oa_lut->BACKSCTTSMALL );
1529 
1530  var = lut_grp.addVar( "ASSYMSMALL", ncFloat, tab3s_dims );
1531  var.putVar( oa_lut->ASSYMSMALL );
1532 
1533  var = lut_grp.addVar( "ALBEDOSMALL", ncFloat, tab3s_dims );
1534  var.putVar( oa_lut->ALBEDOSMALL );
1535 
1536  var = lut_grp.addVar( "ALBEDO_R_SMALL", ncFloat, tab5s_dims );
1537  var.putVar( oa_lut->ALBEDO_R_SMALL );
1538 
1539  var = lut_grp.addVar( "ALBEDO_T_SMALL", ncFloat, tab5s_dims );
1540  var.putVar( oa_lut->ALBEDO_T_SMALL );
1541 
1542  var = lut_grp.addVar( "AINTS", ncFloat, tab7s_dims );
1543  var.putVar( oa_lut->AINTS );
1544 
1545  var = lut_grp.addVar( "TAUAS", ncFloat, tau3s_dims );
1546  var.putVar( oa_lut->TAUAS );
1547 
1548  var = lut_grp.addVar( "EFFRADSMALL", ncFloat, num_ocean_cases_dim_ );
1549  var.putVar( oa_lut->EFFRADSMALL );
1550 
1551  vector<NcDim> momentb_dims;
1552  momentb_dims.push_back(num_ocean_caseb_dim_);
1553  momentb_dims.push_back(num_ocean_moments_dim_);
1554  momentb_dims.push_back(num_ocean_wslut_dim_);
1555 
1556  vector<NcDim> tab2b_dims;
1557  tab2b_dims.push_back(num_ocean_caseb_dim_);
1558  tab2b_dims.push_back(num_ocean_wslut_dim_);
1559 
1560  vector<NcDim> tab3b_dims;
1561  tab3b_dims.push_back(num_ocean_wave_dim_);
1562  tab3b_dims.push_back(num_ocean_caseb_dim_);
1563  tab3b_dims.push_back(num_ocean_wslut_dim_);
1564 
1565  vector<NcDim> tau3b_dims;
1566  tau3b_dims.push_back(num_ocean_wave_dim_);
1567  tau3b_dims.push_back(num_ocean_caseb_dim_);
1568  tau3b_dims.push_back(num_ocean_tau_dim_);
1569 
1570  vector<NcDim> tab5b_dims;
1571  tab5b_dims.push_back(num_ocean_wave_dim_);
1572  tab5b_dims.push_back(num_ocean_caseb_dim_);
1573  tab5b_dims.push_back(num_ocean_tau_dim_);
1574  tab5b_dims.push_back(num_ocean_wslut_dim_);
1575  tab5b_dims.push_back(num_ocean_thet0_dim_);
1576 
1577  vector<NcDim> tab7b_dims;
1578  tab7b_dims.push_back(num_ocean_wave_dim_);
1579  tab7b_dims.push_back(num_ocean_caseb_dim_);
1580  tab7b_dims.push_back(num_ocean_tau_dim_);
1581  tab7b_dims.push_back(num_ocean_wslut_dim_);
1582  tab7b_dims.push_back(num_ocean_thet0_dim_);
1583  tab7b_dims.push_back(num_ocean_the_dim_);
1584  tab7b_dims.push_back(num_ocean_phi_dim_);
1585 
1586  vector<NcDim> alb2_dims;
1587  alb2_dims.push_back(num_ocean_wave_dim_);
1588  alb2_dims.push_back(num_ocean_thet0_dim_);
1589 
1590  vector<NcDim> ray5_dims;
1591  ray5_dims.push_back(num_ocean_wave_dim_);
1592  ray5_dims.push_back(num_ocean_wslut_dim_);
1593  ray5_dims.push_back(num_ocean_thet0_dim_);
1594  ray5_dims.push_back(num_ocean_the_dim_);
1595  ray5_dims.push_back(num_ocean_phi_dim_);
1596 
1597  var = lut_grp.addVar( "EXTBIG", ncFloat, tab3b_dims );
1598  var.putVar( oa_lut->EXTBIG );
1599 
1600  var = lut_grp.addVar( "RGSB", ncFloat, num_ocean_caseb_dim_ );
1601  var.putVar( oa_lut->RGSB );
1602 
1603  var = lut_grp.addVar( "SIGMAB", ncFloat, num_ocean_caseb_dim_ );
1604  var.putVar( oa_lut->SIGMAB );
1605 
1606  var = lut_grp.addVar( "MOMENTSBIG", ncFloat, momentb_dims );
1607  var.putVar( oa_lut->MOMENTSBIG );
1608 
1609  var = lut_grp.addVar( "BACKSCTTBIG", ncFloat, tab3b_dims );
1610  var.putVar( oa_lut->BACKSCTTBIG );
1611 
1612  var = lut_grp.addVar( "ASSYMBIG", ncFloat, tab3b_dims );
1613  var.putVar( oa_lut->ASSYMBIG );
1614 
1615  var = lut_grp.addVar( "ALBEDOBIG", ncFloat, tab3b_dims );
1616  var.putVar( oa_lut->ALBEDOBIG );
1617 
1618  var = lut_grp.addVar( "ALBEDO_R_BIG", ncFloat, tab5b_dims );
1619  var.putVar( oa_lut->ALBEDO_R_BIG );
1620 
1621  var = lut_grp.addVar( "ALBEDO_T_BIG", ncFloat, tab5b_dims );
1622  var.putVar( oa_lut->ALBEDO_T_BIG );
1623 
1624  var = lut_grp.addVar( "AINTB", ncFloat, tab7b_dims );
1625  var.putVar( oa_lut->AINTB );
1626 
1627  var = lut_grp.addVar( "TAUAB", ncFloat, tau3b_dims );
1628  var.putVar( oa_lut->TAUAB );
1629 
1630  var = lut_grp.addVar( "EFFRADBIG", ncFloat, num_ocean_caseb_dim_ );
1631  var.putVar( oa_lut->EFFRADBIG );
1632 
1633  var = lut_grp.addVar( "ALBEDO_R_RAY", ncFloat, alb2_dims );
1634  var.putVar( oa_lut->ALBEDO_R_RAY );
1635 
1636  var = lut_grp.addVar( "ALBEDO_T_RAY", ncFloat, alb2_dims );
1637  var.putVar( oa_lut->ALBEDO_T_RAY );
1638 
1639  var = lut_grp.addVar( "REF_RAYALL", ncFloat, ray5_dims );
1640  var.putVar( oa_lut->REF_RAYALL );
1641 
1642  return DTDB_SUCCESS;
1643 }
1644 
1645 /**************************************************************************
1646  * NAME: write_water_vapor_lut()
1647  *
1648  * DESCRIPTION: Write water vapor LUT to NetCDF4 file.
1649  *
1650  *************************************************************************/
1651 
1652 int DtLutNetcdf::write_water_vapor_lut( NcFile* nc_output,
1653  dtWaterVaporLUT* wv_lut )
1654 {
1655  NcGroup lut_grp = nc_output->addGroup( LUT_WATER_VAPOR );
1656 
1657  num_h2o_tables_dim_ = lut_grp.addDim( "Dim_Transm_H2O_tables", TRANSM_H2O_TABLES );
1658  num_h2o_rows_dim_ = lut_grp.addDim( "Dim_H2O_Rows", TRANSM_H2O_ROWS );
1659  num_h2o_vals_dim_ = lut_grp.addDim( "Dim_H2O_Vals", TRANSM_H2O_VALS );
1660 // num_weight_vals_dim_ = lut_grp.addDim( "Dim_Weight_Vals", WEIGHT_VALS );
1661 // num_ch2_rows_dim_ = lut_grp.addDim( "Dim_Refl_Ch2_Rows", REFL_CH2_ROWS );
1662 // num_ch2_vals_dim_ = lut_grp.addDim( "Dim_Refl_Ch2_Vals", REFL_CH2_VALS );
1663 
1664  vector<NcDim> H2O_dims;
1665  H2O_dims.push_back(num_h2o_tables_dim_);
1666  H2O_dims.push_back(num_h2o_rows_dim_);
1667  H2O_dims.push_back(num_h2o_vals_dim_);
1668 
1669 // vector<NcDim> weight_dims;
1670 // weight_dims.push_back(num_h2o_rows_dim_);
1671 // weight_dims.push_back(num_weight_vals_dim_);
1672 
1673 // vector<NcDim> ch2_dims;
1674 // ch2_dims.push_back(num_ch2_rows_dim_);
1675 // ch2_dims.push_back(num_ch2_vals_dim_);
1676 
1677  NcVar var = lut_grp.addVar( "TRANSM_H20", ncFloat, H2O_dims );
1678  var.putVar( wv_lut->TRANSM_H20 );
1679 /*
1680  var = lut_grp.addVar( "WEIGHTS", ncFloat, weight_dims );
1681  var.putVar( wv_lut->WEIGHTS );
1682 
1683  var = lut_grp.addVar( "REFL_CH2", ncFloat, ch2_dims );
1684  var.putVar( wv_lut->REFL_CH2 );
1685 
1686  var = lut_grp.addVar( "RATIO_CH19_TO_CH2", ncFloat, ch2_dims );
1687  var.putVar( wv_lut->RATIO_CH19_TO_CH2 );
1688 */
1689  return DTDB_SUCCESS;
1690 }
1691 
1692 /**************************************************************************
1693  * NAME: read_gas_correction_lut()
1694  *
1695  * DESCRIPTION: Read darktarget gas correction NetCDF4 LUT.
1696  *
1697  *************************************************************************/
1698 
1700 {
1701  int status = DTDB_SUCCESS;
1702 
1704  if (filepath.empty()) {
1706  }
1707  NcFile* nc_input;
1708  try {
1709  nc_input = new NcFile(filepath, NcFile::read );
1710  }
1711  catch( NcException& e) {
1712  e.what();
1713  cerr << "DtLutNetcdf:: Failure opening netcdf LUT file: " + filepath << endl;
1714  return DTDB_FAIL;
1715  }
1716  NcGroup lut_grp = nc_input->getGroup( LUT_GAS_CORRECTION );
1717 
1718  NcVar var = lut_grp.getVar ( "MBAND" );
1719  var.getVar( gc_lut.MBAND );
1720 
1721  var = lut_grp.getVar ( "VBAND" );
1722  var.getVar( gc_lut.VBAND );
1723 
1724  var = lut_grp.getVar ( "WAVE" );
1725  var.getVar( gc_lut.WAVE );
1726 
1727  var = lut_grp.getVar ( "MOL" );
1728  var.getVar( gc_lut.MOL );
1729 
1730  var = lut_grp.getVar ( "OPT_O3_CLIM" );
1731  var.getVar( gc_lut.OPT_O3_CLIM );
1732 
1733  var = lut_grp.getVar ( "OPT_H2O_CLIM" );
1734  var.getVar( gc_lut.OPT_H2O_CLIM );
1735 
1736  var = lut_grp.getVar ( "OPT_CO2_CLIM" );
1737  var.getVar( gc_lut.OPT_CO2_CLIM );
1738 
1739  var = lut_grp.getVar ( "O3_COEF" );
1740  var.getVar( gc_lut.O3_COEF );
1741 
1742  var = lut_grp.getVar ( "H2O_COEF" );
1743  var.getVar( gc_lut.H2O_COEF );
1744 
1745  delete nc_input;
1746 
1747  return status;
1748 }
1749 
1750 /**************************************************************************
1751  * NAME: read_land_aerosol_lut()
1752  *
1753  * DESCRIPTION: Read Land Aerosol NetCDF4 LUT.
1754  *
1755  *************************************************************************/
1756 
1758 {
1759  int status = DTDB_SUCCESS;
1760 
1762  if (filepath.empty()) {
1764  }
1765  NcFile* nc_input;
1766  try {
1767  nc_input = new NcFile(filepath, NcFile::read );
1768  }
1769  catch( NcException& e) {
1770  e.what();
1771  cerr << "DtLutNetcdf:: Failure opening netcdf LUT file: " + filepath << endl;
1772  return DTDB_FAIL;
1773  }
1774  NcGroup lut_grp = nc_input->getGroup( LUT_LAND_AEROSOL );
1775 
1776  NcVar var = lut_grp.getVar( "AEROSOL_ALL");
1777  var.getVar( la_lut.AEROSOL_ALL );
1778 
1779  var = lut_grp.getVar( "PHI_NL" );
1780  var.getVar( la_lut.PHI_NL );
1781 
1782  var = lut_grp.getVar( "THE_NL" );
1783  var.getVar( la_lut.THE_NL );
1784 
1785  var = lut_grp.getVar( "THET0_NL" );
1786  var.getVar( la_lut.THET0_NL );
1787 
1788  var = lut_grp.getVar( "MU0_NL" );
1789  var.getVar( la_lut.MU0_NL );
1790 
1791  var = lut_grp.getVar( "WAV_NL" );
1792  var.getVar( la_lut.WAV_NL );
1793 
1794  var = lut_grp.getVar( "OPTH_NL0" );
1795  var.getVar( la_lut.OPTH_NL0 );
1796 
1797  var = lut_grp.getVar( "MASSCOEF_NL0" );
1798  var.getVar( la_lut.MASSCOEF_NL0 );
1799 
1800  var = lut_grp.getVar( "EXTNORM_NL0" );
1801  var.getVar( la_lut.EXTNORM_NL0 );
1802 
1803  var = lut_grp.getVar( "SSA_NL0" );
1804  var.getVar( la_lut.SSA_NL0 );
1805 
1806  var = lut_grp.getVar( "QEXT_NL0" );
1807  var.getVar( la_lut.QEXT_NL0 );
1808 
1809  var = lut_grp.getVar( "BEXT_NL0" );
1810  var.getVar( la_lut.BEXT_NL0 );
1811 
1812  var = lut_grp.getVar( "VEXT_NL0" );
1813  var.getVar( la_lut.VEXT_NL0 );
1814 
1815  var = lut_grp.getVar( "MEXT_NL0" );
1816  var.getVar( la_lut.MEXT_NL0 );
1817 
1818  var = lut_grp.getVar( "SBAR_NL0" );
1819  var.getVar( la_lut.SBAR_NL0 );
1820 
1821  var = lut_grp.getVar( "INT_NL0" );
1822  var.getVar( la_lut.INT_NL0 );
1823 
1824  var = lut_grp.getVar( "Fd_NL0" );
1825  var.getVar( la_lut.Fd_NL0 );
1826 
1827  var = lut_grp.getVar( "T_NL0" );
1828  var.getVar( la_lut.T_NL0 );
1829 
1830  var = lut_grp.getVar( "OMEGA0" );
1831  var.getVar( la_lut.OMEGA0 );
1832 
1833  var = lut_grp.getVar( "ROD" );
1834  var.getVar( la_lut.ROD );
1835 
1836  var = lut_grp.getVar( "GOD" );
1837  var.getVar( la_lut.GOD );
1838 
1839  delete nc_input;
1840 
1841  return status;
1842 }
1843 
1844 
1845 /**************************************************************************
1846  * NAME: read_ocean_aerosol_lut()
1847  *
1848  * DESCRIPTION: Read Ocean Aerosol NetCDF4 LUT.
1849  *
1850  *************************************************************************/
1851 
1853 {
1854  int status = DTDB_SUCCESS;
1855 
1857  if (filepath.empty()) {
1859  }
1860  NcFile* nc_input;
1861  try {
1862  nc_input = new NcFile(filepath, NcFile::read );
1863  }
1864  catch( NcException& e) {
1865  e.what();
1866  cerr << "DtLutNetcdf:: Failure opening netcdf LUT file: " + filepath << endl;
1867  return DTDB_FAIL;
1868  }
1869  NcGroup lut_grp = nc_input->getGroup( LUT_OCEAN_AEROSOL );
1870 
1871  NcVar var = lut_grp.getVar ( "JPHI" );
1872  var.getVar( oa_lut.JPHI );
1873 
1874  var = lut_grp.getVar ( "PHC" );
1875  var.getVar( oa_lut.PHC );
1876 
1877  var = lut_grp.getVar ( "THET" );
1878  var.getVar( oa_lut.THET );
1879 
1880  var = lut_grp.getVar ( "THET0" );
1881  var.getVar( oa_lut.THET0 );
1882 
1883  var = lut_grp.getVar ( "WAVE" );
1884  var.getVar( oa_lut.WAVE );
1885 
1886  var = lut_grp.getVar ( "EXTSMALL" );
1887  var.getVar( oa_lut.EXTSMALL );
1888 
1889  var = lut_grp.getVar ( "RGSS" );
1890  var.getVar( oa_lut.RGSS );
1891 
1892  var = lut_grp.getVar( "SIGMAS" );
1893  var.getVar( oa_lut.SIGMAS );
1894 
1895  var = lut_grp.getVar( "MOMENTSSMALL" );
1896  var.getVar( oa_lut.MOMENTSSMALL );
1897 
1898  var = lut_grp.getVar( "CCNSMALL" );
1899  var.getVar( oa_lut.CCNSMALL );
1900 
1901  var = lut_grp.getVar( "BACKSCTTSMALL" );
1902  var.getVar( oa_lut.BACKSCTTSMALL );
1903 
1904  var = lut_grp.getVar( "ASSYMSMALL" );
1905  var.getVar( oa_lut.ASSYMSMALL );
1906 
1907  var = lut_grp.getVar( "ALBEDOSMALL" );
1908  var.getVar( oa_lut.ALBEDOSMALL );
1909 
1910  var = lut_grp.getVar( "ALBEDO_R_SMALL" );
1911  var.getVar( oa_lut.ALBEDO_R_SMALL );
1912 
1913  var = lut_grp.getVar( "ALBEDO_T_SMALL" );
1914  var.getVar( oa_lut.ALBEDO_T_SMALL );
1915 
1916  var = lut_grp.getVar( "AINTS" );
1917  var.getVar( oa_lut.AINTS );
1918 
1919  var = lut_grp.getVar( "TAUAS" );
1920  var.getVar( oa_lut.TAUAS );
1921 
1922  var = lut_grp.getVar( "EFFRADSMALL" );
1923  var.getVar( oa_lut.EFFRADSMALL );
1924 
1925  var = lut_grp.getVar( "EXTBIG" );
1926  var.getVar( oa_lut.EXTBIG );
1927 
1928  var = lut_grp.getVar( "RGSB" );
1929  var.getVar( oa_lut.RGSB );
1930 
1931  var = lut_grp.getVar( "SIGMAB" );
1932  var.getVar( oa_lut.SIGMAB );
1933 
1934  var = lut_grp.getVar( "MOMENTSBIG" );
1935  var.getVar( oa_lut.MOMENTSBIG );
1936 
1937  var = lut_grp.getVar( "BACKSCTTBIG" );
1938  var.getVar( oa_lut.BACKSCTTBIG );
1939 
1940  var = lut_grp.getVar( "ASSYMBIG" );
1941  var.getVar( oa_lut.ASSYMBIG );
1942 
1943  var = lut_grp.getVar( "ALBEDOBIG" );
1944  var.getVar( oa_lut.ALBEDOBIG );
1945 
1946  var = lut_grp.getVar( "ALBEDO_R_BIG" );
1947  var.getVar( oa_lut.ALBEDO_R_BIG );
1948 
1949  var = lut_grp.getVar( "ALBEDO_T_BIG" );
1950  var.getVar( oa_lut.ALBEDO_T_BIG );
1951 
1952  var = lut_grp.getVar( "AINTB" );
1953  var.getVar( oa_lut.AINTB );
1954 
1955  var = lut_grp.getVar( "TAUAB" );
1956  var.getVar( oa_lut.TAUAB );
1957 
1958  var = lut_grp.getVar( "EFFRADBIG" );
1959  var.getVar( oa_lut.EFFRADBIG );
1960 
1961  var = lut_grp.getVar( "ALBEDO_R_RAY" );
1962  var.getVar( oa_lut.ALBEDO_R_RAY );
1963 
1964  var = lut_grp.getVar( "ALBEDO_T_RAY" );
1965  var.getVar( oa_lut.ALBEDO_T_RAY );
1966 
1967  var = lut_grp.getVar( "REF_RAYALL" );
1968  var.getVar( oa_lut.REF_RAYALL );
1969 
1970  delete nc_input;
1971 
1972  return status;
1973 }
1974 
1975 /**************************************************************************
1976  * NAME: read_water_vapor_lut()
1977  *
1978  * DESCRIPTION: Read water vapor NetCDF4 LUT.
1979  *
1980  *************************************************************************/
1981 
1983 {
1984  int status = DTDB_SUCCESS;
1985 
1987  if (filepath.empty()) {
1989  }
1990  NcFile* nc_input;
1991  try {
1992  nc_input = new NcFile(filepath, NcFile::read );
1993  }
1994  catch( NcException& e) {
1995  e.what();
1996  cerr << "DtLutNetcdf:: Failure opening netcdf LUT file: " + filepath << endl;
1997  return DTDB_FAIL;
1998  }
1999  NcGroup lut_grp = nc_input->getGroup( LUT_WATER_VAPOR );
2000 
2001  NcVar var = lut_grp.getVar ( "TRANSM_H20" );
2002  var.getVar( wv_lut.TRANSM_H20 );
2003 /*
2004  var = lut_grp.getVar ( "WEIGHTS" );
2005  var.getVar( wv_lut.WEIGHTS );
2006 
2007  var = lut_grp.getVar ( "REFL_CH2" );
2008  var.getVar( wv_lut.REFL_CH2 );
2009 
2010  var = lut_grp.getVar ( "RATIO_CH19_TO_CH2" );
2011  var.getVar( wv_lut.RATIO_CH19_TO_CH2 );
2012 */
2013  delete nc_input;
2014 
2015  return status;
2016 }
2017 
2018 
2019 /**************************************************************************
2020  * write_global_attributes()
2021  *
2022  * Write global attributes to specified netCDF file ID
2023  *
2024  **************************************************************************/
2025 
2027 {
2028  nc_output->putAtt( "processing_version", processing_version_);
2029  nc_output->putAtt( "Conventions", Conventions_);
2030  nc_output->putAtt( "institution", institution_);
2031  nc_output->putAtt( "license", license_);
2032  nc_output->putAtt( "naming_authority", naming_authority_);
2033  nc_output->putAtt( "date_created", date_created_);
2034  nc_output->putAtt( "ProductionTime", date_created_);
2035  nc_output->putAtt( "keywords_vocabulary", keywords_vocabulary_);
2036  nc_output->putAtt( "stdname_vocabulary", stdname_vocabulary_);
2037  nc_output->putAtt( "creator_name", creator_name_);
2038  nc_output->putAtt( "creator_email", creator_email_);
2039  nc_output->putAtt( "creator_url", creator_url_);
2040  nc_output->putAtt( "project", project_);
2041  nc_output->putAtt( "publisher_name", publisher_name_);
2042  nc_output->putAtt( "publisher_url", publisher_url_);
2043  nc_output->putAtt( "publisher_email", publisher_email_);
2044  nc_output->putAtt( "processing_level", processing_level_);
2045  nc_output->putAtt( "cdm_data_type", cdm_data_type_);
2046  nc_output->putAtt( "orbit_number", ncInt, orbit_number_);
2047  nc_output->putAtt( "history", history_);
2048  nc_output->putAtt( "source", source_files_);
2049  nc_output->putAtt( "time_coverage_start", time_coverage_start_);
2050  nc_output->putAtt( "time_coverage_end", time_coverage_end_);
2051  string pge_name_ = basename((char*)get_option("PGE_Name").c_str());
2052  if (!pge_name_.empty()) {
2053  nc_output->putAtt("PGE_Name",pge_name_);
2054  }
2055  string versionid_ = basename((char*)get_option("VersionID").c_str());
2056  if (!versionid_.empty()) {
2057  nc_output->putAtt("VersionId",versionid_);
2058  }
2059 
2060  nc_output->putAtt( "format_version", ncInt, format_version_);
2061  nc_output->putAtt( "instrument_number", ncInt, instrument_number_);
2062 
2063  return DTDB_SUCCESS;
2064 }
2065 
2066 /**************************************************************************
2067  * NAME: isPlatformLittleEndian()
2068  *
2069  * DESCRIPTION: Determine if target platform is little endian.
2070  * Return true if platform is little endian.
2071  *
2072  *************************************************************************/
2073 
2075 {
2076  unsigned short checkValue = 0xAABB;
2077  unsigned char* bytePtr = reinterpret_cast<unsigned char*>(&checkValue);
2078 
2079  if (bytePtr[0] == 0xAA) // big-endian
2080  {
2081  return false;
2082  }
2083  else // little-endian
2084  {
2085  return true;
2086  }
2087 }
2088 
2089 
float SBAR_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0]
Definition: DtLutNetcdf.h:102
const string LUT_WATER_VAPOR
Definition: DDOptions.cpp:128
an array had not been initialized Several spelling and grammar corrections were which is read from the appropriate MCF the above metadata values were hard coded A problem calculating the average background DN for SWIR bands when the moon is in the space view port was corrected The new algorithm used to calculate the average background DN for all reflective bands when the moon is in the space view port is now the same as the algorithm employed by the thermal bands For non SWIR changes in the averages are typically less than Also for non SWIR the black body DNs remain a backup in case the SV DNs are not available For SWIR the changes in computed averages were larger because the old which used the black body suffered from contamination by the micron leak As a consequence of the if SV DNs are not available for the SWIR the EV pixels will not be the granule time is used to identify the appropriate tables within the set given for one LUT the first two or last two tables respectively will be used for the interpolation If there is only one LUT in the set of it will be treated as a constant LUT The manner in which Earth View data is checked for saturation was changed Previously the raw Earth View DNs and Space View DNs were checked against the lookup table values contained in the table dn_sat The change made is to check the raw Earth and Space View DNs to be sure they are less than the maximum saturation value and to check the Space View subtracted Earth View dns against a set of values contained in the new lookup table dn_sat_ev The metadata configuration and ASSOCIATEDINSTRUMENTSHORTNAME from the MOD02HKM product The same metatdata with extensions and were removed from the MOD021KM and MOD02OBC products ASSOCIATEDSENSORSHORTNAME was set to MODIS in all products These changes are reflected in new File Specification which users may consult for exact the pow functions were eliminated in Emissive_Cal and Emissive bands replaced by more efficient code Other calculations throughout the code were also made more efficient Aside from a few round off there was no difference to the product The CPU time decreased by about for a day case and for a night case A minor bug in calculating the uncertainty index for emissive bands was corrected The frame index(0-based) was previously being used the frame number(1-based) should have been used. There were only a few minor changes to the uncertainty index(maximum of 1 digit). 3. Some inefficient arrays(Sigma_RVS_norm_sq) were eliminated and some code lines in Preprocess_L1A_Data were moved into Process_OBCEng_Emiss. There were no changes to the product. Required RAM was reduced by 20 MB. Now
NcDim num_land_the_dim_
Definition: DtLutNetcdf.h:388
string publisher_url_
Definition: DtLutNetcdf.h:201
int read_grib_hdf(const string filepath, dtGribLUT *grib_lut)
int read_land_aerosol_map(const string groupname, dtLandAerosolLUT *la_lut)
const string LUT_GAS_CORRECTION
Definition: DDOptions.cpp:125
int read_gas_correction_lut(dtGasCorrectionLUT &gc_lut)
int read_grib_lut(dtGribLUT &grib_lut)
int j
Definition: decode_rs.h:73
string naming_authority_
Definition: DtLutNetcdf.h:192
float ALBEDO_R_SMALL[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0]
Definition: DtLutNetcdf.h:140
int status
Definition: l1_czcs_hdf.c:32
const string INPUT_LAND_W0645
Definition: DDOptions.cpp:63
float ASSYMBIG[NWAV][NUM_CASES_BIG][NUM_LUTS]
Definition: DtLutNetcdf.h:152
float QEXT_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:98
float Fd_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0]
Definition: DtLutNetcdf.h:104
float EFFRADSMALL[NUM_CASES_SMALL]
Definition: DtLutNetcdf.h:146
float AINTS[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0][NTHET][NPHI]
Definition: DtLutNetcdf.h:144
int initialize()
Definition: DtLutNetcdf.cpp:52
NcDim num_ocean_phi_dim_
Definition: DtLutNetcdf.h:395
int read_ocean_small_aerosol_file(const string groupname, int wnum, dtOceanAerosolLUT *soa_lut)
NcDim num_ocean_moments_dim_
Definition: DtLutNetcdf.h:403
const string INPUT_NC4_LUT
Definition: DDOptions.cpp:118
int read_gas_correction_file(dtGasCorrectionLUT *gc_lut)
NcDim num_ocean_wslut_dim_
Definition: DtLutNetcdf.h:402
float OPT_O3_CLIM[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:78
float ALBEDOSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS]
Definition: DtLutNetcdf.h:139
string keywords_vocabulary_
Definition: DtLutNetcdf.h:194
const string INPUT_TRANSM_H2O_1
Definition: DDOptions.cpp:67
float OPTH_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:94
#define NULL
Definition: decode_rs.h:63
NcDim num_land_lons_dim_
Definition: DtLutNetcdf.h:386
string source_files_
Definition: DtLutNetcdf.h:207
float pwat[LAT_BINS][LON_BINS]
Definition: DtLutNetcdf.h:65
int write_water_vapor_lut(NcFile *nc_output, dtWaterVaporLUT *oa_lut)
int read_transm_h2o_file(const string groupname, int num, dtWaterVaporLUT *wv_lut)
int read_ch2_reflectance_file(const string groupname, dtWaterVaporLUT *la_lut)
string get_option(const string &name)
Definition: DDOptions.cpp:211
float THE_NL[NLTHE]
Definition: DtLutNetcdf.h:90
const string INPUT_LAND_W0554
Definition: DDOptions.cpp:62
const string LUT_LAND_AEROSOL
Definition: DDOptions.cpp:126
NcDim num_ocean_the_dim_
Definition: DtLutNetcdf.h:396
string license_
Definition: DtLutNetcdf.h:191
float EXTNORM_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:96
float TRANSM_H20[TRANSM_H2O_TABLES][TRANSM_H2O_ROWS][TRANSM_H2O_VALS]
Definition: DtLutNetcdf.h:171
const string INPUT_LAND_W2113
Definition: DDOptions.cpp:64
NcDim num_land_wav_dim_
Definition: DtLutNetcdf.h:391
const string INPUT_LAND_MAP
Definition: DDOptions.cpp:65
const string INPUT_OCEAN_SMALL2
Definition: DDOptions.cpp:58
int read_ch19_to_ch2_ratio_file(const string groupname, dtWaterVaporLUT *la_lut)
string publisher_name_
Definition: DtLutNetcdf.h:200
float THET[NTHET]
Definition: DtLutNetcdf.h:128
const string NETCDF_LUT_PATH
Definition: DDOptions.cpp:194
const string INPUT_TRANSM_H2O_6
Definition: DDOptions.cpp:72
float vgrd[LAT_BINS][LON_BINS]
Definition: DtLutNetcdf.h:64
@ string
float ALBEDO_T_SMALL[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0]
Definition: DtLutNetcdf.h:141
float GOD[NLUTWAV]
Definition: DtLutNetcdf.h:108
NcDim num_h2o_rows_dim_
Definition: DtLutNetcdf.h:405
string institution_
Definition: DtLutNetcdf.h:190
float MU0_NL[NLTHET0]
Definition: DtLutNetcdf.h:92
string cdm_data_type_
Definition: DtLutNetcdf.h:204
NcDim num_land_tau_dim_
Definition: DtLutNetcdf.h:390
float BEXT_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:99
float ozone[LAT_BINS][LON_BINS]
Definition: DtLutNetcdf.h:66
const string INPUT_TRANSM_H2O_4
Definition: DDOptions.cpp:70
const string INPUT_DT_NC4_LUT
Definition: DDOptions.cpp:119
float INT_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0][NLTHE][NLPHI]
Definition: DtLutNetcdf.h:103
int orbit_number_
Definition: DtLutNetcdf.h:205
float MOMENTSBIG[NUM_CASES_BIG][NUM_MOMENTS][NUM_LUTS]
Definition: DtLutNetcdf.h:150
string processing_version_
Definition: DtLutNetcdf.h:188
int read_land_aerosol_lut(dtLandAerosolLUT &la_lut)
string project_
Definition: DtLutNetcdf.h:199
NcDim num_gc_O3_coef_dim_
Definition: DtLutNetcdf.h:383
float O3_COEF[NUM_DT_BANDS][2]
Definition: DtLutNetcdf.h:81
const string INPUT_GRIB
Definition: DDOptions.cpp:50
string stdname_vocabulary_
Definition: DtLutNetcdf.h:195
float TAUAB[NWAV][NUM_CASES_BIG][NAOT]
Definition: DtLutNetcdf.h:157
string date_created_
Definition: DtLutNetcdf.h:193
static void byteSwap(T &aValue)
Definition: DtLutNetcdf.h:427
int read_land_aerosol_file(const string groupname, int wnum, dtLandAerosolLUT *la_lut)
float EXTBIG[NWAV][NUM_CASES_BIG][NUM_LUTS]
Definition: DtLutNetcdf.h:147
string path
Definition: color_dtdb.py:221
float RGSS[NUM_CASES_SMALL]
Definition: DtLutNetcdf.h:133
float H2O_COEF[NUM_DT_BANDS][3]
Definition: DtLutNetcdf.h:82
string time_coverage_end_
Definition: DtLutNetcdf.h:209
NcDim num_ocean_wave_dim_
Definition: DtLutNetcdf.h:399
float ALBEDO_R_BIG[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0]
Definition: DtLutNetcdf.h:154
constexpr int NUM_DT_BANDS
Definition: DtLutNetcdf.h:70
float WAVE[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:76
float ALBEDO_R_RAY[NWAV][NTH0]
Definition: DtLutNetcdf.h:142
int MBAND[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:74
float OPT_CO2_CLIM[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:80
NcDim num_ocean_tau_dim_
Definition: DtLutNetcdf.h:398
const string INPUT_TRANSM_H2O_3
Definition: DDOptions.cpp:69
float MOL[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:77
float MOMENTSSMALL[NUM_CASES_SMALL][NUM_MOMENTS][NUM_LUTS]
Definition: DtLutNetcdf.h:135
string publisher_email_
Definition: DtLutNetcdf.h:202
NcDim num_land_table_dim_
Definition: DtLutNetcdf.h:392
float MASSCOEF_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:95
float RGSB[NUM_CASES_BIG]
Definition: DtLutNetcdf.h:148
float EFFRADBIG[NUM_CASES_BIG]
Definition: DtLutNetcdf.h:158
const string INPUT_OCEAN_BIG3
Definition: DDOptions.cpp:55
NcDim num_ocean_caseb_dim_
Definition: DtLutNetcdf.h:401
float BACKSCTTBIG[NWAV][NUM_CASES_BIG][NUM_LUTS]
Definition: DtLutNetcdf.h:151
const string INPUT_TRANSM_H2O_2
Definition: DDOptions.cpp:68
int format_version_
Definition: DtLutNetcdf.h:210
float THET0_NL[NLTHET0]
Definition: DtLutNetcdf.h:91
const string INPUT_OCEAN_SMALL1
Definition: DDOptions.cpp:57
float REF_RAYALL[NWAV][NUM_LUTS][NTH0][NTHET][NPHI]
Definition: DtLutNetcdf.h:131
#define NUM_SEASONS
Definition: AfrtConstants.h:32
int read_grib_bin(const string filepath, dtGribLUT *grib_lut)
NcDim num_gc_H2O_coef_dim_
Definition: DtLutNetcdf.h:384
float WEIGHTS[TRANSM_H2O_ROWS][WEIGHT_VALS]
Definition: DtLutNetcdf.h:172
float REFL_CH2[REFL_CH2_ROWS][REFL_CH2_VALS]
Definition: DtLutNetcdf.h:173
float OPT_H2O_CLIM[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:79
NcDim num_land_season_dim_
Definition: DtLutNetcdf.h:394
int read_water_vapor_lut(dtWaterVaporLUT &wv_lut)
string filepath
Definition: color_dtdb.py:207
string creator_url_
Definition: DtLutNetcdf.h:198
bool isPlatformLittleEndian()
#define basename(s)
Definition: l0chunk_modis.c:29
float MEXT_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:101
int read_ozone(const string filepath, dtGribLUT *grib_lut)
int write_land_aerosol_lut(NcFile *nc_output, dtLandAerosolLUT *la_lut)
string history_
Definition: DtLutNetcdf.h:206
string creator_email_
Definition: DtLutNetcdf.h:197
float ALBEDOBIG[NWAV][NUM_CASES_BIG][NUM_LUTS]
Definition: DtLutNetcdf.h:153
const string INPUT_GAS_CORRECTION
Definition: DDOptions.cpp:47
float SSA_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:97
string time_coverage_start_
Definition: DtLutNetcdf.h:208
NcDim num_ocean_cases_dim_
Definition: DtLutNetcdf.h:400
int read_weight_table_file(const string groupname, dtWaterVaporLUT *la_lut)
Extra metadata that will be written to the HDF4 file l2prod rank
float CCNSMALL[NUM_CASES_SMALL][NUM_LUTS]
Definition: DtLutNetcdf.h:136
NcDim num_gc_dt_bands_dim_
Definition: DtLutNetcdf.h:382
float THET0[NTH0]
Definition: DtLutNetcdf.h:129
NcDim num_land_size_dim_
Definition: DtLutNetcdf.h:393
float ALBEDO_T_RAY[NWAV][NTH0]
Definition: DtLutNetcdf.h:143
int write_global_attributes(NcFile *nc_output)
NcDim num_land_phi_dim_
Definition: DtLutNetcdf.h:387
int instrument_number_
Definition: DtLutNetcdf.h:211
const string INPUT_LAND_W0466
Definition: DDOptions.cpp:61
int AEROSOL_ALL[NUM_SEASONS][NUM_LATS][NUM_LONS]
Definition: DtLutNetcdf.h:88
NcDim num_ocean_thet0_dim_
Definition: DtLutNetcdf.h:397
const string INPUT_OCEAN_BIG4
Definition: DDOptions.cpp:56
string Conventions_
Definition: DtLutNetcdf.h:189
const string INPUT_OCEAN_BIG1
Definition: DDOptions.cpp:53
string creator_name_
Definition: DtLutNetcdf.h:196
NcDim num_land_thet0_dim_
Definition: DtLutNetcdf.h:389
const string LUT_OCEAN_AEROSOL
Definition: DDOptions.cpp:127
float PHC[NPHI]
Definition: DtLutNetcdf.h:127
const string INPUT_TRANSM_H2O_5
Definition: DDOptions.cpp:71
float SIGMAB[NUM_CASES_BIG]
Definition: DtLutNetcdf.h:149
float VEXT_NL0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:100
int write_gas_correction_lut(NcFile *nc_output, dtGasCorrectionLUT *gc_lut)
float AINTB[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0][NTHET][NPHI]
Definition: DtLutNetcdf.h:156
float SIGMAS[NUM_CASES_SMALL]
Definition: DtLutNetcdf.h:134
float ROD[NLUTWAV]
Definition: DtLutNetcdf.h:107
float OMEGA0[NLTABLE][NLUTWAV][NLTAU]
Definition: DtLutNetcdf.h:106
float PHI_NL[NLPHI]
Definition: DtLutNetcdf.h:89
int read_ocean_aerosol_lut(dtOceanAerosolLUT &lo_lut)
const string INPUT_OZONE
Definition: DDOptions.cpp:51
int i
Definition: decode_rs.h:71
float ASSYMSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS]
Definition: DtLutNetcdf.h:138
NcDim num_h2o_vals_dim_
Definition: DtLutNetcdf.h:406
float T_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0][NLTHE]
Definition: DtLutNetcdf.h:105
string processing_level_
Definition: DtLutNetcdf.h:203
float WAVE[NWAV]
Definition: DtLutNetcdf.h:130
int VBAND[NUM_DT_BANDS]
Definition: DtLutNetcdf.h:75
float EXTSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS]
Definition: DtLutNetcdf.h:132
NcDim num_land_lats_dim_
Definition: DtLutNetcdf.h:385
int k
Definition: decode_rs.h:73
const string INPUT_OCEAN_SMALL4
Definition: DDOptions.cpp:60
int create_dt_nc4_lut()
Definition: DtLutNetcdf.cpp:64
float ugrd[LAT_BINS][LON_BINS]
Definition: DtLutNetcdf.h:63
float RATIO_CH19_TO_CH2[REFL_CH2_ROWS][REFL_CH2_VALS]
Definition: DtLutNetcdf.h:174
float TAUAS[NWAV][NUM_CASES_SMALL][NAOT]
Definition: DtLutNetcdf.h:145
const string INPUT_OCEAN_SMALL3
Definition: DDOptions.cpp:59
int read_ocean_big_aerosol_file(const string groupname, int wnum, dtOceanAerosolLUT *boa_lut)
float BACKSCTTSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS]
Definition: DtLutNetcdf.h:137
const string INPUT_OCEAN_BIG2
Definition: DDOptions.cpp:54
int write_ocean_aerosol_lut(NcFile *nc_output, dtOceanAerosolLUT *oa_lut)
float ALBEDO_T_BIG[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0]
Definition: DtLutNetcdf.h:155
NcDim num_h2o_tables_dim_
Definition: DtLutNetcdf.h:404
float WAV_NL[NLUTWAV]
Definition: DtLutNetcdf.h:93