ocssw  1.0
/disk01/web/ocssw/build/src/l2gen_aquarius/l2gen_aquarius.h (r8085/r7936)
Go to the documentation of this file.
00001 #include <gsl/gsl_vector.h>
00002 #include <gsl/gsl_matrix.h>
00003 #include <gsl/gsl_interp.h>
00004 #include <gsl/gsl_linalg.h>
00005 #include <gsl/gsl_fit.h>
00006 #include <gsl/gsl_statistics.h>
00007 
00008 #define  AQUARIUS_L2PROD_DEFINE 1
00009 
00010 #include "hdf5_Aquarius.h"
00011 #include "hdf5util.h"
00012 #include "H5LTpublic.h"
00013 #include <clo.h>
00014 
00015 #define NUMBEAMPOL  NUMBER_OF_BEAMS*RADIOMETER_POLARIZATIONS
00016 #define NUMRADIOEAR NUMBEAMPOL*RADIOMETER_SIGNALS_PER_SUBCYCLE*RADIOMETER_SUBCYCLES
00017 #define NUMRADIOCND NUMBEAMPOL*RADIOMETER_SUBCYCLES
00018 #define NUMRADIOCAL NUMBEAMPOL*RADIOMETER_LONG_ACCUM
00019 
00020 #define MAXCYC      5000 // Compatibility with Wentz fortran arrays
00021 
00022 #define PRODSTRLEN     2048  /* String length limit for product spec */
00023 
00024 #define NZANG       1441
00025 #define NOMEGA      1441
00026 #define NLON_LND    2160
00027 #define NZANG_LND   2881
00028 
00029 #define NBIN_W      60
00030 #define NWIN_SC     40
00031 #define NBIN_WINX   40
00032 #define NBIN_WAVX   40
00033 
00034 #define RFI            0
00035 #define RAIN           2
00036 #define LAND           3
00037 #define ICE            4
00038 #define WIND           5
00039 #define TEMP           6
00040 #define FLUXD          7
00041 #define FLUXR          8
00042 #define SUNGLINT       9
00043 #define MOON          10
00044 #define GALACTIC      11
00045 #define NAV           12
00046 #define SAOVERFLOW    13
00047 #define ROUGH         14
00048 #define FLARE         15
00049 
00050 typedef struct input_struct {
00051   char ifile[FILENAME_MAX];
00052   char ofile[FILENAME_MAX];
00053   //  char pfile[FILENAME_MAX];
00054   char incalfilelist[FILENAME_MAX];
00055 
00056   char rad_landtables_file[FILENAME_MAX];
00057   char rad_landcorr_file[FILENAME_MAX];
00058   char rad_gainice_file[FILENAME_MAX];
00059   char rad_tausq_file[FILENAME_MAX];
00060 
00061   char rad_apc_file[FILENAME_MAX];
00062   char rad_sssalgo_file[FILENAME_MAX];
00063   char rad_galwind_file[FILENAME_MAX];
00064   char rad_sun_file[FILENAME_MAX];
00065   char rad_sunbak_file[FILENAME_MAX];
00066   char rad_oceanrefl_file[FILENAME_MAX];
00067   char rad_dtb_wind_file[FILENAME_MAX];
00068 
00069   char coeff_loss_file[FILENAME_MAX];
00070   char coeff_nl_file[FILENAME_MAX];
00071 
00072   char emiss_coeff_harm_file[FILENAME_MAX];
00073   char scat_coeff_harm_file[FILENAME_MAX];
00074   char dtbw_win_sigma_file[FILENAME_MAX];
00075   char dtbw_win_wav_file[FILENAME_MAX];
00076   char wind_errortab_file[FILENAME_MAX];
00077 
00078   char yancfile1[FILENAME_MAX];
00079   char yancfile2[FILENAME_MAX];
00080   char yancfile3[FILENAME_MAX];
00081 
00082   char l2prod[PRODSTRLEN];
00083   int8_t l2activeprodflag[MAXNAQPROD];
00084   double matchup_time;
00085   float matchup_lat;
00086   float matchup_lon;
00087   float matchup_delta_lat;
00088   float matchup_delta_lon;
00089   float matchup_min_dist;
00090   char matchup_lim_file[FILENAME_MAX];
00091   char scatter_basename[FILENAME_MAX];
00092   char pversion[64];
00093   char sss_algorithm[64];
00094 
00095   bool browse;
00096   bool iopt_rfi;
00097   //  bool iopt_drift;
00098   bool iopt_cal;
00099   bool iopt_nosa1;
00100   bool iopt_zero;
00101   //  bool use_scatwind; // Remove JMG 02/24/12
00102 
00103   double rpy_adj[3];
00104   float c_deltaTND[3][2][3];
00105   float ta_ocean_nom[NUMBER_OF_BEAMS*RADIOMETER_POLARIZATIONS];
00106 
00107   char radflaglimitsfile[FILENAME_MAX];
00108 
00109   char xrayfile1[FILENAME_MAX];
00110   char xrayfile2[FILENAME_MAX];
00111 
00112   char rad_offset_corr_file[FILENAME_MAX];
00113   char climate_sal_file[FILENAME_MAX];
00114 
00115   char rad_dta_gal_file[FILENAME_MAX];
00116 
00117   char anomaly_status[128];
00118 } instr;
00119 
00120 
00121 //      Instrument Temperature Structure
00122 typedef struct instrument_temp_struct {
00123   float T1 [MAXCYC][NUMBER_OF_BEAMS];
00124   float T2A[MAXCYC][NUMBER_OF_BEAMS];
00125   float T2B[MAXCYC][NUMBER_OF_BEAMS];
00126 
00127   float T3[MAXCYC][NUMBER_OF_BEAMS][2];
00128   float T4[MAXCYC][NUMBER_OF_BEAMS][2];
00129   float T5[MAXCYC][NUMBER_OF_BEAMS][2];
00130   float T0[MAXCYC][NUMBER_OF_BEAMS][2];
00131 
00132   float TCND_P[MAXCYC][NUMBER_OF_BEAMS][2];
00133   float TND_P [MAXCYC][NUMBER_OF_BEAMS][2];
00134   float TCND  [MAXCYC][NUMBER_OF_BEAMS][2];
00135 
00136   float TND          [MAXCYC][NUMBER_OF_BEAMS][2];
00137   float TND_offset   [MAXCYC][NUMBER_OF_BEAMS][2];
00138 
00139   float TDL          [MAXCYC][NUMBER_OF_BEAMS][2];
00140   float TDL_offset   [MAXCYC][NUMBER_OF_BEAMS][2];
00141 
00142   float Tdet[MAXCYC][NUMBER_OF_BEAMS][4];
00143 
00144 } itemp;
00145 
00146 
00147 typedef struct static_data_struct {
00148   float apc_matrix[NUMBER_OF_BEAMS][3][3];
00149   float apc_inverse[NUMBER_OF_BEAMS][3][3];
00150   float sss_coef[251][451][4];
00151   double time_sun[NZANG];
00152   float eia_sun[NUMBER_OF_BEAMS][NZANG];
00153   float tasun_dir_tab[NUMBER_OF_BEAMS][3][NZANG][NOMEGA];
00154   float tasun_ref_tab[NUMBER_OF_BEAMS][3][NZANG][NOMEGA];
00155   float tasun_bak_tab[NUMBER_OF_BEAMS][3][26][161];
00156   double time_galaxy[NZANG];
00157   float eia_galaxy[NUMBER_OF_BEAMS][NZANG];
00158   float tagal_dir_tab[NUMBER_OF_BEAMS][3][NZANG][NOMEGA];
00159   float tagal_ref_tab[5][NUMBER_OF_BEAMS][3][NZANG][NOMEGA];
00160   double dtagal_ref_tab[NZANG][NOMEGA][NUMBER_OF_BEAMS];
00161   float fpt_lnd[NUMBER_OF_BEAMS][NZANG_LND][NLON_LND];
00162   float frc_lnd[NUMBER_OF_BEAMS][NZANG_LND][NLON_LND];
00163   uint16_t landcorr[NUMBER_OF_BEAMS][2][12][1440][1440];
00164   float gain_ice[NUMBER_OF_BEAMS][151];
00165   uint16_t itau[91][12][180][360];
00166   double acoef[5][3][2][3];
00167   double bcoef[5][3][4][3];
00168   double arr_dtbw[NBIN_W][NBIN_W][NUMBER_OF_BEAMS][2][3];
00169   double arr_dtbwx[NBIN_WAVX][NBIN_WINX][NUMBER_OF_BEAMS][2];
00170   float  dsigma[NUMBER_OF_BEAMS][2];
00171   uint8_t iflag_dtbw[NBIN_W][NBIN_W][NUMBER_OF_BEAMS][2][3];
00172   uint8_t iflag_winx_wavx[NBIN_WAVX][NBIN_WINX][NUMBER_OF_BEAMS][2];
00173   double wspd_max_a[NUMBER_OF_BEAMS][2][3];
00174   double wspd_max_b[NUMBER_OF_BEAMS][4][3];
00175   float estimated_error_array[NWIN_SC][7];
00176   uint16_t climate_sal[12][180][360];
00177 } static_data;
00178 
00179 
00180 
00181 //      RFI structure
00182 typedef struct rfi_struct {
00183   uint8_t iflag_rfi[MAXCYC][NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS]
00184   [RADIOMETER_SUBCYCLES][6];
00185   int32_t num_rfi[MAXCYC][NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS];
00186   uint8_t iflag_glitch[MAXCYC][NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS];
00187   uint8_t iflag_rfi_CND[MAXCYC][NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS]
00188   [RADIOMETER_SUBCYCLES];
00189 
00190   int32_t wm[360][181];
00191   int32_t wd[360][181];
00192   float   tm[360][181];
00193   float   td[360][181];
00194 
00195   int32_t wm_c[360][181];
00196   int32_t wd_c[360][181];
00197   float   tm_c[360][181];
00198   float   td_c[360][181];
00199 
00200   float   stdta_rad[NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS];
00201   float   stdta_cnd[NUMBER_OF_BEAMS][RADIOMETER_POLARIZATIONS];
00202 
00203   float   ta_ocean_nom[NUMBER_OF_BEAMS*RADIOMETER_POLARIZATIONS];
00204 
00205   int32_t idata;
00206 
00207 } rfi_data;
00208 
00209 
00210 //      PLC structure
00211 typedef struct plc_struct {
00212   //       ref. temp for FE losses and ND
00213   float Tref_3;
00214   float Tref_4;
00215   float Tref_5;
00216 
00217   //       ref. temp for FE losses and ND
00218   float Tref_CND;
00219   float Tref_ND;
00220 
00221   float Tref_ND_offset;
00222   float Tref_DL_offset;
00223 
00224   //       noise diodes
00225   float TCND_0[2][NUMBER_OF_BEAMS];
00226   float dTCND_dT4[2][NUMBER_OF_BEAMS];
00227   float dTCND_dT[2][NUMBER_OF_BEAMS];
00228 
00229   float TND_0[2][NUMBER_OF_BEAMS];
00230   float DTND_DT[2][NUMBER_OF_BEAMS];
00231   float TND_offset_0[2][NUMBER_OF_BEAMS];
00232   float DTND_offset_DT[2][NUMBER_OF_BEAMS];
00233   float TDL_offset_0[2][NUMBER_OF_BEAMS];
00234   float dTDL_offset_DT[2][NUMBER_OF_BEAMS];
00235 
00236   float CL1[2][NUMBER_OF_BEAMS];
00237   float CL2A[2][NUMBER_OF_BEAMS];
00238   float CL2B[2][NUMBER_OF_BEAMS];
00239   float CL3[2][NUMBER_OF_BEAMS];
00240   float CL4[2][NUMBER_OF_BEAMS];
00241   float dL4_dT4[2][NUMBER_OF_BEAMS];
00242   float CL5[2][NUMBER_OF_BEAMS];
00243   float dL5_dT5[2][NUMBER_OF_BEAMS];
00244   float CLMM[2][NUMBER_OF_BEAMS];
00245 
00246   //       non-linearity correction coefficients
00247   float Dnl20[4][NUMBER_OF_BEAMS];
00248   float Dnl21[4][NUMBER_OF_BEAMS];
00249   float Dnl22[4][NUMBER_OF_BEAMS];
00250   float Dnl30[4][NUMBER_OF_BEAMS];
00251   float Dnl31[4][NUMBER_OF_BEAMS];
00252   float Dnl32[4][NUMBER_OF_BEAMS];
00253   float Tref_nl[4][NUMBER_OF_BEAMS];
00254 } plc_data;
00255 
00256 
00257 // subroutine prototypes
00258 
00259 int getGeoNavSun( Hdf::hdf5_Aquarius *l1afile, double *rpy_adj, 
00260           float *cellon, float *cellat, float *celtht, float *celphi,
00261           float *suntht, float *sunphi, float *sunglt, float *moonglt,
00262           float *glxlon, float *glxlat,
00263           double *zang, double *sun_zenith, 
00264           double *sclon, double *sclat, double *scalt,  
00265           float *cellonfoot, float *cellatfoot,
00266           double *sund, double *sunr, double *moond, double *moonr, 
00267           double *bore_sight,
00268           double *Pos, double *Vel, double *rpy);
00269 
00270 int getHKT( Hdf::hdf5_Aquarius *l1afile, uint8_t *acsMode);
00271 
00272 int parseInput( int argc, char* argv[], instr*, uint32_t*, string*);
00273 int initOptions( clo_optionList_t* list, instr *l2genInput);
00274 
00275 int initialize_static_data( instr *l2genInput, static_data *staticData);
00276 
00277 int getDeflectionRatio( char* incalfilelist, double granStart, 
00278             float* bestfitDR);
00279 
00280 int comp_c_deltaTND( char* incalfilelist, float *deltaTaDR, float *c_delta);
00281 int comp_c_deltaTND( char* incalfilelist, float *c_delta);
00282 
00283 
00284 int get_taearth( int idayjl, int ibeamblk, static_data *staticData,
00285          float *cellat, float clon360, float *celtht, float phir, 
00286          float *gland, float *fland, float *fice, 
00287          float *surtep, float *tran,
00288          float *sss_reference, float *winspd, float *sm,
00289          float *solar_flux, 
00290          double *sec2000, double *zang, double *sun_zenith,
00291          double *bore_sight, double *moonr,
00292          float *ta_beam, float *ta_earth,
00293          float *tagal_dir, float *tagal_ref, float *tasun_dir,
00294          float *tasun_ref, float *tasun_bak, float *tamon_ref);
00295 
00296 extern "C" void count_to_ta_(char *, char *,
00297                  int32_t *, float *,  itemp *, gainoff *, 
00298                  rfi_data *, 
00299                  uint16_t *, uint16_t *,
00300                  float *, float *, float *,
00301                  float *, float *, float *, float *);
00302 
00303 extern "C" void get_prelaunch_calibration_coeffs_(char *, char *, plc_data *);
00304 
00305 extern "C" void  get_zone_temperatures_( int32_t *, float *, itemp *);
00306 
00307 // extern "C" void fe_loss_fac_( int32_t *, plc_data *, itemp *, float *);
00308 
00309 extern "C" void aq_rad_rtr_(unsigned short *, unsigned short *, 
00310                 unsigned short *, float *, float *, float *);
00311 
00312 extern "C" void geolocation_(double *, double *, double *, double *, double *, 
00313                  float *, float *, float *, float *, float *, 
00314                  float *, float *, float *, float *, float *,
00315                  double *, double *, double *, double *, double *,
00316                  float *, float *,
00317                  double *, double *, double *, double *, double *);
00318 
00319 extern "C" void fd_date_2000_(double *, double *, int *, int *, int *, int*,
00320                double *); 
00321 
00322 extern "C" void fd_ta_sun_(double *, double *, double *, float *, float *, 
00323                float *, float *);
00324 
00325 extern "C" void fd_ta_moon_(int32_t *, double *, double *, float *, float *, float *); 
00326 
00327 extern "C" void fd_ta_galaxy_( int32_t *, double *, double *, float *, 
00328                    float *, float *, float *, double *, 
00329                    float *, float *, float *);
00330 
00331 extern "C" void fd_dta_galaxy_( int32_t *, double *, double *, double *, 
00332                 double *, float *);
00333 
00334 extern "C" void fd_water_refl_( float *, float *, float *, float *, float *, 
00335                 uint16_t *, uint16_t *, float *, float *);
00336 
00337 extern "C" void fd_water_refl_exact_( float *, float *, float *, float *, 
00338                       float *, static_data *, float *);
00339 
00340 extern "C" void fd_dtb_roughness_( int32_t *, int32_t *, int32_t *, 
00341                    float *, float *, float *, float *,
00342                    static_data *, int32_t *, float *);
00343 
00344 extern "C" void find_refl_tot_( int *, 
00345                 float *, float *, float *, 
00346                 float *, float *, float *, float *,
00347                 float *, float *, float *, 
00348                 static_data *, float *, float *);
00349 
00350 extern "C" void fd_sun_backscatter_( int32_t *, float *, float *, double *, 
00351                      float *, float *);
00352 
00353 extern "C" void adjust_tagal_ref_( int32_t *, float *, float *, float *, 
00354                    float *, float *, 
00355                    float *, float *, float *, float *);
00356 
00357 extern "C" void fd_sss_sigma0_( float *, float *, float (*)[2],
00358                 float *, int32_t *, float *);
00359 
00360 extern "C" void vh_to_stokes_(float *);
00361 extern "C" void stokes_to_vh_(float *);
00362 
00363 extern "C" void get_ancillary_data_(int *, int *, int*,
00364                     float *, float *, float *,
00365                     float *, float *, float *, 
00366                     float *, float *, float *,
00367                     float *, float *, float *, 
00368                     float *, float*, float *,
00369                     int32_t *, double *, double *,
00370                     float *, float *, uint16_t *,
00371                     float *, float *, float *, float *,
00372                     float *, float *, float *,
00373                     float *, char *, char *, char *);
00374 
00375 extern "C" void invert_3by3_( double (*)[3], double (*)[3], double *);
00376 
00377 #ifdef IFORT_MODULE_NAME_MANGLING
00378    #define FD_SSS salinity_module_mp_fd_sss_
00379    #define FD_WSPD wind_speed_retrieval_module_mp_fd_wspd_
00380    #define MEISSNER_WENTZ_SALINITY salinity_module_mp_fdem0_meissner_wentz_salinity_
00381 #else
00382    #define FD_SSS __salinity_module_MOD_fd_sss
00383    #define FD_WSPD __wind_speed_retrieval_module_MOD_fd_wspd
00384    #define MEISSNER_WENTZ_SALINITY __salinity_module_MOD_fdem0_meissner_wentz_salinity
00385 #endif
00386 
00387 extern "C" void FD_SSS( int32_t *, float *, float *, 
00388             float (*)[2], float *, float *, 
00389             int32_t *);
00390 
00391 extern "C" void FD_WSPD( int *ibeam, 
00392              float *phir, 
00393              float *winspd, 
00394              float *dew,
00395              float *xsigma0_vv,  
00396              float *xsigma0_hh,
00397              static_data *staticData,
00398              float *winspd_hh,  
00399              float *chisq_scat, 
00400              int *iflag_wspd_scat);
00401 
00402 extern "C" void MEISSNER_WENTZ_SALINITY( float *freq_aq, float *thtadj, float *sst, 
00403                      float *sss_clim0, float *em0);
00404 
00405 
00406 extern "C" void fd_sss_clm_( int32_t *isecyr,  float *clat, float *clon, 
00407                  static_data *staticData, float *sss_clim);
00408 
00409 
00410 // Scatterometer
00411 extern "C" void initialize_constants_();
00412 extern "C" void l1b_read_limits_file_( char *);
00413 extern "C" void l1b_read_params_( char *);
00414 extern "C" void read_jpl_cut_antenna_pattern_relative_( const char *, 
00415                             double *, double *);
00416 
00417 int32_t prodOffset[MAXNAQPROD];
00418 int8_t prodMultiplicity[MAXNAQPROD];
00419 float *prodPtr[MAXNAQPROD];
00420 
00421 
00422 inline
00423 int extParmWordValue( string sLine, string *sParmWord, string *sValue) {
00424 
00425   string::size_type posBeginIdx, posEndIdx;
00426   string::size_type ipos=0;
00427   const string      sDelim( "=" );
00428 
00429   // Extract parameter word
00430   posEndIdx = sLine.find_first_of( sDelim );
00431   *sParmWord = sLine.substr( ipos, posEndIdx );
00432   posBeginIdx = posEndIdx + 1;  // Beginning of next word (after '=')
00433 
00434   // Convert to uppercase
00435   for (size_t j=0; j<(*sParmWord).length(); j++)
00436     (*sParmWord)[j] = toupper((*sParmWord)[j]);
00437 
00438   // Extract parameter value
00439   *sValue  = sLine.substr( posBeginIdx);
00440 
00441   return 0;
00442 
00443 }
00444 
00445 inline
00446 int expandEnvVar( string *sValue) {
00447   if ( (*sValue).find_first_of( "$" ) == string::npos) return 0;
00448   string::size_type posEndIdx = (*sValue).find_first_of( "/" );
00449   if ( posEndIdx == string::npos) return 0;
00450   char *envVar_str = getenv((*sValue).substr( 1, posEndIdx-1 ).c_str());
00451   if (envVar_str == 0x0) {
00452     printf("Environment variable: %s not defined.\n", envVar_str);
00453     exit(1);
00454   }
00455   *sValue = envVar_str + (*sValue).substr( posEndIdx);
00456 
00457   return 0;
00458 }
00459