50 double err_formod[
ND];
141 gsl_matrix * s_a_inv,
142 gsl_vector * sig_eps_inv);
186 gsl_vector * sig_noise,
187 gsl_vector * sig_formod,
188 gsl_vector * sig_eps_inv);
192 const char *quantity,
206 static atm_t atm_i, atm_apr;
208 static obs_t obs_i, obs_meas;
215 ERRMSG(
"Give parameters: <ctl> <dirlist>");
228 if (!(dirlist = fopen(argv[2],
"r")))
229 ERRMSG(
"Cannot open directory list!");
232 while (fscanf(dirlist,
"%4999s", ret.
dir) != EOF) {
235 LOG(1,
"\nRetrieve in directory %s...\n", ret.
dir);
241 read_obs(ret.
dir,
"obs_meas.tab", &ctl, &obs_meas);
251 LOG(1,
"\nRetrieval done...");
272 static atm_t atm_cont, atm_res;
274 size_t i, n0[
NQ], n1[
NQ];
277 const size_t n = avk->size1;
280 for (
int iq = 0; iq <
NQ; iq++) {
282 for (i = 0; i < n; i++) {
283 if (iqa[i] == iq && n0[iq] ==
N)
286 n1[iq] = i - n0[iq] + 1;
297 for (
int ig = 0; ig < ctl->
ng; ig++)
299 atm_cont.
q[ig], atm_res.
q[ig]);
300 for (
int iw = 0; iw < ctl->
nw; iw++)
302 atm_cont.
k[iw], atm_res.
k[iw]);
306 for (
int icl = 0; icl < ctl->
ncl; icl++)
308 &atm_cont.
clk[icl], &atm_res.
clk[icl]);
312 for (
int isf = 0; isf < ctl->
nsf; isf++)
334 for (
size_t i = 0; i < n1[iq]; i++) {
337 for (
size_t j = 0; j < n1[iq]; j++)
338 cont[ipa[n0[iq] + i]] += gsl_matrix_get(avk, n0[iq] + i, n0[iq] + j);
341 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
351 gsl_vector *sig_eps_inv) {
353 double chisq_a, chisq_m = 0;
356 const size_t m = dy->size;
357 const size_t n = dx->size;
360 gsl_vector *x_aux = gsl_vector_alloc(n);
361 gsl_vector *y_aux = gsl_vector_alloc(m);
365 for (
size_t i = 0; i < m; i++)
366 chisq_m +=
POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
367 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
368 gsl_blas_ddot(dx, x_aux, &chisq_a);
371 gsl_vector_free(x_aux);
372 gsl_vector_free(y_aux);
375 return (chisq_m + chisq_a) / (double) m;
386 const size_t n = a->size1;
389 for (
size_t i = 0; i < n && diag; i++)
390 for (
size_t j = i + 1; j < n; j++)
391 if (gsl_matrix_get(a, i, j) != 0) {
398 for (
size_t i = 0; i < n; i++)
399 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
403 gsl_linalg_cholesky_decomp(a);
404 gsl_linalg_cholesky_invert(a);
417 const size_t m = a->size1;
418 const size_t n = a->size2;
421 gsl_matrix *aux = gsl_matrix_alloc(m, n);
424 if (transpose == 1) {
427 for (
size_t i = 0; i < m; i++)
428 for (
size_t j = 0; j < n; j++)
429 gsl_matrix_set(aux, i, j,
430 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
433 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
437 else if (transpose == 2) {
440 for (
size_t i = 0; i < m; i++)
441 for (
size_t j = 0; j < n; j++)
442 gsl_matrix_set(aux, i, j,
443 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
446 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
450 gsl_matrix_free(aux);
464 static int ipa[
N], iqa[
N];
468 char filename[2 *
LEN];
470 double chisq, disq = 0, lmpar = 0.001;
479 const size_t m =
obs2y(ctl, obs_meas, NULL, NULL, NULL);
480 const size_t n =
atm2x(ctl, atm_apr, NULL, iqa, ipa);
481 if (m == 0 || n == 0)
482 ERRMSG(
"Check problem definition!");
485 LOG(1,
"Problem size: m= %d / n= %d "
486 "(alloc= %.4g MB / stat= %.4g MB)",
488 (
double) (3 * m * n + 4 * n * n + 8 * m +
489 8 * n) *
sizeof(
double) / 1024. / 1024.,
490 (
double) (5 *
sizeof(
atm_t) + 3 *
sizeof(
obs_t)
491 + 2 *
N *
sizeof(
int)) / 1024. / 1024.);
494 gsl_matrix *a = gsl_matrix_alloc(n, n);
495 gsl_matrix *cov = gsl_matrix_alloc(n, n);
496 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
497 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
499 gsl_vector *b = gsl_vector_alloc(n);
500 gsl_vector *dx = gsl_vector_alloc(n);
501 gsl_vector *dy = gsl_vector_alloc(m);
502 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
503 gsl_vector *sig_formod = gsl_vector_alloc(m);
504 gsl_vector *sig_noise = gsl_vector_alloc(m);
505 gsl_vector *x_a = gsl_vector_alloc(n);
506 gsl_vector *x_i = gsl_vector_alloc(n);
507 gsl_vector *x_step = gsl_vector_alloc(n);
508 gsl_vector *y_aux = gsl_vector_alloc(m);
509 gsl_vector *y_i = gsl_vector_alloc(m);
510 gsl_vector *y_m = gsl_vector_alloc(m);
515 formod(ctl, tbl, atm_i, obs_i);
518 atm2x(ctl, atm_apr, x_a, NULL, NULL);
519 atm2x(ctl, atm_i, x_i, NULL, NULL);
520 obs2y(ctl, obs_meas, y_m, NULL, NULL);
521 obs2y(ctl, obs_i, y_i, NULL, NULL);
526 atm_i, obs_i,
"x",
"x",
"r");
530 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
533 sprintf(filename,
"%s/costs.tab", ret->
dir);
534 if (!(out = fopen(filename,
"w")))
535 ERRMSG(
"Cannot create cost function file!");
539 "# $1 = iteration number\n"
540 "# $2 = normalized cost function\n"
541 "# $3 = number of measurements\n"
542 "# $4 = number of state vector elements\n\n");
545 gsl_vector_memcpy(dx, x_i);
546 gsl_vector_sub(dx, x_a);
547 gsl_vector_memcpy(dy, y_m);
548 gsl_vector_sub(dy, y_i);
554 LOG(1,
"it= %d / chi^2/m= %g", it, chisq);
557 fprintf(out,
"%d %g %d %d\n", it, chisq, (
int) m, (
int) n);
560 kernel(ctl, tbl, atm_i, obs_i, k_i);
570 double chisq_old = chisq;
574 kernel(ctl, tbl, atm_i, obs_i, k_i);
581 for (
size_t i = 0; i < m; i++)
582 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
583 *
POW2(gsl_vector_get(sig_eps_inv, i)));
584 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
585 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
588 for (
int it2 = 0; it2 < 20; it2++) {
591 gsl_matrix_memcpy(a, s_a_inv);
592 gsl_matrix_scale(a, 1 + lmpar);
593 gsl_matrix_add(a, cov);
596 gsl_linalg_cholesky_decomp(a);
597 gsl_linalg_cholesky_solve(a, b, x_step);
600 gsl_vector_add(x_i, x_step);
603 x2atm(ctl, x_i, atm_i);
606 for (
int ip = 0; ip < atm_i->
np; ip++) {
607 atm_i->
p[ip] =
MIN(
MAX(atm_i->
p[ip], 5e-7), 5e4);
608 atm_i->
t[ip] =
MIN(
MAX(atm_i->
t[ip], 100), 400);
609 for (
int ig = 0; ig < ctl->
ng; ig++)
610 atm_i->
q[ig][ip] =
MIN(
MAX(atm_i->
q[ig][ip], 0), 1);
611 for (
int iw = 0; iw < ctl->
nw; iw++)
612 atm_i->
k[iw][ip] =
MAX(atm_i->
k[iw][ip], 0);
616 for (
int icl = 0; icl < ctl->
ncl; icl++)
617 atm_i->
clk[icl] =
MAX(atm_i->
clk[icl], 0);
621 for (
int isf = 0; isf < ctl->
nsf; isf++)
625 formod(ctl, tbl, atm_i, obs_i);
626 obs2y(ctl, obs_i, y_i, NULL, NULL);
629 gsl_vector_memcpy(dx, x_i);
630 gsl_vector_sub(dx, x_a);
631 gsl_vector_memcpy(dy, y_m);
632 gsl_vector_sub(dy, y_i);
638 if (chisq > chisq_old) {
640 gsl_vector_sub(x_i, x_step);
648 LOG(1,
"it= %d / chi^2/m= %g", it, chisq);
651 fprintf(out,
"%d %g %d %d\n", it, chisq, (
int) m, (
int) n);
654 gsl_blas_ddot(x_step, b, &disq);
669 atm_i, obs_i,
"y",
"x",
"r");
679 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
680 gsl_matrix *corr = gsl_matrix_alloc(n, n);
681 gsl_matrix *gain = gsl_matrix_alloc(n, m);
686 gsl_matrix_add(cov, s_a_inv);
691 atm_i, obs_i,
"x",
"x",
"r");
695 for (
size_t i = 0; i < n; i++)
696 for (
size_t j = 0; j < n; j++)
697 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
698 / sqrt(gsl_matrix_get(cov, i, i))
699 / sqrt(gsl_matrix_get(cov, j, j)));
701 atm_i, obs_i,
"x",
"x",
"r");
705 for (
size_t i = 0; i < n; i++)
706 for (
size_t j = 0; j < m; j++)
707 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
708 *
POW2(gsl_vector_get(sig_eps_inv, j)));
709 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
711 atm_i, obs_i,
"x",
"y",
"c");
723 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
725 atm_i, obs_i,
"x",
"x",
"r");
731 gsl_matrix_free(auxnm);
732 gsl_matrix_free(corr);
733 gsl_matrix_free(gain);
741 gsl_matrix_free(cov);
742 gsl_matrix_free(k_i);
743 gsl_matrix_free(s_a_inv);
748 gsl_vector_free(sig_eps_inv);
749 gsl_vector_free(sig_formod);
750 gsl_vector_free(sig_noise);
751 gsl_vector_free(x_a);
752 gsl_vector_free(x_i);
753 gsl_vector_free(x_step);
754 gsl_vector_free(y_aux);
755 gsl_vector_free(y_i);
756 gsl_vector_free(y_m);
769 (int)
scan_ctl(argc, argv,
"KERNEL_RECOMP", -1,
"3", NULL);
776 for (
int id = 0;
id < ctl->
nd;
id++)
779 for (
int id = 0;
id < ctl->
nd;
id++)
790 for (
int ig = 0; ig < ctl->
ng; ig++) {
791 ret->
err_q[ig] =
scan_ctl(argc, argv,
"ERR_Q", ig,
"0", NULL);
796 for (
int iw = 0; iw < ctl->
nw; iw++) {
797 ret->
err_k[iw] =
scan_ctl(argc, argv,
"ERR_K", iw,
"0", NULL);
804 for (
int icl = 0; icl < ctl->
ncl; icl++)
810 for (
int isf = 0; isf < ctl->
nsf; isf++)
827 const size_t n = s_a->size1;
830 gsl_vector *x_a = gsl_vector_alloc(n);
833 atm2x(ctl, atm, x_a, NULL, NULL);
834 for (
size_t i = 0; i < n; i++) {
836 gsl_vector_set(x_a, i, ret->
err_press / 100 * gsl_vector_get(x_a, i));
838 gsl_vector_set(x_a, i, ret->
err_temp);
839 for (
int ig = 0; ig < ctl->
ng; ig++)
840 if (iqa[i] ==
IDXQ(ig))
841 gsl_vector_set(x_a, i, ret->
err_q[ig] / 100 * gsl_vector_get(x_a, i));
842 for (
int iw = 0; iw < ctl->
nw; iw++)
843 if (iqa[i] ==
IDXK(iw))
844 gsl_vector_set(x_a, i, ret->
err_k[iw]);
846 gsl_vector_set(x_a, i, ret->
err_clz);
848 gsl_vector_set(x_a, i, ret->
err_cldz);
849 for (
int icl = 0; icl < ctl->
ncl; icl++)
850 if (iqa[i] ==
IDXCLK(icl))
851 gsl_vector_set(x_a, i, ret->
err_clk[icl]);
853 gsl_vector_set(x_a, i, ret->
err_sfz);
855 gsl_vector_set(x_a, i, ret->
err_sfp);
857 gsl_vector_set(x_a, i, ret->
err_sft);
858 for (
int isf = 0; isf < ctl->
nsf; isf++)
860 gsl_vector_set(x_a, i, ret->
err_sfeps[isf]);
864 for (
size_t i = 0; i < n; i++)
865 if (
POW2(gsl_vector_get(x_a, i)) <= 0)
866 ERRMSG(
"Check a priori data (zero standard deviation)!");
869 gsl_matrix_set_zero(s_a);
870 for (
size_t i = 0; i < n; i++)
871 gsl_matrix_set(s_a, i, i,
POW2(gsl_vector_get(x_a, i)));
874 for (
size_t i = 0; i < n; i++)
875 for (
size_t j = 0; j < n; j++)
876 if (i != j && iqa[i] == iqa[j]) {
883 if (iqa[i] ==
IDXP) {
889 if (iqa[i] ==
IDXT) {
895 for (
int ig = 0; ig < ctl->
ng; ig++)
896 if (iqa[i] ==
IDXQ(ig)) {
902 for (
int iw = 0; iw < ctl->
nw; iw++)
903 if (iqa[i] ==
IDXK(iw)) {
909 if (cz > 0 && ch > 0) {
917 exp(-
DIST(x0, x1) / ch -
918 fabs(atm->
z[ipa[i]] - atm->
z[ipa[j]]) / cz);
921 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
922 * gsl_vector_get(x_a, j) * rho);
927 gsl_vector_free(x_a);
936 gsl_vector *sig_noise,
937 gsl_vector *sig_formod,
938 gsl_vector *sig_eps_inv) {
940 static obs_t obs_err;
943 const size_t m = sig_eps_inv->size;
947 for (
int ir = 0; ir < obs_err.
nr; ir++)
948 for (
int id = 0;
id < ctl->
nd;
id++)
950 = (isfinite(obs->
rad[
id][ir]) ? ret->
err_noise[
id] : NAN);
951 obs2y(ctl, &obs_err, sig_noise, NULL, NULL);
955 for (
int ir = 0; ir < obs_err.
nr; ir++)
956 for (
int id = 0;
id < ctl->
nd;
id++)
959 obs2y(ctl, &obs_err, sig_formod, NULL, NULL);
962 for (
size_t i = 0; i < m; i++)
963 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(
POW2(gsl_vector_get(sig_noise, i))
969 for (
size_t i = 0; i < m; i++)
970 if (gsl_vector_get(sig_eps_inv, i) <= 0)
971 ERRMSG(
"Check measurement errors (zero standard deviation)!");
977 const char *quantity,
983 static atm_t atm_aux;
988 const size_t n = s->size1;
991 gsl_vector *x_aux = gsl_vector_alloc(n);
994 for (
size_t i = 0; i < n; i++)
995 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
999 x2atm(ctl, x_aux, &atm_aux);
1000 sprintf(filename,
"atm_err_%s.tab", quantity);
1004 gsl_vector_free(x_aux);
void write_atm(const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data.
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read forward model control parameters.
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Decompose parameter vector or state vector.
void read_atm(const char *dirname, const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data.
void copy_obs(const ctl_t *ctl, obs_t *obs_dest, const obs_t *obs_src, const int init)
Copy and initialize observation data.
void read_obs(const char *dirname, const char *filename, const ctl_t *ctl, obs_t *obs)
Read observation data.
void write_obs(const char *dirname, const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data.
void kernel(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs, gsl_matrix *k)
Compute Jacobians.
double scan_ctl(int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
void formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
Determine ray paths and compute radiative transfer.
tbl_t * read_tbl(const ctl_t *ctl)
Read look-up table data.
void copy_atm(const ctl_t *ctl, atm_t *atm_dest, const atm_t *atm_src, const int init)
Copy and initialize atmospheric data.
size_t obs2y(const ctl_t *ctl, const obs_t *obs, gsl_vector *y, int *ida, int *ira)
Compose measurement vector.
size_t atm2x(const ctl_t *ctl, const atm_t *atm, gsl_vector *x, int *iqa, int *ipa)
Compose state vector or parameter vector.
void geo2cart(const double z, const double lon, const double lat, double *x)
Convert geolocation to Cartesian coordinates.
void write_matrix(const char *dirname, const char *filename, const ctl_t *ctl, const gsl_matrix *matrix, const atm_t *atm, const obs_t *obs, const char *rowspace, const char *colspace, const char *sort)
Write matrix.
JURASSIC library declarations.
#define N
Maximum size of state vector.
#define IDXCLZ
Index for cloud layer height.
#define LEN
Maximum length of ASCII data lines.
#define POW2(x)
Compute x^2.
#define MIN(a, b)
Macro to determine the minimum of two values.
#define IDXCLDZ
Index for cloud layer depth.
#define ERRMSG(...)
Print error message and quit program.
#define IDXK(iw)
Indices for extinction.
#define NQ
Maximum number of quantities.
#define ND
Maximum number of radiance channels.
#define IDXSFT
Index for surface layer temperature.
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
#define IDXCLK(icl)
Indices for cloud layer extinction.
#define TIMER(name, mode)
Start or stop a timer.
#define IDXP
Index for pressure.
#define IDXSFP
Index for surface layer pressure.
#define NG
Maximum number of emitters.
#define LOG(level,...)
Print log message.
#define NSF
Maximum number of surface layer spectral grid points.
#define NCL
Maximum number of cloud layer spectral grid points.
#define DIST(a, b)
Compute Cartesian distance between two vectors.
#define IDXQ(ig)
Indices for volume mixing ratios.
#define NW
Maximum number of spectral windows.
#define MAX(a, b)
Macro to determine the maximum of two values.
#define IDXT
Index for temperature.
#define IDXSFZ
Index for surface layer height.
void matrix_product(gsl_matrix *a, gsl_vector *b, int transpose, gsl_matrix *c)
Compute matrix product A^TBA or ABA^T for diagonal matrix B.
int main(int argc, char *argv[])
void set_cov_apr(ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *s_a)
Set a priori covariance.
void analyze_avk(ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *avk)
Compute information content and resolution.
void read_ret(int argc, char *argv[], ctl_t *ctl, ret_t *ret)
Read retrieval control parameters.
void set_cov_meas(ret_t *ret, ctl_t *ctl, obs_t *obs, gsl_vector *sig_noise, gsl_vector *sig_formod, gsl_vector *sig_eps_inv)
Set measurement errors.
void write_stddev(const char *quantity, ret_t *ret, ctl_t *ctl, atm_t *atm, gsl_matrix *s)
Write retrieval error to file.
void matrix_invert(gsl_matrix *a)
Invert symmetric matrix.
void optimal_estimation(ret_t *ret, ctl_t *ctl, tbl_t *tbl, obs_t *obs_meas, obs_t *obs_i, atm_t *atm_apr, atm_t *atm_i)
Carry out optimal estimation retrieval.
double cost_function(gsl_vector *dx, gsl_vector *dy, gsl_matrix *s_a_inv, gsl_vector *sig_eps_inv)
Compute cost function.
void analyze_avk_quantity(gsl_matrix *avk, int iq, int *ipa, size_t *n0, size_t *n1, double *cont, double *res)
Analyze averaging kernels for individual retrieval target.
double sfeps[NSF]
Surface emissivity.
double k[NW][NP]
Extinction [km^-1].
double sfz
Surface height [km].
double lat[NP]
Latitude [deg].
double lon[NP]
Longitude [deg].
double t[NP]
Temperature [K].
double sfp
Surface pressure [hPa].
double clz
Cloud layer height [km].
int np
Number of data points.
double cldz
Cloud layer depth [km].
double sft
Surface temperature [K].
double z[NP]
Altitude [km].
double clk[NCL]
Cloud layer extinction [km^-1].
double q[NG][NP]
Volume mixing ratio [ppv].
double p[NP]
Pressure [hPa].
Forward model control parameters.
int nw
Number of spectral windows.
int ng
Number of emitters.
int nd
Number of radiance channels.
int ncl
Number of cloud layer spectral grid points.
int nsf
Number of surface layer spectral grid points.
Observation geometry and radiance data.
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
int nr
Number of ray paths.
Retrieval control parameters.
double err_sfz
Surface height error [km].
double err_press_cz
Vertical correlation length for pressure error [km].
double err_sfp
Surface pressure error [hPa].
double err_press
Pressure error [%].
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
int err_ana
Carry out error analysis (0=no, 1=yes).
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
double err_temp_cz
Vertical correlation length for temperature error [km].
double err_formod[ND]
Forward model error [%].
double conv_dmin
Minimum normalized step size in state space.
double err_temp
Temperature error [K].
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
double err_clz
Cloud height error [km].
double err_sft
Surface temperature error [K].
double err_clk[NCL]
Cloud extinction error [km^-1].
double err_temp_ch
Horizontal correlation length for temperature error [km].
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
int conv_itmax
Maximum number of iterations.
double err_cldz
Cloud depth error [km].
double err_press_ch
Horizontal correlation length for pressure error [km].
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
double err_q[NG]
Volume mixing ratio error [%].
char dir[LEN]
Working directory.
double err_sfeps[NSF]
Surface emissivity error.
double err_k[NW]
Extinction error [km^-1].
Emissivity look-up tables.