OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
DtLutNetcdf.h
Go to the documentation of this file.
1 /******************************************************************************
2  * NAME: DtLutNetcdf.h
3  *
4  * DESCRIPTION: Object class that generates a netCDF4 LUT.
5  *
6  * Created on: April 25, 2017
7  * Author: Sam Anderson
8  *
9  *
10  ******************************************************************************/
11 
12 
13 #ifndef DtLutNetcdf_H_
14 #define DtLutNetcdf_H_
15 
16 #include <netcdf>
17 #include <DDProcess.h>
18 
19 using namespace std;
20 using namespace netCDF;
21 using namespace netCDF::exceptions;
22 
23 static const int LON_BINS = 360;
24 static const int LAT_BINS = 181;
25 static const int DATA_BINS = 55;
26 static const int GRIB_ARRAY_SIZE = LON_BINS*LAT_BINS*DATA_BINS*4;
27 static const int GRIB_ROW_SIZE = LON_BINS*LAT_BINS*4;
28 static const int NUM_CASES_SMALL = 4;
29 static const int NUM_CASES_BIG = 5;
30 static const int NUM_MOMENTS = 4;
31 static const int NUM_LUTS = 4;
32 static const int NUM_LATS = 180;
33 static const int NUM_LONS = 360;
34 static const int NUMCASES = 4;
35 static const int NUMCASEB = 5;
36 static const int NWAV = 7;
37 static const int NAOT = 6;
38 static const int NTH0 = 11;
39 static const int NTHET = 16;
40 static const int NPHI = 16;
41 static const int NUM_SOLUTIONS = 2;
42 static const int NLUTWAV = 4;
43 static const int NLTHET0 = 11;
44 static const int NLTHE = 15;
45 static const int NLPHI = 16;
46 static const int NLTAU = 7;
47 static const int NLTABLE = 5;
48 static const int NLETA = 13;
49 static const int NLSIZE = 2;
50 static const int DTABLE = 5;
51 static const int O3_COEFS = 2;
52 static const int H2O_COEFS = 3;
53 static const int IW550 = 1;
54 
55 //GRIB Data LUT
56 struct GDAS
57 {
58  float data[DATA_BINS][LAT_BINS][LON_BINS];
59 };
60 
61 struct dtGribLUT
62 {
63  float ugrd[LAT_BINS][LON_BINS];
64  float vgrd[LAT_BINS][LON_BINS];
65  float pwat[LAT_BINS][LON_BINS];
66  float ozone[LAT_BINS][LON_BINS];
67 };
68 
69 // Gas Correction data from LUT
70 constexpr int NUM_DT_BANDS = 10;
71 
73 {
74  int MBAND[NUM_DT_BANDS];
75  int VBAND[NUM_DT_BANDS];
76  float WAVE[NUM_DT_BANDS];
77  float MOL[NUM_DT_BANDS];
78  float OPT_O3_CLIM[NUM_DT_BANDS];
79  float OPT_H2O_CLIM[NUM_DT_BANDS];
80  float OPT_CO2_CLIM[NUM_DT_BANDS];
81  float O3_COEF[NUM_DT_BANDS][2];
82  float H2O_COEF[NUM_DT_BANDS][3];
83 };
84 
85 // Land aerosol LUT
87 {
88  int AEROSOL_ALL[NUM_SEASONS][NUM_LATS][NUM_LONS];
89  float PHI_NL[NLPHI];
90  float THE_NL[NLTHE];
91  float THET0_NL[NLTHET0];
92  float MU0_NL[NLTHET0];
93  float WAV_NL[NLUTWAV];
94  float OPTH_NL0[NLTABLE][NLUTWAV][NLTAU];
95  float MASSCOEF_NL0[NLTABLE][NLUTWAV][NLTAU]; // Mass Coefficient
96  float EXTNORM_NL0[NLTABLE][NLUTWAV][NLTAU]; // Extinction
97  float SSA_NL0[NLTABLE][NLUTWAV][NLTAU];
98  float QEXT_NL0[NLTABLE][NLUTWAV][NLTAU];
99  float BEXT_NL0[NLTABLE][NLUTWAV][NLTAU];
100  float VEXT_NL0[NLTABLE][NLUTWAV][NLTAU];
101  float MEXT_NL0[NLTABLE][NLUTWAV][NLTAU];
102  float SBAR_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0];
103  float INT_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0][NLTHE][NLPHI];
104  float Fd_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0]; // Downward Flux
105  float T_NL0[NLTABLE][NLUTWAV][NLTAU][NLTHET0][NLTHE]; // Atmospheric transmission
106  float OMEGA0[NLTABLE][NLUTWAV][NLTAU];
107  float ROD[NLUTWAV];
108  float GOD[NLUTWAV];
109  float OPTH_NL1[NLSIZE][NLUTWAV][NLTAU];
110  float MASSCOEF_NL1[NLSIZE][NLUTWAV][NLTAU];
111  float EXTNORM_NL1[NLSIZE][NLUTWAV][NLTAU];
112  float SSA_NL1[NLSIZE][NLUTWAV][NLTAU];
113  float QEXT_NL1[NLSIZE][NLUTWAV][NLTAU];
114  float BEXT_NL1[NLSIZE][NLUTWAV][NLTAU];
115  float VEXT_NL1[NLSIZE][NLUTWAV][NLTAU];
116  float MEXT_NL1[NLSIZE][NLUTWAV][NLTAU];
117  float SBAR_NL1[NLSIZE][NLUTWAV][NLTAU][NLTHET0];
118  float INT_NL1[NLSIZE][NLUTWAV][NLTAU][NLTHET0][NLTHE][NLPHI];
119  float Fd_NL1[NLSIZE][NLUTWAV][NLTAU][NLTHET0];
120  float T_NL1[NLSIZE][NLUTWAV][NLTAU][NLTHET0][NLTHE];
121 };
122 
123 // Ocean aerosol LUTs
125 {
126  int JPHI[NPHI];
127  float PHC[NPHI];
128  float THET[NTHET];
129  float THET0[NTH0];
130  float WAVE[NWAV];
131  float REF_RAYALL[NWAV][NUM_LUTS][NTH0][NTHET][NPHI];
132  float EXTSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS];
133  float RGSS[NUM_CASES_SMALL];
134  float SIGMAS[NUM_CASES_SMALL];
135  float MOMENTSSMALL[NUM_CASES_SMALL][NUM_MOMENTS][NUM_LUTS];
136  float CCNSMALL[NUM_CASES_SMALL][NUM_LUTS];
137  float BACKSCTTSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS];
138  float ASSYMSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS];
139  float ALBEDOSMALL[NWAV][NUM_CASES_SMALL][NUM_LUTS];
140  float ALBEDO_R_SMALL[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0];
141  float ALBEDO_T_SMALL[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0];
142  float ALBEDO_R_RAY[NWAV][NTH0];
143  float ALBEDO_T_RAY[NWAV][NTH0];
144  float AINTS[NWAV][NUM_CASES_SMALL][NAOT][NUM_LUTS][NTH0][NTHET][NPHI];
145  float TAUAS[NWAV][NUM_CASES_SMALL][NAOT];
146  float EFFRADSMALL[NUM_CASES_SMALL];
147  float EXTBIG[NWAV][NUM_CASES_BIG][NUM_LUTS];
148  float RGSB[NUM_CASES_BIG];
149  float SIGMAB[NUM_CASES_BIG];
150  float MOMENTSBIG[NUM_CASES_BIG][NUM_MOMENTS][NUM_LUTS];
151  float BACKSCTTBIG[NWAV][NUM_CASES_BIG][NUM_LUTS];
152  float ASSYMBIG[NWAV][NUM_CASES_BIG][NUM_LUTS];
153  float ALBEDOBIG[NWAV][NUM_CASES_BIG][NUM_LUTS];
154  float ALBEDO_R_BIG[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0];
155  float ALBEDO_T_BIG[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0];
156  float AINTB[NWAV][NUM_CASES_BIG][NAOT][NUM_LUTS][NTH0][NTHET][NPHI];
157  float TAUAB[NWAV][NUM_CASES_BIG][NAOT];
158  float EFFRADBIG[NUM_CASES_BIG];
159 };
160 
161 // Water Vapor LUTs
162 static const int TRANSM_H2O_TABLES = 6;
163 static const int TRANSM_H2O_ROWS = 220;
164 static const int TRANSM_H2O_VALS = 6;
165 static const int REFL_CH2_ROWS = 158080;
166 static const int REFL_CH2_VALS = 7;
167 static const int WEIGHT_VALS = 3;
168 
170 {
171  float TRANSM_H20[TRANSM_H2O_TABLES][TRANSM_H2O_ROWS][TRANSM_H2O_VALS];
172  float WEIGHTS[TRANSM_H2O_ROWS][WEIGHT_VALS];
173  float REFL_CH2[REFL_CH2_ROWS][REFL_CH2_VALS];
174  float RATIO_CH19_TO_CH2[REFL_CH2_ROWS][REFL_CH2_VALS];
175 };
176 
178 {
179 
180 public:
181 
182  // file attributes
183  string lut_title_ ;
184  string lut_prod_name_ ;
185 
186  // global attributes:
187  string sensor_ ;
189  string Conventions_ ;
190  string institution_;
191  string license_ ;
193  string date_created_ ;
198  string creator_url_;
199  string project_;
206  string history_;
212 
213 
218  DtLutNetcdf();
219 
224  ~DtLutNetcdf();
225 
230  int initialize();
231 
236  int create_dt_nc4_lut();
237 
242  int read_grib_lut( dtGribLUT &grib_lut );
243  int read_gas_correction_lut( dtGasCorrectionLUT &gc_lut );
244  int read_land_aerosol_lut( dtLandAerosolLUT &la_lut );
245  int read_ocean_aerosol_lut( dtOceanAerosolLUT &lo_lut );
246  int read_water_vapor_lut( dtWaterVaporLUT &wv_lut );
247 
248  void setHistory(std::string history) {history_ = history;}
249  std::string getHistory() {return history_;}
250 
251 protected:
252 
257  int read_grib_bin( const string filepath, dtGribLUT* grib_lut );
258 
263  int read_grib_hdf( const string filepath, dtGribLUT* grib_lut );
264 
269  int read_ozone( const string filepath, dtGribLUT* grib_lut );
270 
275  int read_gas_correction_file( dtGasCorrectionLUT* gc_lut );
276 
281  int read_land_aerosol_file( const string groupname, int wnum,
282  dtLandAerosolLUT* la_lut );
283 
288  int read_land_aerosol_map( const string groupname,
289  dtLandAerosolLUT* la_lut );
290 
295  int read_ocean_big_aerosol_file(const string groupname, int wnum,
296  dtOceanAerosolLUT* boa_lut );
297 
302  int read_ocean_small_aerosol_file(const string groupname, int wnum,
303  dtOceanAerosolLUT* soa_lut );
304 
309  int read_transm_h2o_file(const string groupname, int num,
310  dtWaterVaporLUT* wv_lut );
311 
316  int read_ch2_reflectance_file( const string groupname,
317  dtWaterVaporLUT* la_lut );
318 
323  int read_ch19_to_ch2_ratio_file( const string groupname,
324  dtWaterVaporLUT* la_lut );
325 
330  int read_weight_table_file( const string groupname,
331  dtWaterVaporLUT* la_lut );
332 
337  int write_global_attributes( NcFile* nc_output );
338 
343  bool isPlatformLittleEndian();
344 
349  int write_grib_lut( NcFile* nc_output, dtGribLUT* grib_lut );
350 
355  int write_gas_correction_lut( NcFile* nc_output, dtGasCorrectionLUT* gc_lut );
356 
361  int write_land_aerosol_lut( NcFile* nc_output, dtLandAerosolLUT* la_lut );
362 
367  int write_ocean_aerosol_lut( NcFile* nc_output, dtOceanAerosolLUT* oa_lut );
368 
373  int write_water_vapor_lut( NcFile* nc_output, dtWaterVaporLUT* oa_lut );
374 
375 
376  // Dimensions
377 
378  NcDim scalar_dim_;
410 
417  template<typename T>
418  static void byteSwap(T& aValue);
419 
420 };
421 
422 //---------------------------------------------------------------------------
423 // Converts the endianness of the parameter by performing the appropriate
424 // byte swapping.
425 //---------------------------------------------------------------------------
426 template<typename T>
427 void DtLutNetcdf::byteSwap(T& aValue)
428 {
429  T tempValue = aValue; // a temporary copy of the value
430 
431  // Pointers to the first byte of both variables
432  unsigned char* aValuePtr = reinterpret_cast<unsigned char*>(&aValue);
433  unsigned char* tempValuePtr = reinterpret_cast<unsigned char*>(&tempValue);
434 
435  // Swap the byte order
436  for (unsigned int byte = 0; byte < sizeof(aValue); ++byte)
437  {
438  aValuePtr[byte] = tempValuePtr[(sizeof(aValue) - 1) - byte];
439  }
440 }
441 
442 
443 #endif /* DtLutNetcdf_H_ */
std::string getHistory()
Definition: DtLutNetcdf.h:249
NcDim num_land_the_dim_
Definition: DtLutNetcdf.h:388
NcDim num_weight_vals_dim_
Definition: DtLutNetcdf.h:407
string publisher_url_
Definition: DtLutNetcdf.h:201
NcDim num_grib_lat_bins_dim_
Definition: DtLutNetcdf.h:380
string lut_prod_name_
Definition: DtLutNetcdf.h:184
string naming_authority_
Definition: DtLutNetcdf.h:192
NcDim num_ocean_phi_dim_
Definition: DtLutNetcdf.h:395
NcDim num_ocean_moments_dim_
Definition: DtLutNetcdf.h:403
NcDim num_ocean_wslut_dim_
Definition: DtLutNetcdf.h:402
string keywords_vocabulary_
Definition: DtLutNetcdf.h:194
NcDim num_land_lons_dim_
Definition: DtLutNetcdf.h:386
string source_files_
Definition: DtLutNetcdf.h:207
void initialize(int pixref_flag, int blkref_flag)
Definition: Usds.c:1371
void setHistory(std::string history)
Definition: DtLutNetcdf.h:248
NcDim num_ocean_the_dim_
Definition: DtLutNetcdf.h:396
string license_
Definition: DtLutNetcdf.h:191
string sensor_
Definition: DtLutNetcdf.h:187
NcDim num_land_wav_dim_
Definition: DtLutNetcdf.h:391
NcDim num_ch2_vals_dim_
Definition: DtLutNetcdf.h:409
string publisher_name_
Definition: DtLutNetcdf.h:200
@ string
NcDim num_h2o_rows_dim_
Definition: DtLutNetcdf.h:405
string institution_
Definition: DtLutNetcdf.h:190
string cdm_data_type_
Definition: DtLutNetcdf.h:204
NcDim num_land_tau_dim_
Definition: DtLutNetcdf.h:390
int orbit_number_
Definition: DtLutNetcdf.h:205
string processing_version_
Definition: DtLutNetcdf.h:188
string project_
Definition: DtLutNetcdf.h:199
NcDim num_gc_O3_coef_dim_
Definition: DtLutNetcdf.h:383
string stdname_vocabulary_
Definition: DtLutNetcdf.h:195
string date_created_
Definition: DtLutNetcdf.h:193
static void byteSwap(T &aValue)
Definition: DtLutNetcdf.h:427
string time_coverage_end_
Definition: DtLutNetcdf.h:209
NcDim num_ocean_wave_dim_
Definition: DtLutNetcdf.h:399
constexpr int NUM_DT_BANDS
Definition: DtLutNetcdf.h:70
NcDim num_ocean_tau_dim_
Definition: DtLutNetcdf.h:398
string publisher_email_
Definition: DtLutNetcdf.h:202
NcDim num_land_table_dim_
Definition: DtLutNetcdf.h:392
NcDim num_ocean_caseb_dim_
Definition: DtLutNetcdf.h:401
int format_version_
Definition: DtLutNetcdf.h:210
string history
Definition: ncattredit.py:30
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude data
Definition: HISTORY.txt:356
#define NUM_SEASONS
Definition: AfrtConstants.h:32
NcDim num_gc_H2O_coef_dim_
Definition: DtLutNetcdf.h:384
NcDim num_land_season_dim_
Definition: DtLutNetcdf.h:394
string filepath
Definition: color_dtdb.py:207
string creator_url_
Definition: DtLutNetcdf.h:198
NcDim num_ch2_rows_dim_
Definition: DtLutNetcdf.h:408
NcDim num_grib_lon_bins_dim_
Definition: DtLutNetcdf.h:381
string history_
Definition: DtLutNetcdf.h:206
string creator_email_
Definition: DtLutNetcdf.h:197
string time_coverage_start_
Definition: DtLutNetcdf.h:208
NcDim scalar_dim_
Definition: DtLutNetcdf.h:378
NcDim num_ocean_cases_dim_
Definition: DtLutNetcdf.h:400
NcDim num_gc_dt_bands_dim_
Definition: DtLutNetcdf.h:382
NcDim num_grib_data_bins_dim_
Definition: DtLutNetcdf.h:379
NcDim num_land_size_dim_
Definition: DtLutNetcdf.h:393
NcDim num_land_phi_dim_
Definition: DtLutNetcdf.h:387
int instrument_number_
Definition: DtLutNetcdf.h:211
NcDim num_ocean_thet0_dim_
Definition: DtLutNetcdf.h:397
string Conventions_
Definition: DtLutNetcdf.h:189
string creator_name_
Definition: DtLutNetcdf.h:196
NcDim num_land_thet0_dim_
Definition: DtLutNetcdf.h:389
string lut_title_
Definition: DtLutNetcdf.h:183
NcDim num_h2o_vals_dim_
Definition: DtLutNetcdf.h:406
string processing_level_
Definition: DtLutNetcdf.h:203
NcDim num_land_lats_dim_
Definition: DtLutNetcdf.h:385
#define byte
Definition: input_s.h:5
NcDim num_h2o_tables_dim_
Definition: DtLutNetcdf.h:404