JURASSIC
jurassic.c
Go to the documentation of this file.
1/*
2 This file is part of JURASSIC.
3
4 JURASSIC is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 JURASSIC is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with JURASSIC. If not, see <http://www.gnu.org/licenses/>.
16
17 Copyright (C) 2003-2025 Forschungszentrum Juelich GmbH
18*/
19
25#include "jurassic.h"
26
27/*****************************************************************************/
28
30 ret_t *ret,
31 ctl_t *ctl,
32 atm_t *atm,
33 int *iqa,
34 int *ipa,
35 gsl_matrix *avk) {
36
37 static atm_t atm_cont, atm_res;
38
39 size_t i, n0[NQ], n1[NQ];
40
41 /* Get sizes... */
42 const size_t n = avk->size1;
43
44 /* Find sub-matrices for different quantities... */
45 for (int iq = 0; iq < NQ; iq++) {
46 n0[iq] = N;
47 for (i = 0; i < n; i++) {
48 if (iqa[i] == iq && n0[iq] == N)
49 n0[iq] = i;
50 if (iqa[i] == iq)
51 n1[iq] = i - n0[iq] + 1;
52 }
53 }
54
55 /* Initialize... */
56 copy_atm(ctl, &atm_cont, atm, 1);
57 copy_atm(ctl, &atm_res, atm, 1);
58
59 /* Analyze quantities... */
60 analyze_avk_quantity(avk, IDXP, ipa, n0, n1, atm_cont.p, atm_res.p);
61 analyze_avk_quantity(avk, IDXT, ipa, n0, n1, atm_cont.t, atm_res.t);
62 for (int ig = 0; ig < ctl->ng; ig++)
63 analyze_avk_quantity(avk, IDXQ(ig), ipa, n0, n1,
64 atm_cont.q[ig], atm_res.q[ig]);
65 for (int iw = 0; iw < ctl->nw; iw++)
66 analyze_avk_quantity(avk, IDXK(iw), ipa, n0, n1,
67 atm_cont.k[iw], atm_res.k[iw]);
68 analyze_avk_quantity(avk, IDXCLZ, ipa, n0, n1, &atm_cont.clz, &atm_res.clz);
69 analyze_avk_quantity(avk, IDXCLDZ, ipa, n0, n1, &atm_cont.cldz,
70 &atm_res.cldz);
71 for (int icl = 0; icl < ctl->ncl; icl++)
72 analyze_avk_quantity(avk, IDXCLK(icl), ipa, n0, n1,
73 &atm_cont.clk[icl], &atm_res.clk[icl]);
74 analyze_avk_quantity(avk, IDXSFT, ipa, n0, n1, &atm_cont.sft, &atm_res.sft);
75 for (int isf = 0; isf < ctl->nsf; isf++)
76 analyze_avk_quantity(avk, IDXSFEPS(isf), ipa, n0, n1,
77 &atm_cont.sfeps[isf], &atm_res.sfeps[isf]);
78
79 /* Write results to disk... */
80 write_atm(ret->dir, "atm_cont.tab", ctl, &atm_cont);
81 write_atm(ret->dir, "atm_res.tab", ctl, &atm_res);
82}
83
84/*****************************************************************************/
85
87 gsl_matrix *avk,
88 int iq,
89 int *ipa,
90 size_t *n0,
91 size_t *n1,
92 double *cont,
93 double *res) {
94
95 /* Loop over state vector elements... */
96 if (n0[iq] < N)
97 for (size_t i = 0; i < n1[iq]; i++) {
98
99 /* Get area of averaging kernel... */
100 for (size_t j = 0; j < n1[iq]; j++)
101 cont[ipa[n0[iq] + i]] += gsl_matrix_get(avk, n0[iq] + i, n0[iq] + j);
102
103 /* Get information density... */
104 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
105 }
106}
107
108/*****************************************************************************/
109
110size_t atm2x(
111 const ctl_t *ctl,
112 const atm_t *atm,
113 gsl_vector *x,
114 int *iqa,
115 int *ipa) {
116
117 size_t n = 0;
118
119 /* Add pressure... */
120 for (int ip = 0; ip < atm->np; ip++)
121 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
122 atm2x_help(atm->p[ip], IDXP, ip, x, iqa, ipa, &n);
123
124 /* Add temperature... */
125 for (int ip = 0; ip < atm->np; ip++)
126 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
127 atm2x_help(atm->t[ip], IDXT, ip, x, iqa, ipa, &n);
128
129 /* Add volume mixing ratios... */
130 for (int ig = 0; ig < ctl->ng; ig++)
131 for (int ip = 0; ip < atm->np; ip++)
132 if (atm->z[ip] >= ctl->retq_zmin[ig]
133 && atm->z[ip] <= ctl->retq_zmax[ig])
134 atm2x_help(atm->q[ig][ip], IDXQ(ig), ip, x, iqa, ipa, &n);
135
136 /* Add extinction... */
137 for (int iw = 0; iw < ctl->nw; iw++)
138 for (int ip = 0; ip < atm->np; ip++)
139 if (atm->z[ip] >= ctl->retk_zmin[iw]
140 && atm->z[ip] <= ctl->retk_zmax[iw])
141 atm2x_help(atm->k[iw][ip], IDXK(iw), ip, x, iqa, ipa, &n);
142
143 /* Add cloud parameters... */
144 if (ctl->ret_clz)
145 atm2x_help(atm->clz, IDXCLZ, 0, x, iqa, ipa, &n);
146 if (ctl->ret_cldz)
147 atm2x_help(atm->cldz, IDXCLDZ, 0, x, iqa, ipa, &n);
148 if (ctl->ret_clk)
149 for (int icl = 0; icl < ctl->ncl; icl++)
150 atm2x_help(atm->clk[icl], IDXCLK(icl), 0, x, iqa, ipa, &n);
151
152 /* Add surface parameters... */
153 if (ctl->ret_sft)
154 atm2x_help(atm->sft, IDXSFT, 0, x, iqa, ipa, &n);
155 if (ctl->ret_sfeps)
156 for (int isf = 0; isf < ctl->nsf; isf++)
157 atm2x_help(atm->sfeps[isf], IDXSFEPS(isf), 0, x, iqa, ipa, &n);
158
159 return n;
160}
161
162/*****************************************************************************/
163
165 const double value,
166 const int value_iqa,
167 const int value_ip,
168 gsl_vector *x,
169 int *iqa,
170 int *ipa,
171 size_t *n) {
172
173 /* Add element to state vector... */
174 if (x != NULL)
175 gsl_vector_set(x, *n, value);
176 if (iqa != NULL)
177 iqa[*n] = value_iqa;
178 if (ipa != NULL)
179 ipa[*n] = value_ip;
180 (*n)++;
181}
182
183/*****************************************************************************/
184
186 const double *x,
187 double *z,
188 double *lon,
189 double *lat) {
190
191 const double radius = NORM(x);
192
193 *lat = RAD2DEG(asin(x[2] / radius));
194 *lon = RAD2DEG(atan2(x[1], x[0]));
195 *z = radius - RE;
196}
197
198/*****************************************************************************/
199
201 const ctl_t *ctl,
202 atm_t *atm) {
203
204 static const double z[121] = {
205 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
206 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
207 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
208 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
209 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
210 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
211 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
212 };
213
214 static const double pre[121] = {
215 1017, 901.083, 796.45, 702.227, 617.614, 541.644, 473.437, 412.288,
216 357.603, 308.96, 265.994, 228.348, 195.619, 167.351, 143.039, 122.198,
217 104.369, 89.141, 76.1528, 65.0804, 55.641, 47.591, 40.7233, 34.8637,
218 29.8633, 25.5956, 21.9534, 18.8445, 16.1909, 13.9258, 11.9913,
219 10.34, 8.92988, 7.72454, 6.6924, 5.80701, 5.04654, 4.39238, 3.82902,
220 3.34337, 2.92413, 2.56128, 2.2464, 1.97258, 1.73384, 1.52519, 1.34242,
221 1.18197, 1.04086, 0.916546, 0.806832, 0.709875, 0.624101, 0.548176,
222 0.480974, 0.421507, 0.368904, 0.322408, 0.281386, 0.245249, 0.213465,
223 0.185549, 0.161072, 0.139644, 0.120913, 0.104568, 0.0903249, 0.0779269,
224 0.0671493, 0.0577962, 0.0496902, 0.0426736, 0.0366093, 0.0313743,
225 0.0268598, 0.0229699, 0.0196206, 0.0167399, 0.0142646, 0.0121397,
226 0.0103181, 0.00875775, 0.00742226, 0.00628076, 0.00530519, 0.00447183,
227 0.00376124, 0.00315632, 0.00264248, 0.00220738, 0.00184003, 0.00153095,
228 0.00127204, 0.00105608, 0.000876652, 0.00072798, 0.00060492,
229 0.000503201, 0.000419226, 0.000349896, 0.000292659, 0.000245421,
230 0.000206394, 0.000174125, 0.000147441, 0.000125333, 0.000106985,
231 9.173e-05, 7.90172e-05, 6.84172e-05, 5.95574e-05, 5.21183e-05,
232 4.58348e-05, 4.05127e-05, 3.59987e-05, 3.21583e-05, 2.88718e-05,
233 2.60322e-05, 2.35687e-05, 2.14263e-05, 1.95489e-05
234 };
235
236 static const double tem[121] = {
237 285.14, 279.34, 273.91, 268.3, 263.24, 256.55, 250.2, 242.82, 236.17,
238 229.87, 225.04, 221.19, 218.85, 217.19, 216.2, 215.68, 215.42, 215.55,
239 215.92, 216.4, 216.93, 217.45, 218, 218.68, 219.39, 220.25, 221.3,
240 222.41, 223.88, 225.42, 227.2, 229.52, 231.89, 234.51, 236.85, 239.42,
241 241.94, 244.57, 247.36, 250.32, 253.34, 255.82, 258.27, 260.39,
242 262.03, 263.45, 264.2, 264.78, 264.67, 264.38, 263.24, 262.03, 260.02,
243 258.09, 255.63, 253.28, 250.43, 247.81, 245.26, 242.77, 240.38,
244 237.94, 235.79, 233.53, 231.5, 229.53, 227.6, 225.62, 223.77, 222.06,
245 220.33, 218.69, 217.18, 215.64, 214.13, 212.52, 210.86, 209.25,
246 207.49, 205.81, 204.11, 202.22, 200.32, 198.39, 195.92, 193.46,
247 190.94, 188.31, 185.82, 183.57, 181.43, 179.74, 178.64, 178.1, 178.25,
248 178.7, 179.41, 180.67, 182.31, 184.18, 186.6, 189.53, 192.66, 196.54,
249 201.13, 205.93, 211.73, 217.86, 225, 233.53, 242.57, 252.14, 261.48,
250 272.97, 285.26, 299.12, 312.2, 324.17, 338.34, 352.56, 365.28
251 };
252
253 static const double c2h2[121] = {
254 1.352e-09, 2.83e-10, 1.269e-10, 6.926e-11, 4.346e-11, 2.909e-11,
255 2.014e-11, 1.363e-11, 8.71e-12, 5.237e-12, 2.718e-12, 1.375e-12,
256 5.786e-13, 2.16e-13, 7.317e-14, 2.551e-14, 1.055e-14, 4.758e-15,
257 2.056e-15, 7.703e-16, 2.82e-16, 1.035e-16, 4.382e-17, 1.946e-17,
258 9.638e-18, 5.2e-18, 2.811e-18, 1.494e-18, 7.925e-19, 4.213e-19,
259 1.998e-19, 8.78e-20, 3.877e-20, 1.728e-20, 7.743e-21, 3.536e-21,
260 1.623e-21, 7.508e-22, 3.508e-22, 1.65e-22, 7.837e-23, 3.733e-23,
261 1.808e-23, 8.77e-24, 4.285e-24, 2.095e-24, 1.032e-24, 5.082e-25,
262 2.506e-25, 1.236e-25, 6.088e-26, 2.996e-26, 1.465e-26, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
266 };
267
268 static const double c2h6[121] = {
269 2.667e-09, 2.02e-09, 1.658e-09, 1.404e-09, 1.234e-09, 1.109e-09,
270 1.012e-09, 9.262e-10, 8.472e-10, 7.71e-10, 6.932e-10, 6.216e-10,
271 5.503e-10, 4.87e-10, 4.342e-10, 3.861e-10, 3.347e-10, 2.772e-10,
272 2.209e-10, 1.672e-10, 1.197e-10, 8.536e-11, 5.783e-11, 3.846e-11,
273 2.495e-11, 1.592e-11, 1.017e-11, 6.327e-12, 3.895e-12, 2.403e-12,
274 1.416e-12, 8.101e-13, 4.649e-13, 2.686e-13, 1.557e-13, 9.14e-14,
275 5.386e-14, 3.19e-14, 1.903e-14, 1.14e-14, 6.875e-15, 4.154e-15,
276 2.538e-15, 1.553e-15, 9.548e-16, 5.872e-16, 3.63e-16, 2.244e-16,
277 1.388e-16, 8.587e-17, 5.308e-17, 3.279e-17, 2.017e-17, 1.238e-17,
278 7.542e-18, 4.585e-18, 2.776e-18, 1.671e-18, 9.985e-19, 5.937e-19,
279 3.518e-19, 2.07e-19, 1.215e-19, 7.06e-20, 4.097e-20, 2.37e-20,
280 1.363e-20, 7.802e-21, 4.441e-21, 2.523e-21, 1.424e-21, 8.015e-22,
281 4.497e-22, 2.505e-22, 1.391e-22, 7.691e-23, 4.238e-23, 2.331e-23,
282 1.274e-23, 6.929e-24, 3.752e-24, 2.02e-24, 1.083e-24, 5.774e-25,
283 3.041e-25, 1.593e-25, 8.308e-26, 4.299e-26, 2.195e-26, 1.112e-26,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
285 0, 0, 0, 0, 0, 0, 0, 0, 0
286 };
287
288 static const double ccl4[121] = {
289 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10,
290 1.075e-10, 1.075e-10, 1.075e-10, 1.06e-10, 1.024e-10, 9.69e-11,
291 8.93e-11, 8.078e-11, 7.213e-11, 6.307e-11, 5.383e-11, 4.49e-11,
292 3.609e-11, 2.705e-11, 1.935e-11, 1.385e-11, 8.35e-12, 5.485e-12,
293 3.853e-12, 2.22e-12, 5.875e-13, 3.445e-13, 1.015e-13, 6.075e-14,
294 4.383e-14, 2.692e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
295 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
296 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
297 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
298 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
299 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
300 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
301 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
302 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
303 1e-14, 1e-14, 1e-14
304 };
305
306 static const double ch3oh[121] = {
307 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10,
308 5.01099e-10, 5.50999e-10, 5.7313e-10, 5.75638e-10, 5.4086e-10,
309 4.77601e-10, 4.12907e-10, 3.6274e-10, 3.26448e-10, 2.9706e-10,
310 2.27698e-10, 1.96999e-10, 1.66212e-10, 1.17941e-10, 1.19844e-10,
311 1.11211e-10, 1.02714e-10, 9.86138e-11, 9.45133e-11, 9.04127e-11,
312 8.05243e-11, 6.3678e-11, 4.68317e-11, 4.00618e-11, 3.95786e-11,
313 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
314 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
315 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
316 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
317 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
318 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
319 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
320 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
321 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
322 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
323 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
324 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
325 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
326 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
327 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
328 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
329 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
330 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
331 3.95786e-11
332 };
333
334 static const double ch4[121] = {
335 1.864e-06, 1.835e-06, 1.819e-06, 1.805e-06, 1.796e-06, 1.788e-06,
336 1.782e-06, 1.776e-06, 1.769e-06, 1.761e-06, 1.749e-06, 1.734e-06,
337 1.716e-06, 1.692e-06, 1.654e-06, 1.61e-06, 1.567e-06, 1.502e-06,
338 1.433e-06, 1.371e-06, 1.323e-06, 1.277e-06, 1.232e-06, 1.188e-06,
339 1.147e-06, 1.108e-06, 1.07e-06, 1.027e-06, 9.854e-07, 9.416e-07,
340 8.933e-07, 8.478e-07, 7.988e-07, 7.515e-07, 7.07e-07, 6.64e-07,
341 6.239e-07, 5.864e-07, 5.512e-07, 5.184e-07, 4.87e-07, 4.571e-07,
342 4.296e-07, 4.04e-07, 3.802e-07, 3.578e-07, 3.383e-07, 3.203e-07,
343 3.032e-07, 2.889e-07, 2.76e-07, 2.635e-07, 2.519e-07, 2.409e-07,
344 2.302e-07, 2.219e-07, 2.144e-07, 2.071e-07, 1.999e-07, 1.93e-07,
345 1.862e-07, 1.795e-07, 1.731e-07, 1.668e-07, 1.607e-07, 1.548e-07,
346 1.49e-07, 1.434e-07, 1.38e-07, 1.328e-07, 1.277e-07, 1.227e-07,
347 1.18e-07, 1.134e-07, 1.089e-07, 1.046e-07, 1.004e-07, 9.635e-08,
348 9.245e-08, 8.867e-08, 8.502e-08, 8.15e-08, 7.809e-08, 7.48e-08,
349 7.159e-08, 6.849e-08, 6.55e-08, 6.262e-08, 5.98e-08, 5.708e-08,
350 5.448e-08, 5.194e-08, 4.951e-08, 4.72e-08, 4.5e-08, 4.291e-08,
351 4.093e-08, 3.905e-08, 3.729e-08, 3.563e-08, 3.408e-08, 3.265e-08,
352 3.128e-08, 2.996e-08, 2.87e-08, 2.76e-08, 2.657e-08, 2.558e-08,
353 2.467e-08, 2.385e-08, 2.307e-08, 2.234e-08, 2.168e-08, 2.108e-08,
354 2.05e-08, 1.998e-08, 1.947e-08, 1.902e-08, 1.86e-08, 1.819e-08,
355 1.782e-08
356 };
357
358 static const double clo[121] = {
359 7.419e-15, 1.061e-14, 1.518e-14, 2.195e-14, 3.175e-14, 4.666e-14,
360 6.872e-14, 1.03e-13, 1.553e-13, 2.375e-13, 3.664e-13, 5.684e-13,
361 8.915e-13, 1.402e-12, 2.269e-12, 4.125e-12, 7.501e-12, 1.257e-11,
362 2.048e-11, 3.338e-11, 5.44e-11, 8.846e-11, 1.008e-10, 1.082e-10,
363 1.157e-10, 1.232e-10, 1.312e-10, 1.539e-10, 1.822e-10, 2.118e-10,
364 2.387e-10, 2.687e-10, 2.875e-10, 3.031e-10, 3.23e-10, 3.648e-10,
365 4.117e-10, 4.477e-10, 4.633e-10, 4.794e-10, 4.95e-10, 5.104e-10,
366 5.259e-10, 5.062e-10, 4.742e-10, 4.443e-10, 4.051e-10, 3.659e-10,
367 3.305e-10, 2.911e-10, 2.54e-10, 2.215e-10, 1.927e-10, 1.675e-10,
368 1.452e-10, 1.259e-10, 1.09e-10, 9.416e-11, 8.119e-11, 6.991e-11,
369 6.015e-11, 5.163e-11, 4.43e-11, 3.789e-11, 3.24e-11, 2.769e-11,
370 2.361e-11, 2.011e-11, 1.71e-11, 1.453e-11, 1.233e-11, 1.045e-11,
371 8.851e-12, 7.48e-12, 6.316e-12, 5.326e-12, 4.487e-12, 3.778e-12,
372 3.176e-12, 2.665e-12, 2.234e-12, 1.87e-12, 1.563e-12, 1.304e-12,
373 1.085e-12, 9.007e-13, 7.468e-13, 6.179e-13, 5.092e-13, 4.188e-13,
374 3.442e-13, 2.816e-13, 2.304e-13, 1.885e-13, 1.542e-13, 1.263e-13,
375 1.035e-13, 8.5e-14, 7.004e-14, 5.783e-14, 4.795e-14, 4.007e-14,
376 3.345e-14, 2.792e-14, 2.33e-14, 1.978e-14, 1.686e-14, 1.438e-14,
377 1.234e-14, 1.07e-14, 9.312e-15, 8.131e-15, 7.164e-15, 6.367e-15,
378 5.67e-15, 5.088e-15, 4.565e-15, 4.138e-15, 3.769e-15, 3.432e-15,
379 3.148e-15
380 };
381
382 static const double clono2[121] = {
383 1.011e-13, 1.515e-13, 2.272e-13, 3.446e-13, 5.231e-13, 8.085e-13,
384 1.253e-12, 1.979e-12, 3.149e-12, 5.092e-12, 8.312e-12, 1.366e-11,
385 2.272e-11, 3.791e-11, 6.209e-11, 9.101e-11, 1.334e-10, 1.951e-10,
386 2.853e-10, 3.94e-10, 4.771e-10, 5.771e-10, 6.675e-10, 7.665e-10,
387 8.504e-10, 8.924e-10, 9.363e-10, 8.923e-10, 8.411e-10, 7.646e-10,
388 6.525e-10, 5.576e-10, 4.398e-10, 3.403e-10, 2.612e-10, 1.915e-10,
389 1.407e-10, 1.028e-10, 7.455e-11, 5.42e-11, 3.708e-11, 2.438e-11,
390 1.618e-11, 1.075e-11, 7.17e-12, 4.784e-12, 3.205e-12, 2.147e-12,
391 1.44e-12, 9.654e-13, 6.469e-13, 4.332e-13, 2.891e-13, 1.926e-13,
392 1.274e-13, 8.422e-14, 5.547e-14, 3.636e-14, 2.368e-14, 1.536e-14,
393 9.937e-15, 6.39e-15, 4.101e-15, 2.61e-15, 1.659e-15, 1.052e-15,
394 6.638e-16, 4.172e-16, 2.61e-16, 1.63e-16, 1.013e-16, 6.275e-17,
395 3.879e-17, 2.383e-17, 1.461e-17, 8.918e-18, 5.43e-18, 3.301e-18,
396 1.997e-18, 1.203e-18, 7.216e-19, 4.311e-19, 2.564e-19, 1.519e-19,
397 8.911e-20, 5.203e-20, 3.026e-20, 1.748e-20, 9.99e-21, 5.673e-21,
398 3.215e-21, 1.799e-21, 1.006e-21, 5.628e-22, 3.146e-22, 1.766e-22,
399 9.94e-23, 5.614e-23, 3.206e-23, 1.841e-23, 1.071e-23, 6.366e-24,
400 3.776e-24, 2.238e-24, 1.326e-24, 8.253e-25, 5.201e-25, 3.279e-25,
401 2.108e-25, 1.395e-25, 9.326e-26, 6.299e-26, 4.365e-26, 3.104e-26,
402 2.219e-26, 1.621e-26, 1.185e-26, 8.92e-27, 6.804e-27, 5.191e-27,
403 4.041e-27
404 };
405
406 static const double co[121] = {
407 1.907e-07, 1.553e-07, 1.362e-07, 1.216e-07, 1.114e-07, 1.036e-07,
408 9.737e-08, 9.152e-08, 8.559e-08, 7.966e-08, 7.277e-08, 6.615e-08,
409 5.884e-08, 5.22e-08, 4.699e-08, 4.284e-08, 3.776e-08, 3.274e-08,
410 2.845e-08, 2.479e-08, 2.246e-08, 2.054e-08, 1.991e-08, 1.951e-08,
411 1.94e-08, 2.009e-08, 2.1e-08, 2.201e-08, 2.322e-08, 2.45e-08,
412 2.602e-08, 2.73e-08, 2.867e-08, 2.998e-08, 3.135e-08, 3.255e-08,
413 3.352e-08, 3.426e-08, 3.484e-08, 3.53e-08, 3.593e-08, 3.671e-08,
414 3.759e-08, 3.945e-08, 4.192e-08, 4.49e-08, 5.03e-08, 5.703e-08,
415 6.538e-08, 7.878e-08, 9.644e-08, 1.196e-07, 1.498e-07, 1.904e-07,
416 2.422e-07, 3.055e-07, 3.804e-07, 4.747e-07, 5.899e-07, 7.272e-07,
417 8.91e-07, 1.071e-06, 1.296e-06, 1.546e-06, 1.823e-06, 2.135e-06,
418 2.44e-06, 2.714e-06, 2.967e-06, 3.189e-06, 3.391e-06, 3.58e-06,
419 3.773e-06, 4.022e-06, 4.346e-06, 4.749e-06, 5.199e-06, 5.668e-06,
420 6.157e-06, 6.688e-06, 7.254e-06, 7.867e-06, 8.539e-06, 9.26e-06,
421 1.009e-05, 1.119e-05, 1.228e-05, 1.365e-05, 1.506e-05, 1.641e-05,
422 1.784e-05, 1.952e-05, 2.132e-05, 2.323e-05, 2.531e-05, 2.754e-05,
423 3.047e-05, 3.459e-05, 3.922e-05, 4.439e-05, 4.825e-05, 5.077e-05,
424 5.34e-05, 5.618e-05, 5.909e-05, 6.207e-05, 6.519e-05, 6.845e-05,
425 6.819e-05, 6.726e-05, 6.622e-05, 6.512e-05, 6.671e-05, 6.862e-05,
426 7.048e-05, 7.264e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05
427 };
428
429 static const double cof2[121] = {
430 7.5e-14, 1.055e-13, 1.485e-13, 2.111e-13, 3.001e-13, 4.333e-13,
431 6.269e-13, 9.221e-13, 1.364e-12, 2.046e-12, 3.093e-12, 4.703e-12,
432 7.225e-12, 1.113e-11, 1.66e-11, 2.088e-11, 2.626e-11, 3.433e-11,
433 4.549e-11, 5.886e-11, 7.21e-11, 8.824e-11, 1.015e-10, 1.155e-10,
434 1.288e-10, 1.388e-10, 1.497e-10, 1.554e-10, 1.606e-10, 1.639e-10,
435 1.64e-10, 1.64e-10, 1.596e-10, 1.542e-10, 1.482e-10, 1.382e-10,
436 1.289e-10, 1.198e-10, 1.109e-10, 1.026e-10, 9.484e-11, 8.75e-11,
437 8.086e-11, 7.49e-11, 6.948e-11, 6.446e-11, 5.961e-11, 5.505e-11,
438 5.085e-11, 4.586e-11, 4.1e-11, 3.665e-11, 3.235e-11, 2.842e-11,
439 2.491e-11, 2.11e-11, 1.769e-11, 1.479e-11, 1.197e-11, 9.631e-12,
440 7.74e-12, 6.201e-12, 4.963e-12, 3.956e-12, 3.151e-12, 2.507e-12,
441 1.99e-12, 1.576e-12, 1.245e-12, 9.83e-13, 7.742e-13, 6.088e-13,
442 4.782e-13, 3.745e-13, 2.929e-13, 2.286e-13, 1.782e-13, 1.388e-13,
443 1.079e-13, 8.362e-14, 6.471e-14, 4.996e-14, 3.85e-14, 2.96e-14,
444 2.265e-14, 1.729e-14, 1.317e-14, 9.998e-15, 7.549e-15, 5.683e-15,
445 4.273e-15, 3.193e-15, 2.385e-15, 1.782e-15, 1.331e-15, 9.957e-16,
446 7.461e-16, 5.601e-16, 4.228e-16, 3.201e-16, 2.438e-16, 1.878e-16,
447 1.445e-16, 1.111e-16, 8.544e-17, 6.734e-17, 5.341e-17, 4.237e-17,
448 3.394e-17, 2.759e-17, 2.254e-17, 1.851e-17, 1.54e-17, 1.297e-17,
449 1.096e-17, 9.365e-18, 8e-18, 6.938e-18, 6.056e-18, 5.287e-18,
450 4.662e-18
451 };
452
453 static const double f11[121] = {
454 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10,
455 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.635e-10, 2.536e-10,
456 2.44e-10, 2.348e-10, 2.258e-10, 2.153e-10, 2.046e-10, 1.929e-10,
457 1.782e-10, 1.648e-10, 1.463e-10, 1.291e-10, 1.1e-10, 8.874e-11,
458 7.165e-11, 5.201e-11, 3.744e-11, 2.577e-11, 1.64e-11, 1.048e-11,
459 5.993e-12, 3.345e-12, 1.839e-12, 9.264e-13, 4.688e-13, 2.329e-13,
460 1.129e-13, 5.505e-14, 2.825e-14, 1.492e-14, 7.997e-15, 5.384e-15,
461 3.988e-15, 2.955e-15, 2.196e-15, 1.632e-15, 1.214e-15, 9.025e-16,
462 6.708e-16, 4.984e-16, 3.693e-16, 2.733e-16, 2.013e-16, 1.481e-16,
463 1.087e-16, 7.945e-17, 5.782e-17, 4.195e-17, 3.038e-17, 2.19e-17,
464 1.577e-17, 1.128e-17, 8.063e-18, 5.753e-18, 4.09e-18, 2.899e-18,
465 2.048e-18, 1.444e-18, 1.015e-18, 7.12e-19, 4.985e-19, 3.474e-19,
466 2.417e-19, 1.677e-19, 1.161e-19, 8.029e-20, 5.533e-20, 3.799e-20,
467 2.602e-20, 1.776e-20, 1.209e-20, 8.202e-21, 5.522e-21, 3.707e-21,
468 2.48e-21, 1.652e-21, 1.091e-21, 7.174e-22, 4.709e-22, 3.063e-22,
469 1.991e-22, 1.294e-22, 8.412e-23, 5.483e-23, 3.581e-23, 2.345e-23,
470 1.548e-23, 1.027e-23, 6.869e-24, 4.673e-24, 3.173e-24, 2.153e-24,
471 1.461e-24, 1.028e-24, 7.302e-25, 5.188e-25, 3.739e-25, 2.753e-25,
472 2.043e-25, 1.528e-25, 1.164e-25, 9.041e-26, 7.051e-26, 5.587e-26,
473 4.428e-26, 3.588e-26, 2.936e-26, 2.402e-26, 1.995e-26
474 };
475
476 static const double f113[121] = {
477 1.9e-11, 1.9e-11, 1.899e-11, 1.899e-11, 1.898e-11, 1.898e-11,
478 1.897e-11, 1.896e-11, 1.895e-11, 1.894e-11, 1.893e-11, 1.89e-11,
479 1.887e-11, 1.871e-11, 1.854e-11, 1.803e-11, 1.751e-11, 1.664e-11,
480 1.576e-11, 1.466e-11, 1.356e-11, 1.236e-11, 1.116e-11, 9.931e-12,
481 8.702e-12, 7.515e-12, 6.4238e-12, 5.3326e-12, 4.3652e-12, 3.5216e-12,
482 2.678e-12, 2.1532e-12, 1.6284e-12, 1.2202e-12, 9.286e-13, 6.37e-13,
483 4.95e-13, 3.53e-13, 2.5004e-13, 1.8612e-13, 1.222e-13, 9.704e-14,
484 7.188e-14, 5.3338e-14, 4.1414e-14, 2.949e-14, 2.3722e-14, 1.7954e-14,
485 1.37794e-14, 1.11982e-14, 8.617e-15, 7.6036e-15, 6.5902e-15,
486 5.5768e-15, 4.5634e-15, 3.55e-15, 3.1008e-15, 2.6516e-15, 2.2024e-15,
487 1.7532e-15, 1.304e-15, 1.1354e-15, 9.668e-16, 7.982e-16, 6.296e-16,
488 4.61e-16, 3.9734e-16, 3.3368e-16, 2.7002e-16, 2.0636e-16, 1.427e-16,
489 1.22804e-16, 1.02908e-16, 8.3012e-17, 6.3116e-17, 4.322e-17,
490 3.6838e-17, 3.0456e-17, 2.4074e-17, 1.7692e-17, 1.131e-17,
491 9.6202e-18, 7.9304e-18, 6.2406e-18, 4.5508e-18, 2.861e-18,
492 2.40476e-18, 1.94852e-18, 1.49228e-18, 1.03604e-18, 5.798e-19,
493 4.8502e-19, 3.9024e-19, 2.9546e-19, 2.0068e-19, 1.059e-19,
494 8.7084e-20, 6.8268e-20, 4.9452e-20, 3.0636e-20, 1.182e-20,
495 9.64344e-21, 7.46688e-21, 5.29032e-21, 3.11376e-21, 9.372e-22,
496 7.5685e-22, 5.765e-22, 3.9615e-22, 2.158e-22, 3.545e-23,
497 2.86046e-23, 2.17592e-23, 1.49138e-23, 8.0684e-24, 1.223e-24,
498 9.92358e-25, 7.61716e-25, 5.31074e-25, 3.00432e-25, 6.979e-26
499 };
500
501 static const double f114[121] = {
502 1.2e-11, 1.2e-11, 1.2e-11, 1.2e-11, 1.199e-11, 1.199e-11,
503 1.199e-11, 1.199e-11, 1.198e-11, 1.198e-11, 1.198e-11, 1.197e-11,
504 1.196e-11, 1.191e-11, 1.185e-11, 1.167e-11, 1.149e-11, 1.12e-11,
505 1.09e-11, 1.053e-11, 1.015e-11, 9.731e-12, 9.311e-12, 8.865e-12,
506 8.419e-12, 7.949e-12, 7.4774e-12, 7.0058e-12, 6.54e-12, 6.08e-12,
507 5.62e-12, 5.1908e-12, 4.7616e-12, 4.3622e-12, 3.9926e-12, 3.623e-12,
508 3.3274e-12, 3.0318e-12, 2.7702e-12, 2.5426e-12, 2.315e-12, 2.1514e-12,
509 1.9878e-12, 1.8448e-12, 1.7224e-12, 1.6e-12, 1.51e-12, 1.42e-12,
510 1.3462e-12, 1.2886e-12, 1.231e-12, 1.1922e-12, 1.1534e-12, 1.1146e-12,
511 1.0758e-12, 1.037e-12, 1.0025e-12, 9.68e-13, 9.335e-13, 8.99e-13,
512 8.645e-13, 8.344e-13, 8.043e-13, 7.742e-13, 7.441e-13, 7.14e-13,
513 6.8718e-13, 6.6036e-13, 6.3354e-13, 6.0672e-13, 5.799e-13, 5.5612e-13,
514 5.3234e-13, 5.0856e-13, 4.8478e-13, 4.61e-13, 4.394e-13, 4.178e-13,
515 3.962e-13, 3.746e-13, 3.53e-13, 3.3288e-13, 3.1276e-13, 2.9264e-13,
516 2.7252e-13, 2.524e-13, 2.3368e-13, 2.1496e-13, 1.9624e-13, 1.7752e-13,
517 1.588e-13, 1.4221e-13, 1.2562e-13, 1.0903e-13, 9.244e-14, 7.585e-14,
518 6.4942e-14, 5.4034e-14, 4.3126e-14, 3.2218e-14, 2.131e-14, 1.76694e-14,
519 1.40288e-14, 1.03882e-14, 6.7476e-15, 3.107e-15, 2.52738e-15,
520 1.94776e-15, 1.36814e-15, 7.8852e-16, 2.089e-16, 1.69288e-16,
521 1.29676e-16, 9.0064e-17, 5.0452e-17, 1.084e-17, 8.85136e-18,
522 6.86272e-18, 4.87408e-18, 2.88544e-18, 8.968e-19
523 };
524
525 static const double f12[121] = {
526 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10,
527 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.429e-10, 5.291e-10,
528 5.155e-10, 5.022e-10, 4.893e-10, 4.772e-10, 4.655e-10, 4.497e-10,
529 4.249e-10, 4.015e-10, 3.632e-10, 3.261e-10, 2.858e-10, 2.408e-10,
530 2.03e-10, 1.685e-10, 1.4e-10, 1.163e-10, 9.65e-11, 8.02e-11, 6.705e-11,
531 5.624e-11, 4.764e-11, 4.249e-11, 3.792e-11, 3.315e-11, 2.819e-11,
532 2.4e-11, 1.999e-11, 1.64e-11, 1.352e-11, 1.14e-11, 9.714e-12,
533 8.28e-12, 7.176e-12, 6.251e-12, 5.446e-12, 4.72e-12, 4.081e-12,
534 3.528e-12, 3.08e-12, 2.699e-12, 2.359e-12, 2.111e-12, 1.901e-12,
535 1.709e-12, 1.534e-12, 1.376e-12, 1.233e-12, 1.103e-12, 9.869e-13,
536 8.808e-13, 7.859e-13, 7.008e-13, 6.241e-13, 5.553e-13, 4.935e-13,
537 4.383e-13, 3.889e-13, 3.447e-13, 3.054e-13, 2.702e-13, 2.389e-13,
538 2.11e-13, 1.862e-13, 1.643e-13, 1.448e-13, 1.274e-13, 1.121e-13,
539 9.844e-14, 8.638e-14, 7.572e-14, 6.62e-14, 5.782e-14, 5.045e-14,
540 4.394e-14, 3.817e-14, 3.311e-14, 2.87e-14, 2.48e-14, 2.142e-14,
541 1.851e-14, 1.599e-14, 1.383e-14, 1.196e-14, 1.036e-14, 9e-15,
542 7.828e-15, 6.829e-15, 5.992e-15, 5.254e-15, 4.606e-15, 4.037e-15,
543 3.583e-15, 3.19e-15, 2.841e-15, 2.542e-15, 2.291e-15, 2.07e-15,
544 1.875e-15, 1.71e-15, 1.57e-15, 1.442e-15, 1.333e-15, 1.232e-15,
545 1.147e-15, 1.071e-15, 1.001e-15, 9.396e-16
546 };
547
548 static const double f14[121] = {
549 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11,
550 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 8.91e-11, 8.73e-11, 8.46e-11,
551 8.19e-11, 7.92e-11, 7.74e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
552 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
553 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
554 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
555 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
556 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
557 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
558 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
559 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
560 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
561 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
562 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
563 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
564 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
565 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11
566 };
567
568 static const double f22[121] = {
569 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10,
570 1.4e-10, 1.4e-10, 1.4e-10, 1.372e-10, 1.317e-10, 1.235e-10, 1.153e-10,
571 1.075e-10, 1.002e-10, 9.332e-11, 8.738e-11, 8.194e-11, 7.7e-11,
572 7.165e-11, 6.753e-11, 6.341e-11, 5.971e-11, 5.6e-11, 5.229e-11,
573 4.859e-11, 4.488e-11, 4.118e-11, 3.83e-11, 3.568e-11, 3.308e-11,
574 3.047e-11, 2.82e-11, 2.594e-11, 2.409e-11, 2.237e-11, 2.065e-11,
575 1.894e-11, 1.771e-11, 1.647e-11, 1.532e-11, 1.416e-11, 1.332e-11,
576 1.246e-11, 1.161e-11, 1.087e-11, 1.017e-11, 9.471e-12, 8.853e-12,
577 8.235e-12, 7.741e-12, 7.247e-12, 6.836e-12, 6.506e-12, 6.176e-12,
578 5.913e-12, 5.65e-12, 5.419e-12, 5.221e-12, 5.024e-12, 4.859e-12,
579 4.694e-12, 4.546e-12, 4.414e-12, 4.282e-12, 4.15e-12, 4.019e-12,
580 3.903e-12, 3.805e-12, 3.706e-12, 3.607e-12, 3.508e-12, 3.41e-12,
581 3.31e-12, 3.212e-12, 3.129e-12, 3.047e-12, 2.964e-12, 2.882e-12,
582 2.8e-12, 2.734e-12, 2.668e-12, 2.602e-12, 2.537e-12, 2.471e-12,
583 2.421e-12, 2.372e-12, 2.322e-12, 2.273e-12, 2.224e-12, 2.182e-12,
584 2.141e-12, 2.1e-12, 2.059e-12, 2.018e-12, 1.977e-12, 1.935e-12,
585 1.894e-12, 1.853e-12, 1.812e-12, 1.77e-12, 1.73e-12, 1.688e-12,
586 1.647e-12, 1.606e-12, 1.565e-12, 1.524e-12, 1.483e-12, 1.441e-12,
587 1.4e-12, 1.359e-12, 1.317e-12, 1.276e-12, 1.235e-12, 1.194e-12,
588 1.153e-12, 1.112e-12, 1.071e-12, 1.029e-12, 9.883e-13
589 };
590
591 static const double h2co[121] = {
592 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11,
593 8.71857e-11, 7.72315e-11, 6.85464e-11, 6.0758e-11, 5.32087e-11,
594 4.5719e-11, 3.79458e-11, 3.07607e-11, 2.46025e-11, 1.94038e-11,
595 1.40882e-11, 1.0623e-11, 8.35457e-12, 6.87427e-12, 7.09071e-12,
596 8.96183e-12, 1.09012e-11, 1.50545e-11, 1.92077e-11, 2.3361e-11,
597 2.7054e-11, 3.01936e-11, 3.33333e-11, 3.69281e-11, 4.08069e-11,
598 4.57318e-11, 5.1348e-11, 5.69642e-11, 6.33173e-11, 6.98984e-11,
599 7.63144e-11, 8.22774e-11, 8.82405e-11, 9.3746e-11, 9.92074e-11,
600 1.04669e-10, 1.10055e-10, 1.15293e-10, 1.20531e-10, 1.26293e-10,
601 1.32585e-10, 1.35966e-10, 1.36242e-10, 1.36519e-10, 1.61155e-10,
602 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
603 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
604 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
605 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
606 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
607 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
608 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
609 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
610 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
611 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
612 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
613 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
614 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
615 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
616 1.99157e-10
617 };
618
619 static const double h2o[121] = {
620 0.01166, 0.008269, 0.005742, 0.003845, 0.00277, 0.001897, 0.001272,
621 0.000827, 0.000539, 0.0003469, 0.0001579, 3.134e-05, 1.341e-05,
622 6.764e-06, 4.498e-06, 3.703e-06, 3.724e-06, 3.899e-06, 4.002e-06,
623 4.122e-06, 4.277e-06, 4.438e-06, 4.558e-06, 4.673e-06, 4.763e-06,
624 4.809e-06, 4.856e-06, 4.936e-06, 5.021e-06, 5.114e-06, 5.222e-06,
625 5.331e-06, 5.414e-06, 5.488e-06, 5.563e-06, 5.633e-06, 5.704e-06,
626 5.767e-06, 5.819e-06, 5.872e-06, 5.914e-06, 5.949e-06, 5.984e-06,
627 6.015e-06, 6.044e-06, 6.073e-06, 6.104e-06, 6.136e-06, 6.167e-06,
628 6.189e-06, 6.208e-06, 6.226e-06, 6.212e-06, 6.185e-06, 6.158e-06,
629 6.114e-06, 6.066e-06, 6.018e-06, 5.877e-06, 5.728e-06, 5.582e-06,
630 5.437e-06, 5.296e-06, 5.156e-06, 5.02e-06, 4.886e-06, 4.754e-06,
631 4.625e-06, 4.498e-06, 4.374e-06, 4.242e-06, 4.096e-06, 3.955e-06,
632 3.817e-06, 3.683e-06, 3.491e-06, 3.204e-06, 2.94e-06, 2.696e-06,
633 2.47e-06, 2.252e-06, 2.019e-06, 1.808e-06, 1.618e-06, 1.445e-06,
634 1.285e-06, 1.105e-06, 9.489e-07, 8.121e-07, 6.938e-07, 5.924e-07,
635 5.04e-07, 4.288e-07, 3.648e-07, 3.103e-07, 2.642e-07, 2.252e-07,
636 1.921e-07, 1.643e-07, 1.408e-07, 1.211e-07, 1.048e-07, 9.063e-08,
637 7.835e-08, 6.774e-08, 5.936e-08, 5.221e-08, 4.592e-08, 4.061e-08,
638 3.62e-08, 3.236e-08, 2.902e-08, 2.62e-08, 2.383e-08, 2.171e-08,
639 1.989e-08, 1.823e-08, 1.684e-08, 1.562e-08, 1.449e-08, 1.351e-08
640 };
641
642 static const double h2o2[121] = {
643 1.779e-10, 7.938e-10, 8.953e-10, 8.032e-10, 6.564e-10, 5.159e-10,
644 4.003e-10, 3.026e-10, 2.222e-10, 1.58e-10, 1.044e-10, 6.605e-11,
645 3.413e-11, 1.453e-11, 1.062e-11, 1.009e-11, 9.597e-12, 1.175e-11,
646 1.572e-11, 2.091e-11, 2.746e-11, 3.603e-11, 4.791e-11, 6.387e-11,
647 8.239e-11, 1.007e-10, 1.23e-10, 1.363e-10, 1.489e-10, 1.585e-10,
648 1.608e-10, 1.632e-10, 1.576e-10, 1.502e-10, 1.423e-10, 1.302e-10,
649 1.192e-10, 1.085e-10, 9.795e-11, 8.854e-11, 8.057e-11, 7.36e-11,
650 6.736e-11, 6.362e-11, 6.087e-11, 5.825e-11, 5.623e-11, 5.443e-11,
651 5.27e-11, 5.098e-11, 4.931e-11, 4.769e-11, 4.611e-11, 4.458e-11,
652 4.308e-11, 4.102e-11, 3.887e-11, 3.682e-11, 3.521e-11, 3.369e-11,
653 3.224e-11, 3.082e-11, 2.946e-11, 2.814e-11, 2.687e-11, 2.566e-11,
654 2.449e-11, 2.336e-11, 2.227e-11, 2.123e-11, 2.023e-11, 1.927e-11,
655 1.835e-11, 1.746e-11, 1.661e-11, 1.58e-11, 1.502e-11, 1.428e-11,
656 1.357e-11, 1.289e-11, 1.224e-11, 1.161e-11, 1.102e-11, 1.045e-11,
657 9.895e-12, 9.369e-12, 8.866e-12, 8.386e-12, 7.922e-12, 7.479e-12,
658 7.06e-12, 6.656e-12, 6.274e-12, 5.914e-12, 5.575e-12, 5.257e-12,
659 4.959e-12, 4.679e-12, 4.42e-12, 4.178e-12, 3.954e-12, 3.75e-12,
660 3.557e-12, 3.372e-12, 3.198e-12, 3.047e-12, 2.908e-12, 2.775e-12,
661 2.653e-12, 2.544e-12, 2.442e-12, 2.346e-12, 2.26e-12, 2.183e-12,
662 2.11e-12, 2.044e-12, 1.98e-12, 1.924e-12, 1.871e-12, 1.821e-12,
663 1.775e-12
664 };
665
666 static const double hcl[121] = {
667 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11,
668 3.70385e-11, 2.21247e-11, 1.88117e-11, 2.36957e-11, 3.72192e-11,
669 5.79399e-11, 8.04158e-11, 1.01779e-10, 1.2301e-10, 1.53924e-10,
670 1.93737e-10, 2.5561e-10, 3.84228e-10, 6.18248e-10, 6.31222e-10,
671 7.84907e-10, 9.36932e-10, 1.03508e-09, 1.13323e-09, 1.23138e-09,
672 1.31985e-09, 1.39669e-09, 1.47352e-09, 1.56375e-09, 1.66234e-09,
673 1.78086e-09, 1.91256e-09, 2.04425e-09, 2.16629e-09, 2.28535e-09,
674 2.39439e-09, 2.47597e-09, 2.55755e-09, 2.60873e-09, 2.65696e-09,
675 2.70519e-09, 2.75658e-09, 2.81422e-09, 2.87187e-09, 2.94013e-09,
676 3.01911e-09, 3.09497e-09, 3.16749e-09, 3.24001e-09, 3.30525e-09,
677 3.3665e-09, 3.42424e-09, 3.4619e-09, 3.49956e-09, 3.52273e-09,
678 3.54214e-09, 3.56154e-09, 3.57918e-09, 3.59049e-09, 3.6018e-09,
679 3.6132e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
680 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
681 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
682 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
683 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
684 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
685 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
686 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
687 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
688 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
689 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
690 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
691 3.62476e-09
692 };
693
694 static const double hcn[121] = {
695 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10,
696 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.498e-10, 5.495e-10, 5.493e-10,
697 5.49e-10, 5.488e-10, 4.717e-10, 3.946e-10, 3.174e-10, 2.4e-10,
698 1.626e-10, 1.619e-10, 1.612e-10, 1.602e-10, 1.593e-10, 1.582e-10,
699 1.572e-10, 1.56e-10, 1.549e-10, 1.539e-10, 1.53e-10, 1.519e-10,
700 1.506e-10, 1.487e-10, 1.467e-10, 1.449e-10, 1.43e-10, 1.413e-10,
701 1.397e-10, 1.382e-10, 1.368e-10, 1.354e-10, 1.337e-10, 1.315e-10,
702 1.292e-10, 1.267e-10, 1.241e-10, 1.215e-10, 1.19e-10, 1.165e-10,
703 1.141e-10, 1.118e-10, 1.096e-10, 1.072e-10, 1.047e-10, 1.021e-10,
704 9.968e-11, 9.739e-11, 9.539e-11, 9.339e-11, 9.135e-11, 8.898e-11,
705 8.664e-11, 8.439e-11, 8.249e-11, 8.075e-11, 7.904e-11, 7.735e-11,
706 7.565e-11, 7.399e-11, 7.245e-11, 7.109e-11, 6.982e-11, 6.863e-11,
707 6.755e-11, 6.657e-11, 6.587e-11, 6.527e-11, 6.476e-11, 6.428e-11,
708 6.382e-11, 6.343e-11, 6.307e-11, 6.272e-11, 6.238e-11, 6.205e-11,
709 6.17e-11, 6.137e-11, 6.102e-11, 6.072e-11, 6.046e-11, 6.03e-11,
710 6.018e-11, 6.01e-11, 6.001e-11, 5.992e-11, 5.984e-11, 5.975e-11,
711 5.967e-11, 5.958e-11, 5.95e-11, 5.941e-11, 5.933e-11, 5.925e-11,
712 5.916e-11, 5.908e-11, 5.899e-11, 5.891e-11, 5.883e-11, 5.874e-11,
713 5.866e-11, 5.858e-11, 5.85e-11, 5.841e-11, 5.833e-11, 5.825e-11,
714 5.817e-11, 5.808e-11, 5.8e-11, 5.792e-11, 5.784e-11
715 };
716
717 static const double hf[121] = {
718 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
719 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
720 2.64279e-11, 2.64279e-11, 2.64279e-11, 3.86691e-11, 5.22002e-11,
721 6.92471e-11, 9.13979e-11, 1.37918e-10, 2.24918e-10, 2.29824e-10,
722 2.94241e-10, 3.58363e-10, 4.12881e-10, 4.67399e-10, 5.21917e-10,
723 5.74229e-10, 6.23889e-10, 6.73549e-10, 7.24119e-10, 7.75256e-10,
724 8.319e-10, 8.92185e-10, 9.52469e-10, 1.01325e-09, 1.07419e-09,
725 1.13565e-09, 1.19856e-09, 1.26146e-09, 1.31439e-09, 1.36635e-09,
726 1.41831e-09, 1.46549e-09, 1.50321e-09, 1.54093e-09, 1.57986e-09,
727 1.62e-09, 1.66286e-09, 1.70863e-09, 1.75439e-09, 1.79827e-09,
728 1.84111e-09, 1.88125e-09, 1.90603e-09, 1.93081e-09, 1.9413e-09,
729 1.94807e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
730 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
731 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
732 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
733 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
734 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
735 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
736 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
737 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
738 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
739 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
740 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
741 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
742 1.95485e-09
743 };
744
745 static const double hno3[121] = {
746 1.809e-10, 7.234e-10, 5.899e-10, 4.342e-10, 3.277e-10, 2.661e-10,
747 2.35e-10, 2.267e-10, 2.389e-10, 2.651e-10, 3.255e-10, 4.099e-10,
748 5.42e-10, 6.978e-10, 8.807e-10, 1.112e-09, 1.405e-09, 2.04e-09,
749 3.111e-09, 4.5e-09, 5.762e-09, 7.37e-09, 7.852e-09, 8.109e-09,
750 8.067e-09, 7.554e-09, 7.076e-09, 6.268e-09, 5.524e-09, 4.749e-09,
751 3.909e-09, 3.223e-09, 2.517e-09, 1.942e-09, 1.493e-09, 1.122e-09,
752 8.449e-10, 6.361e-10, 4.787e-10, 3.611e-10, 2.804e-10, 2.215e-10,
753 1.758e-10, 1.441e-10, 1.197e-10, 9.953e-11, 8.505e-11, 7.334e-11,
754 6.325e-11, 5.625e-11, 5.058e-11, 4.548e-11, 4.122e-11, 3.748e-11,
755 3.402e-11, 3.088e-11, 2.8e-11, 2.536e-11, 2.293e-11, 2.072e-11,
756 1.871e-11, 1.687e-11, 1.52e-11, 1.368e-11, 1.23e-11, 1.105e-11,
757 9.922e-12, 8.898e-12, 7.972e-12, 7.139e-12, 6.385e-12, 5.708e-12,
758 5.099e-12, 4.549e-12, 4.056e-12, 3.613e-12, 3.216e-12, 2.862e-12,
759 2.544e-12, 2.259e-12, 2.004e-12, 1.776e-12, 1.572e-12, 1.391e-12,
760 1.227e-12, 1.082e-12, 9.528e-13, 8.379e-13, 7.349e-13, 6.436e-13,
761 5.634e-13, 4.917e-13, 4.291e-13, 3.745e-13, 3.267e-13, 2.854e-13,
762 2.494e-13, 2.181e-13, 1.913e-13, 1.68e-13, 1.479e-13, 1.31e-13,
763 1.159e-13, 1.025e-13, 9.067e-14, 8.113e-14, 7.281e-14, 6.535e-14,
764 5.892e-14, 5.348e-14, 4.867e-14, 4.439e-14, 4.073e-14, 3.76e-14,
765 3.476e-14, 3.229e-14, 3e-14, 2.807e-14, 2.635e-14, 2.473e-14,
766 2.332e-14
767 };
768
769 static const double hno4[121] = {
770 6.118e-12, 3.594e-12, 2.807e-12, 3.04e-12, 4.458e-12, 7.986e-12,
771 1.509e-11, 2.661e-11, 3.738e-11, 4.652e-11, 4.429e-11, 3.992e-11,
772 3.347e-11, 3.005e-11, 3.173e-11, 4.055e-11, 5.812e-11, 8.489e-11,
773 1.19e-10, 1.482e-10, 1.766e-10, 2.103e-10, 2.35e-10, 2.598e-10,
774 2.801e-10, 2.899e-10, 3e-10, 2.817e-10, 2.617e-10, 2.332e-10,
775 1.933e-10, 1.605e-10, 1.232e-10, 9.285e-11, 6.941e-11, 4.951e-11,
776 3.539e-11, 2.402e-11, 1.522e-11, 9.676e-12, 6.056e-12, 3.745e-12,
777 2.34e-12, 1.463e-12, 9.186e-13, 5.769e-13, 3.322e-13, 1.853e-13,
778 1.035e-13, 7.173e-14, 5.382e-14, 4.036e-14, 3.401e-14, 2.997e-14,
779 2.635e-14, 2.316e-14, 2.034e-14, 1.783e-14, 1.56e-14, 1.363e-14,
780 1.19e-14, 1.037e-14, 9.032e-15, 7.846e-15, 6.813e-15, 5.912e-15,
781 5.121e-15, 4.431e-15, 3.829e-15, 3.306e-15, 2.851e-15, 2.456e-15,
782 2.114e-15, 1.816e-15, 1.559e-15, 1.337e-15, 1.146e-15, 9.811e-16,
783 8.389e-16, 7.162e-16, 6.109e-16, 5.203e-16, 4.425e-16, 3.76e-16,
784 3.184e-16, 2.692e-16, 2.274e-16, 1.917e-16, 1.61e-16, 1.35e-16,
785 1.131e-16, 9.437e-17, 7.874e-17, 6.57e-17, 5.481e-17, 4.579e-17,
786 3.828e-17, 3.204e-17, 2.691e-17, 2.264e-17, 1.912e-17, 1.626e-17,
787 1.382e-17, 1.174e-17, 9.972e-18, 8.603e-18, 7.45e-18, 6.453e-18,
788 5.623e-18, 4.944e-18, 4.361e-18, 3.859e-18, 3.443e-18, 3.096e-18,
789 2.788e-18, 2.528e-18, 2.293e-18, 2.099e-18, 1.929e-18, 1.773e-18,
790 1.64e-18
791 };
792
793 static const double hocl[121] = {
794 1.056e-12, 1.194e-12, 1.35e-12, 1.531e-12, 1.737e-12, 1.982e-12,
795 2.263e-12, 2.599e-12, 2.991e-12, 3.459e-12, 4.012e-12, 4.662e-12,
796 5.438e-12, 6.35e-12, 7.425e-12, 8.686e-12, 1.016e-11, 1.188e-11,
797 1.389e-11, 1.659e-11, 2.087e-11, 2.621e-11, 3.265e-11, 4.064e-11,
798 4.859e-11, 5.441e-11, 6.09e-11, 6.373e-11, 6.611e-11, 6.94e-11,
799 7.44e-11, 7.97e-11, 8.775e-11, 9.722e-11, 1.064e-10, 1.089e-10,
800 1.114e-10, 1.106e-10, 1.053e-10, 1.004e-10, 9.006e-11, 7.778e-11,
801 6.739e-11, 5.636e-11, 4.655e-11, 3.845e-11, 3.042e-11, 2.368e-11,
802 1.845e-11, 1.442e-11, 1.127e-11, 8.814e-12, 6.544e-12, 4.763e-12,
803 3.449e-12, 2.612e-12, 1.999e-12, 1.526e-12, 1.16e-12, 8.793e-13,
804 6.655e-13, 5.017e-13, 3.778e-13, 2.829e-13, 2.117e-13, 1.582e-13,
805 1.178e-13, 8.755e-14, 6.486e-14, 4.799e-14, 3.54e-14, 2.606e-14,
806 1.916e-14, 1.403e-14, 1.026e-14, 7.48e-15, 5.446e-15, 3.961e-15,
807 2.872e-15, 2.076e-15, 1.498e-15, 1.077e-15, 7.726e-16, 5.528e-16,
808 3.929e-16, 2.785e-16, 1.969e-16, 1.386e-16, 9.69e-17, 6.747e-17,
809 4.692e-17, 3.236e-17, 2.232e-17, 1.539e-17, 1.061e-17, 7.332e-18,
810 5.076e-18, 3.522e-18, 2.461e-18, 1.726e-18, 1.22e-18, 8.75e-19,
811 6.264e-19, 4.482e-19, 3.207e-19, 2.368e-19, 1.762e-19, 1.312e-19,
812 9.891e-20, 7.595e-20, 5.87e-20, 4.567e-20, 3.612e-20, 2.904e-20,
813 2.343e-20, 1.917e-20, 1.568e-20, 1.308e-20, 1.1e-20, 9.25e-21,
814 7.881e-21
815 };
816
817 static const double n2o[121] = {
818 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07,
819 3.17e-07, 3.17e-07, 3.17e-07, 3.124e-07, 3.077e-07, 3.03e-07,
820 2.984e-07, 2.938e-07, 2.892e-07, 2.847e-07, 2.779e-07, 2.705e-07,
821 2.631e-07, 2.557e-07, 2.484e-07, 2.345e-07, 2.201e-07, 2.01e-07,
822 1.754e-07, 1.532e-07, 1.329e-07, 1.154e-07, 1.003e-07, 8.735e-08,
823 7.617e-08, 6.512e-08, 5.547e-08, 4.709e-08, 3.915e-08, 3.259e-08,
824 2.738e-08, 2.327e-08, 1.98e-08, 1.711e-08, 1.493e-08, 1.306e-08,
825 1.165e-08, 1.049e-08, 9.439e-09, 8.375e-09, 7.391e-09, 6.525e-09,
826 5.759e-09, 5.083e-09, 4.485e-09, 3.953e-09, 3.601e-09, 3.27e-09,
827 2.975e-09, 2.757e-09, 2.556e-09, 2.37e-09, 2.195e-09, 2.032e-09,
828 1.912e-09, 1.79e-09, 1.679e-09, 1.572e-09, 1.482e-09, 1.402e-09,
829 1.326e-09, 1.254e-09, 1.187e-09, 1.127e-09, 1.071e-09, 1.02e-09,
830 9.673e-10, 9.193e-10, 8.752e-10, 8.379e-10, 8.017e-10, 7.66e-10,
831 7.319e-10, 7.004e-10, 6.721e-10, 6.459e-10, 6.199e-10, 5.942e-10,
832 5.703e-10, 5.488e-10, 5.283e-10, 5.082e-10, 4.877e-10, 4.696e-10,
833 4.52e-10, 4.355e-10, 4.198e-10, 4.039e-10, 3.888e-10, 3.754e-10,
834 3.624e-10, 3.499e-10, 3.381e-10, 3.267e-10, 3.163e-10, 3.058e-10,
835 2.959e-10, 2.864e-10, 2.77e-10, 2.686e-10, 2.604e-10, 2.534e-10,
836 2.462e-10, 2.386e-10, 2.318e-10, 2.247e-10, 2.189e-10, 2.133e-10,
837 2.071e-10, 2.014e-10, 1.955e-10, 1.908e-10, 1.86e-10, 1.817e-10
838 };
839
840 static const double n2o5[121] = {
841 1.231e-11, 3.035e-12, 1.702e-12, 9.877e-13, 8.081e-13, 9.039e-13,
842 1.169e-12, 1.474e-12, 1.651e-12, 1.795e-12, 1.998e-12, 2.543e-12,
843 4.398e-12, 7.698e-12, 1.28e-11, 2.131e-11, 3.548e-11, 5.894e-11,
844 7.645e-11, 1.089e-10, 1.391e-10, 1.886e-10, 2.386e-10, 2.986e-10,
845 3.487e-10, 3.994e-10, 4.5e-10, 4.6e-10, 4.591e-10, 4.1e-10, 3.488e-10,
846 2.846e-10, 2.287e-10, 1.696e-10, 1.011e-10, 6.428e-11, 4.324e-11,
847 2.225e-11, 6.214e-12, 3.608e-12, 8.793e-13, 4.491e-13, 1.04e-13,
848 6.1e-14, 3.436e-14, 6.671e-15, 1.171e-15, 5.848e-16, 1.212e-16,
849 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
850 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
851 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
852 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
853 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
854 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
855 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
856 1e-16, 1e-16
857 };
858
859 static const double nh3[121] = {
860 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
861 1e-10, 1e-10, 1e-10, 1e-10, 9.444e-11, 8.488e-11, 7.241e-11, 5.785e-11,
862 4.178e-11, 3.018e-11, 2.18e-11, 1.574e-11, 1.137e-11, 8.211e-12,
863 5.973e-12, 4.327e-12, 3.118e-12, 2.234e-12, 1.573e-12, 1.04e-12,
864 6.762e-13, 4.202e-13, 2.406e-13, 1.335e-13, 6.938e-14, 3.105e-14,
865 1.609e-14, 1.033e-14, 6.432e-15, 4.031e-15, 2.555e-15, 1.656e-15,
866 1.115e-15, 7.904e-16, 5.63e-16, 4.048e-16, 2.876e-16, 2.004e-16,
867 1.356e-16, 9.237e-17, 6.235e-17, 4.223e-17, 3.009e-17, 2.328e-17,
868 2.002e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
869 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
870 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
871 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
872 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
873 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
874 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
875 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
876 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
877 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
878 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
879 1.914e-17
880 };
881
882 static const double no[121] = {
883 2.586e-10, 4.143e-11, 1.566e-11, 9.591e-12, 8.088e-12, 8.462e-12,
884 1.013e-11, 1.328e-11, 1.855e-11, 2.678e-11, 3.926e-11, 5.464e-11,
885 7.012e-11, 8.912e-11, 1.127e-10, 1.347e-10, 1.498e-10, 1.544e-10,
886 1.602e-10, 1.824e-10, 2.078e-10, 2.366e-10, 2.691e-10, 5.141e-10,
887 8.259e-10, 1.254e-09, 1.849e-09, 2.473e-09, 3.294e-09, 4.16e-09,
888 5.095e-09, 6.11e-09, 6.93e-09, 7.888e-09, 8.903e-09, 9.713e-09,
889 1.052e-08, 1.115e-08, 1.173e-08, 1.21e-08, 1.228e-08, 1.239e-08,
890 1.231e-08, 1.213e-08, 1.192e-08, 1.138e-08, 1.085e-08, 1.008e-08,
891 9.224e-09, 8.389e-09, 7.262e-09, 6.278e-09, 5.335e-09, 4.388e-09,
892 3.589e-09, 2.761e-09, 2.129e-09, 1.633e-09, 1.243e-09, 9.681e-10,
893 8.355e-10, 7.665e-10, 7.442e-10, 8.584e-10, 9.732e-10, 1.063e-09,
894 1.163e-09, 1.286e-09, 1.472e-09, 1.707e-09, 2.032e-09, 2.474e-09,
895 2.977e-09, 3.506e-09, 4.102e-09, 5.013e-09, 6.493e-09, 8.414e-09,
896 1.077e-08, 1.367e-08, 1.777e-08, 2.625e-08, 3.926e-08, 5.545e-08,
897 7.195e-08, 9.464e-08, 1.404e-07, 2.183e-07, 3.329e-07, 4.535e-07,
898 6.158e-07, 8.187e-07, 1.075e-06, 1.422e-06, 1.979e-06, 2.71e-06,
899 3.58e-06, 4.573e-06, 5.951e-06, 7.999e-06, 1.072e-05, 1.372e-05,
900 1.697e-05, 2.112e-05, 2.643e-05, 3.288e-05, 3.994e-05, 4.794e-05,
901 5.606e-05, 6.383e-05, 7.286e-05, 8.156e-05, 8.883e-05, 9.469e-05,
902 9.848e-05, 0.0001023, 0.0001066, 0.0001115, 0.0001145, 0.0001142,
903 0.0001133
904 };
905
906 static const double no2[121] = {
907 3.036e-09, 2.945e-10, 9.982e-11, 5.069e-11, 3.485e-11, 2.982e-11,
908 2.947e-11, 3.164e-11, 3.714e-11, 4.586e-11, 6.164e-11, 8.041e-11,
909 9.982e-11, 1.283e-10, 1.73e-10, 2.56e-10, 3.909e-10, 5.959e-10,
910 9.081e-10, 1.384e-09, 1.788e-09, 2.189e-09, 2.686e-09, 3.091e-09,
911 3.49e-09, 3.796e-09, 4.2e-09, 5.103e-09, 6.005e-09, 6.3e-09, 6.706e-09,
912 7.07e-09, 7.434e-09, 7.663e-09, 7.788e-09, 7.8e-09, 7.597e-09,
913 7.482e-09, 7.227e-09, 6.403e-09, 5.585e-09, 4.606e-09, 3.703e-09,
914 2.984e-09, 2.183e-09, 1.48e-09, 8.441e-10, 5.994e-10, 3.799e-10,
915 2.751e-10, 1.927e-10, 1.507e-10, 1.102e-10, 6.971e-11, 5.839e-11,
916 3.904e-11, 3.087e-11, 2.176e-11, 1.464e-11, 1.209e-11, 8.497e-12,
917 6.477e-12, 4.371e-12, 2.914e-12, 2.424e-12, 1.753e-12, 1.35e-12,
918 9.417e-13, 6.622e-13, 5.148e-13, 3.841e-13, 3.446e-13, 3.01e-13,
919 2.551e-13, 2.151e-13, 1.829e-13, 1.64e-13, 1.475e-13, 1.352e-13,
920 1.155e-13, 9.963e-14, 9.771e-14, 9.577e-14, 9.384e-14, 9.186e-14,
921 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
922 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
923 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
924 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14
925 };
926
927 static const double o3[121] = {
928 2.218e-08, 3.394e-08, 3.869e-08, 4.219e-08, 4.501e-08, 4.778e-08,
929 5.067e-08, 5.402e-08, 5.872e-08, 6.521e-08, 7.709e-08, 9.461e-08,
930 1.269e-07, 1.853e-07, 2.723e-07, 3.964e-07, 5.773e-07, 8.2e-07,
931 1.155e-06, 1.59e-06, 2.076e-06, 2.706e-06, 3.249e-06, 3.848e-06,
932 4.459e-06, 4.986e-06, 5.573e-06, 5.958e-06, 6.328e-06, 6.661e-06,
933 6.9e-06, 7.146e-06, 7.276e-06, 7.374e-06, 7.447e-06, 7.383e-06,
934 7.321e-06, 7.161e-06, 6.879e-06, 6.611e-06, 6.216e-06, 5.765e-06,
935 5.355e-06, 4.905e-06, 4.471e-06, 4.075e-06, 3.728e-06, 3.413e-06,
936 3.125e-06, 2.856e-06, 2.607e-06, 2.379e-06, 2.17e-06, 1.978e-06,
937 1.8e-06, 1.646e-06, 1.506e-06, 1.376e-06, 1.233e-06, 1.102e-06,
938 9.839e-07, 8.771e-07, 7.814e-07, 6.947e-07, 6.102e-07, 5.228e-07,
939 4.509e-07, 3.922e-07, 3.501e-07, 3.183e-07, 2.909e-07, 2.686e-07,
940 2.476e-07, 2.284e-07, 2.109e-07, 2.003e-07, 2.013e-07, 2.022e-07,
941 2.032e-07, 2.042e-07, 2.097e-07, 2.361e-07, 2.656e-07, 2.989e-07,
942 3.37e-07, 3.826e-07, 4.489e-07, 5.26e-07, 6.189e-07, 7.312e-07,
943 8.496e-07, 8.444e-07, 8.392e-07, 8.339e-07, 8.286e-07, 8.234e-07,
944 8.181e-07, 8.129e-07, 8.077e-07, 8.026e-07, 6.918e-07, 5.176e-07,
945 3.865e-07, 2.885e-07, 2.156e-07, 1.619e-07, 1.219e-07, 9.161e-08,
946 6.972e-08, 5.399e-08, 3.498e-08, 2.111e-08, 1.322e-08, 8.482e-09,
947 5.527e-09, 3.423e-09, 2.071e-09, 1.314e-09, 8.529e-10, 5.503e-10,
948 3.665e-10
949 };
950
951 static const double ocs[121] = {
952 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 5.997e-10,
953 5.989e-10, 5.881e-10, 5.765e-10, 5.433e-10, 5.074e-10, 4.567e-10,
954 4.067e-10, 3.601e-10, 3.093e-10, 2.619e-10, 2.232e-10, 1.805e-10,
955 1.46e-10, 1.187e-10, 8.03e-11, 5.435e-11, 3.686e-11, 2.217e-11,
956 1.341e-11, 8.756e-12, 4.511e-12, 2.37e-12, 1.264e-12, 8.28e-13,
957 5.263e-13, 3.209e-13, 1.717e-13, 9.068e-14, 4.709e-14, 2.389e-14,
958 1.236e-14, 1.127e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
959 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
960 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
961 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
962 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
963 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
964 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
965 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
966 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
967 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
968 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
969 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
970 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
971 1.091e-14, 1.091e-14, 1.091e-14
972 };
973
974 static const double sf6[121] = {
975 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12,
976 4.103e-12, 4.103e-12, 4.103e-12, 4.087e-12, 4.064e-12, 4.023e-12,
977 3.988e-12, 3.941e-12, 3.884e-12, 3.755e-12, 3.622e-12, 3.484e-12,
978 3.32e-12, 3.144e-12, 2.978e-12, 2.811e-12, 2.653e-12, 2.489e-12,
979 2.332e-12, 2.199e-12, 2.089e-12, 2.013e-12, 1.953e-12, 1.898e-12,
980 1.859e-12, 1.826e-12, 1.798e-12, 1.776e-12, 1.757e-12, 1.742e-12,
981 1.728e-12, 1.717e-12, 1.707e-12, 1.698e-12, 1.691e-12, 1.685e-12,
982 1.679e-12, 1.675e-12, 1.671e-12, 1.668e-12, 1.665e-12, 1.663e-12,
983 1.661e-12, 1.659e-12, 1.658e-12, 1.657e-12, 1.656e-12, 1.655e-12,
984 1.654e-12, 1.653e-12, 1.653e-12, 1.652e-12, 1.652e-12, 1.652e-12,
985 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12,
986 1.651e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
987 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
988 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
989 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
990 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
991 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
992 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
993 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12
994 };
995
996 static const double so2[121] = {
997 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
998 1e-10, 1e-10, 9.867e-11, 9.537e-11, 9e-11, 8.404e-11, 7.799e-11,
999 7.205e-11, 6.616e-11, 6.036e-11, 5.475e-11, 5.007e-11, 4.638e-11,
1000 4.346e-11, 4.055e-11, 3.763e-11, 3.471e-11, 3.186e-11, 2.905e-11,
1001 2.631e-11, 2.358e-11, 2.415e-11, 2.949e-11, 3.952e-11, 5.155e-11,
1002 6.76e-11, 8.741e-11, 1.099e-10, 1.278e-10, 1.414e-10, 1.512e-10,
1003 1.607e-10, 1.699e-10, 1.774e-10, 1.832e-10, 1.871e-10, 1.907e-10,
1004 1.943e-10, 1.974e-10, 1.993e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1005 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1006 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1007 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1008 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1009 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1010 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1011 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10
1012 };
1013
1014 const double *q[NG] = { NULL };
1015
1016 /* Identify variable... */
1017 for (int ig = 0; ig < ctl->ng; ig++) {
1018 q[ig] = NULL;
1019 if (strcasecmp(ctl->emitter[ig], "C2H2") == 0)
1020 q[ig] = c2h2;
1021 if (strcasecmp(ctl->emitter[ig], "C2H6") == 0)
1022 q[ig] = c2h6;
1023 if (strcasecmp(ctl->emitter[ig], "CCl4") == 0)
1024 q[ig] = ccl4;
1025 if (strcasecmp(ctl->emitter[ig], "CH3OH") == 0)
1026 q[ig] = ch3oh;
1027 if (strcasecmp(ctl->emitter[ig], "CH4") == 0)
1028 q[ig] = ch4;
1029 if (strcasecmp(ctl->emitter[ig], "ClO") == 0)
1030 q[ig] = clo;
1031 if (strcasecmp(ctl->emitter[ig], "ClONO2") == 0)
1032 q[ig] = clono2;
1033 if (strcasecmp(ctl->emitter[ig], "CO") == 0)
1034 q[ig] = co;
1035 if (strcasecmp(ctl->emitter[ig], "COF2") == 0)
1036 q[ig] = cof2;
1037 if (strcasecmp(ctl->emitter[ig], "F11") == 0)
1038 q[ig] = f11;
1039 if (strcasecmp(ctl->emitter[ig], "F113") == 0)
1040 q[ig] = f113;
1041 if (strcasecmp(ctl->emitter[ig], "F114") == 0)
1042 q[ig] = f114;
1043 if (strcasecmp(ctl->emitter[ig], "F12") == 0)
1044 q[ig] = f12;
1045 if (strcasecmp(ctl->emitter[ig], "F14") == 0)
1046 q[ig] = f14;
1047 if (strcasecmp(ctl->emitter[ig], "F22") == 0)
1048 q[ig] = f22;
1049 if (strcasecmp(ctl->emitter[ig], "H2CO") == 0)
1050 q[ig] = h2co;
1051 if (strcasecmp(ctl->emitter[ig], "H2O") == 0)
1052 q[ig] = h2o;
1053 if (strcasecmp(ctl->emitter[ig], "H2O2") == 0)
1054 q[ig] = h2o2;
1055 if (strcasecmp(ctl->emitter[ig], "HCl") == 0)
1056 q[ig] = hcl;
1057 if (strcasecmp(ctl->emitter[ig], "HCN") == 0)
1058 q[ig] = hcn;
1059 if (strcasecmp(ctl->emitter[ig], "HF") == 0)
1060 q[ig] = hf;
1061 if (strcasecmp(ctl->emitter[ig], "HNO3") == 0)
1062 q[ig] = hno3;
1063 if (strcasecmp(ctl->emitter[ig], "HNO4") == 0)
1064 q[ig] = hno4;
1065 if (strcasecmp(ctl->emitter[ig], "HOCl") == 0)
1066 q[ig] = hocl;
1067 if (strcasecmp(ctl->emitter[ig], "N2O") == 0)
1068 q[ig] = n2o;
1069 if (strcasecmp(ctl->emitter[ig], "N2O5") == 0)
1070 q[ig] = n2o5;
1071 if (strcasecmp(ctl->emitter[ig], "NH3") == 0)
1072 q[ig] = nh3;
1073 if (strcasecmp(ctl->emitter[ig], "NO") == 0)
1074 q[ig] = no;
1075 if (strcasecmp(ctl->emitter[ig], "NO2") == 0)
1076 q[ig] = no2;
1077 if (strcasecmp(ctl->emitter[ig], "O3") == 0)
1078 q[ig] = o3;
1079 if (strcasecmp(ctl->emitter[ig], "OCS") == 0)
1080 q[ig] = ocs;
1081 if (strcasecmp(ctl->emitter[ig], "SF6") == 0)
1082 q[ig] = sf6;
1083 if (strcasecmp(ctl->emitter[ig], "SO2") == 0)
1084 q[ig] = so2;
1085 }
1086
1087 /* Loop over atmospheric data points... */
1088 for (int ip = 0; ip < atm->np; ip++) {
1089
1090 /* Get altitude index... */
1091 const int iz = locate_reg(z, 121, atm->z[ip]);
1092
1093 /* Interpolate pressure... */
1094 atm->p[ip] = LOGY(z[iz], pre[iz], z[iz + 1], pre[iz + 1], atm->z[ip]);
1095
1096 /* Interpolate temperature... */
1097 atm->t[ip] = LIN(z[iz], tem[iz], z[iz + 1], tem[iz + 1], atm->z[ip]);
1098
1099 /* Interpolate trace gases... */
1100 for (int ig = 0; ig < ctl->ng; ig++)
1101 if (q[ig] != NULL)
1102 atm->q[ig][ip] =
1103 LIN(z[iz], q[ig][iz], z[iz + 1], q[ig][iz + 1], atm->z[ip]);
1104 else
1105 atm->q[ig][ip] = 0;
1106
1107 /* Set CO2... */
1108 if (ctl->ig_co2 >= 0)
1109 atm->q[ctl->ig_co2][ip] =
1110 371.789948e-6 + 2.026214e-6 * (atm->time[ip] - 63158400.) / 31557600.;
1111
1112 /* Set N2... */
1113 if (ctl->ig_n2 >= 0)
1114 atm->q[ctl->ig_n2][ip] = N2;
1115
1116 /* Set O2... */
1117 if (ctl->ig_o2 >= 0)
1118 atm->q[ctl->ig_o2][ip] = O2;
1119
1120 /* Set extinction to zero... */
1121 for (int iw = 0; iw < ctl->nw; iw++)
1122 atm->k[iw][ip] = 0;
1123
1124 /* Set cloud layer... */
1125 atm->clz = atm->cldz = 0;
1126 for (int icl = 0; icl < ctl->ncl; icl++)
1127 atm->clk[icl] = 0;
1128
1129 /* Set surface layer... */
1130 atm->sft = 0;
1131 for (int isf = 0; isf < ctl->nsf; isf++)
1132 atm->sfeps[isf] = 1;
1133 }
1134}
1135
1136/*****************************************************************************/
1137
1139 gsl_vector *dx,
1140 gsl_vector *dy,
1141 gsl_matrix *s_a_inv,
1142 gsl_vector *sig_eps_inv) {
1143
1144 double chisq_a, chisq_m = 0;
1145
1146 /* Get sizes... */
1147 const size_t m = dy->size;
1148 const size_t n = dx->size;
1149
1150 /* Allocate... */
1151 gsl_vector *x_aux = gsl_vector_alloc(n);
1152 gsl_vector *y_aux = gsl_vector_alloc(m);
1153
1154 /* Determine normalized cost function...
1155 (chi^2 = 1/m * [dy^T * S_eps^{-1} * dy + dx^T * S_a^{-1} * dx]) */
1156 for (size_t i = 0; i < m; i++)
1157 chisq_m += POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
1158 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
1159 gsl_blas_ddot(dx, x_aux, &chisq_a);
1160
1161 /* Free... */
1162 gsl_vector_free(x_aux);
1163 gsl_vector_free(y_aux);
1164
1165 /* Return cost function value... */
1166 return (chisq_m + chisq_a) / (double) m;
1167}
1168
1169/*****************************************************************************/
1170
1171double ctmco2(
1172 const double nu,
1173 const double p,
1174 const double t,
1175 const double u) {
1176
1177 static const double co2296[2001] =
1178 { 9.3388e-5, 9.7711e-5, 1.0224e-4, 1.0697e-4,
1179 1.1193e-4, 1.1712e-4, 1.2255e-4, 1.2824e-4, 1.3419e-4, 1.4043e-4,
1180 1.4695e-4, 1.5378e-4, 1.6094e-4, 1.6842e-4, 1.7626e-4, 1.8447e-4,
1181 1.9307e-4, 2.0207e-4, 2.1149e-4, 2.2136e-4, 2.3169e-4, 2.4251e-4,
1182 2.5384e-4, 2.657e-4, 2.7813e-4, 2.9114e-4, 3.0477e-4, 3.1904e-4,
1183 3.3399e-4, 3.4965e-4, 3.6604e-4, 3.8322e-4, 4.0121e-4, 4.2006e-4,
1184 4.398e-4, 4.6047e-4, 4.8214e-4, 5.0483e-4, 5.286e-4, 5.535e-4,
1185 5.7959e-4, 6.0693e-4, 6.3557e-4, 6.6558e-4, 6.9702e-4, 7.2996e-4,
1186 7.6449e-4, 8.0066e-4, 8.3856e-4, 8.7829e-4, 9.1991e-4, 9.6354e-4,
1187 .0010093, .0010572, .0011074, .00116, .0012152, .001273,
1188 .0013336, .0013972, .0014638, .0015336, .0016068, .0016835,
1189 .001764, .0018483, .0019367, .0020295, .0021267, .0022286,
1190 .0023355, .0024476, .0025652, .0026885, .0028178, .0029534,
1191 .0030956, .0032448, .0034012, .0035654, .0037375, .0039181,
1192 .0041076, .0043063, .0045148, .0047336, .0049632, .005204,
1193 .0054567, .0057219, .0060002, .0062923, .0065988, .0069204,
1194 .007258, .0076123, .0079842, .0083746, .0087844, .0092146,
1195 .0096663, .01014, .010638, .011161, .01171, .012286, .012891,
1196 .013527, .014194, .014895, .015631, .016404, .017217, .01807,
1197 .018966, .019908, .020897, .021936, .023028, .024176, .025382,
1198 .026649, .027981, .02938, .030851, .032397, .034023, .035732,
1199 .037528, .039416, .041402, .04349, .045685, .047994, .050422,
1200 .052975, .055661, .058486, .061458, .064584, .067873, .071334,
1201 .074975, .078807, .082839, .087082, .091549, .096249, .1012,
1202 .10641, .11189, .11767, .12375, .13015, .13689, .14399, .15147,
1203 .15935, .16765, .17639, .18561, .19531, .20554, .21632, .22769,
1204 .23967, .25229, .2656, .27964, .29443, .31004, .3265, .34386,
1205 .36218, .3815, .40188, .42339, .44609, .47004, .49533, .52202,
1206 .5502, .57995, .61137, .64455, .6796, .71663, .75574, .79707,
1207 .84075, .88691, .9357, .98728, 1.0418, 1.0995, 1.1605, 1.225,
1208 1.2932, 1.3654, 1.4418, 1.5227, 1.6083, 1.6989, 1.7948, 1.8964,
1209 2.004, 2.118, 2.2388, 2.3668, 2.5025, 2.6463, 2.7988, 2.9606,
1210 3.1321, 3.314, 3.5071, 3.712, 3.9296, 4.1605, 4.4058, 4.6663,
1211 4.9431, 5.2374, 5.5501, 5.8818, 6.2353, 6.6114, 7.0115, 7.4372,
1212 7.8905, 8.3731, 8.8871, 9.4349, 10.019, 10.641, 11.305, 12.013,
1213 12.769, 13.576, 14.437, 15.358, 16.342, 17.39, 18.513, 19.716,
1214 21.003, 22.379, 23.854, 25.436, 27.126, 28.942, 30.89, 32.973,
1215 35.219, 37.634, 40.224, 43.021, 46.037, 49.29, 52.803, 56.447,
1216 60.418, 64.792, 69.526, 74.637, 80.182, 86.193, 92.713, 99.786,
1217 107.47, 115.84, 124.94, 134.86, 145.69, 157.49, 170.3, 184.39,
1218 199.83, 216.4, 234.55, 254.72, 276.82, 299.85, 326.16, 354.99,
1219 386.51, 416.68, 449.89, 490.12, 534.35, 578.25, 632.26, 692.61,
1220 756.43, 834.75, 924.11, 1016.9, 996.96, 1102.7, 1219.2, 1351.9,
1221 1494.3, 1654.1, 1826.5, 2027.9, 2249., 2453.8, 2714.4, 2999.4,
1222 3209.5, 3509., 3840.4, 3907.5, 4190.7, 4533.5, 4648.3, 5059.1,
1223 5561.6, 6191.4, 6820.8, 7905.9, 9362.2, 2431.3, 2211.3, 2046.8,
1224 2023.8, 1985.9, 1905.9, 1491.1, 1369.8, 1262.2, 1200.7, 887.74,
1225 820.25, 885.23, 887.21, 816.73, 1126.9, 1216.2, 1272.4, 1579.5,
1226 1634.2, 1656.3, 1657.9, 1789.5, 1670.8, 1509.5, 8474.6, 7489.2,
1227 6793.6, 6117., 5574.1, 5141.2, 5084.6, 4745.1, 4413.2, 4102.8,
1228 4024.7, 3715., 3398.6, 3100.8, 2900.4, 2629.2, 2374., 2144.7,
1229 1955.8, 1760.8, 1591.2, 1435.2, 1296.2, 1174., 1065.1, 967.76,
1230 999.48, 897.45, 809.23, 732.77, 670.26, 611.93, 560.11, 518.77,
1231 476.84, 438.8, 408.48, 380.21, 349.24, 322.71, 296.65, 272.85,
1232 251.96, 232.04, 213.88, 197.69, 182.41, 168.41, 155.79, 144.05,
1233 133.31, 123.48, 114.5, 106.21, 98.591, 91.612, 85.156, 79.204,
1234 73.719, 68.666, 63.975, 59.637, 56.35, 52.545, 49.042, 45.788,
1235 42.78, 39.992, 37.441, 35.037, 32.8, 30.744, 28.801, 26.986,
1236 25.297, 23.731, 22.258, 20.883, 19.603, 18.403, 17.295, 16.249,
1237 15.271, 14.356, 13.501, 12.701, 11.954, 11.254, 10.6, 9.9864,
1238 9.4118, 8.8745, 8.3714, 7.8997, 7.4578, 7.0446, 6.6573, 6.2949,
1239 5.9577, 5.6395, 5.3419, 5.063, 4.8037, 4.5608, 4.3452, 4.1364,
1240 3.9413, 3.7394, 3.562, 3.3932, 3.2325, 3.0789, 2.9318, 2.7898,
1241 2.6537, 2.5225, 2.3958, 2.2305, 2.1215, 2.0245, 1.9427, 1.8795,
1242 1.8336, 1.7604, 1.7016, 1.6419, 1.5282, 1.4611, 1.3443, 1.27,
1243 1.1675, 1.0824, 1.0534, .99833, .95854, .92981, .90887, .89346,
1244 .88113, .87068, .86102, .85096, .88262, .86151, .83565, .80518,
1245 .77045, .73736, .74744, .74954, .75773, .82267, .83493, .89402,
1246 .89725, .93426, .95564, .94045, .94174, .93404, .92035, .90456,
1247 .88621, .86673, .78117, .7515, .72056, .68822, .65658, .62764,
1248 .55984, .55598, .57407, .60963, .63763, .66198, .61132, .60972,
1249 .52496, .50649, .41872, .3964, .32422, .27276, .24048, .23772,
1250 .2286, .22711, .23999, .32038, .34371, .36621, .38561, .39953,
1251 .40636, .44913, .42716, .3919, .35477, .33935, .3351, .39746,
1252 .40993, .49398, .49956, .56157, .54742, .57295, .57386, .55417,
1253 .50745, .471, .43446, .39102, .34993, .31269, .27888, .24912,
1254 .22291, .19994, .17972, .16197, .14633, .13252, .12029, .10942,
1255 .099745, .091118, .083404, .076494, .070292, .064716, .059697,
1256 .055173, .051093, .047411, .044089, .041092, .038392, .035965,
1257 .033789, .031846, .030122, .028607, .02729, .026169, .025209,
1258 .024405, .023766, .023288, .022925, .022716, .022681, .022685,
1259 .022768, .023133, .023325, .023486, .024004, .024126, .024083,
1260 .023785, .024023, .023029, .021649, .021108, .019454, .017809,
1261 .017292, .016635, .017037, .018068, .018977, .018756, .017847,
1262 .016557, .016142, .014459, .012869, .012381, .010875, .0098701,
1263 .009285, .0091698, .0091701, .0096145, .010553, .01106, .012613,
1264 .014362, .015017, .016507, .017741, .01768, .017784, .0171,
1265 .016357, .016172, .017257, .018978, .020935, .021741, .023567,
1266 .025183, .025589, .026732, .027648, .028278, .028215, .02856,
1267 .029015, .029062, .028851, .028497, .027825, .027801, .026523,
1268 .02487, .022967, .022168, .020194, .018605, .017903, .018439,
1269 .019697, .020311, .020855, .020057, .018608, .016738, .015963,
1270 .013844, .011801, .011134, .0097573, .0086007, .0086226,
1271 .0083721, .0090978, .0097616, .0098426, .011317, .012853, .01447,
1272 .014657, .015771, .016351, .016079, .014829, .013431, .013185,
1273 .013207, .01448, .016176, .017971, .018265, .019526, .020455,
1274 .019797, .019802, .0194, .018176, .017505, .016197, .015339,
1275 .014401, .013213, .012203, .011186, .010236, .0093288, .0084854,
1276 .0076837, .0069375, .0062614, .0056628, .0051153, .0046015,
1277 .0041501, .003752, .0033996, .0030865, .0028077, .0025586,
1278 .0023355, .0021353, .0019553, .0017931, .0016466, .0015141,
1279 .0013941, .0012852, .0011862, .0010962, .0010142, 9.3935e-4,
1280 8.71e-4, 8.0851e-4, 7.5132e-4, 6.9894e-4, 6.5093e-4, 6.0689e-4,
1281 5.6647e-4, 5.2935e-4, 4.9525e-4, 4.6391e-4, 4.3509e-4, 4.086e-4,
1282 3.8424e-4, 3.6185e-4, 3.4126e-4, 3.2235e-4, 3.0498e-4, 2.8904e-4,
1283 2.7444e-4, 2.6106e-4, 2.4883e-4, 2.3766e-4, 2.275e-4, 2.1827e-4,
1284 2.0992e-4, 2.0239e-4, 1.9563e-4, 1.896e-4, 1.8427e-4, 1.796e-4,
1285 1.7555e-4, 1.7209e-4, 1.692e-4, 1.6687e-4, 1.6505e-4, 1.6375e-4,
1286 1.6294e-4, 1.6261e-4, 1.6274e-4, 1.6334e-4, 1.6438e-4, 1.6587e-4,
1287 1.678e-4, 1.7017e-4, 1.7297e-4, 1.762e-4, 1.7988e-4, 1.8399e-4,
1288 1.8855e-4, 1.9355e-4, 1.9902e-4, 2.0494e-4, 2.1134e-4, 2.1823e-4,
1289 2.2561e-4, 2.335e-4, 2.4192e-4, 2.5088e-4, 2.604e-4, 2.705e-4,
1290 2.8119e-4, 2.9251e-4, 3.0447e-4, 3.171e-4, 3.3042e-4, 3.4447e-4,
1291 3.5927e-4, 3.7486e-4, 3.9127e-4, 4.0854e-4, 4.267e-4, 4.4579e-4,
1292 4.6586e-4, 4.8696e-4, 5.0912e-4, 5.324e-4, 5.5685e-4, 5.8253e-4,
1293 6.0949e-4, 6.378e-4, 6.6753e-4, 6.9873e-4, 7.3149e-4, 7.6588e-4,
1294 8.0198e-4, 8.3987e-4, 8.7964e-4, 9.2139e-4, 9.6522e-4, .0010112,
1295 .0010595, .0011102, .0011634, .0012193, .001278, .0013396,
1296 .0014043, .0014722, .0015436, .0016185, .0016972, .0017799,
1297 .0018668, .001958, .0020539, .0021547, .0022606, .0023719,
1298 .002489, .002612, .0027414, .0028775, .0030206, .0031712,
1299 .0033295, .0034962, .0036716, .0038563, .0040506, .0042553,
1300 .0044709, .004698, .0049373, .0051894, .0054552, .0057354,
1301 .006031, .0063427, .0066717, .0070188, .0073854, .0077726,
1302 .0081816, .0086138, .0090709, .0095543, .010066, .010607,
1303 .011181, .011789, .012433, .013116, .013842, .014613, .015432,
1304 .016304, .017233, .018224, .019281, .020394, .021574, .022836,
1305 .024181, .025594, .027088, .028707, .030401, .032245, .034219,
1306 .036262, .038539, .040987, .043578, .04641, .04949, .052726,
1307 .056326, .0602, .064093, .068521, .073278, .077734, .083064,
1308 .088731, .093885, .1003, .1072, .11365, .12187, .13078, .13989,
1309 .15095, .16299, .17634, .19116, .20628, .22419, .24386, .26587,
1310 .28811, .31399, .34321, .36606, .39675, .42742, .44243, .47197,
1311 .49993, .49027, .51147, .52803, .48931, .49729, .5026, .43854,
1312 .441, .44766, .43414, .46151, .50029, .55247, .43855, .32115,
1313 .32607, .3431, .36119, .38029, .41179, .43996, .47144, .51853,
1314 .55362, .59122, .66338, .69877, .74001, .82923, .86907, .90361,
1315 1.0025, 1.031, 1.0559, 1.104, 1.1178, 1.1341, 1.1547, 1.351,
1316 1.4772, 1.4812, 1.4907, 1.512, 1.5442, 1.5853, 1.6358, 1.6963,
1317 1.7674, 1.8474, 1.9353, 2.0335, 2.143, 2.2592, 2.3853, 2.5217,
1318 2.6686, 2.8273, 2.9998, 3.183, 3.3868, 3.6109, 3.8564, 4.1159,
1319 4.4079, 4.7278, 5.0497, 5.3695, 5.758, 6.0834, 6.4976, 6.9312,
1320 7.38, 7.5746, 7.9833, 8.3791, 8.3956, 8.7501, 9.1067, 9.072,
1321 9.4649, 9.9112, 10.402, 10.829, 11.605, 12.54, 12.713, 10.443,
1322 10.825, 11.375, 11.955, 12.623, 13.326, 14.101, 15.041, 15.547,
1323 16.461, 17.439, 18.716, 19.84, 21.036, 22.642, 23.901, 25.244,
1324 27.03, 28.411, 29.871, 31.403, 33.147, 34.744, 36.456, 39.239,
1325 43.605, 45.162, 47.004, 49.093, 51.391, 53.946, 56.673, 59.629,
1326 63.167, 66.576, 70.254, 74.222, 78.477, 83.034, 87.914, 93.18,
1327 98.77, 104.74, 111.15, 117.95, 125.23, 133.01, 141.33, 150.21,
1328 159.71, 169.89, 180.93, 192.54, 204.99, 218.34, 232.65, 248.,
1329 264.47, 282.14, 301.13, 321.53, 343.48, 367.08, 392.5, 419.88,
1330 449.4, 481.26, 515.64, 552.79, 592.99, 636.48, 683.61, 734.65,
1331 789.99, 850.02, 915.14, 985.81, 1062.5, 1147.1, 1237.8, 1336.4,
1332 1443.2, 1558.9, 1684.2, 1819.2, 1965.2, 2122.6, 2291.7, 2470.8,
1333 2665.7, 2874.9, 3099.4, 3337.9, 3541., 3813.3, 4111.9, 4439.3,
1334 4798.9, 5196., 5639.2, 6087.5, 6657.7, 7306.7, 8040.7, 8845.5,
1335 9702.2, 10670., 11739., 12842., 14141., 15498., 17068., 18729.,
1336 20557., 22559., 25248., 27664., 30207., 32915., 35611., 38081.,
1337 40715., 43191., 41651., 42750., 43785., 44353., 44366., 44189.,
1338 43618., 42862., 41878., 35133., 35215., 36383., 39420., 44055.,
1339 44155., 45850., 46853., 39197., 38274., 29942., 28553., 21792.,
1340 21228., 17106., 14955., 18181., 19557., 21427., 23728., 26301.,
1341 28584., 30775., 32536., 33867., 40089., 39204., 37329., 34452.,
1342 31373., 33921., 34800., 36043., 44415., 45162., 52181., 50895.,
1343 54140., 50840., 50468., 48302., 44915., 40910., 36754., 32755.,
1344 29093., 25860., 22962., 20448., 18247., 16326., 14645., 13165.,
1345 11861., 10708., 9686.9, 8779.7, 7971.9, 7250.8, 6605.7, 6027.2,
1346 5507.3, 5039.1, 4616.6, 4234.8, 3889., 3575.4, 3290.5, 3031.3,
1347 2795.2, 2579.9, 2383.1, 2203.3, 2038.6, 1887.6, 1749.1, 1621.9,
1348 1505., 1397.4, 1298.3, 1207., 1122.8, 1045., 973.1, 906.64,
1349 845.16, 788.22, 735.48, 686.57, 641.21, 599.1, 559.99, 523.64,
1350 489.85, 458.42, 429.16, 401.92, 376.54, 352.88, 330.82, 310.24,
1351 291.03, 273.09, 256.34, 240.69, 226.05, 212.37, 199.57, 187.59,
1352 176.37, 165.87, 156.03, 146.82, 138.17, 130.07, 122.47, 115.34,
1353 108.65, 102.37, 96.473, 90.934, 85.73, 80.84, 76.243, 71.922,
1354 67.858, 64.034, 60.438, 57.052, 53.866, 50.866, 48.04, 45.379,
1355 42.872, 40.51, 38.285, 36.188, 34.211, 32.347, 30.588, 28.929,
1356 27.362, 25.884, 24.489, 23.171, 21.929, 20.755, 19.646, 18.599,
1357 17.61, 16.677, 15.795, 14.961, 14.174, 13.43, 12.725, 12.06,
1358 11.431, 10.834, 10.27, 9.7361, 9.2302, 8.7518, 8.2997, 7.8724,
1359 7.4674, 7.0848, 6.7226, 6.3794, 6.054, 5.745, 5.4525, 5.1752,
1360 4.9121, 4.6625, 4.4259, 4.2015, 3.9888, 3.7872, 3.5961, 3.4149,
1361 3.2431, 3.0802, 2.9257, 2.7792, 2.6402, 2.5084, 2.3834, 2.2648,
1362 2.1522, 2.0455, 1.9441, 1.848, 1.7567, 1.6701, 1.5878, 1.5097,
1363 1.4356, 1.3651, 1.2981, 1.2345, 1.174, 1.1167, 1.062, 1.0101,
1364 .96087, .91414, .86986, .82781, .78777, .74971, .71339, .67882,
1365 .64604, .61473, .58507, .55676, .52987, .5044, .48014, .45715,
1366 .43527, .41453, .3948, .37609, .35831, .34142, .32524, .30995,
1367 .29536, .28142, .26807, .25527, .24311, .23166, .22077, .21053,
1368 .20081, .19143, .18261, .17407, .16603, .15833, .15089, .14385,
1369 .13707, .13065, .12449, .11865, .11306, .10774, .10266, .097818,
1370 .093203, .088815, .084641, .080671, .076892, .073296, .069873,
1371 .066613, .06351, .060555, .05774, .055058, .052504, .050071,
1372 .047752, .045543, .043438, .041432, .039521, .037699, .035962,
1373 .034307, .032729, .031225, .029791, .028423, .02712, .025877,
1374 .024692, .023563, .022485, .021458, .020478, .019543, .018652,
1375 .017802, .016992, .016219, .015481, .014778, .014107, .013467,
1376 .012856, .012274, .011718, .011188, .010682, .0102, .0097393,
1377 .0093001, .008881, .0084812, .0080997, .0077358, .0073885,
1378 .0070571, .0067409, .0064393, .0061514, .0058768, .0056147,
1379 .0053647, .0051262, .0048987, .0046816, .0044745, .0042769,
1380 .0040884, .0039088, .0037373, .0035739, .003418, .0032693,
1381 .0031277, .0029926, .0028639, .0027413, .0026245, .0025133,
1382 .0024074, .0023066, .0022108, .0021196, .002033, .0019507,
1383 .0018726, .0017985, .0017282, .0016617, .0015988, .0015394,
1384 .0014834, .0014306, .0013811, .0013346, .0012911, .0012506,
1385 .0012131, .0011784, .0011465, .0011175, .0010912, .0010678,
1386 .0010472, .0010295, .0010147, .001003, 9.9428e-4, 9.8883e-4,
1387 9.8673e-4, 9.8821e-4, 9.9343e-4, .0010027, .0010164, .0010348,
1388 .0010586, .0010882, .0011245, .0011685, .0012145, .0012666,
1389 .0013095, .0013688, .0014048, .0014663, .0015309, .0015499,
1390 .0016144, .0016312, .001705, .0017892, .0018499, .0019715,
1391 .0021102, .0022442, .0024284, .0025893, .0027703, .0029445,
1392 .0031193, .003346, .0034552, .0036906, .0037584, .0040084,
1393 .0041934, .0044587, .0047093, .0049759, .0053421, .0055134,
1394 .0059048, .0058663, .0061036, .0063259, .0059657, .0060653,
1395 .0060972, .0055539, .0055653, .0055772, .005331, .0054953,
1396 .0055919, .0058684, .006183, .0066675, .0069808, .0075142,
1397 .0078536, .0084282, .0089454, .0094625, .0093703, .0095857,
1398 .0099283, .010063, .010521, .0097778, .0098175, .010379, .010447,
1399 .0105, .010617, .010706, .01078, .011177, .011212, .011304,
1400 .011446, .011603, .011816, .012165, .012545, .013069, .013539,
1401 .01411, .014776, .016103, .017016, .017994, .018978, .01998,
1402 .021799, .022745, .023681, .024627, .025562, .026992, .027958,
1403 .029013, .030154, .031402, .03228, .033651, .035272, .037088,
1404 .039021, .041213, .043597, .045977, .04877, .051809, .054943,
1405 .058064, .061528, .06537, .069309, .071928, .075752, .079589,
1406 .083352, .084096, .087497, .090817, .091198, .094966, .099045,
1407 .10429, .10867, .11518, .12269, .13126, .14087, .15161, .16388,
1408 .16423, .1759, .18721, .19994, .21275, .22513, .23041, .24231,
1409 .25299, .25396, .26396, .27696, .27929, .2908, .30595, .31433,
1410 .3282, .3429, .35944, .37467, .39277, .41245, .43326, .45649,
1411 .48152, .51897, .54686, .57877, .61263, .64962, .68983, .73945,
1412 .78619, .83537, .89622, .95002, 1.0067, 1.0742, 1.1355, 1.2007,
1413 1.2738, 1.347, 1.4254, 1.5094, 1.6009, 1.6976, 1.8019, 1.9148,
1414 2.0357, 2.166, 2.3066, 2.4579, 2.6208, 2.7966, 2.986, 3.188,
1415 3.4081, 3.6456, 3.9, 4.1747, 4.4712, 4.7931, 5.1359, 5.5097,
1416 5.9117, 6.3435, 6.8003, 7.3001, 7.8385, 8.3945, 9.011, 9.6869,
1417 10.392, 11.18, 12.036, 12.938, 13.944, 14.881, 16.029, 17.255,
1418 18.574, 19.945, 21.38, 22.9, 24.477, 26.128, 27.87, 29.037,
1419 30.988, 33.145, 35.506, 37.76, 40.885, 44.487, 48.505, 52.911,
1420 57.56, 61.964, 67.217, 72.26, 78.343, 85.08, 91.867, 99.435,
1421 107.68, 116.97, 127.12, 138.32, 150.26, 163.04, 174.81, 189.26,
1422 205.61, 224.68, 240.98, 261.88, 285.1, 307.58, 334.35, 363.53,
1423 394.68, 427.85, 458.85, 489.25, 472.87, 486.93, 496.27, 501.52,
1424 501.57, 497.14, 488.09, 476.32, 393.76, 388.51, 393.42, 414.45,
1425 455.12, 514.62, 520.38, 547.42, 562.6, 487.47, 480.83, 391.06,
1426 376.92, 303.7, 295.91, 256.03, 236.73, 280.38, 310.71, 335.53,
1427 367.88, 401.94, 435.52, 469.13, 497.94, 588.82, 597.94, 597.2,
1428 588.28, 571.2, 555.75, 603.56, 638.15, 680.75, 801.72, 848.01,
1429 962.15, 990.06, 1068.1, 1076.2, 1115.3, 1134.2, 1136.6, 1119.1,
1430 1108.9, 1090.6, 1068.7, 1041.9, 1005.4, 967.98, 927.08, 780.1,
1431 751.41, 733.12, 742.65, 785.56, 855.16, 852.45, 878.1, 784.59,
1432 777.81, 765.13, 622.93, 498.09, 474.89, 386.9, 378.48, 336.17,
1433 322.04, 329.57, 350.5, 383.38, 420.02, 462.39, 499.71, 531.98,
1434 654.99, 653.43, 639.99, 605.16, 554.16, 504.42, 540.64, 552.33,
1435 679.46, 699.51, 713.91, 832.17, 919.91, 884.96, 907.57, 846.56,
1436 818.56, 768.93, 706.71, 642.17, 575.95, 515.38, 459.07, 409.02,
1437 364.61, 325.46, 291.1, 260.89, 234.39, 211.01, 190.38, 172.11,
1438 155.91, 141.49, 128.63, 117.13, 106.84, 97.584, 89.262, 81.756,
1439 74.975, 68.842, 63.28, 58.232, 53.641, 49.46, 45.649, 42.168,
1440 38.991, 36.078, 33.409, 30.96, 28.71, 26.642, 24.737, 22.985,
1441 21.37, 19.882, 18.512, 17.242, 16.073, 14.987, 13.984, 13.05,
1442 12.186, 11.384, 10.637, 9.9436, 9.2988, 8.6991, 8.141, 7.6215,
1443 7.1378, 6.6872, 6.2671, 5.8754, 5.51, 5.1691, 4.851, 4.5539,
1444 4.2764, 4.0169, 3.7742, 3.5472, 3.3348, 3.1359, 2.9495, 2.7749,
1445 2.6113, 2.4578, 2.3139, 2.1789, 2.0523, 1.9334, 1.8219, 1.7171,
1446 1.6188, 1.5263, 1.4395, 1.3579, 1.2812, 1.209, 1.1411, 1.0773,
1447 1.0171, .96048, .90713, .85684, .80959, .76495, .72282, .68309,
1448 .64563, .61035, .57707, .54573, .51622, .48834, .46199, .43709,
1449 .41359, .39129, .37034, .35064, .33198, .31442, .29784, .28218,
1450 .26732, .25337, .24017, .22774, .21601, .20479, .19426
1451 };
1452
1453 static const double co2260[2001] =
1454 { 5.7971e-5, 6.0733e-5, 6.3628e-5, 6.6662e-5,
1455 6.9843e-5, 7.3176e-5, 7.6671e-5, 8.0334e-5, 8.4175e-5, 8.8201e-5,
1456 9.2421e-5, 9.6846e-5, 1.0149e-4, 1.0635e-4, 1.1145e-4, 1.1679e-4,
1457 1.224e-4, 1.2828e-4, 1.3444e-4, 1.409e-4, 1.4768e-4, 1.5479e-4,
1458 1.6224e-4, 1.7006e-4, 1.7826e-4, 1.8685e-4, 1.9587e-4, 2.0532e-4,
1459 2.1524e-4, 2.2565e-4, 2.3656e-4, 2.48e-4, 2.6001e-4, 2.7261e-4,
1460 2.8582e-4, 2.9968e-4, 3.1422e-4, 3.2948e-4, 3.4548e-4, 3.6228e-4,
1461 3.799e-4, 3.9838e-4, 4.1778e-4, 4.3814e-4, 4.595e-4, 4.8191e-4,
1462 5.0543e-4, 5.3012e-4, 5.5603e-4, 5.8321e-4, 6.1175e-4, 6.417e-4,
1463 6.7314e-4, 7.0614e-4, 7.4078e-4, 7.7714e-4, 8.1531e-4, 8.5538e-4,
1464 8.9745e-4, 9.4162e-4, 9.8798e-4, .0010367, .0010878, .0011415,
1465 .0011978, .001257, .0013191, .0013844, .001453, .0015249,
1466 .0016006, .00168, .0017634, .001851, .001943, .0020397, .0021412,
1467 .0022479, .00236, .0024778, .0026015, .0027316, .0028682,
1468 .0030117, .0031626, .0033211, .0034877, .0036628, .0038469,
1469 .0040403, .0042436, .0044574, .004682, .0049182, .0051665,
1470 .0054276, .0057021, .0059907, .0062942, .0066133, .0069489,
1471 .0073018, .0076729, .0080632, .0084738, .0089056, .0093599,
1472 .0098377, .01034, .010869, .011426, .012011, .012627, .013276,
1473 .013958, .014676, .015431, .016226, .017063, .017944, .018872,
1474 .019848, .020876, .021958, .023098, .024298, .025561, .026892,
1475 .028293, .029769, .031323, .032961, .034686, .036503, .038418,
1476 .040435, .042561, .044801, .047161, .049649, .052271, .055035,
1477 .057948, .061019, .064256, .06767, .07127, .075066, .079069,
1478 .083291, .087744, .092441, .097396, .10262, .10814, .11396,
1479 .1201, .12658, .13342, .14064, .14826, .1563, .1648, .17376,
1480 .18323, .19324, .2038, .21496, .22674, .23919, .25234, .26624,
1481 .28093, .29646, .31287, .33021, .34855, .36794, .38844, .41012,
1482 .43305, .45731, .48297, .51011, .53884, .56924, .60141, .63547,
1483 .67152, .70969, .75012, .79292, .83826, .8863, .93718, .99111,
1484 1.0482, 1.1088, 1.173, 1.2411, 1.3133, 1.3898, 1.471, 1.5571,
1485 1.6485, 1.7455, 1.8485, 1.9577, 2.0737, 2.197, 2.3278, 2.4668,
1486 2.6145, 2.7715, 2.9383, 3.1156, 3.3042, 3.5047, 3.7181, 3.9451,
1487 4.1866, 4.4437, 4.7174, 5.0089, 5.3192, 5.65, 6.0025, 6.3782,
1488 6.7787, 7.206, 7.6617, 8.1479, 8.6669, 9.221, 9.8128, 10.445,
1489 11.12, 11.843, 12.615, 13.441, 14.325, 15.271, 16.283, 17.367,
1490 18.529, 19.776, 21.111, 22.544, 24.082, 25.731, 27.504, 29.409,
1491 31.452, 33.654, 36.024, 38.573, 41.323, 44.29, 47.492, 50.951,
1492 54.608, 58.588, 62.929, 67.629, 72.712, 78.226, 84.207, 90.699,
1493 97.749, 105.42, 113.77, 122.86, 132.78, 143.61, 155.44, 168.33,
1494 182.48, 198.01, 214.87, 233.39, 253.86, 276.34, 300.3, 327.28,
1495 356.89, 389.48, 422.29, 458.99, 501.39, 548.13, 595.62, 652.74,
1496 716.54, 784.57, 866.78, 960.59, 1062.8, 1072.5, 1189.5, 1319.4,
1497 1467.6, 1630.2, 1813.7, 2016.9, 2253., 2515.3, 2773.5, 3092.8,
1498 3444.4, 3720.4, 4104.3, 4527.5, 4645.9, 5021.7, 5462.2, 5597.,
1499 6110.6, 6732.5, 7513.8, 8270.6, 9640.6, 11487., 2796.1, 2680.1,
1500 2441.6, 2404.2, 2334.8, 2215.2, 1642.5, 1477.9, 1328.1, 1223.5,
1501 843.34, 766.96, 831.65, 834.84, 774.85, 1156.3, 1275.6, 1366.1,
1502 1795.6, 1885., 1936.5, 1953.4, 2154.4, 2002.7, 1789.8, 10381.,
1503 9040., 8216.5, 7384.7, 6721.9, 6187.7, 6143.8, 5703.9, 5276.6,
1504 4873.1, 4736., 4325.3, 3927., 3554.1, 3286.1, 2950.1, 2642.4,
1505 2368.7, 2138.9, 1914., 1719.6, 1543.9, 1388.6, 1252.1, 1132.2,
1506 1024.1, 1025.4, 920.58, 829.59, 750.54, 685.01, 624.25, 570.14,
1507 525.81, 481.85, 441.95, 408.71, 377.23, 345.86, 318.51, 292.26,
1508 268.34, 247.04, 227.14, 209.02, 192.69, 177.59, 163.78, 151.26,
1509 139.73, 129.19, 119.53, 110.7, 102.57, 95.109, 88.264, 81.948,
1510 76.13, 70.768, 65.827, 61.251, 57.022, 53.495, 49.824, 46.443,
1511 43.307, 40.405, 37.716, 35.241, 32.923, 30.77, 28.78, 26.915,
1512 25.177, 23.56, 22.059, 20.654, 19.345, 18.126, 16.988, 15.93,
1513 14.939, 14.014, 13.149, 12.343, 11.589, 10.884, 10.225, 9.6093,
1514 9.0327, 8.4934, 7.9889, 7.5166, 7.0744, 6.6604, 6.2727, 5.9098,
1515 5.5701, 5.2529, 4.955, 4.676, 4.4148, 4.171, 3.9426, 3.7332,
1516 3.5347, 3.3493, 3.1677, 3.0025, 2.8466, 2.6994, 2.5601, 2.4277,
1517 2.3016, 2.1814, 2.0664, 1.9564, 1.8279, 1.7311, 1.6427, 1.5645,
1518 1.4982, 1.443, 1.374, 1.3146, 1.2562, 1.17, 1.1105, 1.0272,
1519 .96863, .89718, .83654, .80226, .75908, .72431, .69573, .67174,
1520 .65126, .63315, .61693, .60182, .58715, .59554, .57649, .55526,
1521 .53177, .50622, .48176, .4813, .47642, .47492, .50273, .50293,
1522 .52687, .52239, .53419, .53814, .52626, .52211, .51492, .50622,
1523 .49746, .48841, .4792, .43534, .41999, .40349, .38586, .36799,
1524 .35108, .31089, .30803, .3171, .33599, .35041, .36149, .32924,
1525 .32462, .27309, .25961, .20922, .19504, .15683, .13098, .11588,
1526 .11478, .11204, .11363, .12135, .16423, .17785, .19094, .20236,
1527 .21084, .2154, .24108, .22848, .20871, .18797, .17963, .17834,
1528 .21552, .22284, .26945, .27052, .30108, .28977, .29772, .29224,
1529 .27658, .24956, .22777, .20654, .18392, .16338, .1452, .12916,
1530 .1152, .10304, .092437, .083163, .075031, .067878, .061564,
1531 .055976, .051018, .046609, .042679, .03917, .036032, .033223,
1532 .030706, .02845, .026428, .024617, .022998, .021554, .02027,
1533 .019136, .018141, .017278, .016541, .015926, .015432, .015058,
1534 .014807, .014666, .014635, .014728, .014947, .01527, .015728,
1535 .016345, .017026, .017798, .018839, .019752, .020636, .021886,
1536 .022695, .02327, .023478, .024292, .023544, .022222, .021932,
1537 .020052, .018143, .017722, .017031, .017782, .01938, .020734,
1538 .020476, .019255, .017477, .016878, .014617, .012489, .011765,
1539 .0099077, .0086446, .0079446, .0078644, .0079763, .008671,
1540 .01001, .0108, .012933, .015349, .016341, .018484, .020254,
1541 .020254, .020478, .019591, .018595, .018385, .019913, .022254,
1542 .024847, .025809, .028053, .029924, .030212, .031367, .03222,
1543 .032739, .032537, .03286, .033344, .033507, .033499, .033339,
1544 .032809, .033041, .031723, .029837, .027511, .026603, .024032,
1545 .021914, .020948, .021701, .023425, .024259, .024987, .023818,
1546 .021768, .019223, .018144, .015282, .012604, .01163, .0097907,
1547 .008336, .0082473, .0079582, .0088077, .009779, .010129, .012145,
1548 .014378, .016761, .01726, .018997, .019998, .019809, .01819,
1549 .016358, .016099, .01617, .017939, .020223, .022521, .02277,
1550 .024279, .025247, .024222, .023989, .023224, .021493, .020362,
1551 .018596, .017309, .015975, .014466, .013171, .011921, .01078,
1552 .0097229, .0087612, .0078729, .0070682, .0063494, .0057156,
1553 .0051459, .0046273, .0041712, .0037686, .0034119, .003095,
1554 .0028126, .0025603, .0023342, .0021314, .0019489, .0017845,
1555 .001636, .0015017, .00138, .0012697, .0011694, .0010782,
1556 9.9507e-4, 9.1931e-4, 8.5013e-4, 7.869e-4, 7.2907e-4, 6.7611e-4,
1557 6.2758e-4, 5.8308e-4, 5.4223e-4, 5.0473e-4, 4.7027e-4, 4.3859e-4,
1558 4.0946e-4, 3.8265e-4, 3.5798e-4, 3.3526e-4, 3.1436e-4, 2.9511e-4,
1559 2.7739e-4, 2.6109e-4, 2.4609e-4, 2.3229e-4, 2.1961e-4, 2.0797e-4,
1560 1.9729e-4, 1.875e-4, 1.7855e-4, 1.7038e-4, 1.6294e-4, 1.5619e-4,
1561 1.5007e-4, 1.4456e-4, 1.3961e-4, 1.3521e-4, 1.3131e-4, 1.2789e-4,
1562 1.2494e-4, 1.2242e-4, 1.2032e-4, 1.1863e-4, 1.1733e-4, 1.1641e-4,
1563 1.1585e-4, 1.1565e-4, 1.158e-4, 1.1629e-4, 1.1712e-4, 1.1827e-4,
1564 1.1976e-4, 1.2158e-4, 1.2373e-4, 1.262e-4, 1.2901e-4, 1.3214e-4,
1565 1.3562e-4, 1.3944e-4, 1.4361e-4, 1.4814e-4, 1.5303e-4, 1.5829e-4,
1566 1.6394e-4, 1.6999e-4, 1.7644e-4, 1.8332e-4, 1.9063e-4, 1.984e-4,
1567 2.0663e-4, 2.1536e-4, 2.246e-4, 2.3436e-4, 2.4468e-4, 2.5558e-4,
1568 2.6708e-4, 2.7921e-4, 2.92e-4, 3.0548e-4, 3.1968e-4, 3.3464e-4,
1569 3.5039e-4, 3.6698e-4, 3.8443e-4, 4.0281e-4, 4.2214e-4, 4.4248e-4,
1570 4.6389e-4, 4.864e-4, 5.1009e-4, 5.3501e-4, 5.6123e-4, 5.888e-4,
1571 6.1781e-4, 6.4833e-4, 6.8043e-4, 7.142e-4, 7.4973e-4, 7.8711e-4,
1572 8.2644e-4, 8.6783e-4, 9.1137e-4, 9.5721e-4, .0010054, .0010562,
1573 .0011096, .0011659, .0012251, .0012875, .0013532, .0014224,
1574 .0014953, .001572, .0016529, .0017381, .0018279, .0019226,
1575 .0020224, .0021277, .0022386, .0023557, .0024792, .0026095,
1576 .002747, .0028921, .0030453, .0032071, .003378, .0035586,
1577 .0037494, .003951, .0041642, .0043897, .0046282, .0048805,
1578 .0051476, .0054304, .00573, .0060473, .0063837, .0067404,
1579 .0071188, .0075203, .0079466, .0083994, .0088806, .0093922,
1580 .0099366, .010516, .011134, .011792, .012494, .013244, .014046,
1581 .014898, .015808, .016781, .017822, .018929, .020108, .02138,
1582 .022729, .02419, .02576, .027412, .029233, .031198, .033301,
1583 .035594, .038092, .040767, .04372, .046918, .050246, .053974,
1584 .058009, .061976, .066586, .071537, .076209, .081856, .087998,
1585 .093821, .10113, .10913, .11731, .12724, .13821, .15025, .1639,
1586 .17807, .19472, .21356, .23496, .25758, .28387, .31389, .34104,
1587 .37469, .40989, .43309, .46845, .5042, .5023, .52981, .55275,
1588 .51075, .51976, .52457, .44779, .44721, .4503, .4243, .45244,
1589 .49491, .55399, .39021, .24802, .2501, .2618, .27475, .28879,
1590 .31317, .33643, .36257, .4018, .43275, .46525, .53333, .56599,
1591 .60557, .70142, .74194, .77736, .88567, .91182, .93294, .98407,
1592 .98772, .99176, .9995, 1.2405, 1.3602, 1.338, 1.3255, 1.3267,
1593 1.3404, 1.3634, 1.3967, 1.4407, 1.4961, 1.5603, 1.6328, 1.7153,
1594 1.8094, 1.9091, 2.018, 2.1367, 2.264, 2.4035, 2.5562, 2.7179,
1595 2.9017, 3.1052, 3.3304, 3.5731, 3.8488, 4.1553, 4.4769, 4.7818,
1596 5.1711, 5.5204, 5.9516, 6.4097, 6.8899, 7.1118, 7.5469, 7.9735,
1597 7.9511, 8.3014, 8.6418, 8.4757, 8.8256, 9.2294, 9.6923, 10.033,
1598 10.842, 11.851, 11.78, 8.8435, 9.1381, 9.5956, 10.076, 10.629,
1599 11.22, 11.883, 12.69, 13.163, 13.974, 14.846, 16.027, 17.053,
1600 18.148, 19.715, 20.907, 22.163, 23.956, 25.235, 26.566, 27.94,
1601 29.576, 30.956, 32.432, 35.337, 39.911, 41.128, 42.625, 44.386,
1602 46.369, 48.619, 51.031, 53.674, 56.825, 59.921, 63.286, 66.929,
1603 70.859, 75.081, 79.618, 84.513, 89.739, 95.335, 101.35, 107.76,
1604 114.63, 121.98, 129.87, 138.3, 147.34, 157.04, 167.56, 178.67,
1605 190.61, 203.43, 217.19, 231.99, 247.88, 264.98, 283.37, 303.17,
1606 324.49, 347.47, 372.25, 398.98, 427.85, 459.06, 492.8, 529.31,
1607 568.89, 611.79, 658.35, 708.91, 763.87, 823.65, 888.72, 959.58,
1608 1036.8, 1121.8, 1213.9, 1314.3, 1423.8, 1543., 1672.8, 1813.4,
1609 1966.1, 2131.4, 2309.5, 2499.3, 2705., 2925.7, 3161.6, 3411.3,
1610 3611.5, 3889.2, 4191.1, 4519.3, 4877.9, 5272.9, 5712.9, 6142.7,
1611 6719.6, 7385., 8145., 8977.7, 9831.9, 10827., 11934., 13063.,
1612 14434., 15878., 17591., 19435., 21510., 23835., 26835., 29740.,
1613 32878., 36305., 39830., 43273., 46931., 50499., 49586., 51598.,
1614 53429., 54619., 55081., 55102., 54485., 53487., 52042., 42689.,
1615 42607., 44020., 47994., 54169., 53916., 55808., 56642., 46049.,
1616 44243., 32929., 30658., 21963., 20835., 15962., 13679., 17652.,
1617 19680., 22388., 25625., 29184., 32520., 35720., 38414., 40523.,
1618 49228., 48173., 45678., 41768., 37600., 41313., 42654., 44465.,
1619 55736., 56630., 65409., 63308., 66572., 61845., 60379., 56777.,
1620 51920., 46601., 41367., 36529., 32219., 28470., 25192., 22362.,
1621 19907., 17772., 15907., 14273., 12835., 11567., 10445., 9450.2,
1622 8565.1, 7776., 7070.8, 6439.2, 5872.3, 5362.4, 4903., 4488.3,
1623 4113.4, 3773.8, 3465.8, 3186.1, 2931.7, 2700.1, 2488.8, 2296.,
1624 2119.8, 1958.6, 1810.9, 1675.6, 1551.4, 1437.3, 1332.4, 1236.,
1625 1147.2, 1065.3, 989.86, 920.22, 855.91, 796.48, 741.53, 690.69,
1626 643.62, 600.02, 559.6, 522.13, 487.35, 455.06, 425.08, 397.21,
1627 371.3, 347.2, 324.78, 303.9, 284.46, 266.34, 249.45, 233.7,
1628 219.01, 205.3, 192.5, 180.55, 169.38, 158.95, 149.2, 140.07,
1629 131.54, 123.56, 116.09, 109.09, 102.54, 96.405, 90.655, 85.266,
1630 80.213, 75.475, 71.031, 66.861, 62.948, 59.275, 55.827, 52.587,
1631 49.544, 46.686, 43.998, 41.473, 39.099, 36.867, 34.768, 32.795,
1632 30.939, 29.192, 27.546, 25.998, 24.539, 23.164, 21.869, 20.65,
1633 19.501, 18.419, 17.399, 16.438, 15.532, 14.678, 13.874, 13.115,
1634 12.4, 11.726, 11.088, 10.488, 9.921, 9.3846, 8.8784, 8.3996,
1635 7.9469, 7.5197, 7.1174, 6.738, 6.379, 6.0409, 5.7213, 5.419,
1636 5.1327, 4.8611, 4.6046, 4.3617, 4.1316, 3.9138, 3.7077, 3.5125,
1637 3.3281, 3.1536, 2.9885, 2.8323, 2.6846, 2.5447, 2.4124, 2.2871,
1638 2.1686, 2.0564, 1.9501, 1.8495, 1.7543, 1.6641, 1.5787, 1.4978,
1639 1.4212, 1.3486, 1.2799, 1.2147, 1.1529, 1.0943, 1.0388, .98602,
1640 .93596, .8886, .84352, .80078, .76029, .722, .68585, .65161,
1641 .61901, .58808, .55854, .53044, .5039, .47853, .45459, .43173,
1642 .41008, .38965, .37021, .35186, .33444, .31797, .30234, .28758,
1643 .2736, .26036, .24764, .2357, .22431, .21342, .20295, .19288,
1644 .18334, .17444, .166, .15815, .15072, .14348, .13674, .13015,
1645 .12399, .11807, .11231, .10689, .10164, .096696, .091955,
1646 .087476, .083183, .079113, .075229, .071536, .068026, .064698,
1647 .06154, .058544, .055699, .052997, .050431, .047993, .045676,
1648 .043475, .041382, .039392, .037501, .035702, .033991, .032364,
1649 .030817, .029345, .027945, .026613, .025345, .024139, .022991,
1650 .021899, .02086, .019871, .018929, .018033, .01718, .016368,
1651 .015595, .014859, .014158, .013491, .012856, .012251, .011675,
1652 .011126, .010604, .010107, .0096331, .009182, .0087523, .0083431,
1653 .0079533, .0075821, .0072284, .0068915, .0065706, .0062649,
1654 .0059737, .0056963, .005432, .0051802, .0049404, .0047118,
1655 .0044941, .0042867, .0040891, .0039009, .0037216, .0035507,
1656 .003388, .0032329, .0030852, .0029445, .0028105, .0026829,
1657 .0025613, .0024455, .0023353, .0022303, .0021304, .0020353,
1658 .0019448, .0018587, .0017767, .0016988, .0016247, .0015543,
1659 .0014874, .0014238, .0013635, .0013062, .0012519, .0012005,
1660 .0011517, .0011057, .0010621, .001021, 9.8233e-4, 9.4589e-4,
1661 9.1167e-4, 8.7961e-4, 8.4964e-4, 8.2173e-4, 7.9582e-4, 7.7189e-4,
1662 7.499e-4, 7.2983e-4, 7.1167e-4, 6.9542e-4, 6.8108e-4, 6.6866e-4,
1663 6.5819e-4, 6.4971e-4, 6.4328e-4, 6.3895e-4, 6.3681e-4, 6.3697e-4,
1664 6.3956e-4, 6.4472e-4, 6.5266e-4, 6.6359e-4, 6.778e-4, 6.9563e-4,
1665 7.1749e-4, 7.4392e-4, 7.7556e-4, 8.1028e-4, 8.4994e-4, 8.8709e-4,
1666 9.3413e-4, 9.6953e-4, .0010202, .0010738, .0010976, .0011507,
1667 .0011686, .0012264, .001291, .0013346, .0014246, .0015293,
1668 .0016359, .0017824, .0019255, .0020854, .002247, .0024148,
1669 .0026199, .0027523, .0029704, .0030702, .0033047, .0035013,
1670 .0037576, .0040275, .0043089, .0046927, .0049307, .0053486,
1671 .0053809, .0056699, .0059325, .0055488, .005634, .0056392,
1672 .004946, .0048855, .0048208, .0044386, .0045498, .0046377,
1673 .0048939, .0052396, .0057324, .0060859, .0066906, .0071148,
1674 .0077224, .0082687, .008769, .0084471, .008572, .0087729,
1675 .008775, .0090742, .0080704, .0080288, .0085747, .0086087,
1676 .0086408, .0088752, .0089381, .0089757, .0093532, .0092824,
1677 .0092566, .0092645, .0092735, .009342, .0095806, .0097991,
1678 .010213, .010611, .011129, .011756, .013237, .01412, .015034,
1679 .015936, .01682, .018597, .019315, .019995, .020658, .021289,
1680 .022363, .022996, .023716, .024512, .025434, .026067, .027118,
1681 .028396, .029865, .031442, .033253, .03525, .037296, .039701,
1682 .042356, .045154, .048059, .051294, .054893, .058636, .061407,
1683 .065172, .068974, .072676, .073379, .076547, .079556, .079134,
1684 .082308, .085739, .090192, .09359, .099599, .10669, .11496,
1685 .1244, .13512, .14752, .14494, .15647, .1668, .17863, .19029,
1686 .20124, .20254, .21179, .21982, .21625, .22364, .23405, .23382,
1687 .2434, .25708, .26406, .27621, .28909, .30395, .31717, .33271,
1688 .3496, .36765, .38774, .40949, .446, .46985, .49846, .5287, .562,
1689 .59841, .64598, .68834, .7327, .78978, .8373, .88708, .94744,
1690 1.0006, 1.0574, 1.1215, 1.1856, 1.2546, 1.3292, 1.4107, 1.4974,
1691 1.5913, 1.6931, 1.8028, 1.9212, 2.0492, 2.1874, 2.3365, 2.4978,
1692 2.6718, 2.8588, 3.062, 3.2818, 3.5188, 3.7752, 4.0527, 4.3542,
1693 4.6782, 5.0312, 5.4123, 5.8246, 6.2639, 6.7435, 7.2636, 7.8064,
1694 8.4091, 9.0696, 9.7677, 10.548, 11.4, 12.309, 13.324, 14.284,
1695 15.445, 16.687, 18.019, 19.403, 20.847, 22.366, 23.925, 25.537,
1696 27.213, 28.069, 29.864, 31.829, 33.988, 35.856, 38.829, 42.321,
1697 46.319, 50.606, 55.126, 59.126, 64.162, 68.708, 74.615, 81.176,
1698 87.739, 95.494, 103.83, 113.38, 123.99, 135.8, 148.7, 162.58,
1699 176.32, 192.6, 211.47, 232.7, 252.64, 277.41, 305.38, 333.44,
1700 366.42, 402.66, 442.14, 484.53, 526.42, 568.15, 558.78, 582.6,
1701 600.98, 613.94, 619.44, 618.24, 609.84, 595.96, 484.86, 475.59,
1702 478.49, 501.56, 552.19, 628.44, 630.39, 658.92, 671.96, 562.7,
1703 545.88, 423.43, 400.14, 306.59, 294.13, 246.8, 226.51, 278.21,
1704 314.39, 347.22, 389.13, 433.16, 477.48, 521.67, 560.54, 683.6,
1705 696.37, 695.91, 683.1, 658.24, 634.89, 698.85, 742.87, 796.66,
1706 954.49, 1009.5, 1150.5, 1179.1, 1267.9, 1272.4, 1312.7, 1330.4,
1707 1331.6, 1315.8, 1308.3, 1293.3, 1274.6, 1249.5, 1213.2, 1172.1,
1708 1124.4, 930.33, 893.36, 871.27, 883.54, 940.76, 1036., 1025.6,
1709 1053.1, 914.51, 894.15, 865.03, 670.63, 508.41, 475.15, 370.85,
1710 361.06, 319.38, 312.75, 331.87, 367.13, 415., 467.94, 525.49,
1711 578.41, 624.66, 794.82, 796.97, 780.29, 736.49, 670.18, 603.75,
1712 659.67, 679.8, 857.12, 884.05, 900.65, 1046.1, 1141.9, 1083.,
1713 1089.2, 1e3, 947.08, 872.31, 787.91, 704.75, 624.93, 553.68,
1714 489.91, 434.21, 385.64, 343.3, 306.42, 274.18, 245.94, 221.11,
1715 199.23, 179.88, 162.73, 147.48, 133.88, 121.73, 110.86, 101.1,
1716 92.323, 84.417, 77.281, 70.831, 64.991, 59.694, 54.884, 50.509,
1717 46.526, 42.893, 39.58, 36.549, 33.776, 31.236, 28.907, 26.77,
1718 24.805, 23., 21.339, 19.81, 18.404, 17.105, 15.909, 14.801,
1719 13.778, 12.83, 11.954, 11.142, 10.389, 9.691, 9.0434, 8.4423,
1720 7.8842, 7.3657, 6.8838, 6.4357, 6.0189, 5.6308, 5.2696, 4.9332,
1721 4.6198, 4.3277, 4.0553, 3.8012, 3.5639, 3.3424, 3.1355, 2.9422,
1722 2.7614, 2.5924, 2.4343, 2.2864, 2.148, 2.0184, 1.8971, 1.7835,
1723 1.677, 1.5773, 1.4838, 1.3961, 1.3139, 1.2369, 1.1645, 1.0966,
1724 1.0329, .97309, .91686, .86406, .81439, .76767, .72381, .68252,
1725 .64359, .60695, .57247, .54008, .50957, .48092, .45401, .42862,
1726 .40465, .38202, .36072, .34052, .3216, .30386, .28711, .27135,
1727 .25651, .24252, .2293, .21689, .20517, .19416, .18381, .17396,
1728 .16469
1729 };
1730
1731 static const double co2230[2001] =
1732 { 2.743e-5, 2.8815e-5, 3.027e-5, 3.1798e-5,
1733 3.3405e-5, 3.5094e-5, 3.6869e-5, 3.8734e-5, 4.0694e-5, 4.2754e-5,
1734 4.492e-5, 4.7196e-5, 4.9588e-5, 5.2103e-5, 5.4747e-5, 5.7525e-5,
1735 6.0446e-5, 6.3516e-5, 6.6744e-5, 7.0137e-5, 7.3704e-5, 7.7455e-5,
1736 8.1397e-5, 8.5543e-5, 8.9901e-5, 9.4484e-5, 9.9302e-5, 1.0437e-4,
1737 1.097e-4, 1.153e-4, 1.2119e-4, 1.2738e-4, 1.3389e-4, 1.4074e-4,
1738 1.4795e-4, 1.5552e-4, 1.6349e-4, 1.7187e-4, 1.8068e-4, 1.8995e-4,
1739 1.997e-4, 2.0996e-4, 2.2075e-4, 2.321e-4, 2.4403e-4, 2.5659e-4,
1740 2.698e-4, 2.837e-4, 2.9832e-4, 3.137e-4, 3.2988e-4, 3.4691e-4,
1741 3.6483e-4, 3.8368e-4, 4.0351e-4, 4.2439e-4, 4.4635e-4, 4.6947e-4,
1742 4.9379e-4, 5.1939e-4, 5.4633e-4, 5.7468e-4, 6.0452e-4, 6.3593e-4,
1743 6.69e-4, 7.038e-4, 7.4043e-4, 7.79e-4, 8.1959e-4, 8.6233e-4,
1744 9.0732e-4, 9.5469e-4, .0010046, .0010571, .0011124, .0011706,
1745 .0012319, .0012964, .0013644, .001436, .0015114, .0015908,
1746 .0016745, .0017625, .0018553, .0019531, .002056, .0021645,
1747 .0022788, .0023992, .002526, .0026596, .0028004, .0029488,
1748 .0031052, .0032699, .0034436, .0036265, .0038194, .0040227,
1749 .0042369, .0044628, .0047008, .0049518, .0052164, .0054953,
1750 .0057894, .0060995, .0064265, .0067713, .007135, .0075184,
1751 .0079228, .0083494, .0087993, .0092738, .0097745, .010303,
1752 .01086, .011448, .012068, .012722, .013413, .014142, .014911,
1753 .015723, .01658, .017484, .018439, .019447, .020511, .021635,
1754 .022821, .024074, .025397, .026794, .02827, .029829, .031475,
1755 .033215, .035052, .036994, .039045, .041213, .043504, .045926,
1756 .048485, .05119, .05405, .057074, .060271, .063651, .067225,
1757 .071006, .075004, .079233, .083708, .088441, .093449, .098749,
1758 .10436, .11029, .11657, .12322, .13026, .13772, .14561, .15397,
1759 .16282, .1722, .18214, .19266, .20381, .21563, .22816, .24143,
1760 .2555, .27043, .28625, .30303, .32082, .3397, .35972, .38097,
1761 .40352, .42746, .45286, .47983, .50847, .53888, .57119, .6055,
1762 .64196, .6807, .72187, .76564, .81217, .86165, .91427, .97025,
1763 1.0298, 1.0932, 1.1606, 1.2324, 1.3088, 1.3902, 1.477, 1.5693,
1764 1.6678, 1.7727, 1.8845, 2.0038, 2.131, 2.2666, 2.4114, 2.5659,
1765 2.7309, 2.907, 3.0951, 3.2961, 3.5109, 3.7405, 3.986, 4.2485,
1766 4.5293, 4.8299, 5.1516, 5.4961, 5.8651, 6.2605, 6.6842, 7.1385,
1767 7.6256, 8.1481, 8.7089, 9.3109, 9.9573, 10.652, 11.398, 12.2,
1768 13.063, 13.992, 14.99, 16.064, 17.222, 18.469, 19.813, 21.263,
1769 22.828, 24.516, 26.34, 28.31, 30.437, 32.738, 35.226, 37.914,
1770 40.824, 43.974, 47.377, 51.061, 55.011, 59.299, 63.961, 69.013,
1771 74.492, 80.444, 86.919, 93.836, 101.23, 109.25, 117.98, 127.47,
1772 137.81, 149.07, 161.35, 174.75, 189.42, 205.49, 223.02, 242.26,
1773 263.45, 286.75, 311.94, 340.01, 370.86, 404.92, 440.44, 480.27,
1774 525.17, 574.71, 626.22, 686.8, 754.38, 827.07, 913.38, 1011.7,
1775 1121.5, 1161.6, 1289.5, 1432.2, 1595.4, 1777., 1983.3, 2216.1,
1776 2485.7, 2788.3, 3101.5, 3481., 3902.1, 4257.1, 4740., 5272.8,
1777 5457.9, 5946.2, 6505.3, 6668.4, 7302.4, 8061.6, 9015.8, 9908.3,
1778 11613., 13956., 3249.6, 3243., 2901.5, 2841.3, 2729.6, 2558.2,
1779 1797.8, 1583.2, 1386., 1233.5, 787.74, 701.46, 761.66, 767.21,
1780 722.83, 1180.6, 1332.1, 1461.6, 2032.9, 2166., 2255.9, 2294.7,
1781 2587.2, 2396.5, 2122.4, 12553., 10784., 9832.5, 8827.3, 8029.1,
1782 7377.9, 7347.1, 6783.8, 6239.1, 5721.1, 5503., 4975.1, 4477.8,
1783 4021.3, 3676.8, 3275.3, 2914.9, 2597.4, 2328.2, 2075.4, 1857.6,
1784 1663.6, 1493.3, 1343.8, 1213.3, 1095.6, 1066.5, 958.91, 865.15,
1785 783.31, 714.35, 650.77, 593.98, 546.2, 499.9, 457.87, 421.75,
1786 387.61, 355.25, 326.62, 299.7, 275.21, 253.17, 232.83, 214.31,
1787 197.5, 182.08, 167.98, 155.12, 143.32, 132.5, 122.58, 113.48,
1788 105.11, 97.415, 90.182, 83.463, 77.281, 71.587, 66.341, 61.493,
1789 57.014, 53.062, 49.21, 45.663, 42.38, 39.348, 36.547, 33.967,
1790 31.573, 29.357, 27.314, 25.415, 23.658, 22.03, 20.524, 19.125,
1791 17.829, 16.627, 15.511, 14.476, 13.514, 12.618, 11.786, 11.013,
1792 10.294, 9.6246, 9.0018, 8.4218, 7.8816, 7.3783, 6.9092, 6.4719,
1793 6.0641, 5.6838, 5.3289, 4.998, 4.6893, 4.4014, 4.1325, 3.8813,
1794 3.6469, 3.4283, 3.2241, 3.035, 2.8576, 2.6922, 2.5348, 2.3896,
1795 2.2535, 2.1258, 2.0059, 1.8929, 1.7862, 1.6854, 1.5898, 1.4992,
1796 1.4017, 1.3218, 1.2479, 1.1809, 1.1215, 1.0693, 1.0116, .96016,
1797 .9105, .84859, .80105, .74381, .69982, .65127, .60899, .57843,
1798 .54592, .51792, .49336, .47155, .45201, .43426, .41807, .40303,
1799 .38876, .3863, .37098, .35492, .33801, .32032, .30341, .29874,
1800 .29193, .28689, .29584, .29155, .29826, .29195, .29287, .2904,
1801 .28199, .27709, .27162, .26622, .26133, .25676, .25235, .23137,
1802 .22365, .21519, .20597, .19636, .18699, .16485, .16262, .16643,
1803 .17542, .18198, .18631, .16759, .16338, .13505, .1267, .10053,
1804 .092554, .074093, .062159, .055523, .054849, .05401, .05528,
1805 .058982, .07952, .08647, .093244, .099285, .10393, .10661,
1806 .12072, .11417, .10396, .093265, .089137, .088909, .10902,
1807 .11277, .13625, .13565, .14907, .14167, .1428, .13744, .12768,
1808 .11382, .10244, .091686, .08109, .071739, .063616, .056579,
1809 .050504, .045251, .040689, .036715, .033237, .030181, .027488,
1810 .025107, .022998, .021125, .01946, .017979, .016661, .015489,
1811 .014448, .013526, .012712, .011998, .011375, .010839, .010384,
1812 .010007, .0097053, .0094783, .0093257, .0092489, .0092504,
1813 .0093346, .0095077, .0097676, .01012, .01058, .011157, .011844,
1814 .012672, .013665, .014766, .015999, .017509, .018972, .020444,
1815 .022311, .023742, .0249, .025599, .026981, .026462, .025143,
1816 .025066, .022814, .020458, .020026, .019142, .020189, .022371,
1817 .024163, .023728, .02199, .019506, .018591, .015576, .012784,
1818 .011744, .0094777, .0079148, .0070652, .006986, .0071758,
1819 .008086, .0098025, .01087, .013609, .016764, .018137, .021061,
1820 .023498, .023576, .023965, .022828, .021519, .021283, .023364,
1821 .026457, .029782, .030856, .033486, .035515, .035543, .036558,
1822 .037198, .037472, .037045, .037284, .03777, .038085, .038366,
1823 .038526, .038282, .038915, .037697, .035667, .032941, .031959,
1824 .028692, .025918, .024596, .025592, .027873, .028935, .02984,
1825 .028148, .025305, .021912, .020454, .016732, .013357, .01205,
1826 .009731, .0079881, .0077704, .0074387, .0083895, .0096776,
1827 .010326, .01293, .015955, .019247, .020145, .02267, .024231,
1828 .024184, .022131, .019784, .01955, .01971, .022119, .025116,
1829 .027978, .028107, .029808, .030701, .029164, .028551, .027286,
1830 .024946, .023259, .020982, .019221, .017471, .015643, .014074,
1831 .01261, .011301, .010116, .0090582, .0081036, .0072542, .0065034,
1832 .0058436, .0052571, .0047321, .0042697, .0038607, .0034977,
1833 .0031747, .0028864, .0026284, .002397, .002189, .0020017,
1834 .0018326, .0016798, .0015414, .0014159, .0013019, .0011983,
1835 .0011039, .0010177, 9.391e-4, 8.6717e-4, 8.0131e-4, 7.4093e-4,
1836 6.8553e-4, 6.3464e-4, 5.8787e-4, 5.4487e-4, 5.0533e-4, 4.69e-4,
1837 4.3556e-4, 4.0474e-4, 3.7629e-4, 3.5e-4, 3.2569e-4, 3.032e-4,
1838 2.8239e-4, 2.6314e-4, 2.4535e-4, 2.2891e-4, 2.1374e-4, 1.9975e-4,
1839 1.8685e-4, 1.7498e-4, 1.6406e-4, 1.5401e-4, 1.4479e-4, 1.3633e-4,
1840 1.2858e-4, 1.2148e-4, 1.1499e-4, 1.0907e-4, 1.0369e-4, 9.8791e-5,
1841 9.4359e-5, 9.0359e-5, 8.6766e-5, 8.3555e-5, 8.0703e-5, 7.8192e-5,
1842 7.6003e-5, 7.4119e-5, 7.2528e-5, 7.1216e-5, 7.0171e-5, 6.9385e-5,
1843 6.8848e-5, 6.8554e-5, 6.8496e-5, 6.8669e-5, 6.9069e-5, 6.9694e-5,
1844 7.054e-5, 7.1608e-5, 7.2896e-5, 7.4406e-5, 7.6139e-5, 7.8097e-5,
1845 8.0283e-5, 8.2702e-5, 8.5357e-5, 8.8255e-5, 9.1402e-5, 9.4806e-5,
1846 9.8473e-5, 1.0241e-4, 1.0664e-4, 1.1115e-4, 1.1598e-4, 1.2112e-4,
1847 1.2659e-4, 1.3241e-4, 1.3859e-4, 1.4515e-4, 1.521e-4, 1.5947e-4,
1848 1.6728e-4, 1.7555e-4, 1.8429e-4, 1.9355e-4, 2.0334e-4, 2.1369e-4,
1849 2.2463e-4, 2.3619e-4, 2.4841e-4, 2.6132e-4, 2.7497e-4, 2.8938e-4,
1850 3.0462e-4, 3.2071e-4, 3.3771e-4, 3.5567e-4, 3.7465e-4, 3.947e-4,
1851 4.1588e-4, 4.3828e-4, 4.6194e-4, 4.8695e-4, 5.1338e-4, 5.4133e-4,
1852 5.7087e-4, 6.0211e-4, 6.3515e-4, 6.701e-4, 7.0706e-4, 7.4617e-4,
1853 7.8756e-4, 8.3136e-4, 8.7772e-4, 9.2681e-4, 9.788e-4, .0010339,
1854 .0010922, .001154, .0012195, .0012889, .0013626, .0014407,
1855 .0015235, .0016114, .0017048, .0018038, .001909, .0020207,
1856 .0021395, .0022657, .0023998, .0025426, .0026944, .002856,
1857 .0030281, .0032114, .0034068, .003615, .0038371, .004074,
1858 .004327, .0045971, .0048857, .0051942, .0055239, .0058766,
1859 .0062538, .0066573, .0070891, .007551, .0080455, .0085747,
1860 .0091412, .0097481, .010397, .011092, .011837, .012638, .013495,
1861 .014415, .01541, .016475, .017621, .018857, .020175, .02162,
1862 .023185, .024876, .02672, .028732, .030916, .033319, .035939,
1863 .038736, .041847, .04524, .048715, .052678, .056977, .061203,
1864 .066184, .07164, .076952, .083477, .090674, .098049, .10697,
1865 .1169, .1277, .14011, .15323, .1684, .18601, .20626, .22831,
1866 .25417, .28407, .31405, .34957, .38823, .41923, .46026, .50409,
1867 .51227, .54805, .57976, .53818, .55056, .557, .46741, .46403,
1868 .4636, .42265, .45166, .49852, .56663, .34306, .17779, .17697,
1869 .18346, .19129, .20014, .21778, .23604, .25649, .28676, .31238,
1870 .33856, .39998, .4288, .46568, .56654, .60786, .64473, .76466,
1871 .7897, .80778, .86443, .85736, .84798, .84157, 1.1385, 1.2446,
1872 1.1923, 1.1552, 1.1338, 1.1266, 1.1292, 1.1431, 1.1683, 1.2059,
1873 1.2521, 1.3069, 1.3712, 1.4471, 1.5275, 1.6165, 1.7145, 1.8189,
1874 1.9359, 2.065, 2.2007, 2.3591, 2.5362, 2.7346, 2.9515, 3.2021,
1875 3.4851, 3.7935, 4.0694, 4.4463, 4.807, 5.2443, 5.7178, 6.2231,
1876 6.4796, 6.9461, 7.4099, 7.3652, 7.7182, 8.048, 7.7373, 8.0363,
1877 8.3855, 8.8044, 9.0257, 9.8574, 10.948, 10.563, 6.8979, 7.0744,
1878 7.4121, 7.7663, 8.1768, 8.6243, 9.1437, 9.7847, 10.182, 10.849,
1879 11.572, 12.602, 13.482, 14.431, 15.907, 16.983, 18.11, 19.884,
1880 21.02, 22.18, 23.355, 24.848, 25.954, 27.13, 30.186, 34.893,
1881 35.682, 36.755, 38.111, 39.703, 41.58, 43.606, 45.868, 48.573,
1882 51.298, 54.291, 57.559, 61.116, 64.964, 69.124, 73.628, 78.471,
1883 83.683, 89.307, 95.341, 101.84, 108.83, 116.36, 124.46, 133.18,
1884 142.57, 152.79, 163.69, 175.43, 188.11, 201.79, 216.55, 232.51,
1885 249.74, 268.38, 288.54, 310.35, 333.97, 359.55, 387.26, 417.3,
1886 449.88, 485.2, 523.54, 565.14, 610.28, 659.31, 712.56, 770.43,
1887 833.36, 901.82, 976.36, 1057.6, 1146.8, 1243.8, 1350., 1466.3,
1888 1593.6, 1732.7, 1884.1, 2049.1, 2228.2, 2421.9, 2629.4, 2853.7,
1889 3094.4, 3351.1, 3622.3, 3829.8, 4123.1, 4438.3, 4777.2, 5144.1,
1890 5545.4, 5990.5, 6404.5, 6996.8, 7687.6, 8482.9, 9349.4, 10203.,
1891 11223., 12358., 13493., 14916., 16416., 18236., 20222., 22501.,
1892 25102., 28358., 31707., 35404., 39538., 43911., 48391., 53193.,
1893 58028., 58082., 61276., 64193., 66294., 67480., 67921., 67423.,
1894 66254., 64341., 51737., 51420., 53072., 58145., 66195., 65358.,
1895 67377., 67869., 53509., 50553., 35737., 32425., 21704., 19974.,
1896 14457., 12142., 16798., 19489., 23049., 27270., 31910., 36457.,
1897 40877., 44748., 47876., 59793., 58626., 55454., 50337., 44893.,
1898 50228., 52216., 54747., 69541., 70455., 81014., 77694., 80533.,
1899 73953., 70927., 65539., 59002., 52281., 45953., 40292., 35360.,
1900 31124., 27478., 24346., 21647., 19308., 17271., 15491., 13927.,
1901 12550., 11331., 10250., 9288.8, 8431.4, 7664.9, 6978.3, 6361.8,
1902 5807.4, 5307.7, 4856.8, 4449., 4079.8, 3744.9, 3440.8, 3164.2,
1903 2912.3, 2682.7, 2473., 2281.4, 2106., 1945.3, 1797.9, 1662.5,
1904 1538.1, 1423.6, 1318.1, 1221., 1131.5, 1049., 972.99, 902.87,
1905 838.01, 777.95, 722.2, 670.44, 622.35, 577.68, 536.21, 497.76,
1906 462.12, 429.13, 398.61, 370.39, 344.29, 320.16, 297.85, 277.2,
1907 258.08, 240.38, 223.97, 208.77, 194.66, 181.58, 169.43, 158.15,
1908 147.67, 137.92, 128.86, 120.44, 112.6, 105.3, 98.499, 92.166,
1909 86.264, 80.763, 75.632, 70.846, 66.381, 62.213, 58.321, 54.685,
1910 51.288, 48.114, 45.145, 42.368, 39.772, 37.341, 35.065, 32.937,
1911 30.943, 29.077, 27.33, 25.693, 24.158, 22.717, 21.367, 20.099,
1912 18.909, 17.792, 16.744, 15.761, 14.838, 13.971, 13.157, 12.393,
1913 11.676, 11.003, 10.369, 9.775, 9.2165, 8.6902, 8.1963, 7.7314,
1914 7.2923, 6.8794, 6.4898, 6.122, 5.7764, 5.4525, 5.1484, 4.8611,
1915 4.5918, 4.3379, 4.0982, 3.8716, 3.6567, 3.4545, 3.2634, 3.0828,
1916 2.9122, 2.7512, 2.5993, 2.4561, 2.3211, 2.1938, 2.0737, 1.9603,
1917 1.8534, 1.7525, 1.6572, 1.5673, 1.4824, 1.4022, 1.3265, 1.2551,
1918 1.1876, 1.1239, 1.0637, 1.0069, .9532, .90248, .85454, .80921,
1919 .76631, .72569, .6872, .65072, .61635, .5836, .55261, .52336,
1920 .49581, .46998, .44559, .42236, .40036, .37929, .35924, .34043,
1921 .32238, .30547, .28931, .27405, .25975, .24616, .23341, .22133,
1922 .20997, .19924, .18917, .17967, .17075, .16211, .15411, .14646,
1923 .13912, .13201, .12509, .11857, .11261, .10698, .10186, .097039,
1924 .092236, .087844, .083443, .07938, .075452, .071564, .067931,
1925 .064389, .061078, .057901, .054921, .052061, .049364, .046789,
1926 .04435, .042044, .039866, .037808, .035863, .034023, .032282,
1927 .030634, .029073, .027595, .026194, .024866, .023608, .022415,
1928 .021283, .02021, .019193, .018228, .017312, .016443, .015619,
1929 .014837, .014094, .01339, .012721, .012086, .011483, .010911,
1930 .010368, .009852, .0093623, .0088972, .0084556, .0080362,
1931 .0076379, .0072596, .0069003, .006559, .0062349, .0059269,
1932 .0056344, .0053565, .0050925, .0048417, .0046034, .004377,
1933 .0041618, .0039575, .0037633, .0035788, .0034034, .0032368,
1934 .0030785, .002928, .0027851, .0026492, .0025201, .0023975,
1935 .0022809, .0021701, .0020649, .0019649, .0018699, .0017796,
1936 .0016938, .0016122, .0015348, .0014612, .0013913, .001325,
1937 .0012619, .0012021, .0011452, .0010913, .0010401, 9.9149e-4,
1938 9.454e-4, 9.0169e-4, 8.6024e-4, 8.2097e-4, 7.8377e-4, 7.4854e-4,
1939 7.1522e-4, 6.8371e-4, 6.5393e-4, 6.2582e-4, 5.9932e-4, 5.7435e-4,
1940 5.5087e-4, 5.2882e-4, 5.0814e-4, 4.8881e-4, 4.7076e-4, 4.5398e-4,
1941 4.3843e-4, 4.2407e-4, 4.109e-4, 3.9888e-4, 3.88e-4, 3.7826e-4,
1942 3.6963e-4, 3.6213e-4, 3.5575e-4, 3.505e-4, 3.464e-4, 3.4346e-4,
1943 3.4173e-4, 3.4125e-4, 3.4206e-4, 3.4424e-4, 3.4787e-4, 3.5303e-4,
1944 3.5986e-4, 3.6847e-4, 3.7903e-4, 3.9174e-4, 4.0681e-4, 4.2455e-4,
1945 4.4527e-4, 4.6942e-4, 4.9637e-4, 5.2698e-4, 5.5808e-4, 5.9514e-4,
1946 6.2757e-4, 6.689e-4, 7.1298e-4, 7.3955e-4, 7.8403e-4, 8.0449e-4,
1947 8.5131e-4, 9.0256e-4, 9.3692e-4, .0010051, .0010846, .0011678,
1948 .001282, .0014016, .0015355, .0016764, .0018272, .0020055,
1949 .0021455, .0023421, .0024615, .0026786, .0028787, .0031259,
1950 .0034046, .0036985, .0040917, .0043902, .0048349, .0049531,
1951 .0052989, .0056148, .0052452, .0053357, .005333, .0045069,
1952 .0043851, .004253, .003738, .0038084, .0039013, .0041505,
1953 .0045372, .0050569, .0054507, .0061267, .0066122, .0072449,
1954 .0078012, .0082651, .0076538, .0076573, .0076806, .0075227,
1955 .0076269, .0063758, .006254, .0067749, .0067909, .0068231,
1956 .0072143, .0072762, .0072954, .007679, .0075107, .0073658,
1957 .0072441, .0071074, .0070378, .007176, .0072472, .0075844,
1958 .0079291, .008412, .0090165, .010688, .011535, .012375, .013166,
1959 .013895, .015567, .016011, .016392, .016737, .017043, .017731,
1960 .018031, .018419, .018877, .019474, .019868, .020604, .021538,
1961 .022653, .023869, .025288, .026879, .028547, .030524, .03274,
1962 .035132, .03769, .040567, .043793, .047188, .049962, .053542,
1963 .057205, .060776, .061489, .064419, .067124, .065945, .068487,
1964 .071209, .074783, .077039, .082444, .08902, .09692, .10617,
1965 .11687, .12952, .12362, .13498, .14412, .15492, .16519, .1744,
1966 .17096, .17714, .18208, .17363, .17813, .18564, .18295, .19045,
1967 .20252, .20815, .21844, .22929, .24229, .25321, .26588, .2797,
1968 .29465, .31136, .32961, .36529, .38486, .41027, .43694, .4667,
1969 .49943, .54542, .58348, .62303, .67633, .71755, .76054, .81371,
1970 .85934, .90841, .96438, 1.0207, 1.0821, 1.1491, 1.2226, 1.3018,
1971 1.388, 1.4818, 1.5835, 1.6939, 1.8137, 1.9435, 2.0843, 2.237,
1972 2.4026, 2.5818, 2.7767, 2.9885, 3.2182, 3.4679, 3.7391, 4.0349,
1973 4.3554, 4.7053, 5.0849, 5.4986, 5.9436, 6.4294, 6.9598, 7.5203,
1974 8.143, 8.8253, 9.5568, 10.371, 11.267, 12.233, 13.31, 14.357,
1975 15.598, 16.93, 18.358, 19.849, 21.408, 23.04, 24.706, 26.409,
1976 28.153, 28.795, 30.549, 32.43, 34.49, 36.027, 38.955, 42.465,
1977 46.565, 50.875, 55.378, 59.002, 63.882, 67.949, 73.693, 80.095,
1978 86.403, 94.264, 102.65, 112.37, 123.3, 135.54, 149.14, 163.83,
1979 179.17, 196.89, 217.91, 240.94, 264.13, 292.39, 324.83, 358.21,
1980 397.16, 440.5, 488.6, 541.04, 595.3, 650.43, 652.03, 688.74,
1981 719.47, 743.54, 757.68, 762.35, 756.43, 741.42, 595.43, 580.97,
1982 580.83, 605.68, 667.88, 764.49, 759.93, 789.12, 798.17, 645.66,
1983 615.65, 455.05, 421.09, 306.45, 289.14, 235.7, 215.52, 274.57,
1984 316.53, 357.73, 409.89, 465.06, 521.84, 579.02, 630.64, 794.46,
1985 813., 813.56, 796.25, 761.57, 727.97, 812.14, 866.75, 932.5,
1986 1132.8, 1194.8, 1362.2, 1387.2, 1482.3, 1479.7, 1517.9, 1533.1,
1987 1534.2, 1523.3, 1522.5, 1515.5, 1505.2, 1486.5, 1454., 1412.,
1988 1358.8, 1107.8, 1060.9, 1033.5, 1048.2, 1122.4, 1248.9, 1227.1,
1989 1255.4, 1058.9, 1020.7, 970.59, 715.24, 512.56, 468.47, 349.3,
1990 338.26, 299.22, 301.26, 332.38, 382.08, 445.49, 515.87, 590.85,
1991 662.3, 726.05, 955.59, 964.11, 945.17, 891.48, 807.11, 720.9,
1992 803.36, 834.46, 1073.9, 1107.1, 1123.6, 1296., 1393.7, 1303.1,
1993 1284.3, 1161.8, 1078.8, 976.13, 868.72, 767.4, 674.72, 593.73,
1994 523.12, 462.24, 409.75, 364.34, 325., 290.73, 260.76, 234.46,
1995 211.28, 190.78, 172.61, 156.44, 142.01, 129.12, 117.57, 107.2,
1996 97.877, 89.47, 81.882, 75.021, 68.807, 63.171, 58.052, 53.396,
1997 49.155, 45.288, 41.759, 38.531, 35.576, 32.868, 30.384, 28.102,
1998 26.003, 24.071, 22.293, 20.655, 19.147, 17.756, 16.476, 15.292,
1999 14.198, 13.183, 12.241, 11.367, 10.554, 9.7989, 9.0978, 8.4475,
2000 7.845, 7.2868, 6.7704, 6.2927, 5.8508, 5.4421, 5.064, 4.714,
2001 4.3902, 4.0902, 3.8121, 3.5543, 3.315, 3.093, 2.8869, 2.6953,
2002 2.5172, 2.3517, 2.1977, 2.0544, 1.9211, 1.7969, 1.6812, 1.5735,
2003 1.4731, 1.3794, 1.2921, 1.2107, 1.1346, 1.0637, .99744, .93554,
2004 .87771, .82368, .77313, .72587, .6816, .64014, .60134, .565,
2005 .53086, .49883, .46881, .44074, .4144, .38979, .36679, .34513,
2006 .32474, .30552, .28751, .27045, .25458, .23976, .22584, .21278,
2007 .20051, .18899, .17815, .16801, .15846, .14954, .14117, .13328,
2008 .12584
2009 };
2010
2011 /* Get CO2 continuum absorption... */
2012 const double xw = nu / 2 + 1;
2013 if (xw >= 1 && xw < 2001) {
2014 const int iw = (int) xw;
2015 const double dw = xw - iw;
2016 const double ew = 1 - dw;
2017 const double cw296 = ew * co2296[iw - 1] + dw * co2296[iw];
2018 const double cw260 = ew * co2260[iw - 1] + dw * co2260[iw];
2019 const double cw230 = ew * co2230[iw - 1] + dw * co2230[iw];
2020 const double dt230 = t - 230;
2021 const double dt260 = t - 260;
2022 const double dt296 = t - 296;
2023 const double ctw =
2024 dt260 * 5.050505e-4 * dt296 * cw230 -
2025 dt230 * 9.259259e-4 * dt296 * cw260 +
2026 dt230 * 4.208754e-4 * dt260 * cw296;
2027 return u / NA / 1000 * p / P0 * ctw;
2028 } else
2029 return 0;
2030}
2031
2032/*****************************************************************************/
2033
2034double ctmh2o(
2035 const double nu,
2036 const double p,
2037 const double t,
2038 const double q,
2039 const double u) {
2040
2041 static const double h2o296[2001] =
2042 { .17, .1695, .172, .168, .1687, .1624, .1606,
2043 .1508, .1447, .1344, .1214, .1133, .1009, .09217, .08297, .06989,
2044 .06513, .05469, .05056, .04417, .03779, .03484, .02994, .0272,
2045 .02325, .02063, .01818, .01592, .01405, .01251, .0108, .009647,
2046 .008424, .007519, .006555, .00588, .005136, .004511, .003989,
2047 .003509, .003114, .00274, .002446, .002144, .001895, .001676,
2048 .001486, .001312, .001164, .001031, 9.129e-4, 8.106e-4, 7.213e-4,
2049 6.4e-4, 5.687e-4, 5.063e-4, 4.511e-4, 4.029e-4, 3.596e-4,
2050 3.22e-4, 2.889e-4, 2.597e-4, 2.337e-4, 2.108e-4, 1.907e-4,
2051 1.728e-4, 1.57e-4, 1.43e-4, 1.305e-4, 1.195e-4, 1.097e-4,
2052 1.009e-4, 9.307e-5, 8.604e-5, 7.971e-5, 7.407e-5, 6.896e-5,
2053 6.433e-5, 6.013e-5, 5.631e-5, 5.283e-5, 4.963e-5, 4.669e-5,
2054 4.398e-5, 4.148e-5, 3.917e-5, 3.702e-5, 3.502e-5, 3.316e-5,
2055 3.142e-5, 2.978e-5, 2.825e-5, 2.681e-5, 2.546e-5, 2.419e-5,
2056 2.299e-5, 2.186e-5, 2.079e-5, 1.979e-5, 1.884e-5, 1.795e-5,
2057 1.711e-5, 1.633e-5, 1.559e-5, 1.49e-5, 1.426e-5, 1.367e-5,
2058 1.312e-5, 1.263e-5, 1.218e-5, 1.178e-5, 1.143e-5, 1.112e-5,
2059 1.088e-5, 1.07e-5, 1.057e-5, 1.05e-5, 1.051e-5, 1.059e-5,
2060 1.076e-5, 1.1e-5, 1.133e-5, 1.18e-5, 1.237e-5, 1.308e-5,
2061 1.393e-5, 1.483e-5, 1.614e-5, 1.758e-5, 1.93e-5, 2.123e-5,
2062 2.346e-5, 2.647e-5, 2.93e-5, 3.279e-5, 3.745e-5, 4.152e-5,
2063 4.813e-5, 5.477e-5, 6.203e-5, 7.331e-5, 8.056e-5, 9.882e-5,
2064 1.05e-4, 1.21e-4, 1.341e-4, 1.572e-4, 1.698e-4, 1.968e-4,
2065 2.175e-4, 2.431e-4, 2.735e-4, 2.867e-4, 3.19e-4, 3.371e-4,
2066 3.554e-4, 3.726e-4, 3.837e-4, 3.878e-4, 3.864e-4, 3.858e-4,
2067 3.841e-4, 3.852e-4, 3.815e-4, 3.762e-4, 3.618e-4, 3.579e-4,
2068 3.45e-4, 3.202e-4, 3.018e-4, 2.785e-4, 2.602e-4, 2.416e-4,
2069 2.097e-4, 1.939e-4, 1.689e-4, 1.498e-4, 1.308e-4, 1.17e-4,
2070 1.011e-4, 9.237e-5, 7.909e-5, 7.006e-5, 6.112e-5, 5.401e-5,
2071 4.914e-5, 4.266e-5, 3.963e-5, 3.316e-5, 3.037e-5, 2.598e-5,
2072 2.294e-5, 2.066e-5, 1.813e-5, 1.583e-5, 1.423e-5, 1.247e-5,
2073 1.116e-5, 9.76e-6, 8.596e-6, 7.72e-6, 6.825e-6, 6.108e-6,
2074 5.366e-6, 4.733e-6, 4.229e-6, 3.731e-6, 3.346e-6, 2.972e-6,
2075 2.628e-6, 2.356e-6, 2.102e-6, 1.878e-6, 1.678e-6, 1.507e-6,
2076 1.348e-6, 1.21e-6, 1.089e-6, 9.806e-7, 8.857e-7, 8.004e-7,
2077 7.261e-7, 6.599e-7, 6.005e-7, 5.479e-7, 5.011e-7, 4.595e-7,
2078 4.219e-7, 3.885e-7, 3.583e-7, 3.314e-7, 3.071e-7, 2.852e-7,
2079 2.654e-7, 2.474e-7, 2.311e-7, 2.162e-7, 2.026e-7, 1.902e-7,
2080 1.788e-7, 1.683e-7, 1.587e-7, 1.497e-7, 1.415e-7, 1.338e-7,
2081 1.266e-7, 1.2e-7, 1.138e-7, 1.08e-7, 1.027e-7, 9.764e-8,
2082 9.296e-8, 8.862e-8, 8.458e-8, 8.087e-8, 7.744e-8, 7.429e-8,
2083 7.145e-8, 6.893e-8, 6.664e-8, 6.468e-8, 6.322e-8, 6.162e-8,
2084 6.07e-8, 5.992e-8, 5.913e-8, 5.841e-8, 5.796e-8, 5.757e-8,
2085 5.746e-8, 5.731e-8, 5.679e-8, 5.577e-8, 5.671e-8, 5.656e-8,
2086 5.594e-8, 5.593e-8, 5.602e-8, 5.62e-8, 5.693e-8, 5.725e-8,
2087 5.858e-8, 6.037e-8, 6.249e-8, 6.535e-8, 6.899e-8, 7.356e-8,
2088 7.918e-8, 8.618e-8, 9.385e-8, 1.039e-7, 1.158e-7, 1.29e-7,
2089 1.437e-7, 1.65e-7, 1.871e-7, 2.121e-7, 2.427e-7, 2.773e-7,
2090 3.247e-7, 3.677e-7, 4.037e-7, 4.776e-7, 5.101e-7, 6.214e-7,
2091 6.936e-7, 7.581e-7, 8.486e-7, 9.355e-7, 9.942e-7, 1.063e-6,
2092 1.123e-6, 1.191e-6, 1.215e-6, 1.247e-6, 1.26e-6, 1.271e-6,
2093 1.284e-6, 1.317e-6, 1.323e-6, 1.349e-6, 1.353e-6, 1.362e-6,
2094 1.344e-6, 1.329e-6, 1.336e-6, 1.327e-6, 1.325e-6, 1.359e-6,
2095 1.374e-6, 1.415e-6, 1.462e-6, 1.526e-6, 1.619e-6, 1.735e-6,
2096 1.863e-6, 2.034e-6, 2.265e-6, 2.482e-6, 2.756e-6, 3.103e-6,
2097 3.466e-6, 3.832e-6, 4.378e-6, 4.913e-6, 5.651e-6, 6.311e-6,
2098 7.169e-6, 8.057e-6, 9.253e-6, 1.047e-5, 1.212e-5, 1.36e-5,
2099 1.569e-5, 1.776e-5, 2.02e-5, 2.281e-5, 2.683e-5, 2.994e-5,
2100 3.488e-5, 3.896e-5, 4.499e-5, 5.175e-5, 6.035e-5, 6.34e-5,
2101 7.281e-5, 7.923e-5, 8.348e-5, 9.631e-5, 1.044e-4, 1.102e-4,
2102 1.176e-4, 1.244e-4, 1.283e-4, 1.326e-4, 1.4e-4, 1.395e-4,
2103 1.387e-4, 1.363e-4, 1.314e-4, 1.241e-4, 1.228e-4, 1.148e-4,
2104 1.086e-4, 1.018e-4, 8.89e-5, 8.316e-5, 7.292e-5, 6.452e-5,
2105 5.625e-5, 5.045e-5, 4.38e-5, 3.762e-5, 3.29e-5, 2.836e-5,
2106 2.485e-5, 2.168e-5, 1.895e-5, 1.659e-5, 1.453e-5, 1.282e-5,
2107 1.132e-5, 1.001e-5, 8.836e-6, 7.804e-6, 6.922e-6, 6.116e-6,
2108 5.429e-6, 4.824e-6, 4.278e-6, 3.788e-6, 3.371e-6, 2.985e-6,
2109 2.649e-6, 2.357e-6, 2.09e-6, 1.858e-6, 1.647e-6, 1.462e-6,
2110 1.299e-6, 1.155e-6, 1.028e-6, 9.142e-7, 8.132e-7, 7.246e-7,
2111 6.451e-7, 5.764e-7, 5.151e-7, 4.603e-7, 4.121e-7, 3.694e-7,
2112 3.318e-7, 2.985e-7, 2.69e-7, 2.428e-7, 2.197e-7, 1.992e-7,
2113 1.81e-7, 1.649e-7, 1.506e-7, 1.378e-7, 1.265e-7, 1.163e-7,
2114 1.073e-7, 9.918e-8, 9.191e-8, 8.538e-8, 7.949e-8, 7.419e-8,
2115 6.94e-8, 6.508e-8, 6.114e-8, 5.761e-8, 5.437e-8, 5.146e-8,
2116 4.89e-8, 4.636e-8, 4.406e-8, 4.201e-8, 4.015e-8, 3.84e-8,
2117 3.661e-8, 3.51e-8, 3.377e-8, 3.242e-8, 3.13e-8, 3.015e-8,
2118 2.918e-8, 2.83e-8, 2.758e-8, 2.707e-8, 2.656e-8, 2.619e-8,
2119 2.609e-8, 2.615e-8, 2.63e-8, 2.675e-8, 2.745e-8, 2.842e-8,
2120 2.966e-8, 3.125e-8, 3.318e-8, 3.565e-8, 3.85e-8, 4.191e-8,
2121 4.59e-8, 5.059e-8, 5.607e-8, 6.239e-8, 6.958e-8, 7.796e-8,
2122 8.773e-8, 9.88e-8, 1.114e-7, 1.258e-7, 1.422e-7, 1.61e-7,
2123 1.822e-7, 2.06e-7, 2.337e-7, 2.645e-7, 2.996e-7, 3.393e-7,
2124 3.843e-7, 4.363e-7, 4.935e-7, 5.607e-7, 6.363e-7, 7.242e-7,
2125 8.23e-7, 9.411e-7, 1.071e-6, 1.232e-6, 1.402e-6, 1.6e-6, 1.82e-6,
2126 2.128e-6, 2.386e-6, 2.781e-6, 3.242e-6, 3.653e-6, 4.323e-6,
2127 4.747e-6, 5.321e-6, 5.919e-6, 6.681e-6, 7.101e-6, 7.983e-6,
2128 8.342e-6, 8.741e-6, 9.431e-6, 9.952e-6, 1.026e-5, 1.055e-5,
2129 1.095e-5, 1.095e-5, 1.087e-5, 1.056e-5, 1.026e-5, 9.715e-6,
2130 9.252e-6, 8.452e-6, 7.958e-6, 7.268e-6, 6.295e-6, 6.003e-6, 5e-6,
2131 4.591e-6, 3.983e-6, 3.479e-6, 3.058e-6, 2.667e-6, 2.293e-6,
2132 1.995e-6, 1.747e-6, 1.517e-6, 1.335e-6, 1.165e-6, 1.028e-6,
2133 9.007e-7, 7.956e-7, 7.015e-7, 6.192e-7, 5.491e-7, 4.859e-7,
2134 4.297e-7, 3.799e-7, 3.38e-7, 3.002e-7, 2.659e-7, 2.366e-7,
2135 2.103e-7, 1.861e-7, 1.655e-7, 1.469e-7, 1.309e-7, 1.162e-7,
2136 1.032e-7, 9.198e-8, 8.181e-8, 7.294e-8, 6.516e-8, 5.787e-8,
2137 5.163e-8, 4.612e-8, 4.119e-8, 3.695e-8, 3.308e-8, 2.976e-8,
2138 2.67e-8, 2.407e-8, 2.171e-8, 1.965e-8, 1.78e-8, 1.617e-8,
2139 1.47e-8, 1.341e-8, 1.227e-8, 1.125e-8, 1.033e-8, 9.524e-9,
2140 8.797e-9, 8.162e-9, 7.565e-9, 7.04e-9, 6.56e-9, 6.129e-9,
2141 5.733e-9, 5.376e-9, 5.043e-9, 4.75e-9, 4.466e-9, 4.211e-9,
2142 3.977e-9, 3.759e-9, 3.558e-9, 3.373e-9, 3.201e-9, 3.043e-9,
2143 2.895e-9, 2.76e-9, 2.635e-9, 2.518e-9, 2.411e-9, 2.314e-9,
2144 2.23e-9, 2.151e-9, 2.087e-9, 2.035e-9, 1.988e-9, 1.946e-9,
2145 1.927e-9, 1.916e-9, 1.916e-9, 1.933e-9, 1.966e-9, 2.018e-9,
2146 2.09e-9, 2.182e-9, 2.299e-9, 2.442e-9, 2.623e-9, 2.832e-9,
2147 3.079e-9, 3.368e-9, 3.714e-9, 4.104e-9, 4.567e-9, 5.091e-9,
2148 5.701e-9, 6.398e-9, 7.194e-9, 8.127e-9, 9.141e-9, 1.035e-8,
2149 1.177e-8, 1.338e-8, 1.508e-8, 1.711e-8, 1.955e-8, 2.216e-8,
2150 2.534e-8, 2.871e-8, 3.291e-8, 3.711e-8, 4.285e-8, 4.868e-8,
2151 5.509e-8, 6.276e-8, 7.262e-8, 8.252e-8, 9.4e-8, 1.064e-7,
2152 1.247e-7, 1.411e-7, 1.626e-7, 1.827e-7, 2.044e-7, 2.284e-7,
2153 2.452e-7, 2.854e-7, 3.026e-7, 3.278e-7, 3.474e-7, 3.693e-7,
2154 3.93e-7, 4.104e-7, 4.22e-7, 4.439e-7, 4.545e-7, 4.778e-7,
2155 4.812e-7, 5.018e-7, 4.899e-7, 5.075e-7, 5.073e-7, 5.171e-7,
2156 5.131e-7, 5.25e-7, 5.617e-7, 5.846e-7, 6.239e-7, 6.696e-7,
2157 7.398e-7, 8.073e-7, 9.15e-7, 1.009e-6, 1.116e-6, 1.264e-6,
2158 1.439e-6, 1.644e-6, 1.856e-6, 2.147e-6, 2.317e-6, 2.713e-6,
2159 2.882e-6, 2.99e-6, 3.489e-6, 3.581e-6, 4.033e-6, 4.26e-6,
2160 4.543e-6, 4.84e-6, 4.826e-6, 5.013e-6, 5.252e-6, 5.277e-6,
2161 5.306e-6, 5.236e-6, 5.123e-6, 5.171e-6, 4.843e-6, 4.615e-6,
2162 4.385e-6, 3.97e-6, 3.693e-6, 3.231e-6, 2.915e-6, 2.495e-6,
2163 2.144e-6, 1.91e-6, 1.639e-6, 1.417e-6, 1.226e-6, 1.065e-6,
2164 9.29e-7, 8.142e-7, 7.161e-7, 6.318e-7, 5.581e-7, 4.943e-7,
2165 4.376e-7, 3.884e-7, 3.449e-7, 3.06e-7, 2.712e-7, 2.412e-7,
2166 2.139e-7, 1.903e-7, 1.689e-7, 1.499e-7, 1.331e-7, 1.183e-7,
2167 1.05e-7, 9.362e-8, 8.306e-8, 7.403e-8, 6.578e-8, 5.853e-8,
2168 5.216e-8, 4.632e-8, 4.127e-8, 3.678e-8, 3.279e-8, 2.923e-8,
2169 2.612e-8, 2.339e-8, 2.094e-8, 1.877e-8, 1.686e-8, 1.516e-8,
2170 1.366e-8, 1.234e-8, 1.114e-8, 1.012e-8, 9.182e-9, 8.362e-9,
2171 7.634e-9, 6.981e-9, 6.406e-9, 5.888e-9, 5.428e-9, 5.021e-9,
2172 4.65e-9, 4.326e-9, 4.033e-9, 3.77e-9, 3.536e-9, 3.327e-9,
2173 3.141e-9, 2.974e-9, 2.825e-9, 2.697e-9, 2.584e-9, 2.488e-9,
2174 2.406e-9, 2.34e-9, 2.292e-9, 2.259e-9, 2.244e-9, 2.243e-9,
2175 2.272e-9, 2.31e-9, 2.378e-9, 2.454e-9, 2.618e-9, 2.672e-9,
2176 2.831e-9, 3.05e-9, 3.225e-9, 3.425e-9, 3.677e-9, 3.968e-9,
2177 4.221e-9, 4.639e-9, 4.96e-9, 5.359e-9, 5.649e-9, 6.23e-9,
2178 6.716e-9, 7.218e-9, 7.746e-9, 7.988e-9, 8.627e-9, 8.999e-9,
2179 9.442e-9, 9.82e-9, 1.015e-8, 1.06e-8, 1.079e-8, 1.109e-8,
2180 1.137e-8, 1.186e-8, 1.18e-8, 1.187e-8, 1.194e-8, 1.192e-8,
2181 1.224e-8, 1.245e-8, 1.246e-8, 1.318e-8, 1.377e-8, 1.471e-8,
2182 1.582e-8, 1.713e-8, 1.853e-8, 2.063e-8, 2.27e-8, 2.567e-8,
2183 2.891e-8, 3.264e-8, 3.744e-8, 4.286e-8, 4.915e-8, 5.623e-8,
2184 6.336e-8, 7.293e-8, 8.309e-8, 9.319e-8, 1.091e-7, 1.243e-7,
2185 1.348e-7, 1.449e-7, 1.62e-7, 1.846e-7, 1.937e-7, 2.04e-7,
2186 2.179e-7, 2.298e-7, 2.433e-7, 2.439e-7, 2.464e-7, 2.611e-7,
2187 2.617e-7, 2.582e-7, 2.453e-7, 2.401e-7, 2.349e-7, 2.203e-7,
2188 2.066e-7, 1.939e-7, 1.78e-7, 1.558e-7, 1.391e-7, 1.203e-7,
2189 1.048e-7, 9.464e-8, 8.306e-8, 7.239e-8, 6.317e-8, 5.52e-8,
2190 4.847e-8, 4.282e-8, 3.796e-8, 3.377e-8, 2.996e-8, 2.678e-8,
2191 2.4e-8, 2.134e-8, 1.904e-8, 1.705e-8, 1.523e-8, 1.35e-8,
2192 1.204e-8, 1.07e-8, 9.408e-9, 8.476e-9, 7.47e-9, 6.679e-9,
2193 5.929e-9, 5.267e-9, 4.711e-9, 4.172e-9, 3.761e-9, 3.288e-9,
2194 2.929e-9, 2.609e-9, 2.315e-9, 2.042e-9, 1.844e-9, 1.64e-9,
2195 1.47e-9, 1.31e-9, 1.176e-9, 1.049e-9, 9.377e-10, 8.462e-10,
2196 7.616e-10, 6.854e-10, 6.191e-10, 5.596e-10, 5.078e-10, 4.611e-10,
2197 4.197e-10, 3.83e-10, 3.505e-10, 3.215e-10, 2.956e-10, 2.726e-10,
2198 2.521e-10, 2.338e-10, 2.173e-10, 2.026e-10, 1.895e-10, 1.777e-10,
2199 1.672e-10, 1.579e-10, 1.496e-10, 1.423e-10, 1.358e-10, 1.302e-10,
2200 1.254e-10, 1.216e-10, 1.187e-10, 1.163e-10, 1.147e-10, 1.145e-10,
2201 1.15e-10, 1.17e-10, 1.192e-10, 1.25e-10, 1.298e-10, 1.345e-10,
2202 1.405e-10, 1.538e-10, 1.648e-10, 1.721e-10, 1.872e-10, 1.968e-10,
2203 2.089e-10, 2.172e-10, 2.317e-10, 2.389e-10, 2.503e-10, 2.585e-10,
2204 2.686e-10, 2.8e-10, 2.895e-10, 3.019e-10, 3.037e-10, 3.076e-10,
2205 3.146e-10, 3.198e-10, 3.332e-10, 3.397e-10, 3.54e-10, 3.667e-10,
2206 3.895e-10, 4.071e-10, 4.565e-10, 4.983e-10, 5.439e-10, 5.968e-10,
2207 6.676e-10, 7.456e-10, 8.405e-10, 9.478e-10, 1.064e-9, 1.218e-9,
2208 1.386e-9, 1.581e-9, 1.787e-9, 2.032e-9, 2.347e-9, 2.677e-9,
2209 3.008e-9, 3.544e-9, 4.056e-9, 4.687e-9, 5.331e-9, 6.227e-9,
2210 6.854e-9, 8.139e-9, 8.945e-9, 9.865e-9, 1.125e-8, 1.178e-8,
2211 1.364e-8, 1.436e-8, 1.54e-8, 1.672e-8, 1.793e-8, 1.906e-8,
2212 2.036e-8, 2.144e-8, 2.292e-8, 2.371e-8, 2.493e-8, 2.606e-8,
2213 2.706e-8, 2.866e-8, 3.036e-8, 3.136e-8, 3.405e-8, 3.665e-8,
2214 3.837e-8, 4.229e-8, 4.748e-8, 5.32e-8, 5.763e-8, 6.677e-8,
2215 7.216e-8, 7.716e-8, 8.958e-8, 9.419e-8, 1.036e-7, 1.108e-7,
2216 1.189e-7, 1.246e-7, 1.348e-7, 1.31e-7, 1.361e-7, 1.364e-7,
2217 1.363e-7, 1.343e-7, 1.293e-7, 1.254e-7, 1.235e-7, 1.158e-7,
2218 1.107e-7, 9.961e-8, 9.011e-8, 7.91e-8, 6.916e-8, 6.338e-8,
2219 5.564e-8, 4.827e-8, 4.198e-8, 3.695e-8, 3.276e-8, 2.929e-8,
2220 2.633e-8, 2.391e-8, 2.192e-8, 2.021e-8, 1.89e-8, 1.772e-8,
2221 1.667e-8, 1.603e-8, 1.547e-8, 1.537e-8, 1.492e-8, 1.515e-8,
2222 1.479e-8, 1.45e-8, 1.513e-8, 1.495e-8, 1.529e-8, 1.565e-8,
2223 1.564e-8, 1.553e-8, 1.569e-8, 1.584e-8, 1.57e-8, 1.538e-8,
2224 1.513e-8, 1.472e-8, 1.425e-8, 1.349e-8, 1.328e-8, 1.249e-8,
2225 1.17e-8, 1.077e-8, 9.514e-9, 8.614e-9, 7.46e-9, 6.621e-9,
2226 5.775e-9, 5.006e-9, 4.308e-9, 3.747e-9, 3.24e-9, 2.84e-9,
2227 2.481e-9, 2.184e-9, 1.923e-9, 1.71e-9, 1.504e-9, 1.334e-9,
2228 1.187e-9, 1.053e-9, 9.367e-10, 8.306e-10, 7.419e-10, 6.63e-10,
2229 5.918e-10, 5.277e-10, 4.717e-10, 4.222e-10, 3.783e-10, 3.39e-10,
2230 3.036e-10, 2.729e-10, 2.455e-10, 2.211e-10, 1.995e-10, 1.804e-10,
2231 1.635e-10, 1.485e-10, 1.355e-10, 1.24e-10, 1.139e-10, 1.051e-10,
2232 9.757e-11, 9.114e-11, 8.577e-11, 8.139e-11, 7.792e-11, 7.52e-11,
2233 7.39e-11, 7.311e-11, 7.277e-11, 7.482e-11, 7.698e-11, 8.162e-11,
2234 8.517e-11, 8.968e-11, 9.905e-11, 1.075e-10, 1.187e-10, 1.291e-10,
2235 1.426e-10, 1.573e-10, 1.734e-10, 1.905e-10, 2.097e-10, 2.28e-10,
2236 2.473e-10, 2.718e-10, 2.922e-10, 3.128e-10, 3.361e-10, 3.641e-10,
2237 3.91e-10, 4.196e-10, 4.501e-10, 4.932e-10, 5.258e-10, 5.755e-10,
2238 6.253e-10, 6.664e-10, 7.344e-10, 7.985e-10, 8.877e-10, 1.005e-9,
2239 1.118e-9, 1.251e-9, 1.428e-9, 1.61e-9, 1.888e-9, 2.077e-9,
2240 2.331e-9, 2.751e-9, 3.061e-9, 3.522e-9, 3.805e-9, 4.181e-9,
2241 4.575e-9, 5.167e-9, 5.634e-9, 6.007e-9, 6.501e-9, 6.829e-9,
2242 7.211e-9, 7.262e-9, 7.696e-9, 7.832e-9, 7.799e-9, 7.651e-9,
2243 7.304e-9, 7.15e-9, 6.977e-9, 6.603e-9, 6.209e-9, 5.69e-9,
2244 5.432e-9, 4.764e-9, 4.189e-9, 3.64e-9, 3.203e-9, 2.848e-9,
2245 2.51e-9, 2.194e-9, 1.946e-9, 1.75e-9, 1.567e-9, 1.426e-9,
2246 1.302e-9, 1.197e-9, 1.109e-9, 1.035e-9, 9.719e-10, 9.207e-10,
2247 8.957e-10, 8.578e-10, 8.262e-10, 8.117e-10, 7.987e-10, 7.875e-10,
2248 7.741e-10, 7.762e-10, 7.537e-10, 7.424e-10, 7.474e-10, 7.294e-10,
2249 7.216e-10, 7.233e-10, 7.075e-10, 6.892e-10, 6.618e-10, 6.314e-10,
2250 6.208e-10, 5.689e-10, 5.55e-10, 4.984e-10, 4.6e-10, 4.078e-10,
2251 3.879e-10, 3.459e-10, 2.982e-10, 2.626e-10, 2.329e-10, 1.988e-10,
2252 1.735e-10, 1.487e-10, 1.297e-10, 1.133e-10, 9.943e-11, 8.736e-11,
2253 7.726e-11, 6.836e-11, 6.053e-11, 5.384e-11, 4.789e-11, 4.267e-11,
2254 3.804e-11, 3.398e-11, 3.034e-11, 2.71e-11, 2.425e-11, 2.173e-11,
2255 1.95e-11, 1.752e-11, 1.574e-11, 1.418e-11, 1.278e-11, 1.154e-11,
2256 1.044e-11, 9.463e-12, 8.602e-12, 7.841e-12, 7.171e-12, 6.584e-12,
2257 6.073e-12, 5.631e-12, 5.254e-12, 4.937e-12, 4.679e-12, 4.476e-12,
2258 4.328e-12, 4.233e-12, 4.194e-12, 4.211e-12, 4.286e-12, 4.424e-12,
2259 4.628e-12, 4.906e-12, 5.262e-12, 5.708e-12, 6.254e-12, 6.914e-12,
2260 7.714e-12, 8.677e-12, 9.747e-12, 1.101e-11, 1.256e-11, 1.409e-11,
2261 1.597e-11, 1.807e-11, 2.034e-11, 2.316e-11, 2.622e-11, 2.962e-11,
2262 3.369e-11, 3.819e-11, 4.329e-11, 4.932e-11, 5.589e-11, 6.364e-11,
2263 7.284e-11, 8.236e-11, 9.447e-11, 1.078e-10, 1.229e-10, 1.417e-10,
2264 1.614e-10, 1.843e-10, 2.107e-10, 2.406e-10, 2.728e-10, 3.195e-10,
2265 3.595e-10, 4.153e-10, 4.736e-10, 5.41e-10, 6.088e-10, 6.769e-10,
2266 7.691e-10, 8.545e-10, 9.621e-10, 1.047e-9, 1.161e-9, 1.296e-9,
2267 1.424e-9, 1.576e-9, 1.739e-9, 1.893e-9, 2.08e-9, 2.336e-9,
2268 2.604e-9, 2.76e-9, 3.001e-9, 3.365e-9, 3.55e-9, 3.895e-9,
2269 4.183e-9, 4.614e-9, 4.846e-9, 5.068e-9, 5.427e-9, 5.541e-9,
2270 5.864e-9, 5.997e-9, 5.997e-9, 6.061e-9, 5.944e-9, 5.855e-9,
2271 5.661e-9, 5.523e-9, 5.374e-9, 4.94e-9, 4.688e-9, 4.17e-9,
2272 3.913e-9, 3.423e-9, 2.997e-9, 2.598e-9, 2.253e-9, 1.946e-9,
2273 1.71e-9, 1.507e-9, 1.336e-9, 1.19e-9, 1.068e-9, 9.623e-10,
2274 8.772e-10, 8.007e-10, 7.42e-10, 6.884e-10, 6.483e-10, 6.162e-10,
2275 5.922e-10, 5.688e-10, 5.654e-10, 5.637e-10, 5.701e-10, 5.781e-10,
2276 5.874e-10, 6.268e-10, 6.357e-10, 6.525e-10, 7.137e-10, 7.441e-10,
2277 8.024e-10, 8.485e-10, 9.143e-10, 9.536e-10, 9.717e-10, 1.018e-9,
2278 1.042e-9, 1.054e-9, 1.092e-9, 1.079e-9, 1.064e-9, 1.043e-9,
2279 1.02e-9, 9.687e-10, 9.273e-10, 9.208e-10, 9.068e-10, 7.687e-10,
2280 7.385e-10, 6.595e-10, 5.87e-10, 5.144e-10, 4.417e-10, 3.804e-10,
2281 3.301e-10, 2.866e-10, 2.509e-10, 2.202e-10, 1.947e-10, 1.719e-10,
2282 1.525e-10, 1.361e-10, 1.21e-10, 1.084e-10, 9.8e-11, 8.801e-11,
2283 7.954e-11, 7.124e-11, 6.335e-11, 5.76e-11, 5.132e-11, 4.601e-11,
2284 4.096e-11, 3.657e-11, 3.25e-11, 2.909e-11, 2.587e-11, 2.297e-11,
2285 2.05e-11, 1.828e-11, 1.632e-11, 1.462e-11, 1.314e-11, 1.185e-11,
2286 1.073e-11, 9.76e-12, 8.922e-12, 8.206e-12, 7.602e-12, 7.1e-12,
2287 6.694e-12, 6.378e-12, 6.149e-12, 6.004e-12, 5.941e-12, 5.962e-12,
2288 6.069e-12, 6.265e-12, 6.551e-12, 6.935e-12, 7.457e-12, 8.074e-12,
2289 8.811e-12, 9.852e-12, 1.086e-11, 1.207e-11, 1.361e-11, 1.553e-11,
2290 1.737e-11, 1.93e-11, 2.175e-11, 2.41e-11, 2.706e-11, 3.023e-11,
2291 3.313e-11, 3.657e-11, 4.118e-11, 4.569e-11, 5.025e-11, 5.66e-11,
2292 6.231e-11, 6.881e-11, 7.996e-11, 8.526e-11, 9.694e-11, 1.106e-10,
2293 1.222e-10, 1.355e-10, 1.525e-10, 1.775e-10, 1.924e-10, 2.181e-10,
2294 2.379e-10, 2.662e-10, 2.907e-10, 3.154e-10, 3.366e-10, 3.579e-10,
2295 3.858e-10, 4.046e-10, 4.196e-10, 4.166e-10, 4.457e-10, 4.466e-10,
2296 4.404e-10, 4.337e-10, 4.15e-10, 4.083e-10, 3.91e-10, 3.723e-10,
2297 3.514e-10, 3.303e-10, 2.847e-10, 2.546e-10, 2.23e-10, 1.994e-10,
2298 1.733e-10, 1.488e-10, 1.297e-10, 1.144e-10, 1.004e-10, 8.741e-11,
2299 7.928e-11, 7.034e-11, 6.323e-11, 5.754e-11, 5.25e-11, 4.85e-11,
2300 4.502e-11, 4.286e-11, 4.028e-11, 3.899e-11, 3.824e-11, 3.761e-11,
2301 3.804e-11, 3.839e-11, 3.845e-11, 4.244e-11, 4.382e-11, 4.582e-11,
2302 4.847e-11, 5.209e-11, 5.384e-11, 5.887e-11, 6.371e-11, 6.737e-11,
2303 7.168e-11, 7.415e-11, 7.827e-11, 8.037e-11, 8.12e-11, 8.071e-11,
2304 8.008e-11, 7.851e-11, 7.544e-11, 7.377e-11, 7.173e-11, 6.801e-11,
2305 6.267e-11, 5.727e-11, 5.288e-11, 4.853e-11, 4.082e-11, 3.645e-11,
2306 3.136e-11, 2.672e-11, 2.304e-11, 1.986e-11, 1.725e-11, 1.503e-11,
2307 1.315e-11, 1.153e-11, 1.014e-11, 8.942e-12, 7.901e-12, 6.993e-12,
2308 6.199e-12, 5.502e-12, 4.89e-12, 4.351e-12, 3.878e-12, 3.461e-12,
2309 3.094e-12, 2.771e-12, 2.488e-12, 2.241e-12, 2.025e-12, 1.838e-12,
2310 1.677e-12, 1.541e-12, 1.427e-12, 1.335e-12, 1.262e-12, 1.209e-12,
2311 1.176e-12, 1.161e-12, 1.165e-12, 1.189e-12, 1.234e-12, 1.3e-12,
2312 1.389e-12, 1.503e-12, 1.644e-12, 1.814e-12, 2.017e-12, 2.255e-12,
2313 2.534e-12, 2.858e-12, 3.231e-12, 3.661e-12, 4.153e-12, 4.717e-12,
2314 5.36e-12, 6.094e-12, 6.93e-12, 7.882e-12, 8.966e-12, 1.02e-11,
2315 1.162e-11, 1.324e-11, 1.51e-11, 1.72e-11, 1.965e-11, 2.237e-11,
2316 2.56e-11, 2.927e-11, 3.371e-11, 3.842e-11, 4.429e-11, 5.139e-11,
2317 5.798e-11, 6.697e-11, 7.626e-11, 8.647e-11, 1.022e-10, 1.136e-10,
2318 1.3e-10, 1.481e-10, 1.672e-10, 1.871e-10, 2.126e-10, 2.357e-10,
2319 2.583e-10, 2.997e-10, 3.289e-10, 3.702e-10, 4.012e-10, 4.319e-10,
2320 4.527e-10, 5.001e-10, 5.448e-10, 5.611e-10, 5.76e-10, 5.965e-10,
2321 6.079e-10, 6.207e-10, 6.276e-10, 6.222e-10, 6.137e-10, 6e-10,
2322 5.814e-10, 5.393e-10, 5.35e-10, 4.947e-10, 4.629e-10, 4.117e-10,
2323 3.712e-10, 3.372e-10, 2.923e-10, 2.55e-10, 2.232e-10, 1.929e-10,
2324 1.679e-10, 1.46e-10, 1.289e-10, 1.13e-10, 9.953e-11, 8.763e-11,
2325 7.76e-11, 6.9e-11, 6.16e-11, 5.525e-11, 4.958e-11, 4.489e-11,
2326 4.072e-11, 3.728e-11, 3.438e-11, 3.205e-11, 3.006e-11, 2.848e-11,
2327 2.766e-11, 2.688e-11, 2.664e-11, 2.67e-11, 2.696e-11, 2.786e-11,
2328 2.861e-11, 3.009e-11, 3.178e-11, 3.389e-11, 3.587e-11, 3.819e-11,
2329 4.054e-11, 4.417e-11, 4.703e-11, 5.137e-11, 5.46e-11, 6.055e-11,
2330 6.333e-11, 6.773e-11, 7.219e-11, 7.717e-11, 8.131e-11, 8.491e-11,
2331 8.574e-11, 9.01e-11, 9.017e-11, 8.999e-11, 8.959e-11, 8.838e-11,
2332 8.579e-11, 8.162e-11, 8.098e-11, 7.472e-11, 7.108e-11, 6.559e-11,
2333 5.994e-11, 5.172e-11, 4.424e-11, 3.951e-11, 3.34e-11, 2.902e-11,
2334 2.541e-11, 2.215e-11, 1.945e-11, 1.716e-11, 1.503e-11, 1.339e-11,
2335 1.185e-11, 1.05e-11, 9.336e-12, 8.307e-12, 7.312e-12, 6.55e-12,
2336 5.836e-12, 5.178e-12, 4.6e-12, 4.086e-12, 3.639e-12, 3.247e-12,
2337 2.904e-12, 2.604e-12, 2.341e-12, 2.112e-12, 1.914e-12, 1.744e-12,
2338 1.598e-12, 1.476e-12, 1.374e-12, 1.293e-12, 1.23e-12, 1.185e-12,
2339 1.158e-12, 1.147e-12, 1.154e-12, 1.177e-12, 1.219e-12, 1.28e-12,
2340 1.36e-12, 1.463e-12, 1.591e-12, 1.75e-12, 1.94e-12, 2.156e-12,
2341 2.43e-12, 2.748e-12, 3.052e-12, 3.533e-12, 3.967e-12, 4.471e-12,
2342 5.041e-12, 5.86e-12, 6.664e-12, 7.522e-12, 8.342e-12, 9.412e-12,
2343 1.072e-11, 1.213e-11, 1.343e-11, 1.496e-11, 1.664e-11, 1.822e-11,
2344 2.029e-11, 2.233e-11, 2.457e-11, 2.709e-11, 2.928e-11, 3.115e-11,
2345 3.356e-11, 3.592e-11, 3.818e-11, 3.936e-11, 4.061e-11, 4.149e-11,
2346 4.299e-11, 4.223e-11, 4.251e-11, 4.287e-11, 4.177e-11, 4.094e-11,
2347 3.942e-11, 3.772e-11, 3.614e-11, 3.394e-11, 3.222e-11, 2.791e-11,
2348 2.665e-11, 2.309e-11, 2.032e-11, 1.74e-11, 1.535e-11, 1.323e-11,
2349 1.151e-11, 9.803e-12, 8.65e-12, 7.54e-12, 6.619e-12, 5.832e-12,
2350 5.113e-12, 4.503e-12, 3.975e-12, 3.52e-12, 3.112e-12, 2.797e-12,
2351 2.5e-12, 2.24e-12, 2.013e-12, 1.819e-12, 1.653e-12, 1.513e-12,
2352 1.395e-12, 1.299e-12, 1.225e-12, 1.168e-12, 1.124e-12, 1.148e-12,
2353 1.107e-12, 1.128e-12, 1.169e-12, 1.233e-12, 1.307e-12, 1.359e-12,
2354 1.543e-12, 1.686e-12, 1.794e-12, 2.028e-12, 2.21e-12, 2.441e-12,
2355 2.653e-12, 2.828e-12, 3.093e-12, 3.28e-12, 3.551e-12, 3.677e-12,
2356 3.803e-12, 3.844e-12, 4.068e-12, 4.093e-12, 4.002e-12, 3.904e-12,
2357 3.624e-12, 3.633e-12, 3.622e-12, 3.443e-12, 3.184e-12, 2.934e-12,
2358 2.476e-12, 2.212e-12, 1.867e-12, 1.594e-12, 1.37e-12, 1.192e-12,
2359 1.045e-12, 9.211e-13, 8.17e-13, 7.29e-13, 6.55e-13, 5.929e-13,
2360 5.415e-13, 4.995e-13, 4.661e-13, 4.406e-13, 4.225e-13, 4.116e-13,
2361 4.075e-13, 4.102e-13, 4.198e-13, 4.365e-13, 4.606e-13, 4.925e-13,
2362 5.326e-13, 5.818e-13, 6.407e-13, 7.104e-13, 7.92e-13, 8.868e-13,
2363 9.964e-13, 1.123e-12, 1.268e-12, 1.434e-12, 1.626e-12, 1.848e-12,
2364 2.107e-12, 2.422e-12, 2.772e-12, 3.145e-12, 3.704e-12, 4.27e-12,
2365 4.721e-12, 5.361e-12, 6.083e-12, 7.095e-12, 7.968e-12, 9.228e-12,
2366 1.048e-11, 1.187e-11, 1.336e-11, 1.577e-11, 1.772e-11, 2.017e-11,
2367 2.25e-11, 2.63e-11, 2.911e-11, 3.356e-11, 3.82e-11, 4.173e-11,
2368 4.811e-11, 5.254e-11, 5.839e-11, 6.187e-11, 6.805e-11, 7.118e-11,
2369 7.369e-11, 7.664e-11, 7.794e-11, 7.947e-11, 8.036e-11, 7.954e-11,
2370 7.849e-11, 7.518e-11, 7.462e-11, 6.926e-11, 6.531e-11, 6.197e-11,
2371 5.421e-11, 4.777e-11, 4.111e-11, 3.679e-11, 3.166e-11, 2.786e-11,
2372 2.436e-11, 2.144e-11, 1.859e-11, 1.628e-11, 1.414e-11, 1.237e-11,
2373 1.093e-11, 9.558e-12
2374 };
2375
2376 static const double h2o260[2001] =
2377 { .2752, .2732, .2749, .2676, .2667, .2545,
2378 .2497, .2327, .2218, .2036, .1825, .1694, .1497, .1353, .121,
2379 .1014, .09405, .07848, .07195, .06246, .05306, .04853, .04138,
2380 .03735, .03171, .02785, .02431, .02111, .01845, .0164, .01405,
2381 .01255, .01098, .009797, .008646, .007779, .006898, .006099,
2382 .005453, .004909, .004413, .003959, .003581, .003199, .002871,
2383 .002583, .00233, .002086, .001874, .001684, .001512, .001361,
2384 .001225, .0011, 9.89e-4, 8.916e-4, 8.039e-4, 7.256e-4, 6.545e-4,
2385 5.918e-4, 5.359e-4, 4.867e-4, 4.426e-4, 4.033e-4, 3.682e-4,
2386 3.366e-4, 3.085e-4, 2.833e-4, 2.605e-4, 2.403e-4, 2.221e-4,
2387 2.055e-4, 1.908e-4, 1.774e-4, 1.653e-4, 1.544e-4, 1.443e-4,
2388 1.351e-4, 1.267e-4, 1.19e-4, 1.119e-4, 1.053e-4, 9.922e-5,
2389 9.355e-5, 8.831e-5, 8.339e-5, 7.878e-5, 7.449e-5, 7.043e-5,
2390 6.664e-5, 6.307e-5, 5.969e-5, 5.654e-5, 5.357e-5, 5.075e-5,
2391 4.81e-5, 4.56e-5, 4.322e-5, 4.102e-5, 3.892e-5, 3.696e-5,
2392 3.511e-5, 3.339e-5, 3.177e-5, 3.026e-5, 2.886e-5, 2.756e-5,
2393 2.636e-5, 2.527e-5, 2.427e-5, 2.337e-5, 2.257e-5, 2.185e-5,
2394 2.127e-5, 2.08e-5, 2.041e-5, 2.013e-5, 2e-5, 1.997e-5, 2.009e-5,
2395 2.031e-5, 2.068e-5, 2.124e-5, 2.189e-5, 2.267e-5, 2.364e-5,
2396 2.463e-5, 2.618e-5, 2.774e-5, 2.937e-5, 3.144e-5, 3.359e-5,
2397 3.695e-5, 4.002e-5, 4.374e-5, 4.947e-5, 5.431e-5, 6.281e-5,
2398 7.169e-5, 8.157e-5, 9.728e-5, 1.079e-4, 1.337e-4, 1.442e-4,
2399 1.683e-4, 1.879e-4, 2.223e-4, 2.425e-4, 2.838e-4, 3.143e-4,
2400 3.527e-4, 4.012e-4, 4.237e-4, 4.747e-4, 5.057e-4, 5.409e-4,
2401 5.734e-4, 5.944e-4, 6.077e-4, 6.175e-4, 6.238e-4, 6.226e-4,
2402 6.248e-4, 6.192e-4, 6.098e-4, 5.818e-4, 5.709e-4, 5.465e-4,
2403 5.043e-4, 4.699e-4, 4.294e-4, 3.984e-4, 3.672e-4, 3.152e-4,
2404 2.883e-4, 2.503e-4, 2.211e-4, 1.92e-4, 1.714e-4, 1.485e-4,
2405 1.358e-4, 1.156e-4, 1.021e-4, 8.887e-5, 7.842e-5, 7.12e-5,
2406 6.186e-5, 5.73e-5, 4.792e-5, 4.364e-5, 3.72e-5, 3.28e-5,
2407 2.946e-5, 2.591e-5, 2.261e-5, 2.048e-5, 1.813e-5, 1.63e-5,
2408 1.447e-5, 1.282e-5, 1.167e-5, 1.041e-5, 9.449e-6, 8.51e-6,
2409 7.596e-6, 6.961e-6, 6.272e-6, 5.728e-6, 5.198e-6, 4.667e-6,
2410 4.288e-6, 3.897e-6, 3.551e-6, 3.235e-6, 2.952e-6, 2.688e-6,
2411 2.449e-6, 2.241e-6, 2.05e-6, 1.879e-6, 1.722e-6, 1.582e-6,
2412 1.456e-6, 1.339e-6, 1.236e-6, 1.144e-6, 1.06e-6, 9.83e-7,
2413 9.149e-7, 8.535e-7, 7.973e-7, 7.466e-7, 6.999e-7, 6.574e-7,
2414 6.18e-7, 5.821e-7, 5.487e-7, 5.18e-7, 4.896e-7, 4.631e-7,
2415 4.386e-7, 4.16e-7, 3.945e-7, 3.748e-7, 3.562e-7, 3.385e-7,
2416 3.222e-7, 3.068e-7, 2.922e-7, 2.788e-7, 2.659e-7, 2.539e-7,
2417 2.425e-7, 2.318e-7, 2.219e-7, 2.127e-7, 2.039e-7, 1.958e-7,
2418 1.885e-7, 1.818e-7, 1.758e-7, 1.711e-7, 1.662e-7, 1.63e-7,
2419 1.605e-7, 1.58e-7, 1.559e-7, 1.545e-7, 1.532e-7, 1.522e-7,
2420 1.51e-7, 1.495e-7, 1.465e-7, 1.483e-7, 1.469e-7, 1.448e-7,
2421 1.444e-7, 1.436e-7, 1.426e-7, 1.431e-7, 1.425e-7, 1.445e-7,
2422 1.477e-7, 1.515e-7, 1.567e-7, 1.634e-7, 1.712e-7, 1.802e-7,
2423 1.914e-7, 2.024e-7, 2.159e-7, 2.295e-7, 2.461e-7, 2.621e-7,
2424 2.868e-7, 3.102e-7, 3.394e-7, 3.784e-7, 4.223e-7, 4.864e-7,
2425 5.501e-7, 6.039e-7, 7.193e-7, 7.728e-7, 9.514e-7, 1.073e-6,
2426 1.18e-6, 1.333e-6, 1.472e-6, 1.566e-6, 1.677e-6, 1.784e-6,
2427 1.904e-6, 1.953e-6, 2.02e-6, 2.074e-6, 2.128e-6, 2.162e-6,
2428 2.219e-6, 2.221e-6, 2.249e-6, 2.239e-6, 2.235e-6, 2.185e-6,
2429 2.141e-6, 2.124e-6, 2.09e-6, 2.068e-6, 2.1e-6, 2.104e-6,
2430 2.142e-6, 2.181e-6, 2.257e-6, 2.362e-6, 2.5e-6, 2.664e-6,
2431 2.884e-6, 3.189e-6, 3.48e-6, 3.847e-6, 4.313e-6, 4.79e-6,
2432 5.25e-6, 5.989e-6, 6.692e-6, 7.668e-6, 8.52e-6, 9.606e-6,
2433 1.073e-5, 1.225e-5, 1.377e-5, 1.582e-5, 1.761e-5, 2.029e-5,
2434 2.284e-5, 2.602e-5, 2.94e-5, 3.483e-5, 3.928e-5, 4.618e-5,
2435 5.24e-5, 6.132e-5, 7.183e-5, 8.521e-5, 9.111e-5, 1.07e-4,
2436 1.184e-4, 1.264e-4, 1.475e-4, 1.612e-4, 1.704e-4, 1.818e-4,
2437 1.924e-4, 1.994e-4, 2.061e-4, 2.18e-4, 2.187e-4, 2.2e-4,
2438 2.196e-4, 2.131e-4, 2.015e-4, 1.988e-4, 1.847e-4, 1.729e-4,
2439 1.597e-4, 1.373e-4, 1.262e-4, 1.087e-4, 9.439e-5, 8.061e-5,
2440 7.093e-5, 6.049e-5, 5.12e-5, 4.435e-5, 3.817e-5, 3.34e-5,
2441 2.927e-5, 2.573e-5, 2.291e-5, 2.04e-5, 1.827e-5, 1.636e-5,
2442 1.463e-5, 1.309e-5, 1.17e-5, 1.047e-5, 9.315e-6, 8.328e-6,
2443 7.458e-6, 6.665e-6, 5.94e-6, 5.316e-6, 4.752e-6, 4.252e-6,
2444 3.825e-6, 3.421e-6, 3.064e-6, 2.746e-6, 2.465e-6, 2.216e-6,
2445 1.99e-6, 1.79e-6, 1.609e-6, 1.449e-6, 1.306e-6, 1.177e-6,
2446 1.063e-6, 9.607e-7, 8.672e-7, 7.855e-7, 7.118e-7, 6.46e-7,
2447 5.871e-7, 5.34e-7, 4.868e-7, 4.447e-7, 4.068e-7, 3.729e-7,
2448 3.423e-7, 3.151e-7, 2.905e-7, 2.686e-7, 2.484e-7, 2.306e-7,
2449 2.142e-7, 1.995e-7, 1.86e-7, 1.738e-7, 1.626e-7, 1.522e-7,
2450 1.427e-7, 1.338e-7, 1.258e-7, 1.183e-7, 1.116e-7, 1.056e-7,
2451 9.972e-8, 9.46e-8, 9.007e-8, 8.592e-8, 8.195e-8, 7.816e-8,
2452 7.483e-8, 7.193e-8, 6.892e-8, 6.642e-8, 6.386e-8, 6.154e-8,
2453 5.949e-8, 5.764e-8, 5.622e-8, 5.479e-8, 5.364e-8, 5.301e-8,
2454 5.267e-8, 5.263e-8, 5.313e-8, 5.41e-8, 5.55e-8, 5.745e-8,
2455 6.003e-8, 6.311e-8, 6.713e-8, 7.173e-8, 7.724e-8, 8.368e-8,
2456 9.121e-8, 9.986e-8, 1.097e-7, 1.209e-7, 1.338e-7, 1.486e-7,
2457 1.651e-7, 1.837e-7, 2.048e-7, 2.289e-7, 2.557e-7, 2.857e-7,
2458 3.195e-7, 3.587e-7, 4.015e-7, 4.497e-7, 5.049e-7, 5.665e-7,
2459 6.366e-7, 7.121e-7, 7.996e-7, 8.946e-7, 1.002e-6, 1.117e-6,
2460 1.262e-6, 1.416e-6, 1.611e-6, 1.807e-6, 2.056e-6, 2.351e-6,
2461 2.769e-6, 3.138e-6, 3.699e-6, 4.386e-6, 5.041e-6, 6.074e-6,
2462 6.812e-6, 7.79e-6, 8.855e-6, 1.014e-5, 1.095e-5, 1.245e-5,
2463 1.316e-5, 1.39e-5, 1.504e-5, 1.583e-5, 1.617e-5, 1.652e-5,
2464 1.713e-5, 1.724e-5, 1.715e-5, 1.668e-5, 1.629e-5, 1.552e-5,
2465 1.478e-5, 1.34e-5, 1.245e-5, 1.121e-5, 9.575e-6, 8.956e-6,
2466 7.345e-6, 6.597e-6, 5.612e-6, 4.818e-6, 4.165e-6, 3.579e-6,
2467 3.041e-6, 2.623e-6, 2.29e-6, 1.984e-6, 1.748e-6, 1.534e-6,
2468 1.369e-6, 1.219e-6, 1.092e-6, 9.8e-7, 8.762e-7, 7.896e-7,
2469 7.104e-7, 6.364e-7, 5.691e-7, 5.107e-7, 4.575e-7, 4.09e-7,
2470 3.667e-7, 3.287e-7, 2.931e-7, 2.633e-7, 2.356e-7, 2.111e-7,
2471 1.895e-7, 1.697e-7, 1.525e-7, 1.369e-7, 1.233e-7, 1.114e-7,
2472 9.988e-8, 9.004e-8, 8.149e-8, 7.352e-8, 6.662e-8, 6.03e-8,
2473 5.479e-8, 4.974e-8, 4.532e-8, 4.129e-8, 3.781e-8, 3.462e-8,
2474 3.176e-8, 2.919e-8, 2.687e-8, 2.481e-8, 2.292e-8, 2.119e-8,
2475 1.967e-8, 1.828e-8, 1.706e-8, 1.589e-8, 1.487e-8, 1.393e-8,
2476 1.307e-8, 1.228e-8, 1.156e-8, 1.089e-8, 1.028e-8, 9.696e-9,
2477 9.159e-9, 8.658e-9, 8.187e-9, 7.746e-9, 7.34e-9, 6.953e-9,
2478 6.594e-9, 6.259e-9, 5.948e-9, 5.66e-9, 5.386e-9, 5.135e-9,
2479 4.903e-9, 4.703e-9, 4.515e-9, 4.362e-9, 4.233e-9, 4.117e-9,
2480 4.017e-9, 3.962e-9, 3.924e-9, 3.905e-9, 3.922e-9, 3.967e-9,
2481 4.046e-9, 4.165e-9, 4.32e-9, 4.522e-9, 4.769e-9, 5.083e-9,
2482 5.443e-9, 5.872e-9, 6.366e-9, 6.949e-9, 7.601e-9, 8.371e-9,
2483 9.22e-9, 1.02e-8, 1.129e-8, 1.251e-8, 1.393e-8, 1.542e-8,
2484 1.72e-8, 1.926e-8, 2.152e-8, 2.392e-8, 2.678e-8, 3.028e-8,
2485 3.39e-8, 3.836e-8, 4.309e-8, 4.9e-8, 5.481e-8, 6.252e-8,
2486 7.039e-8, 7.883e-8, 8.849e-8, 1.012e-7, 1.142e-7, 1.3e-7,
2487 1.475e-7, 1.732e-7, 1.978e-7, 2.304e-7, 2.631e-7, 2.988e-7,
2488 3.392e-7, 3.69e-7, 4.355e-7, 4.672e-7, 5.11e-7, 5.461e-7,
2489 5.828e-7, 6.233e-7, 6.509e-7, 6.672e-7, 6.969e-7, 7.104e-7,
2490 7.439e-7, 7.463e-7, 7.708e-7, 7.466e-7, 7.668e-7, 7.549e-7,
2491 7.586e-7, 7.384e-7, 7.439e-7, 7.785e-7, 7.915e-7, 8.31e-7,
2492 8.745e-7, 9.558e-7, 1.038e-6, 1.173e-6, 1.304e-6, 1.452e-6,
2493 1.671e-6, 1.931e-6, 2.239e-6, 2.578e-6, 3.032e-6, 3.334e-6,
2494 3.98e-6, 4.3e-6, 4.518e-6, 5.321e-6, 5.508e-6, 6.211e-6, 6.59e-6,
2495 7.046e-6, 7.555e-6, 7.558e-6, 7.875e-6, 8.319e-6, 8.433e-6,
2496 8.59e-6, 8.503e-6, 8.304e-6, 8.336e-6, 7.739e-6, 7.301e-6,
2497 6.827e-6, 6.078e-6, 5.551e-6, 4.762e-6, 4.224e-6, 3.538e-6,
2498 2.984e-6, 2.619e-6, 2.227e-6, 1.923e-6, 1.669e-6, 1.462e-6,
2499 1.294e-6, 1.155e-6, 1.033e-6, 9.231e-7, 8.238e-7, 7.36e-7,
2500 6.564e-7, 5.869e-7, 5.236e-7, 4.673e-7, 4.174e-7, 3.736e-7,
2501 3.33e-7, 2.976e-7, 2.657e-7, 2.367e-7, 2.106e-7, 1.877e-7,
2502 1.671e-7, 1.494e-7, 1.332e-7, 1.192e-7, 1.065e-7, 9.558e-8,
2503 8.586e-8, 7.717e-8, 6.958e-8, 6.278e-8, 5.666e-8, 5.121e-8,
2504 4.647e-8, 4.213e-8, 3.815e-8, 3.459e-8, 3.146e-8, 2.862e-8,
2505 2.604e-8, 2.375e-8, 2.162e-8, 1.981e-8, 1.817e-8, 1.67e-8,
2506 1.537e-8, 1.417e-8, 1.31e-8, 1.215e-8, 1.128e-8, 1.05e-8,
2507 9.793e-9, 9.158e-9, 8.586e-9, 8.068e-9, 7.595e-9, 7.166e-9,
2508 6.778e-9, 6.427e-9, 6.108e-9, 5.826e-9, 5.571e-9, 5.347e-9,
2509 5.144e-9, 4.968e-9, 4.822e-9, 4.692e-9, 4.589e-9, 4.506e-9,
2510 4.467e-9, 4.44e-9, 4.466e-9, 4.515e-9, 4.718e-9, 4.729e-9,
2511 4.937e-9, 5.249e-9, 5.466e-9, 5.713e-9, 6.03e-9, 6.436e-9,
2512 6.741e-9, 7.33e-9, 7.787e-9, 8.414e-9, 8.908e-9, 9.868e-9,
2513 1.069e-8, 1.158e-8, 1.253e-8, 1.3e-8, 1.409e-8, 1.47e-8,
2514 1.548e-8, 1.612e-8, 1.666e-8, 1.736e-8, 1.763e-8, 1.812e-8,
2515 1.852e-8, 1.923e-8, 1.897e-8, 1.893e-8, 1.888e-8, 1.868e-8,
2516 1.895e-8, 1.899e-8, 1.876e-8, 1.96e-8, 2.02e-8, 2.121e-8,
2517 2.239e-8, 2.379e-8, 2.526e-8, 2.766e-8, 2.994e-8, 3.332e-8,
2518 3.703e-8, 4.158e-8, 4.774e-8, 5.499e-8, 6.355e-8, 7.349e-8,
2519 8.414e-8, 9.846e-8, 1.143e-7, 1.307e-7, 1.562e-7, 1.817e-7,
2520 2.011e-7, 2.192e-7, 2.485e-7, 2.867e-7, 3.035e-7, 3.223e-7,
2521 3.443e-7, 3.617e-7, 3.793e-7, 3.793e-7, 3.839e-7, 4.081e-7,
2522 4.117e-7, 4.085e-7, 3.92e-7, 3.851e-7, 3.754e-7, 3.49e-7,
2523 3.229e-7, 2.978e-7, 2.691e-7, 2.312e-7, 2.029e-7, 1.721e-7,
2524 1.472e-7, 1.308e-7, 1.132e-7, 9.736e-8, 8.458e-8, 7.402e-8,
2525 6.534e-8, 5.811e-8, 5.235e-8, 4.762e-8, 4.293e-8, 3.896e-8,
2526 3.526e-8, 3.165e-8, 2.833e-8, 2.551e-8, 2.288e-8, 2.036e-8,
2527 1.82e-8, 1.626e-8, 1.438e-8, 1.299e-8, 1.149e-8, 1.03e-8,
2528 9.148e-9, 8.122e-9, 7.264e-9, 6.425e-9, 5.777e-9, 5.06e-9,
2529 4.502e-9, 4.013e-9, 3.567e-9, 3.145e-9, 2.864e-9, 2.553e-9,
2530 2.311e-9, 2.087e-9, 1.886e-9, 1.716e-9, 1.556e-9, 1.432e-9,
2531 1.311e-9, 1.202e-9, 1.104e-9, 1.013e-9, 9.293e-10, 8.493e-10,
2532 7.79e-10, 7.185e-10, 6.642e-10, 6.141e-10, 5.684e-10, 5.346e-10,
2533 5.032e-10, 4.725e-10, 4.439e-10, 4.176e-10, 3.93e-10, 3.714e-10,
2534 3.515e-10, 3.332e-10, 3.167e-10, 3.02e-10, 2.887e-10, 2.769e-10,
2535 2.665e-10, 2.578e-10, 2.503e-10, 2.436e-10, 2.377e-10, 2.342e-10,
2536 2.305e-10, 2.296e-10, 2.278e-10, 2.321e-10, 2.355e-10, 2.402e-10,
2537 2.478e-10, 2.67e-10, 2.848e-10, 2.982e-10, 3.263e-10, 3.438e-10,
2538 3.649e-10, 3.829e-10, 4.115e-10, 4.264e-10, 4.473e-10, 4.63e-10,
2539 4.808e-10, 4.995e-10, 5.142e-10, 5.313e-10, 5.318e-10, 5.358e-10,
2540 5.452e-10, 5.507e-10, 5.698e-10, 5.782e-10, 5.983e-10, 6.164e-10,
2541 6.532e-10, 6.811e-10, 7.624e-10, 8.302e-10, 9.067e-10, 9.937e-10,
2542 1.104e-9, 1.221e-9, 1.361e-9, 1.516e-9, 1.675e-9, 1.883e-9,
2543 2.101e-9, 2.349e-9, 2.614e-9, 2.92e-9, 3.305e-9, 3.724e-9,
2544 4.142e-9, 4.887e-9, 5.614e-9, 6.506e-9, 7.463e-9, 8.817e-9,
2545 9.849e-9, 1.187e-8, 1.321e-8, 1.474e-8, 1.698e-8, 1.794e-8,
2546 2.09e-8, 2.211e-8, 2.362e-8, 2.556e-8, 2.729e-8, 2.88e-8,
2547 3.046e-8, 3.167e-8, 3.367e-8, 3.457e-8, 3.59e-8, 3.711e-8,
2548 3.826e-8, 4.001e-8, 4.211e-8, 4.315e-8, 4.661e-8, 5.01e-8,
2549 5.249e-8, 5.84e-8, 6.628e-8, 7.512e-8, 8.253e-8, 9.722e-8,
2550 1.067e-7, 1.153e-7, 1.347e-7, 1.428e-7, 1.577e-7, 1.694e-7,
2551 1.833e-7, 1.938e-7, 2.108e-7, 2.059e-7, 2.157e-7, 2.185e-7,
2552 2.208e-7, 2.182e-7, 2.093e-7, 2.014e-7, 1.962e-7, 1.819e-7,
2553 1.713e-7, 1.51e-7, 1.34e-7, 1.154e-7, 9.89e-8, 8.88e-8, 7.673e-8,
2554 6.599e-8, 5.73e-8, 5.081e-8, 4.567e-8, 4.147e-8, 3.773e-8,
2555 3.46e-8, 3.194e-8, 2.953e-8, 2.759e-8, 2.594e-8, 2.442e-8,
2556 2.355e-8, 2.283e-8, 2.279e-8, 2.231e-8, 2.279e-8, 2.239e-8,
2557 2.21e-8, 2.309e-8, 2.293e-8, 2.352e-8, 2.415e-8, 2.43e-8,
2558 2.426e-8, 2.465e-8, 2.5e-8, 2.496e-8, 2.465e-8, 2.445e-8,
2559 2.383e-8, 2.299e-8, 2.165e-8, 2.113e-8, 1.968e-8, 1.819e-8,
2560 1.644e-8, 1.427e-8, 1.27e-8, 1.082e-8, 9.428e-9, 8.091e-9,
2561 6.958e-9, 5.988e-9, 5.246e-9, 4.601e-9, 4.098e-9, 3.664e-9,
2562 3.287e-9, 2.942e-9, 2.656e-9, 2.364e-9, 2.118e-9, 1.903e-9,
2563 1.703e-9, 1.525e-9, 1.365e-9, 1.229e-9, 1.107e-9, 9.96e-10,
2564 8.945e-10, 8.08e-10, 7.308e-10, 6.616e-10, 5.994e-10, 5.422e-10,
2565 4.929e-10, 4.478e-10, 4.07e-10, 3.707e-10, 3.379e-10, 3.087e-10,
2566 2.823e-10, 2.592e-10, 2.385e-10, 2.201e-10, 2.038e-10, 1.897e-10,
2567 1.774e-10, 1.667e-10, 1.577e-10, 1.502e-10, 1.437e-10, 1.394e-10,
2568 1.358e-10, 1.324e-10, 1.329e-10, 1.324e-10, 1.36e-10, 1.39e-10,
2569 1.424e-10, 1.544e-10, 1.651e-10, 1.817e-10, 1.984e-10, 2.195e-10,
2570 2.438e-10, 2.7e-10, 2.991e-10, 3.322e-10, 3.632e-10, 3.957e-10,
2571 4.36e-10, 4.701e-10, 5.03e-10, 5.381e-10, 5.793e-10, 6.19e-10,
2572 6.596e-10, 7.004e-10, 7.561e-10, 7.934e-10, 8.552e-10, 9.142e-10,
2573 9.57e-10, 1.027e-9, 1.097e-9, 1.193e-9, 1.334e-9, 1.47e-9,
2574 1.636e-9, 1.871e-9, 2.122e-9, 2.519e-9, 2.806e-9, 3.203e-9,
2575 3.846e-9, 4.362e-9, 5.114e-9, 5.643e-9, 6.305e-9, 6.981e-9,
2576 7.983e-9, 8.783e-9, 9.419e-9, 1.017e-8, 1.063e-8, 1.121e-8,
2577 1.13e-8, 1.201e-8, 1.225e-8, 1.232e-8, 1.223e-8, 1.177e-8,
2578 1.151e-8, 1.116e-8, 1.047e-8, 9.698e-9, 8.734e-9, 8.202e-9,
2579 7.041e-9, 6.074e-9, 5.172e-9, 4.468e-9, 3.913e-9, 3.414e-9,
2580 2.975e-9, 2.65e-9, 2.406e-9, 2.173e-9, 2.009e-9, 1.861e-9,
2581 1.727e-9, 1.612e-9, 1.514e-9, 1.43e-9, 1.362e-9, 1.333e-9,
2582 1.288e-9, 1.249e-9, 1.238e-9, 1.228e-9, 1.217e-9, 1.202e-9,
2583 1.209e-9, 1.177e-9, 1.157e-9, 1.165e-9, 1.142e-9, 1.131e-9,
2584 1.138e-9, 1.117e-9, 1.1e-9, 1.069e-9, 1.023e-9, 1.005e-9,
2585 9.159e-10, 8.863e-10, 7.865e-10, 7.153e-10, 6.247e-10, 5.846e-10,
2586 5.133e-10, 4.36e-10, 3.789e-10, 3.335e-10, 2.833e-10, 2.483e-10,
2587 2.155e-10, 1.918e-10, 1.709e-10, 1.529e-10, 1.374e-10, 1.235e-10,
2588 1.108e-10, 9.933e-11, 8.932e-11, 8.022e-11, 7.224e-11, 6.52e-11,
2589 5.896e-11, 5.328e-11, 4.813e-11, 4.365e-11, 3.961e-11, 3.594e-11,
2590 3.266e-11, 2.967e-11, 2.701e-11, 2.464e-11, 2.248e-11, 2.054e-11,
2591 1.878e-11, 1.721e-11, 1.579e-11, 1.453e-11, 1.341e-11, 1.241e-11,
2592 1.154e-11, 1.078e-11, 1.014e-11, 9.601e-12, 9.167e-12, 8.838e-12,
2593 8.614e-12, 8.493e-12, 8.481e-12, 8.581e-12, 8.795e-12, 9.131e-12,
2594 9.601e-12, 1.021e-11, 1.097e-11, 1.191e-11, 1.303e-11, 1.439e-11,
2595 1.601e-11, 1.778e-11, 1.984e-11, 2.234e-11, 2.474e-11, 2.766e-11,
2596 3.085e-11, 3.415e-11, 3.821e-11, 4.261e-11, 4.748e-11, 5.323e-11,
2597 5.935e-11, 6.619e-11, 7.418e-11, 8.294e-11, 9.26e-11, 1.039e-10,
2598 1.156e-10, 1.297e-10, 1.46e-10, 1.641e-10, 1.858e-10, 2.1e-10,
2599 2.383e-10, 2.724e-10, 3.116e-10, 3.538e-10, 4.173e-10, 4.727e-10,
2600 5.503e-10, 6.337e-10, 7.32e-10, 8.298e-10, 9.328e-10, 1.059e-9,
2601 1.176e-9, 1.328e-9, 1.445e-9, 1.593e-9, 1.77e-9, 1.954e-9,
2602 2.175e-9, 2.405e-9, 2.622e-9, 2.906e-9, 3.294e-9, 3.713e-9,
2603 3.98e-9, 4.384e-9, 4.987e-9, 5.311e-9, 5.874e-9, 6.337e-9,
2604 7.027e-9, 7.39e-9, 7.769e-9, 8.374e-9, 8.605e-9, 9.165e-9,
2605 9.415e-9, 9.511e-9, 9.704e-9, 9.588e-9, 9.45e-9, 9.086e-9,
2606 8.798e-9, 8.469e-9, 7.697e-9, 7.168e-9, 6.255e-9, 5.772e-9,
2607 4.97e-9, 4.271e-9, 3.653e-9, 3.154e-9, 2.742e-9, 2.435e-9,
2608 2.166e-9, 1.936e-9, 1.731e-9, 1.556e-9, 1.399e-9, 1.272e-9,
2609 1.157e-9, 1.066e-9, 9.844e-10, 9.258e-10, 8.787e-10, 8.421e-10,
2610 8.083e-10, 8.046e-10, 8.067e-10, 8.181e-10, 8.325e-10, 8.517e-10,
2611 9.151e-10, 9.351e-10, 9.677e-10, 1.071e-9, 1.126e-9, 1.219e-9,
2612 1.297e-9, 1.408e-9, 1.476e-9, 1.517e-9, 1.6e-9, 1.649e-9,
2613 1.678e-9, 1.746e-9, 1.742e-9, 1.728e-9, 1.699e-9, 1.655e-9,
2614 1.561e-9, 1.48e-9, 1.451e-9, 1.411e-9, 1.171e-9, 1.106e-9,
2615 9.714e-10, 8.523e-10, 7.346e-10, 6.241e-10, 5.371e-10, 4.704e-10,
2616 4.144e-10, 3.683e-10, 3.292e-10, 2.942e-10, 2.62e-10, 2.341e-10,
2617 2.104e-10, 1.884e-10, 1.7e-10, 1.546e-10, 1.394e-10, 1.265e-10,
2618 1.14e-10, 1.019e-10, 9.279e-11, 8.283e-11, 7.458e-11, 6.668e-11,
2619 5.976e-11, 5.33e-11, 4.794e-11, 4.289e-11, 3.841e-11, 3.467e-11,
2620 3.13e-11, 2.832e-11, 2.582e-11, 2.356e-11, 2.152e-11, 1.97e-11,
2621 1.808e-11, 1.664e-11, 1.539e-11, 1.434e-11, 1.344e-11, 1.269e-11,
2622 1.209e-11, 1.162e-11, 1.129e-11, 1.108e-11, 1.099e-11, 1.103e-11,
2623 1.119e-11, 1.148e-11, 1.193e-11, 1.252e-11, 1.329e-11, 1.421e-11,
2624 1.555e-11, 1.685e-11, 1.839e-11, 2.054e-11, 2.317e-11, 2.571e-11,
2625 2.839e-11, 3.171e-11, 3.49e-11, 3.886e-11, 4.287e-11, 4.645e-11,
2626 5.047e-11, 5.592e-11, 6.109e-11, 6.628e-11, 7.381e-11, 8.088e-11,
2627 8.966e-11, 1.045e-10, 1.12e-10, 1.287e-10, 1.486e-10, 1.662e-10,
2628 1.866e-10, 2.133e-10, 2.524e-10, 2.776e-10, 3.204e-10, 3.559e-10,
2629 4.028e-10, 4.448e-10, 4.882e-10, 5.244e-10, 5.605e-10, 6.018e-10,
2630 6.328e-10, 6.579e-10, 6.541e-10, 7.024e-10, 7.074e-10, 7.068e-10,
2631 7.009e-10, 6.698e-10, 6.545e-10, 6.209e-10, 5.834e-10, 5.412e-10,
2632 5.001e-10, 4.231e-10, 3.727e-10, 3.211e-10, 2.833e-10, 2.447e-10,
2633 2.097e-10, 1.843e-10, 1.639e-10, 1.449e-10, 1.27e-10, 1.161e-10,
2634 1.033e-10, 9.282e-11, 8.407e-11, 7.639e-11, 7.023e-11, 6.474e-11,
2635 6.142e-11, 5.76e-11, 5.568e-11, 5.472e-11, 5.39e-11, 5.455e-11,
2636 5.54e-11, 5.587e-11, 6.23e-11, 6.49e-11, 6.868e-11, 7.382e-11,
2637 8.022e-11, 8.372e-11, 9.243e-11, 1.004e-10, 1.062e-10, 1.13e-10,
2638 1.176e-10, 1.244e-10, 1.279e-10, 1.298e-10, 1.302e-10, 1.312e-10,
2639 1.295e-10, 1.244e-10, 1.211e-10, 1.167e-10, 1.098e-10, 9.927e-11,
2640 8.854e-11, 8.011e-11, 7.182e-11, 5.923e-11, 5.212e-11, 4.453e-11,
2641 3.832e-11, 3.371e-11, 2.987e-11, 2.651e-11, 2.354e-11, 2.093e-11,
2642 1.863e-11, 1.662e-11, 1.486e-11, 1.331e-11, 1.193e-11, 1.071e-11,
2643 9.628e-12, 8.66e-12, 7.801e-12, 7.031e-12, 6.347e-12, 5.733e-12,
2644 5.182e-12, 4.695e-12, 4.26e-12, 3.874e-12, 3.533e-12, 3.235e-12,
2645 2.979e-12, 2.76e-12, 2.579e-12, 2.432e-12, 2.321e-12, 2.246e-12,
2646 2.205e-12, 2.196e-12, 2.223e-12, 2.288e-12, 2.387e-12, 2.525e-12,
2647 2.704e-12, 2.925e-12, 3.191e-12, 3.508e-12, 3.876e-12, 4.303e-12,
2648 4.793e-12, 5.347e-12, 5.978e-12, 6.682e-12, 7.467e-12, 8.34e-12,
2649 9.293e-12, 1.035e-11, 1.152e-11, 1.285e-11, 1.428e-11, 1.586e-11,
2650 1.764e-11, 1.972e-11, 2.214e-11, 2.478e-11, 2.776e-11, 3.151e-11,
2651 3.591e-11, 4.103e-11, 4.66e-11, 5.395e-11, 6.306e-11, 7.172e-11,
2652 8.358e-11, 9.67e-11, 1.11e-10, 1.325e-10, 1.494e-10, 1.736e-10,
2653 2.007e-10, 2.296e-10, 2.608e-10, 3.004e-10, 3.361e-10, 3.727e-10,
2654 4.373e-10, 4.838e-10, 5.483e-10, 6.006e-10, 6.535e-10, 6.899e-10,
2655 7.687e-10, 8.444e-10, 8.798e-10, 9.135e-10, 9.532e-10, 9.757e-10,
2656 9.968e-10, 1.006e-9, 9.949e-10, 9.789e-10, 9.564e-10, 9.215e-10,
2657 8.51e-10, 8.394e-10, 7.707e-10, 7.152e-10, 6.274e-10, 5.598e-10,
2658 5.028e-10, 4.3e-10, 3.71e-10, 3.245e-10, 2.809e-10, 2.461e-10,
2659 2.154e-10, 1.91e-10, 1.685e-10, 1.487e-10, 1.313e-10, 1.163e-10,
2660 1.031e-10, 9.172e-11, 8.221e-11, 7.382e-11, 6.693e-11, 6.079e-11,
2661 5.581e-11, 5.167e-11, 4.811e-11, 4.506e-11, 4.255e-11, 4.083e-11,
2662 3.949e-11, 3.881e-11, 3.861e-11, 3.858e-11, 3.951e-11, 4.045e-11,
2663 4.24e-11, 4.487e-11, 4.806e-11, 5.133e-11, 5.518e-11, 5.919e-11,
2664 6.533e-11, 7.031e-11, 7.762e-11, 8.305e-11, 9.252e-11, 9.727e-11,
2665 1.045e-10, 1.117e-10, 1.2e-10, 1.275e-10, 1.341e-10, 1.362e-10,
2666 1.438e-10, 1.45e-10, 1.455e-10, 1.455e-10, 1.434e-10, 1.381e-10,
2667 1.301e-10, 1.276e-10, 1.163e-10, 1.089e-10, 9.911e-11, 8.943e-11,
2668 7.618e-11, 6.424e-11, 5.717e-11, 4.866e-11, 4.257e-11, 3.773e-11,
2669 3.331e-11, 2.958e-11, 2.629e-11, 2.316e-11, 2.073e-11, 1.841e-11,
2670 1.635e-11, 1.464e-11, 1.31e-11, 1.16e-11, 1.047e-11, 9.408e-12,
2671 8.414e-12, 7.521e-12, 6.705e-12, 5.993e-12, 5.371e-12, 4.815e-12,
2672 4.338e-12, 3.921e-12, 3.567e-12, 3.265e-12, 3.01e-12, 2.795e-12,
2673 2.613e-12, 2.464e-12, 2.346e-12, 2.256e-12, 2.195e-12, 2.165e-12,
2674 2.166e-12, 2.198e-12, 2.262e-12, 2.364e-12, 2.502e-12, 2.682e-12,
2675 2.908e-12, 3.187e-12, 3.533e-12, 3.946e-12, 4.418e-12, 5.013e-12,
2676 5.708e-12, 6.379e-12, 7.43e-12, 8.39e-12, 9.51e-12, 1.078e-11,
2677 1.259e-11, 1.438e-11, 1.63e-11, 1.814e-11, 2.055e-11, 2.348e-11,
2678 2.664e-11, 2.956e-11, 3.3e-11, 3.677e-11, 4.032e-11, 4.494e-11,
2679 4.951e-11, 5.452e-11, 6.014e-11, 6.5e-11, 6.915e-11, 7.45e-11,
2680 7.971e-11, 8.468e-11, 8.726e-11, 8.995e-11, 9.182e-11, 9.509e-11,
2681 9.333e-11, 9.386e-11, 9.457e-11, 9.21e-11, 9.019e-11, 8.68e-11,
2682 8.298e-11, 7.947e-11, 7.46e-11, 7.082e-11, 6.132e-11, 5.855e-11,
2683 5.073e-11, 4.464e-11, 3.825e-11, 3.375e-11, 2.911e-11, 2.535e-11,
2684 2.16e-11, 1.907e-11, 1.665e-11, 1.463e-11, 1.291e-11, 1.133e-11,
2685 9.997e-12, 8.836e-12, 7.839e-12, 6.943e-12, 6.254e-12, 5.6e-12,
2686 5.029e-12, 4.529e-12, 4.102e-12, 3.737e-12, 3.428e-12, 3.169e-12,
2687 2.959e-12, 2.798e-12, 2.675e-12, 2.582e-12, 2.644e-12, 2.557e-12,
2688 2.614e-12, 2.717e-12, 2.874e-12, 3.056e-12, 3.187e-12, 3.631e-12,
2689 3.979e-12, 4.248e-12, 4.817e-12, 5.266e-12, 5.836e-12, 6.365e-12,
2690 6.807e-12, 7.47e-12, 7.951e-12, 8.636e-12, 8.972e-12, 9.314e-12,
2691 9.445e-12, 1.003e-11, 1.013e-11, 9.937e-12, 9.729e-12, 9.064e-12,
2692 9.119e-12, 9.124e-12, 8.704e-12, 8.078e-12, 7.47e-12, 6.329e-12,
2693 5.674e-12, 4.808e-12, 4.119e-12, 3.554e-12, 3.103e-12, 2.731e-12,
2694 2.415e-12, 2.15e-12, 1.926e-12, 1.737e-12, 1.578e-12, 1.447e-12,
2695 1.34e-12, 1.255e-12, 1.191e-12, 1.146e-12, 1.121e-12, 1.114e-12,
2696 1.126e-12, 1.156e-12, 1.207e-12, 1.278e-12, 1.372e-12, 1.49e-12,
2697 1.633e-12, 1.805e-12, 2.01e-12, 2.249e-12, 2.528e-12, 2.852e-12,
2698 3.228e-12, 3.658e-12, 4.153e-12, 4.728e-12, 5.394e-12, 6.176e-12,
2699 7.126e-12, 8.188e-12, 9.328e-12, 1.103e-11, 1.276e-11, 1.417e-11,
2700 1.615e-11, 1.84e-11, 2.155e-11, 2.429e-11, 2.826e-11, 3.222e-11,
2701 3.664e-11, 4.14e-11, 4.906e-11, 5.536e-11, 6.327e-11, 7.088e-11,
2702 8.316e-11, 9.242e-11, 1.07e-10, 1.223e-10, 1.341e-10, 1.553e-10,
2703 1.703e-10, 1.9e-10, 2.022e-10, 2.233e-10, 2.345e-10, 2.438e-10,
2704 2.546e-10, 2.599e-10, 2.661e-10, 2.703e-10, 2.686e-10, 2.662e-10,
2705 2.56e-10, 2.552e-10, 2.378e-10, 2.252e-10, 2.146e-10, 1.885e-10,
2706 1.668e-10, 1.441e-10, 1.295e-10, 1.119e-10, 9.893e-11, 8.687e-11,
2707 7.678e-11, 6.685e-11, 5.879e-11, 5.127e-11, 4.505e-11, 3.997e-11,
2708 3.511e-11
2709 };
2710
2711 static const double h2ofrn[2001] = { .01095, .01126, .01205, .01322, .0143,
2712 .01506, .01548, .01534, .01486, .01373, .01262, .01134, .01001,
2713 .008702, .007475, .006481, .00548, .0046, .003833, .00311,
2714 .002543, .002049, .00168, .001374, .001046, 8.193e-4, 6.267e-4,
2715 4.968e-4, 3.924e-4, 2.983e-4, 2.477e-4, 1.997e-4, 1.596e-4,
2716 1.331e-4, 1.061e-4, 8.942e-5, 7.168e-5, 5.887e-5, 4.848e-5,
2717 3.817e-5, 3.17e-5, 2.579e-5, 2.162e-5, 1.768e-5, 1.49e-5,
2718 1.231e-5, 1.013e-5, 8.555e-6, 7.328e-6, 6.148e-6, 5.207e-6,
2719 4.387e-6, 3.741e-6, 3.22e-6, 2.753e-6, 2.346e-6, 1.985e-6,
2720 1.716e-6, 1.475e-6, 1.286e-6, 1.122e-6, 9.661e-7, 8.284e-7,
2721 7.057e-7, 6.119e-7, 5.29e-7, 4.571e-7, 3.948e-7, 3.432e-7,
2722 2.983e-7, 2.589e-7, 2.265e-7, 1.976e-7, 1.704e-7, 1.456e-7,
2723 1.26e-7, 1.101e-7, 9.648e-8, 8.415e-8, 7.34e-8, 6.441e-8,
2724 5.643e-8, 4.94e-8, 4.276e-8, 3.703e-8, 3.227e-8, 2.825e-8,
2725 2.478e-8, 2.174e-8, 1.898e-8, 1.664e-8, 1.458e-8, 1.278e-8,
2726 1.126e-8, 9.891e-9, 8.709e-9, 7.652e-9, 6.759e-9, 5.975e-9,
2727 5.31e-9, 4.728e-9, 4.214e-9, 3.792e-9, 3.463e-9, 3.226e-9,
2728 2.992e-9, 2.813e-9, 2.749e-9, 2.809e-9, 2.913e-9, 3.037e-9,
2729 3.413e-9, 3.738e-9, 4.189e-9, 4.808e-9, 5.978e-9, 7.088e-9,
2730 8.071e-9, 9.61e-9, 1.21e-8, 1.5e-8, 1.764e-8, 2.221e-8, 2.898e-8,
2731 3.948e-8, 5.068e-8, 6.227e-8, 7.898e-8, 1.033e-7, 1.437e-7,
2732 1.889e-7, 2.589e-7, 3.59e-7, 4.971e-7, 7.156e-7, 9.983e-7,
2733 1.381e-6, 1.929e-6, 2.591e-6, 3.453e-6, 4.57e-6, 5.93e-6,
2734 7.552e-6, 9.556e-6, 1.183e-5, 1.425e-5, 1.681e-5, 1.978e-5,
2735 2.335e-5, 2.668e-5, 3.022e-5, 3.371e-5, 3.715e-5, 3.967e-5,
2736 4.06e-5, 4.01e-5, 3.809e-5, 3.491e-5, 3.155e-5, 2.848e-5,
2737 2.678e-5, 2.66e-5, 2.811e-5, 3.071e-5, 3.294e-5, 3.459e-5,
2738 3.569e-5, 3.56e-5, 3.434e-5, 3.186e-5, 2.916e-5, 2.622e-5,
2739 2.275e-5, 1.918e-5, 1.62e-5, 1.373e-5, 1.182e-5, 1.006e-5,
2740 8.556e-6, 7.26e-6, 6.107e-6, 5.034e-6, 4.211e-6, 3.426e-6,
2741 2.865e-6, 2.446e-6, 1.998e-6, 1.628e-6, 1.242e-6, 1.005e-6,
2742 7.853e-7, 6.21e-7, 5.071e-7, 4.156e-7, 3.548e-7, 2.825e-7,
2743 2.261e-7, 1.916e-7, 1.51e-7, 1.279e-7, 1.059e-7, 9.14e-8,
2744 7.707e-8, 6.17e-8, 5.311e-8, 4.263e-8, 3.518e-8, 2.961e-8,
2745 2.457e-8, 2.119e-8, 1.712e-8, 1.439e-8, 1.201e-8, 1.003e-8,
2746 8.564e-9, 7.199e-9, 6.184e-9, 5.206e-9, 4.376e-9, 3.708e-9,
2747 3.157e-9, 2.725e-9, 2.361e-9, 2.074e-9, 1.797e-9, 1.562e-9,
2748 1.364e-9, 1.196e-9, 1.042e-9, 8.862e-10, 7.648e-10, 6.544e-10,
2749 5.609e-10, 4.791e-10, 4.108e-10, 3.531e-10, 3.038e-10, 2.618e-10,
2750 2.268e-10, 1.969e-10, 1.715e-10, 1.496e-10, 1.308e-10, 1.147e-10,
2751 1.008e-10, 8.894e-11, 7.885e-11, 7.031e-11, 6.355e-11, 5.854e-11,
2752 5.534e-11, 5.466e-11, 5.725e-11, 6.447e-11, 7.943e-11, 1.038e-10,
2753 1.437e-10, 2.04e-10, 2.901e-10, 4.051e-10, 5.556e-10, 7.314e-10,
2754 9.291e-10, 1.134e-9, 1.321e-9, 1.482e-9, 1.596e-9, 1.669e-9,
2755 1.715e-9, 1.762e-9, 1.817e-9, 1.828e-9, 1.848e-9, 1.873e-9,
2756 1.902e-9, 1.894e-9, 1.864e-9, 1.841e-9, 1.797e-9, 1.704e-9,
2757 1.559e-9, 1.382e-9, 1.187e-9, 1.001e-9, 8.468e-10, 7.265e-10,
2758 6.521e-10, 6.381e-10, 6.66e-10, 7.637e-10, 9.705e-10, 1.368e-9,
2759 1.856e-9, 2.656e-9, 3.954e-9, 5.96e-9, 8.72e-9, 1.247e-8,
2760 1.781e-8, 2.491e-8, 3.311e-8, 4.272e-8, 5.205e-8, 6.268e-8,
2761 7.337e-8, 8.277e-8, 9.185e-8, 1.004e-7, 1.091e-7, 1.159e-7,
2762 1.188e-7, 1.175e-7, 1.124e-7, 1.033e-7, 9.381e-8, 8.501e-8,
2763 7.956e-8, 7.894e-8, 8.331e-8, 9.102e-8, 9.836e-8, 1.035e-7,
2764 1.064e-7, 1.06e-7, 1.032e-7, 9.808e-8, 9.139e-8, 8.442e-8,
2765 7.641e-8, 6.881e-8, 6.161e-8, 5.404e-8, 4.804e-8, 4.446e-8,
2766 4.328e-8, 4.259e-8, 4.421e-8, 4.673e-8, 4.985e-8, 5.335e-8,
2767 5.796e-8, 6.542e-8, 7.714e-8, 8.827e-8, 1.04e-7, 1.238e-7,
2768 1.499e-7, 1.829e-7, 2.222e-7, 2.689e-7, 3.303e-7, 3.981e-7,
2769 4.84e-7, 5.91e-7, 7.363e-7, 9.087e-7, 1.139e-6, 1.455e-6,
2770 1.866e-6, 2.44e-6, 3.115e-6, 3.941e-6, 4.891e-6, 5.992e-6,
2771 7.111e-6, 8.296e-6, 9.21e-6, 9.987e-6, 1.044e-5, 1.073e-5,
2772 1.092e-5, 1.106e-5, 1.138e-5, 1.171e-5, 1.186e-5, 1.186e-5,
2773 1.179e-5, 1.166e-5, 1.151e-5, 1.16e-5, 1.197e-5, 1.241e-5,
2774 1.268e-5, 1.26e-5, 1.184e-5, 1.063e-5, 9.204e-6, 7.584e-6,
2775 6.053e-6, 4.482e-6, 3.252e-6, 2.337e-6, 1.662e-6, 1.18e-6,
2776 8.15e-7, 5.95e-7, 4.354e-7, 3.302e-7, 2.494e-7, 1.93e-7,
2777 1.545e-7, 1.25e-7, 1.039e-7, 8.602e-8, 7.127e-8, 5.897e-8,
2778 4.838e-8, 4.018e-8, 3.28e-8, 2.72e-8, 2.307e-8, 1.972e-8,
2779 1.654e-8, 1.421e-8, 1.174e-8, 1.004e-8, 8.739e-9, 7.358e-9,
2780 6.242e-9, 5.303e-9, 4.567e-9, 3.94e-9, 3.375e-9, 2.864e-9,
2781 2.422e-9, 2.057e-9, 1.75e-9, 1.505e-9, 1.294e-9, 1.101e-9,
2782 9.401e-10, 8.018e-10, 6.903e-10, 5.965e-10, 5.087e-10, 4.364e-10,
2783 3.759e-10, 3.247e-10, 2.809e-10, 2.438e-10, 2.123e-10, 1.853e-10,
2784 1.622e-10, 1.426e-10, 1.26e-10, 1.125e-10, 1.022e-10, 9.582e-11,
2785 9.388e-11, 9.801e-11, 1.08e-10, 1.276e-10, 1.551e-10, 1.903e-10,
2786 2.291e-10, 2.724e-10, 3.117e-10, 3.4e-10, 3.562e-10, 3.625e-10,
2787 3.619e-10, 3.429e-10, 3.221e-10, 2.943e-10, 2.645e-10, 2.338e-10,
2788 2.062e-10, 1.901e-10, 1.814e-10, 1.827e-10, 1.906e-10, 1.984e-10,
2789 2.04e-10, 2.068e-10, 2.075e-10, 2.018e-10, 1.959e-10, 1.897e-10,
2790 1.852e-10, 1.791e-10, 1.696e-10, 1.634e-10, 1.598e-10, 1.561e-10,
2791 1.518e-10, 1.443e-10, 1.377e-10, 1.346e-10, 1.342e-10, 1.375e-10,
2792 1.525e-10, 1.767e-10, 2.108e-10, 2.524e-10, 2.981e-10, 3.477e-10,
2793 4.262e-10, 5.326e-10, 6.646e-10, 8.321e-10, 1.069e-9, 1.386e-9,
2794 1.743e-9, 2.216e-9, 2.808e-9, 3.585e-9, 4.552e-9, 5.907e-9,
2795 7.611e-9, 9.774e-9, 1.255e-8, 1.666e-8, 2.279e-8, 3.221e-8,
2796 4.531e-8, 6.4e-8, 9.187e-8, 1.295e-7, 1.825e-7, 2.431e-7,
2797 3.181e-7, 4.009e-7, 4.941e-7, 5.88e-7, 6.623e-7, 7.155e-7,
2798 7.451e-7, 7.594e-7, 7.541e-7, 7.467e-7, 7.527e-7, 7.935e-7,
2799 8.461e-7, 8.954e-7, 9.364e-7, 9.843e-7, 1.024e-6, 1.05e-6,
2800 1.059e-6, 1.074e-6, 1.072e-6, 1.043e-6, 9.789e-7, 8.803e-7,
2801 7.662e-7, 6.378e-7, 5.133e-7, 3.958e-7, 2.914e-7, 2.144e-7,
2802 1.57e-7, 1.14e-7, 8.47e-8, 6.2e-8, 4.657e-8, 3.559e-8, 2.813e-8,
2803 2.222e-8, 1.769e-8, 1.391e-8, 1.125e-8, 9.186e-9, 7.704e-9,
2804 6.447e-9, 5.381e-9, 4.442e-9, 3.669e-9, 3.057e-9, 2.564e-9,
2805 2.153e-9, 1.784e-9, 1.499e-9, 1.281e-9, 1.082e-9, 9.304e-10,
2806 8.169e-10, 6.856e-10, 5.866e-10, 5.043e-10, 4.336e-10, 3.731e-10,
2807 3.175e-10, 2.745e-10, 2.374e-10, 2.007e-10, 1.737e-10, 1.508e-10,
2808 1.302e-10, 1.13e-10, 9.672e-11, 8.375e-11, 7.265e-11, 6.244e-11,
2809 5.343e-11, 4.654e-11, 3.975e-11, 3.488e-11, 3.097e-11, 2.834e-11,
2810 2.649e-11, 2.519e-11, 2.462e-11, 2.443e-11, 2.44e-11, 2.398e-11,
2811 2.306e-11, 2.183e-11, 2.021e-11, 1.821e-11, 1.599e-11, 1.403e-11,
2812 1.196e-11, 1.023e-11, 8.728e-12, 7.606e-12, 6.941e-12, 6.545e-12,
2813 6.484e-12, 6.6e-12, 6.718e-12, 6.785e-12, 6.746e-12, 6.724e-12,
2814 6.764e-12, 6.995e-12, 7.144e-12, 7.32e-12, 7.33e-12, 7.208e-12,
2815 6.789e-12, 6.09e-12, 5.337e-12, 4.62e-12, 4.037e-12, 3.574e-12,
2816 3.311e-12, 3.346e-12, 3.566e-12, 3.836e-12, 4.076e-12, 4.351e-12,
2817 4.691e-12, 5.114e-12, 5.427e-12, 6.167e-12, 7.436e-12, 8.842e-12,
2818 1.038e-11, 1.249e-11, 1.54e-11, 1.915e-11, 2.48e-11, 3.256e-11,
2819 4.339e-11, 5.611e-11, 7.519e-11, 1.037e-10, 1.409e-10, 1.883e-10,
2820 2.503e-10, 3.38e-10, 4.468e-10, 5.801e-10, 7.335e-10, 8.98e-10,
2821 1.11e-9, 1.363e-9, 1.677e-9, 2.104e-9, 2.681e-9, 3.531e-9,
2822 4.621e-9, 6.106e-9, 8.154e-9, 1.046e-8, 1.312e-8, 1.607e-8,
2823 1.948e-8, 2.266e-8, 2.495e-8, 2.655e-8, 2.739e-8, 2.739e-8,
2824 2.662e-8, 2.589e-8, 2.59e-8, 2.664e-8, 2.833e-8, 3.023e-8,
2825 3.305e-8, 3.558e-8, 3.793e-8, 3.961e-8, 4.056e-8, 4.102e-8,
2826 4.025e-8, 3.917e-8, 3.706e-8, 3.493e-8, 3.249e-8, 3.096e-8,
2827 3.011e-8, 3.111e-8, 3.395e-8, 3.958e-8, 4.875e-8, 6.066e-8,
2828 7.915e-8, 1.011e-7, 1.3e-7, 1.622e-7, 2.003e-7, 2.448e-7,
2829 2.863e-7, 3.317e-7, 3.655e-7, 3.96e-7, 4.098e-7, 4.168e-7,
2830 4.198e-7, 4.207e-7, 4.289e-7, 4.384e-7, 4.471e-7, 4.524e-7,
2831 4.574e-7, 4.633e-7, 4.785e-7, 5.028e-7, 5.371e-7, 5.727e-7,
2832 5.955e-7, 5.998e-7, 5.669e-7, 5.082e-7, 4.397e-7, 3.596e-7,
2833 2.814e-7, 2.074e-7, 1.486e-7, 1.057e-7, 7.25e-8, 4.946e-8,
2834 3.43e-8, 2.447e-8, 1.793e-8, 1.375e-8, 1.096e-8, 9.091e-9,
2835 7.709e-9, 6.631e-9, 5.714e-9, 4.886e-9, 4.205e-9, 3.575e-9,
2836 3.07e-9, 2.631e-9, 2.284e-9, 2.002e-9, 1.745e-9, 1.509e-9,
2837 1.284e-9, 1.084e-9, 9.163e-10, 7.663e-10, 6.346e-10, 5.283e-10,
2838 4.354e-10, 3.59e-10, 2.982e-10, 2.455e-10, 2.033e-10, 1.696e-10,
2839 1.432e-10, 1.211e-10, 1.02e-10, 8.702e-11, 7.38e-11, 6.293e-11,
2840 5.343e-11, 4.532e-11, 3.907e-11, 3.365e-11, 2.945e-11, 2.558e-11,
2841 2.192e-11, 1.895e-11, 1.636e-11, 1.42e-11, 1.228e-11, 1.063e-11,
2842 9.348e-12, 8.2e-12, 7.231e-12, 6.43e-12, 5.702e-12, 5.052e-12,
2843 4.469e-12, 4e-12, 3.679e-12, 3.387e-12, 3.197e-12, 3.158e-12,
2844 3.327e-12, 3.675e-12, 4.292e-12, 5.437e-12, 7.197e-12, 1.008e-11,
2845 1.437e-11, 2.035e-11, 2.905e-11, 4.062e-11, 5.528e-11, 7.177e-11,
2846 9.064e-11, 1.109e-10, 1.297e-10, 1.473e-10, 1.652e-10, 1.851e-10,
2847 2.079e-10, 2.313e-10, 2.619e-10, 2.958e-10, 3.352e-10, 3.796e-10,
2848 4.295e-10, 4.923e-10, 5.49e-10, 5.998e-10, 6.388e-10, 6.645e-10,
2849 6.712e-10, 6.549e-10, 6.38e-10, 6.255e-10, 6.253e-10, 6.459e-10,
2850 6.977e-10, 7.59e-10, 8.242e-10, 8.92e-10, 9.403e-10, 9.701e-10,
2851 9.483e-10, 9.135e-10, 8.617e-10, 7.921e-10, 7.168e-10, 6.382e-10,
2852 5.677e-10, 5.045e-10, 4.572e-10, 4.312e-10, 4.145e-10, 4.192e-10,
2853 4.541e-10, 5.368e-10, 6.771e-10, 8.962e-10, 1.21e-9, 1.659e-9,
2854 2.33e-9, 3.249e-9, 4.495e-9, 5.923e-9, 7.642e-9, 9.607e-9,
2855 1.178e-8, 1.399e-8, 1.584e-8, 1.73e-8, 1.816e-8, 1.87e-8,
2856 1.868e-8, 1.87e-8, 1.884e-8, 1.99e-8, 2.15e-8, 2.258e-8,
2857 2.364e-8, 2.473e-8, 2.602e-8, 2.689e-8, 2.731e-8, 2.816e-8,
2858 2.859e-8, 2.839e-8, 2.703e-8, 2.451e-8, 2.149e-8, 1.787e-8,
2859 1.449e-8, 1.111e-8, 8.282e-9, 6.121e-9, 4.494e-9, 3.367e-9,
2860 2.487e-9, 1.885e-9, 1.503e-9, 1.249e-9, 1.074e-9, 9.427e-10,
2861 8.439e-10, 7.563e-10, 6.772e-10, 6.002e-10, 5.254e-10, 4.588e-10,
2862 3.977e-10, 3.449e-10, 3.003e-10, 2.624e-10, 2.335e-10, 2.04e-10,
2863 1.771e-10, 1.534e-10, 1.296e-10, 1.097e-10, 9.173e-11, 7.73e-11,
2864 6.547e-11, 5.191e-11, 4.198e-11, 3.361e-11, 2.732e-11, 2.244e-11,
2865 1.791e-11, 1.509e-11, 1.243e-11, 1.035e-11, 8.969e-12, 7.394e-12,
2866 6.323e-12, 5.282e-12, 4.543e-12, 3.752e-12, 3.14e-12, 2.6e-12,
2867 2.194e-12, 1.825e-12, 1.511e-12, 1.245e-12, 1.024e-12, 8.539e-13,
2868 7.227e-13, 6.102e-13, 5.189e-13, 4.43e-13, 3.774e-13, 3.236e-13,
2869 2.8e-13, 2.444e-13, 2.156e-13, 1.932e-13, 1.775e-13, 1.695e-13,
2870 1.672e-13, 1.704e-13, 1.825e-13, 2.087e-13, 2.614e-13, 3.377e-13,
2871 4.817e-13, 6.989e-13, 1.062e-12, 1.562e-12, 2.288e-12, 3.295e-12,
2872 4.55e-12, 5.965e-12, 7.546e-12, 9.395e-12, 1.103e-11, 1.228e-11,
2873 1.318e-11, 1.38e-11, 1.421e-11, 1.39e-11, 1.358e-11, 1.336e-11,
2874 1.342e-11, 1.356e-11, 1.424e-11, 1.552e-11, 1.73e-11, 1.951e-11,
2875 2.128e-11, 2.249e-11, 2.277e-11, 2.226e-11, 2.111e-11, 1.922e-11,
2876 1.775e-11, 1.661e-11, 1.547e-11, 1.446e-11, 1.323e-11, 1.21e-11,
2877 1.054e-11, 9.283e-12, 8.671e-12, 8.67e-12, 9.429e-12, 1.062e-11,
2878 1.255e-11, 1.506e-11, 1.818e-11, 2.26e-11, 2.831e-11, 3.723e-11,
2879 5.092e-11, 6.968e-11, 9.826e-11, 1.349e-10, 1.87e-10, 2.58e-10,
2880 3.43e-10, 4.424e-10, 5.521e-10, 6.812e-10, 8.064e-10, 9.109e-10,
2881 9.839e-10, 1.028e-9, 1.044e-9, 1.029e-9, 1.005e-9, 1.002e-9,
2882 1.038e-9, 1.122e-9, 1.233e-9, 1.372e-9, 1.524e-9, 1.665e-9,
2883 1.804e-9, 1.908e-9, 2.015e-9, 2.117e-9, 2.219e-9, 2.336e-9,
2884 2.531e-9, 2.805e-9, 3.189e-9, 3.617e-9, 4.208e-9, 4.911e-9,
2885 5.619e-9, 6.469e-9, 7.188e-9, 7.957e-9, 8.503e-9, 9.028e-9,
2886 9.571e-9, 9.99e-9, 1.055e-8, 1.102e-8, 1.132e-8, 1.141e-8,
2887 1.145e-8, 1.145e-8, 1.176e-8, 1.224e-8, 1.304e-8, 1.388e-8,
2888 1.445e-8, 1.453e-8, 1.368e-8, 1.22e-8, 1.042e-8, 8.404e-9,
2889 6.403e-9, 4.643e-9, 3.325e-9, 2.335e-9, 1.638e-9, 1.19e-9,
2890 9.161e-10, 7.412e-10, 6.226e-10, 5.516e-10, 5.068e-10, 4.831e-10,
2891 4.856e-10, 5.162e-10, 5.785e-10, 6.539e-10, 7.485e-10, 8.565e-10,
2892 9.534e-10, 1.052e-9, 1.115e-9, 1.173e-9, 1.203e-9, 1.224e-9,
2893 1.243e-9, 1.248e-9, 1.261e-9, 1.265e-9, 1.25e-9, 1.217e-9,
2894 1.176e-9, 1.145e-9, 1.153e-9, 1.199e-9, 1.278e-9, 1.366e-9,
2895 1.426e-9, 1.444e-9, 1.365e-9, 1.224e-9, 1.051e-9, 8.539e-10,
2896 6.564e-10, 4.751e-10, 3.404e-10, 2.377e-10, 1.631e-10, 1.114e-10,
2897 7.87e-11, 5.793e-11, 4.284e-11, 3.3e-11, 2.62e-11, 2.152e-11,
2898 1.777e-11, 1.496e-11, 1.242e-11, 1.037e-11, 8.725e-12, 7.004e-12,
2899 5.718e-12, 4.769e-12, 3.952e-12, 3.336e-12, 2.712e-12, 2.213e-12,
2900 1.803e-12, 1.492e-12, 1.236e-12, 1.006e-12, 8.384e-13, 7.063e-13,
2901 5.879e-13, 4.93e-13, 4.171e-13, 3.569e-13, 3.083e-13, 2.688e-13,
2902 2.333e-13, 2.035e-13, 1.82e-13, 1.682e-13, 1.635e-13, 1.674e-13,
2903 1.769e-13, 2.022e-13, 2.485e-13, 3.127e-13, 4.25e-13, 5.928e-13,
2904 8.514e-13, 1.236e-12, 1.701e-12, 2.392e-12, 3.231e-12, 4.35e-12,
2905 5.559e-12, 6.915e-12, 8.519e-12, 1.013e-11, 1.146e-11, 1.24e-11,
2906 1.305e-11, 1.333e-11, 1.318e-11, 1.263e-11, 1.238e-11, 1.244e-11,
2907 1.305e-11, 1.432e-11, 1.623e-11, 1.846e-11, 2.09e-11, 2.328e-11,
2908 2.526e-11, 2.637e-11, 2.702e-11, 2.794e-11, 2.889e-11, 2.989e-11,
2909 3.231e-11, 3.68e-11, 4.375e-11, 5.504e-11, 7.159e-11, 9.502e-11,
2910 1.279e-10, 1.645e-10, 2.098e-10, 2.618e-10, 3.189e-10, 3.79e-10,
2911 4.303e-10, 4.753e-10, 5.027e-10, 5.221e-10, 5.293e-10, 5.346e-10,
2912 5.467e-10, 5.796e-10, 6.2e-10, 6.454e-10, 6.705e-10, 6.925e-10,
2913 7.233e-10, 7.35e-10, 7.538e-10, 7.861e-10, 8.077e-10, 8.132e-10,
2914 7.749e-10, 7.036e-10, 6.143e-10, 5.093e-10, 4.089e-10, 3.092e-10,
2915 2.299e-10, 1.705e-10, 1.277e-10, 9.723e-11, 7.533e-11, 6.126e-11,
2916 5.154e-11, 4.428e-11, 3.913e-11, 3.521e-11, 3.297e-11, 3.275e-11,
2917 3.46e-11, 3.798e-11, 4.251e-11, 4.745e-11, 5.232e-11, 5.606e-11,
2918 5.82e-11, 5.88e-11, 5.79e-11, 5.661e-11, 5.491e-11, 5.366e-11,
2919 5.341e-11, 5.353e-11, 5.336e-11, 5.293e-11, 5.248e-11, 5.235e-11,
2920 5.208e-11, 5.322e-11, 5.521e-11, 5.725e-11, 5.827e-11, 5.685e-11,
2921 5.245e-11, 4.612e-11, 3.884e-11, 3.129e-11, 2.404e-11, 1.732e-11,
2922 1.223e-11, 8.574e-12, 5.888e-12, 3.986e-12, 2.732e-12, 1.948e-12,
2923 1.414e-12, 1.061e-12, 8.298e-13, 6.612e-13, 5.413e-13, 4.472e-13,
2924 3.772e-13, 3.181e-13, 2.645e-13, 2.171e-13, 1.778e-13, 1.464e-13,
2925 1.183e-13, 9.637e-14, 7.991e-14, 6.668e-14, 5.57e-14, 4.663e-14,
2926 3.848e-14, 3.233e-14, 2.706e-14, 2.284e-14, 1.944e-14, 1.664e-14,
2927 1.43e-14, 1.233e-14, 1.066e-14, 9.234e-15, 8.023e-15, 6.993e-15,
2928 6.119e-15, 5.384e-15, 4.774e-15, 4.283e-15, 3.916e-15, 3.695e-15,
2929 3.682e-15, 4.004e-15, 4.912e-15, 6.853e-15, 1.056e-14, 1.712e-14,
2930 2.804e-14, 4.516e-14, 7.113e-14, 1.084e-13, 1.426e-13, 1.734e-13,
2931 1.978e-13, 2.194e-13, 2.388e-13, 2.489e-13, 2.626e-13, 2.865e-13,
2932 3.105e-13, 3.387e-13, 3.652e-13, 3.984e-13, 4.398e-13, 4.906e-13,
2933 5.55e-13, 6.517e-13, 7.813e-13, 9.272e-13, 1.164e-12, 1.434e-12,
2934 1.849e-12, 2.524e-12, 3.328e-12, 4.523e-12, 6.108e-12, 8.207e-12,
2935 1.122e-11, 1.477e-11, 1.9e-11, 2.412e-11, 2.984e-11, 3.68e-11,
2936 4.353e-11, 4.963e-11, 5.478e-11, 5.903e-11, 6.233e-11, 6.483e-11,
2937 6.904e-11, 7.569e-11, 8.719e-11, 1.048e-10, 1.278e-10, 1.557e-10,
2938 1.869e-10, 2.218e-10, 2.61e-10, 2.975e-10, 3.371e-10, 3.746e-10,
2939 4.065e-10, 4.336e-10, 4.503e-10, 4.701e-10, 4.8e-10, 4.917e-10,
2940 5.038e-10, 5.128e-10, 5.143e-10, 5.071e-10, 5.019e-10, 5.025e-10,
2941 5.183e-10, 5.496e-10, 5.877e-10, 6.235e-10, 6.42e-10, 6.234e-10,
2942 5.698e-10, 4.916e-10, 4.022e-10, 3.126e-10, 2.282e-10, 1.639e-10,
2943 1.142e-10, 7.919e-11, 5.69e-11, 4.313e-11, 3.413e-11, 2.807e-11,
2944 2.41e-11, 2.166e-11, 2.024e-11, 1.946e-11, 1.929e-11, 1.963e-11,
2945 2.035e-11, 2.162e-11, 2.305e-11, 2.493e-11, 2.748e-11, 3.048e-11,
2946 3.413e-11, 3.754e-11, 4.155e-11, 4.635e-11, 5.11e-11, 5.734e-11,
2947 6.338e-11, 6.99e-11, 7.611e-11, 8.125e-11, 8.654e-11, 8.951e-11,
2948 9.182e-11, 9.31e-11, 9.273e-11, 9.094e-11, 8.849e-11, 8.662e-11,
2949 8.67e-11, 8.972e-11, 9.566e-11, 1.025e-10, 1.083e-10, 1.111e-10,
2950 1.074e-10, 9.771e-11, 8.468e-11, 6.958e-11, 5.47e-11, 4.04e-11,
2951 2.94e-11, 2.075e-11, 1.442e-11, 1.01e-11, 7.281e-12, 5.409e-12,
2952 4.138e-12, 3.304e-12, 2.784e-12, 2.473e-12, 2.273e-12, 2.186e-12,
2953 2.118e-12, 2.066e-12, 1.958e-12, 1.818e-12, 1.675e-12, 1.509e-12,
2954 1.349e-12, 1.171e-12, 9.838e-13, 8.213e-13, 6.765e-13, 5.378e-13,
2955 4.161e-13, 3.119e-13, 2.279e-13, 1.637e-13, 1.152e-13, 8.112e-14,
2956 5.919e-14, 4.47e-14, 3.492e-14, 2.811e-14, 2.319e-14, 1.948e-14,
2957 1.66e-14, 1.432e-14, 1.251e-14, 1.109e-14, 1.006e-14, 9.45e-15,
2958 9.384e-15, 1.012e-14, 1.216e-14, 1.636e-14, 2.305e-14, 3.488e-14,
2959 5.572e-14, 8.479e-14, 1.265e-13, 1.905e-13, 2.73e-13, 3.809e-13,
2960 4.955e-13, 6.303e-13, 7.861e-13, 9.427e-13, 1.097e-12, 1.212e-12,
2961 1.328e-12, 1.415e-12, 1.463e-12, 1.495e-12, 1.571e-12, 1.731e-12,
2962 1.981e-12, 2.387e-12, 2.93e-12, 3.642e-12, 4.584e-12, 5.822e-12,
2963 7.278e-12, 9.193e-12, 1.135e-11, 1.382e-11, 1.662e-11, 1.958e-11,
2964 2.286e-11, 2.559e-11, 2.805e-11, 2.988e-11, 3.106e-11, 3.182e-11,
2965 3.2e-11, 3.258e-11, 3.362e-11, 3.558e-11, 3.688e-11, 3.8e-11,
2966 3.929e-11, 4.062e-11, 4.186e-11, 4.293e-11, 4.48e-11, 4.643e-11,
2967 4.704e-11, 4.571e-11, 4.206e-11, 3.715e-11, 3.131e-11, 2.541e-11,
2968 1.978e-11, 1.508e-11, 1.146e-11, 8.7e-12, 6.603e-12, 5.162e-12,
2969 4.157e-12, 3.408e-12, 2.829e-12, 2.405e-12, 2.071e-12, 1.826e-12,
2970 1.648e-12, 1.542e-12, 1.489e-12, 1.485e-12, 1.493e-12, 1.545e-12,
2971 1.637e-12, 1.814e-12, 2.061e-12, 2.312e-12, 2.651e-12, 3.03e-12,
2972 3.46e-12, 3.901e-12, 4.306e-12, 4.721e-12, 5.008e-12, 5.281e-12,
2973 5.541e-12, 5.791e-12, 6.115e-12, 6.442e-12, 6.68e-12, 6.791e-12,
2974 6.831e-12, 6.839e-12, 6.946e-12, 7.128e-12, 7.537e-12, 8.036e-12,
2975 8.392e-12, 8.526e-12, 8.11e-12, 7.325e-12, 6.329e-12, 5.183e-12,
2976 4.081e-12, 2.985e-12, 2.141e-12, 1.492e-12, 1.015e-12, 6.684e-13,
2977 4.414e-13, 2.987e-13, 2.038e-13, 1.391e-13, 9.86e-14, 7.24e-14,
2978 5.493e-14, 4.288e-14, 3.427e-14, 2.787e-14, 2.296e-14, 1.909e-14,
2979 1.598e-14, 1.344e-14, 1.135e-14, 9.616e-15, 8.169e-15, 6.957e-15,
2980 5.938e-15, 5.08e-15, 4.353e-15, 3.738e-15, 3.217e-15, 2.773e-15,
2981 2.397e-15, 2.077e-15, 1.805e-15, 1.575e-15, 1.382e-15, 1.221e-15,
2982 1.09e-15, 9.855e-16, 9.068e-16, 8.537e-16, 8.27e-16, 8.29e-16,
2983 8.634e-16, 9.359e-16, 1.055e-15, 1.233e-15, 1.486e-15, 1.839e-15,
2984 2.326e-15, 2.998e-15, 3.934e-15, 5.256e-15, 7.164e-15, 9.984e-15,
2985 1.427e-14, 2.099e-14, 3.196e-14, 5.121e-14, 7.908e-14, 1.131e-13,
2986 1.602e-13, 2.239e-13, 3.075e-13, 4.134e-13, 5.749e-13, 7.886e-13,
2987 1.071e-12, 1.464e-12, 2.032e-12, 2.8e-12, 3.732e-12, 4.996e-12,
2988 6.483e-12, 8.143e-12, 1.006e-11, 1.238e-11, 1.484e-11, 1.744e-11,
2989 2.02e-11, 2.274e-11, 2.562e-11, 2.848e-11, 3.191e-11, 3.617e-11,
2990 4.081e-11, 4.577e-11, 4.937e-11, 5.204e-11, 5.401e-11, 5.462e-11,
2991 5.507e-11, 5.51e-11, 5.605e-11, 5.686e-11, 5.739e-11, 5.766e-11,
2992 5.74e-11, 5.754e-11, 5.761e-11, 5.777e-11, 5.712e-11, 5.51e-11,
2993 5.088e-11, 4.438e-11, 3.728e-11, 2.994e-11, 2.305e-11, 1.715e-11,
2994 1.256e-11, 9.208e-12, 6.745e-12, 5.014e-12, 3.785e-12, 2.9e-12,
2995 2.239e-12, 1.757e-12, 1.414e-12, 1.142e-12, 9.482e-13, 8.01e-13,
2996 6.961e-13, 6.253e-13, 5.735e-13, 5.433e-13, 5.352e-13, 5.493e-13,
2997 5.706e-13, 6.068e-13, 6.531e-13, 7.109e-13, 7.767e-13, 8.59e-13,
2998 9.792e-13, 1.142e-12, 1.371e-12, 1.65e-12, 1.957e-12, 2.302e-12,
2999 2.705e-12, 3.145e-12, 3.608e-12, 4.071e-12, 4.602e-12, 5.133e-12,
3000 5.572e-12, 5.987e-12, 6.248e-12, 6.533e-12, 6.757e-12, 6.935e-12,
3001 7.224e-12, 7.422e-12, 7.538e-12, 7.547e-12, 7.495e-12, 7.543e-12,
3002 7.725e-12, 8.139e-12, 8.627e-12, 9.146e-12, 9.443e-12, 9.318e-12,
3003 8.649e-12, 7.512e-12, 6.261e-12, 4.915e-12, 3.647e-12, 2.597e-12,
3004 1.785e-12, 1.242e-12, 8.66e-13, 6.207e-13, 4.61e-13, 3.444e-13,
3005 2.634e-13, 2.1e-13, 1.725e-13, 1.455e-13, 1.237e-13, 1.085e-13,
3006 9.513e-14, 7.978e-14, 6.603e-14, 5.288e-14, 4.084e-14, 2.952e-14,
3007 2.157e-14, 1.593e-14, 1.199e-14, 9.267e-15, 7.365e-15, 6.004e-15,
3008 4.995e-15, 4.218e-15, 3.601e-15, 3.101e-15, 2.692e-15, 2.36e-15,
3009 2.094e-15, 1.891e-15, 1.755e-15, 1.699e-15, 1.755e-15, 1.987e-15,
3010 2.506e-15, 3.506e-15, 5.289e-15, 8.311e-15, 1.325e-14, 2.129e-14,
3011 3.237e-14, 4.595e-14, 6.441e-14, 8.433e-14, 1.074e-13, 1.383e-13,
3012 1.762e-13, 2.281e-13, 2.831e-13, 3.523e-13, 4.38e-13, 5.304e-13,
3013 6.29e-13, 7.142e-13, 8.032e-13, 8.934e-13, 9.888e-13, 1.109e-12,
3014 1.261e-12, 1.462e-12, 1.74e-12, 2.099e-12, 2.535e-12, 3.008e-12,
3015 3.462e-12, 3.856e-12, 4.098e-12, 4.239e-12, 4.234e-12, 4.132e-12,
3016 3.986e-12, 3.866e-12, 3.829e-12, 3.742e-12, 3.705e-12, 3.694e-12,
3017 3.765e-12, 3.849e-12, 3.929e-12, 4.056e-12, 4.092e-12, 4.047e-12,
3018 3.792e-12, 3.407e-12, 2.953e-12, 2.429e-12, 1.931e-12, 1.46e-12,
3019 1.099e-12, 8.199e-13, 6.077e-13, 4.449e-13, 3.359e-13, 2.524e-13,
3020 1.881e-13, 1.391e-13, 1.02e-13, 7.544e-14, 5.555e-14, 4.22e-14,
3021 3.321e-14, 2.686e-14, 2.212e-14, 1.78e-14, 1.369e-14, 1.094e-14,
3022 9.13e-15, 8.101e-15, 7.828e-15, 8.393e-15, 1.012e-14, 1.259e-14,
3023 1.538e-14, 1.961e-14, 2.619e-14, 3.679e-14, 5.049e-14, 6.917e-14,
3024 8.88e-14, 1.115e-13, 1.373e-13, 1.619e-13, 1.878e-13, 2.111e-13,
3025 2.33e-13, 2.503e-13, 2.613e-13, 2.743e-13, 2.826e-13, 2.976e-13,
3026 3.162e-13, 3.36e-13, 3.491e-13, 3.541e-13, 3.595e-13, 3.608e-13,
3027 3.709e-13, 3.869e-13, 4.12e-13, 4.366e-13, 4.504e-13, 4.379e-13,
3028 3.955e-13, 3.385e-13, 2.741e-13, 2.089e-13, 1.427e-13, 9.294e-14,
3029 5.775e-14, 3.565e-14, 2.21e-14, 1.398e-14, 9.194e-15, 6.363e-15,
3030 4.644e-15, 3.55e-15, 2.808e-15, 2.274e-15, 1.871e-15, 1.557e-15,
3031 1.308e-15, 1.108e-15, 9.488e-16, 8.222e-16, 7.238e-16, 6.506e-16,
3032 6.008e-16, 5.742e-16, 5.724e-16, 5.991e-16, 6.625e-16, 7.775e-16,
3033 9.734e-16, 1.306e-15, 1.88e-15, 2.879e-15, 4.616e-15, 7.579e-15,
3034 1.248e-14, 2.03e-14, 3.244e-14, 5.171e-14, 7.394e-14, 9.676e-14,
3035 1.199e-13, 1.467e-13, 1.737e-13, 2.02e-13, 2.425e-13, 3.016e-13,
3036 3.7e-13, 4.617e-13, 5.949e-13, 7.473e-13, 9.378e-13, 1.191e-12,
3037 1.481e-12, 1.813e-12, 2.232e-12, 2.722e-12, 3.254e-12, 3.845e-12,
3038 4.458e-12, 5.048e-12, 5.511e-12, 5.898e-12, 6.204e-12, 6.293e-12,
3039 6.386e-12, 6.467e-12, 6.507e-12, 6.466e-12, 6.443e-12, 6.598e-12,
3040 6.873e-12, 7.3e-12, 7.816e-12, 8.368e-12, 8.643e-12, 8.466e-12,
3041 7.871e-12, 6.853e-12, 5.714e-12, 4.482e-12, 3.392e-12, 2.613e-12,
3042 2.008e-12, 1.562e-12, 1.228e-12, 9.888e-13, 7.646e-13, 5.769e-13,
3043 4.368e-13, 3.324e-13, 2.508e-13, 1.916e-13
3044 };
3045
3046 static const double xfcrev[15] =
3047 { 1.003, 1.009, 1.015, 1.023, 1.029, 1.033, 1.037,
3048 1.039, 1.04, 1.046, 1.036, 1.027, 1.01, 1.002, 1.
3049 };
3050
3051 double sfac;
3052
3053 /* Get H2O continuum absorption... */
3054 const double xw = nu / 10 + 1;
3055 if (xw >= 1 && xw < 2001) {
3056 const int iw = (int) xw;
3057 const double dw = xw - iw;
3058 const double ew = 1 - dw;
3059 const double cw296 = ew * h2o296[iw - 1] + dw * h2o296[iw];
3060 const double cw260 = ew * h2o260[iw - 1] + dw * h2o260[iw];
3061 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
3062 if (nu <= 820 || nu >= 960) {
3063 sfac = 1;
3064 } else {
3065 const double xx = (nu - 820) / 10;
3066 const int ix = (int) xx;
3067 const double dx = xx - ix;
3068 sfac = (1 - dx) * xfcrev[ix] + dx * xfcrev[ix + 1];
3069 }
3070 const double ctwslf =
3071 sfac * cw296 * pow(cw260 / cw296, (296 - t) / (296 - 260));
3072 const double vf2 = POW2(nu - 370);
3073 const double vf6 = POW3(vf2);
3074 const double fscal = 36100 / (vf2 + vf6 * 1e-8 + 36100) * -.25 + 1;
3075 const double ctwfrn = cwfrn * fscal;
3076 const double a1 = nu * u * tanh(.7193876 / t * nu);
3077 const double a2 = 296 / t;
3078 const double a3 = p / P0 * (q * ctwslf + (1 - q) * ctwfrn) * 1e-20;
3079 return a1 * a2 * a3;
3080 } else
3081 return 0;
3082}
3083
3084/*****************************************************************************/
3085
3086double ctmn2(
3087 const double nu,
3088 const double p,
3089 const double t) {
3090
3091 static const double ba[98] =
3092 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
3093 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
3094 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
3095 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
3096 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
3097 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
3098 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
3099 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
3100 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
3101 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
3102 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3103 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3104 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3105 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3106 };
3107
3108 static const double betaa[98] =
3109 { 802., 802., 761., 722., 679., 646., 609., 562.,
3110 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3111 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3112 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3113 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3114 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3115 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3116 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3117 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3118 372., 449., 514., 569., 609., 642., 673., 673.
3119 };
3120
3121 static const double nua[98] =
3122 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3123 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3124 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3125 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3126 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3127 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3128 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3129 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3130 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3131 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3132 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3133 };
3134
3135 const double t0 = 273.0, tr = 296.0;
3136
3137 /* Check wavenumber range... */
3138 if (nu < nua[0] || nu > nua[97])
3139 return 0;
3140
3141 /* Interpolate B and beta... */
3142 const int idx = locate_reg(nua, 98, nu);
3143 const double b =
3144 1e6 * LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3145 const double beta =
3146 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3147
3148 /* Compute absorption coefficient... */
3149 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3150 * N2 * b * (N2 + (1 - N2) * (1.294 - 0.4545 * t / tr));
3151}
3152
3153/*****************************************************************************/
3154
3155double ctmo2(
3156 const double nu,
3157 const double p,
3158 const double t) {
3159
3160 static const double ba[90] =
3161 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3162 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3163 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3164 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3165 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3166 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3167 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3168 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3169 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3170 .071, .064, 0.
3171 };
3172
3173 static const double betaa[90] =
3174 { 467., 467., 400., 315., 379., 368., 475., 521.,
3175 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3176 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3177 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3178 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3179 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3180 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3181 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3182 346., 322., 291., 290., 350., 371., 504., 504.
3183 };
3184
3185 static const double nua[90] =
3186 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3187 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3188 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3189 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3190 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3191 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3192 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3193 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3194 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3195 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3196 1800., 1805.
3197 };
3198
3199 const double t0 = 273, tr = 296;
3200
3201 /* Check wavenumber range... */
3202 if (nu < nua[0] || nu > nua[89])
3203 return 0;
3204
3205 /* Interpolate B and beta... */
3206 const int idx = locate_reg(nua, 90, nu);
3207 const double b = LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3208 const double beta =
3209 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3210
3211 /* Compute absorption coefficient... */
3212 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) * O2 * b;
3213}
3214
3215/*****************************************************************************/
3216
3218 const ctl_t *ctl,
3219 atm_t *atm_dest,
3220 const atm_t *atm_src,
3221 const int init) {
3222
3223 /* Data size... */
3224 const size_t s = (size_t) atm_src->np * sizeof(double);
3225
3226 /* Copy data... */
3227 atm_dest->np = atm_src->np;
3228 memcpy(atm_dest->time, atm_src->time, s);
3229 memcpy(atm_dest->z, atm_src->z, s);
3230 memcpy(atm_dest->lon, atm_src->lon, s);
3231 memcpy(atm_dest->lat, atm_src->lat, s);
3232 memcpy(atm_dest->p, atm_src->p, s);
3233 memcpy(atm_dest->t, atm_src->t, s);
3234 for (int ig = 0; ig < ctl->ng; ig++)
3235 memcpy(atm_dest->q[ig], atm_src->q[ig], s);
3236 for (int iw = 0; iw < ctl->nw; iw++)
3237 memcpy(atm_dest->k[iw], atm_src->k[iw], s);
3238 atm_dest->clz = atm_src->clz;
3239 atm_dest->cldz = atm_src->cldz;
3240 for (int icl = 0; icl < ctl->ncl; icl++)
3241 atm_dest->clk[icl] = atm_src->clk[icl];
3242 atm_dest->sft = atm_src->sft;
3243 for (int isf = 0; isf < ctl->nsf; isf++)
3244 atm_dest->sfeps[isf] = atm_src->sfeps[isf];
3245
3246 /* Initialize... */
3247 if (init)
3248 for (int ip = 0; ip < atm_dest->np; ip++) {
3249 atm_dest->p[ip] = 0;
3250 atm_dest->t[ip] = 0;
3251 for (int ig = 0; ig < ctl->ng; ig++)
3252 atm_dest->q[ig][ip] = 0;
3253 for (int iw = 0; iw < ctl->nw; iw++)
3254 atm_dest->k[iw][ip] = 0;
3255 atm_dest->clz = 0;
3256 atm_dest->cldz = 0;
3257 for (int icl = 0; icl < ctl->ncl; icl++)
3258 atm_dest->clk[icl] = 0;
3259 atm_dest->sft = 0;
3260 for (int isf = 0; isf < ctl->nsf; isf++)
3261 atm_dest->sfeps[isf] = 1;
3262 }
3263}
3264
3265/*****************************************************************************/
3266
3268 const ctl_t *ctl,
3269 obs_t *obs_dest,
3270 const obs_t *obs_src,
3271 const int init) {
3272
3273 /* Data size... */
3274 const size_t s = (size_t) obs_src->nr * sizeof(double);
3275
3276 /* Copy data... */
3277 obs_dest->nr = obs_src->nr;
3278 memcpy(obs_dest->time, obs_src->time, s);
3279 memcpy(obs_dest->obsz, obs_src->obsz, s);
3280 memcpy(obs_dest->obslon, obs_src->obslon, s);
3281 memcpy(obs_dest->obslat, obs_src->obslat, s);
3282 memcpy(obs_dest->vpz, obs_src->vpz, s);
3283 memcpy(obs_dest->vplon, obs_src->vplon, s);
3284 memcpy(obs_dest->vplat, obs_src->vplat, s);
3285 memcpy(obs_dest->tpz, obs_src->tpz, s);
3286 memcpy(obs_dest->tplon, obs_src->tplon, s);
3287 memcpy(obs_dest->tplat, obs_src->tplat, s);
3288 for (int id = 0; id < ctl->nd; id++)
3289 memcpy(obs_dest->rad[id], obs_src->rad[id], s);
3290 for (int id = 0; id < ctl->nd; id++)
3291 memcpy(obs_dest->tau[id], obs_src->tau[id], s);
3292
3293 /* Initialize... */
3294 if (init)
3295 for (int id = 0; id < ctl->nd; id++)
3296 for (int ir = 0; ir < obs_dest->nr; ir++)
3297 if (isfinite(obs_dest->rad[id][ir])) {
3298 obs_dest->rad[id][ir] = 0;
3299 obs_dest->tau[id][ir] = 0;
3300 }
3301}
3302
3303/*****************************************************************************/
3304
3306 const ctl_t *ctl,
3307 const char *emitter) {
3308
3309 for (int ig = 0; ig < ctl->ng; ig++)
3310 if (strcasecmp(ctl->emitter[ig], emitter) == 0)
3311 return ig;
3312
3313 return -1;
3314}
3315
3316/*****************************************************************************/
3317
3319 const ctl_t *ctl,
3320 const tbl_t *tbl,
3321 atm_t *atm,
3322 obs_t *obs) {
3323
3324 int *mask;
3325
3326 /* Allocate... */
3327 ALLOC(mask, int,
3328 ND * NR);
3329
3330 /* Save observation mask... */
3331 for (int id = 0; id < ctl->nd; id++)
3332 for (int ir = 0; ir < obs->nr; ir++)
3333 mask[id * NR + ir] = !isfinite(obs->rad[id][ir]);
3334
3335 /* Hydrostatic equilibrium... */
3336 hydrostatic(ctl, atm);
3337
3338 /* CGA or EGA forward model... */
3339 if (ctl->formod == 0 || ctl->formod == 1)
3340 for (int ir = 0; ir < obs->nr; ir++)
3341 formod_pencil(ctl, tbl, atm, obs, ir);
3342
3343 /* Call RFM... */
3344 else if (ctl->formod == 2)
3345 formod_rfm(ctl, atm, obs);
3346
3347 /* Apply field-of-view convolution... */
3348 formod_fov(ctl, obs);
3349
3350 /* Convert radiance to brightness temperature... */
3351 if (ctl->write_bbt)
3352 for (int id = 0; id < ctl->nd; id++)
3353 for (int ir = 0; ir < obs->nr; ir++)
3354 obs->rad[id][ir] = BRIGHT(obs->rad[id][ir], ctl->nu[id]);
3355
3356 /* Apply observation mask... */
3357 for (int id = 0; id < ctl->nd; id++)
3358 for (int ir = 0; ir < obs->nr; ir++)
3359 if (mask[id * NR + ir])
3360 obs->rad[id][ir] = NAN;
3361
3362 /* Free... */
3363 free(mask);
3364}
3365
3366/*****************************************************************************/
3367
3369 const ctl_t *ctl,
3370 const los_t *los,
3371 const int ip,
3372 double *beta) {
3373
3374 /* Extinction... */
3375 for (int id = 0; id < ctl->nd; id++)
3376 beta[id] = los->k[ip][id];
3377
3378 /* CO2 continuum... */
3379 if (ctl->ctm_co2 && ctl->ig_co2 >= 0)
3380 for (int id = 0; id < ctl->nd; id++)
3381 beta[id] += ctmco2(ctl->nu[id], los->p[ip], los->t[ip],
3382 los->u[ip][ctl->ig_co2]) / los->ds[ip];
3383
3384 /* H2O continuum... */
3385 if (ctl->ctm_h2o && ctl->ig_h2o >= 0)
3386 for (int id = 0; id < ctl->nd; id++)
3387 beta[id] += ctmh2o(ctl->nu[id], los->p[ip], los->t[ip],
3388 los->q[ip][ctl->ig_h2o], los->u[ip][ctl->ig_h2o])
3389 / los->ds[ip];
3390
3391 /* N2 continuum... */
3392 if (ctl->ctm_n2)
3393 for (int id = 0; id < ctl->nd; id++)
3394 beta[id] += ctmn2(ctl->nu[id], los->p[ip], los->t[ip]);
3395
3396 /* O2 continuum... */
3397 if (ctl->ctm_o2)
3398 for (int id = 0; id < ctl->nd; id++)
3399 beta[id] += ctmo2(ctl->nu[id], los->p[ip], los->t[ip]);
3400}
3401
3402/*****************************************************************************/
3403
3405 const ctl_t *ctl,
3406 obs_t *obs) {
3407
3408 obs_t *obs2;
3409
3410 double rad[ND][NR], tau[ND][NR], z[NR];
3411
3412 /* Do not take into account FOV... */
3413 if (ctl->fov[0] == '-')
3414 return;
3415
3416 /* Allocate... */
3417 ALLOC(obs2, obs_t, 1);
3418
3419 /* Copy observation data... */
3420 copy_obs(ctl, obs2, obs, 0);
3421
3422 /* Loop over ray paths... */
3423 for (int ir = 0; ir < obs->nr; ir++) {
3424
3425 /* Get radiance and transmittance profiles... */
3426 int nz = 0;
3427 for (int ir2 = MAX(ir - NFOV, 0);
3428 ir2 < MIN(ir + 1 + NFOV, obs->nr); ir2++)
3429 if (obs->time[ir2] == obs->time[ir]) {
3430 z[nz] = obs2->vpz[ir2];
3431 for (int id = 0; id < ctl->nd; id++) {
3432 rad[id][nz] = obs2->rad[id][ir2];
3433 tau[id][nz] = obs2->tau[id][ir2];
3434 }
3435 nz++;
3436 }
3437 if (nz < 2)
3438 ERRMSG("Cannot apply FOV convolution!");
3439
3440 /* Convolute profiles with FOV... */
3441 double wsum = 0;
3442 for (int id = 0; id < ctl->nd; id++) {
3443 obs->rad[id][ir] = 0;
3444 obs->tau[id][ir] = 0;
3445 }
3446 for (int i = 0; i < ctl->fov_n; i++) {
3447 const double zfov = obs->vpz[ir] + ctl->fov_dz[i];
3448 const int idx = locate_irr(z, nz, zfov);
3449 for (int id = 0; id < ctl->nd; id++) {
3450 obs->rad[id][ir] += ctl->fov_w[i]
3451 * LIN(z[idx], rad[id][idx], z[idx + 1], rad[id][idx + 1], zfov);
3452 obs->tau[id][ir] += ctl->fov_w[i]
3453 * LIN(z[idx], tau[id][idx], z[idx + 1], tau[id][idx + 1], zfov);
3454 }
3455 wsum += ctl->fov_w[i];
3456 }
3457 for (int id = 0; id < ctl->nd; id++) {
3458 obs->rad[id][ir] /= wsum;
3459 obs->tau[id][ir] /= wsum;
3460 }
3461 }
3462
3463 /* Free... */
3464 free(obs2);
3465}
3466
3467/*****************************************************************************/
3468
3470 const ctl_t *ctl,
3471 const tbl_t *tbl,
3472 const atm_t *atm,
3473 obs_t *obs,
3474 const int ir) {
3475
3476 los_t *los;
3477
3478 double beta_ctm[ND], rad[ND], tau[ND], tau_refl[ND],
3479 tau_path[ND][NG], tau_gas[ND], x0[3], x1[3];
3480
3481 /* Allocate... */
3482 ALLOC(los, los_t, 1);
3483
3484 /* Initialize... */
3485 for (int id = 0; id < ctl->nd; id++) {
3486 rad[id] = 0;
3487 tau[id] = 1;
3488 for (int ig = 0; ig < ctl->ng; ig++)
3489 tau_path[id][ig] = 1;
3490 }
3491
3492 /* Raytracing... */
3493 raytrace(ctl, atm, obs, los, ir);
3494
3495 /* Loop over LOS points... */
3496 for (int ip = 0; ip < los->np; ip++) {
3497
3498 /* Get trace gas transmittance... */
3499 if (ctl->formod == 0)
3500 intpol_tbl_cga(ctl, tbl, los, ip, tau_path, tau_gas);
3501 else
3502 intpol_tbl_ega(ctl, tbl, los, ip, tau_path, tau_gas);
3503
3504 /* Get continuum absorption... */
3505 formod_continua(ctl, los, ip, beta_ctm);
3506
3507 /* Compute Planck function... */
3508 formod_srcfunc(ctl, tbl, los->t[ip], los->src[ip]);
3509
3510 /* Loop over channels... */
3511 for (int id = 0; id < ctl->nd; id++)
3512 if (tau_gas[id] > 0) {
3513
3514 /* Get segment emissivity... */
3515 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3516
3517 /* Compute radiance... */
3518 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3519
3520 /* Compute path transmittance... */
3521 tau[id] *= (1 - los->eps[ip][id]);
3522 }
3523 }
3524
3525 /* Check whether LOS hit the ground... */
3526 if (ctl->sftype >= 1 && los->sft > 0) {
3527
3528 /* Add surface emissions... */
3529 double src_sf[ND];
3530 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3531 for (int id = 0; id < ctl->nd; id++)
3532 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3533
3534 /* Check reflectivity... */
3535 int refl = 0;
3536 if (ctl->sftype >= 2)
3537 for (int id = 0; id < ctl->nd; id++)
3538 if (los->sfeps[id] < 1) {
3539 refl = 1;
3540 break;
3541 }
3542
3543 /* Calculate reflection... */
3544 if (refl) {
3545
3546 /* Initialize... */
3547 for (int id = 0; id < ctl->nd; id++)
3548 tau_refl[id] = 1;
3549
3550 /* Add down-welling radiance... */
3551 for (int ip = los->np - 1; ip >= 0; ip--)
3552 for (int id = 0; id < ctl->nd; id++) {
3553 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3554 * tau[id] * (1 - los->sfeps[id]);
3555 tau_refl[id] *= (1 - los->eps[ip][id]);
3556 }
3557
3558 /* Add solar term... */
3559 if (ctl->sftype >= 3) {
3560
3561 /* Get solar zenith angle... */
3562 double sza2;
3563 if (ctl->sfsza < 0)
3564 sza2 =
3565 sza(obs->time[ir], los->lon[los->np - 1], los->lat[los->np - 1]);
3566 else
3567 sza2 = ctl->sfsza;
3568
3569 /* Check solar zenith angle... */
3570 if (sza2 < 89.999) {
3571
3572 /* Get angle of incidence... */
3573 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3574 los->lat[los->np - 1], x0);
3575 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3576 for (int i = 0; i < 3; i++)
3577 x1[i] -= x0[i];
3578 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3579
3580 /* Get ratio of SZA and incident radiation... */
3581 const double rcos = cosa / cos(DEG2RAD(sza2));
3582
3583 /* Add solar radiation... */
3584 for (int id = 0; id < ctl->nd; id++)
3585 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3586 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3587 }
3588 }
3589 }
3590 }
3591
3592 /* Copy results... */
3593 for (int id = 0; id < ctl->nd; id++) {
3594 obs->rad[id][ir] = rad[id];
3595 obs->tau[id][ir] = tau[id];
3596 }
3597
3598 /* Free... */
3599 free(los);
3600}
3601
3602/*****************************************************************************/
3603
3605 const ctl_t *ctl,
3606 const atm_t *atm,
3607 obs_t *obs) {
3608
3609 los_t *los;
3610
3611 FILE *out;
3612
3613 char cmd[2 * LEN], filename[2 * LEN],
3614 rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3615
3616 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3617 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3618
3619 int n, nadir = 0;
3620
3621 /* Allocate... */
3622 ALLOC(los, los_t, 1);
3623
3624 /* Check observer positions... */
3625 for (int ir = 1; ir < obs->nr; ir++)
3626 if (obs->obsz[ir] != obs->obsz[0]
3627 || obs->obslon[ir] != obs->obslon[0]
3628 || obs->obslat[ir] != obs->obslat[0])
3629 ERRMSG("RFM interface requires identical observer positions!");
3630
3631 /* Check extinction data... */
3632 for (int iw = 0; iw < ctl->nw; iw++)
3633 for (int ip = 0; ip < atm->np; ip++)
3634 if (atm->k[iw][ip] != 0)
3635 ERRMSG("RFM interface cannot handle extinction data!");
3636
3637 /* Get altitude range of atmospheric data... */
3638 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3639
3640 /* Observer within atmosphere? */
3641 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3642 obsz = obs->obsz[0];
3643 strcat(rfmflg, " OBS");
3644 }
3645
3646 /* Determine tangent altitude or air mass factor... */
3647 for (int ir = 0; ir < obs->nr; ir++) {
3648
3649 /* Raytracing... */
3650 raytrace(ctl, atm, obs, los, ir);
3651
3652 /* Nadir? */
3653 if (obs->tpz[ir] <= zmin) {
3654 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3655 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3656 for (int i = 0; i < 3; i++)
3657 xd[i] = xo[i] - xv[i];
3658 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3659 nadir++;
3660 } else
3661 z[ir] = obs->tpz[ir];
3662 }
3663 if (nadir > 0 && nadir < obs->nr)
3664 ERRMSG("Limb and nadir not simultaneously possible!");
3665
3666 /* Nadir? */
3667 if (nadir)
3668 strcat(rfmflg, " NAD");
3669
3670 /* Get surface temperature... */
3671 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3672
3673 /* Refraction? */
3674 if (!nadir && !ctl->refrac)
3675 strcat(rfmflg, " GEO");
3676
3677 /* Continua? */
3678 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3679 strcat(rfmflg, " CTM");
3680
3681 /* Write atmospheric data file... */
3682 write_atm_rfm("rfm.atm", ctl, atm);
3683
3684 /* Loop over channels... */
3685 for (int id = 0; id < ctl->nd; id++) {
3686
3687 /* Read filter function... */
3688 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3689 read_shape(filename, nu, f, &n);
3690
3691 /* Set spectral range... */
3692 nu0 = nu[0];
3693 nu1 = nu[n - 1];
3694
3695 /* Create RFM driver file... */
3696 if (!(out = fopen("rfm.drv", "w")))
3697 ERRMSG("Cannot create file!");
3698 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3699 fprintf(out, "*FLG\n%s\n", rfmflg);
3700 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3701 fprintf(out, "*GAS\n");
3702 for (int ig = 0; ig < ctl->ng; ig++)
3703 fprintf(out, "%s\n", ctl->emitter[ig]);
3704 fprintf(out, "*ATM\nrfm.atm\n");
3705 fprintf(out, "*TAN\n");
3706 for (int ir = 0; ir < obs->nr; ir++)
3707 fprintf(out, "%g\n", z[ir]);
3708 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3709 if (obsz >= 0)
3710 fprintf(out, "*OBS\n%g\n", obsz);
3711 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3712 fprintf(out, "*XSC\n");
3713 for (int ig = 0; ig < ctl->ng; ig++)
3714 if (ctl->rfmxsc[ig][0] != '-')
3715 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3716 fprintf(out, "*END\n");
3717 fclose(out);
3718
3719 /* Remove temporary files... */
3720 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3721 ERRMSG("Cannot remove temporary files!");
3722
3723 /* Call RFM... */
3724 sprintf(cmd, "echo | %s", ctl->rfmbin);
3725 if (system(cmd))
3726 ERRMSG("Error while calling RFM!");
3727
3728 /* Read data... */
3729 for (int ir = 0; ir < obs->nr; ir++) {
3730 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3731 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3732 }
3733 }
3734
3735 /* Remove temporary files... */
3736 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3737 ERRMSG("Error while removing temporary files!");
3738
3739 /* Free... */
3740 free(los);
3741}
3742
3743/*****************************************************************************/
3744
3746 const ctl_t *ctl,
3747 const tbl_t *tbl,
3748 const double t,
3749 double *src) {
3750
3751 /* Determine index in temperature array... */
3752 const int it = locate_reg(tbl->st, TBLNS, t);
3753
3754 /* Interpolate Planck function value... */
3755 for (int id = 0; id < ctl->nd; id++)
3756 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3757 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3758}
3759
3760/*****************************************************************************/
3761
3763 const double z,
3764 const double lon,
3765 const double lat,
3766 double *x) {
3767
3768 const double radius = z + RE;
3769
3770 const double latrad = lat / 180. * M_PI;
3771 const double lonrad = lon / 180. * M_PI;
3772
3773 const double coslat = cos(latrad);
3774
3775 x[0] = radius * coslat * cos(lonrad);
3776 x[1] = radius * coslat * sin(lonrad);
3777 x[2] = radius * sin(latrad);
3778}
3779
3780/*****************************************************************************/
3781
3783 const ctl_t *ctl,
3784 atm_t *atm) {
3785
3786 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3787
3788 const int ipts = 20;
3789
3790 double dzmin = 1e99, e = 0;
3791
3792 int ipref = 0;
3793
3794 /* Check reference height... */
3795 if (ctl->hydz < 0)
3796 return;
3797
3798 /* Find air parcel next to reference height... */
3799 for (int ip = 0; ip < atm->np; ip++)
3800 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3801 dzmin = fabs(atm->z[ip] - ctl->hydz);
3802 ipref = ip;
3803 }
3804
3805 /* Upper part of profile... */
3806 for (int ip = ipref + 1; ip < atm->np; ip++) {
3807 double mean = 0;
3808 for (int i = 0; i < ipts; i++) {
3809 if (ctl->ig_h2o >= 0)
3810 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3811 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3812 mean += (e * mmh2o + (1 - e) * mmair)
3813 * G0 / RI
3814 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3815 }
3816
3817 /* Compute p(z,T)... */
3818 atm->p[ip] =
3819 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3820 }
3821
3822 /* Lower part of profile... */
3823 for (int ip = ipref - 1; ip >= 0; ip--) {
3824 double mean = 0;
3825 for (int i = 0; i < ipts; i++) {
3826 if (ctl->ig_h2o >= 0)
3827 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3828 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3829 mean += (e * mmh2o + (1 - e) * mmair)
3830 * G0 / RI
3831 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3832 }
3833
3834 /* Compute p(z,T)... */
3835 atm->p[ip] =
3836 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3837 }
3838}
3839
3840/*****************************************************************************/
3841
3843 const ctl_t *ctl,
3844 const int idx,
3845 char *quantity) {
3846
3847 if (idx == IDXP)
3848 sprintf(quantity, "PRESSURE");
3849
3850 if (idx == IDXT)
3851 sprintf(quantity, "TEMPERATURE");
3852
3853 for (int ig = 0; ig < ctl->ng; ig++)
3854 if (idx == IDXQ(ig))
3855 sprintf(quantity, "%s", ctl->emitter[ig]);
3856
3857 for (int iw = 0; iw < ctl->nw; iw++)
3858 if (idx == IDXK(iw))
3859 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3860
3861 if (idx == IDXCLZ)
3862 sprintf(quantity, "CLOUD_HEIGHT");
3863
3864 if (idx == IDXCLDZ)
3865 sprintf(quantity, "CLOUD_DEPTH");
3866
3867 for (int icl = 0; icl < ctl->ncl; icl++)
3868 if (idx == IDXCLK(icl))
3869 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3870
3871 if (idx == IDXSFT)
3872 sprintf(quantity, "SURFACE_TEMPERATURE");
3873
3874 for (int isf = 0; isf < ctl->nsf; isf++)
3875 if (idx == IDXSFEPS(isf))
3876 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3877}
3878
3879/*****************************************************************************/
3880
3882 const ctl_t *ctl,
3883 tbl_t *tbl) {
3884
3885 char filename[2 * LEN];
3886
3887 double f[NSHAPE], nu[NSHAPE];
3888
3889 int n;
3890
3891 /* Write info... */
3892 LOG(1, "Initialize source function table...");
3893 LOG(2, "Number of data points: %d", TBLNS);
3894
3895 /* Loop over channels... */
3896 for (int id = 0; id < ctl->nd; id++) {
3897
3898 /* Read filter function... */
3899 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3900 read_shape(filename, nu, f, &n);
3901
3902 /* Get minimum grid spacing... */
3903 double dnu = 1.0;
3904 for (int i = 1; i < n; i++)
3905 dnu = MIN(dnu, nu[i] - nu[i - 1]);
3906
3907 /* Compute source function table... */
3908#pragma omp parallel for default(none) shared(ctl,tbl,id,nu,f,n,dnu)
3909 for (int it = 0; it < TBLNS; it++) {
3910
3911 /* Set temperature... */
3912 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
3913
3914 /* Integrate Planck function... */
3915 double fsum = tbl->sr[it][id] = 0;
3916 for (double fnu = nu[0]; fnu <= nu[n - 1]; fnu += dnu) {
3917 const int i = locate_irr(nu, n, fnu);
3918 const double ff = LIN(nu[i], f[i], nu[i + 1], f[i + 1], fnu);
3919 fsum += ff;
3920 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
3921 }
3922 tbl->sr[it][id] /= fsum;
3923 }
3924
3925 /* Write info... */
3926 LOG(2,
3927 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
3928 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
3929 tbl->sr[TBLNS - 1][id]);
3930 }
3931}
3932
3933/*****************************************************************************/
3934
3936 const ctl_t *ctl,
3937 const atm_t *atm,
3938 const double z,
3939 double *p,
3940 double *t,
3941 double *q,
3942 double *k) {
3943
3944 /* Get array index... */
3945 const int ip = locate_irr(atm->z, atm->np, z);
3946
3947 /* Interpolate... */
3948 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
3949 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
3950 for (int ig = 0; ig < ctl->ng; ig++)
3951 q[ig] =
3952 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
3953 for (int iw = 0; iw < ctl->nw; iw++)
3954 k[iw] =
3955 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
3956}
3957
3958/*****************************************************************************/
3959
3961 const ctl_t *ctl,
3962 const tbl_t *tbl,
3963 const los_t *los,
3964 const int ip,
3965 double tau_path[ND][NG],
3966 double tau_seg[ND]) {
3967
3968 double eps;
3969
3970 /* Loop over channels... */
3971 for (int id = 0; id < ctl->nd; id++) {
3972
3973 /* Initialize... */
3974 tau_seg[id] = 1;
3975
3976 /* Loop over emitters.... */
3977 for (int ig = 0; ig < ctl->ng; ig++) {
3978
3979 /* Check size of table (pressure) and column density... */
3980 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
3981 eps = 0;
3982
3983 /* Check transmittance... */
3984 else if (tau_path[id][ig] < 1e-9)
3985 eps = 1;
3986
3987 /* Interpolate... */
3988 else {
3989
3990 /* Determine pressure and temperature indices... */
3991 const int ipr =
3992 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
3993 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
3994 los->cgt[ip][ig]);
3995 const int it1 =
3996 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
3997 los->cgt[ip][ig]);
3998
3999 /* Check size of table (temperature and column density)... */
4000 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4001 || tbl->nu[id][ig][ipr][it0] < 2
4002 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4003 || tbl->nu[id][ig][ipr + 1][it1] < 2
4004 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4005 eps = 0;
4006
4007 else {
4008
4009 /* Get emissivities of extended path... */
4010 double eps00
4011 = intpol_tbl_eps(tbl, ig, id, ipr, it0, los->cgu[ip][ig]);
4012 double eps01 =
4013 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, los->cgu[ip][ig]);
4014 double eps10 =
4015 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, los->cgu[ip][ig]);
4016 double eps11 =
4017 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, los->cgu[ip][ig]);
4018
4019 /* Interpolate with respect to temperature... */
4020 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4021 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4022 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4023 tbl->t[id][ig][ipr + 1][it1 + 1],
4024 eps11, los->cgt[ip][ig]);
4025
4026 /* Interpolate with respect to pressure... */
4027 eps00 = LOGX(tbl->p[id][ig][ipr], eps00,
4028 tbl->p[id][ig][ipr + 1], eps11, los->cgp[ip][ig]);
4029
4030 /* Check emissivity range... */
4031 eps00 = MAX(MIN(eps00, 1), 0);
4032
4033 /* Determine segment emissivity... */
4034 eps = 1 - (1 - eps00) / tau_path[id][ig];
4035 }
4036 }
4037
4038 /* Get transmittance of extended path... */
4039 tau_path[id][ig] *= (1 - eps);
4040
4041 /* Get segment transmittance... */
4042 tau_seg[id] *= (1 - eps);
4043 }
4044 }
4045}
4046
4047/*****************************************************************************/
4048
4050 const ctl_t *ctl,
4051 const tbl_t *tbl,
4052 const los_t *los,
4053 const int ip,
4054 double tau_path[ND][NG],
4055 double tau_seg[ND]) {
4056
4057 double eps, u;
4058
4059 /* Loop over channels... */
4060 for (int id = 0; id < ctl->nd; id++) {
4061
4062 /* Initialize... */
4063 tau_seg[id] = 1;
4064
4065 /* Loop over emitters.... */
4066 for (int ig = 0; ig < ctl->ng; ig++) {
4067
4068 /* Check size of table (pressure) and column density... */
4069 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4070 eps = 0;
4071
4072 /* Check transmittance... */
4073 else if (tau_path[id][ig] < 1e-9)
4074 eps = 1;
4075
4076 /* Interpolate... */
4077 else {
4078
4079 /* Determine pressure and temperature indices... */
4080 const int ipr =
4081 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4082 const int it0 =
4083 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4084 const int it1 =
4085 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4086 los->t[ip]);
4087
4088 /* Check size of table (temperature and column density)... */
4089 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4090 || tbl->nu[id][ig][ipr][it0] < 2
4091 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4092 || tbl->nu[id][ig][ipr + 1][it1] < 2
4093 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4094 eps = 0;
4095
4096 else {
4097
4098 /* Get emissivities of extended path... */
4099 u = intpol_tbl_u(tbl, ig, id, ipr, it0, 1 - tau_path[id][ig]);
4100 double eps00
4101 = intpol_tbl_eps(tbl, ig, id, ipr, it0, u + los->u[ip][ig]);
4102
4103 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, 1 - tau_path[id][ig]);
4104 double eps01 =
4105 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, u + los->u[ip][ig]);
4106
4107 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, 1 - tau_path[id][ig]);
4108 double eps10 =
4109 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, u + los->u[ip][ig]);
4110
4111 u =
4112 intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, 1 - tau_path[id][ig]);
4113 double eps11 =
4114 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, u + los->u[ip][ig]);
4115
4116 /* Interpolate with respect to temperature... */
4117 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4118 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4119 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4120 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4121
4122 /* Interpolate with respect to pressure... */
4123 eps00 = LIN(tbl->p[id][ig][ipr], eps00,
4124 tbl->p[id][ig][ipr + 1], eps11, los->p[ip]);
4125
4126 /* Check emissivity range... */
4127 eps00 = MAX(MIN(eps00, 1), 0);
4128
4129 /* Determine segment emissivity... */
4130 eps = 1 - (1 - eps00) / tau_path[id][ig];
4131 }
4132 }
4133
4134 /* Get transmittance of extended path... */
4135 tau_path[id][ig] *= (1 - eps);
4136
4137 /* Get segment transmittance... */
4138 tau_seg[id] *= (1 - eps);
4139 }
4140 }
4141}
4142
4143/*****************************************************************************/
4144
4145inline double intpol_tbl_eps(
4146 const tbl_t *tbl,
4147 const int ig,
4148 const int id,
4149 const int ip,
4150 const int it,
4151 const double u) {
4152
4153 const int nu = tbl->nu[id][ig][ip][it];
4154 const float *u_arr = tbl->u[id][ig][ip][it];
4155 const float *eps_arr = tbl->eps[id][ig][ip][it];
4156
4157 const double u_min = u_arr[0];
4158 const double u_max = u_arr[nu - 1];
4159
4160 /* Lower boundary extrapolation... */
4161 if (u < u_min)
4162 return eps_arr[0] * u / u_min;
4163
4164 /* Upper boundary extrapolation... */
4165 if (u > u_max) {
4166 const double a = log(1.0 - eps_arr[nu - 1]) / u_max;
4167 return 1.0 - exp(a * u);
4168 }
4169
4170 /* Interpolation... */
4171 const int idx = locate_tbl(u_arr, nu, u);
4172 return LIN(u_arr[idx], eps_arr[idx], u_arr[idx + 1], eps_arr[idx + 1], u);
4173}
4174
4175/*****************************************************************************/
4176
4177inline double intpol_tbl_u(
4178 const tbl_t *tbl,
4179 const int ig,
4180 const int id,
4181 const int ip,
4182 const int it,
4183 const double eps) {
4184
4185 const int nu = tbl->nu[id][ig][ip][it];
4186 const float *eps_arr = tbl->eps[id][ig][ip][it];
4187 const float *u_arr = tbl->u[id][ig][ip][it];
4188
4189 const double eps_min = eps_arr[0];
4190 const double eps_max = eps_arr[nu - 1];
4191
4192 /* Lower boundary extrapolation... */
4193 if (eps < eps_min)
4194 return u_arr[0] * eps / eps_min;
4195
4196 /* Upper boundary extrapolation... */
4197 if (eps > eps_max) {
4198 const double a = log(1.0 - eps_max) / u_arr[nu - 1];
4199 return log(1.0 - eps) / a;
4200 }
4201
4202 /* Interpolation... */
4203 const int idx = locate_tbl(eps_arr, nu, eps);
4204 return LIN(eps_arr[idx], u_arr[idx], eps_arr[idx + 1], u_arr[idx + 1], eps);
4205}
4206
4207/*****************************************************************************/
4208
4210 const double jsec,
4211 int *year,
4212 int *mon,
4213 int *day,
4214 int *hour,
4215 int *min,
4216 int *sec,
4217 double *remain) {
4218
4219 struct tm t0, *t1;
4220
4221 t0.tm_year = 100;
4222 t0.tm_mon = 0;
4223 t0.tm_mday = 1;
4224 t0.tm_hour = 0;
4225 t0.tm_min = 0;
4226 t0.tm_sec = 0;
4227
4228 time_t jsec0 = (time_t) jsec + timegm(&t0);
4229 t1 = gmtime(&jsec0);
4230
4231 *year = t1->tm_year + 1900;
4232 *mon = t1->tm_mon + 1;
4233 *day = t1->tm_mday;
4234 *hour = t1->tm_hour;
4235 *min = t1->tm_min;
4236 *sec = t1->tm_sec;
4237 *remain = jsec - floor(jsec);
4238}
4239
4240/*****************************************************************************/
4241
4243 const ctl_t *ctl,
4244 const tbl_t *tbl,
4245 atm_t *atm,
4246 obs_t *obs,
4247 gsl_matrix *k) {
4248
4249 int *iqa;
4250
4251 /* Get sizes... */
4252 const size_t m = k->size1;
4253 const size_t n = k->size2;
4254
4255 /* Allocate... */
4256 gsl_vector *x0 = gsl_vector_alloc(n);
4257 gsl_vector *yy0 = gsl_vector_alloc(m);
4258 ALLOC(iqa, int,
4259 N);
4260
4261 /* Compute radiance for undisturbed atmospheric data... */
4262 formod(ctl, tbl, atm, obs);
4263
4264 /* Compose vectors... */
4265 atm2x(ctl, atm, x0, iqa, NULL);
4266 obs2y(ctl, obs, yy0, NULL, NULL);
4267
4268 /* Initialize kernel matrix... */
4269 gsl_matrix_set_zero(k);
4270
4271 /* Loop over state vector elements... */
4272#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4273 for (size_t j = 0; j < n; j++) {
4274
4275 /* Allocate... */
4276 atm_t *atm1;
4277 obs_t *obs1;
4278 ALLOC(atm1, atm_t, 1);
4279 ALLOC(obs1, obs_t, 1);
4280 gsl_vector *x1 = gsl_vector_alloc(n);
4281 gsl_vector *yy1 = gsl_vector_alloc(m);
4282
4283 /* Set perturbation size... */
4284 double h;
4285 if (iqa[j] == IDXP)
4286 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4287 else if (iqa[j] == IDXT)
4288 h = 1.0;
4289 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4290 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4291 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4292 h = 1e-4;
4293 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4294 h = 1.0;
4295 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4296 h = 1e-4;
4297 else if (iqa[j] == IDXSFT)
4298 h = 1.0;
4299 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4300 h = 1e-2;
4301 else
4302 ERRMSG("Cannot set perturbation size!");
4303
4304 /* Disturb state vector element... */
4305 gsl_vector_memcpy(x1, x0);
4306 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4307 copy_atm(ctl, atm1, atm, 0);
4308 copy_obs(ctl, obs1, obs, 0);
4309 x2atm(ctl, x1, atm1);
4310
4311 /* Compute radiance for disturbed atmospheric data... */
4312 formod(ctl, tbl, atm1, obs1);
4313
4314 /* Compose measurement vector for disturbed radiance data... */
4315 obs2y(ctl, obs1, yy1, NULL, NULL);
4316
4317 /* Compute derivatives... */
4318 for (size_t i = 0; i < m; i++)
4319 gsl_matrix_set(k, i, j,
4320 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4321
4322 /* Free... */
4323 gsl_vector_free(x1);
4324 gsl_vector_free(yy1);
4325 free(atm1);
4326 free(obs1);
4327 }
4328
4329 /* Free... */
4330 gsl_vector_free(x0);
4331 gsl_vector_free(yy0);
4332 free(iqa);
4333}
4334
4335/*****************************************************************************/
4336
4338 const double *xx,
4339 const int n,
4340 const double x) {
4341
4342 int ilo = 0;
4343 int ihi = n - 1;
4344 int i = (ihi + ilo) >> 1;
4345
4346 if (xx[i] < xx[i + 1])
4347 while (ihi > ilo + 1) {
4348 i = (ihi + ilo) >> 1;
4349 if (xx[i] > x)
4350 ihi = i;
4351 else
4352 ilo = i;
4353 } else
4354 while (ihi > ilo + 1) {
4355 i = (ihi + ilo) >> 1;
4356 if (xx[i] <= x)
4357 ihi = i;
4358 else
4359 ilo = i;
4360 }
4361
4362 return ilo;
4363}
4364
4365/*****************************************************************************/
4366
4368 const double *xx,
4369 const int n,
4370 const double x) {
4371
4372 /* Calculate index... */
4373 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4374
4375 /* Check range... */
4376 if (i < 0)
4377 return 0;
4378 else if (i > n - 2)
4379 return n - 2;
4380 else
4381 return i;
4382}
4383
4384/*****************************************************************************/
4385
4386inline int locate_tbl(
4387 const float *xx,
4388 const int n,
4389 const double x) {
4390
4391 int ilo = 0;
4392 int ihi = n - 1;
4393 int i = (ihi + ilo) >> 1;
4394
4395 while (ihi > ilo + 1) {
4396 i = (ihi + ilo) >> 1;
4397 if (xx[i] > x)
4398 ihi = i;
4399 else
4400 ilo = i;
4401 }
4402
4403 return ilo;
4404}
4405
4406/*****************************************************************************/
4407
4409 gsl_matrix *a) {
4410
4411 size_t diag = 1;
4412
4413 /* Get size... */
4414 const size_t n = a->size1;
4415
4416 /* Check if matrix is diagonal... */
4417 for (size_t i = 0; i < n && diag; i++)
4418 for (size_t j = i + 1; j < n; j++)
4419 if (gsl_matrix_get(a, i, j) != 0) {
4420 diag = 0;
4421 break;
4422 }
4423
4424 /* Quick inversion of diagonal matrix... */
4425 if (diag)
4426 for (size_t i = 0; i < n; i++)
4427 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4428
4429 /* Matrix inversion by means of Cholesky decomposition... */
4430 else {
4431 gsl_linalg_cholesky_decomp(a);
4432 gsl_linalg_cholesky_invert(a);
4433 }
4434}
4435
4436/*****************************************************************************/
4437
4439 gsl_matrix *a,
4440 gsl_vector *b,
4441 int transpose,
4442 gsl_matrix *c) {
4443
4444 /* Set sizes... */
4445 const size_t m = a->size1;
4446 const size_t n = a->size2;
4447
4448 /* Allocate... */
4449 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4450
4451 /* Compute A^T B A... */
4452 if (transpose == 1) {
4453
4454 /* Compute B^1/2 A... */
4455 for (size_t i = 0; i < m; i++)
4456 for (size_t j = 0; j < n; j++)
4457 gsl_matrix_set(aux, i, j,
4458 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4459
4460 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4461 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4462 }
4463
4464 /* Compute A B A^T... */
4465 else if (transpose == 2) {
4466
4467 /* Compute A B^1/2... */
4468 for (size_t i = 0; i < m; i++)
4469 for (size_t j = 0; j < n; j++)
4470 gsl_matrix_set(aux, i, j,
4471 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4472
4473 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4474 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4475 }
4476
4477 /* Free... */
4478 gsl_matrix_free(aux);
4479}
4480
4481/*****************************************************************************/
4482
4483size_t obs2y(
4484 const ctl_t *ctl,
4485 const obs_t *obs,
4486 gsl_vector *y,
4487 int *ida,
4488 int *ira) {
4489
4490 size_t m = 0;
4491
4492 /* Determine measurement vector... */
4493 for (int ir = 0; ir < obs->nr; ir++)
4494 for (int id = 0; id < ctl->nd; id++)
4495 if (isfinite(obs->rad[id][ir])) {
4496 if (y != NULL)
4497 gsl_vector_set(y, m, obs->rad[id][ir]);
4498 if (ida != NULL)
4499 ida[m] = id;
4500 if (ira != NULL)
4501 ira[m] = ir;
4502 m++;
4503 }
4504
4505 return m;
4506}
4507
4508/*****************************************************************************/
4509
4511 const ctl_t *ctl,
4512 const atm_t *atm,
4513 obs_t *obs,
4514 los_t *los,
4515 const int ir) {
4516
4517 const double h = 0.02, zrefrac = 60;
4518
4519 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4520 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4521
4522 int stop = 0;
4523
4524 /* Initialize... */
4525 los->np = 0;
4526 los->sft = -999;
4527 obs->tpz[ir] = obs->vpz[ir];
4528 obs->tplon[ir] = obs->vplon[ir];
4529 obs->tplat[ir] = obs->vplat[ir];
4530
4531 /* Get altitude range of atmospheric data... */
4532 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4533
4534 /* Ensure that altitude grid includes the local geometric surface... */
4535 if (zmin > 1e-3 || zmin < -1e-3)
4536 ERRMSG("Atmospheric profiles must include surface level (z = 0 km)!");
4537
4538 /* Check observer altitude... */
4539 if (obs->obsz[ir] < zmin)
4540 ERRMSG("Observer below surface!");
4541
4542 /* Check view point altitude... */
4543 if (obs->vpz[ir] > zmax)
4544 return;
4545
4546 /* Determine Cartesian coordinates for observer and view point... */
4547 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
4548 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
4549
4550 /* Determine initial tangent vector... */
4551 for (int i = 0; i < 3; i++)
4552 ex0[i] = xvp[i] - xobs[i];
4553 norm = NORM(ex0);
4554 for (int i = 0; i < 3; i++)
4555 ex0[i] /= norm;
4556
4557 /* Observer within atmosphere... */
4558 for (int i = 0; i < 3; i++)
4559 x[i] = xobs[i];
4560
4561 /* Observer above atmosphere (search entry point)... */
4562 if (obs->obsz[ir] > zmax) {
4563 double dmax = norm, dmin = 0;
4564 while (fabs(dmin - dmax) > 0.001) {
4565 const double d = (dmax + dmin) / 2;
4566 for (int i = 0; i < 3; i++)
4567 x[i] = xobs[i] + d * ex0[i];
4568 cart2geo(x, &z, &lon, &lat);
4569 if (z <= zmax && z > zmax - 0.001)
4570 break;
4571 if (z < zmax - 0.0005)
4572 dmax = d;
4573 else
4574 dmin = d;
4575 }
4576 }
4577
4578 /* Ray-tracing... */
4579 while (1) {
4580
4581 /* Set step length... */
4582 double ds = ctl->rayds;
4583 if (ctl->raydz > 0) {
4584 norm = NORM(x);
4585 for (int i = 0; i < 3; i++)
4586 xh[i] = x[i] / norm;
4587 const double cosa = fabs(DOTP(ex0, xh));
4588 if (cosa != 0)
4589 ds = MIN(ctl->rayds, ctl->raydz / cosa);
4590 }
4591
4592 /* Determine geolocation... */
4593 cart2geo(x, &z, &lon, &lat);
4594
4595 /* Check if LOS hits the ground or has left atmosphere... */
4596 if (z < zmin || z > zmax) {
4597 stop = (z < zmin ? 2 : 1);
4598 const double frac =
4599 ((z <
4600 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
4601 1]);
4602 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
4603 los->lat[los->np - 1], xh);
4604 for (int i = 0; i < 3; i++)
4605 x[i] = xh[i] + frac * (x[i] - xh[i]);
4606 cart2geo(x, &z, &lon, &lat);
4607 los->ds[los->np - 1] = ds * frac;
4608 ds = 0;
4609 }
4610
4611 /* Interpolate atmospheric data... */
4612 intpol_atm(ctl, atm, z, &p, &t, q, k);
4613
4614 /* Save data... */
4615 los->lon[los->np] = lon;
4616 los->lat[los->np] = lat;
4617 los->z[los->np] = z;
4618 los->p[los->np] = p;
4619 los->t[los->np] = t;
4620 for (int ig = 0; ig < ctl->ng; ig++)
4621 los->q[los->np][ig] = q[ig];
4622 for (int id = 0; id < ctl->nd; id++)
4623 los->k[los->np][id] = k[ctl->window[id]];
4624 los->ds[los->np] = ds;
4625
4626 /* Add cloud extinction... */
4627 if (ctl->ncl > 0 && atm->cldz > 0) {
4628 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
4629 for (int id = 0; id < ctl->nd; id++) {
4630 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
4631 los->k[los->np][id]
4632 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
4633 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
4634 }
4635 }
4636
4637 /* Increment and check number of LOS points... */
4638 if ((++los->np) > NLOS)
4639 ERRMSG("Too many LOS points!");
4640
4641 /* Check stop flag... */
4642 if (stop) {
4643
4644 /* Set surface temperature... */
4645 if (ctl->nsf > 0 && atm->sft > 0)
4646 t = atm->sft;
4647 los->sft = (stop == 2 ? t : -999);
4648
4649 /* Set surface emissivity... */
4650 for (int id = 0; id < ctl->nd; id++) {
4651 los->sfeps[id] = 1.0;
4652 if (ctl->nsf > 0) {
4653 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
4654 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
4655 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
4656 ctl->nu[id]);
4657 }
4658 }
4659
4660 /* Leave raytracer... */
4661 break;
4662 }
4663
4664 /* Determine refractivity... */
4665 if (ctl->refrac && z <= zrefrac)
4666 n = 1 + REFRAC(p, t);
4667 else
4668 n = 1;
4669
4670 /* Construct new tangent vector (first term)... */
4671 for (int i = 0; i < 3; i++)
4672 ex1[i] = ex0[i] * n;
4673
4674 /* Compute gradient of refractivity... */
4675 if (ctl->refrac && z <= zrefrac) {
4676 for (int i = 0; i < 3; i++)
4677 xh[i] = x[i] + 0.5 * ds * ex0[i];
4678 cart2geo(xh, &z, &lon, &lat);
4679 intpol_atm(ctl, atm, z, &p, &t, q, k);
4680 n = REFRAC(p, t);
4681 for (int i = 0; i < 3; i++) {
4682 xh[i] += h;
4683 cart2geo(xh, &z, &lon, &lat);
4684 intpol_atm(ctl, atm, z, &p, &t, q, k);
4685 ng[i] = (REFRAC(p, t) - n) / h;
4686 xh[i] -= h;
4687 }
4688 } else
4689 for (int i = 0; i < 3; i++)
4690 ng[i] = 0;
4691
4692 /* Construct new tangent vector (second term)... */
4693 for (int i = 0; i < 3; i++)
4694 ex1[i] += ds * ng[i];
4695
4696 /* Normalize new tangent vector... */
4697 norm = NORM(ex1);
4698 for (int i = 0; i < 3; i++)
4699 ex1[i] /= norm;
4700
4701 /* Determine next point of LOS... */
4702 for (int i = 0; i < 3; i++)
4703 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
4704
4705 /* Copy tangent vector... */
4706 for (int i = 0; i < 3; i++)
4707 ex0[i] = ex1[i];
4708 }
4709
4710 /* Get tangent point (to be done before changing segment lengths!)... */
4711 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
4712
4713 /* Change segment lengths according to trapezoid rule... */
4714 for (int ip = los->np - 1; ip >= 1; ip--)
4715 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
4716 los->ds[0] *= 0.5;
4717
4718 /* Compute column density... */
4719 for (int ip = 0; ip < los->np; ip++)
4720 for (int ig = 0; ig < ctl->ng; ig++)
4721 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
4722 / (KB * los->t[ip]) * los->ds[ip];
4723
4724 /* Compute Curtis-Godson means... */
4725 for (int ig = 0; ig < ctl->ng; ig++) {
4726 los->cgu[0][ig] = los->u[0][ig];
4727 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
4728 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
4729 }
4730 for (int ip = 1; ip < los->np; ip++)
4731 for (int ig = 0; ig < ctl->ng; ig++) {
4732 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
4733 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
4734 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
4735 }
4736 for (int ip = 0; ip < los->np; ip++)
4737 for (int ig = 0; ig < ctl->ng; ig++)
4738 if (los->cgu[ip][ig] != 0) {
4739 los->cgp[ip][ig] /= los->cgu[ip][ig];
4740 los->cgt[ip][ig] /= los->cgu[ip][ig];
4741 }
4742}
4743
4744/*****************************************************************************/
4745
4747 const char *dirname,
4748 const char *filename,
4749 const ctl_t *ctl,
4750 atm_t *atm) {
4751
4752 FILE *in;
4753
4754 char file[LEN], line[LEN], *tok;
4755
4756 /* Init... */
4757 atm->np = 0;
4758
4759 /* Set filename... */
4760 if (dirname != NULL)
4761 sprintf(file, "%s/%s", dirname, filename);
4762 else
4763 sprintf(file, "%s", filename);
4764
4765 /* Write info... */
4766 LOG(1, "Read atmospheric data: %s", file);
4767
4768 /* Open file... */
4769 if (!(in = fopen(file, "r")))
4770 ERRMSG("Cannot open file!");
4771
4772 /* Read line... */
4773 while (fgets(line, LEN, in)) {
4774
4775 /* Read data... */
4776 TOK(line, tok, "%lg", atm->time[atm->np]);
4777 TOK(NULL, tok, "%lg", atm->z[atm->np]);
4778 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
4779 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
4780 TOK(NULL, tok, "%lg", atm->p[atm->np]);
4781 TOK(NULL, tok, "%lg", atm->t[atm->np]);
4782 for (int ig = 0; ig < ctl->ng; ig++)
4783 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
4784 for (int iw = 0; iw < ctl->nw; iw++)
4785 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
4786 if (ctl->ncl > 0 && atm->np == 0) {
4787 TOK(NULL, tok, "%lg", atm->clz);
4788 TOK(NULL, tok, "%lg", atm->cldz);
4789 for (int icl = 0; icl < ctl->ncl; icl++)
4790 TOK(NULL, tok, "%lg", atm->clk[icl]);
4791 }
4792 if (ctl->nsf > 0 && atm->np == 0) {
4793 TOK(NULL, tok, "%lg", atm->sft);
4794 for (int isf = 0; isf < ctl->nsf; isf++)
4795 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
4796 }
4797
4798 /* Increment data point counter... */
4799 if ((++atm->np) > NP)
4800 ERRMSG("Too many data points!");
4801 }
4802
4803 /* Close file... */
4804 fclose(in);
4805
4806 /* Check number of points... */
4807 if (atm->np < 1)
4808 ERRMSG("Could not read any data!");
4809
4810 /* Write info... */
4811 double mini, maxi;
4812 LOG(2, "Number of data points: %d", atm->np);
4813 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
4814 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
4815 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
4816 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
4817 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
4818 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
4819 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
4820 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
4821 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
4822 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
4823 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
4824 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
4825 for (int ig = 0; ig < ctl->ng; ig++) {
4826 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
4827 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
4828 }
4829 for (int iw = 0; iw < ctl->nw; iw++) {
4830 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
4831 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
4832 }
4833 if (ctl->ncl > 0 && atm->np == 0) {
4834 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
4835 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
4836 } else
4837 LOG(2, "Cloud layer: none");
4838 if (ctl->nsf > 0 && atm->np == 0) {
4839 LOG(2,
4840 "Surface layer: T_s = %g K | eps= %g ... %g",
4841 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
4842 } else
4843 LOG(2, "Surface layer: none");
4844}
4845
4846/*****************************************************************************/
4847
4849 int argc,
4850 char *argv[],
4851 ctl_t *ctl) {
4852
4853 /* Write info... */
4854 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
4855 "(executable: %s | version: %s | compiled: %s, %s)\n",
4856 argv[0], VERSION, __DATE__, __TIME__);
4857
4858 /* Emitters... */
4859 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
4860 if (ctl->ng < 0 || ctl->ng > NG)
4861 ERRMSG("Set 0 <= NG <= MAX!");
4862 for (int ig = 0; ig < ctl->ng; ig++)
4863 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
4864 ctl->ig_co2 = find_emitter(ctl, "CO2");
4865 ctl->ig_h2o = find_emitter(ctl, "H2O");
4866 ctl->ig_n2 = find_emitter(ctl, "N2");
4867 ctl->ig_o2 = find_emitter(ctl, "O2");
4868
4869 /* Radiance channels... */
4870 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
4871 if (ctl->nd < 0 || ctl->nd > ND)
4872 ERRMSG("Set 0 <= ND <= MAX!");
4873 for (int id = 0; id < ctl->nd; id++)
4874 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
4875
4876 /* Spectral windows... */
4877 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
4878 if (ctl->nw < 0 || ctl->nw > NW)
4879 ERRMSG("Set 0 <= NW <= MAX!");
4880 for (int id = 0; id < ctl->nd; id++)
4881 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
4882
4883 /* Cloud data... */
4884 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
4885 if (ctl->ncl < 0 || ctl->ncl > NCL)
4886 ERRMSG("Set 0 <= NCL <= MAX!");
4887 if (ctl->ncl == 1)
4888 ERRMSG("Set NCL > 1!");
4889 for (int icl = 0; icl < ctl->ncl; icl++)
4890 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
4891
4892 /* Surface data... */
4893 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
4894 if (ctl->nsf < 0 || ctl->nsf > NSF)
4895 ERRMSG("Set 0 <= NSF <= MAX!");
4896 if (ctl->nsf == 1)
4897 ERRMSG("Set NSF > 1!");
4898 for (int isf = 0; isf < ctl->nsf; isf++)
4899 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
4900 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
4901 if (ctl->sftype < 0 || ctl->sftype > 3)
4902 ERRMSG("Set 0 <= SFTYPE <= 3!");
4903 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
4904
4905 /* Emissivity look-up tables... */
4906 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
4907 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
4908
4909 /* Hydrostatic equilibrium... */
4910 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
4911
4912 /* Continua... */
4913 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
4914 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
4915 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
4916 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
4917
4918 /* Ray-tracing... */
4919 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
4920 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
4921 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
4922
4923 /* Field of view... */
4924 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
4925 if (ctl->fov[0] != '-')
4926 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
4927
4928 /* Retrieval interface... */
4929 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
4930 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
4931 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
4932 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
4933 for (int ig = 0; ig < ctl->ng; ig++) {
4934 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
4935 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
4936 }
4937 for (int iw = 0; iw < ctl->nw; iw++) {
4938 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
4939 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
4940 }
4941 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
4942 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
4943 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
4944 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
4945 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
4946
4947 /* Output flags... */
4948 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
4949 ctl->write_matrix =
4950 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
4951
4952 /* External forward models... */
4953 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
4954 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
4955 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
4956 for (int ig = 0; ig < ctl->ng; ig++)
4957 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
4958}
4959
4960/*****************************************************************************/
4961
4963 const char *dirname,
4964 const char *filename,
4965 gsl_matrix *matrix) {
4966
4967 FILE *in;
4968
4969 char dum[LEN], file[LEN], line[LEN];
4970
4971 double value;
4972
4973 int i, j;
4974
4975 /* Set filename... */
4976 if (dirname != NULL)
4977 sprintf(file, "%s/%s", dirname, filename);
4978 else
4979 sprintf(file, "%s", filename);
4980
4981 /* Write info... */
4982 LOG(1, "Read matrix: %s", file);
4983
4984 /* Open file... */
4985 if (!(in = fopen(file, "r")))
4986 ERRMSG("Cannot open file!");
4987
4988 /* Read data... */
4989 gsl_matrix_set_zero(matrix);
4990 while (fgets(line, LEN, in))
4991 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
4992 &i, dum, dum, dum, dum, dum,
4993 &j, dum, dum, dum, dum, dum, &value) == 13)
4994 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
4995
4996 /* Close file... */
4997 fclose(in);
4998}
4999
5000/*****************************************************************************/
5001
5003 const char *dirname,
5004 const char *filename,
5005 const ctl_t *ctl,
5006 obs_t *obs) {
5007
5008 FILE *in;
5009
5010 char file[LEN], line[LEN], *tok;
5011
5012 /* Init... */
5013 obs->nr = 0;
5014
5015 /* Set filename... */
5016 if (dirname != NULL)
5017 sprintf(file, "%s/%s", dirname, filename);
5018 else
5019 sprintf(file, "%s", filename);
5020
5021 /* Write info... */
5022 LOG(1, "Read observation data: %s", file);
5023
5024 /* Open file... */
5025 if (!(in = fopen(file, "r")))
5026 ERRMSG("Cannot open file!");
5027
5028 /* Read line... */
5029 while (fgets(line, LEN, in)) {
5030
5031 /* Read data... */
5032 TOK(line, tok, "%lg", obs->time[obs->nr]);
5033 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5034 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5035 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5036 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5037 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5038 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5039 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5040 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5041 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5042 for (int id = 0; id < ctl->nd; id++)
5043 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5044 for (int id = 0; id < ctl->nd; id++)
5045 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5046
5047 /* Increment counter... */
5048 if ((++obs->nr) > NR)
5049 ERRMSG("Too many rays!");
5050 }
5051
5052 /* Close file... */
5053 fclose(in);
5054
5055 /* Check number of points... */
5056 if (obs->nr < 1)
5057 ERRMSG("Could not read any data!");
5058
5059 /* Write info... */
5060 double mini, maxi;
5061 LOG(2, "Number of ray paths: %d", obs->nr);
5062 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5063 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5064 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5065 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5066 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5067 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5068 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5069 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5070 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5071 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5072 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5073 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5074 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5075 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5076 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5077 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5078 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5079 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5080 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5081 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5082 for (int id = 0; id < ctl->nd; id++) {
5083 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5084 if (ctl->write_bbt) {
5085 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5086 ctl->nu[id], mini, maxi);
5087 } else {
5088 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5089 ctl->nu[id], mini, maxi);
5090 }
5091 }
5092 for (int id = 0; id < ctl->nd; id++) {
5093 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5094 if (ctl->write_bbt) {
5095 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5096 ctl->nu[id], mini, maxi);
5097 }
5098 }
5099}
5100
5101/*****************************************************************************/
5102
5104 const char *basename,
5105 const double z,
5106 double *nu,
5107 double *f,
5108 int n) {
5109
5110 FILE *in;
5111
5112 char filename[LEN];
5113
5114 double filt, fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
5115
5116 int npts;
5117
5118 /* Allocate... */
5119 ALLOC(nurfm, double,
5120 RFMNPTS);
5121 ALLOC(rad, double,
5122 RFMNPTS);
5123
5124 /* Search RFM spectrum... */
5125 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
5126 if (!(in = fopen(filename, "r"))) {
5127 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
5128 if (!(in = fopen(filename, "r")))
5129 ERRMSG("Cannot find RFM data file!");
5130 }
5131 fclose(in);
5132
5133 /* Read RFM spectrum... */
5134 read_rfm_spec(filename, nurfm, rad, &npts);
5135
5136 /* Set wavenumbers... */
5137 nu2[0] = nu[0];
5138 nu2[n - 1] = nu[n - 1];
5139 for (int i = 1; i < n - 1; i++)
5140 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
5141
5142 /* Convolute... */
5143 for (int ipts = 0; ipts < npts; ipts++)
5144 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
5145 const int idx = locate_irr(nu2, n, nurfm[ipts]);
5146 filt = LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
5147 fsum += filt;
5148 radsum += filt * rad[ipts];
5149 }
5150
5151 /* Free... */
5152 free(nurfm);
5153 free(rad);
5154
5155 /* Return radiance... */
5156 return radsum / fsum;
5157}
5158
5159/*****************************************************************************/
5160
5162 int argc,
5163 char *argv[],
5164 ctl_t *ctl,
5165 ret_t *ret) {
5166
5167 /* Iteration control... */
5168 ret->kernel_recomp =
5169 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
5170 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
5171 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
5172
5173 /* Error analysis... */
5174 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "1", NULL);
5175
5176 for (int id = 0; id < ctl->nd; id++)
5177 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
5178
5179 for (int id = 0; id < ctl->nd; id++)
5180 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
5181
5182 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
5183 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
5184 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
5185
5186 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
5187 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
5188 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
5189
5190 for (int ig = 0; ig < ctl->ng; ig++) {
5191 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
5192 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
5193 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
5194 }
5195
5196 for (int iw = 0; iw < ctl->nw; iw++) {
5197 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
5198 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
5199 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
5200 }
5201
5202 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
5203 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
5204 for (int icl = 0; icl < ctl->ncl; icl++)
5205 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
5206
5207 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
5208 for (int isf = 0; isf < ctl->nsf; isf++)
5209 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
5210}
5211
5212/*****************************************************************************/
5213
5215 const char *filename,
5216 double *nu,
5217 double *rad,
5218 int *npts) {
5219
5220 FILE *in;
5221
5222 char *line = NULL, *tok;
5223
5224 size_t line_buf_size = 0;
5225
5226 double dnu, nu0, nu1;
5227
5228 int ipts = 0;
5229
5230 /* Write info... */
5231 LOG(1, "Read RFM data: %s", filename);
5232
5233 /* Open file... */
5234 if (!(in = fopen(filename, "r")))
5235 ERRMSG("Cannot open file!");
5236
5237 /* Read header... */
5238 for (int i = 0; i < 4; i++)
5239 if (getline(&line, &line_buf_size, in) == -1)
5240 ERRMSG("Error while reading file header!");
5241 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
5242 ERRMSG("Invalid spectrum header format!");
5243
5244 /* Check number of spectral grid points... */
5245 if (*npts > RFMNPTS)
5246 ERRMSG("Too many spectral grid points!");
5247
5248 /* Read radiance data... */
5249 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
5250 tok = strtok(line, " \t\n");
5251 while (tok != NULL && ipts < *npts) {
5252 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
5253 ipts++;
5254 tok = strtok(NULL, " \t\n");
5255 }
5256 }
5257
5258 /* Check number of spectral grid points... */
5259 if (ipts != *npts)
5260 ERRMSG("Error while reading RFM data!");
5261
5262 /* Compute wavenumbers... */
5263 for (ipts = 0; ipts < *npts; ipts++)
5264 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
5265
5266 /* Close file... */
5267 fclose(in);
5268
5269 /* Free.. */
5270 free(line);
5271}
5272
5273/*****************************************************************************/
5274
5276 const char *filename,
5277 double *x,
5278 double *y,
5279 int *n) {
5280
5281 FILE *in;
5282
5283 char line[LEN];
5284
5285 /* Write info... */
5286 LOG(1, "Read shape function: %s", filename);
5287
5288 /* Open file... */
5289 if (!(in = fopen(filename, "r")))
5290 ERRMSG("Cannot open file!");
5291
5292 /* Read data... */
5293 *n = 0;
5294 while (fgets(line, LEN, in))
5295 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
5296 if ((++(*n)) > NSHAPE)
5297 ERRMSG("Too many data points!");
5298
5299 /* Close file... */
5300 fclose(in);
5301
5302 /* Check number of data points... */
5303 if (*n < 2)
5304 ERRMSG("Could not read any data!");
5305
5306 /* Write info... */
5307 double mini, maxi;
5308 LOG(2, "Number of data points: %d", *n);
5309 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
5310 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
5311 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
5312 LOG(2, "Range of y values: %g ... %g", mini, maxi);
5313}
5314
5315/*****************************************************************************/
5316
5318 const ctl_t *ctl) {
5319
5320 FILE *in;
5321
5322 char filename[2 * LEN], line[LEN];
5323
5324 double eps, press, temp, u;
5325
5326 /* Allocate... */
5327 tbl_t *tbl;
5328 ALLOC(tbl, tbl_t, 1);
5329
5330 /* Loop over trace gases and channels... */
5331 for (int id = 0; id < ctl->nd; id++)
5332 for (int ig = 0; ig < ctl->ng; ig++) {
5333
5334 /* Initialize... */
5335 tbl->np[id][ig] = -1;
5336 double eps_old = -999;
5337 double press_old = -999;
5338 double temp_old = -999;
5339 double u_old = -999;
5340 int nrange = 0;
5341
5342 /* Set filename... */
5343 sprintf(filename, "%s_%.4f_%s.%s", ctl->tblbase,
5344 ctl->nu[id], ctl->emitter[ig],
5345 ctl->tblfmt == 1 ? "tab" : "bin");
5346
5347 /* Write info... */
5348 LOG(1, "Read emissivity table: %s", filename);
5349
5350 /* Try to open file... */
5351 if (!(in = fopen(filename, "r"))) {
5352 WARN("Missing emissivity table: %s", filename);
5353 continue;
5354 }
5355
5356 /* Read ASCII tables... */
5357 if (ctl->tblfmt == 1) {
5358
5359 /* Read data... */
5360 while (fgets(line, LEN, in)) {
5361
5362 /* Parse line... */
5363 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
5364 continue;
5365
5366 /* Check ranges... */
5367 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
5368 nrange++;
5369 continue;
5370 }
5371
5372 /* Determine pressure index... */
5373 if (press != press_old) {
5374 press_old = press;
5375 if ((++tbl->np[id][ig]) >= TBLNP)
5376 ERRMSG("Too many pressure levels!");
5377 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
5378 }
5379
5380 /* Determine temperature index... */
5381 if (temp != temp_old) {
5382 temp_old = temp;
5383 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
5384 ERRMSG("Too many temperatures!");
5385 tbl->nu[id][ig][tbl->np[id][ig]]
5386 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
5387 }
5388
5389 /* Determine column density index... */
5390 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
5391 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
5392 eps_old = eps;
5393 u_old = u;
5394 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
5395 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
5396 ERRMSG("Too many column densities!");
5397 }
5398
5399 /* Store data... */
5400 tbl->p[id][ig][tbl->np[id][ig]] = press;
5401 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5402 = temp;
5403 tbl->u[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5404 [tbl->nu[id][ig][tbl->np[id][ig]]
5405 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) u;
5406 tbl->eps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5407 [tbl->nu[id][ig][tbl->np[id][ig]]
5408 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) eps;
5409 }
5410
5411 /* Increment counters... */
5412 tbl->np[id][ig]++;
5413 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
5414 tbl->nt[id][ig][ip]++;
5415 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
5416 tbl->nu[id][ig][ip][it]++;
5417 }
5418 }
5419
5420 /* Read binary data... */
5421 else if (ctl->tblfmt == 2) {
5422
5423 /* Read data... */
5424 FREAD(&tbl->np[id][ig], int,
5425 1,
5426 in);
5427 if (tbl->np[id][ig] > TBLNP)
5428 ERRMSG("Too many pressure levels!");
5429 FREAD(tbl->p[id][ig], double,
5430 (size_t) tbl->np[id][ig],
5431 in);
5432 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
5433 FREAD(&tbl->nt[id][ig][ip], int,
5434 1,
5435 in);
5436 if (tbl->nt[id][ig][ip] > TBLNT)
5437 ERRMSG("Too many temperatures!");
5438 FREAD(tbl->t[id][ig][ip], double,
5439 (size_t) tbl->nt[id][ig][ip],
5440 in);
5441 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
5442 FREAD(&tbl->nu[id][ig][ip][it], int,
5443 1,
5444 in);
5445 if (tbl->nu[id][ig][ip][it] > TBLNU)
5446 ERRMSG("Too many column densities!");
5447 FREAD(tbl->u[id][ig][ip][it], float,
5448 (size_t) tbl->nu[id][ig][ip][it],
5449 in);
5450 FREAD(tbl->eps[id][ig][ip][it], float,
5451 (size_t) tbl->nu[id][ig][ip][it],
5452 in);
5453 }
5454 }
5455 }
5456
5457 /* Error message... */
5458 else
5459 ERRMSG("Unknown look-up table format!");
5460
5461 /* Check ranges... */
5462 if (nrange > 0)
5463 WARN("Column density or emissivity out of range (%d data points)!",
5464 nrange);
5465
5466 /* Close file... */
5467 fclose(in);
5468
5469 /* Write info... */
5470 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
5471 LOG(2,
5472 "p[%2d]= %.5e hPa | T[0:%2d]= %.2f ... %.2f K | u[0:%3d]= %.5e ... %.5e molec/cm^2 | eps[0:%3d]= %.5e ... %.5e",
5473 ip, tbl->p[id][ig][ip], tbl->nt[id][ig][ip] - 1,
5474 tbl->t[id][ig][ip][0],
5475 tbl->t[id][ig][ip][tbl->nt[id][ig][ip] - 1],
5476 tbl->nu[id][ig][ip][0] - 1, tbl->u[id][ig][ip][0][0],
5477 tbl->u[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1],
5478 tbl->nu[id][ig][ip][0] - 1, tbl->eps[id][ig][ip][0][0],
5479 tbl->eps[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1]);
5480 }
5481
5482 /* Initialize source function... */
5483 init_srcfunc(ctl, tbl);
5484
5485 /* Return pointer... */
5486 return tbl;
5487}
5488
5489/*****************************************************************************/
5490
5492 int argc,
5493 char *argv[],
5494 const char *varname,
5495 const int arridx,
5496 const char *defvalue,
5497 char *value) {
5498
5499 FILE *in = NULL;
5500
5501 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
5502 rvarname[LEN], rval[LEN];
5503
5504 int contain = 0;
5505
5506 /* Open file... */
5507 if (argv[1][0] != '-')
5508 if (!(in = fopen(argv[1], "r")))
5509 ERRMSG("Cannot open file!");
5510
5511 /* Set full variable name... */
5512 if (arridx >= 0) {
5513 sprintf(fullname1, "%s[%d]", varname, arridx);
5514 sprintf(fullname2, "%s[*]", varname);
5515 } else {
5516 sprintf(fullname1, "%s", varname);
5517 sprintf(fullname2, "%s", varname);
5518 }
5519
5520 /* Read data... */
5521 if (in != NULL)
5522 while (fgets(line, LEN, in))
5523 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
5524 if (strcasecmp(rvarname, fullname1) == 0 ||
5525 strcasecmp(rvarname, fullname2) == 0) {
5526 contain = 1;
5527 break;
5528 }
5529 for (int i = 1; i < argc - 1; i++)
5530 if (strcasecmp(argv[i], fullname1) == 0 ||
5531 strcasecmp(argv[i], fullname2) == 0) {
5532 sprintf(rval, "%s", argv[i + 1]);
5533 contain = 1;
5534 break;
5535 }
5536
5537 /* Close file... */
5538 if (in != NULL)
5539 fclose(in);
5540
5541 /* Check for missing variables... */
5542 if (!contain) {
5543 if (strlen(defvalue) > 0)
5544 sprintf(rval, "%s", defvalue);
5545 else
5546 ERRMSG("Missing variable %s!\n", fullname1);
5547 }
5548
5549 /* Write info... */
5550 LOG(1, "%s = %s", fullname1, rval);
5551
5552 /* Return values... */
5553 if (value != NULL)
5554 sprintf(value, "%s", rval);
5555 return atof(rval);
5556}
5557
5558/*****************************************************************************/
5559
5560double sza(
5561 const double sec,
5562 const double lon,
5563 const double lat) {
5564
5565 /* Number of days and fraction with respect to 2000-01-01T12:00Z... */
5566 const double D = sec / 86400 - 0.5;
5567
5568 /* Geocentric apparent ecliptic longitude [rad]... */
5569 const double g = DEG2RAD(357.529 + 0.98560028 * D);
5570 const double q = 280.459 + 0.98564736 * D;
5571 const double L = DEG2RAD(q + 1.915 * sin(g) + 0.020 * sin(2 * g));
5572
5573 /* Mean obliquity of the ecliptic [rad]... */
5574 const double e = DEG2RAD(23.439 - 0.00000036 * D);
5575
5576 /* Declination [rad]... */
5577 const double dec = asin(sin(e) * sin(L));
5578
5579 /* Right ascension [rad]... */
5580 const double ra = atan2(cos(e) * sin(L), cos(L));
5581
5582 /* Greenwich Mean Sidereal Time [h]... */
5583 const double GMST = 18.697374558 + 24.06570982441908 * D;
5584
5585 /* Local Sidereal Time [h]... */
5586 const double LST = GMST + lon / 15;
5587
5588 /* Hour angle [rad]... */
5589 const double h = LST / 12 * M_PI - ra;
5590
5591 /* Convert latitude... */
5592 const double latr = DEG2RAD(lat);
5593
5594 /* Return solar zenith angle [deg]... */
5595 return RAD2DEG(acos(sin(latr) * sin(dec) + cos(latr) * cos(dec) * cos(h)));
5596}
5597
5598/*****************************************************************************/
5599
5601 ret_t *ret,
5602 ctl_t *ctl,
5603 atm_t *atm,
5604 int *iqa,
5605 int *ipa,
5606 gsl_matrix *s_a) {
5607
5608 /* Get sizes... */
5609 const size_t n = s_a->size1;
5610
5611 /* Allocate... */
5612 gsl_vector *x_a = gsl_vector_alloc(n);
5613
5614 /* Get sigma vector... */
5615 atm2x(ctl, atm, x_a, NULL, NULL);
5616 for (size_t i = 0; i < n; i++) {
5617 if (iqa[i] == IDXP)
5618 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
5619 if (iqa[i] == IDXT)
5620 gsl_vector_set(x_a, i, ret->err_temp);
5621 for (int ig = 0; ig < ctl->ng; ig++)
5622 if (iqa[i] == IDXQ(ig))
5623 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
5624 for (int iw = 0; iw < ctl->nw; iw++)
5625 if (iqa[i] == IDXK(iw))
5626 gsl_vector_set(x_a, i, ret->err_k[iw]);
5627 if (iqa[i] == IDXCLZ)
5628 gsl_vector_set(x_a, i, ret->err_clz);
5629 if (iqa[i] == IDXCLDZ)
5630 gsl_vector_set(x_a, i, ret->err_cldz);
5631 for (int icl = 0; icl < ctl->ncl; icl++)
5632 if (iqa[i] == IDXCLK(icl))
5633 gsl_vector_set(x_a, i, ret->err_clk[icl]);
5634 if (iqa[i] == IDXSFT)
5635 gsl_vector_set(x_a, i, ret->err_sft);
5636 for (int isf = 0; isf < ctl->nsf; isf++)
5637 if (iqa[i] == IDXSFEPS(isf))
5638 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
5639 }
5640
5641 /* Check standard deviations... */
5642 for (size_t i = 0; i < n; i++)
5643 if (POW2(gsl_vector_get(x_a, i)) <= 0)
5644 ERRMSG("Check a priori data (zero standard deviation)!");
5645
5646 /* Initialize diagonal covariance... */
5647 gsl_matrix_set_zero(s_a);
5648 for (size_t i = 0; i < n; i++)
5649 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
5650
5651 /* Loop over matrix elements... */
5652 for (size_t i = 0; i < n; i++)
5653 for (size_t j = 0; j < n; j++)
5654 if (i != j && iqa[i] == iqa[j]) {
5655
5656 /* Initialize... */
5657 double cz = 0;
5658 double ch = 0;
5659
5660 /* Set correlation lengths for pressure... */
5661 if (iqa[i] == IDXP) {
5662 cz = ret->err_press_cz;
5663 ch = ret->err_press_ch;
5664 }
5665
5666 /* Set correlation lengths for temperature... */
5667 if (iqa[i] == IDXT) {
5668 cz = ret->err_temp_cz;
5669 ch = ret->err_temp_ch;
5670 }
5671
5672 /* Set correlation lengths for volume mixing ratios... */
5673 for (int ig = 0; ig < ctl->ng; ig++)
5674 if (iqa[i] == IDXQ(ig)) {
5675 cz = ret->err_q_cz[ig];
5676 ch = ret->err_q_ch[ig];
5677 }
5678
5679 /* Set correlation lengths for extinction... */
5680 for (int iw = 0; iw < ctl->nw; iw++)
5681 if (iqa[i] == IDXK(iw)) {
5682 cz = ret->err_k_cz[iw];
5683 ch = ret->err_k_ch[iw];
5684 }
5685
5686 /* Compute correlations... */
5687 if (cz > 0 && ch > 0) {
5688
5689 /* Get Cartesian coordinates... */
5690 double x0[3], x1[3];
5691 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
5692 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
5693
5694 /* Compute correlations... */
5695 const double rho =
5696 exp(-DIST(x0, x1) / ch -
5697 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
5698
5699 /* Set covariance... */
5700 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
5701 * gsl_vector_get(x_a, j) * rho);
5702 }
5703 }
5704
5705 /* Free... */
5706 gsl_vector_free(x_a);
5707}
5708
5709/*****************************************************************************/
5710
5712 ret_t *ret,
5713 ctl_t *ctl,
5714 obs_t *obs,
5715 gsl_vector *sig_noise,
5716 gsl_vector *sig_formod,
5717 gsl_vector *sig_eps_inv) {
5718
5719 static obs_t obs_err;
5720
5721 /* Get size... */
5722 const size_t m = sig_eps_inv->size;
5723
5724 /* Noise error (always considered in retrieval fit)... */
5725 copy_obs(ctl, &obs_err, obs, 1);
5726 for (int ir = 0; ir < obs_err.nr; ir++)
5727 for (int id = 0; id < ctl->nd; id++)
5728 obs_err.rad[id][ir]
5729 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
5730 obs2y(ctl, &obs_err, sig_noise, NULL, NULL);
5731
5732 /* Forward model error (always considered in retrieval fit)... */
5733 copy_obs(ctl, &obs_err, obs, 1);
5734 for (int ir = 0; ir < obs_err.nr; ir++)
5735 for (int id = 0; id < ctl->nd; id++)
5736 obs_err.rad[id][ir]
5737 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
5738 obs2y(ctl, &obs_err, sig_formod, NULL, NULL);
5739
5740 /* Total error... */
5741 for (size_t i = 0; i < m; i++)
5742 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
5743 +
5744 POW2(gsl_vector_get
5745 (sig_formod, i))));
5746
5747 /* Check standard deviations... */
5748 for (size_t i = 0; i < m; i++)
5749 if (gsl_vector_get(sig_eps_inv, i) <= 0)
5750 ERRMSG("Check measurement errors (zero standard deviation)!");
5751}
5752
5753/*****************************************************************************/
5754
5756 const los_t *los,
5757 double *tpz,
5758 double *tplon,
5759 double *tplat) {
5760
5761 double dummy, v[3], v0[3], v2[3];
5762
5763 /* Find minimum altitude... */
5764 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
5765
5766 /* Nadir or zenith... */
5767 if (ip <= 0 || ip >= (size_t) los->np - 1) {
5768 *tpz = los->z[los->np - 1];
5769 *tplon = los->lon[los->np - 1];
5770 *tplat = los->lat[los->np - 1];
5771 }
5772
5773 /* Limb... */
5774 else {
5775
5776 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
5777 const double yy0 = los->z[ip - 1];
5778 const double yy1 = los->z[ip];
5779 const double yy2 = los->z[ip + 1];
5780 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
5781 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
5782 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
5783 const double b = -(yy0 - yy1) / x1 - a * x1;
5784 const double c = yy0;
5785
5786 /* Get tangent point location... */
5787 const double x = -b / (2 * a);
5788 *tpz = a * x * x + b * x + c;
5789 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
5790 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
5791 for (int i = 0; i < 3; i++)
5792 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
5793 cart2geo(v, &dummy, tplon, tplat);
5794 }
5795}
5796
5797/*****************************************************************************/
5798
5800 const int year,
5801 const int mon,
5802 const int day,
5803 const int hour,
5804 const int min,
5805 const int sec,
5806 const double remain,
5807 double *jsec) {
5808
5809 struct tm t0, t1;
5810
5811 t0.tm_year = 100;
5812 t0.tm_mon = 0;
5813 t0.tm_mday = 1;
5814 t0.tm_hour = 0;
5815 t0.tm_min = 0;
5816 t0.tm_sec = 0;
5817
5818 t1.tm_year = year - 1900;
5819 t1.tm_mon = mon - 1;
5820 t1.tm_mday = day;
5821 t1.tm_hour = hour;
5822 t1.tm_min = min;
5823 t1.tm_sec = sec;
5824
5825 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
5826}
5827
5828/*****************************************************************************/
5829
5831 const char *name,
5832 const char *file,
5833 const char *func,
5834 int line,
5835 int mode) {
5836
5837 static double w0[10];
5838
5839 static int l0[10], nt;
5840
5841 /* Start new timer... */
5842 if (mode == 1) {
5843 w0[nt] = omp_get_wtime();
5844 l0[nt] = line;
5845 if ((++nt) >= 10)
5846 ERRMSG("Too many timers!");
5847 }
5848
5849 /* Write elapsed time... */
5850 else {
5851
5852 /* Check timer index... */
5853 if (nt - 1 < 0)
5854 ERRMSG("Coding error!");
5855
5856 /* Write elapsed time... */
5857 LOG(1, "Timer '%s' (%s, %s, l%d-%d): %.3f sec",
5858 name, file, func, l0[nt - 1], line, omp_get_wtime() - w0[nt - 1]);
5859 }
5860
5861 /* Stop timer... */
5862 if (mode == 3)
5863 nt--;
5864}
5865
5866/*****************************************************************************/
5867
5869 const char *dirname,
5870 const char *filename,
5871 const ctl_t *ctl,
5872 const atm_t *atm) {
5873
5874 FILE *out;
5875
5876 char file[LEN];
5877
5878 int n = 6;
5879
5880 /* Set filename... */
5881 if (dirname != NULL)
5882 sprintf(file, "%s/%s", dirname, filename);
5883 else
5884 sprintf(file, "%s", filename);
5885
5886 /* Write info... */
5887 LOG(1, "Write atmospheric data: %s", file);
5888
5889 /* Create file... */
5890 if (!(out = fopen(file, "w")))
5891 ERRMSG("Cannot create file!");
5892
5893 /* Write header... */
5894 fprintf(out,
5895 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
5896 "# $2 = altitude [km]\n"
5897 "# $3 = longitude [deg]\n"
5898 "# $4 = latitude [deg]\n"
5899 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
5900 for (int ig = 0; ig < ctl->ng; ig++)
5901 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
5902 ++n, ctl->emitter[ig]);
5903 for (int iw = 0; iw < ctl->nw; iw++)
5904 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
5905 if (ctl->ncl > 0) {
5906 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
5907 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
5908 for (int icl = 0; icl < ctl->ncl; icl++)
5909 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
5910 ++n, ctl->clnu[icl]);
5911 }
5912 if (ctl->nsf > 0) {
5913 fprintf(out, "# $%d = surface layer height [km]\n", ++n);
5914 fprintf(out, "# $%d = surface layer pressure [hPa]\n", ++n);
5915 fprintf(out, "# $%d = surface layer temperature [K]\n", ++n);
5916 for (int isf = 0; isf < ctl->nsf; isf++)
5917 fprintf(out, "# $%d = surface layer emissivity (%.4f cm^-1)\n",
5918 ++n, ctl->sfnu[isf]);
5919 }
5920
5921 /* Write data... */
5922 for (int ip = 0; ip < atm->np; ip++) {
5923 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
5924 fprintf(out, "\n");
5925 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
5926 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
5927 for (int ig = 0; ig < ctl->ng; ig++)
5928 fprintf(out, " %g", atm->q[ig][ip]);
5929 for (int iw = 0; iw < ctl->nw; iw++)
5930 fprintf(out, " %g", atm->k[iw][ip]);
5931 if (ctl->ncl > 0) {
5932 fprintf(out, " %g %g", atm->clz, atm->cldz);
5933 for (int icl = 0; icl < ctl->ncl; icl++)
5934 fprintf(out, " %g", atm->clk[icl]);
5935 }
5936 if (ctl->nsf > 0) {
5937 fprintf(out, " %g", atm->sft);
5938 for (int isf = 0; isf < ctl->nsf; isf++)
5939 fprintf(out, " %g", atm->sfeps[isf]);
5940 }
5941 fprintf(out, "\n");
5942 }
5943
5944 /* Close file... */
5945 fclose(out);
5946
5947 /* Write info... */
5948 double mini, maxi;
5949 LOG(2, "Number of data points: %d", atm->np);
5950 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5951 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5952 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5953 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5954 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5955 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5956 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5957 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5958 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5959 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5960 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5961 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5962 for (int ig = 0; ig < ctl->ng; ig++) {
5963 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5964 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5965 }
5966 for (int iw = 0; iw < ctl->nw; iw++) {
5967 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5968 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5969 }
5970 if (ctl->ncl > 0 && atm->np == 0) {
5971 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5972 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5973 } else
5974 LOG(2, "Cloud layer: none");
5975 if (ctl->nsf > 0 && atm->np == 0) {
5976 LOG(2,
5977 "Surface layer: T_s = %g K | eps= %g ... %g",
5978 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5979 } else
5980 LOG(2, "Surface layer: none");
5981}
5982
5983/*****************************************************************************/
5984
5986 const char *filename,
5987 const ctl_t *ctl,
5988 const atm_t *atm) {
5989
5990 FILE *out;
5991
5992 /* Write info... */
5993 LOG(1, "Write RFM data: %s", filename);
5994
5995 /* Create file... */
5996 if (!(out = fopen(filename, "w")))
5997 ERRMSG("Cannot create file!");
5998
5999 /* Write data... */
6000 fprintf(out, "%d\n", atm->np);
6001 fprintf(out, "*HGT [km]\n");
6002 for (int ip = 0; ip < atm->np; ip++)
6003 fprintf(out, "%g\n", atm->z[ip]);
6004 fprintf(out, "*PRE [mb]\n");
6005 for (int ip = 0; ip < atm->np; ip++)
6006 fprintf(out, "%g\n", atm->p[ip]);
6007 fprintf(out, "*TEM [K]\n");
6008 for (int ip = 0; ip < atm->np; ip++)
6009 fprintf(out, "%g\n", atm->t[ip]);
6010 for (int ig = 0; ig < ctl->ng; ig++) {
6011 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
6012 for (int ip = 0; ip < atm->np; ip++)
6013 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
6014 }
6015 fprintf(out, "*END\n");
6016
6017 /* Close file... */
6018 fclose(out);
6019}
6020
6021/*****************************************************************************/
6022
6024 const char *dirname,
6025 const char *filename,
6026 const ctl_t *ctl,
6027 const gsl_matrix *matrix,
6028 const atm_t *atm,
6029 const obs_t *obs,
6030 const char *rowspace,
6031 const char *colspace,
6032 const char *sort) {
6033
6034 FILE *out;
6035
6036 char file[LEN], quantity[LEN];
6037
6038 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
6039
6040 size_t i, j, nc, nr;
6041
6042 /* Check output flag... */
6043 if (!ctl->write_matrix)
6044 return;
6045
6046 /* Allocate... */
6047 ALLOC(cida, int,
6048 M);
6049 ALLOC(ciqa, int,
6050 N);
6051 ALLOC(cipa, int,
6052 N);
6053 ALLOC(cira, int,
6054 M);
6055 ALLOC(rida, int,
6056 M);
6057 ALLOC(riqa, int,
6058 N);
6059 ALLOC(ripa, int,
6060 N);
6061 ALLOC(rira, int,
6062 M);
6063
6064 /* Set filename... */
6065 if (dirname != NULL)
6066 sprintf(file, "%s/%s", dirname, filename);
6067 else
6068 sprintf(file, "%s", filename);
6069
6070 /* Write info... */
6071 LOG(1, "Write matrix: %s", file);
6072
6073 /* Create file... */
6074 if (!(out = fopen(file, "w")))
6075 ERRMSG("Cannot create file!");
6076
6077 /* Write header (row space)... */
6078 if (rowspace[0] == 'y') {
6079
6080 fprintf(out,
6081 "# $1 = Row: index (measurement space)\n"
6082 "# $2 = Row: channel wavenumber [cm^-1]\n"
6083 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
6084 "# $4 = Row: view point altitude [km]\n"
6085 "# $5 = Row: view point longitude [deg]\n"
6086 "# $6 = Row: view point latitude [deg]\n");
6087
6088 /* Get number of rows... */
6089 nr = obs2y(ctl, obs, NULL, rida, rira);
6090
6091 } else {
6092
6093 fprintf(out,
6094 "# $1 = Row: index (state space)\n"
6095 "# $2 = Row: name of quantity\n"
6096 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
6097 "# $4 = Row: altitude [km]\n"
6098 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
6099
6100 /* Get number of rows... */
6101 nr = atm2x(ctl, atm, NULL, riqa, ripa);
6102 }
6103
6104 /* Write header (column space)... */
6105 if (colspace[0] == 'y') {
6106
6107 fprintf(out,
6108 "# $7 = Col: index (measurement space)\n"
6109 "# $8 = Col: channel wavenumber [cm^-1]\n"
6110 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
6111 "# $10 = Col: view point altitude [km]\n"
6112 "# $11 = Col: view point longitude [deg]\n"
6113 "# $12 = Col: view point latitude [deg]\n");
6114
6115 /* Get number of columns... */
6116 nc = obs2y(ctl, obs, NULL, cida, cira);
6117
6118 } else {
6119
6120 fprintf(out,
6121 "# $7 = Col: index (state space)\n"
6122 "# $8 = Col: name of quantity\n"
6123 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
6124 "# $10 = Col: altitude [km]\n"
6125 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
6126
6127 /* Get number of columns... */
6128 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
6129 }
6130
6131 /* Write header entry... */
6132 fprintf(out, "# $13 = Matrix element\n\n");
6133
6134 /* Write matrix data... */
6135 i = j = 0;
6136 while (i < nr && j < nc) {
6137
6138 /* Write info about the row... */
6139 if (rowspace[0] == 'y')
6140 fprintf(out, "%d %.4f %.2f %g %g %g",
6141 (int) i, ctl->nu[rida[i]],
6142 obs->time[rira[i]], obs->vpz[rira[i]],
6143 obs->vplon[rira[i]], obs->vplat[rira[i]]);
6144 else {
6145 idx2name(ctl, riqa[i], quantity);
6146 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
6147 atm->time[ripa[i]], atm->z[ripa[i]],
6148 atm->lon[ripa[i]], atm->lat[ripa[i]]);
6149 }
6150
6151 /* Write info about the column... */
6152 if (colspace[0] == 'y')
6153 fprintf(out, " %d %.4f %.2f %g %g %g",
6154 (int) j, ctl->nu[cida[j]],
6155 obs->time[cira[j]], obs->vpz[cira[j]],
6156 obs->vplon[cira[j]], obs->vplat[cira[j]]);
6157 else {
6158 idx2name(ctl, ciqa[j], quantity);
6159 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
6160 atm->time[cipa[j]], atm->z[cipa[j]],
6161 atm->lon[cipa[j]], atm->lat[cipa[j]]);
6162 }
6163
6164 /* Write matrix entry... */
6165 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
6166
6167 /* Set matrix indices... */
6168 if (sort[0] == 'r') {
6169 j++;
6170 if (j >= nc) {
6171 j = 0;
6172 i++;
6173 fprintf(out, "\n");
6174 }
6175 } else {
6176 i++;
6177 if (i >= nr) {
6178 i = 0;
6179 j++;
6180 fprintf(out, "\n");
6181 }
6182 }
6183 }
6184
6185 /* Close file... */
6186 fclose(out);
6187
6188 /* Free... */
6189 free(cida);
6190 free(ciqa);
6191 free(cipa);
6192 free(cira);
6193 free(rida);
6194 free(riqa);
6195 free(ripa);
6196 free(rira);
6197}
6198
6199/*****************************************************************************/
6200
6202 const char *dirname,
6203 const char *filename,
6204 const ctl_t *ctl,
6205 const obs_t *obs) {
6206
6207 FILE *out;
6208
6209 char file[LEN];
6210
6211 int n = 10;
6212
6213 /* Set filename... */
6214 if (dirname != NULL)
6215 sprintf(file, "%s/%s", dirname, filename);
6216 else
6217 sprintf(file, "%s", filename);
6218
6219 /* Write info... */
6220 LOG(1, "Write observation data: %s", file);
6221
6222 /* Create file... */
6223 if (!(out = fopen(file, "w")))
6224 ERRMSG("Cannot create file!");
6225
6226 /* Write header... */
6227 fprintf(out,
6228 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
6229 "# $2 = observer altitude [km]\n"
6230 "# $3 = observer longitude [deg]\n"
6231 "# $4 = observer latitude [deg]\n"
6232 "# $5 = view point altitude [km]\n"
6233 "# $6 = view point longitude [deg]\n"
6234 "# $7 = view point latitude [deg]\n"
6235 "# $8 = tangent point altitude [km]\n"
6236 "# $9 = tangent point longitude [deg]\n"
6237 "# $10 = tangent point latitude [deg]\n");
6238 for (int id = 0; id < ctl->nd; id++)
6239 if (ctl->write_bbt)
6240 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
6241 ++n, ctl->nu[id]);
6242 else
6243 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
6244 ++n, ctl->nu[id]);
6245 for (int id = 0; id < ctl->nd; id++)
6246 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
6247 ctl->nu[id]);
6248
6249 /* Write data... */
6250 for (int ir = 0; ir < obs->nr; ir++) {
6251 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
6252 fprintf(out, "\n");
6253 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
6254 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
6255 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
6256 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
6257 for (int id = 0; id < ctl->nd; id++)
6258 fprintf(out, " %g", obs->rad[id][ir]);
6259 for (int id = 0; id < ctl->nd; id++)
6260 fprintf(out, " %g", obs->tau[id][ir]);
6261 fprintf(out, "\n");
6262 }
6263
6264 /* Close file... */
6265 fclose(out);
6266
6267 /* Write info... */
6268 double mini, maxi;
6269 LOG(2, "Number of ray paths: %d", obs->nr);
6270 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
6271 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
6272 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
6273 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
6274 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
6275 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
6276 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
6277 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
6278 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
6279 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
6280 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
6281 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
6282 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
6283 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
6284 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
6285 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
6286 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
6287 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
6288 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
6289 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
6290 for (int id = 0; id < ctl->nd; id++) {
6291 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
6292 if (ctl->write_bbt) {
6293 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
6294 ctl->nu[id], mini, maxi);
6295 } else {
6296 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
6297 ctl->nu[id], mini, maxi);
6298 }
6299 }
6300 for (int id = 0; id < ctl->nd; id++) {
6301 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
6302 if (ctl->write_bbt) {
6303 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
6304 ctl->nu[id], mini, maxi);
6305 }
6306 }
6307}
6308
6309/*****************************************************************************/
6310
6312 const char *filename,
6313 const double *x,
6314 const double *y,
6315 const int n) {
6316
6317 FILE *out;
6318
6319 /* Write info... */
6320 LOG(1, "Write shape function: %s", filename);
6321
6322 /* Create file... */
6323 if (!(out = fopen(filename, "w")))
6324 ERRMSG("Cannot create file!");
6325
6326 /* Write header... */
6327 fprintf(out,
6328 "# $1 = shape function x-value [-]\n"
6329 "# $2 = shape function y-value [-]\n\n");
6330
6331 /* Write data... */
6332 for (int i = 0; i < n; i++)
6333 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
6334
6335 /* Close file... */
6336 fclose(out);
6337}
6338
6339/*****************************************************************************/
6340
6342 const char *quantity,
6343 ret_t *ret,
6344 ctl_t *ctl,
6345 atm_t *atm,
6346 gsl_matrix *s) {
6347
6348 static atm_t atm_aux;
6349
6350 char filename[LEN];
6351
6352 /* Get sizes... */
6353 const size_t n = s->size1;
6354
6355 /* Allocate... */
6356 gsl_vector *x_aux = gsl_vector_alloc(n);
6357
6358 /* Compute standard deviation... */
6359 for (size_t i = 0; i < n; i++)
6360 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
6361
6362 /* Write to disk... */
6363 copy_atm(ctl, &atm_aux, atm, 1);
6364 x2atm(ctl, x_aux, &atm_aux);
6365 sprintf(filename, "atm_err_%s.tab", quantity);
6366 write_atm(ret->dir, filename, ctl, &atm_aux);
6367
6368 /* Free... */
6369 gsl_vector_free(x_aux);
6370}
6371
6372/*****************************************************************************/
6373
6375 const ctl_t *ctl,
6376 const tbl_t *tbl) {
6377
6378 FILE *out;
6379
6380 char filename[2 * LEN];
6381
6382 /* Loop over emitters and detectors... */
6383 for (int ig = 0; ig < ctl->ng; ig++)
6384 for (int id = 0; id < ctl->nd; id++) {
6385
6386 /* Set filename... */
6387 sprintf(filename, "%s_%.4f_%s.%s", ctl->tblbase,
6388 ctl->nu[id], ctl->emitter[ig],
6389 ctl->tblfmt == 1 ? "tab" : "bin");
6390
6391 /* Write info... */
6392 LOG(1, "Write emissivity table: %s", filename);
6393
6394 /* Create file... */
6395 if (!(out = fopen(filename, "w")))
6396 ERRMSG("Cannot create file!");
6397
6398 /* Write ASCII data... */
6399 if (ctl->tblfmt == 1) {
6400
6401 /* Write header... */
6402 fprintf(out,
6403 "# $1 = pressure [hPa]\n"
6404 "# $2 = temperature [K]\n"
6405 "# $3 = column density [molecules/cm^2]\n"
6406 "# $4 = emissivity [-]\n");
6407
6408 /* Save table file... */
6409 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6410 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6411 fprintf(out, "\n");
6412 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
6413 fprintf(out, "%g %g %e %e\n",
6414 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
6415 tbl->u[id][ig][ip][it][iu],
6416 tbl->eps[id][ig][ip][it][iu]);
6417 }
6418 }
6419
6420 /* Write binary data... */
6421 else if (ctl->tblfmt == 2) {
6422 FWRITE(&tbl->np[id][ig], int,
6423 1,
6424 out);
6425 FWRITE(tbl->p[id][ig], double,
6426 (size_t) tbl->np[id][ig],
6427 out);
6428 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6429 FWRITE(&tbl->nt[id][ig][ip], int,
6430 1,
6431 out);
6432 FWRITE(tbl->t[id][ig][ip], double,
6433 (size_t) tbl->nt[id][ig][ip],
6434 out);
6435 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6436 FWRITE(&tbl->nu[id][ig][ip][it], int,
6437 1,
6438 out);
6439 FWRITE(tbl->u[id][ig][ip][it], float,
6440 (size_t) tbl->nu[id][ig][ip][it],
6441 out);
6442 FWRITE(tbl->eps[id][ig][ip][it], float,
6443 (size_t) tbl->nu[id][ig][ip][it],
6444 out);
6445 }
6446 }
6447 }
6448
6449 /* Error message... */
6450 else
6451 ERRMSG("Unknown look-up table format!");
6452
6453 /* Close file... */
6454 fclose(out);
6455 }
6456}
6457
6458/*****************************************************************************/
6459
6461 const ctl_t *ctl,
6462 const gsl_vector *x,
6463 atm_t *atm) {
6464
6465 size_t n = 0;
6466
6467 /* Get pressure... */
6468 for (int ip = 0; ip < atm->np; ip++)
6469 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
6470 x2atm_help(&atm->p[ip], x, &n);
6471
6472 /* Get temperature... */
6473 for (int ip = 0; ip < atm->np; ip++)
6474 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
6475 x2atm_help(&atm->t[ip], x, &n);
6476
6477 /* Get volume mixing ratio... */
6478 for (int ig = 0; ig < ctl->ng; ig++)
6479 for (int ip = 0; ip < atm->np; ip++)
6480 if (atm->z[ip] >= ctl->retq_zmin[ig]
6481 && atm->z[ip] <= ctl->retq_zmax[ig])
6482 x2atm_help(&atm->q[ig][ip], x, &n);
6483
6484 /* Get extinction... */
6485 for (int iw = 0; iw < ctl->nw; iw++)
6486 for (int ip = 0; ip < atm->np; ip++)
6487 if (atm->z[ip] >= ctl->retk_zmin[iw]
6488 && atm->z[ip] <= ctl->retk_zmax[iw])
6489 x2atm_help(&atm->k[iw][ip], x, &n);
6490
6491 /* Get cloud data... */
6492 if (ctl->ret_clz)
6493 x2atm_help(&atm->clz, x, &n);
6494 if (ctl->ret_cldz)
6495 x2atm_help(&atm->cldz, x, &n);
6496 if (ctl->ret_clk)
6497 for (int icl = 0; icl < ctl->ncl; icl++)
6498 x2atm_help(&atm->clk[icl], x, &n);
6499
6500 /* Get surface data... */
6501 if (ctl->ret_sft)
6502 x2atm_help(&atm->sft, x, &n);
6503 if (ctl->ret_sfeps)
6504 for (int isf = 0; isf < ctl->nsf; isf++)
6505 x2atm_help(&atm->sfeps[isf], x, &n);
6506}
6507
6508/*****************************************************************************/
6509
6511 double *value,
6512 const gsl_vector *x,
6513 size_t *n) {
6514
6515 /* Get state vector element... */
6516 *value = gsl_vector_get(x, *n);
6517 (*n)++;
6518}
6519
6520/*****************************************************************************/
6521
6523 const ctl_t *ctl,
6524 const gsl_vector *y,
6525 obs_t *obs) {
6526
6527 size_t m = 0;
6528
6529 /* Decompose measurement vector... */
6530 for (int ir = 0; ir < obs->nr; ir++)
6531 for (int id = 0; id < ctl->nd; id++)
6532 if (isfinite(obs->rad[id][ir])) {
6533 obs->rad[id][ir] = gsl_vector_get(y, m);
6534 m++;
6535 }
6536}
void matrix_product(gsl_matrix *a, gsl_vector *b, int transpose, gsl_matrix *c)
Definition: jurassic.c:4438
void read_matrix(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
Definition: jurassic.c:4962
void timer(const char *name, const char *file, const char *func, int line, int mode)
Definition: jurassic.c:5830
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:5214
void write_atm(const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm)
Definition: jurassic.c:5868
void set_cov_apr(ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *s_a)
Definition: jurassic.c:5600
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4367
void intpol_tbl_ega(const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
Interpolate emissivities and transmittances using the Emissivity Growth Approximation (EGA).
Definition: jurassic.c:4049
double read_obs_rfm(const char *basename, const double z, double *nu, double *f, int n)
Read and spectrally convolve an RFM output spectrum.
Definition: jurassic.c:5103
void formod_rfm(const ctl_t *ctl, const atm_t *atm, obs_t *obs)
Interface routine for the Reference Forward Model (RFM).
Definition: jurassic.c:3604
double ctmo2(const double nu, const double p, const double t)
Compute Oâ‚‚ collision-induced absorption coefficient.
Definition: jurassic.c:3155
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3842
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
Definition: jurassic.c:4848
void formod_continua(const ctl_t *ctl, const los_t *los, const int ip, double *beta)
Compute total extinction including gaseous continua.
Definition: jurassic.c:3368
void raytrace(const ctl_t *ctl, const atm_t *atm, obs_t *obs, los_t *los, const int ir)
Perform line-of-sight (LOS) ray tracing through the atmosphere.
Definition: jurassic.c:4510
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4337
void time2jsec(const int year, const int mon, const int day, const int hour, const int min, const int sec, const double remain, double *jsec)
Converts time components to seconds since January 1, 2000, 12:00:00 UTC.
Definition: jurassic.c:5799
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Definition: jurassic.c:6460
void atm2x_help(const double value, const int value_iqa, const int value_ip, gsl_vector *x, int *iqa, int *ipa, size_t *n)
Append a single atmospheric value to the state vector.
Definition: jurassic.c:164
double ctmh2o(const double nu, const double p, const double t, const double q, const double u)
Compute water vapor continuum (optical depth).
Definition: jurassic.c:2034
void intpol_tbl_cga(const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
Interpolate emissivities and transmittances using the Curtis–Godson approximation (CGA).
Definition: jurassic.c:3960
void write_atm_rfm(const char *filename, const ctl_t *ctl, const atm_t *atm)
Definition: jurassic.c:5985
double intpol_tbl_u(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double eps)
Interpolate column density from lookup tables as a function of emissivity.
Definition: jurassic.c:4177
double intpol_tbl_eps(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double u)
Interpolate emissivity from lookup tables as a function of column density.
Definition: jurassic.c:4145
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Definition: jurassic.c:6374
void analyze_avk(ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *avk)
Definition: jurassic.c:29
void intpol_atm(const ctl_t *ctl, const atm_t *atm, const double z, double *p, double *t, double *q, double *k)
Interpolate atmospheric state variables at a given altitude.
Definition: jurassic.c:3935
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
Definition: jurassic.c:3305
double sza(const double sec, const double lon, const double lat)
Compute the solar zenith angle for a given time and location.
Definition: jurassic.c:5560
void tangent_point(const los_t *los, double *tpz, double *tplon, double *tplat)
Determine the tangent point along a line of sight (LOS).
Definition: jurassic.c:5755
void read_ret(int argc, char *argv[], ctl_t *ctl, ret_t *ret)
Definition: jurassic.c:5161
void formod_pencil(const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs, const int ir)
Compute line-of-sight radiances using the pencil-beam forward model.
Definition: jurassic.c:3469
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)
Definition: jurassic.c:5711
double ctmco2(const double nu, const double p, const double t, const double u)
Compute carbon dioxide continuum (optical depth).
Definition: jurassic.c:1171
void write_stddev(const char *quantity, ret_t *ret, ctl_t *ctl, atm_t *atm, gsl_matrix *s)
Definition: jurassic.c:6341
void read_atm(const char *dirname, const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric profile data from an ASCII file.
Definition: jurassic.c:4746
void copy_obs(const ctl_t *ctl, obs_t *obs_dest, const obs_t *obs_src, const int init)
Copy or initialize observation geometry and radiance data.
Definition: jurassic.c:3267
void read_obs(const char *dirname, const char *filename, const ctl_t *ctl, obs_t *obs)
Read observation geometry and radiance data from an ASCII file.
Definition: jurassic.c:5002
void write_obs(const char *dirname, const char *filename, const ctl_t *ctl, const obs_t *obs)
Definition: jurassic.c:6201
void x2atm_help(double *value, const gsl_vector *x, size_t *n)
Definition: jurassic.c:6510
void cart2geo(const double *x, double *z, double *lon, double *lat)
Converts Cartesian coordinates to geographic coordinates.
Definition: jurassic.c:185
void formod_fov(const ctl_t *ctl, obs_t *obs)
Apply field-of-view (FOV) convolution to modeled radiances.
Definition: jurassic.c:3404
void kernel(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs, gsl_matrix *k)
Compute the Jacobian (kernel) matrix by finite differences.
Definition: jurassic.c:4242
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize the source-function (Planck radiance) lookup table.
Definition: jurassic.c:3881
void matrix_invert(gsl_matrix *a)
Definition: jurassic.c:4408
double scan_ctl(int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Scan control file or command-line arguments for a configuration variable.
Definition: jurassic.c:5491
void write_shape(const char *filename, const double *x, const double *y, const int n)
Definition: jurassic.c:6311
void formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
Execute the selected forward model.
Definition: jurassic.c:3318
void formod_srcfunc(const ctl_t *ctl, const tbl_t *tbl, const double t, double *src)
Interpolate the source function (Planck radiance) at a given temperature.
Definition: jurassic.c:3745
void jsec2time(const double jsec, int *year, int *mon, int *day, int *hour, int *min, int *sec, double *remain)
Converts Julian seconds to calendar date and time components.
Definition: jurassic.c:4209
tbl_t * read_tbl(const ctl_t *ctl)
Read gas emissivity look-up tables for all channels and emitters.
Definition: jurassic.c:5317
void copy_atm(const ctl_t *ctl, atm_t *atm_dest, const atm_t *atm_src, const int init)
Copy or initialize atmospheric profile data.
Definition: jurassic.c:3217
size_t obs2y(const ctl_t *ctl, const obs_t *obs, gsl_vector *y, int *ida, int *ira)
Convert observation radiances into a measurement vector.
Definition: jurassic.c:4483
void y2obs(const ctl_t *ctl, const gsl_vector *y, obs_t *obs)
Definition: jurassic.c:6522
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3782
void read_shape(const char *filename, double *x, double *y, int *n)
Read a two-column shape function from an ASCII file.
Definition: jurassic.c:5275
double ctmn2(const double nu, const double p, const double t)
Compute Nâ‚‚ collision-induced absorption coefficient.
Definition: jurassic.c:3086
double cost_function(gsl_vector *dx, gsl_vector *dy, gsl_matrix *s_a_inv, gsl_vector *sig_eps_inv)
Definition: jurassic.c:1138
size_t atm2x(const ctl_t *ctl, const atm_t *atm, gsl_vector *x, int *iqa, int *ipa)
Convert atmospheric data to state vector elements.
Definition: jurassic.c:110
void analyze_avk_quantity(gsl_matrix *avk, int iq, int *ipa, size_t *n0, size_t *n1, double *cont, double *res)
Definition: jurassic.c:86
void climatology(const ctl_t *ctl, atm_t *atm)
Initializes atmospheric climatology profiles.
Definition: jurassic.c:200
void geo2cart(const double z, const double lon, const double lat, double *x)
Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates.
Definition: jurassic.c:3762
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)
Definition: jurassic.c:6023
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4386
JURASSIC library declarations.
#define N
Maximum size of state vector.
Definition: jurassic.h:276
#define IDXCLZ
Index for cloud layer height.
Definition: jurassic.h:341
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:266
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:187
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
Definition: jurassic.h:401
#define P0
Standard pressure [hPa].
Definition: jurassic.h:182
#define KB
Boltzmann constant [kg m^2/(K s^2)].
Definition: jurassic.h:157
#define POW2(x)
Compute the square of a value.
Definition: jurassic.h:669
#define NFOV
Number of ray paths used for FOV calculations.
Definition: jurassic.h:296
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
Definition: jurassic.h:514
#define DOTP(a, b)
Compute dot product of two 3D vectors.
Definition: jurassic.h:471
#define O2
Oxygen concentration.
Definition: jurassic.h:177
#define UMAX
Maximum column density [molecules/cm^2].
Definition: jurassic.h:222
#define MIN(a, b)
Determine the minimum of two values.
Definition: jurassic.h:553
#define IDXCLDZ
Index for cloud layer depth.
Definition: jurassic.h:344
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition: jurassic.h:864
#define RFMNPTS
Maximum number of RFM spectral grid points.
Definition: jurassic.h:321
#define IDXK(iw)
Indices for extinction.
Definition: jurassic.h:338
#define M
Maximum size of measurement vector.
Definition: jurassic.h:271
#define G0
Standard gravity [m/s^2].
Definition: jurassic.h:147
#define NQ
Maximum number of quantities.
Definition: jurassic.h:281
#define ND
Maximum number of radiance channels.
Definition: jurassic.h:236
#define NA
Avogadro's number.
Definition: jurassic.h:167
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
Definition: jurassic.h:617
#define NSHAPE
Maximum number of shape function grid points.
Definition: jurassic.h:291
#define IDXSFT
Index for surface layer temperature.
Definition: jurassic.h:350
#define RI
Ideal gas constant [J/(mol K)].
Definition: jurassic.h:192
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
Definition: jurassic.h:636
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
Definition: jurassic.h:353
#define IDXCLK(icl)
Indices for cloud layer extinction.
Definition: jurassic.h:347
#define LOGX(x0, y0, x1, y1, x)
Compute logarithmic interpolation in x.
Definition: jurassic.h:594
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
Definition: jurassic.h:750
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:831
#define TBLNU
Maximum number of column densities in emissivity tables.
Definition: jurassic.h:311
#define IDXP
Index for pressure.
Definition: jurassic.h:329
#define ALLOC(ptr, type, n)
Allocate memory for an array.
Definition: jurassic.h:376
#define DEG2RAD(deg)
Convert degrees to radians.
Definition: jurassic.h:418
#define TSUN
Effective temperature of the sun [K].
Definition: jurassic.h:212
#define RAD2DEG(rad)
Convert radians to degrees.
Definition: jurassic.h:698
#define TBLNT
Maximum number of temperatures in emissivity tables.
Definition: jurassic.h:306
#define NP
Maximum number of atmospheric data points.
Definition: jurassic.h:246
#define POW3(x)
Compute the cube of a value.
Definition: jurassic.h:682
#define PLANCK(T, nu)
Compute the Planck function in wavenumber form.
Definition: jurassic.h:655
#define NG
Maximum number of emitters.
Definition: jurassic.h:241
#define EPSMAX
Maximum emissivity.
Definition: jurassic.h:142
#define LOG(level,...)
Print a log message with a specified logging level.
Definition: jurassic.h:794
#define TBLNS
Maximum number of source function temperature levels.
Definition: jurassic.h:316
#define N2
Nitrogen concentration.
Definition: jurassic.h:172
#define REFRAC(p, T)
Compute air refractivity (n - 1).
Definition: jurassic.h:714
#define TBLNP
Maximum number of pressure levels in emissivity tables.
Definition: jurassic.h:301
#define NSF
Maximum number of surface layer spectral grid points.
Definition: jurassic.h:256
#define NCL
Maximum number of cloud layer spectral grid points.
Definition: jurassic.h:231
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
Definition: jurassic.h:436
#define FREAD(ptr, type, size, out)
Read binary data from a file.
Definition: jurassic.h:491
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:573
#define NLOS
Maximum number of LOS points.
Definition: jurassic.h:286
#define NR
Maximum number of ray paths.
Definition: jurassic.h:251
#define IDXQ(ig)
Indices for volume mixing ratios.
Definition: jurassic.h:335
#define TMAX
Maximum temperature for source function [K].
Definition: jurassic.h:207
#define TMIN
Minimum temperature for source function [K].
Definition: jurassic.h:202
#define NW
Maximum number of spectral windows.
Definition: jurassic.h:261
#define MAX(a, b)
Determine the maximum of two values.
Definition: jurassic.h:535
#define IDXT
Index for temperature.
Definition: jurassic.h:332
Atmospheric profile data.
Definition: jurassic.h:914
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:920
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:956
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:941
double lat[NP]
Latitude [deg].
Definition: jurassic.h:929
double lon[NP]
Longitude [deg].
Definition: jurassic.h:926
double t[NP]
Temperature [K].
Definition: jurassic.h:935
double clz
Cloud layer height [km].
Definition: jurassic.h:944
int np
Number of data points.
Definition: jurassic.h:917
double cldz
Cloud layer depth [km].
Definition: jurassic.h:947
double sft
Surface temperature [K].
Definition: jurassic.h:953
double z[NP]
Altitude [km].
Definition: jurassic.h:923
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:950
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:938
double p[NP]
Pressure [hPa].
Definition: jurassic.h:932
Control parameters.
Definition: jurassic.h:967
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1102
int nw
Number of spectral windows.
Definition: jurassic.h:994
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1060
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:991
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:976
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1081
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1009
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1111
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1018
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1108
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1024
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1027
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1069
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1096
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1093
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1084
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1033
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1048
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1114
int window[ND]
Window index of each channel.
Definition: jurassic.h:997
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1030
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1105
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1075
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1072
int ng
Number of emitters.
Definition: jurassic.h:970
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1003
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1039
int ig_o2
Emitter index of O2.
Definition: jurassic.h:985
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1066
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1015
int nd
Number of radiance channels.
Definition: jurassic.h:988
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1057
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1012
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1078
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1000
int ig_n2
Emitter index of N2.
Definition: jurassic.h:982
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1051
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1036
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1090
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:973
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1006
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1042
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1087
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:979
int tblfmt
Look-up table file format (1=ASCII, 2=binary).
Definition: jurassic.h:1021
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1045
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1099
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1054
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1063
Line-of-sight data.
Definition: jurassic.h:1125
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1131
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1173
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1170
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1146
double sft
Surface temperature [K].
Definition: jurassic.h:1152
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1167
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1134
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1158
int np
Number of LOS points.
Definition: jurassic.h:1128
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1161
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1137
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1176
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1149
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1155
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1164
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1143
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1140
Observation geometry and radiance data.
Definition: jurassic.h:1187
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1223
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1226
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1217
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1205
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1211
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1199
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1202
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1196
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1220
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1208
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1193
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1214
int nr
Number of ray paths.
Definition: jurassic.h:1190
Retrieval control parameters.
Definition: jurassic.h:1239
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1266
double err_press
Pressure error [%].
Definition: jurassic.h:1263
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1293
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1254
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1296
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1275
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1257
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1251
double err_temp
Temperature error [K].
Definition: jurassic.h:1272
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1284
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1260
double err_clz
Cloud height error [km].
Definition: jurassic.h:1299
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1308
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1305
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1278
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1245
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1248
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1302
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1269
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1287
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1281
char dir[LEN]
Working directory.
Definition: jurassic.h:1242
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1311
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1290
Emissivity look-up tables.
Definition: jurassic.h:1321
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1348
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1333
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1330
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1327
float eps[ND][NG][TBLNP][TBLNT][TBLNU]
Emissivity.
Definition: jurassic.h:1342
float u[ND][NG][TBLNP][TBLNT][TBLNU]
Column density [molecules/cm^2].
Definition: jurassic.h:1339
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1336
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1345
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1324