8 static int firstCall = 1;
10 static float ray_sen [
NSEN];
11 static float ray_sol [
NSOL];
12 static float ray_sigma[
NWIND];
24 static float p0 =
STDPR;
25 float x = (-(0.6543 - 1.608 * taur) + (0.8192 - 1.2541 * taur) * log(airmass)) * taur*airmass;
26 return ( (1.0 - exp(-
x *
pr / p0)) / (1.0 - exp(-
x)));
30 static void check_dimension_size(
const char* file_name,
int nc_id,
const char* dim_name,
size_t length) {
35 status = nc_inq_dimid (nc_id, dim_name, &dim_id);
37 printf(
"-E- %s: Error looking for dimension %s from %s.\n", __FILE__, dim_name, file_name);
40 status = nc_inq_dimlen(nc_id, dim_id, &dim_length);
42 printf(
"-E- %s: Error reading dimension %s from %s.\n", __FILE__, dim_name, file_name);
45 if(dim_length != length) {
46 printf(
"-E- %s: Error with size of dimension %s from %s.\n", __FILE__, dim_name, file_name);
52 static void read_lut_variable(
const char*
file,
int nc_id,
const char* var_name,
float*
data) {
56 status = nc_inq_varid(nc_id, var_name, &var_id);
58 printf(
"-E- %s: Error looking for variable %s from %s.\n", __FILE__, var_name,
file);
61 status = nc_get_var_float(nc_id, var_id,
data);
63 printf(
"-E- %s: Error reading variable %s from %s.\n", __FILE__, var_name,
file);
78 printf(
"-E- %s: Error opening file %s.\n", __FILE__,
file);
81 printf(
"Loading Rayleigh LUT %s\n",
file);
84 if(strstr(
file,
"_iqu.nc"))
88 check_dimension_size(
file, nc_id,
"sensor_zenith",
NSEN);
89 check_dimension_size(
file, nc_id,
"solar_zenith",
NSOL);
90 check_dimension_size(
file, nc_id,
"wave_mean_square_slope",
NWIND);
91 check_dimension_size(
file, nc_id,
"fourier_component",
NORDER);
94 read_lut_variable(
file, nc_id,
"sensor_zenith", ray_sen);
95 read_lut_variable(
file, nc_id,
"solar_zenith", ray_sol);
98 check_dimension_size(
file, nc_id,
"nrad_ray",
NSEN);
99 check_dimension_size(
file, nc_id,
"nsun_ray",
NSOL);
100 check_dimension_size(
file, nc_id,
"nwind_ray",
NWIND);
101 check_dimension_size(
file, nc_id,
"norder_ray",
NORDER);
104 read_lut_variable(
file, nc_id,
"senz", ray_sen);
105 read_lut_variable(
file, nc_id,
"solz", ray_sol);
108 status = nc_inq_varid(nc_id,
"sigma", &var_id);
110 read_lut_variable(
file, nc_id,
"sigma", ray_sigma);
112 status = nc_inq_varid(nc_id,
"wave_mean_square_slope", &var_id);
115 printf(
"-E- %s: Error looking for variable sigma or wave_mean_square_slope from %s.\n", __FILE__,
file);
118 read_lut_variable(
file, nc_id,
"wave_mean_square_slope", ray_sigma);
122 read_lut_variable(
file, nc_id,
"stokes_i_rayleigh", (
float*)ray_for_i[iw]);
124 read_lut_variable(
file, nc_id,
"stokes_q_rayleigh", (
float*)ray_for_q[iw]);
125 read_lut_variable(
file, nc_id,
"stokes_u_rayleigh", (
float*)ray_for_u[iw]);
129 read_lut_variable(
file, nc_id,
"i_ray", (
float*)ray_for_i[iw]);
131 read_lut_variable(
file, nc_id,
"q_ray", (
float*)ray_for_q[iw]);
132 read_lut_variable(
file, nc_id,
"u_ray", (
float*)ray_for_u[iw]);
183 char file [FILENAME_MAX] =
"";
184 char path [FILENAME_MAX] =
"";
185 char wavestr[10] =
"";
186 char sensorstr[32] =
"";
191 float f00, f10, f01, f11;
197 float ray_i, ray_q, ray_u;
206 int32_t iw, ipw, gmult, ix;
209 int32_t evalmask =
l1_input->evalmask;
210 int32_t nwave =
l1rec->l1file->nbands;
211 int pol_opt =
input->pol_opt;
212 float *taur =
l1rec->l1file->Tau_r;
213 float *Fo =
l1rec->Fo;
215 float ws =
l1rec->ws[ip];
224 r_solz = &
l1rec->geom_per_band->solz[ipw];
225 r_senz = &
l1rec->geom_per_band->senz[ipw];
226 r_phi = &
l1rec->geom_per_band->delphi[ipw];
227 r_csolz = &
l1rec->geom_per_band->csolz[ipw];
228 r_csenz = &
l1rec->geom_per_band->csenz[ipw];
230 r_solz = &
l1rec->solz[ip];
231 r_senz = &
l1rec->senz[ip];
232 r_phi = &
l1rec->delphi[ip];
233 r_csolz = &
l1rec->csolz[ip];
234 r_csenz = &
l1rec->csenz[ip];
246 if ((tmp_str = getenv(
"OCDATAROOT")) ==
NULL) {
247 printf(
"OCDATAROOT environment variable is not defined.\n");
252 strcat(
path,
"/eval/");
263 printf(
"-E- : Error allocating memory to ray_for_i\n");
268 printf(
"-E- : Error allocating memory to ray_for_q\n");
272 printf(
"-E- : Error allocating memory to ray_for_u\n");
279 for (iw = 0; iw < nwave; iw++) {
281 sprintf(wavestr,
"%d", (
int) wave[iw]);
285 if(
l1rec->l1file->subsensorID >= 0) {
288 strcat(
file,
"/rayleigh/rayleigh_");
289 strcat(
file, sensorstr);
291 strcat(
file, wavestr);
292 strcat(
file,
"_iqu.nc");
295 if(access(
file, R_OK) == -1) {
298 strcat(
file,
"/rayleigh/rayleigh_");
299 strcat(
file, sensorstr);
301 strcat(
file, wavestr);
302 strcat(
file,
"_iqu.hdf");
307 if(access(
file, R_OK) == -1) {
309 strcat(
file,
"rayleigh/rayleigh_");
310 strcat(
file, sensorstr);
312 strcat(
file, wavestr);
313 strcat(
file,
"_iqu.nc");
316 if(access(
file, R_OK) == -1) {
318 strcat(
file,
"rayleigh/rayleigh_");
319 strcat(
file, sensorstr);
321 strcat(
file, wavestr);
322 strcat(
file,
"_iqu.hdf");
333 sigma_m = 0.0731 * sqrt(ws);
335 while (sigma_m > ray_sigma[isigma2] && isigma2 <
NWIND)
337 isigma1 = isigma2 - 1;
346 for (iw = 0; iw < nwave; iw++) {
354 if ((iw == 0) || (gmult == 1)) {
357 for (m = 0; m <
NORDER; m++) {
358 cosd_phi[m] = cos(r_phi[ix] * m /
RADEG);
359 sind_phi[m] = sin(r_phi[ix] * m /
RADEG);
364 isol1 = ((
int) r_solz[ix]) / 2;
369 for (isen2 = 0; isen2 <
NSEN; isen2++) {
370 if (r_senz[ix] < ray_sen[isen2])
377 if (isol1 >=
NSOL - 1) {
382 p = (r_solz[ix] - ray_sol[isol1]) / (ray_sol[isol2] - ray_sol[isol1]);
383 q = (r_senz[ix] - ray_sen[isen1]) / (ray_sen[isen2] - ray_sen[isen1]);
384 airmass = 1. / r_csolz[ix] + 1. / r_csenz[ix];
390 for (isigma = isigma1; isigma <= isigma2; isigma++) {
392 iwind = isigma - isigma1;
394 ray_i_sig [iwind] = 0.;
395 ray_q_sig [iwind] = 0.;
396 ray_u_sig [iwind] = 0.;
400 for (m = 0; m <
NORDER; m++) {
402 f00 = ray_for_i[iw][isigma][isol1][m][isen1];
403 f10 = ray_for_i[iw][isigma][isol2][m][isen1];
404 f01 = ray_for_i[iw][isigma][isol1][m][isen2];
405 f11 = ray_for_i[iw][isigma][isol2][m][isen2];
407 ray_i_sig[iwind] = ray_i_sig[iwind] +
408 ((1. -
p)*(1. -
q) * f00 +
p *
q * f11 +
p * (1. -
q) * f10 +
q * (1. -
p) * f01) * cosd_phi[m];
416 for (m = 0; m <
NORDER; m++) {
418 f00 = ray_for_q[iw][isigma][isol1][m][isen1];
419 f10 = ray_for_q[iw][isigma][isol2][m][isen1];
420 f01 = ray_for_q[iw][isigma][isol1][m][isen2];
421 f11 = ray_for_q[iw][isigma][isol2][m][isen2];
423 ray_q_sig[iwind] = ray_q_sig[iwind] +
424 ((1. -
p)*(1. -
q) * f00 +
p *
q * f11 +
p * (1. -
q) * f10 +
q * (1. -
p) * f01) * cosd_phi[m];
430 for (m = 0; m <
NORDER; m++) {
432 f00 = ray_for_u[iw][isigma][isol1][m][isen1];
433 f10 = ray_for_u[iw][isigma][isol2][m][isen1];
434 f01 = ray_for_u[iw][isigma][isol1][m][isen2];
435 f11 = ray_for_u[iw][isigma][isol2][m][isen2];
437 ray_u_sig[iwind] = ray_u_sig[iwind] +
438 ((1. -
p)*(1. -
q) * f00 +
p *
q * f11 +
p * (1. -
q) * f10 +
q * (1. -
p) * f01) * sind_phi[m];
446 if (isigma1 == isigma2) {
448 ray_i = ray_i_sig[0];
451 ray_q = ray_q_sig[0];
452 ray_u = ray_u_sig[0];
457 h = (sigma_m - ray_sigma[isigma1]) / (ray_sigma[isigma2] - ray_sigma[isigma1]);
459 ray_i = ray_i_sig[0] + (ray_i_sig[1] - ray_i_sig[0]) *
h;
462 ray_q = ray_q_sig[0] + (ray_q_sig[1] - ray_q_sig[0]) *
h;
463 ray_u = ray_u_sig[0] + (ray_u_sig[1] - ray_u_sig[0]) *
h;
468 ipw = ip * nwave + iw;
469 l1rec->Lr[ipw] = Fo[iw] * ray_i*
fac;
470 l1rec->L_q[ipw] = Fo[iw] * ray_q*
fac;
471 l1rec->L_u[ipw] = Fo[iw] * ray_u*
fac;