|
ocssw
1.0
|
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
1.7.6.1