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-2026 Forschungszentrum Juelich GmbH
18*/
19
25#include "jurassic.h"
26
27/*****************************************************************************/
28
30 const ret_t *ret,
31 const ctl_t *ctl,
32 const atm_t *atm,
33 const int *iqa,
34 const int *ipa,
35 const 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 const gsl_matrix *avk,
88 const int iq,
89 const int *ipa,
90 const size_t *n0,
91 const 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 variables... */
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 variables... */
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... */
1130 atm->sft = 0;
1131 for (int isf = 0; isf < ctl->nsf; isf++)
1132 atm->sfeps[isf] = 1;
1133 }
1134}
1135
1136/*****************************************************************************/
1137
1138double cos_sza(
1139 const double sec,
1140 const double lon,
1141 const double lat) {
1142
1143 /* Number of days and fraction with respect to 2000-01-01T12:00Z... */
1144 const double D = sec / 86400 - 0.5;
1145
1146 /* Geocentric apparent ecliptic longitude [rad]... */
1147 const double g = DEG2RAD(357.529 + 0.98560028 * D);
1148 const double q = 280.459 + 0.98564736 * D;
1149 const double L = DEG2RAD(q + 1.915 * sin(g) + 0.020 * sin(2 * g));
1150
1151 /* Mean obliquity of the ecliptic [rad]... */
1152 const double e = DEG2RAD(23.439 - 0.00000036 * D);
1153
1154 /* Declination [rad]... */
1155 const double sindec = sin(e) * sin(L);
1156
1157 /* Right ascension [rad]... */
1158 const double ra = atan2(cos(e) * sin(L), cos(L));
1159
1160 /* Greenwich Mean Sidereal Time [h]... */
1161 const double GMST = 18.697374558 + 24.06570982441908 * D;
1162
1163 /* Local Sidereal Time [h]... */
1164 const double LST = GMST + lon / 15;
1165
1166 /* Hour angle [rad]... */
1167 const double h = LST / 12 * M_PI - ra;
1168
1169 /* Convert latitude... */
1170 const double lat_help = DEG2RAD(lat);
1171
1172 /* Return cosine of solar zenith angle... */
1173 return sin(lat_help) * sindec + cos(lat_help)
1174 * sqrt(1 - POW2(sindec)) * cos(h);
1175}
1176
1177/*****************************************************************************/
1178
1180 const gsl_vector *dx,
1181 const gsl_vector *dy,
1182 const gsl_matrix *s_a_inv,
1183 const gsl_vector *sig_eps_inv) {
1184
1185 double chisq_a, chisq_m = 0;
1186
1187 /* Get sizes... */
1188 const size_t m = dy->size;
1189 const size_t n = dx->size;
1190
1191 /* Allocate... */
1192 gsl_vector *x_aux = gsl_vector_alloc(n);
1193 gsl_vector *y_aux = gsl_vector_alloc(m);
1194
1195 /* Determine normalized cost function...
1196 (chi^2 = 1/m * [dy^T * S_eps^{-1} * dy + dx^T * S_a^{-1} * dx]) */
1197 for (size_t i = 0; i < m; i++)
1198 chisq_m += POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
1199 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
1200 gsl_blas_ddot(dx, x_aux, &chisq_a);
1201
1202 /* Free... */
1203 gsl_vector_free(x_aux);
1204 gsl_vector_free(y_aux);
1205
1206 /* Return cost function value... */
1207 return (chisq_m + chisq_a) / (double) m;
1208}
1209
1210/*****************************************************************************/
1211
1212double ctmco2(
1213 const double nu,
1214 const double p,
1215 const double t,
1216 const double u) {
1217
1218 static const double co2296[2001] =
1219 { 9.3388e-5, 9.7711e-5, 1.0224e-4, 1.0697e-4,
1220 1.1193e-4, 1.1712e-4, 1.2255e-4, 1.2824e-4, 1.3419e-4, 1.4043e-4,
1221 1.4695e-4, 1.5378e-4, 1.6094e-4, 1.6842e-4, 1.7626e-4, 1.8447e-4,
1222 1.9307e-4, 2.0207e-4, 2.1149e-4, 2.2136e-4, 2.3169e-4, 2.4251e-4,
1223 2.5384e-4, 2.657e-4, 2.7813e-4, 2.9114e-4, 3.0477e-4, 3.1904e-4,
1224 3.3399e-4, 3.4965e-4, 3.6604e-4, 3.8322e-4, 4.0121e-4, 4.2006e-4,
1225 4.398e-4, 4.6047e-4, 4.8214e-4, 5.0483e-4, 5.286e-4, 5.535e-4,
1226 5.7959e-4, 6.0693e-4, 6.3557e-4, 6.6558e-4, 6.9702e-4, 7.2996e-4,
1227 7.6449e-4, 8.0066e-4, 8.3856e-4, 8.7829e-4, 9.1991e-4, 9.6354e-4,
1228 .0010093, .0010572, .0011074, .00116, .0012152, .001273,
1229 .0013336, .0013972, .0014638, .0015336, .0016068, .0016835,
1230 .001764, .0018483, .0019367, .0020295, .0021267, .0022286,
1231 .0023355, .0024476, .0025652, .0026885, .0028178, .0029534,
1232 .0030956, .0032448, .0034012, .0035654, .0037375, .0039181,
1233 .0041076, .0043063, .0045148, .0047336, .0049632, .005204,
1234 .0054567, .0057219, .0060002, .0062923, .0065988, .0069204,
1235 .007258, .0076123, .0079842, .0083746, .0087844, .0092146,
1236 .0096663, .01014, .010638, .011161, .01171, .012286, .012891,
1237 .013527, .014194, .014895, .015631, .016404, .017217, .01807,
1238 .018966, .019908, .020897, .021936, .023028, .024176, .025382,
1239 .026649, .027981, .02938, .030851, .032397, .034023, .035732,
1240 .037528, .039416, .041402, .04349, .045685, .047994, .050422,
1241 .052975, .055661, .058486, .061458, .064584, .067873, .071334,
1242 .074975, .078807, .082839, .087082, .091549, .096249, .1012,
1243 .10641, .11189, .11767, .12375, .13015, .13689, .14399, .15147,
1244 .15935, .16765, .17639, .18561, .19531, .20554, .21632, .22769,
1245 .23967, .25229, .2656, .27964, .29443, .31004, .3265, .34386,
1246 .36218, .3815, .40188, .42339, .44609, .47004, .49533, .52202,
1247 .5502, .57995, .61137, .64455, .6796, .71663, .75574, .79707,
1248 .84075, .88691, .9357, .98728, 1.0418, 1.0995, 1.1605, 1.225,
1249 1.2932, 1.3654, 1.4418, 1.5227, 1.6083, 1.6989, 1.7948, 1.8964,
1250 2.004, 2.118, 2.2388, 2.3668, 2.5025, 2.6463, 2.7988, 2.9606,
1251 3.1321, 3.314, 3.5071, 3.712, 3.9296, 4.1605, 4.4058, 4.6663,
1252 4.9431, 5.2374, 5.5501, 5.8818, 6.2353, 6.6114, 7.0115, 7.4372,
1253 7.8905, 8.3731, 8.8871, 9.4349, 10.019, 10.641, 11.305, 12.013,
1254 12.769, 13.576, 14.437, 15.358, 16.342, 17.39, 18.513, 19.716,
1255 21.003, 22.379, 23.854, 25.436, 27.126, 28.942, 30.89, 32.973,
1256 35.219, 37.634, 40.224, 43.021, 46.037, 49.29, 52.803, 56.447,
1257 60.418, 64.792, 69.526, 74.637, 80.182, 86.193, 92.713, 99.786,
1258 107.47, 115.84, 124.94, 134.86, 145.69, 157.49, 170.3, 184.39,
1259 199.83, 216.4, 234.55, 254.72, 276.82, 299.85, 326.16, 354.99,
1260 386.51, 416.68, 449.89, 490.12, 534.35, 578.25, 632.26, 692.61,
1261 756.43, 834.75, 924.11, 1016.9, 996.96, 1102.7, 1219.2, 1351.9,
1262 1494.3, 1654.1, 1826.5, 2027.9, 2249., 2453.8, 2714.4, 2999.4,
1263 3209.5, 3509., 3840.4, 3907.5, 4190.7, 4533.5, 4648.3, 5059.1,
1264 5561.6, 6191.4, 6820.8, 7905.9, 9362.2, 2431.3, 2211.3, 2046.8,
1265 2023.8, 1985.9, 1905.9, 1491.1, 1369.8, 1262.2, 1200.7, 887.74,
1266 820.25, 885.23, 887.21, 816.73, 1126.9, 1216.2, 1272.4, 1579.5,
1267 1634.2, 1656.3, 1657.9, 1789.5, 1670.8, 1509.5, 8474.6, 7489.2,
1268 6793.6, 6117., 5574.1, 5141.2, 5084.6, 4745.1, 4413.2, 4102.8,
1269 4024.7, 3715., 3398.6, 3100.8, 2900.4, 2629.2, 2374., 2144.7,
1270 1955.8, 1760.8, 1591.2, 1435.2, 1296.2, 1174., 1065.1, 967.76,
1271 999.48, 897.45, 809.23, 732.77, 670.26, 611.93, 560.11, 518.77,
1272 476.84, 438.8, 408.48, 380.21, 349.24, 322.71, 296.65, 272.85,
1273 251.96, 232.04, 213.88, 197.69, 182.41, 168.41, 155.79, 144.05,
1274 133.31, 123.48, 114.5, 106.21, 98.591, 91.612, 85.156, 79.204,
1275 73.719, 68.666, 63.975, 59.637, 56.35, 52.545, 49.042, 45.788,
1276 42.78, 39.992, 37.441, 35.037, 32.8, 30.744, 28.801, 26.986,
1277 25.297, 23.731, 22.258, 20.883, 19.603, 18.403, 17.295, 16.249,
1278 15.271, 14.356, 13.501, 12.701, 11.954, 11.254, 10.6, 9.9864,
1279 9.4118, 8.8745, 8.3714, 7.8997, 7.4578, 7.0446, 6.6573, 6.2949,
1280 5.9577, 5.6395, 5.3419, 5.063, 4.8037, 4.5608, 4.3452, 4.1364,
1281 3.9413, 3.7394, 3.562, 3.3932, 3.2325, 3.0789, 2.9318, 2.7898,
1282 2.6537, 2.5225, 2.3958, 2.2305, 2.1215, 2.0245, 1.9427, 1.8795,
1283 1.8336, 1.7604, 1.7016, 1.6419, 1.5282, 1.4611, 1.3443, 1.27,
1284 1.1675, 1.0824, 1.0534, .99833, .95854, .92981, .90887, .89346,
1285 .88113, .87068, .86102, .85096, .88262, .86151, .83565, .80518,
1286 .77045, .73736, .74744, .74954, .75773, .82267, .83493, .89402,
1287 .89725, .93426, .95564, .94045, .94174, .93404, .92035, .90456,
1288 .88621, .86673, .78117, .7515, .72056, .68822, .65658, .62764,
1289 .55984, .55598, .57407, .60963, .63763, .66198, .61132, .60972,
1290 .52496, .50649, .41872, .3964, .32422, .27276, .24048, .23772,
1291 .2286, .22711, .23999, .32038, .34371, .36621, .38561, .39953,
1292 .40636, .44913, .42716, .3919, .35477, .33935, .3351, .39746,
1293 .40993, .49398, .49956, .56157, .54742, .57295, .57386, .55417,
1294 .50745, .471, .43446, .39102, .34993, .31269, .27888, .24912,
1295 .22291, .19994, .17972, .16197, .14633, .13252, .12029, .10942,
1296 .099745, .091118, .083404, .076494, .070292, .064716, .059697,
1297 .055173, .051093, .047411, .044089, .041092, .038392, .035965,
1298 .033789, .031846, .030122, .028607, .02729, .026169, .025209,
1299 .024405, .023766, .023288, .022925, .022716, .022681, .022685,
1300 .022768, .023133, .023325, .023486, .024004, .024126, .024083,
1301 .023785, .024023, .023029, .021649, .021108, .019454, .017809,
1302 .017292, .016635, .017037, .018068, .018977, .018756, .017847,
1303 .016557, .016142, .014459, .012869, .012381, .010875, .0098701,
1304 .009285, .0091698, .0091701, .0096145, .010553, .01106, .012613,
1305 .014362, .015017, .016507, .017741, .01768, .017784, .0171,
1306 .016357, .016172, .017257, .018978, .020935, .021741, .023567,
1307 .025183, .025589, .026732, .027648, .028278, .028215, .02856,
1308 .029015, .029062, .028851, .028497, .027825, .027801, .026523,
1309 .02487, .022967, .022168, .020194, .018605, .017903, .018439,
1310 .019697, .020311, .020855, .020057, .018608, .016738, .015963,
1311 .013844, .011801, .011134, .0097573, .0086007, .0086226,
1312 .0083721, .0090978, .0097616, .0098426, .011317, .012853, .01447,
1313 .014657, .015771, .016351, .016079, .014829, .013431, .013185,
1314 .013207, .01448, .016176, .017971, .018265, .019526, .020455,
1315 .019797, .019802, .0194, .018176, .017505, .016197, .015339,
1316 .014401, .013213, .012203, .011186, .010236, .0093288, .0084854,
1317 .0076837, .0069375, .0062614, .0056628, .0051153, .0046015,
1318 .0041501, .003752, .0033996, .0030865, .0028077, .0025586,
1319 .0023355, .0021353, .0019553, .0017931, .0016466, .0015141,
1320 .0013941, .0012852, .0011862, .0010962, .0010142, 9.3935e-4,
1321 8.71e-4, 8.0851e-4, 7.5132e-4, 6.9894e-4, 6.5093e-4, 6.0689e-4,
1322 5.6647e-4, 5.2935e-4, 4.9525e-4, 4.6391e-4, 4.3509e-4, 4.086e-4,
1323 3.8424e-4, 3.6185e-4, 3.4126e-4, 3.2235e-4, 3.0498e-4, 2.8904e-4,
1324 2.7444e-4, 2.6106e-4, 2.4883e-4, 2.3766e-4, 2.275e-4, 2.1827e-4,
1325 2.0992e-4, 2.0239e-4, 1.9563e-4, 1.896e-4, 1.8427e-4, 1.796e-4,
1326 1.7555e-4, 1.7209e-4, 1.692e-4, 1.6687e-4, 1.6505e-4, 1.6375e-4,
1327 1.6294e-4, 1.6261e-4, 1.6274e-4, 1.6334e-4, 1.6438e-4, 1.6587e-4,
1328 1.678e-4, 1.7017e-4, 1.7297e-4, 1.762e-4, 1.7988e-4, 1.8399e-4,
1329 1.8855e-4, 1.9355e-4, 1.9902e-4, 2.0494e-4, 2.1134e-4, 2.1823e-4,
1330 2.2561e-4, 2.335e-4, 2.4192e-4, 2.5088e-4, 2.604e-4, 2.705e-4,
1331 2.8119e-4, 2.9251e-4, 3.0447e-4, 3.171e-4, 3.3042e-4, 3.4447e-4,
1332 3.5927e-4, 3.7486e-4, 3.9127e-4, 4.0854e-4, 4.267e-4, 4.4579e-4,
1333 4.6586e-4, 4.8696e-4, 5.0912e-4, 5.324e-4, 5.5685e-4, 5.8253e-4,
1334 6.0949e-4, 6.378e-4, 6.6753e-4, 6.9873e-4, 7.3149e-4, 7.6588e-4,
1335 8.0198e-4, 8.3987e-4, 8.7964e-4, 9.2139e-4, 9.6522e-4, .0010112,
1336 .0010595, .0011102, .0011634, .0012193, .001278, .0013396,
1337 .0014043, .0014722, .0015436, .0016185, .0016972, .0017799,
1338 .0018668, .001958, .0020539, .0021547, .0022606, .0023719,
1339 .002489, .002612, .0027414, .0028775, .0030206, .0031712,
1340 .0033295, .0034962, .0036716, .0038563, .0040506, .0042553,
1341 .0044709, .004698, .0049373, .0051894, .0054552, .0057354,
1342 .006031, .0063427, .0066717, .0070188, .0073854, .0077726,
1343 .0081816, .0086138, .0090709, .0095543, .010066, .010607,
1344 .011181, .011789, .012433, .013116, .013842, .014613, .015432,
1345 .016304, .017233, .018224, .019281, .020394, .021574, .022836,
1346 .024181, .025594, .027088, .028707, .030401, .032245, .034219,
1347 .036262, .038539, .040987, .043578, .04641, .04949, .052726,
1348 .056326, .0602, .064093, .068521, .073278, .077734, .083064,
1349 .088731, .093885, .1003, .1072, .11365, .12187, .13078, .13989,
1350 .15095, .16299, .17634, .19116, .20628, .22419, .24386, .26587,
1351 .28811, .31399, .34321, .36606, .39675, .42742, .44243, .47197,
1352 .49993, .49027, .51147, .52803, .48931, .49729, .5026, .43854,
1353 .441, .44766, .43414, .46151, .50029, .55247, .43855, .32115,
1354 .32607, .3431, .36119, .38029, .41179, .43996, .47144, .51853,
1355 .55362, .59122, .66338, .69877, .74001, .82923, .86907, .90361,
1356 1.0025, 1.031, 1.0559, 1.104, 1.1178, 1.1341, 1.1547, 1.351,
1357 1.4772, 1.4812, 1.4907, 1.512, 1.5442, 1.5853, 1.6358, 1.6963,
1358 1.7674, 1.8474, 1.9353, 2.0335, 2.143, 2.2592, 2.3853, 2.5217,
1359 2.6686, 2.8273, 2.9998, 3.183, 3.3868, 3.6109, 3.8564, 4.1159,
1360 4.4079, 4.7278, 5.0497, 5.3695, 5.758, 6.0834, 6.4976, 6.9312,
1361 7.38, 7.5746, 7.9833, 8.3791, 8.3956, 8.7501, 9.1067, 9.072,
1362 9.4649, 9.9112, 10.402, 10.829, 11.605, 12.54, 12.713, 10.443,
1363 10.825, 11.375, 11.955, 12.623, 13.326, 14.101, 15.041, 15.547,
1364 16.461, 17.439, 18.716, 19.84, 21.036, 22.642, 23.901, 25.244,
1365 27.03, 28.411, 29.871, 31.403, 33.147, 34.744, 36.456, 39.239,
1366 43.605, 45.162, 47.004, 49.093, 51.391, 53.946, 56.673, 59.629,
1367 63.167, 66.576, 70.254, 74.222, 78.477, 83.034, 87.914, 93.18,
1368 98.77, 104.74, 111.15, 117.95, 125.23, 133.01, 141.33, 150.21,
1369 159.71, 169.89, 180.93, 192.54, 204.99, 218.34, 232.65, 248.,
1370 264.47, 282.14, 301.13, 321.53, 343.48, 367.08, 392.5, 419.88,
1371 449.4, 481.26, 515.64, 552.79, 592.99, 636.48, 683.61, 734.65,
1372 789.99, 850.02, 915.14, 985.81, 1062.5, 1147.1, 1237.8, 1336.4,
1373 1443.2, 1558.9, 1684.2, 1819.2, 1965.2, 2122.6, 2291.7, 2470.8,
1374 2665.7, 2874.9, 3099.4, 3337.9, 3541., 3813.3, 4111.9, 4439.3,
1375 4798.9, 5196., 5639.2, 6087.5, 6657.7, 7306.7, 8040.7, 8845.5,
1376 9702.2, 10670., 11739., 12842., 14141., 15498., 17068., 18729.,
1377 20557., 22559., 25248., 27664., 30207., 32915., 35611., 38081.,
1378 40715., 43191., 41651., 42750., 43785., 44353., 44366., 44189.,
1379 43618., 42862., 41878., 35133., 35215., 36383., 39420., 44055.,
1380 44155., 45850., 46853., 39197., 38274., 29942., 28553., 21792.,
1381 21228., 17106., 14955., 18181., 19557., 21427., 23728., 26301.,
1382 28584., 30775., 32536., 33867., 40089., 39204., 37329., 34452.,
1383 31373., 33921., 34800., 36043., 44415., 45162., 52181., 50895.,
1384 54140., 50840., 50468., 48302., 44915., 40910., 36754., 32755.,
1385 29093., 25860., 22962., 20448., 18247., 16326., 14645., 13165.,
1386 11861., 10708., 9686.9, 8779.7, 7971.9, 7250.8, 6605.7, 6027.2,
1387 5507.3, 5039.1, 4616.6, 4234.8, 3889., 3575.4, 3290.5, 3031.3,
1388 2795.2, 2579.9, 2383.1, 2203.3, 2038.6, 1887.6, 1749.1, 1621.9,
1389 1505., 1397.4, 1298.3, 1207., 1122.8, 1045., 973.1, 906.64,
1390 845.16, 788.22, 735.48, 686.57, 641.21, 599.1, 559.99, 523.64,
1391 489.85, 458.42, 429.16, 401.92, 376.54, 352.88, 330.82, 310.24,
1392 291.03, 273.09, 256.34, 240.69, 226.05, 212.37, 199.57, 187.59,
1393 176.37, 165.87, 156.03, 146.82, 138.17, 130.07, 122.47, 115.34,
1394 108.65, 102.37, 96.473, 90.934, 85.73, 80.84, 76.243, 71.922,
1395 67.858, 64.034, 60.438, 57.052, 53.866, 50.866, 48.04, 45.379,
1396 42.872, 40.51, 38.285, 36.188, 34.211, 32.347, 30.588, 28.929,
1397 27.362, 25.884, 24.489, 23.171, 21.929, 20.755, 19.646, 18.599,
1398 17.61, 16.677, 15.795, 14.961, 14.174, 13.43, 12.725, 12.06,
1399 11.431, 10.834, 10.27, 9.7361, 9.2302, 8.7518, 8.2997, 7.8724,
1400 7.4674, 7.0848, 6.7226, 6.3794, 6.054, 5.745, 5.4525, 5.1752,
1401 4.9121, 4.6625, 4.4259, 4.2015, 3.9888, 3.7872, 3.5961, 3.4149,
1402 3.2431, 3.0802, 2.9257, 2.7792, 2.6402, 2.5084, 2.3834, 2.2648,
1403 2.1522, 2.0455, 1.9441, 1.848, 1.7567, 1.6701, 1.5878, 1.5097,
1404 1.4356, 1.3651, 1.2981, 1.2345, 1.174, 1.1167, 1.062, 1.0101,
1405 .96087, .91414, .86986, .82781, .78777, .74971, .71339, .67882,
1406 .64604, .61473, .58507, .55676, .52987, .5044, .48014, .45715,
1407 .43527, .41453, .3948, .37609, .35831, .34142, .32524, .30995,
1408 .29536, .28142, .26807, .25527, .24311, .23166, .22077, .21053,
1409 .20081, .19143, .18261, .17407, .16603, .15833, .15089, .14385,
1410 .13707, .13065, .12449, .11865, .11306, .10774, .10266, .097818,
1411 .093203, .088815, .084641, .080671, .076892, .073296, .069873,
1412 .066613, .06351, .060555, .05774, .055058, .052504, .050071,
1413 .047752, .045543, .043438, .041432, .039521, .037699, .035962,
1414 .034307, .032729, .031225, .029791, .028423, .02712, .025877,
1415 .024692, .023563, .022485, .021458, .020478, .019543, .018652,
1416 .017802, .016992, .016219, .015481, .014778, .014107, .013467,
1417 .012856, .012274, .011718, .011188, .010682, .0102, .0097393,
1418 .0093001, .008881, .0084812, .0080997, .0077358, .0073885,
1419 .0070571, .0067409, .0064393, .0061514, .0058768, .0056147,
1420 .0053647, .0051262, .0048987, .0046816, .0044745, .0042769,
1421 .0040884, .0039088, .0037373, .0035739, .003418, .0032693,
1422 .0031277, .0029926, .0028639, .0027413, .0026245, .0025133,
1423 .0024074, .0023066, .0022108, .0021196, .002033, .0019507,
1424 .0018726, .0017985, .0017282, .0016617, .0015988, .0015394,
1425 .0014834, .0014306, .0013811, .0013346, .0012911, .0012506,
1426 .0012131, .0011784, .0011465, .0011175, .0010912, .0010678,
1427 .0010472, .0010295, .0010147, .001003, 9.9428e-4, 9.8883e-4,
1428 9.8673e-4, 9.8821e-4, 9.9343e-4, .0010027, .0010164, .0010348,
1429 .0010586, .0010882, .0011245, .0011685, .0012145, .0012666,
1430 .0013095, .0013688, .0014048, .0014663, .0015309, .0015499,
1431 .0016144, .0016312, .001705, .0017892, .0018499, .0019715,
1432 .0021102, .0022442, .0024284, .0025893, .0027703, .0029445,
1433 .0031193, .003346, .0034552, .0036906, .0037584, .0040084,
1434 .0041934, .0044587, .0047093, .0049759, .0053421, .0055134,
1435 .0059048, .0058663, .0061036, .0063259, .0059657, .0060653,
1436 .0060972, .0055539, .0055653, .0055772, .005331, .0054953,
1437 .0055919, .0058684, .006183, .0066675, .0069808, .0075142,
1438 .0078536, .0084282, .0089454, .0094625, .0093703, .0095857,
1439 .0099283, .010063, .010521, .0097778, .0098175, .010379, .010447,
1440 .0105, .010617, .010706, .01078, .011177, .011212, .011304,
1441 .011446, .011603, .011816, .012165, .012545, .013069, .013539,
1442 .01411, .014776, .016103, .017016, .017994, .018978, .01998,
1443 .021799, .022745, .023681, .024627, .025562, .026992, .027958,
1444 .029013, .030154, .031402, .03228, .033651, .035272, .037088,
1445 .039021, .041213, .043597, .045977, .04877, .051809, .054943,
1446 .058064, .061528, .06537, .069309, .071928, .075752, .079589,
1447 .083352, .084096, .087497, .090817, .091198, .094966, .099045,
1448 .10429, .10867, .11518, .12269, .13126, .14087, .15161, .16388,
1449 .16423, .1759, .18721, .19994, .21275, .22513, .23041, .24231,
1450 .25299, .25396, .26396, .27696, .27929, .2908, .30595, .31433,
1451 .3282, .3429, .35944, .37467, .39277, .41245, .43326, .45649,
1452 .48152, .51897, .54686, .57877, .61263, .64962, .68983, .73945,
1453 .78619, .83537, .89622, .95002, 1.0067, 1.0742, 1.1355, 1.2007,
1454 1.2738, 1.347, 1.4254, 1.5094, 1.6009, 1.6976, 1.8019, 1.9148,
1455 2.0357, 2.166, 2.3066, 2.4579, 2.6208, 2.7966, 2.986, 3.188,
1456 3.4081, 3.6456, 3.9, 4.1747, 4.4712, 4.7931, 5.1359, 5.5097,
1457 5.9117, 6.3435, 6.8003, 7.3001, 7.8385, 8.3945, 9.011, 9.6869,
1458 10.392, 11.18, 12.036, 12.938, 13.944, 14.881, 16.029, 17.255,
1459 18.574, 19.945, 21.38, 22.9, 24.477, 26.128, 27.87, 29.037,
1460 30.988, 33.145, 35.506, 37.76, 40.885, 44.487, 48.505, 52.911,
1461 57.56, 61.964, 67.217, 72.26, 78.343, 85.08, 91.867, 99.435,
1462 107.68, 116.97, 127.12, 138.32, 150.26, 163.04, 174.81, 189.26,
1463 205.61, 224.68, 240.98, 261.88, 285.1, 307.58, 334.35, 363.53,
1464 394.68, 427.85, 458.85, 489.25, 472.87, 486.93, 496.27, 501.52,
1465 501.57, 497.14, 488.09, 476.32, 393.76, 388.51, 393.42, 414.45,
1466 455.12, 514.62, 520.38, 547.42, 562.6, 487.47, 480.83, 391.06,
1467 376.92, 303.7, 295.91, 256.03, 236.73, 280.38, 310.71, 335.53,
1468 367.88, 401.94, 435.52, 469.13, 497.94, 588.82, 597.94, 597.2,
1469 588.28, 571.2, 555.75, 603.56, 638.15, 680.75, 801.72, 848.01,
1470 962.15, 990.06, 1068.1, 1076.2, 1115.3, 1134.2, 1136.6, 1119.1,
1471 1108.9, 1090.6, 1068.7, 1041.9, 1005.4, 967.98, 927.08, 780.1,
1472 751.41, 733.12, 742.65, 785.56, 855.16, 852.45, 878.1, 784.59,
1473 777.81, 765.13, 622.93, 498.09, 474.89, 386.9, 378.48, 336.17,
1474 322.04, 329.57, 350.5, 383.38, 420.02, 462.39, 499.71, 531.98,
1475 654.99, 653.43, 639.99, 605.16, 554.16, 504.42, 540.64, 552.33,
1476 679.46, 699.51, 713.91, 832.17, 919.91, 884.96, 907.57, 846.56,
1477 818.56, 768.93, 706.71, 642.17, 575.95, 515.38, 459.07, 409.02,
1478 364.61, 325.46, 291.1, 260.89, 234.39, 211.01, 190.38, 172.11,
1479 155.91, 141.49, 128.63, 117.13, 106.84, 97.584, 89.262, 81.756,
1480 74.975, 68.842, 63.28, 58.232, 53.641, 49.46, 45.649, 42.168,
1481 38.991, 36.078, 33.409, 30.96, 28.71, 26.642, 24.737, 22.985,
1482 21.37, 19.882, 18.512, 17.242, 16.073, 14.987, 13.984, 13.05,
1483 12.186, 11.384, 10.637, 9.9436, 9.2988, 8.6991, 8.141, 7.6215,
1484 7.1378, 6.6872, 6.2671, 5.8754, 5.51, 5.1691, 4.851, 4.5539,
1485 4.2764, 4.0169, 3.7742, 3.5472, 3.3348, 3.1359, 2.9495, 2.7749,
1486 2.6113, 2.4578, 2.3139, 2.1789, 2.0523, 1.9334, 1.8219, 1.7171,
1487 1.6188, 1.5263, 1.4395, 1.3579, 1.2812, 1.209, 1.1411, 1.0773,
1488 1.0171, .96048, .90713, .85684, .80959, .76495, .72282, .68309,
1489 .64563, .61035, .57707, .54573, .51622, .48834, .46199, .43709,
1490 .41359, .39129, .37034, .35064, .33198, .31442, .29784, .28218,
1491 .26732, .25337, .24017, .22774, .21601, .20479, .19426
1492 };
1493
1494 static const double co2260[2001] =
1495 { 5.7971e-5, 6.0733e-5, 6.3628e-5, 6.6662e-5,
1496 6.9843e-5, 7.3176e-5, 7.6671e-5, 8.0334e-5, 8.4175e-5, 8.8201e-5,
1497 9.2421e-5, 9.6846e-5, 1.0149e-4, 1.0635e-4, 1.1145e-4, 1.1679e-4,
1498 1.224e-4, 1.2828e-4, 1.3444e-4, 1.409e-4, 1.4768e-4, 1.5479e-4,
1499 1.6224e-4, 1.7006e-4, 1.7826e-4, 1.8685e-4, 1.9587e-4, 2.0532e-4,
1500 2.1524e-4, 2.2565e-4, 2.3656e-4, 2.48e-4, 2.6001e-4, 2.7261e-4,
1501 2.8582e-4, 2.9968e-4, 3.1422e-4, 3.2948e-4, 3.4548e-4, 3.6228e-4,
1502 3.799e-4, 3.9838e-4, 4.1778e-4, 4.3814e-4, 4.595e-4, 4.8191e-4,
1503 5.0543e-4, 5.3012e-4, 5.5603e-4, 5.8321e-4, 6.1175e-4, 6.417e-4,
1504 6.7314e-4, 7.0614e-4, 7.4078e-4, 7.7714e-4, 8.1531e-4, 8.5538e-4,
1505 8.9745e-4, 9.4162e-4, 9.8798e-4, .0010367, .0010878, .0011415,
1506 .0011978, .001257, .0013191, .0013844, .001453, .0015249,
1507 .0016006, .00168, .0017634, .001851, .001943, .0020397, .0021412,
1508 .0022479, .00236, .0024778, .0026015, .0027316, .0028682,
1509 .0030117, .0031626, .0033211, .0034877, .0036628, .0038469,
1510 .0040403, .0042436, .0044574, .004682, .0049182, .0051665,
1511 .0054276, .0057021, .0059907, .0062942, .0066133, .0069489,
1512 .0073018, .0076729, .0080632, .0084738, .0089056, .0093599,
1513 .0098377, .01034, .010869, .011426, .012011, .012627, .013276,
1514 .013958, .014676, .015431, .016226, .017063, .017944, .018872,
1515 .019848, .020876, .021958, .023098, .024298, .025561, .026892,
1516 .028293, .029769, .031323, .032961, .034686, .036503, .038418,
1517 .040435, .042561, .044801, .047161, .049649, .052271, .055035,
1518 .057948, .061019, .064256, .06767, .07127, .075066, .079069,
1519 .083291, .087744, .092441, .097396, .10262, .10814, .11396,
1520 .1201, .12658, .13342, .14064, .14826, .1563, .1648, .17376,
1521 .18323, .19324, .2038, .21496, .22674, .23919, .25234, .26624,
1522 .28093, .29646, .31287, .33021, .34855, .36794, .38844, .41012,
1523 .43305, .45731, .48297, .51011, .53884, .56924, .60141, .63547,
1524 .67152, .70969, .75012, .79292, .83826, .8863, .93718, .99111,
1525 1.0482, 1.1088, 1.173, 1.2411, 1.3133, 1.3898, 1.471, 1.5571,
1526 1.6485, 1.7455, 1.8485, 1.9577, 2.0737, 2.197, 2.3278, 2.4668,
1527 2.6145, 2.7715, 2.9383, 3.1156, 3.3042, 3.5047, 3.7181, 3.9451,
1528 4.1866, 4.4437, 4.7174, 5.0089, 5.3192, 5.65, 6.0025, 6.3782,
1529 6.7787, 7.206, 7.6617, 8.1479, 8.6669, 9.221, 9.8128, 10.445,
1530 11.12, 11.843, 12.615, 13.441, 14.325, 15.271, 16.283, 17.367,
1531 18.529, 19.776, 21.111, 22.544, 24.082, 25.731, 27.504, 29.409,
1532 31.452, 33.654, 36.024, 38.573, 41.323, 44.29, 47.492, 50.951,
1533 54.608, 58.588, 62.929, 67.629, 72.712, 78.226, 84.207, 90.699,
1534 97.749, 105.42, 113.77, 122.86, 132.78, 143.61, 155.44, 168.33,
1535 182.48, 198.01, 214.87, 233.39, 253.86, 276.34, 300.3, 327.28,
1536 356.89, 389.48, 422.29, 458.99, 501.39, 548.13, 595.62, 652.74,
1537 716.54, 784.57, 866.78, 960.59, 1062.8, 1072.5, 1189.5, 1319.4,
1538 1467.6, 1630.2, 1813.7, 2016.9, 2253., 2515.3, 2773.5, 3092.8,
1539 3444.4, 3720.4, 4104.3, 4527.5, 4645.9, 5021.7, 5462.2, 5597.,
1540 6110.6, 6732.5, 7513.8, 8270.6, 9640.6, 11487., 2796.1, 2680.1,
1541 2441.6, 2404.2, 2334.8, 2215.2, 1642.5, 1477.9, 1328.1, 1223.5,
1542 843.34, 766.96, 831.65, 834.84, 774.85, 1156.3, 1275.6, 1366.1,
1543 1795.6, 1885., 1936.5, 1953.4, 2154.4, 2002.7, 1789.8, 10381.,
1544 9040., 8216.5, 7384.7, 6721.9, 6187.7, 6143.8, 5703.9, 5276.6,
1545 4873.1, 4736., 4325.3, 3927., 3554.1, 3286.1, 2950.1, 2642.4,
1546 2368.7, 2138.9, 1914., 1719.6, 1543.9, 1388.6, 1252.1, 1132.2,
1547 1024.1, 1025.4, 920.58, 829.59, 750.54, 685.01, 624.25, 570.14,
1548 525.81, 481.85, 441.95, 408.71, 377.23, 345.86, 318.51, 292.26,
1549 268.34, 247.04, 227.14, 209.02, 192.69, 177.59, 163.78, 151.26,
1550 139.73, 129.19, 119.53, 110.7, 102.57, 95.109, 88.264, 81.948,
1551 76.13, 70.768, 65.827, 61.251, 57.022, 53.495, 49.824, 46.443,
1552 43.307, 40.405, 37.716, 35.241, 32.923, 30.77, 28.78, 26.915,
1553 25.177, 23.56, 22.059, 20.654, 19.345, 18.126, 16.988, 15.93,
1554 14.939, 14.014, 13.149, 12.343, 11.589, 10.884, 10.225, 9.6093,
1555 9.0327, 8.4934, 7.9889, 7.5166, 7.0744, 6.6604, 6.2727, 5.9098,
1556 5.5701, 5.2529, 4.955, 4.676, 4.4148, 4.171, 3.9426, 3.7332,
1557 3.5347, 3.3493, 3.1677, 3.0025, 2.8466, 2.6994, 2.5601, 2.4277,
1558 2.3016, 2.1814, 2.0664, 1.9564, 1.8279, 1.7311, 1.6427, 1.5645,
1559 1.4982, 1.443, 1.374, 1.3146, 1.2562, 1.17, 1.1105, 1.0272,
1560 .96863, .89718, .83654, .80226, .75908, .72431, .69573, .67174,
1561 .65126, .63315, .61693, .60182, .58715, .59554, .57649, .55526,
1562 .53177, .50622, .48176, .4813, .47642, .47492, .50273, .50293,
1563 .52687, .52239, .53419, .53814, .52626, .52211, .51492, .50622,
1564 .49746, .48841, .4792, .43534, .41999, .40349, .38586, .36799,
1565 .35108, .31089, .30803, .3171, .33599, .35041, .36149, .32924,
1566 .32462, .27309, .25961, .20922, .19504, .15683, .13098, .11588,
1567 .11478, .11204, .11363, .12135, .16423, .17785, .19094, .20236,
1568 .21084, .2154, .24108, .22848, .20871, .18797, .17963, .17834,
1569 .21552, .22284, .26945, .27052, .30108, .28977, .29772, .29224,
1570 .27658, .24956, .22777, .20654, .18392, .16338, .1452, .12916,
1571 .1152, .10304, .092437, .083163, .075031, .067878, .061564,
1572 .055976, .051018, .046609, .042679, .03917, .036032, .033223,
1573 .030706, .02845, .026428, .024617, .022998, .021554, .02027,
1574 .019136, .018141, .017278, .016541, .015926, .015432, .015058,
1575 .014807, .014666, .014635, .014728, .014947, .01527, .015728,
1576 .016345, .017026, .017798, .018839, .019752, .020636, .021886,
1577 .022695, .02327, .023478, .024292, .023544, .022222, .021932,
1578 .020052, .018143, .017722, .017031, .017782, .01938, .020734,
1579 .020476, .019255, .017477, .016878, .014617, .012489, .011765,
1580 .0099077, .0086446, .0079446, .0078644, .0079763, .008671,
1581 .01001, .0108, .012933, .015349, .016341, .018484, .020254,
1582 .020254, .020478, .019591, .018595, .018385, .019913, .022254,
1583 .024847, .025809, .028053, .029924, .030212, .031367, .03222,
1584 .032739, .032537, .03286, .033344, .033507, .033499, .033339,
1585 .032809, .033041, .031723, .029837, .027511, .026603, .024032,
1586 .021914, .020948, .021701, .023425, .024259, .024987, .023818,
1587 .021768, .019223, .018144, .015282, .012604, .01163, .0097907,
1588 .008336, .0082473, .0079582, .0088077, .009779, .010129, .012145,
1589 .014378, .016761, .01726, .018997, .019998, .019809, .01819,
1590 .016358, .016099, .01617, .017939, .020223, .022521, .02277,
1591 .024279, .025247, .024222, .023989, .023224, .021493, .020362,
1592 .018596, .017309, .015975, .014466, .013171, .011921, .01078,
1593 .0097229, .0087612, .0078729, .0070682, .0063494, .0057156,
1594 .0051459, .0046273, .0041712, .0037686, .0034119, .003095,
1595 .0028126, .0025603, .0023342, .0021314, .0019489, .0017845,
1596 .001636, .0015017, .00138, .0012697, .0011694, .0010782,
1597 9.9507e-4, 9.1931e-4, 8.5013e-4, 7.869e-4, 7.2907e-4, 6.7611e-4,
1598 6.2758e-4, 5.8308e-4, 5.4223e-4, 5.0473e-4, 4.7027e-4, 4.3859e-4,
1599 4.0946e-4, 3.8265e-4, 3.5798e-4, 3.3526e-4, 3.1436e-4, 2.9511e-4,
1600 2.7739e-4, 2.6109e-4, 2.4609e-4, 2.3229e-4, 2.1961e-4, 2.0797e-4,
1601 1.9729e-4, 1.875e-4, 1.7855e-4, 1.7038e-4, 1.6294e-4, 1.5619e-4,
1602 1.5007e-4, 1.4456e-4, 1.3961e-4, 1.3521e-4, 1.3131e-4, 1.2789e-4,
1603 1.2494e-4, 1.2242e-4, 1.2032e-4, 1.1863e-4, 1.1733e-4, 1.1641e-4,
1604 1.1585e-4, 1.1565e-4, 1.158e-4, 1.1629e-4, 1.1712e-4, 1.1827e-4,
1605 1.1976e-4, 1.2158e-4, 1.2373e-4, 1.262e-4, 1.2901e-4, 1.3214e-4,
1606 1.3562e-4, 1.3944e-4, 1.4361e-4, 1.4814e-4, 1.5303e-4, 1.5829e-4,
1607 1.6394e-4, 1.6999e-4, 1.7644e-4, 1.8332e-4, 1.9063e-4, 1.984e-4,
1608 2.0663e-4, 2.1536e-4, 2.246e-4, 2.3436e-4, 2.4468e-4, 2.5558e-4,
1609 2.6708e-4, 2.7921e-4, 2.92e-4, 3.0548e-4, 3.1968e-4, 3.3464e-4,
1610 3.5039e-4, 3.6698e-4, 3.8443e-4, 4.0281e-4, 4.2214e-4, 4.4248e-4,
1611 4.6389e-4, 4.864e-4, 5.1009e-4, 5.3501e-4, 5.6123e-4, 5.888e-4,
1612 6.1781e-4, 6.4833e-4, 6.8043e-4, 7.142e-4, 7.4973e-4, 7.8711e-4,
1613 8.2644e-4, 8.6783e-4, 9.1137e-4, 9.5721e-4, .0010054, .0010562,
1614 .0011096, .0011659, .0012251, .0012875, .0013532, .0014224,
1615 .0014953, .001572, .0016529, .0017381, .0018279, .0019226,
1616 .0020224, .0021277, .0022386, .0023557, .0024792, .0026095,
1617 .002747, .0028921, .0030453, .0032071, .003378, .0035586,
1618 .0037494, .003951, .0041642, .0043897, .0046282, .0048805,
1619 .0051476, .0054304, .00573, .0060473, .0063837, .0067404,
1620 .0071188, .0075203, .0079466, .0083994, .0088806, .0093922,
1621 .0099366, .010516, .011134, .011792, .012494, .013244, .014046,
1622 .014898, .015808, .016781, .017822, .018929, .020108, .02138,
1623 .022729, .02419, .02576, .027412, .029233, .031198, .033301,
1624 .035594, .038092, .040767, .04372, .046918, .050246, .053974,
1625 .058009, .061976, .066586, .071537, .076209, .081856, .087998,
1626 .093821, .10113, .10913, .11731, .12724, .13821, .15025, .1639,
1627 .17807, .19472, .21356, .23496, .25758, .28387, .31389, .34104,
1628 .37469, .40989, .43309, .46845, .5042, .5023, .52981, .55275,
1629 .51075, .51976, .52457, .44779, .44721, .4503, .4243, .45244,
1630 .49491, .55399, .39021, .24802, .2501, .2618, .27475, .28879,
1631 .31317, .33643, .36257, .4018, .43275, .46525, .53333, .56599,
1632 .60557, .70142, .74194, .77736, .88567, .91182, .93294, .98407,
1633 .98772, .99176, .9995, 1.2405, 1.3602, 1.338, 1.3255, 1.3267,
1634 1.3404, 1.3634, 1.3967, 1.4407, 1.4961, 1.5603, 1.6328, 1.7153,
1635 1.8094, 1.9091, 2.018, 2.1367, 2.264, 2.4035, 2.5562, 2.7179,
1636 2.9017, 3.1052, 3.3304, 3.5731, 3.8488, 4.1553, 4.4769, 4.7818,
1637 5.1711, 5.5204, 5.9516, 6.4097, 6.8899, 7.1118, 7.5469, 7.9735,
1638 7.9511, 8.3014, 8.6418, 8.4757, 8.8256, 9.2294, 9.6923, 10.033,
1639 10.842, 11.851, 11.78, 8.8435, 9.1381, 9.5956, 10.076, 10.629,
1640 11.22, 11.883, 12.69, 13.163, 13.974, 14.846, 16.027, 17.053,
1641 18.148, 19.715, 20.907, 22.163, 23.956, 25.235, 26.566, 27.94,
1642 29.576, 30.956, 32.432, 35.337, 39.911, 41.128, 42.625, 44.386,
1643 46.369, 48.619, 51.031, 53.674, 56.825, 59.921, 63.286, 66.929,
1644 70.859, 75.081, 79.618, 84.513, 89.739, 95.335, 101.35, 107.76,
1645 114.63, 121.98, 129.87, 138.3, 147.34, 157.04, 167.56, 178.67,
1646 190.61, 203.43, 217.19, 231.99, 247.88, 264.98, 283.37, 303.17,
1647 324.49, 347.47, 372.25, 398.98, 427.85, 459.06, 492.8, 529.31,
1648 568.89, 611.79, 658.35, 708.91, 763.87, 823.65, 888.72, 959.58,
1649 1036.8, 1121.8, 1213.9, 1314.3, 1423.8, 1543., 1672.8, 1813.4,
1650 1966.1, 2131.4, 2309.5, 2499.3, 2705., 2925.7, 3161.6, 3411.3,
1651 3611.5, 3889.2, 4191.1, 4519.3, 4877.9, 5272.9, 5712.9, 6142.7,
1652 6719.6, 7385., 8145., 8977.7, 9831.9, 10827., 11934., 13063.,
1653 14434., 15878., 17591., 19435., 21510., 23835., 26835., 29740.,
1654 32878., 36305., 39830., 43273., 46931., 50499., 49586., 51598.,
1655 53429., 54619., 55081., 55102., 54485., 53487., 52042., 42689.,
1656 42607., 44020., 47994., 54169., 53916., 55808., 56642., 46049.,
1657 44243., 32929., 30658., 21963., 20835., 15962., 13679., 17652.,
1658 19680., 22388., 25625., 29184., 32520., 35720., 38414., 40523.,
1659 49228., 48173., 45678., 41768., 37600., 41313., 42654., 44465.,
1660 55736., 56630., 65409., 63308., 66572., 61845., 60379., 56777.,
1661 51920., 46601., 41367., 36529., 32219., 28470., 25192., 22362.,
1662 19907., 17772., 15907., 14273., 12835., 11567., 10445., 9450.2,
1663 8565.1, 7776., 7070.8, 6439.2, 5872.3, 5362.4, 4903., 4488.3,
1664 4113.4, 3773.8, 3465.8, 3186.1, 2931.7, 2700.1, 2488.8, 2296.,
1665 2119.8, 1958.6, 1810.9, 1675.6, 1551.4, 1437.3, 1332.4, 1236.,
1666 1147.2, 1065.3, 989.86, 920.22, 855.91, 796.48, 741.53, 690.69,
1667 643.62, 600.02, 559.6, 522.13, 487.35, 455.06, 425.08, 397.21,
1668 371.3, 347.2, 324.78, 303.9, 284.46, 266.34, 249.45, 233.7,
1669 219.01, 205.3, 192.5, 180.55, 169.38, 158.95, 149.2, 140.07,
1670 131.54, 123.56, 116.09, 109.09, 102.54, 96.405, 90.655, 85.266,
1671 80.213, 75.475, 71.031, 66.861, 62.948, 59.275, 55.827, 52.587,
1672 49.544, 46.686, 43.998, 41.473, 39.099, 36.867, 34.768, 32.795,
1673 30.939, 29.192, 27.546, 25.998, 24.539, 23.164, 21.869, 20.65,
1674 19.501, 18.419, 17.399, 16.438, 15.532, 14.678, 13.874, 13.115,
1675 12.4, 11.726, 11.088, 10.488, 9.921, 9.3846, 8.8784, 8.3996,
1676 7.9469, 7.5197, 7.1174, 6.738, 6.379, 6.0409, 5.7213, 5.419,
1677 5.1327, 4.8611, 4.6046, 4.3617, 4.1316, 3.9138, 3.7077, 3.5125,
1678 3.3281, 3.1536, 2.9885, 2.8323, 2.6846, 2.5447, 2.4124, 2.2871,
1679 2.1686, 2.0564, 1.9501, 1.8495, 1.7543, 1.6641, 1.5787, 1.4978,
1680 1.4212, 1.3486, 1.2799, 1.2147, 1.1529, 1.0943, 1.0388, .98602,
1681 .93596, .8886, .84352, .80078, .76029, .722, .68585, .65161,
1682 .61901, .58808, .55854, .53044, .5039, .47853, .45459, .43173,
1683 .41008, .38965, .37021, .35186, .33444, .31797, .30234, .28758,
1684 .2736, .26036, .24764, .2357, .22431, .21342, .20295, .19288,
1685 .18334, .17444, .166, .15815, .15072, .14348, .13674, .13015,
1686 .12399, .11807, .11231, .10689, .10164, .096696, .091955,
1687 .087476, .083183, .079113, .075229, .071536, .068026, .064698,
1688 .06154, .058544, .055699, .052997, .050431, .047993, .045676,
1689 .043475, .041382, .039392, .037501, .035702, .033991, .032364,
1690 .030817, .029345, .027945, .026613, .025345, .024139, .022991,
1691 .021899, .02086, .019871, .018929, .018033, .01718, .016368,
1692 .015595, .014859, .014158, .013491, .012856, .012251, .011675,
1693 .011126, .010604, .010107, .0096331, .009182, .0087523, .0083431,
1694 .0079533, .0075821, .0072284, .0068915, .0065706, .0062649,
1695 .0059737, .0056963, .005432, .0051802, .0049404, .0047118,
1696 .0044941, .0042867, .0040891, .0039009, .0037216, .0035507,
1697 .003388, .0032329, .0030852, .0029445, .0028105, .0026829,
1698 .0025613, .0024455, .0023353, .0022303, .0021304, .0020353,
1699 .0019448, .0018587, .0017767, .0016988, .0016247, .0015543,
1700 .0014874, .0014238, .0013635, .0013062, .0012519, .0012005,
1701 .0011517, .0011057, .0010621, .001021, 9.8233e-4, 9.4589e-4,
1702 9.1167e-4, 8.7961e-4, 8.4964e-4, 8.2173e-4, 7.9582e-4, 7.7189e-4,
1703 7.499e-4, 7.2983e-4, 7.1167e-4, 6.9542e-4, 6.8108e-4, 6.6866e-4,
1704 6.5819e-4, 6.4971e-4, 6.4328e-4, 6.3895e-4, 6.3681e-4, 6.3697e-4,
1705 6.3956e-4, 6.4472e-4, 6.5266e-4, 6.6359e-4, 6.778e-4, 6.9563e-4,
1706 7.1749e-4, 7.4392e-4, 7.7556e-4, 8.1028e-4, 8.4994e-4, 8.8709e-4,
1707 9.3413e-4, 9.6953e-4, .0010202, .0010738, .0010976, .0011507,
1708 .0011686, .0012264, .001291, .0013346, .0014246, .0015293,
1709 .0016359, .0017824, .0019255, .0020854, .002247, .0024148,
1710 .0026199, .0027523, .0029704, .0030702, .0033047, .0035013,
1711 .0037576, .0040275, .0043089, .0046927, .0049307, .0053486,
1712 .0053809, .0056699, .0059325, .0055488, .005634, .0056392,
1713 .004946, .0048855, .0048208, .0044386, .0045498, .0046377,
1714 .0048939, .0052396, .0057324, .0060859, .0066906, .0071148,
1715 .0077224, .0082687, .008769, .0084471, .008572, .0087729,
1716 .008775, .0090742, .0080704, .0080288, .0085747, .0086087,
1717 .0086408, .0088752, .0089381, .0089757, .0093532, .0092824,
1718 .0092566, .0092645, .0092735, .009342, .0095806, .0097991,
1719 .010213, .010611, .011129, .011756, .013237, .01412, .015034,
1720 .015936, .01682, .018597, .019315, .019995, .020658, .021289,
1721 .022363, .022996, .023716, .024512, .025434, .026067, .027118,
1722 .028396, .029865, .031442, .033253, .03525, .037296, .039701,
1723 .042356, .045154, .048059, .051294, .054893, .058636, .061407,
1724 .065172, .068974, .072676, .073379, .076547, .079556, .079134,
1725 .082308, .085739, .090192, .09359, .099599, .10669, .11496,
1726 .1244, .13512, .14752, .14494, .15647, .1668, .17863, .19029,
1727 .20124, .20254, .21179, .21982, .21625, .22364, .23405, .23382,
1728 .2434, .25708, .26406, .27621, .28909, .30395, .31717, .33271,
1729 .3496, .36765, .38774, .40949, .446, .46985, .49846, .5287, .562,
1730 .59841, .64598, .68834, .7327, .78978, .8373, .88708, .94744,
1731 1.0006, 1.0574, 1.1215, 1.1856, 1.2546, 1.3292, 1.4107, 1.4974,
1732 1.5913, 1.6931, 1.8028, 1.9212, 2.0492, 2.1874, 2.3365, 2.4978,
1733 2.6718, 2.8588, 3.062, 3.2818, 3.5188, 3.7752, 4.0527, 4.3542,
1734 4.6782, 5.0312, 5.4123, 5.8246, 6.2639, 6.7435, 7.2636, 7.8064,
1735 8.4091, 9.0696, 9.7677, 10.548, 11.4, 12.309, 13.324, 14.284,
1736 15.445, 16.687, 18.019, 19.403, 20.847, 22.366, 23.925, 25.537,
1737 27.213, 28.069, 29.864, 31.829, 33.988, 35.856, 38.829, 42.321,
1738 46.319, 50.606, 55.126, 59.126, 64.162, 68.708, 74.615, 81.176,
1739 87.739, 95.494, 103.83, 113.38, 123.99, 135.8, 148.7, 162.58,
1740 176.32, 192.6, 211.47, 232.7, 252.64, 277.41, 305.38, 333.44,
1741 366.42, 402.66, 442.14, 484.53, 526.42, 568.15, 558.78, 582.6,
1742 600.98, 613.94, 619.44, 618.24, 609.84, 595.96, 484.86, 475.59,
1743 478.49, 501.56, 552.19, 628.44, 630.39, 658.92, 671.96, 562.7,
1744 545.88, 423.43, 400.14, 306.59, 294.13, 246.8, 226.51, 278.21,
1745 314.39, 347.22, 389.13, 433.16, 477.48, 521.67, 560.54, 683.6,
1746 696.37, 695.91, 683.1, 658.24, 634.89, 698.85, 742.87, 796.66,
1747 954.49, 1009.5, 1150.5, 1179.1, 1267.9, 1272.4, 1312.7, 1330.4,
1748 1331.6, 1315.8, 1308.3, 1293.3, 1274.6, 1249.5, 1213.2, 1172.1,
1749 1124.4, 930.33, 893.36, 871.27, 883.54, 940.76, 1036., 1025.6,
1750 1053.1, 914.51, 894.15, 865.03, 670.63, 508.41, 475.15, 370.85,
1751 361.06, 319.38, 312.75, 331.87, 367.13, 415., 467.94, 525.49,
1752 578.41, 624.66, 794.82, 796.97, 780.29, 736.49, 670.18, 603.75,
1753 659.67, 679.8, 857.12, 884.05, 900.65, 1046.1, 1141.9, 1083.,
1754 1089.2, 1e3, 947.08, 872.31, 787.91, 704.75, 624.93, 553.68,
1755 489.91, 434.21, 385.64, 343.3, 306.42, 274.18, 245.94, 221.11,
1756 199.23, 179.88, 162.73, 147.48, 133.88, 121.73, 110.86, 101.1,
1757 92.323, 84.417, 77.281, 70.831, 64.991, 59.694, 54.884, 50.509,
1758 46.526, 42.893, 39.58, 36.549, 33.776, 31.236, 28.907, 26.77,
1759 24.805, 23., 21.339, 19.81, 18.404, 17.105, 15.909, 14.801,
1760 13.778, 12.83, 11.954, 11.142, 10.389, 9.691, 9.0434, 8.4423,
1761 7.8842, 7.3657, 6.8838, 6.4357, 6.0189, 5.6308, 5.2696, 4.9332,
1762 4.6198, 4.3277, 4.0553, 3.8012, 3.5639, 3.3424, 3.1355, 2.9422,
1763 2.7614, 2.5924, 2.4343, 2.2864, 2.148, 2.0184, 1.8971, 1.7835,
1764 1.677, 1.5773, 1.4838, 1.3961, 1.3139, 1.2369, 1.1645, 1.0966,
1765 1.0329, .97309, .91686, .86406, .81439, .76767, .72381, .68252,
1766 .64359, .60695, .57247, .54008, .50957, .48092, .45401, .42862,
1767 .40465, .38202, .36072, .34052, .3216, .30386, .28711, .27135,
1768 .25651, .24252, .2293, .21689, .20517, .19416, .18381, .17396,
1769 .16469
1770 };
1771
1772 static const double co2230[2001] =
1773 { 2.743e-5, 2.8815e-5, 3.027e-5, 3.1798e-5,
1774 3.3405e-5, 3.5094e-5, 3.6869e-5, 3.8734e-5, 4.0694e-5, 4.2754e-5,
1775 4.492e-5, 4.7196e-5, 4.9588e-5, 5.2103e-5, 5.4747e-5, 5.7525e-5,
1776 6.0446e-5, 6.3516e-5, 6.6744e-5, 7.0137e-5, 7.3704e-5, 7.7455e-5,
1777 8.1397e-5, 8.5543e-5, 8.9901e-5, 9.4484e-5, 9.9302e-5, 1.0437e-4,
1778 1.097e-4, 1.153e-4, 1.2119e-4, 1.2738e-4, 1.3389e-4, 1.4074e-4,
1779 1.4795e-4, 1.5552e-4, 1.6349e-4, 1.7187e-4, 1.8068e-4, 1.8995e-4,
1780 1.997e-4, 2.0996e-4, 2.2075e-4, 2.321e-4, 2.4403e-4, 2.5659e-4,
1781 2.698e-4, 2.837e-4, 2.9832e-4, 3.137e-4, 3.2988e-4, 3.4691e-4,
1782 3.6483e-4, 3.8368e-4, 4.0351e-4, 4.2439e-4, 4.4635e-4, 4.6947e-4,
1783 4.9379e-4, 5.1939e-4, 5.4633e-4, 5.7468e-4, 6.0452e-4, 6.3593e-4,
1784 6.69e-4, 7.038e-4, 7.4043e-4, 7.79e-4, 8.1959e-4, 8.6233e-4,
1785 9.0732e-4, 9.5469e-4, .0010046, .0010571, .0011124, .0011706,
1786 .0012319, .0012964, .0013644, .001436, .0015114, .0015908,
1787 .0016745, .0017625, .0018553, .0019531, .002056, .0021645,
1788 .0022788, .0023992, .002526, .0026596, .0028004, .0029488,
1789 .0031052, .0032699, .0034436, .0036265, .0038194, .0040227,
1790 .0042369, .0044628, .0047008, .0049518, .0052164, .0054953,
1791 .0057894, .0060995, .0064265, .0067713, .007135, .0075184,
1792 .0079228, .0083494, .0087993, .0092738, .0097745, .010303,
1793 .01086, .011448, .012068, .012722, .013413, .014142, .014911,
1794 .015723, .01658, .017484, .018439, .019447, .020511, .021635,
1795 .022821, .024074, .025397, .026794, .02827, .029829, .031475,
1796 .033215, .035052, .036994, .039045, .041213, .043504, .045926,
1797 .048485, .05119, .05405, .057074, .060271, .063651, .067225,
1798 .071006, .075004, .079233, .083708, .088441, .093449, .098749,
1799 .10436, .11029, .11657, .12322, .13026, .13772, .14561, .15397,
1800 .16282, .1722, .18214, .19266, .20381, .21563, .22816, .24143,
1801 .2555, .27043, .28625, .30303, .32082, .3397, .35972, .38097,
1802 .40352, .42746, .45286, .47983, .50847, .53888, .57119, .6055,
1803 .64196, .6807, .72187, .76564, .81217, .86165, .91427, .97025,
1804 1.0298, 1.0932, 1.1606, 1.2324, 1.3088, 1.3902, 1.477, 1.5693,
1805 1.6678, 1.7727, 1.8845, 2.0038, 2.131, 2.2666, 2.4114, 2.5659,
1806 2.7309, 2.907, 3.0951, 3.2961, 3.5109, 3.7405, 3.986, 4.2485,
1807 4.5293, 4.8299, 5.1516, 5.4961, 5.8651, 6.2605, 6.6842, 7.1385,
1808 7.6256, 8.1481, 8.7089, 9.3109, 9.9573, 10.652, 11.398, 12.2,
1809 13.063, 13.992, 14.99, 16.064, 17.222, 18.469, 19.813, 21.263,
1810 22.828, 24.516, 26.34, 28.31, 30.437, 32.738, 35.226, 37.914,
1811 40.824, 43.974, 47.377, 51.061, 55.011, 59.299, 63.961, 69.013,
1812 74.492, 80.444, 86.919, 93.836, 101.23, 109.25, 117.98, 127.47,
1813 137.81, 149.07, 161.35, 174.75, 189.42, 205.49, 223.02, 242.26,
1814 263.45, 286.75, 311.94, 340.01, 370.86, 404.92, 440.44, 480.27,
1815 525.17, 574.71, 626.22, 686.8, 754.38, 827.07, 913.38, 1011.7,
1816 1121.5, 1161.6, 1289.5, 1432.2, 1595.4, 1777., 1983.3, 2216.1,
1817 2485.7, 2788.3, 3101.5, 3481., 3902.1, 4257.1, 4740., 5272.8,
1818 5457.9, 5946.2, 6505.3, 6668.4, 7302.4, 8061.6, 9015.8, 9908.3,
1819 11613., 13956., 3249.6, 3243., 2901.5, 2841.3, 2729.6, 2558.2,
1820 1797.8, 1583.2, 1386., 1233.5, 787.74, 701.46, 761.66, 767.21,
1821 722.83, 1180.6, 1332.1, 1461.6, 2032.9, 2166., 2255.9, 2294.7,
1822 2587.2, 2396.5, 2122.4, 12553., 10784., 9832.5, 8827.3, 8029.1,
1823 7377.9, 7347.1, 6783.8, 6239.1, 5721.1, 5503., 4975.1, 4477.8,
1824 4021.3, 3676.8, 3275.3, 2914.9, 2597.4, 2328.2, 2075.4, 1857.6,
1825 1663.6, 1493.3, 1343.8, 1213.3, 1095.6, 1066.5, 958.91, 865.15,
1826 783.31, 714.35, 650.77, 593.98, 546.2, 499.9, 457.87, 421.75,
1827 387.61, 355.25, 326.62, 299.7, 275.21, 253.17, 232.83, 214.31,
1828 197.5, 182.08, 167.98, 155.12, 143.32, 132.5, 122.58, 113.48,
1829 105.11, 97.415, 90.182, 83.463, 77.281, 71.587, 66.341, 61.493,
1830 57.014, 53.062, 49.21, 45.663, 42.38, 39.348, 36.547, 33.967,
1831 31.573, 29.357, 27.314, 25.415, 23.658, 22.03, 20.524, 19.125,
1832 17.829, 16.627, 15.511, 14.476, 13.514, 12.618, 11.786, 11.013,
1833 10.294, 9.6246, 9.0018, 8.4218, 7.8816, 7.3783, 6.9092, 6.4719,
1834 6.0641, 5.6838, 5.3289, 4.998, 4.6893, 4.4014, 4.1325, 3.8813,
1835 3.6469, 3.4283, 3.2241, 3.035, 2.8576, 2.6922, 2.5348, 2.3896,
1836 2.2535, 2.1258, 2.0059, 1.8929, 1.7862, 1.6854, 1.5898, 1.4992,
1837 1.4017, 1.3218, 1.2479, 1.1809, 1.1215, 1.0693, 1.0116, .96016,
1838 .9105, .84859, .80105, .74381, .69982, .65127, .60899, .57843,
1839 .54592, .51792, .49336, .47155, .45201, .43426, .41807, .40303,
1840 .38876, .3863, .37098, .35492, .33801, .32032, .30341, .29874,
1841 .29193, .28689, .29584, .29155, .29826, .29195, .29287, .2904,
1842 .28199, .27709, .27162, .26622, .26133, .25676, .25235, .23137,
1843 .22365, .21519, .20597, .19636, .18699, .16485, .16262, .16643,
1844 .17542, .18198, .18631, .16759, .16338, .13505, .1267, .10053,
1845 .092554, .074093, .062159, .055523, .054849, .05401, .05528,
1846 .058982, .07952, .08647, .093244, .099285, .10393, .10661,
1847 .12072, .11417, .10396, .093265, .089137, .088909, .10902,
1848 .11277, .13625, .13565, .14907, .14167, .1428, .13744, .12768,
1849 .11382, .10244, .091686, .08109, .071739, .063616, .056579,
1850 .050504, .045251, .040689, .036715, .033237, .030181, .027488,
1851 .025107, .022998, .021125, .01946, .017979, .016661, .015489,
1852 .014448, .013526, .012712, .011998, .011375, .010839, .010384,
1853 .010007, .0097053, .0094783, .0093257, .0092489, .0092504,
1854 .0093346, .0095077, .0097676, .01012, .01058, .011157, .011844,
1855 .012672, .013665, .014766, .015999, .017509, .018972, .020444,
1856 .022311, .023742, .0249, .025599, .026981, .026462, .025143,
1857 .025066, .022814, .020458, .020026, .019142, .020189, .022371,
1858 .024163, .023728, .02199, .019506, .018591, .015576, .012784,
1859 .011744, .0094777, .0079148, .0070652, .006986, .0071758,
1860 .008086, .0098025, .01087, .013609, .016764, .018137, .021061,
1861 .023498, .023576, .023965, .022828, .021519, .021283, .023364,
1862 .026457, .029782, .030856, .033486, .035515, .035543, .036558,
1863 .037198, .037472, .037045, .037284, .03777, .038085, .038366,
1864 .038526, .038282, .038915, .037697, .035667, .032941, .031959,
1865 .028692, .025918, .024596, .025592, .027873, .028935, .02984,
1866 .028148, .025305, .021912, .020454, .016732, .013357, .01205,
1867 .009731, .0079881, .0077704, .0074387, .0083895, .0096776,
1868 .010326, .01293, .015955, .019247, .020145, .02267, .024231,
1869 .024184, .022131, .019784, .01955, .01971, .022119, .025116,
1870 .027978, .028107, .029808, .030701, .029164, .028551, .027286,
1871 .024946, .023259, .020982, .019221, .017471, .015643, .014074,
1872 .01261, .011301, .010116, .0090582, .0081036, .0072542, .0065034,
1873 .0058436, .0052571, .0047321, .0042697, .0038607, .0034977,
1874 .0031747, .0028864, .0026284, .002397, .002189, .0020017,
1875 .0018326, .0016798, .0015414, .0014159, .0013019, .0011983,
1876 .0011039, .0010177, 9.391e-4, 8.6717e-4, 8.0131e-4, 7.4093e-4,
1877 6.8553e-4, 6.3464e-4, 5.8787e-4, 5.4487e-4, 5.0533e-4, 4.69e-4,
1878 4.3556e-4, 4.0474e-4, 3.7629e-4, 3.5e-4, 3.2569e-4, 3.032e-4,
1879 2.8239e-4, 2.6314e-4, 2.4535e-4, 2.2891e-4, 2.1374e-4, 1.9975e-4,
1880 1.8685e-4, 1.7498e-4, 1.6406e-4, 1.5401e-4, 1.4479e-4, 1.3633e-4,
1881 1.2858e-4, 1.2148e-4, 1.1499e-4, 1.0907e-4, 1.0369e-4, 9.8791e-5,
1882 9.4359e-5, 9.0359e-5, 8.6766e-5, 8.3555e-5, 8.0703e-5, 7.8192e-5,
1883 7.6003e-5, 7.4119e-5, 7.2528e-5, 7.1216e-5, 7.0171e-5, 6.9385e-5,
1884 6.8848e-5, 6.8554e-5, 6.8496e-5, 6.8669e-5, 6.9069e-5, 6.9694e-5,
1885 7.054e-5, 7.1608e-5, 7.2896e-5, 7.4406e-5, 7.6139e-5, 7.8097e-5,
1886 8.0283e-5, 8.2702e-5, 8.5357e-5, 8.8255e-5, 9.1402e-5, 9.4806e-5,
1887 9.8473e-5, 1.0241e-4, 1.0664e-4, 1.1115e-4, 1.1598e-4, 1.2112e-4,
1888 1.2659e-4, 1.3241e-4, 1.3859e-4, 1.4515e-4, 1.521e-4, 1.5947e-4,
1889 1.6728e-4, 1.7555e-4, 1.8429e-4, 1.9355e-4, 2.0334e-4, 2.1369e-4,
1890 2.2463e-4, 2.3619e-4, 2.4841e-4, 2.6132e-4, 2.7497e-4, 2.8938e-4,
1891 3.0462e-4, 3.2071e-4, 3.3771e-4, 3.5567e-4, 3.7465e-4, 3.947e-4,
1892 4.1588e-4, 4.3828e-4, 4.6194e-4, 4.8695e-4, 5.1338e-4, 5.4133e-4,
1893 5.7087e-4, 6.0211e-4, 6.3515e-4, 6.701e-4, 7.0706e-4, 7.4617e-4,
1894 7.8756e-4, 8.3136e-4, 8.7772e-4, 9.2681e-4, 9.788e-4, .0010339,
1895 .0010922, .001154, .0012195, .0012889, .0013626, .0014407,
1896 .0015235, .0016114, .0017048, .0018038, .001909, .0020207,
1897 .0021395, .0022657, .0023998, .0025426, .0026944, .002856,
1898 .0030281, .0032114, .0034068, .003615, .0038371, .004074,
1899 .004327, .0045971, .0048857, .0051942, .0055239, .0058766,
1900 .0062538, .0066573, .0070891, .007551, .0080455, .0085747,
1901 .0091412, .0097481, .010397, .011092, .011837, .012638, .013495,
1902 .014415, .01541, .016475, .017621, .018857, .020175, .02162,
1903 .023185, .024876, .02672, .028732, .030916, .033319, .035939,
1904 .038736, .041847, .04524, .048715, .052678, .056977, .061203,
1905 .066184, .07164, .076952, .083477, .090674, .098049, .10697,
1906 .1169, .1277, .14011, .15323, .1684, .18601, .20626, .22831,
1907 .25417, .28407, .31405, .34957, .38823, .41923, .46026, .50409,
1908 .51227, .54805, .57976, .53818, .55056, .557, .46741, .46403,
1909 .4636, .42265, .45166, .49852, .56663, .34306, .17779, .17697,
1910 .18346, .19129, .20014, .21778, .23604, .25649, .28676, .31238,
1911 .33856, .39998, .4288, .46568, .56654, .60786, .64473, .76466,
1912 .7897, .80778, .86443, .85736, .84798, .84157, 1.1385, 1.2446,
1913 1.1923, 1.1552, 1.1338, 1.1266, 1.1292, 1.1431, 1.1683, 1.2059,
1914 1.2521, 1.3069, 1.3712, 1.4471, 1.5275, 1.6165, 1.7145, 1.8189,
1915 1.9359, 2.065, 2.2007, 2.3591, 2.5362, 2.7346, 2.9515, 3.2021,
1916 3.4851, 3.7935, 4.0694, 4.4463, 4.807, 5.2443, 5.7178, 6.2231,
1917 6.4796, 6.9461, 7.4099, 7.3652, 7.7182, 8.048, 7.7373, 8.0363,
1918 8.3855, 8.8044, 9.0257, 9.8574, 10.948, 10.563, 6.8979, 7.0744,
1919 7.4121, 7.7663, 8.1768, 8.6243, 9.1437, 9.7847, 10.182, 10.849,
1920 11.572, 12.602, 13.482, 14.431, 15.907, 16.983, 18.11, 19.884,
1921 21.02, 22.18, 23.355, 24.848, 25.954, 27.13, 30.186, 34.893,
1922 35.682, 36.755, 38.111, 39.703, 41.58, 43.606, 45.868, 48.573,
1923 51.298, 54.291, 57.559, 61.116, 64.964, 69.124, 73.628, 78.471,
1924 83.683, 89.307, 95.341, 101.84, 108.83, 116.36, 124.46, 133.18,
1925 142.57, 152.79, 163.69, 175.43, 188.11, 201.79, 216.55, 232.51,
1926 249.74, 268.38, 288.54, 310.35, 333.97, 359.55, 387.26, 417.3,
1927 449.88, 485.2, 523.54, 565.14, 610.28, 659.31, 712.56, 770.43,
1928 833.36, 901.82, 976.36, 1057.6, 1146.8, 1243.8, 1350., 1466.3,
1929 1593.6, 1732.7, 1884.1, 2049.1, 2228.2, 2421.9, 2629.4, 2853.7,
1930 3094.4, 3351.1, 3622.3, 3829.8, 4123.1, 4438.3, 4777.2, 5144.1,
1931 5545.4, 5990.5, 6404.5, 6996.8, 7687.6, 8482.9, 9349.4, 10203.,
1932 11223., 12358., 13493., 14916., 16416., 18236., 20222., 22501.,
1933 25102., 28358., 31707., 35404., 39538., 43911., 48391., 53193.,
1934 58028., 58082., 61276., 64193., 66294., 67480., 67921., 67423.,
1935 66254., 64341., 51737., 51420., 53072., 58145., 66195., 65358.,
1936 67377., 67869., 53509., 50553., 35737., 32425., 21704., 19974.,
1937 14457., 12142., 16798., 19489., 23049., 27270., 31910., 36457.,
1938 40877., 44748., 47876., 59793., 58626., 55454., 50337., 44893.,
1939 50228., 52216., 54747., 69541., 70455., 81014., 77694., 80533.,
1940 73953., 70927., 65539., 59002., 52281., 45953., 40292., 35360.,
1941 31124., 27478., 24346., 21647., 19308., 17271., 15491., 13927.,
1942 12550., 11331., 10250., 9288.8, 8431.4, 7664.9, 6978.3, 6361.8,
1943 5807.4, 5307.7, 4856.8, 4449., 4079.8, 3744.9, 3440.8, 3164.2,
1944 2912.3, 2682.7, 2473., 2281.4, 2106., 1945.3, 1797.9, 1662.5,
1945 1538.1, 1423.6, 1318.1, 1221., 1131.5, 1049., 972.99, 902.87,
1946 838.01, 777.95, 722.2, 670.44, 622.35, 577.68, 536.21, 497.76,
1947 462.12, 429.13, 398.61, 370.39, 344.29, 320.16, 297.85, 277.2,
1948 258.08, 240.38, 223.97, 208.77, 194.66, 181.58, 169.43, 158.15,
1949 147.67, 137.92, 128.86, 120.44, 112.6, 105.3, 98.499, 92.166,
1950 86.264, 80.763, 75.632, 70.846, 66.381, 62.213, 58.321, 54.685,
1951 51.288, 48.114, 45.145, 42.368, 39.772, 37.341, 35.065, 32.937,
1952 30.943, 29.077, 27.33, 25.693, 24.158, 22.717, 21.367, 20.099,
1953 18.909, 17.792, 16.744, 15.761, 14.838, 13.971, 13.157, 12.393,
1954 11.676, 11.003, 10.369, 9.775, 9.2165, 8.6902, 8.1963, 7.7314,
1955 7.2923, 6.8794, 6.4898, 6.122, 5.7764, 5.4525, 5.1484, 4.8611,
1956 4.5918, 4.3379, 4.0982, 3.8716, 3.6567, 3.4545, 3.2634, 3.0828,
1957 2.9122, 2.7512, 2.5993, 2.4561, 2.3211, 2.1938, 2.0737, 1.9603,
1958 1.8534, 1.7525, 1.6572, 1.5673, 1.4824, 1.4022, 1.3265, 1.2551,
1959 1.1876, 1.1239, 1.0637, 1.0069, .9532, .90248, .85454, .80921,
1960 .76631, .72569, .6872, .65072, .61635, .5836, .55261, .52336,
1961 .49581, .46998, .44559, .42236, .40036, .37929, .35924, .34043,
1962 .32238, .30547, .28931, .27405, .25975, .24616, .23341, .22133,
1963 .20997, .19924, .18917, .17967, .17075, .16211, .15411, .14646,
1964 .13912, .13201, .12509, .11857, .11261, .10698, .10186, .097039,
1965 .092236, .087844, .083443, .07938, .075452, .071564, .067931,
1966 .064389, .061078, .057901, .054921, .052061, .049364, .046789,
1967 .04435, .042044, .039866, .037808, .035863, .034023, .032282,
1968 .030634, .029073, .027595, .026194, .024866, .023608, .022415,
1969 .021283, .02021, .019193, .018228, .017312, .016443, .015619,
1970 .014837, .014094, .01339, .012721, .012086, .011483, .010911,
1971 .010368, .009852, .0093623, .0088972, .0084556, .0080362,
1972 .0076379, .0072596, .0069003, .006559, .0062349, .0059269,
1973 .0056344, .0053565, .0050925, .0048417, .0046034, .004377,
1974 .0041618, .0039575, .0037633, .0035788, .0034034, .0032368,
1975 .0030785, .002928, .0027851, .0026492, .0025201, .0023975,
1976 .0022809, .0021701, .0020649, .0019649, .0018699, .0017796,
1977 .0016938, .0016122, .0015348, .0014612, .0013913, .001325,
1978 .0012619, .0012021, .0011452, .0010913, .0010401, 9.9149e-4,
1979 9.454e-4, 9.0169e-4, 8.6024e-4, 8.2097e-4, 7.8377e-4, 7.4854e-4,
1980 7.1522e-4, 6.8371e-4, 6.5393e-4, 6.2582e-4, 5.9932e-4, 5.7435e-4,
1981 5.5087e-4, 5.2882e-4, 5.0814e-4, 4.8881e-4, 4.7076e-4, 4.5398e-4,
1982 4.3843e-4, 4.2407e-4, 4.109e-4, 3.9888e-4, 3.88e-4, 3.7826e-4,
1983 3.6963e-4, 3.6213e-4, 3.5575e-4, 3.505e-4, 3.464e-4, 3.4346e-4,
1984 3.4173e-4, 3.4125e-4, 3.4206e-4, 3.4424e-4, 3.4787e-4, 3.5303e-4,
1985 3.5986e-4, 3.6847e-4, 3.7903e-4, 3.9174e-4, 4.0681e-4, 4.2455e-4,
1986 4.4527e-4, 4.6942e-4, 4.9637e-4, 5.2698e-4, 5.5808e-4, 5.9514e-4,
1987 6.2757e-4, 6.689e-4, 7.1298e-4, 7.3955e-4, 7.8403e-4, 8.0449e-4,
1988 8.5131e-4, 9.0256e-4, 9.3692e-4, .0010051, .0010846, .0011678,
1989 .001282, .0014016, .0015355, .0016764, .0018272, .0020055,
1990 .0021455, .0023421, .0024615, .0026786, .0028787, .0031259,
1991 .0034046, .0036985, .0040917, .0043902, .0048349, .0049531,
1992 .0052989, .0056148, .0052452, .0053357, .005333, .0045069,
1993 .0043851, .004253, .003738, .0038084, .0039013, .0041505,
1994 .0045372, .0050569, .0054507, .0061267, .0066122, .0072449,
1995 .0078012, .0082651, .0076538, .0076573, .0076806, .0075227,
1996 .0076269, .0063758, .006254, .0067749, .0067909, .0068231,
1997 .0072143, .0072762, .0072954, .007679, .0075107, .0073658,
1998 .0072441, .0071074, .0070378, .007176, .0072472, .0075844,
1999 .0079291, .008412, .0090165, .010688, .011535, .012375, .013166,
2000 .013895, .015567, .016011, .016392, .016737, .017043, .017731,
2001 .018031, .018419, .018877, .019474, .019868, .020604, .021538,
2002 .022653, .023869, .025288, .026879, .028547, .030524, .03274,
2003 .035132, .03769, .040567, .043793, .047188, .049962, .053542,
2004 .057205, .060776, .061489, .064419, .067124, .065945, .068487,
2005 .071209, .074783, .077039, .082444, .08902, .09692, .10617,
2006 .11687, .12952, .12362, .13498, .14412, .15492, .16519, .1744,
2007 .17096, .17714, .18208, .17363, .17813, .18564, .18295, .19045,
2008 .20252, .20815, .21844, .22929, .24229, .25321, .26588, .2797,
2009 .29465, .31136, .32961, .36529, .38486, .41027, .43694, .4667,
2010 .49943, .54542, .58348, .62303, .67633, .71755, .76054, .81371,
2011 .85934, .90841, .96438, 1.0207, 1.0821, 1.1491, 1.2226, 1.3018,
2012 1.388, 1.4818, 1.5835, 1.6939, 1.8137, 1.9435, 2.0843, 2.237,
2013 2.4026, 2.5818, 2.7767, 2.9885, 3.2182, 3.4679, 3.7391, 4.0349,
2014 4.3554, 4.7053, 5.0849, 5.4986, 5.9436, 6.4294, 6.9598, 7.5203,
2015 8.143, 8.8253, 9.5568, 10.371, 11.267, 12.233, 13.31, 14.357,
2016 15.598, 16.93, 18.358, 19.849, 21.408, 23.04, 24.706, 26.409,
2017 28.153, 28.795, 30.549, 32.43, 34.49, 36.027, 38.955, 42.465,
2018 46.565, 50.875, 55.378, 59.002, 63.882, 67.949, 73.693, 80.095,
2019 86.403, 94.264, 102.65, 112.37, 123.3, 135.54, 149.14, 163.83,
2020 179.17, 196.89, 217.91, 240.94, 264.13, 292.39, 324.83, 358.21,
2021 397.16, 440.5, 488.6, 541.04, 595.3, 650.43, 652.03, 688.74,
2022 719.47, 743.54, 757.68, 762.35, 756.43, 741.42, 595.43, 580.97,
2023 580.83, 605.68, 667.88, 764.49, 759.93, 789.12, 798.17, 645.66,
2024 615.65, 455.05, 421.09, 306.45, 289.14, 235.7, 215.52, 274.57,
2025 316.53, 357.73, 409.89, 465.06, 521.84, 579.02, 630.64, 794.46,
2026 813., 813.56, 796.25, 761.57, 727.97, 812.14, 866.75, 932.5,
2027 1132.8, 1194.8, 1362.2, 1387.2, 1482.3, 1479.7, 1517.9, 1533.1,
2028 1534.2, 1523.3, 1522.5, 1515.5, 1505.2, 1486.5, 1454., 1412.,
2029 1358.8, 1107.8, 1060.9, 1033.5, 1048.2, 1122.4, 1248.9, 1227.1,
2030 1255.4, 1058.9, 1020.7, 970.59, 715.24, 512.56, 468.47, 349.3,
2031 338.26, 299.22, 301.26, 332.38, 382.08, 445.49, 515.87, 590.85,
2032 662.3, 726.05, 955.59, 964.11, 945.17, 891.48, 807.11, 720.9,
2033 803.36, 834.46, 1073.9, 1107.1, 1123.6, 1296., 1393.7, 1303.1,
2034 1284.3, 1161.8, 1078.8, 976.13, 868.72, 767.4, 674.72, 593.73,
2035 523.12, 462.24, 409.75, 364.34, 325., 290.73, 260.76, 234.46,
2036 211.28, 190.78, 172.61, 156.44, 142.01, 129.12, 117.57, 107.2,
2037 97.877, 89.47, 81.882, 75.021, 68.807, 63.171, 58.052, 53.396,
2038 49.155, 45.288, 41.759, 38.531, 35.576, 32.868, 30.384, 28.102,
2039 26.003, 24.071, 22.293, 20.655, 19.147, 17.756, 16.476, 15.292,
2040 14.198, 13.183, 12.241, 11.367, 10.554, 9.7989, 9.0978, 8.4475,
2041 7.845, 7.2868, 6.7704, 6.2927, 5.8508, 5.4421, 5.064, 4.714,
2042 4.3902, 4.0902, 3.8121, 3.5543, 3.315, 3.093, 2.8869, 2.6953,
2043 2.5172, 2.3517, 2.1977, 2.0544, 1.9211, 1.7969, 1.6812, 1.5735,
2044 1.4731, 1.3794, 1.2921, 1.2107, 1.1346, 1.0637, .99744, .93554,
2045 .87771, .82368, .77313, .72587, .6816, .64014, .60134, .565,
2046 .53086, .49883, .46881, .44074, .4144, .38979, .36679, .34513,
2047 .32474, .30552, .28751, .27045, .25458, .23976, .22584, .21278,
2048 .20051, .18899, .17815, .16801, .15846, .14954, .14117, .13328,
2049 .12584
2050 };
2051
2052 /* Get CO2 continuum absorption... */
2053 const double xw = nu / 2 + 1;
2054 if (xw >= 1 && xw < 2001) {
2055 const int iw = (int) xw;
2056 const double dw = xw - iw;
2057 const double ew = 1 - dw;
2058 const double cw296 = ew * co2296[iw - 1] + dw * co2296[iw];
2059 const double cw260 = ew * co2260[iw - 1] + dw * co2260[iw];
2060 const double cw230 = ew * co2230[iw - 1] + dw * co2230[iw];
2061 const double dt230 = t - 230;
2062 const double dt260 = t - 260;
2063 const double dt296 = t - 296;
2064 const double ctw =
2065 dt260 * 5.050505e-4 * dt296 * cw230 -
2066 dt230 * 9.259259e-4 * dt296 * cw260 +
2067 dt230 * 4.208754e-4 * dt260 * cw296;
2068 return u / NA / 1000 * p / P0 * ctw;
2069 } else
2070 return 0;
2071}
2072
2073/*****************************************************************************/
2074
2075double ctmh2o(
2076 const double nu,
2077 const double p,
2078 const double t,
2079 const double q,
2080 const double u) {
2081
2082 static const double h2o296[2001] =
2083 { .17, .1695, .172, .168, .1687, .1624, .1606,
2084 .1508, .1447, .1344, .1214, .1133, .1009, .09217, .08297, .06989,
2085 .06513, .05469, .05056, .04417, .03779, .03484, .02994, .0272,
2086 .02325, .02063, .01818, .01592, .01405, .01251, .0108, .009647,
2087 .008424, .007519, .006555, .00588, .005136, .004511, .003989,
2088 .003509, .003114, .00274, .002446, .002144, .001895, .001676,
2089 .001486, .001312, .001164, .001031, 9.129e-4, 8.106e-4, 7.213e-4,
2090 6.4e-4, 5.687e-4, 5.063e-4, 4.511e-4, 4.029e-4, 3.596e-4,
2091 3.22e-4, 2.889e-4, 2.597e-4, 2.337e-4, 2.108e-4, 1.907e-4,
2092 1.728e-4, 1.57e-4, 1.43e-4, 1.305e-4, 1.195e-4, 1.097e-4,
2093 1.009e-4, 9.307e-5, 8.604e-5, 7.971e-5, 7.407e-5, 6.896e-5,
2094 6.433e-5, 6.013e-5, 5.631e-5, 5.283e-5, 4.963e-5, 4.669e-5,
2095 4.398e-5, 4.148e-5, 3.917e-5, 3.702e-5, 3.502e-5, 3.316e-5,
2096 3.142e-5, 2.978e-5, 2.825e-5, 2.681e-5, 2.546e-5, 2.419e-5,
2097 2.299e-5, 2.186e-5, 2.079e-5, 1.979e-5, 1.884e-5, 1.795e-5,
2098 1.711e-5, 1.633e-5, 1.559e-5, 1.49e-5, 1.426e-5, 1.367e-5,
2099 1.312e-5, 1.263e-5, 1.218e-5, 1.178e-5, 1.143e-5, 1.112e-5,
2100 1.088e-5, 1.07e-5, 1.057e-5, 1.05e-5, 1.051e-5, 1.059e-5,
2101 1.076e-5, 1.1e-5, 1.133e-5, 1.18e-5, 1.237e-5, 1.308e-5,
2102 1.393e-5, 1.483e-5, 1.614e-5, 1.758e-5, 1.93e-5, 2.123e-5,
2103 2.346e-5, 2.647e-5, 2.93e-5, 3.279e-5, 3.745e-5, 4.152e-5,
2104 4.813e-5, 5.477e-5, 6.203e-5, 7.331e-5, 8.056e-5, 9.882e-5,
2105 1.05e-4, 1.21e-4, 1.341e-4, 1.572e-4, 1.698e-4, 1.968e-4,
2106 2.175e-4, 2.431e-4, 2.735e-4, 2.867e-4, 3.19e-4, 3.371e-4,
2107 3.554e-4, 3.726e-4, 3.837e-4, 3.878e-4, 3.864e-4, 3.858e-4,
2108 3.841e-4, 3.852e-4, 3.815e-4, 3.762e-4, 3.618e-4, 3.579e-4,
2109 3.45e-4, 3.202e-4, 3.018e-4, 2.785e-4, 2.602e-4, 2.416e-4,
2110 2.097e-4, 1.939e-4, 1.689e-4, 1.498e-4, 1.308e-4, 1.17e-4,
2111 1.011e-4, 9.237e-5, 7.909e-5, 7.006e-5, 6.112e-5, 5.401e-5,
2112 4.914e-5, 4.266e-5, 3.963e-5, 3.316e-5, 3.037e-5, 2.598e-5,
2113 2.294e-5, 2.066e-5, 1.813e-5, 1.583e-5, 1.423e-5, 1.247e-5,
2114 1.116e-5, 9.76e-6, 8.596e-6, 7.72e-6, 6.825e-6, 6.108e-6,
2115 5.366e-6, 4.733e-6, 4.229e-6, 3.731e-6, 3.346e-6, 2.972e-6,
2116 2.628e-6, 2.356e-6, 2.102e-6, 1.878e-6, 1.678e-6, 1.507e-6,
2117 1.348e-6, 1.21e-6, 1.089e-6, 9.806e-7, 8.857e-7, 8.004e-7,
2118 7.261e-7, 6.599e-7, 6.005e-7, 5.479e-7, 5.011e-7, 4.595e-7,
2119 4.219e-7, 3.885e-7, 3.583e-7, 3.314e-7, 3.071e-7, 2.852e-7,
2120 2.654e-7, 2.474e-7, 2.311e-7, 2.162e-7, 2.026e-7, 1.902e-7,
2121 1.788e-7, 1.683e-7, 1.587e-7, 1.497e-7, 1.415e-7, 1.338e-7,
2122 1.266e-7, 1.2e-7, 1.138e-7, 1.08e-7, 1.027e-7, 9.764e-8,
2123 9.296e-8, 8.862e-8, 8.458e-8, 8.087e-8, 7.744e-8, 7.429e-8,
2124 7.145e-8, 6.893e-8, 6.664e-8, 6.468e-8, 6.322e-8, 6.162e-8,
2125 6.07e-8, 5.992e-8, 5.913e-8, 5.841e-8, 5.796e-8, 5.757e-8,
2126 5.746e-8, 5.731e-8, 5.679e-8, 5.577e-8, 5.671e-8, 5.656e-8,
2127 5.594e-8, 5.593e-8, 5.602e-8, 5.62e-8, 5.693e-8, 5.725e-8,
2128 5.858e-8, 6.037e-8, 6.249e-8, 6.535e-8, 6.899e-8, 7.356e-8,
2129 7.918e-8, 8.618e-8, 9.385e-8, 1.039e-7, 1.158e-7, 1.29e-7,
2130 1.437e-7, 1.65e-7, 1.871e-7, 2.121e-7, 2.427e-7, 2.773e-7,
2131 3.247e-7, 3.677e-7, 4.037e-7, 4.776e-7, 5.101e-7, 6.214e-7,
2132 6.936e-7, 7.581e-7, 8.486e-7, 9.355e-7, 9.942e-7, 1.063e-6,
2133 1.123e-6, 1.191e-6, 1.215e-6, 1.247e-6, 1.26e-6, 1.271e-6,
2134 1.284e-6, 1.317e-6, 1.323e-6, 1.349e-6, 1.353e-6, 1.362e-6,
2135 1.344e-6, 1.329e-6, 1.336e-6, 1.327e-6, 1.325e-6, 1.359e-6,
2136 1.374e-6, 1.415e-6, 1.462e-6, 1.526e-6, 1.619e-6, 1.735e-6,
2137 1.863e-6, 2.034e-6, 2.265e-6, 2.482e-6, 2.756e-6, 3.103e-6,
2138 3.466e-6, 3.832e-6, 4.378e-6, 4.913e-6, 5.651e-6, 6.311e-6,
2139 7.169e-6, 8.057e-6, 9.253e-6, 1.047e-5, 1.212e-5, 1.36e-5,
2140 1.569e-5, 1.776e-5, 2.02e-5, 2.281e-5, 2.683e-5, 2.994e-5,
2141 3.488e-5, 3.896e-5, 4.499e-5, 5.175e-5, 6.035e-5, 6.34e-5,
2142 7.281e-5, 7.923e-5, 8.348e-5, 9.631e-5, 1.044e-4, 1.102e-4,
2143 1.176e-4, 1.244e-4, 1.283e-4, 1.326e-4, 1.4e-4, 1.395e-4,
2144 1.387e-4, 1.363e-4, 1.314e-4, 1.241e-4, 1.228e-4, 1.148e-4,
2145 1.086e-4, 1.018e-4, 8.89e-5, 8.316e-5, 7.292e-5, 6.452e-5,
2146 5.625e-5, 5.045e-5, 4.38e-5, 3.762e-5, 3.29e-5, 2.836e-5,
2147 2.485e-5, 2.168e-5, 1.895e-5, 1.659e-5, 1.453e-5, 1.282e-5,
2148 1.132e-5, 1.001e-5, 8.836e-6, 7.804e-6, 6.922e-6, 6.116e-6,
2149 5.429e-6, 4.824e-6, 4.278e-6, 3.788e-6, 3.371e-6, 2.985e-6,
2150 2.649e-6, 2.357e-6, 2.09e-6, 1.858e-6, 1.647e-6, 1.462e-6,
2151 1.299e-6, 1.155e-6, 1.028e-6, 9.142e-7, 8.132e-7, 7.246e-7,
2152 6.451e-7, 5.764e-7, 5.151e-7, 4.603e-7, 4.121e-7, 3.694e-7,
2153 3.318e-7, 2.985e-7, 2.69e-7, 2.428e-7, 2.197e-7, 1.992e-7,
2154 1.81e-7, 1.649e-7, 1.506e-7, 1.378e-7, 1.265e-7, 1.163e-7,
2155 1.073e-7, 9.918e-8, 9.191e-8, 8.538e-8, 7.949e-8, 7.419e-8,
2156 6.94e-8, 6.508e-8, 6.114e-8, 5.761e-8, 5.437e-8, 5.146e-8,
2157 4.89e-8, 4.636e-8, 4.406e-8, 4.201e-8, 4.015e-8, 3.84e-8,
2158 3.661e-8, 3.51e-8, 3.377e-8, 3.242e-8, 3.13e-8, 3.015e-8,
2159 2.918e-8, 2.83e-8, 2.758e-8, 2.707e-8, 2.656e-8, 2.619e-8,
2160 2.609e-8, 2.615e-8, 2.63e-8, 2.675e-8, 2.745e-8, 2.842e-8,
2161 2.966e-8, 3.125e-8, 3.318e-8, 3.565e-8, 3.85e-8, 4.191e-8,
2162 4.59e-8, 5.059e-8, 5.607e-8, 6.239e-8, 6.958e-8, 7.796e-8,
2163 8.773e-8, 9.88e-8, 1.114e-7, 1.258e-7, 1.422e-7, 1.61e-7,
2164 1.822e-7, 2.06e-7, 2.337e-7, 2.645e-7, 2.996e-7, 3.393e-7,
2165 3.843e-7, 4.363e-7, 4.935e-7, 5.607e-7, 6.363e-7, 7.242e-7,
2166 8.23e-7, 9.411e-7, 1.071e-6, 1.232e-6, 1.402e-6, 1.6e-6, 1.82e-6,
2167 2.128e-6, 2.386e-6, 2.781e-6, 3.242e-6, 3.653e-6, 4.323e-6,
2168 4.747e-6, 5.321e-6, 5.919e-6, 6.681e-6, 7.101e-6, 7.983e-6,
2169 8.342e-6, 8.741e-6, 9.431e-6, 9.952e-6, 1.026e-5, 1.055e-5,
2170 1.095e-5, 1.095e-5, 1.087e-5, 1.056e-5, 1.026e-5, 9.715e-6,
2171 9.252e-6, 8.452e-6, 7.958e-6, 7.268e-6, 6.295e-6, 6.003e-6, 5e-6,
2172 4.591e-6, 3.983e-6, 3.479e-6, 3.058e-6, 2.667e-6, 2.293e-6,
2173 1.995e-6, 1.747e-6, 1.517e-6, 1.335e-6, 1.165e-6, 1.028e-6,
2174 9.007e-7, 7.956e-7, 7.015e-7, 6.192e-7, 5.491e-7, 4.859e-7,
2175 4.297e-7, 3.799e-7, 3.38e-7, 3.002e-7, 2.659e-7, 2.366e-7,
2176 2.103e-7, 1.861e-7, 1.655e-7, 1.469e-7, 1.309e-7, 1.162e-7,
2177 1.032e-7, 9.198e-8, 8.181e-8, 7.294e-8, 6.516e-8, 5.787e-8,
2178 5.163e-8, 4.612e-8, 4.119e-8, 3.695e-8, 3.308e-8, 2.976e-8,
2179 2.67e-8, 2.407e-8, 2.171e-8, 1.965e-8, 1.78e-8, 1.617e-8,
2180 1.47e-8, 1.341e-8, 1.227e-8, 1.125e-8, 1.033e-8, 9.524e-9,
2181 8.797e-9, 8.162e-9, 7.565e-9, 7.04e-9, 6.56e-9, 6.129e-9,
2182 5.733e-9, 5.376e-9, 5.043e-9, 4.75e-9, 4.466e-9, 4.211e-9,
2183 3.977e-9, 3.759e-9, 3.558e-9, 3.373e-9, 3.201e-9, 3.043e-9,
2184 2.895e-9, 2.76e-9, 2.635e-9, 2.518e-9, 2.411e-9, 2.314e-9,
2185 2.23e-9, 2.151e-9, 2.087e-9, 2.035e-9, 1.988e-9, 1.946e-9,
2186 1.927e-9, 1.916e-9, 1.916e-9, 1.933e-9, 1.966e-9, 2.018e-9,
2187 2.09e-9, 2.182e-9, 2.299e-9, 2.442e-9, 2.623e-9, 2.832e-9,
2188 3.079e-9, 3.368e-9, 3.714e-9, 4.104e-9, 4.567e-9, 5.091e-9,
2189 5.701e-9, 6.398e-9, 7.194e-9, 8.127e-9, 9.141e-9, 1.035e-8,
2190 1.177e-8, 1.338e-8, 1.508e-8, 1.711e-8, 1.955e-8, 2.216e-8,
2191 2.534e-8, 2.871e-8, 3.291e-8, 3.711e-8, 4.285e-8, 4.868e-8,
2192 5.509e-8, 6.276e-8, 7.262e-8, 8.252e-8, 9.4e-8, 1.064e-7,
2193 1.247e-7, 1.411e-7, 1.626e-7, 1.827e-7, 2.044e-7, 2.284e-7,
2194 2.452e-7, 2.854e-7, 3.026e-7, 3.278e-7, 3.474e-7, 3.693e-7,
2195 3.93e-7, 4.104e-7, 4.22e-7, 4.439e-7, 4.545e-7, 4.778e-7,
2196 4.812e-7, 5.018e-7, 4.899e-7, 5.075e-7, 5.073e-7, 5.171e-7,
2197 5.131e-7, 5.25e-7, 5.617e-7, 5.846e-7, 6.239e-7, 6.696e-7,
2198 7.398e-7, 8.073e-7, 9.15e-7, 1.009e-6, 1.116e-6, 1.264e-6,
2199 1.439e-6, 1.644e-6, 1.856e-6, 2.147e-6, 2.317e-6, 2.713e-6,
2200 2.882e-6, 2.99e-6, 3.489e-6, 3.581e-6, 4.033e-6, 4.26e-6,
2201 4.543e-6, 4.84e-6, 4.826e-6, 5.013e-6, 5.252e-6, 5.277e-6,
2202 5.306e-6, 5.236e-6, 5.123e-6, 5.171e-6, 4.843e-6, 4.615e-6,
2203 4.385e-6, 3.97e-6, 3.693e-6, 3.231e-6, 2.915e-6, 2.495e-6,
2204 2.144e-6, 1.91e-6, 1.639e-6, 1.417e-6, 1.226e-6, 1.065e-6,
2205 9.29e-7, 8.142e-7, 7.161e-7, 6.318e-7, 5.581e-7, 4.943e-7,
2206 4.376e-7, 3.884e-7, 3.449e-7, 3.06e-7, 2.712e-7, 2.412e-7,
2207 2.139e-7, 1.903e-7, 1.689e-7, 1.499e-7, 1.331e-7, 1.183e-7,
2208 1.05e-7, 9.362e-8, 8.306e-8, 7.403e-8, 6.578e-8, 5.853e-8,
2209 5.216e-8, 4.632e-8, 4.127e-8, 3.678e-8, 3.279e-8, 2.923e-8,
2210 2.612e-8, 2.339e-8, 2.094e-8, 1.877e-8, 1.686e-8, 1.516e-8,
2211 1.366e-8, 1.234e-8, 1.114e-8, 1.012e-8, 9.182e-9, 8.362e-9,
2212 7.634e-9, 6.981e-9, 6.406e-9, 5.888e-9, 5.428e-9, 5.021e-9,
2213 4.65e-9, 4.326e-9, 4.033e-9, 3.77e-9, 3.536e-9, 3.327e-9,
2214 3.141e-9, 2.974e-9, 2.825e-9, 2.697e-9, 2.584e-9, 2.488e-9,
2215 2.406e-9, 2.34e-9, 2.292e-9, 2.259e-9, 2.244e-9, 2.243e-9,
2216 2.272e-9, 2.31e-9, 2.378e-9, 2.454e-9, 2.618e-9, 2.672e-9,
2217 2.831e-9, 3.05e-9, 3.225e-9, 3.425e-9, 3.677e-9, 3.968e-9,
2218 4.221e-9, 4.639e-9, 4.96e-9, 5.359e-9, 5.649e-9, 6.23e-9,
2219 6.716e-9, 7.218e-9, 7.746e-9, 7.988e-9, 8.627e-9, 8.999e-9,
2220 9.442e-9, 9.82e-9, 1.015e-8, 1.06e-8, 1.079e-8, 1.109e-8,
2221 1.137e-8, 1.186e-8, 1.18e-8, 1.187e-8, 1.194e-8, 1.192e-8,
2222 1.224e-8, 1.245e-8, 1.246e-8, 1.318e-8, 1.377e-8, 1.471e-8,
2223 1.582e-8, 1.713e-8, 1.853e-8, 2.063e-8, 2.27e-8, 2.567e-8,
2224 2.891e-8, 3.264e-8, 3.744e-8, 4.286e-8, 4.915e-8, 5.623e-8,
2225 6.336e-8, 7.293e-8, 8.309e-8, 9.319e-8, 1.091e-7, 1.243e-7,
2226 1.348e-7, 1.449e-7, 1.62e-7, 1.846e-7, 1.937e-7, 2.04e-7,
2227 2.179e-7, 2.298e-7, 2.433e-7, 2.439e-7, 2.464e-7, 2.611e-7,
2228 2.617e-7, 2.582e-7, 2.453e-7, 2.401e-7, 2.349e-7, 2.203e-7,
2229 2.066e-7, 1.939e-7, 1.78e-7, 1.558e-7, 1.391e-7, 1.203e-7,
2230 1.048e-7, 9.464e-8, 8.306e-8, 7.239e-8, 6.317e-8, 5.52e-8,
2231 4.847e-8, 4.282e-8, 3.796e-8, 3.377e-8, 2.996e-8, 2.678e-8,
2232 2.4e-8, 2.134e-8, 1.904e-8, 1.705e-8, 1.523e-8, 1.35e-8,
2233 1.204e-8, 1.07e-8, 9.408e-9, 8.476e-9, 7.47e-9, 6.679e-9,
2234 5.929e-9, 5.267e-9, 4.711e-9, 4.172e-9, 3.761e-9, 3.288e-9,
2235 2.929e-9, 2.609e-9, 2.315e-9, 2.042e-9, 1.844e-9, 1.64e-9,
2236 1.47e-9, 1.31e-9, 1.176e-9, 1.049e-9, 9.377e-10, 8.462e-10,
2237 7.616e-10, 6.854e-10, 6.191e-10, 5.596e-10, 5.078e-10, 4.611e-10,
2238 4.197e-10, 3.83e-10, 3.505e-10, 3.215e-10, 2.956e-10, 2.726e-10,
2239 2.521e-10, 2.338e-10, 2.173e-10, 2.026e-10, 1.895e-10, 1.777e-10,
2240 1.672e-10, 1.579e-10, 1.496e-10, 1.423e-10, 1.358e-10, 1.302e-10,
2241 1.254e-10, 1.216e-10, 1.187e-10, 1.163e-10, 1.147e-10, 1.145e-10,
2242 1.15e-10, 1.17e-10, 1.192e-10, 1.25e-10, 1.298e-10, 1.345e-10,
2243 1.405e-10, 1.538e-10, 1.648e-10, 1.721e-10, 1.872e-10, 1.968e-10,
2244 2.089e-10, 2.172e-10, 2.317e-10, 2.389e-10, 2.503e-10, 2.585e-10,
2245 2.686e-10, 2.8e-10, 2.895e-10, 3.019e-10, 3.037e-10, 3.076e-10,
2246 3.146e-10, 3.198e-10, 3.332e-10, 3.397e-10, 3.54e-10, 3.667e-10,
2247 3.895e-10, 4.071e-10, 4.565e-10, 4.983e-10, 5.439e-10, 5.968e-10,
2248 6.676e-10, 7.456e-10, 8.405e-10, 9.478e-10, 1.064e-9, 1.218e-9,
2249 1.386e-9, 1.581e-9, 1.787e-9, 2.032e-9, 2.347e-9, 2.677e-9,
2250 3.008e-9, 3.544e-9, 4.056e-9, 4.687e-9, 5.331e-9, 6.227e-9,
2251 6.854e-9, 8.139e-9, 8.945e-9, 9.865e-9, 1.125e-8, 1.178e-8,
2252 1.364e-8, 1.436e-8, 1.54e-8, 1.672e-8, 1.793e-8, 1.906e-8,
2253 2.036e-8, 2.144e-8, 2.292e-8, 2.371e-8, 2.493e-8, 2.606e-8,
2254 2.706e-8, 2.866e-8, 3.036e-8, 3.136e-8, 3.405e-8, 3.665e-8,
2255 3.837e-8, 4.229e-8, 4.748e-8, 5.32e-8, 5.763e-8, 6.677e-8,
2256 7.216e-8, 7.716e-8, 8.958e-8, 9.419e-8, 1.036e-7, 1.108e-7,
2257 1.189e-7, 1.246e-7, 1.348e-7, 1.31e-7, 1.361e-7, 1.364e-7,
2258 1.363e-7, 1.343e-7, 1.293e-7, 1.254e-7, 1.235e-7, 1.158e-7,
2259 1.107e-7, 9.961e-8, 9.011e-8, 7.91e-8, 6.916e-8, 6.338e-8,
2260 5.564e-8, 4.827e-8, 4.198e-8, 3.695e-8, 3.276e-8, 2.929e-8,
2261 2.633e-8, 2.391e-8, 2.192e-8, 2.021e-8, 1.89e-8, 1.772e-8,
2262 1.667e-8, 1.603e-8, 1.547e-8, 1.537e-8, 1.492e-8, 1.515e-8,
2263 1.479e-8, 1.45e-8, 1.513e-8, 1.495e-8, 1.529e-8, 1.565e-8,
2264 1.564e-8, 1.553e-8, 1.569e-8, 1.584e-8, 1.57e-8, 1.538e-8,
2265 1.513e-8, 1.472e-8, 1.425e-8, 1.349e-8, 1.328e-8, 1.249e-8,
2266 1.17e-8, 1.077e-8, 9.514e-9, 8.614e-9, 7.46e-9, 6.621e-9,
2267 5.775e-9, 5.006e-9, 4.308e-9, 3.747e-9, 3.24e-9, 2.84e-9,
2268 2.481e-9, 2.184e-9, 1.923e-9, 1.71e-9, 1.504e-9, 1.334e-9,
2269 1.187e-9, 1.053e-9, 9.367e-10, 8.306e-10, 7.419e-10, 6.63e-10,
2270 5.918e-10, 5.277e-10, 4.717e-10, 4.222e-10, 3.783e-10, 3.39e-10,
2271 3.036e-10, 2.729e-10, 2.455e-10, 2.211e-10, 1.995e-10, 1.804e-10,
2272 1.635e-10, 1.485e-10, 1.355e-10, 1.24e-10, 1.139e-10, 1.051e-10,
2273 9.757e-11, 9.114e-11, 8.577e-11, 8.139e-11, 7.792e-11, 7.52e-11,
2274 7.39e-11, 7.311e-11, 7.277e-11, 7.482e-11, 7.698e-11, 8.162e-11,
2275 8.517e-11, 8.968e-11, 9.905e-11, 1.075e-10, 1.187e-10, 1.291e-10,
2276 1.426e-10, 1.573e-10, 1.734e-10, 1.905e-10, 2.097e-10, 2.28e-10,
2277 2.473e-10, 2.718e-10, 2.922e-10, 3.128e-10, 3.361e-10, 3.641e-10,
2278 3.91e-10, 4.196e-10, 4.501e-10, 4.932e-10, 5.258e-10, 5.755e-10,
2279 6.253e-10, 6.664e-10, 7.344e-10, 7.985e-10, 8.877e-10, 1.005e-9,
2280 1.118e-9, 1.251e-9, 1.428e-9, 1.61e-9, 1.888e-9, 2.077e-9,
2281 2.331e-9, 2.751e-9, 3.061e-9, 3.522e-9, 3.805e-9, 4.181e-9,
2282 4.575e-9, 5.167e-9, 5.634e-9, 6.007e-9, 6.501e-9, 6.829e-9,
2283 7.211e-9, 7.262e-9, 7.696e-9, 7.832e-9, 7.799e-9, 7.651e-9,
2284 7.304e-9, 7.15e-9, 6.977e-9, 6.603e-9, 6.209e-9, 5.69e-9,
2285 5.432e-9, 4.764e-9, 4.189e-9, 3.64e-9, 3.203e-9, 2.848e-9,
2286 2.51e-9, 2.194e-9, 1.946e-9, 1.75e-9, 1.567e-9, 1.426e-9,
2287 1.302e-9, 1.197e-9, 1.109e-9, 1.035e-9, 9.719e-10, 9.207e-10,
2288 8.957e-10, 8.578e-10, 8.262e-10, 8.117e-10, 7.987e-10, 7.875e-10,
2289 7.741e-10, 7.762e-10, 7.537e-10, 7.424e-10, 7.474e-10, 7.294e-10,
2290 7.216e-10, 7.233e-10, 7.075e-10, 6.892e-10, 6.618e-10, 6.314e-10,
2291 6.208e-10, 5.689e-10, 5.55e-10, 4.984e-10, 4.6e-10, 4.078e-10,
2292 3.879e-10, 3.459e-10, 2.982e-10, 2.626e-10, 2.329e-10, 1.988e-10,
2293 1.735e-10, 1.487e-10, 1.297e-10, 1.133e-10, 9.943e-11, 8.736e-11,
2294 7.726e-11, 6.836e-11, 6.053e-11, 5.384e-11, 4.789e-11, 4.267e-11,
2295 3.804e-11, 3.398e-11, 3.034e-11, 2.71e-11, 2.425e-11, 2.173e-11,
2296 1.95e-11, 1.752e-11, 1.574e-11, 1.418e-11, 1.278e-11, 1.154e-11,
2297 1.044e-11, 9.463e-12, 8.602e-12, 7.841e-12, 7.171e-12, 6.584e-12,
2298 6.073e-12, 5.631e-12, 5.254e-12, 4.937e-12, 4.679e-12, 4.476e-12,
2299 4.328e-12, 4.233e-12, 4.194e-12, 4.211e-12, 4.286e-12, 4.424e-12,
2300 4.628e-12, 4.906e-12, 5.262e-12, 5.708e-12, 6.254e-12, 6.914e-12,
2301 7.714e-12, 8.677e-12, 9.747e-12, 1.101e-11, 1.256e-11, 1.409e-11,
2302 1.597e-11, 1.807e-11, 2.034e-11, 2.316e-11, 2.622e-11, 2.962e-11,
2303 3.369e-11, 3.819e-11, 4.329e-11, 4.932e-11, 5.589e-11, 6.364e-11,
2304 7.284e-11, 8.236e-11, 9.447e-11, 1.078e-10, 1.229e-10, 1.417e-10,
2305 1.614e-10, 1.843e-10, 2.107e-10, 2.406e-10, 2.728e-10, 3.195e-10,
2306 3.595e-10, 4.153e-10, 4.736e-10, 5.41e-10, 6.088e-10, 6.769e-10,
2307 7.691e-10, 8.545e-10, 9.621e-10, 1.047e-9, 1.161e-9, 1.296e-9,
2308 1.424e-9, 1.576e-9, 1.739e-9, 1.893e-9, 2.08e-9, 2.336e-9,
2309 2.604e-9, 2.76e-9, 3.001e-9, 3.365e-9, 3.55e-9, 3.895e-9,
2310 4.183e-9, 4.614e-9, 4.846e-9, 5.068e-9, 5.427e-9, 5.541e-9,
2311 5.864e-9, 5.997e-9, 5.997e-9, 6.061e-9, 5.944e-9, 5.855e-9,
2312 5.661e-9, 5.523e-9, 5.374e-9, 4.94e-9, 4.688e-9, 4.17e-9,
2313 3.913e-9, 3.423e-9, 2.997e-9, 2.598e-9, 2.253e-9, 1.946e-9,
2314 1.71e-9, 1.507e-9, 1.336e-9, 1.19e-9, 1.068e-9, 9.623e-10,
2315 8.772e-10, 8.007e-10, 7.42e-10, 6.884e-10, 6.483e-10, 6.162e-10,
2316 5.922e-10, 5.688e-10, 5.654e-10, 5.637e-10, 5.701e-10, 5.781e-10,
2317 5.874e-10, 6.268e-10, 6.357e-10, 6.525e-10, 7.137e-10, 7.441e-10,
2318 8.024e-10, 8.485e-10, 9.143e-10, 9.536e-10, 9.717e-10, 1.018e-9,
2319 1.042e-9, 1.054e-9, 1.092e-9, 1.079e-9, 1.064e-9, 1.043e-9,
2320 1.02e-9, 9.687e-10, 9.273e-10, 9.208e-10, 9.068e-10, 7.687e-10,
2321 7.385e-10, 6.595e-10, 5.87e-10, 5.144e-10, 4.417e-10, 3.804e-10,
2322 3.301e-10, 2.866e-10, 2.509e-10, 2.202e-10, 1.947e-10, 1.719e-10,
2323 1.525e-10, 1.361e-10, 1.21e-10, 1.084e-10, 9.8e-11, 8.801e-11,
2324 7.954e-11, 7.124e-11, 6.335e-11, 5.76e-11, 5.132e-11, 4.601e-11,
2325 4.096e-11, 3.657e-11, 3.25e-11, 2.909e-11, 2.587e-11, 2.297e-11,
2326 2.05e-11, 1.828e-11, 1.632e-11, 1.462e-11, 1.314e-11, 1.185e-11,
2327 1.073e-11, 9.76e-12, 8.922e-12, 8.206e-12, 7.602e-12, 7.1e-12,
2328 6.694e-12, 6.378e-12, 6.149e-12, 6.004e-12, 5.941e-12, 5.962e-12,
2329 6.069e-12, 6.265e-12, 6.551e-12, 6.935e-12, 7.457e-12, 8.074e-12,
2330 8.811e-12, 9.852e-12, 1.086e-11, 1.207e-11, 1.361e-11, 1.553e-11,
2331 1.737e-11, 1.93e-11, 2.175e-11, 2.41e-11, 2.706e-11, 3.023e-11,
2332 3.313e-11, 3.657e-11, 4.118e-11, 4.569e-11, 5.025e-11, 5.66e-11,
2333 6.231e-11, 6.881e-11, 7.996e-11, 8.526e-11, 9.694e-11, 1.106e-10,
2334 1.222e-10, 1.355e-10, 1.525e-10, 1.775e-10, 1.924e-10, 2.181e-10,
2335 2.379e-10, 2.662e-10, 2.907e-10, 3.154e-10, 3.366e-10, 3.579e-10,
2336 3.858e-10, 4.046e-10, 4.196e-10, 4.166e-10, 4.457e-10, 4.466e-10,
2337 4.404e-10, 4.337e-10, 4.15e-10, 4.083e-10, 3.91e-10, 3.723e-10,
2338 3.514e-10, 3.303e-10, 2.847e-10, 2.546e-10, 2.23e-10, 1.994e-10,
2339 1.733e-10, 1.488e-10, 1.297e-10, 1.144e-10, 1.004e-10, 8.741e-11,
2340 7.928e-11, 7.034e-11, 6.323e-11, 5.754e-11, 5.25e-11, 4.85e-11,
2341 4.502e-11, 4.286e-11, 4.028e-11, 3.899e-11, 3.824e-11, 3.761e-11,
2342 3.804e-11, 3.839e-11, 3.845e-11, 4.244e-11, 4.382e-11, 4.582e-11,
2343 4.847e-11, 5.209e-11, 5.384e-11, 5.887e-11, 6.371e-11, 6.737e-11,
2344 7.168e-11, 7.415e-11, 7.827e-11, 8.037e-11, 8.12e-11, 8.071e-11,
2345 8.008e-11, 7.851e-11, 7.544e-11, 7.377e-11, 7.173e-11, 6.801e-11,
2346 6.267e-11, 5.727e-11, 5.288e-11, 4.853e-11, 4.082e-11, 3.645e-11,
2347 3.136e-11, 2.672e-11, 2.304e-11, 1.986e-11, 1.725e-11, 1.503e-11,
2348 1.315e-11, 1.153e-11, 1.014e-11, 8.942e-12, 7.901e-12, 6.993e-12,
2349 6.199e-12, 5.502e-12, 4.89e-12, 4.351e-12, 3.878e-12, 3.461e-12,
2350 3.094e-12, 2.771e-12, 2.488e-12, 2.241e-12, 2.025e-12, 1.838e-12,
2351 1.677e-12, 1.541e-12, 1.427e-12, 1.335e-12, 1.262e-12, 1.209e-12,
2352 1.176e-12, 1.161e-12, 1.165e-12, 1.189e-12, 1.234e-12, 1.3e-12,
2353 1.389e-12, 1.503e-12, 1.644e-12, 1.814e-12, 2.017e-12, 2.255e-12,
2354 2.534e-12, 2.858e-12, 3.231e-12, 3.661e-12, 4.153e-12, 4.717e-12,
2355 5.36e-12, 6.094e-12, 6.93e-12, 7.882e-12, 8.966e-12, 1.02e-11,
2356 1.162e-11, 1.324e-11, 1.51e-11, 1.72e-11, 1.965e-11, 2.237e-11,
2357 2.56e-11, 2.927e-11, 3.371e-11, 3.842e-11, 4.429e-11, 5.139e-11,
2358 5.798e-11, 6.697e-11, 7.626e-11, 8.647e-11, 1.022e-10, 1.136e-10,
2359 1.3e-10, 1.481e-10, 1.672e-10, 1.871e-10, 2.126e-10, 2.357e-10,
2360 2.583e-10, 2.997e-10, 3.289e-10, 3.702e-10, 4.012e-10, 4.319e-10,
2361 4.527e-10, 5.001e-10, 5.448e-10, 5.611e-10, 5.76e-10, 5.965e-10,
2362 6.079e-10, 6.207e-10, 6.276e-10, 6.222e-10, 6.137e-10, 6e-10,
2363 5.814e-10, 5.393e-10, 5.35e-10, 4.947e-10, 4.629e-10, 4.117e-10,
2364 3.712e-10, 3.372e-10, 2.923e-10, 2.55e-10, 2.232e-10, 1.929e-10,
2365 1.679e-10, 1.46e-10, 1.289e-10, 1.13e-10, 9.953e-11, 8.763e-11,
2366 7.76e-11, 6.9e-11, 6.16e-11, 5.525e-11, 4.958e-11, 4.489e-11,
2367 4.072e-11, 3.728e-11, 3.438e-11, 3.205e-11, 3.006e-11, 2.848e-11,
2368 2.766e-11, 2.688e-11, 2.664e-11, 2.67e-11, 2.696e-11, 2.786e-11,
2369 2.861e-11, 3.009e-11, 3.178e-11, 3.389e-11, 3.587e-11, 3.819e-11,
2370 4.054e-11, 4.417e-11, 4.703e-11, 5.137e-11, 5.46e-11, 6.055e-11,
2371 6.333e-11, 6.773e-11, 7.219e-11, 7.717e-11, 8.131e-11, 8.491e-11,
2372 8.574e-11, 9.01e-11, 9.017e-11, 8.999e-11, 8.959e-11, 8.838e-11,
2373 8.579e-11, 8.162e-11, 8.098e-11, 7.472e-11, 7.108e-11, 6.559e-11,
2374 5.994e-11, 5.172e-11, 4.424e-11, 3.951e-11, 3.34e-11, 2.902e-11,
2375 2.541e-11, 2.215e-11, 1.945e-11, 1.716e-11, 1.503e-11, 1.339e-11,
2376 1.185e-11, 1.05e-11, 9.336e-12, 8.307e-12, 7.312e-12, 6.55e-12,
2377 5.836e-12, 5.178e-12, 4.6e-12, 4.086e-12, 3.639e-12, 3.247e-12,
2378 2.904e-12, 2.604e-12, 2.341e-12, 2.112e-12, 1.914e-12, 1.744e-12,
2379 1.598e-12, 1.476e-12, 1.374e-12, 1.293e-12, 1.23e-12, 1.185e-12,
2380 1.158e-12, 1.147e-12, 1.154e-12, 1.177e-12, 1.219e-12, 1.28e-12,
2381 1.36e-12, 1.463e-12, 1.591e-12, 1.75e-12, 1.94e-12, 2.156e-12,
2382 2.43e-12, 2.748e-12, 3.052e-12, 3.533e-12, 3.967e-12, 4.471e-12,
2383 5.041e-12, 5.86e-12, 6.664e-12, 7.522e-12, 8.342e-12, 9.412e-12,
2384 1.072e-11, 1.213e-11, 1.343e-11, 1.496e-11, 1.664e-11, 1.822e-11,
2385 2.029e-11, 2.233e-11, 2.457e-11, 2.709e-11, 2.928e-11, 3.115e-11,
2386 3.356e-11, 3.592e-11, 3.818e-11, 3.936e-11, 4.061e-11, 4.149e-11,
2387 4.299e-11, 4.223e-11, 4.251e-11, 4.287e-11, 4.177e-11, 4.094e-11,
2388 3.942e-11, 3.772e-11, 3.614e-11, 3.394e-11, 3.222e-11, 2.791e-11,
2389 2.665e-11, 2.309e-11, 2.032e-11, 1.74e-11, 1.535e-11, 1.323e-11,
2390 1.151e-11, 9.803e-12, 8.65e-12, 7.54e-12, 6.619e-12, 5.832e-12,
2391 5.113e-12, 4.503e-12, 3.975e-12, 3.52e-12, 3.112e-12, 2.797e-12,
2392 2.5e-12, 2.24e-12, 2.013e-12, 1.819e-12, 1.653e-12, 1.513e-12,
2393 1.395e-12, 1.299e-12, 1.225e-12, 1.168e-12, 1.124e-12, 1.148e-12,
2394 1.107e-12, 1.128e-12, 1.169e-12, 1.233e-12, 1.307e-12, 1.359e-12,
2395 1.543e-12, 1.686e-12, 1.794e-12, 2.028e-12, 2.21e-12, 2.441e-12,
2396 2.653e-12, 2.828e-12, 3.093e-12, 3.28e-12, 3.551e-12, 3.677e-12,
2397 3.803e-12, 3.844e-12, 4.068e-12, 4.093e-12, 4.002e-12, 3.904e-12,
2398 3.624e-12, 3.633e-12, 3.622e-12, 3.443e-12, 3.184e-12, 2.934e-12,
2399 2.476e-12, 2.212e-12, 1.867e-12, 1.594e-12, 1.37e-12, 1.192e-12,
2400 1.045e-12, 9.211e-13, 8.17e-13, 7.29e-13, 6.55e-13, 5.929e-13,
2401 5.415e-13, 4.995e-13, 4.661e-13, 4.406e-13, 4.225e-13, 4.116e-13,
2402 4.075e-13, 4.102e-13, 4.198e-13, 4.365e-13, 4.606e-13, 4.925e-13,
2403 5.326e-13, 5.818e-13, 6.407e-13, 7.104e-13, 7.92e-13, 8.868e-13,
2404 9.964e-13, 1.123e-12, 1.268e-12, 1.434e-12, 1.626e-12, 1.848e-12,
2405 2.107e-12, 2.422e-12, 2.772e-12, 3.145e-12, 3.704e-12, 4.27e-12,
2406 4.721e-12, 5.361e-12, 6.083e-12, 7.095e-12, 7.968e-12, 9.228e-12,
2407 1.048e-11, 1.187e-11, 1.336e-11, 1.577e-11, 1.772e-11, 2.017e-11,
2408 2.25e-11, 2.63e-11, 2.911e-11, 3.356e-11, 3.82e-11, 4.173e-11,
2409 4.811e-11, 5.254e-11, 5.839e-11, 6.187e-11, 6.805e-11, 7.118e-11,
2410 7.369e-11, 7.664e-11, 7.794e-11, 7.947e-11, 8.036e-11, 7.954e-11,
2411 7.849e-11, 7.518e-11, 7.462e-11, 6.926e-11, 6.531e-11, 6.197e-11,
2412 5.421e-11, 4.777e-11, 4.111e-11, 3.679e-11, 3.166e-11, 2.786e-11,
2413 2.436e-11, 2.144e-11, 1.859e-11, 1.628e-11, 1.414e-11, 1.237e-11,
2414 1.093e-11, 9.558e-12
2415 };
2416
2417 static const double h2o260[2001] =
2418 { .2752, .2732, .2749, .2676, .2667, .2545,
2419 .2497, .2327, .2218, .2036, .1825, .1694, .1497, .1353, .121,
2420 .1014, .09405, .07848, .07195, .06246, .05306, .04853, .04138,
2421 .03735, .03171, .02785, .02431, .02111, .01845, .0164, .01405,
2422 .01255, .01098, .009797, .008646, .007779, .006898, .006099,
2423 .005453, .004909, .004413, .003959, .003581, .003199, .002871,
2424 .002583, .00233, .002086, .001874, .001684, .001512, .001361,
2425 .001225, .0011, 9.89e-4, 8.916e-4, 8.039e-4, 7.256e-4, 6.545e-4,
2426 5.918e-4, 5.359e-4, 4.867e-4, 4.426e-4, 4.033e-4, 3.682e-4,
2427 3.366e-4, 3.085e-4, 2.833e-4, 2.605e-4, 2.403e-4, 2.221e-4,
2428 2.055e-4, 1.908e-4, 1.774e-4, 1.653e-4, 1.544e-4, 1.443e-4,
2429 1.351e-4, 1.267e-4, 1.19e-4, 1.119e-4, 1.053e-4, 9.922e-5,
2430 9.355e-5, 8.831e-5, 8.339e-5, 7.878e-5, 7.449e-5, 7.043e-5,
2431 6.664e-5, 6.307e-5, 5.969e-5, 5.654e-5, 5.357e-5, 5.075e-5,
2432 4.81e-5, 4.56e-5, 4.322e-5, 4.102e-5, 3.892e-5, 3.696e-5,
2433 3.511e-5, 3.339e-5, 3.177e-5, 3.026e-5, 2.886e-5, 2.756e-5,
2434 2.636e-5, 2.527e-5, 2.427e-5, 2.337e-5, 2.257e-5, 2.185e-5,
2435 2.127e-5, 2.08e-5, 2.041e-5, 2.013e-5, 2e-5, 1.997e-5, 2.009e-5,
2436 2.031e-5, 2.068e-5, 2.124e-5, 2.189e-5, 2.267e-5, 2.364e-5,
2437 2.463e-5, 2.618e-5, 2.774e-5, 2.937e-5, 3.144e-5, 3.359e-5,
2438 3.695e-5, 4.002e-5, 4.374e-5, 4.947e-5, 5.431e-5, 6.281e-5,
2439 7.169e-5, 8.157e-5, 9.728e-5, 1.079e-4, 1.337e-4, 1.442e-4,
2440 1.683e-4, 1.879e-4, 2.223e-4, 2.425e-4, 2.838e-4, 3.143e-4,
2441 3.527e-4, 4.012e-4, 4.237e-4, 4.747e-4, 5.057e-4, 5.409e-4,
2442 5.734e-4, 5.944e-4, 6.077e-4, 6.175e-4, 6.238e-4, 6.226e-4,
2443 6.248e-4, 6.192e-4, 6.098e-4, 5.818e-4, 5.709e-4, 5.465e-4,
2444 5.043e-4, 4.699e-4, 4.294e-4, 3.984e-4, 3.672e-4, 3.152e-4,
2445 2.883e-4, 2.503e-4, 2.211e-4, 1.92e-4, 1.714e-4, 1.485e-4,
2446 1.358e-4, 1.156e-4, 1.021e-4, 8.887e-5, 7.842e-5, 7.12e-5,
2447 6.186e-5, 5.73e-5, 4.792e-5, 4.364e-5, 3.72e-5, 3.28e-5,
2448 2.946e-5, 2.591e-5, 2.261e-5, 2.048e-5, 1.813e-5, 1.63e-5,
2449 1.447e-5, 1.282e-5, 1.167e-5, 1.041e-5, 9.449e-6, 8.51e-6,
2450 7.596e-6, 6.961e-6, 6.272e-6, 5.728e-6, 5.198e-6, 4.667e-6,
2451 4.288e-6, 3.897e-6, 3.551e-6, 3.235e-6, 2.952e-6, 2.688e-6,
2452 2.449e-6, 2.241e-6, 2.05e-6, 1.879e-6, 1.722e-6, 1.582e-6,
2453 1.456e-6, 1.339e-6, 1.236e-6, 1.144e-6, 1.06e-6, 9.83e-7,
2454 9.149e-7, 8.535e-7, 7.973e-7, 7.466e-7, 6.999e-7, 6.574e-7,
2455 6.18e-7, 5.821e-7, 5.487e-7, 5.18e-7, 4.896e-7, 4.631e-7,
2456 4.386e-7, 4.16e-7, 3.945e-7, 3.748e-7, 3.562e-7, 3.385e-7,
2457 3.222e-7, 3.068e-7, 2.922e-7, 2.788e-7, 2.659e-7, 2.539e-7,
2458 2.425e-7, 2.318e-7, 2.219e-7, 2.127e-7, 2.039e-7, 1.958e-7,
2459 1.885e-7, 1.818e-7, 1.758e-7, 1.711e-7, 1.662e-7, 1.63e-7,
2460 1.605e-7, 1.58e-7, 1.559e-7, 1.545e-7, 1.532e-7, 1.522e-7,
2461 1.51e-7, 1.495e-7, 1.465e-7, 1.483e-7, 1.469e-7, 1.448e-7,
2462 1.444e-7, 1.436e-7, 1.426e-7, 1.431e-7, 1.425e-7, 1.445e-7,
2463 1.477e-7, 1.515e-7, 1.567e-7, 1.634e-7, 1.712e-7, 1.802e-7,
2464 1.914e-7, 2.024e-7, 2.159e-7, 2.295e-7, 2.461e-7, 2.621e-7,
2465 2.868e-7, 3.102e-7, 3.394e-7, 3.784e-7, 4.223e-7, 4.864e-7,
2466 5.501e-7, 6.039e-7, 7.193e-7, 7.728e-7, 9.514e-7, 1.073e-6,
2467 1.18e-6, 1.333e-6, 1.472e-6, 1.566e-6, 1.677e-6, 1.784e-6,
2468 1.904e-6, 1.953e-6, 2.02e-6, 2.074e-6, 2.128e-6, 2.162e-6,
2469 2.219e-6, 2.221e-6, 2.249e-6, 2.239e-6, 2.235e-6, 2.185e-6,
2470 2.141e-6, 2.124e-6, 2.09e-6, 2.068e-6, 2.1e-6, 2.104e-6,
2471 2.142e-6, 2.181e-6, 2.257e-6, 2.362e-6, 2.5e-6, 2.664e-6,
2472 2.884e-6, 3.189e-6, 3.48e-6, 3.847e-6, 4.313e-6, 4.79e-6,
2473 5.25e-6, 5.989e-6, 6.692e-6, 7.668e-6, 8.52e-6, 9.606e-6,
2474 1.073e-5, 1.225e-5, 1.377e-5, 1.582e-5, 1.761e-5, 2.029e-5,
2475 2.284e-5, 2.602e-5, 2.94e-5, 3.483e-5, 3.928e-5, 4.618e-5,
2476 5.24e-5, 6.132e-5, 7.183e-5, 8.521e-5, 9.111e-5, 1.07e-4,
2477 1.184e-4, 1.264e-4, 1.475e-4, 1.612e-4, 1.704e-4, 1.818e-4,
2478 1.924e-4, 1.994e-4, 2.061e-4, 2.18e-4, 2.187e-4, 2.2e-4,
2479 2.196e-4, 2.131e-4, 2.015e-4, 1.988e-4, 1.847e-4, 1.729e-4,
2480 1.597e-4, 1.373e-4, 1.262e-4, 1.087e-4, 9.439e-5, 8.061e-5,
2481 7.093e-5, 6.049e-5, 5.12e-5, 4.435e-5, 3.817e-5, 3.34e-5,
2482 2.927e-5, 2.573e-5, 2.291e-5, 2.04e-5, 1.827e-5, 1.636e-5,
2483 1.463e-5, 1.309e-5, 1.17e-5, 1.047e-5, 9.315e-6, 8.328e-6,
2484 7.458e-6, 6.665e-6, 5.94e-6, 5.316e-6, 4.752e-6, 4.252e-6,
2485 3.825e-6, 3.421e-6, 3.064e-6, 2.746e-6, 2.465e-6, 2.216e-6,
2486 1.99e-6, 1.79e-6, 1.609e-6, 1.449e-6, 1.306e-6, 1.177e-6,
2487 1.063e-6, 9.607e-7, 8.672e-7, 7.855e-7, 7.118e-7, 6.46e-7,
2488 5.871e-7, 5.34e-7, 4.868e-7, 4.447e-7, 4.068e-7, 3.729e-7,
2489 3.423e-7, 3.151e-7, 2.905e-7, 2.686e-7, 2.484e-7, 2.306e-7,
2490 2.142e-7, 1.995e-7, 1.86e-7, 1.738e-7, 1.626e-7, 1.522e-7,
2491 1.427e-7, 1.338e-7, 1.258e-7, 1.183e-7, 1.116e-7, 1.056e-7,
2492 9.972e-8, 9.46e-8, 9.007e-8, 8.592e-8, 8.195e-8, 7.816e-8,
2493 7.483e-8, 7.193e-8, 6.892e-8, 6.642e-8, 6.386e-8, 6.154e-8,
2494 5.949e-8, 5.764e-8, 5.622e-8, 5.479e-8, 5.364e-8, 5.301e-8,
2495 5.267e-8, 5.263e-8, 5.313e-8, 5.41e-8, 5.55e-8, 5.745e-8,
2496 6.003e-8, 6.311e-8, 6.713e-8, 7.173e-8, 7.724e-8, 8.368e-8,
2497 9.121e-8, 9.986e-8, 1.097e-7, 1.209e-7, 1.338e-7, 1.486e-7,
2498 1.651e-7, 1.837e-7, 2.048e-7, 2.289e-7, 2.557e-7, 2.857e-7,
2499 3.195e-7, 3.587e-7, 4.015e-7, 4.497e-7, 5.049e-7, 5.665e-7,
2500 6.366e-7, 7.121e-7, 7.996e-7, 8.946e-7, 1.002e-6, 1.117e-6,
2501 1.262e-6, 1.416e-6, 1.611e-6, 1.807e-6, 2.056e-6, 2.351e-6,
2502 2.769e-6, 3.138e-6, 3.699e-6, 4.386e-6, 5.041e-6, 6.074e-6,
2503 6.812e-6, 7.79e-6, 8.855e-6, 1.014e-5, 1.095e-5, 1.245e-5,
2504 1.316e-5, 1.39e-5, 1.504e-5, 1.583e-5, 1.617e-5, 1.652e-5,
2505 1.713e-5, 1.724e-5, 1.715e-5, 1.668e-5, 1.629e-5, 1.552e-5,
2506 1.478e-5, 1.34e-5, 1.245e-5, 1.121e-5, 9.575e-6, 8.956e-6,
2507 7.345e-6, 6.597e-6, 5.612e-6, 4.818e-6, 4.165e-6, 3.579e-6,
2508 3.041e-6, 2.623e-6, 2.29e-6, 1.984e-6, 1.748e-6, 1.534e-6,
2509 1.369e-6, 1.219e-6, 1.092e-6, 9.8e-7, 8.762e-7, 7.896e-7,
2510 7.104e-7, 6.364e-7, 5.691e-7, 5.107e-7, 4.575e-7, 4.09e-7,
2511 3.667e-7, 3.287e-7, 2.931e-7, 2.633e-7, 2.356e-7, 2.111e-7,
2512 1.895e-7, 1.697e-7, 1.525e-7, 1.369e-7, 1.233e-7, 1.114e-7,
2513 9.988e-8, 9.004e-8, 8.149e-8, 7.352e-8, 6.662e-8, 6.03e-8,
2514 5.479e-8, 4.974e-8, 4.532e-8, 4.129e-8, 3.781e-8, 3.462e-8,
2515 3.176e-8, 2.919e-8, 2.687e-8, 2.481e-8, 2.292e-8, 2.119e-8,
2516 1.967e-8, 1.828e-8, 1.706e-8, 1.589e-8, 1.487e-8, 1.393e-8,
2517 1.307e-8, 1.228e-8, 1.156e-8, 1.089e-8, 1.028e-8, 9.696e-9,
2518 9.159e-9, 8.658e-9, 8.187e-9, 7.746e-9, 7.34e-9, 6.953e-9,
2519 6.594e-9, 6.259e-9, 5.948e-9, 5.66e-9, 5.386e-9, 5.135e-9,
2520 4.903e-9, 4.703e-9, 4.515e-9, 4.362e-9, 4.233e-9, 4.117e-9,
2521 4.017e-9, 3.962e-9, 3.924e-9, 3.905e-9, 3.922e-9, 3.967e-9,
2522 4.046e-9, 4.165e-9, 4.32e-9, 4.522e-9, 4.769e-9, 5.083e-9,
2523 5.443e-9, 5.872e-9, 6.366e-9, 6.949e-9, 7.601e-9, 8.371e-9,
2524 9.22e-9, 1.02e-8, 1.129e-8, 1.251e-8, 1.393e-8, 1.542e-8,
2525 1.72e-8, 1.926e-8, 2.152e-8, 2.392e-8, 2.678e-8, 3.028e-8,
2526 3.39e-8, 3.836e-8, 4.309e-8, 4.9e-8, 5.481e-8, 6.252e-8,
2527 7.039e-8, 7.883e-8, 8.849e-8, 1.012e-7, 1.142e-7, 1.3e-7,
2528 1.475e-7, 1.732e-7, 1.978e-7, 2.304e-7, 2.631e-7, 2.988e-7,
2529 3.392e-7, 3.69e-7, 4.355e-7, 4.672e-7, 5.11e-7, 5.461e-7,
2530 5.828e-7, 6.233e-7, 6.509e-7, 6.672e-7, 6.969e-7, 7.104e-7,
2531 7.439e-7, 7.463e-7, 7.708e-7, 7.466e-7, 7.668e-7, 7.549e-7,
2532 7.586e-7, 7.384e-7, 7.439e-7, 7.785e-7, 7.915e-7, 8.31e-7,
2533 8.745e-7, 9.558e-7, 1.038e-6, 1.173e-6, 1.304e-6, 1.452e-6,
2534 1.671e-6, 1.931e-6, 2.239e-6, 2.578e-6, 3.032e-6, 3.334e-6,
2535 3.98e-6, 4.3e-6, 4.518e-6, 5.321e-6, 5.508e-6, 6.211e-6, 6.59e-6,
2536 7.046e-6, 7.555e-6, 7.558e-6, 7.875e-6, 8.319e-6, 8.433e-6,
2537 8.59e-6, 8.503e-6, 8.304e-6, 8.336e-6, 7.739e-6, 7.301e-6,
2538 6.827e-6, 6.078e-6, 5.551e-6, 4.762e-6, 4.224e-6, 3.538e-6,
2539 2.984e-6, 2.619e-6, 2.227e-6, 1.923e-6, 1.669e-6, 1.462e-6,
2540 1.294e-6, 1.155e-6, 1.033e-6, 9.231e-7, 8.238e-7, 7.36e-7,
2541 6.564e-7, 5.869e-7, 5.236e-7, 4.673e-7, 4.174e-7, 3.736e-7,
2542 3.33e-7, 2.976e-7, 2.657e-7, 2.367e-7, 2.106e-7, 1.877e-7,
2543 1.671e-7, 1.494e-7, 1.332e-7, 1.192e-7, 1.065e-7, 9.558e-8,
2544 8.586e-8, 7.717e-8, 6.958e-8, 6.278e-8, 5.666e-8, 5.121e-8,
2545 4.647e-8, 4.213e-8, 3.815e-8, 3.459e-8, 3.146e-8, 2.862e-8,
2546 2.604e-8, 2.375e-8, 2.162e-8, 1.981e-8, 1.817e-8, 1.67e-8,
2547 1.537e-8, 1.417e-8, 1.31e-8, 1.215e-8, 1.128e-8, 1.05e-8,
2548 9.793e-9, 9.158e-9, 8.586e-9, 8.068e-9, 7.595e-9, 7.166e-9,
2549 6.778e-9, 6.427e-9, 6.108e-9, 5.826e-9, 5.571e-9, 5.347e-9,
2550 5.144e-9, 4.968e-9, 4.822e-9, 4.692e-9, 4.589e-9, 4.506e-9,
2551 4.467e-9, 4.44e-9, 4.466e-9, 4.515e-9, 4.718e-9, 4.729e-9,
2552 4.937e-9, 5.249e-9, 5.466e-9, 5.713e-9, 6.03e-9, 6.436e-9,
2553 6.741e-9, 7.33e-9, 7.787e-9, 8.414e-9, 8.908e-9, 9.868e-9,
2554 1.069e-8, 1.158e-8, 1.253e-8, 1.3e-8, 1.409e-8, 1.47e-8,
2555 1.548e-8, 1.612e-8, 1.666e-8, 1.736e-8, 1.763e-8, 1.812e-8,
2556 1.852e-8, 1.923e-8, 1.897e-8, 1.893e-8, 1.888e-8, 1.868e-8,
2557 1.895e-8, 1.899e-8, 1.876e-8, 1.96e-8, 2.02e-8, 2.121e-8,
2558 2.239e-8, 2.379e-8, 2.526e-8, 2.766e-8, 2.994e-8, 3.332e-8,
2559 3.703e-8, 4.158e-8, 4.774e-8, 5.499e-8, 6.355e-8, 7.349e-8,
2560 8.414e-8, 9.846e-8, 1.143e-7, 1.307e-7, 1.562e-7, 1.817e-7,
2561 2.011e-7, 2.192e-7, 2.485e-7, 2.867e-7, 3.035e-7, 3.223e-7,
2562 3.443e-7, 3.617e-7, 3.793e-7, 3.793e-7, 3.839e-7, 4.081e-7,
2563 4.117e-7, 4.085e-7, 3.92e-7, 3.851e-7, 3.754e-7, 3.49e-7,
2564 3.229e-7, 2.978e-7, 2.691e-7, 2.312e-7, 2.029e-7, 1.721e-7,
2565 1.472e-7, 1.308e-7, 1.132e-7, 9.736e-8, 8.458e-8, 7.402e-8,
2566 6.534e-8, 5.811e-8, 5.235e-8, 4.762e-8, 4.293e-8, 3.896e-8,
2567 3.526e-8, 3.165e-8, 2.833e-8, 2.551e-8, 2.288e-8, 2.036e-8,
2568 1.82e-8, 1.626e-8, 1.438e-8, 1.299e-8, 1.149e-8, 1.03e-8,
2569 9.148e-9, 8.122e-9, 7.264e-9, 6.425e-9, 5.777e-9, 5.06e-9,
2570 4.502e-9, 4.013e-9, 3.567e-9, 3.145e-9, 2.864e-9, 2.553e-9,
2571 2.311e-9, 2.087e-9, 1.886e-9, 1.716e-9, 1.556e-9, 1.432e-9,
2572 1.311e-9, 1.202e-9, 1.104e-9, 1.013e-9, 9.293e-10, 8.493e-10,
2573 7.79e-10, 7.185e-10, 6.642e-10, 6.141e-10, 5.684e-10, 5.346e-10,
2574 5.032e-10, 4.725e-10, 4.439e-10, 4.176e-10, 3.93e-10, 3.714e-10,
2575 3.515e-10, 3.332e-10, 3.167e-10, 3.02e-10, 2.887e-10, 2.769e-10,
2576 2.665e-10, 2.578e-10, 2.503e-10, 2.436e-10, 2.377e-10, 2.342e-10,
2577 2.305e-10, 2.296e-10, 2.278e-10, 2.321e-10, 2.355e-10, 2.402e-10,
2578 2.478e-10, 2.67e-10, 2.848e-10, 2.982e-10, 3.263e-10, 3.438e-10,
2579 3.649e-10, 3.829e-10, 4.115e-10, 4.264e-10, 4.473e-10, 4.63e-10,
2580 4.808e-10, 4.995e-10, 5.142e-10, 5.313e-10, 5.318e-10, 5.358e-10,
2581 5.452e-10, 5.507e-10, 5.698e-10, 5.782e-10, 5.983e-10, 6.164e-10,
2582 6.532e-10, 6.811e-10, 7.624e-10, 8.302e-10, 9.067e-10, 9.937e-10,
2583 1.104e-9, 1.221e-9, 1.361e-9, 1.516e-9, 1.675e-9, 1.883e-9,
2584 2.101e-9, 2.349e-9, 2.614e-9, 2.92e-9, 3.305e-9, 3.724e-9,
2585 4.142e-9, 4.887e-9, 5.614e-9, 6.506e-9, 7.463e-9, 8.817e-9,
2586 9.849e-9, 1.187e-8, 1.321e-8, 1.474e-8, 1.698e-8, 1.794e-8,
2587 2.09e-8, 2.211e-8, 2.362e-8, 2.556e-8, 2.729e-8, 2.88e-8,
2588 3.046e-8, 3.167e-8, 3.367e-8, 3.457e-8, 3.59e-8, 3.711e-8,
2589 3.826e-8, 4.001e-8, 4.211e-8, 4.315e-8, 4.661e-8, 5.01e-8,
2590 5.249e-8, 5.84e-8, 6.628e-8, 7.512e-8, 8.253e-8, 9.722e-8,
2591 1.067e-7, 1.153e-7, 1.347e-7, 1.428e-7, 1.577e-7, 1.694e-7,
2592 1.833e-7, 1.938e-7, 2.108e-7, 2.059e-7, 2.157e-7, 2.185e-7,
2593 2.208e-7, 2.182e-7, 2.093e-7, 2.014e-7, 1.962e-7, 1.819e-7,
2594 1.713e-7, 1.51e-7, 1.34e-7, 1.154e-7, 9.89e-8, 8.88e-8, 7.673e-8,
2595 6.599e-8, 5.73e-8, 5.081e-8, 4.567e-8, 4.147e-8, 3.773e-8,
2596 3.46e-8, 3.194e-8, 2.953e-8, 2.759e-8, 2.594e-8, 2.442e-8,
2597 2.355e-8, 2.283e-8, 2.279e-8, 2.231e-8, 2.279e-8, 2.239e-8,
2598 2.21e-8, 2.309e-8, 2.293e-8, 2.352e-8, 2.415e-8, 2.43e-8,
2599 2.426e-8, 2.465e-8, 2.5e-8, 2.496e-8, 2.465e-8, 2.445e-8,
2600 2.383e-8, 2.299e-8, 2.165e-8, 2.113e-8, 1.968e-8, 1.819e-8,
2601 1.644e-8, 1.427e-8, 1.27e-8, 1.082e-8, 9.428e-9, 8.091e-9,
2602 6.958e-9, 5.988e-9, 5.246e-9, 4.601e-9, 4.098e-9, 3.664e-9,
2603 3.287e-9, 2.942e-9, 2.656e-9, 2.364e-9, 2.118e-9, 1.903e-9,
2604 1.703e-9, 1.525e-9, 1.365e-9, 1.229e-9, 1.107e-9, 9.96e-10,
2605 8.945e-10, 8.08e-10, 7.308e-10, 6.616e-10, 5.994e-10, 5.422e-10,
2606 4.929e-10, 4.478e-10, 4.07e-10, 3.707e-10, 3.379e-10, 3.087e-10,
2607 2.823e-10, 2.592e-10, 2.385e-10, 2.201e-10, 2.038e-10, 1.897e-10,
2608 1.774e-10, 1.667e-10, 1.577e-10, 1.502e-10, 1.437e-10, 1.394e-10,
2609 1.358e-10, 1.324e-10, 1.329e-10, 1.324e-10, 1.36e-10, 1.39e-10,
2610 1.424e-10, 1.544e-10, 1.651e-10, 1.817e-10, 1.984e-10, 2.195e-10,
2611 2.438e-10, 2.7e-10, 2.991e-10, 3.322e-10, 3.632e-10, 3.957e-10,
2612 4.36e-10, 4.701e-10, 5.03e-10, 5.381e-10, 5.793e-10, 6.19e-10,
2613 6.596e-10, 7.004e-10, 7.561e-10, 7.934e-10, 8.552e-10, 9.142e-10,
2614 9.57e-10, 1.027e-9, 1.097e-9, 1.193e-9, 1.334e-9, 1.47e-9,
2615 1.636e-9, 1.871e-9, 2.122e-9, 2.519e-9, 2.806e-9, 3.203e-9,
2616 3.846e-9, 4.362e-9, 5.114e-9, 5.643e-9, 6.305e-9, 6.981e-9,
2617 7.983e-9, 8.783e-9, 9.419e-9, 1.017e-8, 1.063e-8, 1.121e-8,
2618 1.13e-8, 1.201e-8, 1.225e-8, 1.232e-8, 1.223e-8, 1.177e-8,
2619 1.151e-8, 1.116e-8, 1.047e-8, 9.698e-9, 8.734e-9, 8.202e-9,
2620 7.041e-9, 6.074e-9, 5.172e-9, 4.468e-9, 3.913e-9, 3.414e-9,
2621 2.975e-9, 2.65e-9, 2.406e-9, 2.173e-9, 2.009e-9, 1.861e-9,
2622 1.727e-9, 1.612e-9, 1.514e-9, 1.43e-9, 1.362e-9, 1.333e-9,
2623 1.288e-9, 1.249e-9, 1.238e-9, 1.228e-9, 1.217e-9, 1.202e-9,
2624 1.209e-9, 1.177e-9, 1.157e-9, 1.165e-9, 1.142e-9, 1.131e-9,
2625 1.138e-9, 1.117e-9, 1.1e-9, 1.069e-9, 1.023e-9, 1.005e-9,
2626 9.159e-10, 8.863e-10, 7.865e-10, 7.153e-10, 6.247e-10, 5.846e-10,
2627 5.133e-10, 4.36e-10, 3.789e-10, 3.335e-10, 2.833e-10, 2.483e-10,
2628 2.155e-10, 1.918e-10, 1.709e-10, 1.529e-10, 1.374e-10, 1.235e-10,
2629 1.108e-10, 9.933e-11, 8.932e-11, 8.022e-11, 7.224e-11, 6.52e-11,
2630 5.896e-11, 5.328e-11, 4.813e-11, 4.365e-11, 3.961e-11, 3.594e-11,
2631 3.266e-11, 2.967e-11, 2.701e-11, 2.464e-11, 2.248e-11, 2.054e-11,
2632 1.878e-11, 1.721e-11, 1.579e-11, 1.453e-11, 1.341e-11, 1.241e-11,
2633 1.154e-11, 1.078e-11, 1.014e-11, 9.601e-12, 9.167e-12, 8.838e-12,
2634 8.614e-12, 8.493e-12, 8.481e-12, 8.581e-12, 8.795e-12, 9.131e-12,
2635 9.601e-12, 1.021e-11, 1.097e-11, 1.191e-11, 1.303e-11, 1.439e-11,
2636 1.601e-11, 1.778e-11, 1.984e-11, 2.234e-11, 2.474e-11, 2.766e-11,
2637 3.085e-11, 3.415e-11, 3.821e-11, 4.261e-11, 4.748e-11, 5.323e-11,
2638 5.935e-11, 6.619e-11, 7.418e-11, 8.294e-11, 9.26e-11, 1.039e-10,
2639 1.156e-10, 1.297e-10, 1.46e-10, 1.641e-10, 1.858e-10, 2.1e-10,
2640 2.383e-10, 2.724e-10, 3.116e-10, 3.538e-10, 4.173e-10, 4.727e-10,
2641 5.503e-10, 6.337e-10, 7.32e-10, 8.298e-10, 9.328e-10, 1.059e-9,
2642 1.176e-9, 1.328e-9, 1.445e-9, 1.593e-9, 1.77e-9, 1.954e-9,
2643 2.175e-9, 2.405e-9, 2.622e-9, 2.906e-9, 3.294e-9, 3.713e-9,
2644 3.98e-9, 4.384e-9, 4.987e-9, 5.311e-9, 5.874e-9, 6.337e-9,
2645 7.027e-9, 7.39e-9, 7.769e-9, 8.374e-9, 8.605e-9, 9.165e-9,
2646 9.415e-9, 9.511e-9, 9.704e-9, 9.588e-9, 9.45e-9, 9.086e-9,
2647 8.798e-9, 8.469e-9, 7.697e-9, 7.168e-9, 6.255e-9, 5.772e-9,
2648 4.97e-9, 4.271e-9, 3.653e-9, 3.154e-9, 2.742e-9, 2.435e-9,
2649 2.166e-9, 1.936e-9, 1.731e-9, 1.556e-9, 1.399e-9, 1.272e-9,
2650 1.157e-9, 1.066e-9, 9.844e-10, 9.258e-10, 8.787e-10, 8.421e-10,
2651 8.083e-10, 8.046e-10, 8.067e-10, 8.181e-10, 8.325e-10, 8.517e-10,
2652 9.151e-10, 9.351e-10, 9.677e-10, 1.071e-9, 1.126e-9, 1.219e-9,
2653 1.297e-9, 1.408e-9, 1.476e-9, 1.517e-9, 1.6e-9, 1.649e-9,
2654 1.678e-9, 1.746e-9, 1.742e-9, 1.728e-9, 1.699e-9, 1.655e-9,
2655 1.561e-9, 1.48e-9, 1.451e-9, 1.411e-9, 1.171e-9, 1.106e-9,
2656 9.714e-10, 8.523e-10, 7.346e-10, 6.241e-10, 5.371e-10, 4.704e-10,
2657 4.144e-10, 3.683e-10, 3.292e-10, 2.942e-10, 2.62e-10, 2.341e-10,
2658 2.104e-10, 1.884e-10, 1.7e-10, 1.546e-10, 1.394e-10, 1.265e-10,
2659 1.14e-10, 1.019e-10, 9.279e-11, 8.283e-11, 7.458e-11, 6.668e-11,
2660 5.976e-11, 5.33e-11, 4.794e-11, 4.289e-11, 3.841e-11, 3.467e-11,
2661 3.13e-11, 2.832e-11, 2.582e-11, 2.356e-11, 2.152e-11, 1.97e-11,
2662 1.808e-11, 1.664e-11, 1.539e-11, 1.434e-11, 1.344e-11, 1.269e-11,
2663 1.209e-11, 1.162e-11, 1.129e-11, 1.108e-11, 1.099e-11, 1.103e-11,
2664 1.119e-11, 1.148e-11, 1.193e-11, 1.252e-11, 1.329e-11, 1.421e-11,
2665 1.555e-11, 1.685e-11, 1.839e-11, 2.054e-11, 2.317e-11, 2.571e-11,
2666 2.839e-11, 3.171e-11, 3.49e-11, 3.886e-11, 4.287e-11, 4.645e-11,
2667 5.047e-11, 5.592e-11, 6.109e-11, 6.628e-11, 7.381e-11, 8.088e-11,
2668 8.966e-11, 1.045e-10, 1.12e-10, 1.287e-10, 1.486e-10, 1.662e-10,
2669 1.866e-10, 2.133e-10, 2.524e-10, 2.776e-10, 3.204e-10, 3.559e-10,
2670 4.028e-10, 4.448e-10, 4.882e-10, 5.244e-10, 5.605e-10, 6.018e-10,
2671 6.328e-10, 6.579e-10, 6.541e-10, 7.024e-10, 7.074e-10, 7.068e-10,
2672 7.009e-10, 6.698e-10, 6.545e-10, 6.209e-10, 5.834e-10, 5.412e-10,
2673 5.001e-10, 4.231e-10, 3.727e-10, 3.211e-10, 2.833e-10, 2.447e-10,
2674 2.097e-10, 1.843e-10, 1.639e-10, 1.449e-10, 1.27e-10, 1.161e-10,
2675 1.033e-10, 9.282e-11, 8.407e-11, 7.639e-11, 7.023e-11, 6.474e-11,
2676 6.142e-11, 5.76e-11, 5.568e-11, 5.472e-11, 5.39e-11, 5.455e-11,
2677 5.54e-11, 5.587e-11, 6.23e-11, 6.49e-11, 6.868e-11, 7.382e-11,
2678 8.022e-11, 8.372e-11, 9.243e-11, 1.004e-10, 1.062e-10, 1.13e-10,
2679 1.176e-10, 1.244e-10, 1.279e-10, 1.298e-10, 1.302e-10, 1.312e-10,
2680 1.295e-10, 1.244e-10, 1.211e-10, 1.167e-10, 1.098e-10, 9.927e-11,
2681 8.854e-11, 8.011e-11, 7.182e-11, 5.923e-11, 5.212e-11, 4.453e-11,
2682 3.832e-11, 3.371e-11, 2.987e-11, 2.651e-11, 2.354e-11, 2.093e-11,
2683 1.863e-11, 1.662e-11, 1.486e-11, 1.331e-11, 1.193e-11, 1.071e-11,
2684 9.628e-12, 8.66e-12, 7.801e-12, 7.031e-12, 6.347e-12, 5.733e-12,
2685 5.182e-12, 4.695e-12, 4.26e-12, 3.874e-12, 3.533e-12, 3.235e-12,
2686 2.979e-12, 2.76e-12, 2.579e-12, 2.432e-12, 2.321e-12, 2.246e-12,
2687 2.205e-12, 2.196e-12, 2.223e-12, 2.288e-12, 2.387e-12, 2.525e-12,
2688 2.704e-12, 2.925e-12, 3.191e-12, 3.508e-12, 3.876e-12, 4.303e-12,
2689 4.793e-12, 5.347e-12, 5.978e-12, 6.682e-12, 7.467e-12, 8.34e-12,
2690 9.293e-12, 1.035e-11, 1.152e-11, 1.285e-11, 1.428e-11, 1.586e-11,
2691 1.764e-11, 1.972e-11, 2.214e-11, 2.478e-11, 2.776e-11, 3.151e-11,
2692 3.591e-11, 4.103e-11, 4.66e-11, 5.395e-11, 6.306e-11, 7.172e-11,
2693 8.358e-11, 9.67e-11, 1.11e-10, 1.325e-10, 1.494e-10, 1.736e-10,
2694 2.007e-10, 2.296e-10, 2.608e-10, 3.004e-10, 3.361e-10, 3.727e-10,
2695 4.373e-10, 4.838e-10, 5.483e-10, 6.006e-10, 6.535e-10, 6.899e-10,
2696 7.687e-10, 8.444e-10, 8.798e-10, 9.135e-10, 9.532e-10, 9.757e-10,
2697 9.968e-10, 1.006e-9, 9.949e-10, 9.789e-10, 9.564e-10, 9.215e-10,
2698 8.51e-10, 8.394e-10, 7.707e-10, 7.152e-10, 6.274e-10, 5.598e-10,
2699 5.028e-10, 4.3e-10, 3.71e-10, 3.245e-10, 2.809e-10, 2.461e-10,
2700 2.154e-10, 1.91e-10, 1.685e-10, 1.487e-10, 1.313e-10, 1.163e-10,
2701 1.031e-10, 9.172e-11, 8.221e-11, 7.382e-11, 6.693e-11, 6.079e-11,
2702 5.581e-11, 5.167e-11, 4.811e-11, 4.506e-11, 4.255e-11, 4.083e-11,
2703 3.949e-11, 3.881e-11, 3.861e-11, 3.858e-11, 3.951e-11, 4.045e-11,
2704 4.24e-11, 4.487e-11, 4.806e-11, 5.133e-11, 5.518e-11, 5.919e-11,
2705 6.533e-11, 7.031e-11, 7.762e-11, 8.305e-11, 9.252e-11, 9.727e-11,
2706 1.045e-10, 1.117e-10, 1.2e-10, 1.275e-10, 1.341e-10, 1.362e-10,
2707 1.438e-10, 1.45e-10, 1.455e-10, 1.455e-10, 1.434e-10, 1.381e-10,
2708 1.301e-10, 1.276e-10, 1.163e-10, 1.089e-10, 9.911e-11, 8.943e-11,
2709 7.618e-11, 6.424e-11, 5.717e-11, 4.866e-11, 4.257e-11, 3.773e-11,
2710 3.331e-11, 2.958e-11, 2.629e-11, 2.316e-11, 2.073e-11, 1.841e-11,
2711 1.635e-11, 1.464e-11, 1.31e-11, 1.16e-11, 1.047e-11, 9.408e-12,
2712 8.414e-12, 7.521e-12, 6.705e-12, 5.993e-12, 5.371e-12, 4.815e-12,
2713 4.338e-12, 3.921e-12, 3.567e-12, 3.265e-12, 3.01e-12, 2.795e-12,
2714 2.613e-12, 2.464e-12, 2.346e-12, 2.256e-12, 2.195e-12, 2.165e-12,
2715 2.166e-12, 2.198e-12, 2.262e-12, 2.364e-12, 2.502e-12, 2.682e-12,
2716 2.908e-12, 3.187e-12, 3.533e-12, 3.946e-12, 4.418e-12, 5.013e-12,
2717 5.708e-12, 6.379e-12, 7.43e-12, 8.39e-12, 9.51e-12, 1.078e-11,
2718 1.259e-11, 1.438e-11, 1.63e-11, 1.814e-11, 2.055e-11, 2.348e-11,
2719 2.664e-11, 2.956e-11, 3.3e-11, 3.677e-11, 4.032e-11, 4.494e-11,
2720 4.951e-11, 5.452e-11, 6.014e-11, 6.5e-11, 6.915e-11, 7.45e-11,
2721 7.971e-11, 8.468e-11, 8.726e-11, 8.995e-11, 9.182e-11, 9.509e-11,
2722 9.333e-11, 9.386e-11, 9.457e-11, 9.21e-11, 9.019e-11, 8.68e-11,
2723 8.298e-11, 7.947e-11, 7.46e-11, 7.082e-11, 6.132e-11, 5.855e-11,
2724 5.073e-11, 4.464e-11, 3.825e-11, 3.375e-11, 2.911e-11, 2.535e-11,
2725 2.16e-11, 1.907e-11, 1.665e-11, 1.463e-11, 1.291e-11, 1.133e-11,
2726 9.997e-12, 8.836e-12, 7.839e-12, 6.943e-12, 6.254e-12, 5.6e-12,
2727 5.029e-12, 4.529e-12, 4.102e-12, 3.737e-12, 3.428e-12, 3.169e-12,
2728 2.959e-12, 2.798e-12, 2.675e-12, 2.582e-12, 2.644e-12, 2.557e-12,
2729 2.614e-12, 2.717e-12, 2.874e-12, 3.056e-12, 3.187e-12, 3.631e-12,
2730 3.979e-12, 4.248e-12, 4.817e-12, 5.266e-12, 5.836e-12, 6.365e-12,
2731 6.807e-12, 7.47e-12, 7.951e-12, 8.636e-12, 8.972e-12, 9.314e-12,
2732 9.445e-12, 1.003e-11, 1.013e-11, 9.937e-12, 9.729e-12, 9.064e-12,
2733 9.119e-12, 9.124e-12, 8.704e-12, 8.078e-12, 7.47e-12, 6.329e-12,
2734 5.674e-12, 4.808e-12, 4.119e-12, 3.554e-12, 3.103e-12, 2.731e-12,
2735 2.415e-12, 2.15e-12, 1.926e-12, 1.737e-12, 1.578e-12, 1.447e-12,
2736 1.34e-12, 1.255e-12, 1.191e-12, 1.146e-12, 1.121e-12, 1.114e-12,
2737 1.126e-12, 1.156e-12, 1.207e-12, 1.278e-12, 1.372e-12, 1.49e-12,
2738 1.633e-12, 1.805e-12, 2.01e-12, 2.249e-12, 2.528e-12, 2.852e-12,
2739 3.228e-12, 3.658e-12, 4.153e-12, 4.728e-12, 5.394e-12, 6.176e-12,
2740 7.126e-12, 8.188e-12, 9.328e-12, 1.103e-11, 1.276e-11, 1.417e-11,
2741 1.615e-11, 1.84e-11, 2.155e-11, 2.429e-11, 2.826e-11, 3.222e-11,
2742 3.664e-11, 4.14e-11, 4.906e-11, 5.536e-11, 6.327e-11, 7.088e-11,
2743 8.316e-11, 9.242e-11, 1.07e-10, 1.223e-10, 1.341e-10, 1.553e-10,
2744 1.703e-10, 1.9e-10, 2.022e-10, 2.233e-10, 2.345e-10, 2.438e-10,
2745 2.546e-10, 2.599e-10, 2.661e-10, 2.703e-10, 2.686e-10, 2.662e-10,
2746 2.56e-10, 2.552e-10, 2.378e-10, 2.252e-10, 2.146e-10, 1.885e-10,
2747 1.668e-10, 1.441e-10, 1.295e-10, 1.119e-10, 9.893e-11, 8.687e-11,
2748 7.678e-11, 6.685e-11, 5.879e-11, 5.127e-11, 4.505e-11, 3.997e-11,
2749 3.511e-11
2750 };
2751
2752 static const double h2ofrn[2001] = { .01095, .01126, .01205, .01322, .0143,
2753 .01506, .01548, .01534, .01486, .01373, .01262, .01134, .01001,
2754 .008702, .007475, .006481, .00548, .0046, .003833, .00311,
2755 .002543, .002049, .00168, .001374, .001046, 8.193e-4, 6.267e-4,
2756 4.968e-4, 3.924e-4, 2.983e-4, 2.477e-4, 1.997e-4, 1.596e-4,
2757 1.331e-4, 1.061e-4, 8.942e-5, 7.168e-5, 5.887e-5, 4.848e-5,
2758 3.817e-5, 3.17e-5, 2.579e-5, 2.162e-5, 1.768e-5, 1.49e-5,
2759 1.231e-5, 1.013e-5, 8.555e-6, 7.328e-6, 6.148e-6, 5.207e-6,
2760 4.387e-6, 3.741e-6, 3.22e-6, 2.753e-6, 2.346e-6, 1.985e-6,
2761 1.716e-6, 1.475e-6, 1.286e-6, 1.122e-6, 9.661e-7, 8.284e-7,
2762 7.057e-7, 6.119e-7, 5.29e-7, 4.571e-7, 3.948e-7, 3.432e-7,
2763 2.983e-7, 2.589e-7, 2.265e-7, 1.976e-7, 1.704e-7, 1.456e-7,
2764 1.26e-7, 1.101e-7, 9.648e-8, 8.415e-8, 7.34e-8, 6.441e-8,
2765 5.643e-8, 4.94e-8, 4.276e-8, 3.703e-8, 3.227e-8, 2.825e-8,
2766 2.478e-8, 2.174e-8, 1.898e-8, 1.664e-8, 1.458e-8, 1.278e-8,
2767 1.126e-8, 9.891e-9, 8.709e-9, 7.652e-9, 6.759e-9, 5.975e-9,
2768 5.31e-9, 4.728e-9, 4.214e-9, 3.792e-9, 3.463e-9, 3.226e-9,
2769 2.992e-9, 2.813e-9, 2.749e-9, 2.809e-9, 2.913e-9, 3.037e-9,
2770 3.413e-9, 3.738e-9, 4.189e-9, 4.808e-9, 5.978e-9, 7.088e-9,
2771 8.071e-9, 9.61e-9, 1.21e-8, 1.5e-8, 1.764e-8, 2.221e-8, 2.898e-8,
2772 3.948e-8, 5.068e-8, 6.227e-8, 7.898e-8, 1.033e-7, 1.437e-7,
2773 1.889e-7, 2.589e-7, 3.59e-7, 4.971e-7, 7.156e-7, 9.983e-7,
2774 1.381e-6, 1.929e-6, 2.591e-6, 3.453e-6, 4.57e-6, 5.93e-6,
2775 7.552e-6, 9.556e-6, 1.183e-5, 1.425e-5, 1.681e-5, 1.978e-5,
2776 2.335e-5, 2.668e-5, 3.022e-5, 3.371e-5, 3.715e-5, 3.967e-5,
2777 4.06e-5, 4.01e-5, 3.809e-5, 3.491e-5, 3.155e-5, 2.848e-5,
2778 2.678e-5, 2.66e-5, 2.811e-5, 3.071e-5, 3.294e-5, 3.459e-5,
2779 3.569e-5, 3.56e-5, 3.434e-5, 3.186e-5, 2.916e-5, 2.622e-5,
2780 2.275e-5, 1.918e-5, 1.62e-5, 1.373e-5, 1.182e-5, 1.006e-5,
2781 8.556e-6, 7.26e-6, 6.107e-6, 5.034e-6, 4.211e-6, 3.426e-6,
2782 2.865e-6, 2.446e-6, 1.998e-6, 1.628e-6, 1.242e-6, 1.005e-6,
2783 7.853e-7, 6.21e-7, 5.071e-7, 4.156e-7, 3.548e-7, 2.825e-7,
2784 2.261e-7, 1.916e-7, 1.51e-7, 1.279e-7, 1.059e-7, 9.14e-8,
2785 7.707e-8, 6.17e-8, 5.311e-8, 4.263e-8, 3.518e-8, 2.961e-8,
2786 2.457e-8, 2.119e-8, 1.712e-8, 1.439e-8, 1.201e-8, 1.003e-8,
2787 8.564e-9, 7.199e-9, 6.184e-9, 5.206e-9, 4.376e-9, 3.708e-9,
2788 3.157e-9, 2.725e-9, 2.361e-9, 2.074e-9, 1.797e-9, 1.562e-9,
2789 1.364e-9, 1.196e-9, 1.042e-9, 8.862e-10, 7.648e-10, 6.544e-10,
2790 5.609e-10, 4.791e-10, 4.108e-10, 3.531e-10, 3.038e-10, 2.618e-10,
2791 2.268e-10, 1.969e-10, 1.715e-10, 1.496e-10, 1.308e-10, 1.147e-10,
2792 1.008e-10, 8.894e-11, 7.885e-11, 7.031e-11, 6.355e-11, 5.854e-11,
2793 5.534e-11, 5.466e-11, 5.725e-11, 6.447e-11, 7.943e-11, 1.038e-10,
2794 1.437e-10, 2.04e-10, 2.901e-10, 4.051e-10, 5.556e-10, 7.314e-10,
2795 9.291e-10, 1.134e-9, 1.321e-9, 1.482e-9, 1.596e-9, 1.669e-9,
2796 1.715e-9, 1.762e-9, 1.817e-9, 1.828e-9, 1.848e-9, 1.873e-9,
2797 1.902e-9, 1.894e-9, 1.864e-9, 1.841e-9, 1.797e-9, 1.704e-9,
2798 1.559e-9, 1.382e-9, 1.187e-9, 1.001e-9, 8.468e-10, 7.265e-10,
2799 6.521e-10, 6.381e-10, 6.66e-10, 7.637e-10, 9.705e-10, 1.368e-9,
2800 1.856e-9, 2.656e-9, 3.954e-9, 5.96e-9, 8.72e-9, 1.247e-8,
2801 1.781e-8, 2.491e-8, 3.311e-8, 4.272e-8, 5.205e-8, 6.268e-8,
2802 7.337e-8, 8.277e-8, 9.185e-8, 1.004e-7, 1.091e-7, 1.159e-7,
2803 1.188e-7, 1.175e-7, 1.124e-7, 1.033e-7, 9.381e-8, 8.501e-8,
2804 7.956e-8, 7.894e-8, 8.331e-8, 9.102e-8, 9.836e-8, 1.035e-7,
2805 1.064e-7, 1.06e-7, 1.032e-7, 9.808e-8, 9.139e-8, 8.442e-8,
2806 7.641e-8, 6.881e-8, 6.161e-8, 5.404e-8, 4.804e-8, 4.446e-8,
2807 4.328e-8, 4.259e-8, 4.421e-8, 4.673e-8, 4.985e-8, 5.335e-8,
2808 5.796e-8, 6.542e-8, 7.714e-8, 8.827e-8, 1.04e-7, 1.238e-7,
2809 1.499e-7, 1.829e-7, 2.222e-7, 2.689e-7, 3.303e-7, 3.981e-7,
2810 4.84e-7, 5.91e-7, 7.363e-7, 9.087e-7, 1.139e-6, 1.455e-6,
2811 1.866e-6, 2.44e-6, 3.115e-6, 3.941e-6, 4.891e-6, 5.992e-6,
2812 7.111e-6, 8.296e-6, 9.21e-6, 9.987e-6, 1.044e-5, 1.073e-5,
2813 1.092e-5, 1.106e-5, 1.138e-5, 1.171e-5, 1.186e-5, 1.186e-5,
2814 1.179e-5, 1.166e-5, 1.151e-5, 1.16e-5, 1.197e-5, 1.241e-5,
2815 1.268e-5, 1.26e-5, 1.184e-5, 1.063e-5, 9.204e-6, 7.584e-6,
2816 6.053e-6, 4.482e-6, 3.252e-6, 2.337e-6, 1.662e-6, 1.18e-6,
2817 8.15e-7, 5.95e-7, 4.354e-7, 3.302e-7, 2.494e-7, 1.93e-7,
2818 1.545e-7, 1.25e-7, 1.039e-7, 8.602e-8, 7.127e-8, 5.897e-8,
2819 4.838e-8, 4.018e-8, 3.28e-8, 2.72e-8, 2.307e-8, 1.972e-8,
2820 1.654e-8, 1.421e-8, 1.174e-8, 1.004e-8, 8.739e-9, 7.358e-9,
2821 6.242e-9, 5.303e-9, 4.567e-9, 3.94e-9, 3.375e-9, 2.864e-9,
2822 2.422e-9, 2.057e-9, 1.75e-9, 1.505e-9, 1.294e-9, 1.101e-9,
2823 9.401e-10, 8.018e-10, 6.903e-10, 5.965e-10, 5.087e-10, 4.364e-10,
2824 3.759e-10, 3.247e-10, 2.809e-10, 2.438e-10, 2.123e-10, 1.853e-10,
2825 1.622e-10, 1.426e-10, 1.26e-10, 1.125e-10, 1.022e-10, 9.582e-11,
2826 9.388e-11, 9.801e-11, 1.08e-10, 1.276e-10, 1.551e-10, 1.903e-10,
2827 2.291e-10, 2.724e-10, 3.117e-10, 3.4e-10, 3.562e-10, 3.625e-10,
2828 3.619e-10, 3.429e-10, 3.221e-10, 2.943e-10, 2.645e-10, 2.338e-10,
2829 2.062e-10, 1.901e-10, 1.814e-10, 1.827e-10, 1.906e-10, 1.984e-10,
2830 2.04e-10, 2.068e-10, 2.075e-10, 2.018e-10, 1.959e-10, 1.897e-10,
2831 1.852e-10, 1.791e-10, 1.696e-10, 1.634e-10, 1.598e-10, 1.561e-10,
2832 1.518e-10, 1.443e-10, 1.377e-10, 1.346e-10, 1.342e-10, 1.375e-10,
2833 1.525e-10, 1.767e-10, 2.108e-10, 2.524e-10, 2.981e-10, 3.477e-10,
2834 4.262e-10, 5.326e-10, 6.646e-10, 8.321e-10, 1.069e-9, 1.386e-9,
2835 1.743e-9, 2.216e-9, 2.808e-9, 3.585e-9, 4.552e-9, 5.907e-9,
2836 7.611e-9, 9.774e-9, 1.255e-8, 1.666e-8, 2.279e-8, 3.221e-8,
2837 4.531e-8, 6.4e-8, 9.187e-8, 1.295e-7, 1.825e-7, 2.431e-7,
2838 3.181e-7, 4.009e-7, 4.941e-7, 5.88e-7, 6.623e-7, 7.155e-7,
2839 7.451e-7, 7.594e-7, 7.541e-7, 7.467e-7, 7.527e-7, 7.935e-7,
2840 8.461e-7, 8.954e-7, 9.364e-7, 9.843e-7, 1.024e-6, 1.05e-6,
2841 1.059e-6, 1.074e-6, 1.072e-6, 1.043e-6, 9.789e-7, 8.803e-7,
2842 7.662e-7, 6.378e-7, 5.133e-7, 3.958e-7, 2.914e-7, 2.144e-7,
2843 1.57e-7, 1.14e-7, 8.47e-8, 6.2e-8, 4.657e-8, 3.559e-8, 2.813e-8,
2844 2.222e-8, 1.769e-8, 1.391e-8, 1.125e-8, 9.186e-9, 7.704e-9,
2845 6.447e-9, 5.381e-9, 4.442e-9, 3.669e-9, 3.057e-9, 2.564e-9,
2846 2.153e-9, 1.784e-9, 1.499e-9, 1.281e-9, 1.082e-9, 9.304e-10,
2847 8.169e-10, 6.856e-10, 5.866e-10, 5.043e-10, 4.336e-10, 3.731e-10,
2848 3.175e-10, 2.745e-10, 2.374e-10, 2.007e-10, 1.737e-10, 1.508e-10,
2849 1.302e-10, 1.13e-10, 9.672e-11, 8.375e-11, 7.265e-11, 6.244e-11,
2850 5.343e-11, 4.654e-11, 3.975e-11, 3.488e-11, 3.097e-11, 2.834e-11,
2851 2.649e-11, 2.519e-11, 2.462e-11, 2.443e-11, 2.44e-11, 2.398e-11,
2852 2.306e-11, 2.183e-11, 2.021e-11, 1.821e-11, 1.599e-11, 1.403e-11,
2853 1.196e-11, 1.023e-11, 8.728e-12, 7.606e-12, 6.941e-12, 6.545e-12,
2854 6.484e-12, 6.6e-12, 6.718e-12, 6.785e-12, 6.746e-12, 6.724e-12,
2855 6.764e-12, 6.995e-12, 7.144e-12, 7.32e-12, 7.33e-12, 7.208e-12,
2856 6.789e-12, 6.09e-12, 5.337e-12, 4.62e-12, 4.037e-12, 3.574e-12,
2857 3.311e-12, 3.346e-12, 3.566e-12, 3.836e-12, 4.076e-12, 4.351e-12,
2858 4.691e-12, 5.114e-12, 5.427e-12, 6.167e-12, 7.436e-12, 8.842e-12,
2859 1.038e-11, 1.249e-11, 1.54e-11, 1.915e-11, 2.48e-11, 3.256e-11,
2860 4.339e-11, 5.611e-11, 7.519e-11, 1.037e-10, 1.409e-10, 1.883e-10,
2861 2.503e-10, 3.38e-10, 4.468e-10, 5.801e-10, 7.335e-10, 8.98e-10,
2862 1.11e-9, 1.363e-9, 1.677e-9, 2.104e-9, 2.681e-9, 3.531e-9,
2863 4.621e-9, 6.106e-9, 8.154e-9, 1.046e-8, 1.312e-8, 1.607e-8,
2864 1.948e-8, 2.266e-8, 2.495e-8, 2.655e-8, 2.739e-8, 2.739e-8,
2865 2.662e-8, 2.589e-8, 2.59e-8, 2.664e-8, 2.833e-8, 3.023e-8,
2866 3.305e-8, 3.558e-8, 3.793e-8, 3.961e-8, 4.056e-8, 4.102e-8,
2867 4.025e-8, 3.917e-8, 3.706e-8, 3.493e-8, 3.249e-8, 3.096e-8,
2868 3.011e-8, 3.111e-8, 3.395e-8, 3.958e-8, 4.875e-8, 6.066e-8,
2869 7.915e-8, 1.011e-7, 1.3e-7, 1.622e-7, 2.003e-7, 2.448e-7,
2870 2.863e-7, 3.317e-7, 3.655e-7, 3.96e-7, 4.098e-7, 4.168e-7,
2871 4.198e-7, 4.207e-7, 4.289e-7, 4.384e-7, 4.471e-7, 4.524e-7,
2872 4.574e-7, 4.633e-7, 4.785e-7, 5.028e-7, 5.371e-7, 5.727e-7,
2873 5.955e-7, 5.998e-7, 5.669e-7, 5.082e-7, 4.397e-7, 3.596e-7,
2874 2.814e-7, 2.074e-7, 1.486e-7, 1.057e-7, 7.25e-8, 4.946e-8,
2875 3.43e-8, 2.447e-8, 1.793e-8, 1.375e-8, 1.096e-8, 9.091e-9,
2876 7.709e-9, 6.631e-9, 5.714e-9, 4.886e-9, 4.205e-9, 3.575e-9,
2877 3.07e-9, 2.631e-9, 2.284e-9, 2.002e-9, 1.745e-9, 1.509e-9,
2878 1.284e-9, 1.084e-9, 9.163e-10, 7.663e-10, 6.346e-10, 5.283e-10,
2879 4.354e-10, 3.59e-10, 2.982e-10, 2.455e-10, 2.033e-10, 1.696e-10,
2880 1.432e-10, 1.211e-10, 1.02e-10, 8.702e-11, 7.38e-11, 6.293e-11,
2881 5.343e-11, 4.532e-11, 3.907e-11, 3.365e-11, 2.945e-11, 2.558e-11,
2882 2.192e-11, 1.895e-11, 1.636e-11, 1.42e-11, 1.228e-11, 1.063e-11,
2883 9.348e-12, 8.2e-12, 7.231e-12, 6.43e-12, 5.702e-12, 5.052e-12,
2884 4.469e-12, 4e-12, 3.679e-12, 3.387e-12, 3.197e-12, 3.158e-12,
2885 3.327e-12, 3.675e-12, 4.292e-12, 5.437e-12, 7.197e-12, 1.008e-11,
2886 1.437e-11, 2.035e-11, 2.905e-11, 4.062e-11, 5.528e-11, 7.177e-11,
2887 9.064e-11, 1.109e-10, 1.297e-10, 1.473e-10, 1.652e-10, 1.851e-10,
2888 2.079e-10, 2.313e-10, 2.619e-10, 2.958e-10, 3.352e-10, 3.796e-10,
2889 4.295e-10, 4.923e-10, 5.49e-10, 5.998e-10, 6.388e-10, 6.645e-10,
2890 6.712e-10, 6.549e-10, 6.38e-10, 6.255e-10, 6.253e-10, 6.459e-10,
2891 6.977e-10, 7.59e-10, 8.242e-10, 8.92e-10, 9.403e-10, 9.701e-10,
2892 9.483e-10, 9.135e-10, 8.617e-10, 7.921e-10, 7.168e-10, 6.382e-10,
2893 5.677e-10, 5.045e-10, 4.572e-10, 4.312e-10, 4.145e-10, 4.192e-10,
2894 4.541e-10, 5.368e-10, 6.771e-10, 8.962e-10, 1.21e-9, 1.659e-9,
2895 2.33e-9, 3.249e-9, 4.495e-9, 5.923e-9, 7.642e-9, 9.607e-9,
2896 1.178e-8, 1.399e-8, 1.584e-8, 1.73e-8, 1.816e-8, 1.87e-8,
2897 1.868e-8, 1.87e-8, 1.884e-8, 1.99e-8, 2.15e-8, 2.258e-8,
2898 2.364e-8, 2.473e-8, 2.602e-8, 2.689e-8, 2.731e-8, 2.816e-8,
2899 2.859e-8, 2.839e-8, 2.703e-8, 2.451e-8, 2.149e-8, 1.787e-8,
2900 1.449e-8, 1.111e-8, 8.282e-9, 6.121e-9, 4.494e-9, 3.367e-9,
2901 2.487e-9, 1.885e-9, 1.503e-9, 1.249e-9, 1.074e-9, 9.427e-10,
2902 8.439e-10, 7.563e-10, 6.772e-10, 6.002e-10, 5.254e-10, 4.588e-10,
2903 3.977e-10, 3.449e-10, 3.003e-10, 2.624e-10, 2.335e-10, 2.04e-10,
2904 1.771e-10, 1.534e-10, 1.296e-10, 1.097e-10, 9.173e-11, 7.73e-11,
2905 6.547e-11, 5.191e-11, 4.198e-11, 3.361e-11, 2.732e-11, 2.244e-11,
2906 1.791e-11, 1.509e-11, 1.243e-11, 1.035e-11, 8.969e-12, 7.394e-12,
2907 6.323e-12, 5.282e-12, 4.543e-12, 3.752e-12, 3.14e-12, 2.6e-12,
2908 2.194e-12, 1.825e-12, 1.511e-12, 1.245e-12, 1.024e-12, 8.539e-13,
2909 7.227e-13, 6.102e-13, 5.189e-13, 4.43e-13, 3.774e-13, 3.236e-13,
2910 2.8e-13, 2.444e-13, 2.156e-13, 1.932e-13, 1.775e-13, 1.695e-13,
2911 1.672e-13, 1.704e-13, 1.825e-13, 2.087e-13, 2.614e-13, 3.377e-13,
2912 4.817e-13, 6.989e-13, 1.062e-12, 1.562e-12, 2.288e-12, 3.295e-12,
2913 4.55e-12, 5.965e-12, 7.546e-12, 9.395e-12, 1.103e-11, 1.228e-11,
2914 1.318e-11, 1.38e-11, 1.421e-11, 1.39e-11, 1.358e-11, 1.336e-11,
2915 1.342e-11, 1.356e-11, 1.424e-11, 1.552e-11, 1.73e-11, 1.951e-11,
2916 2.128e-11, 2.249e-11, 2.277e-11, 2.226e-11, 2.111e-11, 1.922e-11,
2917 1.775e-11, 1.661e-11, 1.547e-11, 1.446e-11, 1.323e-11, 1.21e-11,
2918 1.054e-11, 9.283e-12, 8.671e-12, 8.67e-12, 9.429e-12, 1.062e-11,
2919 1.255e-11, 1.506e-11, 1.818e-11, 2.26e-11, 2.831e-11, 3.723e-11,
2920 5.092e-11, 6.968e-11, 9.826e-11, 1.349e-10, 1.87e-10, 2.58e-10,
2921 3.43e-10, 4.424e-10, 5.521e-10, 6.812e-10, 8.064e-10, 9.109e-10,
2922 9.839e-10, 1.028e-9, 1.044e-9, 1.029e-9, 1.005e-9, 1.002e-9,
2923 1.038e-9, 1.122e-9, 1.233e-9, 1.372e-9, 1.524e-9, 1.665e-9,
2924 1.804e-9, 1.908e-9, 2.015e-9, 2.117e-9, 2.219e-9, 2.336e-9,
2925 2.531e-9, 2.805e-9, 3.189e-9, 3.617e-9, 4.208e-9, 4.911e-9,
2926 5.619e-9, 6.469e-9, 7.188e-9, 7.957e-9, 8.503e-9, 9.028e-9,
2927 9.571e-9, 9.99e-9, 1.055e-8, 1.102e-8, 1.132e-8, 1.141e-8,
2928 1.145e-8, 1.145e-8, 1.176e-8, 1.224e-8, 1.304e-8, 1.388e-8,
2929 1.445e-8, 1.453e-8, 1.368e-8, 1.22e-8, 1.042e-8, 8.404e-9,
2930 6.403e-9, 4.643e-9, 3.325e-9, 2.335e-9, 1.638e-9, 1.19e-9,
2931 9.161e-10, 7.412e-10, 6.226e-10, 5.516e-10, 5.068e-10, 4.831e-10,
2932 4.856e-10, 5.162e-10, 5.785e-10, 6.539e-10, 7.485e-10, 8.565e-10,
2933 9.534e-10, 1.052e-9, 1.115e-9, 1.173e-9, 1.203e-9, 1.224e-9,
2934 1.243e-9, 1.248e-9, 1.261e-9, 1.265e-9, 1.25e-9, 1.217e-9,
2935 1.176e-9, 1.145e-9, 1.153e-9, 1.199e-9, 1.278e-9, 1.366e-9,
2936 1.426e-9, 1.444e-9, 1.365e-9, 1.224e-9, 1.051e-9, 8.539e-10,
2937 6.564e-10, 4.751e-10, 3.404e-10, 2.377e-10, 1.631e-10, 1.114e-10,
2938 7.87e-11, 5.793e-11, 4.284e-11, 3.3e-11, 2.62e-11, 2.152e-11,
2939 1.777e-11, 1.496e-11, 1.242e-11, 1.037e-11, 8.725e-12, 7.004e-12,
2940 5.718e-12, 4.769e-12, 3.952e-12, 3.336e-12, 2.712e-12, 2.213e-12,
2941 1.803e-12, 1.492e-12, 1.236e-12, 1.006e-12, 8.384e-13, 7.063e-13,
2942 5.879e-13, 4.93e-13, 4.171e-13, 3.569e-13, 3.083e-13, 2.688e-13,
2943 2.333e-13, 2.035e-13, 1.82e-13, 1.682e-13, 1.635e-13, 1.674e-13,
2944 1.769e-13, 2.022e-13, 2.485e-13, 3.127e-13, 4.25e-13, 5.928e-13,
2945 8.514e-13, 1.236e-12, 1.701e-12, 2.392e-12, 3.231e-12, 4.35e-12,
2946 5.559e-12, 6.915e-12, 8.519e-12, 1.013e-11, 1.146e-11, 1.24e-11,
2947 1.305e-11, 1.333e-11, 1.318e-11, 1.263e-11, 1.238e-11, 1.244e-11,
2948 1.305e-11, 1.432e-11, 1.623e-11, 1.846e-11, 2.09e-11, 2.328e-11,
2949 2.526e-11, 2.637e-11, 2.702e-11, 2.794e-11, 2.889e-11, 2.989e-11,
2950 3.231e-11, 3.68e-11, 4.375e-11, 5.504e-11, 7.159e-11, 9.502e-11,
2951 1.279e-10, 1.645e-10, 2.098e-10, 2.618e-10, 3.189e-10, 3.79e-10,
2952 4.303e-10, 4.753e-10, 5.027e-10, 5.221e-10, 5.293e-10, 5.346e-10,
2953 5.467e-10, 5.796e-10, 6.2e-10, 6.454e-10, 6.705e-10, 6.925e-10,
2954 7.233e-10, 7.35e-10, 7.538e-10, 7.861e-10, 8.077e-10, 8.132e-10,
2955 7.749e-10, 7.036e-10, 6.143e-10, 5.093e-10, 4.089e-10, 3.092e-10,
2956 2.299e-10, 1.705e-10, 1.277e-10, 9.723e-11, 7.533e-11, 6.126e-11,
2957 5.154e-11, 4.428e-11, 3.913e-11, 3.521e-11, 3.297e-11, 3.275e-11,
2958 3.46e-11, 3.798e-11, 4.251e-11, 4.745e-11, 5.232e-11, 5.606e-11,
2959 5.82e-11, 5.88e-11, 5.79e-11, 5.661e-11, 5.491e-11, 5.366e-11,
2960 5.341e-11, 5.353e-11, 5.336e-11, 5.293e-11, 5.248e-11, 5.235e-11,
2961 5.208e-11, 5.322e-11, 5.521e-11, 5.725e-11, 5.827e-11, 5.685e-11,
2962 5.245e-11, 4.612e-11, 3.884e-11, 3.129e-11, 2.404e-11, 1.732e-11,
2963 1.223e-11, 8.574e-12, 5.888e-12, 3.986e-12, 2.732e-12, 1.948e-12,
2964 1.414e-12, 1.061e-12, 8.298e-13, 6.612e-13, 5.413e-13, 4.472e-13,
2965 3.772e-13, 3.181e-13, 2.645e-13, 2.171e-13, 1.778e-13, 1.464e-13,
2966 1.183e-13, 9.637e-14, 7.991e-14, 6.668e-14, 5.57e-14, 4.663e-14,
2967 3.848e-14, 3.233e-14, 2.706e-14, 2.284e-14, 1.944e-14, 1.664e-14,
2968 1.43e-14, 1.233e-14, 1.066e-14, 9.234e-15, 8.023e-15, 6.993e-15,
2969 6.119e-15, 5.384e-15, 4.774e-15, 4.283e-15, 3.916e-15, 3.695e-15,
2970 3.682e-15, 4.004e-15, 4.912e-15, 6.853e-15, 1.056e-14, 1.712e-14,
2971 2.804e-14, 4.516e-14, 7.113e-14, 1.084e-13, 1.426e-13, 1.734e-13,
2972 1.978e-13, 2.194e-13, 2.388e-13, 2.489e-13, 2.626e-13, 2.865e-13,
2973 3.105e-13, 3.387e-13, 3.652e-13, 3.984e-13, 4.398e-13, 4.906e-13,
2974 5.55e-13, 6.517e-13, 7.813e-13, 9.272e-13, 1.164e-12, 1.434e-12,
2975 1.849e-12, 2.524e-12, 3.328e-12, 4.523e-12, 6.108e-12, 8.207e-12,
2976 1.122e-11, 1.477e-11, 1.9e-11, 2.412e-11, 2.984e-11, 3.68e-11,
2977 4.353e-11, 4.963e-11, 5.478e-11, 5.903e-11, 6.233e-11, 6.483e-11,
2978 6.904e-11, 7.569e-11, 8.719e-11, 1.048e-10, 1.278e-10, 1.557e-10,
2979 1.869e-10, 2.218e-10, 2.61e-10, 2.975e-10, 3.371e-10, 3.746e-10,
2980 4.065e-10, 4.336e-10, 4.503e-10, 4.701e-10, 4.8e-10, 4.917e-10,
2981 5.038e-10, 5.128e-10, 5.143e-10, 5.071e-10, 5.019e-10, 5.025e-10,
2982 5.183e-10, 5.496e-10, 5.877e-10, 6.235e-10, 6.42e-10, 6.234e-10,
2983 5.698e-10, 4.916e-10, 4.022e-10, 3.126e-10, 2.282e-10, 1.639e-10,
2984 1.142e-10, 7.919e-11, 5.69e-11, 4.313e-11, 3.413e-11, 2.807e-11,
2985 2.41e-11, 2.166e-11, 2.024e-11, 1.946e-11, 1.929e-11, 1.963e-11,
2986 2.035e-11, 2.162e-11, 2.305e-11, 2.493e-11, 2.748e-11, 3.048e-11,
2987 3.413e-11, 3.754e-11, 4.155e-11, 4.635e-11, 5.11e-11, 5.734e-11,
2988 6.338e-11, 6.99e-11, 7.611e-11, 8.125e-11, 8.654e-11, 8.951e-11,
2989 9.182e-11, 9.31e-11, 9.273e-11, 9.094e-11, 8.849e-11, 8.662e-11,
2990 8.67e-11, 8.972e-11, 9.566e-11, 1.025e-10, 1.083e-10, 1.111e-10,
2991 1.074e-10, 9.771e-11, 8.468e-11, 6.958e-11, 5.47e-11, 4.04e-11,
2992 2.94e-11, 2.075e-11, 1.442e-11, 1.01e-11, 7.281e-12, 5.409e-12,
2993 4.138e-12, 3.304e-12, 2.784e-12, 2.473e-12, 2.273e-12, 2.186e-12,
2994 2.118e-12, 2.066e-12, 1.958e-12, 1.818e-12, 1.675e-12, 1.509e-12,
2995 1.349e-12, 1.171e-12, 9.838e-13, 8.213e-13, 6.765e-13, 5.378e-13,
2996 4.161e-13, 3.119e-13, 2.279e-13, 1.637e-13, 1.152e-13, 8.112e-14,
2997 5.919e-14, 4.47e-14, 3.492e-14, 2.811e-14, 2.319e-14, 1.948e-14,
2998 1.66e-14, 1.432e-14, 1.251e-14, 1.109e-14, 1.006e-14, 9.45e-15,
2999 9.384e-15, 1.012e-14, 1.216e-14, 1.636e-14, 2.305e-14, 3.488e-14,
3000 5.572e-14, 8.479e-14, 1.265e-13, 1.905e-13, 2.73e-13, 3.809e-13,
3001 4.955e-13, 6.303e-13, 7.861e-13, 9.427e-13, 1.097e-12, 1.212e-12,
3002 1.328e-12, 1.415e-12, 1.463e-12, 1.495e-12, 1.571e-12, 1.731e-12,
3003 1.981e-12, 2.387e-12, 2.93e-12, 3.642e-12, 4.584e-12, 5.822e-12,
3004 7.278e-12, 9.193e-12, 1.135e-11, 1.382e-11, 1.662e-11, 1.958e-11,
3005 2.286e-11, 2.559e-11, 2.805e-11, 2.988e-11, 3.106e-11, 3.182e-11,
3006 3.2e-11, 3.258e-11, 3.362e-11, 3.558e-11, 3.688e-11, 3.8e-11,
3007 3.929e-11, 4.062e-11, 4.186e-11, 4.293e-11, 4.48e-11, 4.643e-11,
3008 4.704e-11, 4.571e-11, 4.206e-11, 3.715e-11, 3.131e-11, 2.541e-11,
3009 1.978e-11, 1.508e-11, 1.146e-11, 8.7e-12, 6.603e-12, 5.162e-12,
3010 4.157e-12, 3.408e-12, 2.829e-12, 2.405e-12, 2.071e-12, 1.826e-12,
3011 1.648e-12, 1.542e-12, 1.489e-12, 1.485e-12, 1.493e-12, 1.545e-12,
3012 1.637e-12, 1.814e-12, 2.061e-12, 2.312e-12, 2.651e-12, 3.03e-12,
3013 3.46e-12, 3.901e-12, 4.306e-12, 4.721e-12, 5.008e-12, 5.281e-12,
3014 5.541e-12, 5.791e-12, 6.115e-12, 6.442e-12, 6.68e-12, 6.791e-12,
3015 6.831e-12, 6.839e-12, 6.946e-12, 7.128e-12, 7.537e-12, 8.036e-12,
3016 8.392e-12, 8.526e-12, 8.11e-12, 7.325e-12, 6.329e-12, 5.183e-12,
3017 4.081e-12, 2.985e-12, 2.141e-12, 1.492e-12, 1.015e-12, 6.684e-13,
3018 4.414e-13, 2.987e-13, 2.038e-13, 1.391e-13, 9.86e-14, 7.24e-14,
3019 5.493e-14, 4.288e-14, 3.427e-14, 2.787e-14, 2.296e-14, 1.909e-14,
3020 1.598e-14, 1.344e-14, 1.135e-14, 9.616e-15, 8.169e-15, 6.957e-15,
3021 5.938e-15, 5.08e-15, 4.353e-15, 3.738e-15, 3.217e-15, 2.773e-15,
3022 2.397e-15, 2.077e-15, 1.805e-15, 1.575e-15, 1.382e-15, 1.221e-15,
3023 1.09e-15, 9.855e-16, 9.068e-16, 8.537e-16, 8.27e-16, 8.29e-16,
3024 8.634e-16, 9.359e-16, 1.055e-15, 1.233e-15, 1.486e-15, 1.839e-15,
3025 2.326e-15, 2.998e-15, 3.934e-15, 5.256e-15, 7.164e-15, 9.984e-15,
3026 1.427e-14, 2.099e-14, 3.196e-14, 5.121e-14, 7.908e-14, 1.131e-13,
3027 1.602e-13, 2.239e-13, 3.075e-13, 4.134e-13, 5.749e-13, 7.886e-13,
3028 1.071e-12, 1.464e-12, 2.032e-12, 2.8e-12, 3.732e-12, 4.996e-12,
3029 6.483e-12, 8.143e-12, 1.006e-11, 1.238e-11, 1.484e-11, 1.744e-11,
3030 2.02e-11, 2.274e-11, 2.562e-11, 2.848e-11, 3.191e-11, 3.617e-11,
3031 4.081e-11, 4.577e-11, 4.937e-11, 5.204e-11, 5.401e-11, 5.462e-11,
3032 5.507e-11, 5.51e-11, 5.605e-11, 5.686e-11, 5.739e-11, 5.766e-11,
3033 5.74e-11, 5.754e-11, 5.761e-11, 5.777e-11, 5.712e-11, 5.51e-11,
3034 5.088e-11, 4.438e-11, 3.728e-11, 2.994e-11, 2.305e-11, 1.715e-11,
3035 1.256e-11, 9.208e-12, 6.745e-12, 5.014e-12, 3.785e-12, 2.9e-12,
3036 2.239e-12, 1.757e-12, 1.414e-12, 1.142e-12, 9.482e-13, 8.01e-13,
3037 6.961e-13, 6.253e-13, 5.735e-13, 5.433e-13, 5.352e-13, 5.493e-13,
3038 5.706e-13, 6.068e-13, 6.531e-13, 7.109e-13, 7.767e-13, 8.59e-13,
3039 9.792e-13, 1.142e-12, 1.371e-12, 1.65e-12, 1.957e-12, 2.302e-12,
3040 2.705e-12, 3.145e-12, 3.608e-12, 4.071e-12, 4.602e-12, 5.133e-12,
3041 5.572e-12, 5.987e-12, 6.248e-12, 6.533e-12, 6.757e-12, 6.935e-12,
3042 7.224e-12, 7.422e-12, 7.538e-12, 7.547e-12, 7.495e-12, 7.543e-12,
3043 7.725e-12, 8.139e-12, 8.627e-12, 9.146e-12, 9.443e-12, 9.318e-12,
3044 8.649e-12, 7.512e-12, 6.261e-12, 4.915e-12, 3.647e-12, 2.597e-12,
3045 1.785e-12, 1.242e-12, 8.66e-13, 6.207e-13, 4.61e-13, 3.444e-13,
3046 2.634e-13, 2.1e-13, 1.725e-13, 1.455e-13, 1.237e-13, 1.085e-13,
3047 9.513e-14, 7.978e-14, 6.603e-14, 5.288e-14, 4.084e-14, 2.952e-14,
3048 2.157e-14, 1.593e-14, 1.199e-14, 9.267e-15, 7.365e-15, 6.004e-15,
3049 4.995e-15, 4.218e-15, 3.601e-15, 3.101e-15, 2.692e-15, 2.36e-15,
3050 2.094e-15, 1.891e-15, 1.755e-15, 1.699e-15, 1.755e-15, 1.987e-15,
3051 2.506e-15, 3.506e-15, 5.289e-15, 8.311e-15, 1.325e-14, 2.129e-14,
3052 3.237e-14, 4.595e-14, 6.441e-14, 8.433e-14, 1.074e-13, 1.383e-13,
3053 1.762e-13, 2.281e-13, 2.831e-13, 3.523e-13, 4.38e-13, 5.304e-13,
3054 6.29e-13, 7.142e-13, 8.032e-13, 8.934e-13, 9.888e-13, 1.109e-12,
3055 1.261e-12, 1.462e-12, 1.74e-12, 2.099e-12, 2.535e-12, 3.008e-12,
3056 3.462e-12, 3.856e-12, 4.098e-12, 4.239e-12, 4.234e-12, 4.132e-12,
3057 3.986e-12, 3.866e-12, 3.829e-12, 3.742e-12, 3.705e-12, 3.694e-12,
3058 3.765e-12, 3.849e-12, 3.929e-12, 4.056e-12, 4.092e-12, 4.047e-12,
3059 3.792e-12, 3.407e-12, 2.953e-12, 2.429e-12, 1.931e-12, 1.46e-12,
3060 1.099e-12, 8.199e-13, 6.077e-13, 4.449e-13, 3.359e-13, 2.524e-13,
3061 1.881e-13, 1.391e-13, 1.02e-13, 7.544e-14, 5.555e-14, 4.22e-14,
3062 3.321e-14, 2.686e-14, 2.212e-14, 1.78e-14, 1.369e-14, 1.094e-14,
3063 9.13e-15, 8.101e-15, 7.828e-15, 8.393e-15, 1.012e-14, 1.259e-14,
3064 1.538e-14, 1.961e-14, 2.619e-14, 3.679e-14, 5.049e-14, 6.917e-14,
3065 8.88e-14, 1.115e-13, 1.373e-13, 1.619e-13, 1.878e-13, 2.111e-13,
3066 2.33e-13, 2.503e-13, 2.613e-13, 2.743e-13, 2.826e-13, 2.976e-13,
3067 3.162e-13, 3.36e-13, 3.491e-13, 3.541e-13, 3.595e-13, 3.608e-13,
3068 3.709e-13, 3.869e-13, 4.12e-13, 4.366e-13, 4.504e-13, 4.379e-13,
3069 3.955e-13, 3.385e-13, 2.741e-13, 2.089e-13, 1.427e-13, 9.294e-14,
3070 5.775e-14, 3.565e-14, 2.21e-14, 1.398e-14, 9.194e-15, 6.363e-15,
3071 4.644e-15, 3.55e-15, 2.808e-15, 2.274e-15, 1.871e-15, 1.557e-15,
3072 1.308e-15, 1.108e-15, 9.488e-16, 8.222e-16, 7.238e-16, 6.506e-16,
3073 6.008e-16, 5.742e-16, 5.724e-16, 5.991e-16, 6.625e-16, 7.775e-16,
3074 9.734e-16, 1.306e-15, 1.88e-15, 2.879e-15, 4.616e-15, 7.579e-15,
3075 1.248e-14, 2.03e-14, 3.244e-14, 5.171e-14, 7.394e-14, 9.676e-14,
3076 1.199e-13, 1.467e-13, 1.737e-13, 2.02e-13, 2.425e-13, 3.016e-13,
3077 3.7e-13, 4.617e-13, 5.949e-13, 7.473e-13, 9.378e-13, 1.191e-12,
3078 1.481e-12, 1.813e-12, 2.232e-12, 2.722e-12, 3.254e-12, 3.845e-12,
3079 4.458e-12, 5.048e-12, 5.511e-12, 5.898e-12, 6.204e-12, 6.293e-12,
3080 6.386e-12, 6.467e-12, 6.507e-12, 6.466e-12, 6.443e-12, 6.598e-12,
3081 6.873e-12, 7.3e-12, 7.816e-12, 8.368e-12, 8.643e-12, 8.466e-12,
3082 7.871e-12, 6.853e-12, 5.714e-12, 4.482e-12, 3.392e-12, 2.613e-12,
3083 2.008e-12, 1.562e-12, 1.228e-12, 9.888e-13, 7.646e-13, 5.769e-13,
3084 4.368e-13, 3.324e-13, 2.508e-13, 1.916e-13
3085 };
3086
3087 static const double xfcrev[15] =
3088 { 1.003, 1.009, 1.015, 1.023, 1.029, 1.033, 1.037,
3089 1.039, 1.04, 1.046, 1.036, 1.027, 1.01, 1.002, 1.
3090 };
3091
3092 double sfac;
3093
3094 /* Get H2O continuum absorption... */
3095 const double xw = nu / 10 + 1;
3096 if (xw >= 1 && xw < 2001) {
3097 const int iw = (int) xw;
3098 const double dw = xw - iw;
3099 const double ew = 1 - dw;
3100 const double cw296 = ew * h2o296[iw - 1] + dw * h2o296[iw];
3101 const double cw260 = ew * h2o260[iw - 1] + dw * h2o260[iw];
3102 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
3103 if (nu <= 820 || nu >= 960) {
3104 sfac = 1;
3105 } else {
3106 const double xx = (nu - 820) / 10;
3107 const int ix = (int) xx;
3108 const double dx = xx - ix;
3109 sfac = (1 - dx) * xfcrev[ix] + dx * xfcrev[ix + 1];
3110 }
3111 const double ctwslf =
3112 sfac * cw296 * pow(cw260 / cw296, (296 - t) / (296 - 260));
3113 const double vf2 = POW2(nu - 370);
3114 const double vf6 = POW3(vf2);
3115 const double fscal = 36100 / (vf2 + vf6 * 1e-8 + 36100) * -.25 + 1;
3116 const double ctwfrn = cwfrn * fscal;
3117 const double a1 = nu * u * tanh(.7193876 / t * nu);
3118 const double a2 = 296 / t;
3119 const double a3 = p / P0 * (q * ctwslf + (1 - q) * ctwfrn) * 1e-20;
3120 return a1 * a2 * a3;
3121 } else
3122 return 0;
3123}
3124
3125/*****************************************************************************/
3126
3127double ctmn2(
3128 const double nu,
3129 const double p,
3130 const double t) {
3131
3132 static const double ba[98] =
3133 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
3134 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
3135 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
3136 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
3137 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
3138 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
3139 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
3140 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
3141 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
3142 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
3143 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3144 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3145 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3146 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3147 };
3148
3149 static const double betaa[98] =
3150 { 802., 802., 761., 722., 679., 646., 609., 562.,
3151 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3152 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3153 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3154 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3155 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3156 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3157 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3158 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3159 372., 449., 514., 569., 609., 642., 673., 673.
3160 };
3161
3162 static const double nua[98] =
3163 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3164 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3165 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3166 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3167 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3168 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3169 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3170 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3171 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3172 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3173 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3174 };
3175
3176 const double t0 = 273.0, tr = 296.0;
3177
3178 /* Check wavenumber range... */
3179 if (nu < nua[0] || nu > nua[97])
3180 return 0;
3181
3182 /* Interpolate B and beta... */
3183 const int idx = locate_reg(nua, 98, nu);
3184 const double b =
3185 1e6 * LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3186 const double beta =
3187 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3188
3189 /* Compute absorption coefficient... */
3190 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3191 * N2 * b * (N2 + (1 - N2) * (1.294 - 0.4545 * t / tr));
3192}
3193
3194/*****************************************************************************/
3195
3196double ctmo2(
3197 const double nu,
3198 const double p,
3199 const double t) {
3200
3201 static const double ba[90] =
3202 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3203 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3204 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3205 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3206 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3207 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3208 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3209 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3210 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3211 .071, .064, 0.
3212 };
3213
3214 static const double betaa[90] =
3215 { 467., 467., 400., 315., 379., 368., 475., 521.,
3216 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3217 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3218 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3219 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3220 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3221 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3222 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3223 346., 322., 291., 290., 350., 371., 504., 504.
3224 };
3225
3226 static const double nua[90] =
3227 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3228 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3229 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3230 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3231 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3232 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3233 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3234 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3235 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3236 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3237 1800., 1805.
3238 };
3239
3240 const double t0 = 273, tr = 296;
3241
3242 /* Check wavenumber range... */
3243 if (nu < nua[0] || nu > nua[89])
3244 return 0;
3245
3246 /* Interpolate B and beta... */
3247 const int idx = locate_reg(nua, 90, nu);
3248 const double b = LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3249 const double beta =
3250 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3251
3252 /* Compute absorption coefficient... */
3253 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) * O2 * b;
3254}
3255
3256/*****************************************************************************/
3257
3259 const ctl_t *ctl,
3260 atm_t *atm_dest,
3261 const atm_t *atm_src,
3262 const int init) {
3263
3264 /* Data size... */
3265 const size_t s = (size_t) atm_src->np * sizeof(double);
3266
3267 /* Copy data... */
3268 atm_dest->np = atm_src->np;
3269 memcpy(atm_dest->time, atm_src->time, s);
3270 memcpy(atm_dest->z, atm_src->z, s);
3271 memcpy(atm_dest->lon, atm_src->lon, s);
3272 memcpy(atm_dest->lat, atm_src->lat, s);
3273 memcpy(atm_dest->p, atm_src->p, s);
3274 memcpy(atm_dest->t, atm_src->t, s);
3275 for (int ig = 0; ig < ctl->ng; ig++)
3276 memcpy(atm_dest->q[ig], atm_src->q[ig], s);
3277 for (int iw = 0; iw < ctl->nw; iw++)
3278 memcpy(atm_dest->k[iw], atm_src->k[iw], s);
3279 atm_dest->clz = atm_src->clz;
3280 atm_dest->cldz = atm_src->cldz;
3281 for (int icl = 0; icl < ctl->ncl; icl++)
3282 atm_dest->clk[icl] = atm_src->clk[icl];
3283 atm_dest->sft = atm_src->sft;
3284 for (int isf = 0; isf < ctl->nsf; isf++)
3285 atm_dest->sfeps[isf] = atm_src->sfeps[isf];
3286
3287 /* Initialize... */
3288 if (init)
3289 for (int ip = 0; ip < atm_dest->np; ip++) {
3290 atm_dest->p[ip] = 0;
3291 atm_dest->t[ip] = 0;
3292 for (int ig = 0; ig < ctl->ng; ig++)
3293 atm_dest->q[ig][ip] = 0;
3294 for (int iw = 0; iw < ctl->nw; iw++)
3295 atm_dest->k[iw][ip] = 0;
3296 atm_dest->clz = 0;
3297 atm_dest->cldz = 0;
3298 for (int icl = 0; icl < ctl->ncl; icl++)
3299 atm_dest->clk[icl] = 0;
3300 atm_dest->sft = 0;
3301 for (int isf = 0; isf < ctl->nsf; isf++)
3302 atm_dest->sfeps[isf] = 1;
3303 }
3304}
3305
3306/*****************************************************************************/
3307
3309 const ctl_t *ctl,
3310 obs_t *obs_dest,
3311 const obs_t *obs_src,
3312 const int init) {
3313
3314 /* Data size... */
3315 const size_t s = (size_t) obs_src->nr * sizeof(double);
3316
3317 /* Copy data... */
3318 obs_dest->nr = obs_src->nr;
3319 memcpy(obs_dest->time, obs_src->time, s);
3320 memcpy(obs_dest->obsz, obs_src->obsz, s);
3321 memcpy(obs_dest->obslon, obs_src->obslon, s);
3322 memcpy(obs_dest->obslat, obs_src->obslat, s);
3323 memcpy(obs_dest->vpz, obs_src->vpz, s);
3324 memcpy(obs_dest->vplon, obs_src->vplon, s);
3325 memcpy(obs_dest->vplat, obs_src->vplat, s);
3326 memcpy(obs_dest->tpz, obs_src->tpz, s);
3327 memcpy(obs_dest->tplon, obs_src->tplon, s);
3328 memcpy(obs_dest->tplat, obs_src->tplat, s);
3329 for (int id = 0; id < ctl->nd; id++)
3330 memcpy(obs_dest->rad[id], obs_src->rad[id], s);
3331 for (int id = 0; id < ctl->nd; id++)
3332 memcpy(obs_dest->tau[id], obs_src->tau[id], s);
3333
3334 /* Initialize... */
3335 if (init)
3336 for (int id = 0; id < ctl->nd; id++)
3337 for (int ir = 0; ir < obs_dest->nr; ir++)
3338 if (isfinite(obs_dest->rad[id][ir])) {
3339 obs_dest->rad[id][ir] = 0;
3340 obs_dest->tau[id][ir] = 0;
3341 }
3342}
3343
3344/*****************************************************************************/
3345
3347 int year,
3348 int mon,
3349 int day,
3350 int *doy) {
3351
3352 const int d0[12] =
3353 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3354 const int d0l[12] =
3355 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3356
3357 /* Get day of year... */
3358 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
3359 *doy = d0l[mon - 1] + day - 1;
3360 else
3361 *doy = d0[mon - 1] + day - 1;
3362}
3363
3364/*****************************************************************************/
3365
3367 int year,
3368 int doy,
3369 int *mon,
3370 int *day) {
3371
3372 const int d0[12] =
3373 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3374 const int d0l[12] =
3375 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3376 int i;
3377
3378 /* Get month and day... */
3379 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
3380 for (i = 11; i >= 0; i--)
3381 if (d0l[i] <= doy)
3382 break;
3383 *mon = i + 1;
3384 *day = doy - d0l[i] + 1;
3385 } else {
3386 for (i = 11; i >= 0; i--)
3387 if (d0[i] <= doy)
3388 break;
3389 *mon = i + 1;
3390 *day = doy - d0[i] + 1;
3391 }
3392}
3393
3394/*****************************************************************************/
3395
3397 const ctl_t *ctl,
3398 const char *emitter) {
3399
3400 for (int ig = 0; ig < ctl->ng; ig++)
3401 if (strcasecmp(ctl->emitter[ig], emitter) == 0)
3402 return ig;
3403
3404 return -1;
3405}
3406
3407/*****************************************************************************/
3408
3410 const ctl_t *ctl,
3411 const tbl_t *tbl,
3412 atm_t *atm,
3413 obs_t *obs) {
3414
3415 int *mask;
3416
3417 /* Allocate... */
3418 ALLOC(mask, int,
3419 ND * NR);
3420
3421 /* Save observation mask... */
3422 for (int id = 0; id < ctl->nd; id++)
3423 for (int ir = 0; ir < obs->nr; ir++)
3424 mask[id * NR + ir] = !isfinite(obs->rad[id][ir]);
3425
3426 /* Hydrostatic equilibrium... */
3427 hydrostatic(ctl, atm);
3428
3429 /* CGA or EGA forward model... */
3430 if (ctl->formod == 0 || ctl->formod == 1)
3431 for (int ir = 0; ir < obs->nr; ir++)
3432 formod_pencil(ctl, tbl, atm, obs, ir);
3433
3434 /* Call RFM... */
3435 else if (ctl->formod == 2)
3436 formod_rfm(ctl, atm, obs);
3437
3438 /* Apply field-of-view convolution... */
3439 formod_fov(ctl, obs);
3440
3441 /* Convert radiance to brightness temperature... */
3442 if (ctl->write_bbt)
3443 for (int id = 0; id < ctl->nd; id++)
3444 for (int ir = 0; ir < obs->nr; ir++)
3445 obs->rad[id][ir] = BRIGHT(obs->rad[id][ir], ctl->nu[id]);
3446
3447 /* Apply observation mask... */
3448 for (int id = 0; id < ctl->nd; id++)
3449 for (int ir = 0; ir < obs->nr; ir++)
3450 if (mask[id * NR + ir])
3451 obs->rad[id][ir] = NAN;
3452
3453 /* Free... */
3454 free(mask);
3455}
3456
3457/*****************************************************************************/
3458
3460 const ctl_t *ctl,
3461 const los_t *los,
3462 const int ip,
3463 double *beta) {
3464
3465 /* Extinction... */
3466 for (int id = 0; id < ctl->nd; id++)
3467 beta[id] = los->k[ip][id];
3468
3469 /* CO2 continuum... */
3470 if (ctl->ctm_co2 && ctl->ig_co2 >= 0)
3471 for (int id = 0; id < ctl->nd; id++)
3472 beta[id] += ctmco2(ctl->nu[id], los->p[ip], los->t[ip],
3473 los->u[ip][ctl->ig_co2]) / los->ds[ip];
3474
3475 /* H2O continuum... */
3476 if (ctl->ctm_h2o && ctl->ig_h2o >= 0)
3477 for (int id = 0; id < ctl->nd; id++)
3478 beta[id] += ctmh2o(ctl->nu[id], los->p[ip], los->t[ip],
3479 los->q[ip][ctl->ig_h2o], los->u[ip][ctl->ig_h2o])
3480 / los->ds[ip];
3481
3482 /* N2 continuum... */
3483 if (ctl->ctm_n2)
3484 for (int id = 0; id < ctl->nd; id++)
3485 beta[id] += ctmn2(ctl->nu[id], los->p[ip], los->t[ip]);
3486
3487 /* O2 continuum... */
3488 if (ctl->ctm_o2)
3489 for (int id = 0; id < ctl->nd; id++)
3490 beta[id] += ctmo2(ctl->nu[id], los->p[ip], los->t[ip]);
3491}
3492
3493/*****************************************************************************/
3494
3496 const ctl_t *ctl,
3497 obs_t *obs) {
3498
3499 obs_t *obs2;
3500
3501 double rad[ND][NR], tau[ND][NR], z[NR];
3502
3503 /* Do not take into account FOV... */
3504 if (ctl->fov[0] == '-')
3505 return;
3506
3507 /* Allocate... */
3508 ALLOC(obs2, obs_t, 1);
3509
3510 /* Copy observation data... */
3511 copy_obs(ctl, obs2, obs, 0);
3512
3513 /* Loop over ray paths... */
3514 for (int ir = 0; ir < obs->nr; ir++) {
3515
3516 /* Get radiance and transmittance profiles... */
3517 int nz = 0;
3518 for (int ir2 = MAX(ir - NFOV, 0);
3519 ir2 < MIN(ir + 1 + NFOV, obs->nr); ir2++)
3520 if (obs->time[ir2] == obs->time[ir]) {
3521 z[nz] = obs2->vpz[ir2];
3522 for (int id = 0; id < ctl->nd; id++) {
3523 rad[id][nz] = obs2->rad[id][ir2];
3524 tau[id][nz] = obs2->tau[id][ir2];
3525 }
3526 nz++;
3527 }
3528 if (nz < 2)
3529 ERRMSG("Cannot apply FOV convolution!");
3530
3531 /* Convolute profiles with FOV... */
3532 double wsum = 0;
3533 for (int id = 0; id < ctl->nd; id++) {
3534 obs->rad[id][ir] = 0;
3535 obs->tau[id][ir] = 0;
3536 }
3537 for (int i = 0; i < ctl->fov_n; i++) {
3538 const double zfov = obs->vpz[ir] + ctl->fov_dz[i];
3539 const int idx = locate_irr(z, nz, zfov);
3540 for (int id = 0; id < ctl->nd; id++) {
3541 obs->rad[id][ir] += ctl->fov_w[i]
3542 * LIN(z[idx], rad[id][idx], z[idx + 1], rad[id][idx + 1], zfov);
3543 obs->tau[id][ir] += ctl->fov_w[i]
3544 * LIN(z[idx], tau[id][idx], z[idx + 1], tau[id][idx + 1], zfov);
3545 }
3546 wsum += ctl->fov_w[i];
3547 }
3548 for (int id = 0; id < ctl->nd; id++) {
3549 obs->rad[id][ir] /= wsum;
3550 obs->tau[id][ir] /= wsum;
3551 }
3552 }
3553
3554 /* Free... */
3555 free(obs2);
3556}
3557
3558/*****************************************************************************/
3559
3561 const ctl_t *ctl,
3562 const tbl_t *tbl,
3563 const atm_t *atm,
3564 obs_t *obs,
3565 const int ir) {
3566
3567 los_t *los;
3568
3569 double beta_ctm[ND], rad[ND], tau[ND], tau_refl[ND],
3570 tau_path[ND][NG], tau_gas[ND], x0[3], x1[3];
3571
3572 /* Allocate... */
3573 ALLOC(los, los_t, 1);
3574
3575 /* Initialize... */
3576 for (int id = 0; id < ctl->nd; id++) {
3577 rad[id] = 0;
3578 tau[id] = 1;
3579 for (int ig = 0; ig < ctl->ng; ig++)
3580 tau_path[id][ig] = 1;
3581 }
3582
3583 /* Raytracing... */
3584 raytrace(ctl, atm, obs, los, ir);
3585
3586 /* Loop over LOS points... */
3587 for (int ip = 0; ip < los->np; ip++) {
3588
3589 /* Get trace gas transmittance... */
3590 if (ctl->formod == 0)
3591 intpol_tbl_cga(ctl, tbl, los, ip, tau_path, tau_gas);
3592 else
3593 intpol_tbl_ega(ctl, tbl, los, ip, tau_path, tau_gas);
3594
3595 /* Get continuum absorption... */
3596 formod_continua(ctl, los, ip, beta_ctm);
3597
3598 /* Compute Planck function... */
3599 formod_srcfunc(ctl, tbl, los->t[ip], los->src[ip]);
3600
3601 /* Loop over channels... */
3602 for (int id = 0; id < ctl->nd; id++)
3603 if (tau_gas[id] > 0) {
3604
3605 /* Get segment emissivity... */
3606 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3607
3608 /* Compute radiance... */
3609 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3610
3611 /* Compute path transmittance... */
3612 tau[id] *= (1 - los->eps[ip][id]);
3613 }
3614 }
3615
3616 /* Check whether LOS hit the ground... */
3617 if (ctl->sftype >= 1 && los->sft > 0) {
3618
3619 /* Add surface emissions... */
3620 double src_sf[ND];
3621 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3622 for (int id = 0; id < ctl->nd; id++)
3623 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3624
3625 /* Check reflectivity... */
3626 int refl = 0;
3627 if (ctl->sftype >= 2)
3628 for (int id = 0; id < ctl->nd; id++)
3629 if (los->sfeps[id] < 1) {
3630 refl = 1;
3631 break;
3632 }
3633
3634 /* Calculate reflection... */
3635 if (refl) {
3636
3637 /* Initialize... */
3638 for (int id = 0; id < ctl->nd; id++)
3639 tau_refl[id] = 1;
3640
3641 /* Add down-welling radiance... */
3642 for (int ip = los->np - 1; ip >= 0; ip--)
3643 for (int id = 0; id < ctl->nd; id++) {
3644 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3645 * tau[id] * (1 - los->sfeps[id]);
3646 tau_refl[id] *= (1 - los->eps[ip][id]);
3647 }
3648
3649 /* Add solar term... */
3650 if (ctl->sftype >= 3) {
3651
3652 /* Get cosine of solar zenith angle... */
3653 double cos_sza_val;
3654 if (ctl->sfsza < 0)
3655 cos_sza_val = cos_sza(obs->time[ir],
3656 los->lon[los->np - 1], los->lat[los->np - 1]);
3657 else
3658 cos_sza_val = cos(DEG2RAD(ctl->sfsza));
3659
3660 /* Check validity (avoid division by zero)... */
3661 if (cos_sza_val > 1e-6) {
3662
3663 /* Compute incidence direction cosine... */
3664 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3665 los->lat[los->np - 1], x0);
3666 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3667 for (int i = 0; i < 3; i++)
3668 x1[i] -= x0[i];
3669 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3670
3671 /* Ratio of incident direction to solar zenith direction... */
3672 const double rcos = cosa / cos_sza_val;
3673
3674 /* Add solar radiance contribution... */
3675 for (int id = 0; id < ctl->nd; id++)
3676 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3677 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3678 }
3679 }
3680 }
3681 }
3682
3683 /* Copy results... */
3684 for (int id = 0; id < ctl->nd; id++) {
3685 obs->rad[id][ir] = rad[id];
3686 obs->tau[id][ir] = tau[id];
3687 }
3688
3689 /* Free... */
3690 free(los);
3691}
3692
3693/*****************************************************************************/
3694
3696 const ctl_t *ctl,
3697 const atm_t *atm,
3698 obs_t *obs) {
3699
3700 los_t *los;
3701
3702 FILE *out;
3703
3704 char cmd[2 * LEN], filename[2 * LEN],
3705 rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3706
3707 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3708 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3709
3710 int n, nadir = 0;
3711
3712 /* Allocate... */
3713 ALLOC(los, los_t, 1);
3714
3715 /* Check observer positions... */
3716 for (int ir = 1; ir < obs->nr; ir++)
3717 if (obs->obsz[ir] != obs->obsz[0]
3718 || obs->obslon[ir] != obs->obslon[0]
3719 || obs->obslat[ir] != obs->obslat[0])
3720 ERRMSG("RFM interface requires identical observer positions!");
3721
3722 /* Check extinction data... */
3723 for (int iw = 0; iw < ctl->nw; iw++)
3724 for (int ip = 0; ip < atm->np; ip++)
3725 if (atm->k[iw][ip] != 0)
3726 ERRMSG("RFM interface cannot handle extinction data!");
3727
3728 /* Get altitude range of atmospheric data... */
3729 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3730
3731 /* Observer within atmosphere? */
3732 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3733 obsz = obs->obsz[0];
3734 strcat(rfmflg, " OBS");
3735 }
3736
3737 /* Determine tangent altitude or air mass factor... */
3738 for (int ir = 0; ir < obs->nr; ir++) {
3739
3740 /* Raytracing... */
3741 raytrace(ctl, atm, obs, los, ir);
3742
3743 /* Nadir? */
3744 if (obs->tpz[ir] <= zmin) {
3745 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3746 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3747 for (int i = 0; i < 3; i++)
3748 xd[i] = xo[i] - xv[i];
3749 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3750 nadir++;
3751 } else
3752 z[ir] = obs->tpz[ir];
3753 }
3754 if (nadir > 0 && nadir < obs->nr)
3755 ERRMSG("Limb and nadir not simultaneously possible!");
3756
3757 /* Nadir? */
3758 if (nadir)
3759 strcat(rfmflg, " NAD");
3760
3761 /* Get surface temperature... */
3762 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3763
3764 /* Refraction? */
3765 if (!nadir && !ctl->refrac)
3766 strcat(rfmflg, " GEO");
3767
3768 /* Continua? */
3769 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3770 strcat(rfmflg, " CTM");
3771
3772 /* Write atmospheric data file... */
3773 write_atm_rfm("rfm.atm", ctl, atm);
3774
3775 /* Loop over channels... */
3776 for (int id = 0; id < ctl->nd; id++) {
3777
3778 /* Read filter function... */
3779 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3780 read_shape(filename, nu, f, &n);
3781
3782 /* Set spectral range... */
3783 nu0 = nu[0];
3784 nu1 = nu[n - 1];
3785
3786 /* Create RFM driver file... */
3787 if (!(out = fopen("rfm.drv", "w")))
3788 ERRMSG("Cannot create file!");
3789 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3790 fprintf(out, "*FLG\n%s\n", rfmflg);
3791 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3792 fprintf(out, "*GAS\n");
3793 for (int ig = 0; ig < ctl->ng; ig++)
3794 fprintf(out, "%s\n", ctl->emitter[ig]);
3795 fprintf(out, "*ATM\nrfm.atm\n");
3796 fprintf(out, "*TAN\n");
3797 for (int ir = 0; ir < obs->nr; ir++)
3798 fprintf(out, "%g\n", z[ir]);
3799 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3800 if (obsz >= 0)
3801 fprintf(out, "*OBS\n%g\n", obsz);
3802 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3803 fprintf(out, "*XSC\n");
3804 for (int ig = 0; ig < ctl->ng; ig++)
3805 if (ctl->rfmxsc[ig][0] != '-')
3806 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3807 fprintf(out, "*END\n");
3808 fclose(out);
3809
3810 /* Remove temporary files... */
3811 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3812 ERRMSG("Cannot remove temporary files!");
3813
3814 /* Call RFM... */
3815 sprintf(cmd, "echo | %s", ctl->rfmbin);
3816 if (system(cmd))
3817 ERRMSG("Error while calling RFM!");
3818
3819 /* Read data... */
3820 for (int ir = 0; ir < obs->nr; ir++) {
3821 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3822 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3823 }
3824 }
3825
3826 /* Remove temporary files... */
3827 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3828 ERRMSG("Error while removing temporary files!");
3829
3830 /* Free... */
3831 free(los);
3832}
3833
3834/*****************************************************************************/
3835
3837 const ctl_t *ctl,
3838 const tbl_t *tbl,
3839 const double t,
3840 double *src) {
3841
3842 /* Determine index in temperature array... */
3843 const int it = locate_reg(tbl->st, TBLNS, t);
3844
3845 /* Interpolate Planck function value... */
3846 for (int id = 0; id < ctl->nd; id++)
3847 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3848 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3849}
3850
3851/*****************************************************************************/
3852
3854 const double z,
3855 const double lon,
3856 const double lat,
3857 double *x) {
3858
3859 const double radius = z + RE;
3860
3861 const double latrad = lat / 180. * M_PI;
3862 const double lonrad = lon / 180. * M_PI;
3863
3864 const double coslat = cos(latrad);
3865
3866 x[0] = radius * coslat * cos(lonrad);
3867 x[1] = radius * coslat * sin(lonrad);
3868 x[2] = radius * sin(latrad);
3869}
3870
3871/*****************************************************************************/
3872
3874 const ctl_t *ctl,
3875 atm_t *atm) {
3876
3877 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3878
3879 const int ipts = 20;
3880
3881 double dzmin = 1e99, e = 0;
3882
3883 int ipref = 0;
3884
3885 /* Check reference height... */
3886 if (ctl->hydz < 0)
3887 return;
3888
3889 /* Find air parcel next to reference height... */
3890 for (int ip = 0; ip < atm->np; ip++)
3891 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3892 dzmin = fabs(atm->z[ip] - ctl->hydz);
3893 ipref = ip;
3894 }
3895
3896 /* Upper part of profile... */
3897 for (int ip = ipref + 1; ip < atm->np; ip++) {
3898 double mean = 0;
3899 for (int i = 0; i < ipts; i++) {
3900 if (ctl->ig_h2o >= 0)
3901 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3902 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3903 mean += (e * mmh2o + (1 - e) * mmair)
3904 * G0 / RI
3905 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3906 }
3907
3908 /* Compute p(z,T)... */
3909 atm->p[ip] =
3910 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3911 }
3912
3913 /* Lower part of profile... */
3914 for (int ip = ipref - 1; ip >= 0; ip--) {
3915 double mean = 0;
3916 for (int i = 0; i < ipts; i++) {
3917 if (ctl->ig_h2o >= 0)
3918 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3919 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3920 mean += (e * mmh2o + (1 - e) * mmair)
3921 * G0 / RI
3922 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3923 }
3924
3925 /* Compute p(z,T)... */
3926 atm->p[ip] =
3927 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3928 }
3929}
3930
3931/*****************************************************************************/
3932
3934 const ctl_t *ctl,
3935 const int idx,
3936 char *quantity) {
3937
3938 if (idx == IDXP)
3939 sprintf(quantity, "PRESSURE");
3940
3941 if (idx == IDXT)
3942 sprintf(quantity, "TEMPERATURE");
3943
3944 for (int ig = 0; ig < ctl->ng; ig++)
3945 if (idx == IDXQ(ig))
3946 sprintf(quantity, "%s", ctl->emitter[ig]);
3947
3948 for (int iw = 0; iw < ctl->nw; iw++)
3949 if (idx == IDXK(iw))
3950 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3951
3952 if (idx == IDXCLZ)
3953 sprintf(quantity, "CLOUD_HEIGHT");
3954
3955 if (idx == IDXCLDZ)
3956 sprintf(quantity, "CLOUD_DEPTH");
3957
3958 for (int icl = 0; icl < ctl->ncl; icl++)
3959 if (idx == IDXCLK(icl))
3960 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3961
3962 if (idx == IDXSFT)
3963 sprintf(quantity, "SURFACE_TEMPERATURE");
3964
3965 for (int isf = 0; isf < ctl->nsf; isf++)
3966 if (idx == IDXSFEPS(isf))
3967 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3968}
3969
3970/*****************************************************************************/
3971
3973 const ctl_t *ctl,
3974 tbl_t *tbl) {
3975
3976 char filename[2 * LEN];
3977
3978 double f[NSHAPE], nu[NSHAPE];
3979
3980 int n;
3981
3982 /* Write info... */
3983 LOG(1, "Initialize source function table...");
3984 LOG(2, "Number of data points: %d", TBLNS);
3985
3986 /* Loop over channels... */
3987 for (int id = 0; id < ctl->nd; id++) {
3988
3989 /* Read filter function... */
3990 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3991 read_shape(filename, nu, f, &n);
3992
3993 /* Get minimum grid spacing... */
3994 double dnu = 1.0;
3995 for (int i = 1; i < n; i++)
3996 dnu = MIN(dnu, nu[i] - nu[i - 1]);
3997
3998 /* Compute source function table... */
3999#pragma omp parallel for default(none) shared(ctl,tbl,id,nu,f,n,dnu)
4000 for (int it = 0; it < TBLNS; it++) {
4001
4002 /* Set temperature... */
4003 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
4004
4005 /* Integrate Planck function... */
4006 double fsum = tbl->sr[it][id] = 0;
4007 for (double fnu = nu[0]; fnu <= nu[n - 1]; fnu += dnu) {
4008 const int i = locate_irr(nu, n, fnu);
4009 const double ff = LIN(nu[i], f[i], nu[i + 1], f[i + 1], fnu);
4010 fsum += ff;
4011 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
4012 }
4013 tbl->sr[it][id] /= fsum;
4014 }
4015
4016 /* Write info... */
4017 LOG(2,
4018 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
4019 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
4020 tbl->sr[TBLNS - 1][id]);
4021 }
4022}
4023
4024/*****************************************************************************/
4025
4027 const ctl_t *ctl,
4028 const atm_t *atm,
4029 const double z,
4030 double *p,
4031 double *t,
4032 double *q,
4033 double *k) {
4034
4035 /* Get array index... */
4036 const int ip = locate_irr(atm->z, atm->np, z);
4037
4038 /* Interpolate... */
4039 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
4040 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
4041 for (int ig = 0; ig < ctl->ng; ig++)
4042 q[ig] =
4043 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
4044 for (int iw = 0; iw < ctl->nw; iw++)
4045 k[iw] =
4046 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
4047}
4048
4049/*****************************************************************************/
4050
4052 const ctl_t *ctl,
4053 const tbl_t *tbl,
4054 const los_t *los,
4055 const int ip,
4056 double tau_path[ND][NG],
4057 double tau_seg[ND]) {
4058
4059 double eps;
4060
4061 /* Loop over channels... */
4062 for (int id = 0; id < ctl->nd; id++) {
4063
4064 /* Initialize... */
4065 tau_seg[id] = 1;
4066
4067 /* Loop over emitters.... */
4068 for (int ig = 0; ig < ctl->ng; ig++) {
4069
4070 /* Check size of table (pressure) and column density... */
4071 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4072 eps = 0;
4073
4074 /* Check transmittance... */
4075 else if (tau_path[id][ig] < 1e-9)
4076 eps = 1;
4077
4078 /* Interpolate... */
4079 else {
4080
4081 /* Determine pressure and temperature indices... */
4082 const int ipr =
4083 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
4084 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
4085 los->cgt[ip][ig]);
4086 const int it1 =
4087 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4088 los->cgt[ip][ig]);
4089
4090 /* Check size of table (temperature and column density)... */
4091 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4092 || tbl->nu[id][ig][ipr][it0] < 2
4093 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4094 || tbl->nu[id][ig][ipr + 1][it1] < 2
4095 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4096 eps = 0;
4097
4098 else {
4099
4100 /* Get emissivities of extended path... */
4101 double eps00
4102 = intpol_tbl_eps(tbl, ig, id, ipr, it0, los->cgu[ip][ig]);
4103 double eps01 =
4104 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, los->cgu[ip][ig]);
4105 double eps10 =
4106 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, los->cgu[ip][ig]);
4107 double eps11 =
4108 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, los->cgu[ip][ig]);
4109
4110 /* Interpolate with respect to temperature... */
4111 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4112 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4113 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4114 tbl->t[id][ig][ipr + 1][it1 + 1],
4115 eps11, los->cgt[ip][ig]);
4116
4117 /* Interpolate with respect to pressure... */
4118 eps00 = LOGX(tbl->p[id][ig][ipr], eps00,
4119 tbl->p[id][ig][ipr + 1], eps11, los->cgp[ip][ig]);
4120
4121 /* Check emissivity range... */
4122 eps00 = MAX(MIN(eps00, 1), 0);
4123
4124 /* Determine segment emissivity... */
4125 eps = 1 - (1 - eps00) / tau_path[id][ig];
4126 }
4127 }
4128
4129 /* Get transmittance of extended path... */
4130 tau_path[id][ig] *= (1 - eps);
4131
4132 /* Get segment transmittance... */
4133 tau_seg[id] *= (1 - eps);
4134 }
4135 }
4136}
4137
4138/*****************************************************************************/
4139
4141 const ctl_t *ctl,
4142 const tbl_t *tbl,
4143 const los_t *los,
4144 const int ip,
4145 double tau_path[ND][NG],
4146 double tau_seg[ND]) {
4147
4148 double eps, u;
4149
4150 /* Loop over channels... */
4151 for (int id = 0; id < ctl->nd; id++) {
4152
4153 /* Initialize... */
4154 tau_seg[id] = 1;
4155
4156 /* Loop over emitters.... */
4157 for (int ig = 0; ig < ctl->ng; ig++) {
4158
4159 /* Check size of table (pressure) and column density... */
4160 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4161 eps = 0;
4162
4163 /* Check transmittance... */
4164 else if (tau_path[id][ig] < 1e-9)
4165 eps = 1;
4166
4167 /* Interpolate... */
4168 else {
4169
4170 /* Determine pressure and temperature indices... */
4171 const int ipr =
4172 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4173 const int it0 =
4174 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4175 const int it1 =
4176 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4177 los->t[ip]);
4178
4179 /* Check size of table (temperature and column density)... */
4180 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4181 || tbl->nu[id][ig][ipr][it0] < 2
4182 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4183 || tbl->nu[id][ig][ipr + 1][it1] < 2
4184 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4185 eps = 0;
4186
4187 else {
4188
4189 /* Get emissivities of extended path... */
4190 u = intpol_tbl_u(tbl, ig, id, ipr, it0, 1 - tau_path[id][ig]);
4191 double eps00
4192 = intpol_tbl_eps(tbl, ig, id, ipr, it0, u + los->u[ip][ig]);
4193
4194 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, 1 - tau_path[id][ig]);
4195 double eps01 =
4196 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, u + los->u[ip][ig]);
4197
4198 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, 1 - tau_path[id][ig]);
4199 double eps10 =
4200 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, u + los->u[ip][ig]);
4201
4202 u =
4203 intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, 1 - tau_path[id][ig]);
4204 double eps11 =
4205 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, u + los->u[ip][ig]);
4206
4207 /* Interpolate with respect to temperature... */
4208 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4209 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4210 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4211 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4212
4213 /* Interpolate with respect to pressure... */
4214 eps00 = LIN(tbl->p[id][ig][ipr], eps00,
4215 tbl->p[id][ig][ipr + 1], eps11, los->p[ip]);
4216
4217 /* Check emissivity range... */
4218 eps00 = MAX(MIN(eps00, 1), 0);
4219
4220 /* Determine segment emissivity... */
4221 eps = 1 - (1 - eps00) / tau_path[id][ig];
4222 }
4223 }
4224
4225 /* Get transmittance of extended path... */
4226 tau_path[id][ig] *= (1 - eps);
4227
4228 /* Get segment transmittance... */
4229 tau_seg[id] *= (1 - eps);
4230 }
4231 }
4232}
4233
4234/*****************************************************************************/
4235
4236inline double intpol_tbl_eps(
4237 const tbl_t *tbl,
4238 const int ig,
4239 const int id,
4240 const int ip,
4241 const int it,
4242 const double u) {
4243
4244 const int nu = tbl->nu[id][ig][ip][it];
4245 const float *u_arr = tbl->u[id][ig][ip][it];
4246 const float *eps_arr = tbl->eps[id][ig][ip][it];
4247
4248 const double u_min = u_arr[0];
4249 const double u_max = u_arr[nu - 1];
4250
4251 /* Lower boundary extrapolation... */
4252 if (u < u_min)
4253 return eps_arr[0] * u / u_min;
4254
4255 /* Upper boundary extrapolation... */
4256 if (u > u_max) {
4257 const double a = log(1.0 - eps_arr[nu - 1]) / u_max;
4258 return 1.0 - exp(a * u);
4259 }
4260
4261 /* Interpolation... */
4262 const int idx = locate_tbl(u_arr, nu, u);
4263 return LIN(u_arr[idx], eps_arr[idx], u_arr[idx + 1], eps_arr[idx + 1], u);
4264}
4265
4266/*****************************************************************************/
4267
4268inline double intpol_tbl_u(
4269 const tbl_t *tbl,
4270 const int ig,
4271 const int id,
4272 const int ip,
4273 const int it,
4274 const double eps) {
4275
4276 const int nu = tbl->nu[id][ig][ip][it];
4277 const float *eps_arr = tbl->eps[id][ig][ip][it];
4278 const float *u_arr = tbl->u[id][ig][ip][it];
4279
4280 const double eps_min = eps_arr[0];
4281 const double eps_max = eps_arr[nu - 1];
4282
4283 /* Lower boundary extrapolation... */
4284 if (eps < eps_min)
4285 return u_arr[0] * eps / eps_min;
4286
4287 /* Upper boundary extrapolation... */
4288 if (eps > eps_max) {
4289 const double a = log(1.0 - eps_max) / u_arr[nu - 1];
4290 return log(1.0 - eps) / a;
4291 }
4292
4293 /* Interpolation... */
4294 const int idx = locate_tbl(eps_arr, nu, eps);
4295 return LIN(eps_arr[idx], u_arr[idx], eps_arr[idx + 1], u_arr[idx + 1], eps);
4296}
4297
4298/*****************************************************************************/
4299
4301 const double jsec,
4302 int *year,
4303 int *mon,
4304 int *day,
4305 int *hour,
4306 int *min,
4307 int *sec,
4308 double *remain) {
4309
4310 struct tm t0, *t1;
4311
4312 t0.tm_year = 100;
4313 t0.tm_mon = 0;
4314 t0.tm_mday = 1;
4315 t0.tm_hour = 0;
4316 t0.tm_min = 0;
4317 t0.tm_sec = 0;
4318
4319 const time_t jsec0 = (time_t) jsec + timegm(&t0);
4320 t1 = gmtime(&jsec0);
4321
4322 *year = t1->tm_year + 1900;
4323 *mon = t1->tm_mon + 1;
4324 *day = t1->tm_mday;
4325 *hour = t1->tm_hour;
4326 *min = t1->tm_min;
4327 *sec = t1->tm_sec;
4328 *remain = jsec - floor(jsec);
4329}
4330
4331/*****************************************************************************/
4332
4334 const ctl_t *ctl,
4335 const tbl_t *tbl,
4336 atm_t *atm,
4337 obs_t *obs,
4338 gsl_matrix *k) {
4339
4340 int *iqa;
4341
4342 /* Get sizes... */
4343 const size_t m = k->size1;
4344 const size_t n = k->size2;
4345
4346 /* Allocate... */
4347 gsl_vector *x0 = gsl_vector_alloc(n);
4348 gsl_vector *yy0 = gsl_vector_alloc(m);
4349 ALLOC(iqa, int,
4350 N);
4351
4352 /* Compute radiance for undisturbed atmospheric data... */
4353 formod(ctl, tbl, atm, obs);
4354
4355 /* Compose vectors... */
4356 atm2x(ctl, atm, x0, iqa, NULL);
4357 obs2y(ctl, obs, yy0, NULL, NULL);
4358
4359 /* Initialize kernel matrix... */
4360 gsl_matrix_set_zero(k);
4361
4362 /* Loop over state vector elements... */
4363#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4364 for (size_t j = 0; j < n; j++) {
4365
4366 /* Allocate... */
4367 atm_t *atm1;
4368 obs_t *obs1;
4369 ALLOC(atm1, atm_t, 1);
4370 ALLOC(obs1, obs_t, 1);
4371 gsl_vector *x1 = gsl_vector_alloc(n);
4372 gsl_vector *yy1 = gsl_vector_alloc(m);
4373
4374 /* Set perturbation size... */
4375 double h;
4376 if (iqa[j] == IDXP)
4377 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4378 else if (iqa[j] == IDXT)
4379 h = 1.0;
4380 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4381 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4382 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4383 h = 1e-4;
4384 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4385 h = 1.0;
4386 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4387 h = 1e-4;
4388 else if (iqa[j] == IDXSFT)
4389 h = 1.0;
4390 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4391 h = 1e-2;
4392 else
4393 ERRMSG("Cannot set perturbation size!");
4394
4395 /* Disturb state vector element... */
4396 gsl_vector_memcpy(x1, x0);
4397 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4398 copy_atm(ctl, atm1, atm, 0);
4399 copy_obs(ctl, obs1, obs, 0);
4400 x2atm(ctl, x1, atm1);
4401
4402 /* Compute radiance for disturbed atmospheric data... */
4403 formod(ctl, tbl, atm1, obs1);
4404
4405 /* Compose measurement vector for disturbed radiance data... */
4406 obs2y(ctl, obs1, yy1, NULL, NULL);
4407
4408 /* Compute derivatives... */
4409 for (size_t i = 0; i < m; i++)
4410 gsl_matrix_set(k, i, j,
4411 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4412
4413 /* Free... */
4414 gsl_vector_free(x1);
4415 gsl_vector_free(yy1);
4416 free(atm1);
4417 free(obs1);
4418 }
4419
4420 /* Free... */
4421 gsl_vector_free(x0);
4422 gsl_vector_free(yy0);
4423 free(iqa);
4424}
4425
4426/*****************************************************************************/
4427
4429 const double *xx,
4430 const int n,
4431 const double x) {
4432
4433 int ilo = 0;
4434 int ihi = n - 1;
4435 int i = (ihi + ilo) >> 1;
4436
4437 if (xx[i] < xx[i + 1])
4438 while (ihi > ilo + 1) {
4439 i = (ihi + ilo) >> 1;
4440 if (xx[i] > x)
4441 ihi = i;
4442 else
4443 ilo = i;
4444 } else
4445 while (ihi > ilo + 1) {
4446 i = (ihi + ilo) >> 1;
4447 if (xx[i] <= x)
4448 ihi = i;
4449 else
4450 ilo = i;
4451 }
4452
4453 return ilo;
4454}
4455
4456/*****************************************************************************/
4457
4459 const double *xx,
4460 const int n,
4461 const double x) {
4462
4463 /* Calculate index... */
4464 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4465
4466 /* Check range... */
4467 if (i < 0)
4468 return 0;
4469 else if (i > n - 2)
4470 return n - 2;
4471 else
4472 return i;
4473}
4474
4475/*****************************************************************************/
4476
4477inline int locate_tbl(
4478 const float *xx,
4479 const int n,
4480 const double x) {
4481
4482 int ilo = 0;
4483 int ihi = n - 1;
4484 int i = (ihi + ilo) >> 1;
4485
4486 while (ihi > ilo + 1) {
4487 i = (ihi + ilo) >> 1;
4488 if (xx[i] > x)
4489 ihi = i;
4490 else
4491 ilo = i;
4492 }
4493
4494 return ilo;
4495}
4496
4497/*****************************************************************************/
4498
4500 gsl_matrix *a) {
4501
4502 size_t diag = 1;
4503
4504 /* Get size... */
4505 const size_t n = a->size1;
4506
4507 /* Check if matrix is diagonal... */
4508 for (size_t i = 0; i < n && diag; i++)
4509 for (size_t j = i + 1; j < n; j++)
4510 if (gsl_matrix_get(a, i, j) != 0) {
4511 diag = 0;
4512 break;
4513 }
4514
4515 /* Quick inversion of diagonal matrix... */
4516 if (diag)
4517 for (size_t i = 0; i < n; i++)
4518 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4519
4520 /* Matrix inversion by means of Cholesky decomposition... */
4521 else {
4522 gsl_linalg_cholesky_decomp(a);
4523 gsl_linalg_cholesky_invert(a);
4524 }
4525}
4526
4527/*****************************************************************************/
4528
4530 const gsl_matrix *a,
4531 const gsl_vector *b,
4532 const int transpose,
4533 gsl_matrix *c) {
4534
4535 /* Set sizes... */
4536 const size_t m = a->size1;
4537 const size_t n = a->size2;
4538
4539 /* Allocate... */
4540 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4541
4542 /* Compute A^T B A... */
4543 if (transpose == 1) {
4544
4545 /* Compute B^1/2 A... */
4546 for (size_t i = 0; i < m; i++)
4547 for (size_t j = 0; j < n; j++)
4548 gsl_matrix_set(aux, i, j,
4549 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4550
4551 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4552 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4553 }
4554
4555 /* Compute A B A^T... */
4556 else if (transpose == 2) {
4557
4558 /* Compute A B^1/2... */
4559 for (size_t i = 0; i < m; i++)
4560 for (size_t j = 0; j < n; j++)
4561 gsl_matrix_set(aux, i, j,
4562 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4563
4564 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4565 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4566 }
4567
4568 /* Free... */
4569 gsl_matrix_free(aux);
4570}
4571
4572/*****************************************************************************/
4573
4574size_t obs2y(
4575 const ctl_t *ctl,
4576 const obs_t *obs,
4577 gsl_vector *y,
4578 int *ida,
4579 int *ira) {
4580
4581 size_t m = 0;
4582
4583 /* Determine measurement vector... */
4584 for (int ir = 0; ir < obs->nr; ir++)
4585 for (int id = 0; id < ctl->nd; id++)
4586 if (isfinite(obs->rad[id][ir])) {
4587 if (y != NULL)
4588 gsl_vector_set(y, m, obs->rad[id][ir]);
4589 if (ida != NULL)
4590 ida[m] = id;
4591 if (ira != NULL)
4592 ira[m] = ir;
4593 m++;
4594 }
4595
4596 return m;
4597}
4598
4599/*****************************************************************************/
4600
4602 ret_t *ret,
4603 ctl_t *ctl,
4604 tbl_t *tbl,
4605 obs_t *obs_meas,
4606 obs_t *obs_i,
4607 atm_t *atm_apr,
4608 atm_t *atm_i,
4609 double *chisq) {
4610
4611 static int ipa[N], iqa[N];
4612
4613 double disq = 0, lmpar = 0.001;
4614
4615 /* ------------------------------------------------------------
4616 Initialize...
4617 ------------------------------------------------------------ */
4618
4619 /* Get sizes... */
4620 const size_t m = obs2y(ctl, obs_meas, NULL, NULL, NULL);
4621 const size_t n = atm2x(ctl, atm_apr, NULL, iqa, ipa);
4622 if (m == 0 || n == 0) {
4623 WARN("Check problem definition (m = 0 or n = 0)!");
4624 *chisq = GSL_NAN;
4625 return;
4626 }
4627
4628 /* Allocate... */
4629 gsl_matrix *a = gsl_matrix_alloc(n, n);
4630 gsl_matrix *cov = gsl_matrix_alloc(n, n);
4631 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
4632 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
4633
4634 gsl_vector *b = gsl_vector_alloc(n);
4635 gsl_vector *dx = gsl_vector_alloc(n);
4636 gsl_vector *dy = gsl_vector_alloc(m);
4637 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
4638 gsl_vector *sig_formod = gsl_vector_alloc(m);
4639 gsl_vector *sig_noise = gsl_vector_alloc(m);
4640 gsl_vector *x_a = gsl_vector_alloc(n);
4641 gsl_vector *x_i = gsl_vector_alloc(n);
4642 gsl_vector *x_step = gsl_vector_alloc(n);
4643 gsl_vector *y_aux = gsl_vector_alloc(m);
4644 gsl_vector *y_i = gsl_vector_alloc(m);
4645 gsl_vector *y_m = gsl_vector_alloc(m);
4646
4647 /* Set initial state... */
4648 copy_atm(ctl, atm_i, atm_apr, 0);
4649 copy_obs(ctl, obs_i, obs_meas, 0);
4650 formod(ctl, tbl, atm_i, obs_i);
4651
4652 /* Set state vectors and observation vectors... */
4653 atm2x(ctl, atm_apr, x_a, NULL, NULL);
4654 atm2x(ctl, atm_i, x_i, NULL, NULL);
4655 obs2y(ctl, obs_meas, y_m, NULL, NULL);
4656 obs2y(ctl, obs_i, y_i, NULL, NULL);
4657
4658 /* Set inverse a priori covariance S_a^-1... */
4659 set_cov_apr(ret, ctl, atm_apr, iqa, ipa, s_a_inv);
4660 write_matrix(ret->dir, "matrix_cov_apr.tab", ctl, s_a_inv,
4661 atm_i, obs_i, "x", "x", "r");
4662 matrix_invert(s_a_inv);
4663
4664 /* Get measurement errors... */
4665 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
4666
4667 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4668 gsl_vector_memcpy(dx, x_i);
4669 gsl_vector_sub(dx, x_a);
4670 gsl_vector_memcpy(dy, y_m);
4671 gsl_vector_sub(dy, y_i);
4672
4673 /* Compute cost function... */
4674 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4675
4676 /* Write info... */
4677 LOG(2, "it= %d / chi^2/m= %g", 0, *chisq);
4678
4679 /* Compute initial kernel... */
4680 kernel(ctl, tbl, atm_i, obs_i, k_i);
4681
4682 /* ------------------------------------------------------------
4683 Levenberg-Marquardt minimization...
4684 ------------------------------------------------------------ */
4685
4686 /* Outer loop... */
4687 for (int it = 1; it <= ret->conv_itmax; it++) {
4688
4689 /* Store current cost function value... */
4690 double chisq_old = *chisq;
4691
4692 /* Compute kernel matrix K_i... */
4693 if (it > 1 && it % ret->kernel_recomp == 0)
4694 kernel(ctl, tbl, atm_i, obs_i, k_i);
4695
4696 /* Compute K_i^T * S_eps^{-1} * K_i ... */
4697 if (it == 1 || it % ret->kernel_recomp == 0)
4698 matrix_product(k_i, sig_eps_inv, 1, cov);
4699
4700 /* Determine b = K_i^T * S_eps^{-1} * dy - S_a^{-1} * dx ... */
4701 for (size_t i = 0; i < m; i++)
4702 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
4703 * POW2(gsl_vector_get(sig_eps_inv, i)));
4704 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
4705 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
4706
4707 /* Inner loop... */
4708 for (int it2 = 0; it2 < 20; it2++) {
4709
4710 /* Compute A = (1 + lmpar) * S_a^{-1} + K_i^T * S_eps^{-1} * K_i ... */
4711 gsl_matrix_memcpy(a, s_a_inv);
4712 gsl_matrix_scale(a, 1 + lmpar);
4713 gsl_matrix_add(a, cov);
4714
4715 /* Solve A * x_step = b by means of Cholesky decomposition... */
4716 gsl_linalg_cholesky_decomp(a);
4717 gsl_linalg_cholesky_solve(a, b, x_step);
4718
4719 /* Update atmospheric state... */
4720 gsl_vector_add(x_i, x_step);
4721 copy_atm(ctl, atm_i, atm_apr, 0);
4722 copy_obs(ctl, obs_i, obs_meas, 0);
4723 x2atm(ctl, x_i, atm_i);
4724
4725 /* Check atmospheric state... */
4726 for (int ip = 0; ip < atm_i->np; ip++) {
4727 atm_i->p[ip] = MIN(MAX(atm_i->p[ip], 5e-7), 5e4);
4728 atm_i->t[ip] = MIN(MAX(atm_i->t[ip], 100), 400);
4729 for (int ig = 0; ig < ctl->ng; ig++)
4730 atm_i->q[ig][ip] = MIN(MAX(atm_i->q[ig][ip], 0), 1);
4731 for (int iw = 0; iw < ctl->nw; iw++)
4732 atm_i->k[iw][ip] = MAX(atm_i->k[iw][ip], 0);
4733 }
4734 atm_i->clz = MAX(atm_i->clz, 0);
4735 atm_i->cldz = MAX(atm_i->cldz, 0.1);
4736 for (int icl = 0; icl < ctl->ncl; icl++)
4737 atm_i->clk[icl] = MAX(atm_i->clk[icl], 0);
4738 atm_i->sft = MIN(MAX(atm_i->sft, 100), 400);
4739 for (int isf = 0; isf < ctl->nsf; isf++)
4740 atm_i->sfeps[isf] = MIN(MAX(atm_i->sfeps[isf], 0), 1);
4741
4742 /* Forward calculation... */
4743 formod(ctl, tbl, atm_i, obs_i);
4744 obs2y(ctl, obs_i, y_i, NULL, NULL);
4745
4746 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4747 gsl_vector_memcpy(dx, x_i);
4748 gsl_vector_sub(dx, x_a);
4749 gsl_vector_memcpy(dy, y_m);
4750 gsl_vector_sub(dy, y_i);
4751
4752 /* Compute cost function... */
4753 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4754
4755 /* Modify Levenberg-Marquardt parameter... */
4756 if (*chisq > chisq_old) {
4757 lmpar *= 10;
4758 gsl_vector_sub(x_i, x_step);
4759 } else {
4760 lmpar /= 10;
4761 break;
4762 }
4763 }
4764
4765 /* Write info... */
4766 LOG(2, "it= %d / chi^2/m= %g", it, *chisq);
4767
4768 /* Get normalized step size in state space... */
4769 gsl_blas_ddot(x_step, b, &disq);
4770 disq /= (double) n;
4771
4772 /* Convergence test... */
4773 if ((it == 1 || it % ret->kernel_recomp == 0) && disq < ret->conv_dmin)
4774 break;
4775 }
4776
4777 /* ------------------------------------------------------------
4778 Analysis of retrieval results...
4779 ------------------------------------------------------------ */
4780
4781 /* Check if error analysis is requested... */
4782 if (ret->err_ana) {
4783
4784 /* Store results... */
4785 write_atm(ret->dir, "atm_final.tab", ctl, atm_i);
4786 write_obs(ret->dir, "obs_final.tab", ctl, obs_i);
4787 write_matrix(ret->dir, "matrix_kernel.tab", ctl, k_i,
4788 atm_i, obs_i, "y", "x", "r");
4789
4790 /* Allocate... */
4791 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
4792 gsl_matrix *corr = gsl_matrix_alloc(n, n);
4793 gsl_matrix *gain = gsl_matrix_alloc(n, m);
4794
4795 /* Compute inverse retrieval covariance...
4796 cov^{-1} = S_a^{-1} + K_i^T * S_eps^{-1} * K_i */
4797 matrix_product(k_i, sig_eps_inv, 1, cov);
4798 gsl_matrix_add(cov, s_a_inv);
4799
4800 /* Compute retrieval covariance... */
4801 matrix_invert(cov);
4802 write_matrix(ret->dir, "matrix_cov_ret.tab", ctl, cov,
4803 atm_i, obs_i, "x", "x", "r");
4804 write_stddev("total", ret, ctl, atm_i, cov);
4805
4806 /* Compute correlation matrix... */
4807 for (size_t i = 0; i < n; i++)
4808 for (size_t j = 0; j < n; j++)
4809 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
4810 / sqrt(gsl_matrix_get(cov, i, i))
4811 / sqrt(gsl_matrix_get(cov, j, j)));
4812 write_matrix(ret->dir, "matrix_corr.tab", ctl, corr,
4813 atm_i, obs_i, "x", "x", "r");
4814
4815 /* Compute gain matrix...
4816 G = cov * K^T * S_eps^{-1} */
4817 for (size_t i = 0; i < n; i++)
4818 for (size_t j = 0; j < m; j++)
4819 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
4820 * POW2(gsl_vector_get(sig_eps_inv, j)));
4821 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
4822 write_matrix(ret->dir, "matrix_gain.tab", ctl, gain,
4823 atm_i, obs_i, "x", "y", "c");
4824
4825 /* Compute retrieval error due to noise... */
4826 matrix_product(gain, sig_noise, 2, a);
4827 write_stddev("noise", ret, ctl, atm_i, a);
4828
4829 /* Compute retrieval error due to forward model errors... */
4830 matrix_product(gain, sig_formod, 2, a);
4831 write_stddev("formod", ret, ctl, atm_i, a);
4832
4833 /* Compute averaging kernel matrix
4834 A = G * K ... */
4835 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
4836 write_matrix(ret->dir, "matrix_avk.tab", ctl, a,
4837 atm_i, obs_i, "x", "x", "r");
4838
4839 /* Analyze averaging kernel matrix... */
4840 analyze_avk(ret, ctl, atm_i, iqa, ipa, a);
4841
4842 /* Free... */
4843 gsl_matrix_free(auxnm);
4844 gsl_matrix_free(corr);
4845 gsl_matrix_free(gain);
4846 }
4847
4848 /* ------------------------------------------------------------
4849 Finalize...
4850 ------------------------------------------------------------ */
4851
4852 gsl_matrix_free(a);
4853 gsl_matrix_free(cov);
4854 gsl_matrix_free(k_i);
4855 gsl_matrix_free(s_a_inv);
4856
4857 gsl_vector_free(b);
4858 gsl_vector_free(dx);
4859 gsl_vector_free(dy);
4860 gsl_vector_free(sig_eps_inv);
4861 gsl_vector_free(sig_formod);
4862 gsl_vector_free(sig_noise);
4863 gsl_vector_free(x_a);
4864 gsl_vector_free(x_i);
4865 gsl_vector_free(x_step);
4866 gsl_vector_free(y_aux);
4867 gsl_vector_free(y_i);
4868 gsl_vector_free(y_m);
4869}
4870
4871/*****************************************************************************/
4872
4874 const ctl_t *ctl,
4875 const atm_t *atm,
4876 obs_t *obs,
4877 los_t *los,
4878 const int ir) {
4879
4880 const double h = 0.02, zrefrac = 60;
4881
4882 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4883 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4884
4885 int stop = 0;
4886
4887 /* Initialize... */
4888 los->np = 0;
4889 los->sft = -999;
4890 obs->tpz[ir] = obs->vpz[ir];
4891 obs->tplon[ir] = obs->vplon[ir];
4892 obs->tplat[ir] = obs->vplat[ir];
4893
4894 /* Get altitude range of atmospheric data... */
4895 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4896
4897 /* Ensure that altitude grid includes the local geometric surface... */
4898 if (zmin > 1e-3 || zmin < -1e-3)
4899 ERRMSG("Atmospheric profiles must include surface level (z = 0 km)!");
4900
4901 /* Check observer altitude... */
4902 if (obs->obsz[ir] < zmin)
4903 ERRMSG("Observer below surface!");
4904
4905 /* Check view point altitude... */
4906 if (obs->vpz[ir] > zmax)
4907 return;
4908
4909 /* Determine Cartesian coordinates for observer and view point... */
4910 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
4911 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
4912
4913 /* Determine initial tangent vector... */
4914 for (int i = 0; i < 3; i++)
4915 ex0[i] = xvp[i] - xobs[i];
4916 norm = NORM(ex0);
4917 for (int i = 0; i < 3; i++)
4918 ex0[i] /= norm;
4919
4920 /* Observer within atmosphere... */
4921 for (int i = 0; i < 3; i++)
4922 x[i] = xobs[i];
4923
4924 /* Observer above atmosphere (search entry point)... */
4925 if (obs->obsz[ir] > zmax) {
4926 double dmax = norm, dmin = 0;
4927 while (fabs(dmin - dmax) > 0.001) {
4928 const double d = (dmax + dmin) / 2;
4929 for (int i = 0; i < 3; i++)
4930 x[i] = xobs[i] + d * ex0[i];
4931 cart2geo(x, &z, &lon, &lat);
4932 if (z <= zmax && z > zmax - 0.001)
4933 break;
4934 if (z < zmax - 0.0005)
4935 dmax = d;
4936 else
4937 dmin = d;
4938 }
4939 }
4940
4941 /* Ray-tracing... */
4942 while (1) {
4943
4944 /* Set step length... */
4945 double ds = ctl->rayds;
4946 if (ctl->raydz > 0) {
4947 norm = NORM(x);
4948 for (int i = 0; i < 3; i++)
4949 xh[i] = x[i] / norm;
4950 const double cosa = fabs(DOTP(ex0, xh));
4951 if (cosa != 0)
4952 ds = MIN(ctl->rayds, ctl->raydz / cosa);
4953 }
4954
4955 /* Determine geolocation... */
4956 cart2geo(x, &z, &lon, &lat);
4957
4958 /* Check if LOS hits the ground or has left atmosphere... */
4959 if (z < zmin || z > zmax) {
4960 stop = (z < zmin ? 2 : 1);
4961 const double frac =
4962 ((z <
4963 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
4964 1]);
4965 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
4966 los->lat[los->np - 1], xh);
4967 for (int i = 0; i < 3; i++)
4968 x[i] = xh[i] + frac * (x[i] - xh[i]);
4969 cart2geo(x, &z, &lon, &lat);
4970 los->ds[los->np - 1] = ds * frac;
4971 ds = 0;
4972 }
4973
4974 /* Interpolate atmospheric data... */
4975 intpol_atm(ctl, atm, z, &p, &t, q, k);
4976
4977 /* Save data... */
4978 los->lon[los->np] = lon;
4979 los->lat[los->np] = lat;
4980 los->z[los->np] = z;
4981 los->p[los->np] = p;
4982 los->t[los->np] = t;
4983 for (int ig = 0; ig < ctl->ng; ig++)
4984 los->q[los->np][ig] = q[ig];
4985 for (int id = 0; id < ctl->nd; id++)
4986 los->k[los->np][id] = k[ctl->window[id]];
4987 los->ds[los->np] = ds;
4988
4989 /* Add cloud extinction... */
4990 if (ctl->ncl > 0 && atm->cldz > 0) {
4991 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
4992 for (int id = 0; id < ctl->nd; id++) {
4993 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
4994 los->k[los->np][id]
4995 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
4996 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
4997 }
4998 }
4999
5000 /* Increment and check number of LOS points... */
5001 if ((++los->np) > NLOS)
5002 ERRMSG("Too many LOS points!");
5003
5004 /* Check stop flag... */
5005 if (stop) {
5006
5007 /* Set surface temperature... */
5008 if (ctl->nsf > 0 && atm->sft > 0)
5009 t = atm->sft;
5010 los->sft = (stop == 2 ? t : -999);
5011
5012 /* Set surface emissivity... */
5013 for (int id = 0; id < ctl->nd; id++) {
5014 los->sfeps[id] = 1.0;
5015 if (ctl->nsf > 0) {
5016 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
5017 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
5018 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
5019 ctl->nu[id]);
5020 }
5021 }
5022
5023 /* Leave raytracer... */
5024 break;
5025 }
5026
5027 /* Determine refractivity... */
5028 if (ctl->refrac && z <= zrefrac)
5029 n = 1 + REFRAC(p, t);
5030 else
5031 n = 1;
5032
5033 /* Construct new tangent vector (first term)... */
5034 for (int i = 0; i < 3; i++)
5035 ex1[i] = ex0[i] * n;
5036
5037 /* Compute gradient of refractivity... */
5038 if (ctl->refrac && z <= zrefrac) {
5039 for (int i = 0; i < 3; i++)
5040 xh[i] = x[i] + 0.5 * ds * ex0[i];
5041 cart2geo(xh, &z, &lon, &lat);
5042 intpol_atm(ctl, atm, z, &p, &t, q, k);
5043 n = REFRAC(p, t);
5044 for (int i = 0; i < 3; i++) {
5045 xh[i] += h;
5046 cart2geo(xh, &z, &lon, &lat);
5047 intpol_atm(ctl, atm, z, &p, &t, q, k);
5048 ng[i] = (REFRAC(p, t) - n) / h;
5049 xh[i] -= h;
5050 }
5051 } else
5052 for (int i = 0; i < 3; i++)
5053 ng[i] = 0;
5054
5055 /* Construct new tangent vector (second term)... */
5056 for (int i = 0; i < 3; i++)
5057 ex1[i] += ds * ng[i];
5058
5059 /* Normalize new tangent vector... */
5060 norm = NORM(ex1);
5061 for (int i = 0; i < 3; i++)
5062 ex1[i] /= norm;
5063
5064 /* Determine next point of LOS... */
5065 for (int i = 0; i < 3; i++)
5066 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
5067
5068 /* Copy tangent vector... */
5069 for (int i = 0; i < 3; i++)
5070 ex0[i] = ex1[i];
5071 }
5072
5073 /* Get tangent point (to be done before changing segment lengths!)... */
5074 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
5075
5076 /* Change segment lengths according to trapezoid rule... */
5077 for (int ip = los->np - 1; ip >= 1; ip--)
5078 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
5079 los->ds[0] *= 0.5;
5080
5081 /* Compute column density... */
5082 for (int ip = 0; ip < los->np; ip++)
5083 for (int ig = 0; ig < ctl->ng; ig++)
5084 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
5085 / (KB * los->t[ip]) * los->ds[ip];
5086
5087 /* Compute Curtis-Godson means... */
5088 for (int ig = 0; ig < ctl->ng; ig++) {
5089 los->cgu[0][ig] = los->u[0][ig];
5090 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
5091 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
5092 }
5093 for (int ip = 1; ip < los->np; ip++)
5094 for (int ig = 0; ig < ctl->ng; ig++) {
5095 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
5096 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
5097 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
5098 }
5099 for (int ip = 0; ip < los->np; ip++)
5100 for (int ig = 0; ig < ctl->ng; ig++)
5101 if (los->cgu[ip][ig] != 0) {
5102 los->cgp[ip][ig] /= los->cgu[ip][ig];
5103 los->cgt[ip][ig] /= los->cgu[ip][ig];
5104 }
5105}
5106
5107/*****************************************************************************/
5108
5110 const char *dirname,
5111 const char *filename,
5112 const ctl_t *ctl,
5113 atm_t *atm) {
5114
5115 char file[LEN];
5116
5117 /* Init... */
5118 atm->np = 0;
5119
5120 /* Set filename... */
5121 if (dirname != NULL)
5122 sprintf(file, "%s/%s", dirname, filename);
5123 else
5124 sprintf(file, "%s", filename);
5125
5126 /* Write info... */
5127 LOG(1, "Read atmospheric data: %s", file);
5128
5129 /* Read ASCII data... */
5130 if (ctl->atmfmt == 1)
5131 read_atm_asc(file, ctl, atm);
5132
5133 /* Read binary data... */
5134 else if (ctl->atmfmt == 2)
5135 read_atm_bin(file, ctl, atm);
5136
5137 /* Read netCDF data... */
5138 else if (ctl->atmfmt == 3)
5139 read_atm_nc(file, ctl, atm, 0);
5140
5141 /* Error... */
5142 else
5143 ERRMSG("Unknown atmospheric data file format, check ATMFMT!");
5144
5145 /* Check number of points... */
5146 if (atm->np < 1)
5147 ERRMSG("Could not read any data!");
5148
5149 /* Write info... */
5150 double mini, maxi;
5151 LOG(2, "Number of data points: %d", atm->np);
5152 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5153 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5154 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5155 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5156 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5157 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5158 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5159 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5160 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5161 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5162 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5163 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5164 for (int ig = 0; ig < ctl->ng; ig++) {
5165 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5166 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5167 }
5168 for (int iw = 0; iw < ctl->nw; iw++) {
5169 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5170 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5171 }
5172 if (ctl->ncl > 0 && atm->np == 0) {
5173 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5174 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5175 } else
5176 LOG(2, "Cloud layer: none");
5177 if (ctl->nsf > 0 && atm->np == 0) {
5178 LOG(2,
5179 "Surface: T_s = %g K | eps= %g ... %g",
5180 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5181 } else
5182 LOG(2, "Surface: none");
5183}
5184
5185/*****************************************************************************/
5186
5188 const char *filename,
5189 const ctl_t *ctl,
5190 atm_t *atm) {
5191
5192 char line[LEN], *tok;
5193
5194 /* Init... */
5195 atm->np = 0;
5196
5197 /* Open file... */
5198 FILE *in;
5199 if (!(in = fopen(filename, "r")))
5200 ERRMSG("Cannot open file!");
5201
5202 /* Read line... */
5203 while (fgets(line, LEN, in)) {
5204
5205 /* Read data... */
5206 TOK(line, tok, "%lg", atm->time[atm->np]);
5207 TOK(NULL, tok, "%lg", atm->z[atm->np]);
5208 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
5209 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
5210 TOK(NULL, tok, "%lg", atm->p[atm->np]);
5211 TOK(NULL, tok, "%lg", atm->t[atm->np]);
5212 for (int ig = 0; ig < ctl->ng; ig++)
5213 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
5214 for (int iw = 0; iw < ctl->nw; iw++)
5215 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
5216 if (ctl->ncl > 0 && atm->np == 0) {
5217 TOK(NULL, tok, "%lg", atm->clz);
5218 TOK(NULL, tok, "%lg", atm->cldz);
5219 for (int icl = 0; icl < ctl->ncl; icl++)
5220 TOK(NULL, tok, "%lg", atm->clk[icl]);
5221 }
5222 if (ctl->nsf > 0 && atm->np == 0) {
5223 TOK(NULL, tok, "%lg", atm->sft);
5224 for (int isf = 0; isf < ctl->nsf; isf++)
5225 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
5226 }
5227
5228 /* Increment data point counter... */
5229 if ((++atm->np) > NP)
5230 ERRMSG("Too many data points!");
5231 }
5232
5233 /* Close file... */
5234 fclose(in);
5235}
5236
5237/*****************************************************************************/
5238
5240 const char *filename,
5241 const ctl_t *ctl,
5242 atm_t *atm) {
5243
5244 /* Open file... */
5245 FILE *in;
5246 if (!(in = fopen(filename, "r")))
5247 ERRMSG("Cannot open file!");
5248
5249 /* Read header... */
5250 char magic[4];
5251 FREAD(magic, char,
5252 4,
5253 in);
5254 if (memcmp(magic, "ATM1", 4) != 0)
5255 ERRMSG("Invalid magic string!");
5256
5257 int ng, nw, ncl, nsf;
5258 FREAD(&ng, int,
5259 1,
5260 in);
5261 FREAD(&nw, int,
5262 1,
5263 in);
5264 FREAD(&ncl, int,
5265 1,
5266 in);
5267 FREAD(&nsf, int,
5268 1,
5269 in);
5270 if (ng != ctl->ng || nw != ctl->nw || ncl != ctl->ncl || nsf != ctl->nsf)
5271 ERRMSG("Error reading file header!");
5272
5273 /* Read data... */
5274 size_t np;
5275 FREAD(&np, size_t,
5276 1,
5277 in);
5278 atm->np = (int) np;
5279 if (atm->np > NP)
5280 ERRMSG("Too many data points!");
5281 FREAD(atm->time, double,
5282 np,
5283 in);
5284 FREAD(atm->z, double,
5285 np,
5286 in);
5287 FREAD(atm->lon, double,
5288 np,
5289 in);
5290 FREAD(atm->lat, double,
5291 np,
5292 in);
5293 FREAD(atm->p, double,
5294 np,
5295 in);
5296 FREAD(atm->t, double,
5297 np,
5298 in);
5299 for (int ig = 0; ig < ctl->ng; ig++)
5300 FREAD(atm->q[ig], double,
5301 np,
5302 in);
5303 for (int iw = 0; iw < ctl->nw; iw++)
5304 FREAD(atm->k[iw], double,
5305 np,
5306 in);
5307 if (ctl->ncl > 0) {
5308 FREAD(&atm->clz, double,
5309 1,
5310 in);
5311 FREAD(&atm->cldz, double,
5312 1,
5313 in);
5314 FREAD(atm->clk, double,
5315 (size_t) ctl->ncl,
5316 in);
5317 }
5318 if (ctl->nsf) {
5319 FREAD(&atm->sft, double,
5320 1,
5321 in);
5322 FREAD(atm->sfeps, double,
5323 (size_t) ctl->nsf,
5324 in);
5325 }
5326
5327 /* Close file... */
5328 fclose(in);
5329}
5330
5331/*****************************************************************************/
5332
5334 const char *filename,
5335 const ctl_t *ctl,
5336 atm_t *atm,
5337 int profile) {
5338
5339 int ncid, var_time, var_z, var_lon, var_lat, var_p, var_t, var_q[NG],
5340 var_k[NW], var_cz = -1, var_cdz = -1, var_ck[NCL], var_sft =
5341 -1, var_sfe[NSF], var_nlev = -1;
5342
5343 char varname[LEN];
5344
5345 /* Open file... */
5346 NC(nc_open(filename, NC_NOWRITE, &ncid));
5347
5348 /* Set hyperslab... */
5349 size_t start[2] = { (size_t) profile, 0 };
5350 size_t count[2] = { 1, (size_t) atm->np };
5351
5352 /* Determine atm->np... */
5353 NC(nc_inq_varid(ncid, "nlev", &var_nlev));
5354 NC(nc_get_vara_int(ncid, var_nlev, start, count, &atm->np));
5355 if (atm->np < 1 || atm->np > NP)
5356 ERRMSG("Number of level out of range!");
5357
5358 /* Inquire core variables... */
5359 NC(nc_inq_varid(ncid, "time", &var_time));
5360 NC(nc_inq_varid(ncid, "z", &var_z));
5361 NC(nc_inq_varid(ncid, "lon", &var_lon));
5362 NC(nc_inq_varid(ncid, "lat", &var_lat));
5363 NC(nc_inq_varid(ncid, "p", &var_p));
5364 NC(nc_inq_varid(ncid, "t", &var_t));
5365
5366 /* Inquire emiters... */
5367 for (int ig = 0; ig < ctl->ng; ig++)
5368 NC(nc_inq_varid(ncid, ctl->emitter[ig], &var_q[ig]));
5369
5370 /* Inquire extinctions... */
5371 for (int iw = 0; iw < ctl->nw; iw++) {
5372 sprintf(varname, "ext_win_%d", iw);
5373 NC(nc_inq_varid(ncid, varname, &var_k[iw]));
5374 }
5375
5376 /* Inquire cloud variables... */
5377 if (ctl->ncl > 0) {
5378 NC(nc_inq_varid(ncid, "cld_z", &var_cz));
5379 NC(nc_inq_varid(ncid, "cld_dz", &var_cdz));
5380 for (int icl = 0; icl < ctl->ncl; icl++) {
5381 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
5382 NC(nc_inq_varid(ncid, varname, &var_ck[icl]));
5383 }
5384 }
5385
5386 /* Inquire surface variables... */
5387 if (ctl->nsf > 0) {
5388 NC(nc_inq_varid(ncid, "srf_t", &var_sft));
5389 for (int isf = 0; isf < ctl->nsf; isf++) {
5390 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
5391 NC(nc_inq_varid(ncid, varname, &var_sfe[isf]));
5392 }
5393 }
5394
5395 /* Read core variables... */
5396 NC(nc_get_vara_double(ncid, var_time, start, count, atm->time));
5397 NC(nc_get_vara_double(ncid, var_z, start, count, atm->z));
5398 NC(nc_get_vara_double(ncid, var_lon, start, count, atm->lon));
5399 NC(nc_get_vara_double(ncid, var_lat, start, count, atm->lat));
5400 NC(nc_get_vara_double(ncid, var_p, start, count, atm->p));
5401 NC(nc_get_vara_double(ncid, var_t, start, count, atm->t));
5402
5403 /* Read emitters... */
5404 for (int ig = 0; ig < ctl->ng; ig++)
5405 NC(nc_get_vara_double(ncid, var_q[ig], start, count, atm->q[ig]));
5406
5407 /* Read extinctions... */
5408 for (int iw = 0; iw < ctl->nw; iw++)
5409 NC(nc_get_vara_double(ncid, var_k[iw], start, count, atm->k[iw]));
5410
5411 /* Read cloud variables... */
5412 if (ctl->ncl > 0) {
5413 NC(nc_get_vara_double(ncid, var_cz, start, count, &atm->clz));
5414 NC(nc_get_vara_double(ncid, var_cdz, start, count, &atm->cldz));
5415 for (int icl = 0; icl < ctl->ncl; icl++)
5416 NC(nc_get_vara_double(ncid, var_ck[icl], start, count, &atm->clk[icl]));
5417 }
5418
5419 /* Read surface variables... */
5420 if (ctl->nsf > 0) {
5421 NC(nc_get_vara_double(ncid, var_sft, start, count, &atm->sft));
5422
5423 for (int isf = 0; isf < ctl->nsf; isf++)
5424 NC(nc_get_vara_double
5425 (ncid, var_sfe[isf], start, count, &atm->sfeps[isf]));
5426 }
5427
5428 /* Close file... */
5429 NC(nc_close(ncid));
5430}
5431
5432/*****************************************************************************/
5433
5435 int argc,
5436 char *argv[],
5437 ctl_t *ctl) {
5438
5439 /* Write info... */
5440 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
5441 "(executable: %s | version: %s | compiled: %s, %s)\n",
5442 argv[0], VERSION, __DATE__, __TIME__);
5443
5444 /* Emitters... */
5445 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
5446 if (ctl->ng < 0 || ctl->ng > NG)
5447 ERRMSG("Set 0 <= NG <= MAX!");
5448 for (int ig = 0; ig < ctl->ng; ig++)
5449 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
5450 ctl->ig_co2 = find_emitter(ctl, "CO2");
5451 ctl->ig_h2o = find_emitter(ctl, "H2O");
5452 ctl->ig_n2 = find_emitter(ctl, "N2");
5453 ctl->ig_o2 = find_emitter(ctl, "O2");
5454
5455 /* Radiance channels... */
5456 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
5457 if (ctl->nd < 0 || ctl->nd > ND)
5458 ERRMSG("Set 0 <= ND <= MAX!");
5459 for (int id = 0; id < ctl->nd; id++)
5460 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
5461
5462 /* Spectral windows... */
5463 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
5464 if (ctl->nw < 0 || ctl->nw > NW)
5465 ERRMSG("Set 0 <= NW <= MAX!");
5466 for (int id = 0; id < ctl->nd; id++)
5467 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
5468
5469 /* Cloud data... */
5470 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
5471 if (ctl->ncl < 0 || ctl->ncl > NCL)
5472 ERRMSG("Set 0 <= NCL <= MAX!");
5473 if (ctl->ncl == 1)
5474 ERRMSG("Set NCL > 1!");
5475 for (int icl = 0; icl < ctl->ncl; icl++)
5476 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
5477
5478 /* Surface data... */
5479 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
5480 if (ctl->nsf < 0 || ctl->nsf > NSF)
5481 ERRMSG("Set 0 <= NSF <= MAX!");
5482 if (ctl->nsf == 1)
5483 ERRMSG("Set NSF > 1!");
5484 for (int isf = 0; isf < ctl->nsf; isf++)
5485 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
5486 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
5487 if (ctl->sftype < 0 || ctl->sftype > 3)
5488 ERRMSG("Set 0 <= SFTYPE <= 3!");
5489 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
5490
5491 /* Emissivity look-up tables... */
5492 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
5493 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
5494
5495 /* File formats... */
5496 ctl->atmfmt = (int) scan_ctl(argc, argv, "ATMFMT", -1, "1", NULL);
5497 ctl->obsfmt = (int) scan_ctl(argc, argv, "OBSFMT", -1, "1", NULL);
5498
5499 /* Hydrostatic equilibrium... */
5500 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
5501
5502 /* Continua... */
5503 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
5504 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
5505 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
5506 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
5507
5508 /* Ray-tracing... */
5509 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
5510 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
5511 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
5512
5513 /* Field of view... */
5514 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
5515 if (ctl->fov[0] != '-')
5516 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
5517
5518 /* Retrieval interface... */
5519 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
5520 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
5521 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
5522 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
5523 for (int ig = 0; ig < ctl->ng; ig++) {
5524 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
5525 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
5526 }
5527 for (int iw = 0; iw < ctl->nw; iw++) {
5528 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
5529 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
5530 }
5531 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
5532 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
5533 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
5534 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
5535 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
5536
5537 /* Output flags... */
5538 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
5539 ctl->write_matrix =
5540 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
5541
5542 /* External forward models... */
5543 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
5544 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
5545 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
5546 for (int ig = 0; ig < ctl->ng; ig++)
5547 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
5548}
5549
5550/*****************************************************************************/
5551
5553 const char *dirname,
5554 const char *filename,
5555 gsl_matrix *matrix) {
5556
5557 FILE *in;
5558
5559 char dum[LEN], file[LEN], line[LEN];
5560
5561 double value;
5562
5563 int i, j;
5564
5565 /* Set filename... */
5566 if (dirname != NULL)
5567 sprintf(file, "%s/%s", dirname, filename);
5568 else
5569 sprintf(file, "%s", filename);
5570
5571 /* Write info... */
5572 LOG(1, "Read matrix: %s", file);
5573
5574 /* Open file... */
5575 if (!(in = fopen(file, "r")))
5576 ERRMSG("Cannot open file!");
5577
5578 /* Read data... */
5579 gsl_matrix_set_zero(matrix);
5580 while (fgets(line, LEN, in))
5581 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
5582 &i, dum, dum, dum, dum, dum,
5583 &j, dum, dum, dum, dum, dum, &value) == 13)
5584 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
5585
5586 /* Close file... */
5587 fclose(in);
5588}
5589
5590/*****************************************************************************/
5591
5593 const char *dirname,
5594 const char *filename,
5595 const ctl_t *ctl,
5596 obs_t *obs) {
5597
5598 char file[LEN];
5599
5600 /* Set filename... */
5601 if (dirname != NULL)
5602 sprintf(file, "%s/%s", dirname, filename);
5603 else
5604 sprintf(file, "%s", filename);
5605
5606 /* Write info... */
5607 LOG(1, "Read observation data: %s", file);
5608
5609 /* Read ASCII data... */
5610 if (ctl->obsfmt == 1)
5611 read_obs_asc(file, ctl, obs);
5612
5613 /* Read binary data... */
5614 else if (ctl->obsfmt == 2)
5615 read_obs_bin(file, ctl, obs);
5616
5617 /* Read netCDF data... */
5618 else if (ctl->obsfmt == 3)
5619 read_obs_nc(file, ctl, obs, 0);
5620
5621 /* Error... */
5622 else
5623 ERRMSG("Unknown observation file format!");
5624
5625 /* Check number of points... */
5626 if (obs->nr < 1)
5627 ERRMSG("Could not read any data!");
5628
5629 /* Write info... */
5630 double mini, maxi;
5631 LOG(2, "Number of ray paths: %d", obs->nr);
5632 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5633 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5634 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5635 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5636 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5637 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5638 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5639 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5640 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5641 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5642 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5643 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5644 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5645 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5646 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5647 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5648 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5649 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5650 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5651 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5652 for (int id = 0; id < ctl->nd; id++) {
5653 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5654 if (ctl->write_bbt) {
5655 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5656 ctl->nu[id], mini, maxi);
5657 } else {
5658 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5659 ctl->nu[id], mini, maxi);
5660 }
5661 }
5662 for (int id = 0; id < ctl->nd; id++) {
5663 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5664 if (ctl->write_bbt) {
5665 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5666 ctl->nu[id], mini, maxi);
5667 }
5668 }
5669}
5670
5671/*****************************************************************************/
5672
5674 const char *filename,
5675 const ctl_t *ctl,
5676 obs_t *obs) {
5677
5678 char line[LEN], *tok;
5679
5680 /* Init... */
5681 obs->nr = 0;
5682
5683 /* Open file... */
5684 FILE *in;
5685 if (!(in = fopen(filename, "r")))
5686 ERRMSG("Cannot open file!");
5687
5688 /* Read line... */
5689 while (fgets(line, LEN, in)) {
5690
5691 /* Read data... */
5692 TOK(line, tok, "%lg", obs->time[obs->nr]);
5693 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5694 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5695 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5696 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5697 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5698 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5699 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5700 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5701 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5702 for (int id = 0; id < ctl->nd; id++)
5703 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5704 for (int id = 0; id < ctl->nd; id++)
5705 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5706
5707 /* Increment counter... */
5708 if ((++obs->nr) > NR)
5709 ERRMSG("Too many rays!");
5710 }
5711
5712 /* Close file... */
5713 fclose(in);
5714}
5715
5716/*****************************************************************************/
5717
5719 const char *filename,
5720 const ctl_t *ctl,
5721 obs_t *obs) {
5722
5723 /* Open file... */
5724 FILE *in;
5725 if (!(in = fopen(filename, "r")))
5726 ERRMSG("Cannot open file!");
5727
5728 /* Read header... */
5729 char magic[4];
5730 FREAD(magic, char,
5731 4,
5732 in);
5733 if (memcmp(magic, "OBS1", 4) != 0)
5734 ERRMSG("Invalid magic string!");
5735
5736 int nd;
5737 FREAD(&nd, int,
5738 1,
5739 in);
5740 if (nd != ctl->nd)
5741 ERRMSG("Error reading file header!");
5742
5743 /* Read data... */
5744 size_t nr;
5745 FREAD(&nr, size_t,
5746 1,
5747 in);
5748 obs->nr = (int) nr;
5749 if (obs->nr > NR)
5750 ERRMSG("Too many ray paths!");
5751 FREAD(obs->time, double,
5752 nr,
5753 in);
5754 FREAD(obs->obsz, double,
5755 nr,
5756 in);
5757 FREAD(obs->obslon, double,
5758 nr,
5759 in);
5760 FREAD(obs->obslat, double,
5761 nr,
5762 in);
5763 FREAD(obs->vpz, double,
5764 nr,
5765 in);
5766 FREAD(obs->vplon, double,
5767 nr,
5768 in);
5769 FREAD(obs->vplat, double,
5770 nr,
5771 in);
5772 FREAD(obs->tpz, double,
5773 nr,
5774 in);
5775 FREAD(obs->tplon, double,
5776 nr,
5777 in);
5778 FREAD(obs->tplat, double,
5779 nr,
5780 in);
5781 for (int id = 0; id < ctl->nd; id++)
5782 FREAD(obs->rad[id], double,
5783 nr,
5784 in);
5785 for (int id = 0; id < ctl->nd; id++)
5786 FREAD(obs->tau[id], double,
5787 nr,
5788 in);
5789
5790 /* Close file... */
5791 fclose(in);
5792}
5793
5794/*****************************************************************************/
5795
5797 const char *filename,
5798 const ctl_t *ctl,
5799 obs_t *obs,
5800 const int profile) {
5801
5802 int ncid, var_nray = -1, var_time = -1, var_obsz = -1, var_obslon =
5803 -1, var_obslat = -1, var_vpz = -1, var_vplon = -1, var_vplat =
5804 -1, var_tpz = -1, var_tplon = -1, var_tplat =
5805 -1, var_rad[ND], var_tau[ND];
5806
5807 char varname[LEN];
5808
5809 /* Open file... */
5810 NC(nc_open(filename, NC_NOWRITE, &ncid));
5811
5812 /* Hyperslab for variables (profile, ray)... */
5813 size_t start[2] = { (size_t) profile, 0 };
5814 size_t count[2] = { 1, (size_t) obs->nr };
5815
5816 /* Read nray(profile) -> obs->nr */
5817 NC(nc_inq_varid(ncid, "nray", &var_nray));
5818 NC(nc_get_vara_int(ncid, var_nray, start, count, &obs->nr));
5819 if (obs->nr < 1 || obs->nr > NR)
5820 ERRMSG("Number of ray paths out of range!");
5821
5822 /* Inquire geometry variables... */
5823 NC(nc_inq_varid(ncid, "time", &var_time));
5824 NC(nc_inq_varid(ncid, "obs_z", &var_obsz));
5825 NC(nc_inq_varid(ncid, "obs_lon", &var_obslon));
5826 NC(nc_inq_varid(ncid, "obs_lat", &var_obslat));
5827
5828 NC(nc_inq_varid(ncid, "vp_z", &var_vpz));
5829 NC(nc_inq_varid(ncid, "vp_lon", &var_vplon));
5830 NC(nc_inq_varid(ncid, "vp_lat", &var_vplat));
5831
5832 NC(nc_inq_varid(ncid, "tp_z", &var_tpz));
5833 NC(nc_inq_varid(ncid, "tp_lon", &var_tplon));
5834 NC(nc_inq_varid(ncid, "tp_lat", &var_tplat));
5835
5836 /* Inquire spectral variables per channel... */
5837 for (int id = 0; id < ctl->nd; id++) {
5838 sprintf(varname, "rad_%.4f", ctl->nu[id]);
5839 NC(nc_inq_varid(ncid, varname, &var_rad[id]));
5840
5841 sprintf(varname, "tau_%.4f", ctl->nu[id]);
5842 NC(nc_inq_varid(ncid, varname, &var_tau[id]));
5843 }
5844
5845 /* Read geometry... */
5846 NC(nc_get_vara_double(ncid, var_time, start, count, obs->time));
5847 NC(nc_get_vara_double(ncid, var_obsz, start, count, obs->obsz));
5848 NC(nc_get_vara_double(ncid, var_obslon, start, count, obs->obslon));
5849 NC(nc_get_vara_double(ncid, var_obslat, start, count, obs->obslat));
5850
5851 NC(nc_get_vara_double(ncid, var_vpz, start, count, obs->vpz));
5852 NC(nc_get_vara_double(ncid, var_vplon, start, count, obs->vplon));
5853 NC(nc_get_vara_double(ncid, var_vplat, start, count, obs->vplat));
5854
5855 NC(nc_get_vara_double(ncid, var_tpz, start, count, obs->tpz));
5856 NC(nc_get_vara_double(ncid, var_tplon, start, count, obs->tplon));
5857 NC(nc_get_vara_double(ncid, var_tplat, start, count, obs->tplat));
5858
5859 /* Read radiance and transmittance... */
5860 for (int id = 0; id < ctl->nd; id++) {
5861 NC(nc_get_vara_double(ncid, var_rad[id], start, count, obs->rad[id]));
5862 NC(nc_get_vara_double(ncid, var_tau[id], start, count, obs->tau[id]));
5863 }
5864
5865 /* Close file... */
5866 NC(nc_close(ncid));
5867}
5868
5869/*****************************************************************************/
5870
5872 const char *basename,
5873 const double z,
5874 const double *nu,
5875 const double *f,
5876 const int n) {
5877
5878 FILE *in;
5879
5880 char filename[LEN];
5881
5882 double filt, fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
5883
5884 int npts;
5885
5886 /* Allocate... */
5887 ALLOC(nurfm, double,
5888 RFMNPTS);
5889 ALLOC(rad, double,
5890 RFMNPTS);
5891
5892 /* Search RFM spectrum... */
5893 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
5894 if (!(in = fopen(filename, "r"))) {
5895 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
5896 if (!(in = fopen(filename, "r")))
5897 ERRMSG("Cannot find RFM data file!");
5898 }
5899 fclose(in);
5900
5901 /* Read RFM spectrum... */
5902 read_rfm_spec(filename, nurfm, rad, &npts);
5903
5904 /* Set wavenumbers... */
5905 nu2[0] = nu[0];
5906 nu2[n - 1] = nu[n - 1];
5907 for (int i = 1; i < n - 1; i++)
5908 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
5909
5910 /* Convolute... */
5911 for (int ipts = 0; ipts < npts; ipts++)
5912 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
5913 const int idx = locate_irr(nu2, n, nurfm[ipts]);
5914 filt = LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
5915 fsum += filt;
5916 radsum += filt * rad[ipts];
5917 }
5918
5919 /* Free... */
5920 free(nurfm);
5921 free(rad);
5922
5923 /* Return radiance... */
5924 return radsum / fsum;
5925}
5926
5927/*****************************************************************************/
5928
5930 int argc,
5931 char *argv[],
5932 const ctl_t *ctl,
5933 ret_t *ret) {
5934
5935 /* Iteration control... */
5936 ret->kernel_recomp =
5937 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
5938 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
5939 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
5940
5941 /* Error analysis... */
5942 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "0", NULL);
5943
5944 for (int id = 0; id < ctl->nd; id++)
5945 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
5946
5947 for (int id = 0; id < ctl->nd; id++)
5948 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
5949
5950 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
5951 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
5952 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
5953
5954 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
5955 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
5956 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
5957
5958 for (int ig = 0; ig < ctl->ng; ig++) {
5959 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
5960 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
5961 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
5962 }
5963
5964 for (int iw = 0; iw < ctl->nw; iw++) {
5965 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
5966 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
5967 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
5968 }
5969
5970 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
5971 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
5972 for (int icl = 0; icl < ctl->ncl; icl++)
5973 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
5974
5975 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
5976 for (int isf = 0; isf < ctl->nsf; isf++)
5977 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
5978}
5979
5980/*****************************************************************************/
5981
5983 const char *filename,
5984 double *nu,
5985 double *rad,
5986 int *npts) {
5987
5988 FILE *in;
5989
5990 char *line = NULL, *tok;
5991
5992 size_t line_buf_size = 0;
5993
5994 double dnu, nu0, nu1;
5995
5996 int ipts = 0;
5997
5998 /* Write info... */
5999 LOG(1, "Read RFM data: %s", filename);
6000
6001 /* Open file... */
6002 if (!(in = fopen(filename, "r")))
6003 ERRMSG("Cannot open file!");
6004
6005 /* Read header... */
6006 for (int i = 0; i < 4; i++)
6007 if (getline(&line, &line_buf_size, in) == -1)
6008 ERRMSG("Error while reading file header!");
6009 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
6010 ERRMSG("Invalid spectrum header format!");
6011
6012 /* Check number of spectral grid points... */
6013 if (*npts > RFMNPTS)
6014 ERRMSG("Too many spectral grid points!");
6015
6016 /* Read radiance data... */
6017 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
6018 tok = strtok(line, " \t\n");
6019 while (tok != NULL && ipts < *npts) {
6020 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
6021 ipts++;
6022 tok = strtok(NULL, " \t\n");
6023 }
6024 }
6025
6026 /* Check number of spectral grid points... */
6027 if (ipts != *npts)
6028 ERRMSG("Error while reading RFM data!");
6029
6030 /* Compute wavenumbers... */
6031 for (ipts = 0; ipts < *npts; ipts++)
6032 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
6033
6034 /* Close file... */
6035 fclose(in);
6036
6037 /* Free.. */
6038 free(line);
6039}
6040
6041/*****************************************************************************/
6042
6044 const char *filename,
6045 double *x,
6046 double *y,
6047 int *n) {
6048
6049 FILE *in;
6050
6051 char line[LEN];
6052
6053 /* Write info... */
6054 LOG(1, "Read shape function: %s", filename);
6055
6056 /* Open file... */
6057 if (!(in = fopen(filename, "r")))
6058 ERRMSG("Cannot open file!");
6059
6060 /* Read data... */
6061 *n = 0;
6062 while (fgets(line, LEN, in))
6063 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
6064 if ((++(*n)) > NSHAPE)
6065 ERRMSG("Too many data points!");
6066
6067 /* Close file... */
6068 fclose(in);
6069
6070 /* Check number of data points... */
6071 if (*n < 2)
6072 ERRMSG("Could not read any data!");
6073
6074 /* Write info... */
6075 double mini, maxi;
6076 LOG(2, "Number of data points: %d", *n);
6077 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
6078 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
6079 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
6080 LOG(2, "Range of y values: %g ... %g", mini, maxi);
6081}
6082
6083/*****************************************************************************/
6084
6086 const ctl_t *ctl) {
6087
6088 /* Allocate... */
6089 tbl_t *tbl;
6090 ALLOC(tbl, tbl_t, 1);
6091
6092 /* Loop over trace gases and channels... */
6093 for (int id = 0; id < ctl->nd; id++)
6094 for (int ig = 0; ig < ctl->ng; ig++) {
6095
6096 /* Initialize... */
6097 tbl->np[id][ig] = -1;
6098
6099 /* Read ASCII look-up tables... */
6100 if (ctl->tblfmt == 1)
6101 read_tbl_asc(ctl, tbl, id, ig);
6102
6103 /* Read binary look-up tables... */
6104 else if (ctl->tblfmt == 2)
6105 read_tbl_bin(ctl, tbl, id, ig);
6106
6107 /* Read per-gas look-up tables... */
6108 else if (ctl->tblfmt == 3)
6109 read_tbl_gas(ctl, tbl, id, ig);
6110
6111 /* Error message... */
6112 else
6113 ERRMSG("Unknown look-up table format!");
6114
6115 /* Write info... */
6116 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6117 LOG(2,
6118 "p[%2d]= %.5e hPa | T[0:%2d]= %.2f ... %.2f K | u[0:%3d]= %.5e ... %.5e molec/cm^2 | eps[0:%3d]= %.5e ... %.5e",
6119 ip, tbl->p[id][ig][ip], tbl->nt[id][ig][ip] - 1,
6120 tbl->t[id][ig][ip][0],
6121 tbl->t[id][ig][ip][tbl->nt[id][ig][ip] - 1],
6122 tbl->nu[id][ig][ip][0] - 1, tbl->u[id][ig][ip][0][0],
6123 tbl->u[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1],
6124 tbl->nu[id][ig][ip][0] - 1, tbl->eps[id][ig][ip][0][0],
6125 tbl->eps[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1]);
6126 }
6127
6128 /* Initialize source function... */
6129 init_srcfunc(ctl, tbl);
6130
6131 /* Return pointer... */
6132 return tbl;
6133}
6134
6135/*****************************************************************************/
6136
6138 const ctl_t *ctl,
6139 tbl_t *tbl,
6140 const int id,
6141 const int ig) {
6142
6143 /* Initialize... */
6144 double eps, eps_old = -999, press, press_old = -999, temp, temp_old =
6145 -999, u, u_old = -999;
6146 int nrange = 0;
6147
6148 /* Set filename... */
6149 char filename[2 * LEN];
6150 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
6151 ctl->nu[id], ctl->emitter[ig]);
6152
6153 /* Write info... */
6154 LOG(1, "Read emissivity table: %s", filename);
6155
6156 /* Try to open file... */
6157 FILE *in;
6158 if (!(in = fopen(filename, "r"))) {
6159 WARN("Missing emissivity table: %s", filename);
6160 return;
6161 }
6162
6163 /* Read data... */
6164 char line[LEN];
6165 while (fgets(line, LEN, in)) {
6166
6167 /* Parse line... */
6168 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
6169 continue;
6170
6171 /* Check ranges... */
6172 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
6173 nrange++;
6174 continue;
6175 }
6176
6177 /* Determine pressure index... */
6178 if (press != press_old) {
6179 press_old = press;
6180 if ((++tbl->np[id][ig]) >= TBLNP)
6181 ERRMSG("Too many pressure levels!");
6182 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
6183 }
6184
6185 /* Determine temperature index... */
6186 if (temp != temp_old) {
6187 temp_old = temp;
6188 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
6189 ERRMSG("Too many temperatures!");
6190 tbl->nu[id][ig][tbl->np[id][ig]]
6191 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
6192 }
6193
6194 /* Determine column density index... */
6195 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
6196 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
6197 eps_old = eps;
6198 u_old = u;
6199 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
6200 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
6201 ERRMSG("Too many column densities!");
6202 }
6203
6204 /* Store data... */
6205 tbl->p[id][ig][tbl->np[id][ig]] = press;
6206 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6207 = temp;
6208 tbl->u[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6209 [tbl->nu[id][ig][tbl->np[id][ig]]
6210 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) u;
6211 tbl->eps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6212 [tbl->nu[id][ig][tbl->np[id][ig]]
6213 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) eps;
6214 }
6215
6216 /* Increment counters... */
6217 tbl->np[id][ig]++;
6218 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6219 tbl->nt[id][ig][ip]++;
6220 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
6221 tbl->nu[id][ig][ip][it]++;
6222 }
6223
6224 /* Check ranges... */
6225 if (nrange > 0)
6226 WARN("Column density or emissivity out of range (%d data points)!",
6227 nrange);
6228
6229 /* Close file... */
6230 fclose(in);
6231}
6232
6233/*****************************************************************************/
6234
6236 const ctl_t *ctl,
6237 tbl_t *tbl,
6238 const int id,
6239 const int ig) {
6240
6241 /* Set filename... */
6242 char filename[2 * LEN];
6243 sprintf(filename, "%s_%.4f_%s.bin", ctl->tblbase,
6244 ctl->nu[id], ctl->emitter[ig]);
6245
6246 /* Write info... */
6247 LOG(1, "Read emissivity table: %s", filename);
6248
6249 /* Try to open file... */
6250 FILE *in;
6251 if (!(in = fopen(filename, "r"))) {
6252 WARN("Missing emissivity table: %s", filename);
6253 return;
6254 }
6255
6256 /* Read data... */
6257 FREAD(&tbl->np[id][ig], int,
6258 1,
6259 in);
6260 if (tbl->np[id][ig] > TBLNP)
6261 ERRMSG("Too many pressure levels!");
6262 FREAD(tbl->p[id][ig], double,
6263 (size_t) tbl->np[id][ig],
6264 in);
6265 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6266 FREAD(&tbl->nt[id][ig][ip], int,
6267 1,
6268 in);
6269 if (tbl->nt[id][ig][ip] > TBLNT)
6270 ERRMSG("Too many temperatures!");
6271 FREAD(tbl->t[id][ig][ip], double,
6272 (size_t) tbl->nt[id][ig][ip],
6273 in);
6274 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6275 FREAD(&tbl->nu[id][ig][ip][it], int,
6276 1,
6277 in);
6278 if (tbl->nu[id][ig][ip][it] > TBLNU)
6279 ERRMSG("Too many column densities!");
6280 FREAD(tbl->u[id][ig][ip][it], float,
6281 (size_t) tbl->nu[id][ig][ip][it],
6282 in);
6283 FREAD(tbl->eps[id][ig][ip][it], float,
6284 (size_t) tbl->nu[id][ig][ip][it],
6285 in);
6286 }
6287 }
6288
6289 /* Close file... */
6290 fclose(in);
6291}
6292
6293/*****************************************************************************/
6294
6296 const ctl_t *ctl,
6297 tbl_t *tbl,
6298 const int id,
6299 const int ig) {
6300
6301 /* Set filename... */
6302 char filename[2 * LEN];
6303 sprintf(filename, "%s_%s.tbl", ctl->tblbase, ctl->emitter[ig]);
6304
6305 /* Write info... */
6306 LOG(1, "Read emissivity table: %s", filename);
6307
6308 /* Open file... */
6309 tbl_gas_t gas;
6310 if (read_tbl_gas_open(filename, &gas) != 0) {
6311 WARN("Missing emissivity table: %s", filename);
6312 return;
6313 }
6314
6315 /* Read table... */
6316 if (read_tbl_gas_single(&gas, ctl->nu[id], tbl, id, ig) != 0)
6317 WARN("Frequency %.6f missing in %s", ctl->nu[id], filename);
6318
6319 /* Close file... */
6320 read_tbl_gas_close(&gas);
6321}
6322
6323/*****************************************************************************/
6324
6326 tbl_gas_t *g) {
6327
6328 if (!g || !g->fp)
6329 return -1;
6330
6331 if (g->dirty) {
6332
6333 /* Rewind to header... */
6334 fseek(g->fp, 0, SEEK_SET);
6335
6336 /* Write header... */
6337 const char magic[4] = { 'G', 'T', 'L', '1' };
6338 FWRITE(magic, char,
6339 4,
6340 g->fp);
6341 FWRITE(&g->ntables, int32_t, 1, g->fp);
6342
6343 /* Write updated index... */
6345 fflush(g->fp);
6346 }
6347
6348 /* Close file... */
6349 fclose(g->fp);
6350 free(g->index);
6351 memset(g, 0, sizeof(*g));
6352
6353 return 0;
6354}
6355
6356/*****************************************************************************/
6357
6359 const char *path,
6360 tbl_gas_t *g) {
6361
6362 /* Open file... */
6363 memset(g, 0, sizeof(*g));
6364 g->fp = fopen(path, "rb+"); /* MUST be rb+ for writing later */
6365 if (!g->fp)
6366 return -1;
6367 char magic[4];
6368
6369 /* Read header... */
6370 FREAD(magic, char,
6371 4,
6372 g->fp);
6373 if (memcmp(magic, "GTL1", 4) != 0)
6374 ERRMSG("Invalid gas-table file format!");
6375 FREAD(&g->ntables, int32_t, 1, g->fp);
6376
6377 /* Read index... */
6380 g->dirty = 0;
6381
6382 return 0;
6383}
6384
6385/*****************************************************************************/
6386
6388 const tbl_gas_t *g,
6389 const double freq,
6390 tbl_t *tbl,
6391 const int id,
6392 const int ig) {
6393
6394 /* Find freq in index */
6395 int idx = -1;
6396 for (int i = 0; i < g->ntables; i++) {
6397 if (g->index[i].freq == freq) {
6398 idx = i;
6399 break;
6400 }
6401 }
6402 if (idx < 0) {
6403 WARN("Frequency %.4f not found in gas table", freq);
6404 return -1;
6405 }
6406
6407 /* Seek to table block... */
6408 if (fseek(g->fp, (long) g->index[idx].offset, SEEK_SET) != 0)
6409 ERRMSG("Seek error in read_tbl_gas_single!");
6410
6411 /* Read number of pressures... */
6412 FREAD(&tbl->np[id][ig], int,
6413 1,
6414 g->fp);
6415 if (tbl->np[id][ig] > TBLNP)
6416 ERRMSG("Too many pressure levels!");
6417
6418 /* Read pressure grid... */
6419 FREAD(tbl->p[id][ig], double,
6420 (size_t) tbl->np[id][ig],
6421 g->fp);
6422
6423 /* Loop over pressure levels... */
6424 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6425
6426 /* Read number of temperatures... */
6427 FREAD(&tbl->nt[id][ig][ip], int,
6428 1,
6429 g->fp);
6430 if (tbl->nt[id][ig][ip] > TBLNT)
6431 ERRMSG("Too many temperatures!");
6432
6433 /* Read temperature grid... */
6434 FREAD(tbl->t[id][ig][ip], double,
6435 (size_t) tbl->nt[id][ig][ip],
6436 g->fp);
6437
6438 /* Loop over temperature levels... */
6439 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6440
6441 /* Read number of u points... */
6442 FREAD(&tbl->nu[id][ig][ip][it], int,
6443 1,
6444 g->fp);
6445 if (tbl->nu[id][ig][ip][it] > TBLNU)
6446 ERRMSG("Too many column densities!");
6447
6448 /* Read u grid... */
6449 FREAD(tbl->u[id][ig][ip][it], float,
6450 (size_t) tbl->nu[id][ig][ip][it],
6451 g->fp);
6452
6453 /* Read emissivity grid... */
6454 FREAD(tbl->eps[id][ig][ip][it], float,
6455 (size_t) tbl->nu[id][ig][ip][it],
6456 g->fp);
6457 }
6458 }
6459
6460 return 0;
6461}
6462
6463/*****************************************************************************/
6464
6466 int argc,
6467 char *argv[],
6468 const char *varname,
6469 const int arridx,
6470 const char *defvalue,
6471 char *value) {
6472
6473 FILE *in = NULL;
6474
6475 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
6476 rvarname[LEN], rval[LEN];
6477
6478 int contain = 0;
6479
6480 /* Open file... */
6481 if (argv[1][0] != '-')
6482 if (!(in = fopen(argv[1], "r")))
6483 ERRMSG("Cannot open file!");
6484
6485 /* Set full variable name... */
6486 if (arridx >= 0) {
6487 sprintf(fullname1, "%s[%d]", varname, arridx);
6488 sprintf(fullname2, "%s[*]", varname);
6489 } else {
6490 sprintf(fullname1, "%s", varname);
6491 sprintf(fullname2, "%s", varname);
6492 }
6493
6494 /* Read data... */
6495 if (in != NULL)
6496 while (fgets(line, LEN, in))
6497 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
6498 if (strcasecmp(rvarname, fullname1) == 0 ||
6499 strcasecmp(rvarname, fullname2) == 0) {
6500 contain = 1;
6501 break;
6502 }
6503 for (int i = 1; i < argc - 1; i++)
6504 if (strcasecmp(argv[i], fullname1) == 0 ||
6505 strcasecmp(argv[i], fullname2) == 0) {
6506 sprintf(rval, "%s", argv[i + 1]);
6507 contain = 1;
6508 break;
6509 }
6510
6511 /* Close file... */
6512 if (in != NULL)
6513 fclose(in);
6514
6515 /* Check for missing variables... */
6516 if (!contain) {
6517 if (strlen(defvalue) > 0)
6518 sprintf(rval, "%s", defvalue);
6519 else
6520 ERRMSG("Missing variable %s!\n", fullname1);
6521 }
6522
6523 /* Write info... */
6524 LOG(1, "%s = %s", fullname1, rval);
6525
6526 /* Return values... */
6527 if (value != NULL)
6528 sprintf(value, "%s", rval);
6529 return atof(rval);
6530}
6531
6532/*****************************************************************************/
6533
6535 const ret_t *ret,
6536 const ctl_t *ctl,
6537 const atm_t *atm,
6538 const int *iqa,
6539 const int *ipa,
6540 gsl_matrix *s_a) {
6541
6542 /* Get sizes... */
6543 const size_t n = s_a->size1;
6544
6545 /* Allocate... */
6546 gsl_vector *x_a = gsl_vector_alloc(n);
6547
6548 /* Get sigma vector... */
6549 atm2x(ctl, atm, x_a, NULL, NULL);
6550 for (size_t i = 0; i < n; i++) {
6551 if (iqa[i] == IDXP)
6552 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
6553 if (iqa[i] == IDXT)
6554 gsl_vector_set(x_a, i, ret->err_temp);
6555 for (int ig = 0; ig < ctl->ng; ig++)
6556 if (iqa[i] == IDXQ(ig))
6557 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
6558 for (int iw = 0; iw < ctl->nw; iw++)
6559 if (iqa[i] == IDXK(iw))
6560 gsl_vector_set(x_a, i, ret->err_k[iw]);
6561 if (iqa[i] == IDXCLZ)
6562 gsl_vector_set(x_a, i, ret->err_clz);
6563 if (iqa[i] == IDXCLDZ)
6564 gsl_vector_set(x_a, i, ret->err_cldz);
6565 for (int icl = 0; icl < ctl->ncl; icl++)
6566 if (iqa[i] == IDXCLK(icl))
6567 gsl_vector_set(x_a, i, ret->err_clk[icl]);
6568 if (iqa[i] == IDXSFT)
6569 gsl_vector_set(x_a, i, ret->err_sft);
6570 for (int isf = 0; isf < ctl->nsf; isf++)
6571 if (iqa[i] == IDXSFEPS(isf))
6572 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
6573 }
6574
6575 /* Check standard deviations... */
6576 for (size_t i = 0; i < n; i++)
6577 if (POW2(gsl_vector_get(x_a, i)) <= 0)
6578 ERRMSG("Check a priori data (zero standard deviation)!");
6579
6580 /* Initialize diagonal covariance... */
6581 gsl_matrix_set_zero(s_a);
6582 for (size_t i = 0; i < n; i++)
6583 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
6584
6585 /* Loop over matrix elements... */
6586 for (size_t i = 0; i < n; i++)
6587 for (size_t j = 0; j < n; j++)
6588 if (i != j && iqa[i] == iqa[j]) {
6589
6590 /* Initialize... */
6591 double cz = 0;
6592 double ch = 0;
6593
6594 /* Set correlation lengths for pressure... */
6595 if (iqa[i] == IDXP) {
6596 cz = ret->err_press_cz;
6597 ch = ret->err_press_ch;
6598 }
6599
6600 /* Set correlation lengths for temperature... */
6601 if (iqa[i] == IDXT) {
6602 cz = ret->err_temp_cz;
6603 ch = ret->err_temp_ch;
6604 }
6605
6606 /* Set correlation lengths for volume mixing ratios... */
6607 for (int ig = 0; ig < ctl->ng; ig++)
6608 if (iqa[i] == IDXQ(ig)) {
6609 cz = ret->err_q_cz[ig];
6610 ch = ret->err_q_ch[ig];
6611 }
6612
6613 /* Set correlation lengths for extinction... */
6614 for (int iw = 0; iw < ctl->nw; iw++)
6615 if (iqa[i] == IDXK(iw)) {
6616 cz = ret->err_k_cz[iw];
6617 ch = ret->err_k_ch[iw];
6618 }
6619
6620 /* Compute correlations... */
6621 if (cz > 0 && ch > 0) {
6622
6623 /* Get Cartesian coordinates... */
6624 double x0[3], x1[3];
6625 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
6626 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
6627
6628 /* Compute correlations... */
6629 const double rho =
6630 exp(-DIST(x0, x1) / ch -
6631 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
6632
6633 /* Set covariance... */
6634 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
6635 * gsl_vector_get(x_a, j) * rho);
6636 }
6637 }
6638
6639 /* Free... */
6640 gsl_vector_free(x_a);
6641}
6642
6643/*****************************************************************************/
6644
6646 const ret_t *ret,
6647 const ctl_t *ctl,
6648 const obs_t *obs,
6649 gsl_vector *sig_noise,
6650 gsl_vector *sig_formod,
6651 gsl_vector *sig_eps_inv) {
6652
6653 static obs_t obs_err;
6654
6655 /* Get size... */
6656 const size_t m = sig_eps_inv->size;
6657
6658 /* Noise error (always considered in retrieval fit)... */
6659 copy_obs(ctl, &obs_err, obs, 1);
6660 for (int ir = 0; ir < obs_err.nr; ir++)
6661 for (int id = 0; id < ctl->nd; id++)
6662 obs_err.rad[id][ir]
6663 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
6664 obs2y(ctl, &obs_err, sig_noise, NULL, NULL);
6665
6666 /* Forward model error (always considered in retrieval fit)... */
6667 copy_obs(ctl, &obs_err, obs, 1);
6668 for (int ir = 0; ir < obs_err.nr; ir++)
6669 for (int id = 0; id < ctl->nd; id++)
6670 obs_err.rad[id][ir]
6671 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
6672 obs2y(ctl, &obs_err, sig_formod, NULL, NULL);
6673
6674 /* Total error... */
6675 for (size_t i = 0; i < m; i++)
6676 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
6677 +
6678 POW2(gsl_vector_get
6679 (sig_formod, i))));
6680
6681 /* Check standard deviations... */
6682 for (size_t i = 0; i < m; i++)
6683 if (gsl_vector_get(sig_eps_inv, i) <= 0)
6684 ERRMSG("Check measurement errors (zero standard deviation)!");
6685}
6686
6687/*****************************************************************************/
6688
6690 const los_t *los,
6691 double *tpz,
6692 double *tplon,
6693 double *tplat) {
6694
6695 double dummy, v[3], v0[3], v2[3];
6696
6697 /* Find minimum altitude... */
6698 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
6699
6700 /* Nadir or zenith... */
6701 if (ip <= 0 || ip >= (size_t) los->np - 1) {
6702 *tpz = los->z[los->np - 1];
6703 *tplon = los->lon[los->np - 1];
6704 *tplat = los->lat[los->np - 1];
6705 }
6706
6707 /* Limb... */
6708 else {
6709
6710 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
6711 const double yy0 = los->z[ip - 1];
6712 const double yy1 = los->z[ip];
6713 const double yy2 = los->z[ip + 1];
6714 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
6715 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
6716 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
6717 const double b = -(yy0 - yy1) / x1 - a * x1;
6718 const double c = yy0;
6719
6720 /* Get tangent point location... */
6721 const double x = -b / (2 * a);
6722 *tpz = a * x * x + b * x + c;
6723 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
6724 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
6725 for (int i = 0; i < 3; i++)
6726 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
6727 cart2geo(v, &dummy, tplon, tplat);
6728 }
6729}
6730
6731/*****************************************************************************/
6732
6734 const int year,
6735 const int mon,
6736 const int day,
6737 const int hour,
6738 const int min,
6739 const int sec,
6740 const double remain,
6741 double *jsec) {
6742
6743 struct tm t0, t1;
6744
6745 t0.tm_year = 100;
6746 t0.tm_mon = 0;
6747 t0.tm_mday = 1;
6748 t0.tm_hour = 0;
6749 t0.tm_min = 0;
6750 t0.tm_sec = 0;
6751
6752 t1.tm_year = year - 1900;
6753 t1.tm_mon = mon - 1;
6754 t1.tm_mday = day;
6755 t1.tm_hour = hour;
6756 t1.tm_min = min;
6757 t1.tm_sec = sec;
6758
6759 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
6760}
6761
6762/*****************************************************************************/
6763
6765 const char *name,
6766 const char *file,
6767 const char *func,
6768 int line,
6769 int mode) {
6770
6771 static double w0[10];
6772
6773 static int l0[10], nt;
6774
6775 /* Start new timer... */
6776 if (mode == 1) {
6777 w0[nt] = omp_get_wtime();
6778 l0[nt] = line;
6779 if ((++nt) >= 10)
6780 ERRMSG("Too many timers!");
6781 }
6782
6783 /* Write elapsed time... */
6784 else {
6785
6786 /* Check timer index... */
6787 if (nt - 1 < 0)
6788 ERRMSG("Coding error!");
6789
6790 /* Write elapsed time... */
6791 LOG(1, "Timer '%s' (%s, %s, l%d-%d): %.3f sec",
6792 name, file, func, l0[nt - 1], line, omp_get_wtime() - w0[nt - 1]);
6793 }
6794
6795 /* Stop timer... */
6796 if (mode == 3)
6797 nt--;
6798}
6799
6800/*****************************************************************************/
6801
6803 const char *dirname,
6804 const char *filename,
6805 const ctl_t *ctl,
6806 const atm_t *atm) {
6807
6808 char file[LEN];
6809
6810 /* Set filename... */
6811 if (dirname != NULL)
6812 sprintf(file, "%s/%s", dirname, filename);
6813 else
6814 sprintf(file, "%s", filename);
6815
6816 /* Write info... */
6817 LOG(1, "Write atmospheric data: %s", file);
6818
6819 /* Write ASCII data... */
6820 if (ctl->atmfmt == 1)
6821 write_atm_asc(file, ctl, atm);
6822
6823 /* Write binary data... */
6824 else if (ctl->atmfmt == 2)
6825 write_atm_bin(file, ctl, atm);
6826
6827 /* Write netCDF data... */
6828 else if (ctl->atmfmt == 3)
6829 write_atm_nc(file, ctl, atm, 0);
6830
6831 /* Error... */
6832 else
6833 ERRMSG("Unknown file format, check ATMFMT!");
6834
6835 /* Write info... */
6836 double mini, maxi;
6837 LOG(2, "Number of data points: %d", atm->np);
6838 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
6839 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
6840 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
6841 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
6842 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
6843 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
6844 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
6845 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
6846 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
6847 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
6848 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
6849 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
6850 for (int ig = 0; ig < ctl->ng; ig++) {
6851 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
6852 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
6853 }
6854 for (int iw = 0; iw < ctl->nw; iw++) {
6855 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
6856 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
6857 }
6858 if (ctl->ncl > 0 && atm->np == 0) {
6859 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
6860 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
6861 } else
6862 LOG(2, "Cloud layer: none");
6863 if (ctl->nsf > 0 && atm->np == 0) {
6864 LOG(2,
6865 "Surface: T_s = %g K | eps= %g ... %g",
6866 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
6867 } else
6868 LOG(2, "Surface: none");
6869}
6870
6871/*****************************************************************************/
6872
6874 const char *filename,
6875 const ctl_t *ctl,
6876 const atm_t *atm) {
6877
6878 int n = 6;
6879
6880 /* Create file... */
6881 FILE *out;
6882 if (!(out = fopen(filename, "w")))
6883 ERRMSG("Cannot create file!");
6884
6885 /* Write header... */
6886 fprintf(out,
6887 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
6888 "# $2 = altitude [km]\n"
6889 "# $3 = longitude [deg]\n"
6890 "# $4 = latitude [deg]\n"
6891 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
6892 for (int ig = 0; ig < ctl->ng; ig++)
6893 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
6894 ++n, ctl->emitter[ig]);
6895 for (int iw = 0; iw < ctl->nw; iw++)
6896 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
6897 if (ctl->ncl > 0) {
6898 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
6899 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
6900 for (int icl = 0; icl < ctl->ncl; icl++)
6901 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
6902 ++n, ctl->clnu[icl]);
6903 }
6904 if (ctl->nsf > 0) {
6905 fprintf(out, "# $%d = surface temperature [K]\n", ++n);
6906 for (int isf = 0; isf < ctl->nsf; isf++)
6907 fprintf(out, "# $%d = surface emissivity (%.4f cm^-1)\n",
6908 ++n, ctl->sfnu[isf]);
6909 }
6910
6911 /* Write data... */
6912 for (int ip = 0; ip < atm->np; ip++) {
6913 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
6914 fprintf(out, "\n");
6915 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
6916 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
6917 for (int ig = 0; ig < ctl->ng; ig++)
6918 fprintf(out, " %g", atm->q[ig][ip]);
6919 for (int iw = 0; iw < ctl->nw; iw++)
6920 fprintf(out, " %g", atm->k[iw][ip]);
6921 if (ctl->ncl > 0) {
6922 fprintf(out, " %g %g", atm->clz, atm->cldz);
6923 for (int icl = 0; icl < ctl->ncl; icl++)
6924 fprintf(out, " %g", atm->clk[icl]);
6925 }
6926 if (ctl->nsf > 0) {
6927 fprintf(out, " %g", atm->sft);
6928 for (int isf = 0; isf < ctl->nsf; isf++)
6929 fprintf(out, " %g", atm->sfeps[isf]);
6930 }
6931 fprintf(out, "\n");
6932 }
6933
6934 /* Close file... */
6935 fclose(out);
6936}
6937
6938/*****************************************************************************/
6939
6941 const char *filename,
6942 const ctl_t *ctl,
6943 const atm_t *atm) {
6944
6945 /* Create file... */
6946 FILE *out;
6947 if (!(out = fopen(filename, "w")))
6948 ERRMSG("Cannot create file!");
6949
6950 /* Write header... */
6951 FWRITE("ATM1", char,
6952 4,
6953 out);
6954 FWRITE(&ctl->ng, int,
6955 1,
6956 out);
6957 FWRITE(&ctl->nw, int,
6958 1,
6959 out);
6960 FWRITE(&ctl->ncl, int,
6961 1,
6962 out);
6963 FWRITE(&ctl->nsf, int,
6964 1,
6965 out);
6966
6967 /* Write data... */
6968 size_t np = (size_t) atm->np;
6969 FWRITE(&np, size_t,
6970 1,
6971 out);
6972 FWRITE(atm->time, double,
6973 np,
6974 out);
6975 FWRITE(atm->z, double,
6976 np,
6977 out);
6978 FWRITE(atm->lon, double,
6979 np,
6980 out);
6981 FWRITE(atm->lat, double,
6982 np,
6983 out);
6984 FWRITE(atm->p, double,
6985 np,
6986 out);
6987 FWRITE(atm->t, double,
6988 np,
6989 out);
6990 for (int ig = 0; ig < ctl->ng; ig++)
6991 FWRITE(atm->q[ig], double,
6992 np,
6993 out);
6994 for (int iw = 0; iw < ctl->nw; iw++)
6995 FWRITE(atm->k[iw], double,
6996 np,
6997 out);
6998 if (ctl->ncl > 0) {
6999 FWRITE(&atm->clz, double,
7000 1,
7001 out);
7002 FWRITE(&atm->cldz, double,
7003 1,
7004 out);
7005 FWRITE(atm->clk, double,
7006 (size_t) ctl->ncl,
7007 out);
7008 }
7009 if (ctl->nsf > 0) {
7010 FWRITE(&atm->sft, double,
7011 1,
7012 out);
7013 FWRITE(atm->sfeps, double,
7014 (size_t) ctl->nsf,
7015 out);
7016 }
7017
7018 /* Close file... */
7019 fclose(out);
7020}
7021
7022/*****************************************************************************/
7023
7025 const char *filename,
7026 const ctl_t *ctl,
7027 const atm_t *atm,
7028 int profile) {
7029
7030 char longname[LEN], varname[LEN];
7031
7032 int ncid, varid, dim_profile, dim_level;
7033
7034 size_t level_max;
7035
7036 /* Open or create file... */
7037 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7038 NC(nc_create(filename, NC_NETCDF4, &ncid));
7039
7040 /* Enter define mode... */
7041 int r = nc_redef(ncid);
7042 if (r != NC_NOERR && r != NC_EINDEFINE)
7043 NC(r);
7044
7045 /* Define profile dimension (unlimited)... */
7046 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
7047 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
7048
7049 /* Define level dimension (fixed)... */
7050 if (nc_inq_dimid(ncid, "level", &dim_level) == NC_NOERR) {
7051 NC(nc_inq_dimlen(ncid, dim_level, &level_max));
7052 if (level_max < 1 || level_max > (size_t) NP)
7053 ERRMSG("netCDF dimension level is out of range!");
7054 if ((size_t) atm->np > level_max)
7055 ERRMSG("profile has too many levels!");
7056 } else {
7057 level_max = (size_t) atm->np;
7058 NC(nc_def_dim(ncid, "level", level_max, &dim_level));
7059 }
7060
7061 /* Set dimension IDs... */
7062 int dimids[2] = { dim_profile, dim_level };
7063
7064 /* Tunables for compression/quantization... */
7065 const int deflate_level = 0;
7066 const int quant_digits = 0;
7067
7068 /* Define nlev (1D)... */
7069 if (nc_inq_varid(ncid, "nlev", &varid) != NC_NOERR)
7070 NC_DEF_VAR("nlev", NC_INT, 1, dimids,
7071 "number of vertical levels", "1", 0, 0);
7072
7073 /* Define core variables (2D)... */
7074 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
7075 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
7076 "time in seconds since 2000-01-01, 00:00 UTC", "s",
7077 deflate_level, 0);
7078
7079 if (nc_inq_varid(ncid, "z", &varid) != NC_NOERR)
7080 NC_DEF_VAR("z", NC_DOUBLE, 2, dimids, "altitude", "km", deflate_level, 0);
7081
7082 if (nc_inq_varid(ncid, "lon", &varid) != NC_NOERR)
7083 NC_DEF_VAR("lon", NC_DOUBLE, 2, dimids,
7084 "longitude", "degrees_east", deflate_level, 0);
7085
7086 if (nc_inq_varid(ncid, "lat", &varid) != NC_NOERR)
7087 NC_DEF_VAR("lat", NC_DOUBLE, 2, dimids,
7088 "latitude", "degrees_north", deflate_level, 0);
7089
7090 if (nc_inq_varid(ncid, "p", &varid) != NC_NOERR)
7091 NC_DEF_VAR("p", NC_DOUBLE, 2, dimids,
7092 "pressure", "hPa", deflate_level, quant_digits);
7093
7094 if (nc_inq_varid(ncid, "t", &varid) != NC_NOERR)
7095 NC_DEF_VAR("t", NC_DOUBLE, 2, dimids,
7096 "temperature", "K", deflate_level, quant_digits);
7097
7098 /* Write emitters (2D)... */
7099 for (int ig = 0; ig < ctl->ng; ig++)
7100 if (nc_inq_varid(ncid, ctl->emitter[ig], &varid) != NC_NOERR) {
7101 sprintf(longname, "%s volume mixing ratio", ctl->emitter[ig]);
7102 NC_DEF_VAR(ctl->emitter[ig], NC_DOUBLE, 2, dimids,
7103 longname, "ppv", deflate_level, quant_digits);
7104 }
7105
7106 /* Write extinction (2D)... */
7107 for (int iw = 0; iw < ctl->nw; iw++) {
7108 sprintf(varname, "ext_win_%d", iw);
7109 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7110 sprintf(longname, "extinction (window %d)", iw);
7111 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids,
7112 longname, "km**-1", deflate_level, quant_digits);
7113 }
7114 }
7115
7116 /* Write cloud variables (1D)... */
7117 if (ctl->ncl > 0) {
7118 if (nc_inq_varid(ncid, "cld_z", &varid) != NC_NOERR)
7119 NC_DEF_VAR("cld_z", NC_DOUBLE, 1, dimids,
7120 "cloud layer height", "km", deflate_level, quant_digits);
7121
7122 if (nc_inq_varid(ncid, "cld_dz", &varid) != NC_NOERR)
7123 NC_DEF_VAR("cld_dz", NC_DOUBLE, 1, dimids,
7124 "cloud layer depth", "km", deflate_level, quant_digits);
7125
7126 for (int icl = 0; icl < ctl->ncl; icl++) {
7127 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7128 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7129 sprintf(longname, "cloud layer extinction (%.4f cm^-1)",
7130 ctl->clnu[icl]);
7131 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "km**-1",
7132 deflate_level, quant_digits);
7133 }
7134 }
7135 }
7136
7137 /* Write surface variables (1D)... */
7138 if (ctl->nsf > 0) {
7139 if (nc_inq_varid(ncid, "srf_t", &varid) != NC_NOERR)
7140 NC_DEF_VAR("srf_t", NC_DOUBLE, 1, dimids,
7141 "surface temperature", "K", deflate_level, quant_digits);
7142
7143 for (int isf = 0; isf < ctl->nsf; isf++) {
7144 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7145 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7146 sprintf(longname, "surface emissivity (%.4f cm^-1)", ctl->sfnu[isf]);
7147 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "1",
7148 deflate_level, quant_digits);
7149 }
7150 }
7151 }
7152
7153 /* Leave define mode... */
7154 NC(nc_enddef(ncid));
7155
7156 /* Define hyperslabs... */
7157 size_t start[2] = { (size_t) profile, 0 };
7158 size_t count[2] = { 1, (size_t) atm->np };
7159
7160 /* Write nlev... */
7161 NC_PUT_INT("nlev", &atm->np, 1);
7162
7163 /* Write core variables... */
7164 NC_PUT_DOUBLE("time", atm->time, 1);
7165 NC_PUT_DOUBLE("z", atm->z, 1);
7166 NC_PUT_DOUBLE("lon", atm->lon, 1);
7167 NC_PUT_DOUBLE("lat", atm->lat, 1);
7168 NC_PUT_DOUBLE("p", atm->p, 1);
7169 NC_PUT_DOUBLE("t", atm->t, 1);
7170
7171 /* Write emitters... */
7172 for (int ig = 0; ig < ctl->ng; ig++)
7173 NC_PUT_DOUBLE(ctl->emitter[ig], atm->q[ig], 1);
7174
7175 /* Write extinction... */
7176 for (int iw = 0; iw < ctl->nw; iw++) {
7177 sprintf(varname, "ext_win_%d", iw);
7178 NC_PUT_DOUBLE(varname, atm->k[iw], 1);
7179 }
7180
7181 /* Write cloud variables... */
7182 if (ctl->ncl > 0) {
7183 NC_PUT_DOUBLE("cld_z", &atm->clz, 1);
7184 NC_PUT_DOUBLE("cld_dz", &atm->cldz, 1);
7185
7186 for (int icl = 0; icl < ctl->ncl; icl++) {
7187 sprintf(varname, "cld_k_%d", icl);
7188 NC_PUT_DOUBLE(varname, &atm->clk[icl], 1);
7189 }
7190 }
7191
7192 /* Write surface variables... */
7193 if (ctl->nsf > 0) {
7194 NC_PUT_DOUBLE("srf_t", &atm->sft, 1);
7195
7196 for (int isf = 0; isf < ctl->nsf; isf++) {
7197 sprintf(varname, "srf_eps_%d", isf);
7198 NC_PUT_DOUBLE(varname, &atm->sfeps[isf], 1);
7199 }
7200 }
7201
7202 /* Close file... */
7203 NC(nc_sync(ncid));
7204 NC(nc_close(ncid));
7205}
7206
7207/*****************************************************************************/
7208
7210 const char *filename,
7211 const ctl_t *ctl,
7212 const atm_t *atm) {
7213
7214 FILE *out;
7215
7216 /* Write info... */
7217 LOG(1, "Write RFM data: %s", filename);
7218
7219 /* Create file... */
7220 if (!(out = fopen(filename, "w")))
7221 ERRMSG("Cannot create file!");
7222
7223 /* Write data... */
7224 fprintf(out, "%d\n", atm->np);
7225 fprintf(out, "*HGT [km]\n");
7226 for (int ip = 0; ip < atm->np; ip++)
7227 fprintf(out, "%g\n", atm->z[ip]);
7228 fprintf(out, "*PRE [mb]\n");
7229 for (int ip = 0; ip < atm->np; ip++)
7230 fprintf(out, "%g\n", atm->p[ip]);
7231 fprintf(out, "*TEM [K]\n");
7232 for (int ip = 0; ip < atm->np; ip++)
7233 fprintf(out, "%g\n", atm->t[ip]);
7234 for (int ig = 0; ig < ctl->ng; ig++) {
7235 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
7236 for (int ip = 0; ip < atm->np; ip++)
7237 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
7238 }
7239 fprintf(out, "*END\n");
7240
7241 /* Close file... */
7242 fclose(out);
7243}
7244
7245/*****************************************************************************/
7246
7248 const char *dirname,
7249 const char *filename,
7250 const ctl_t *ctl,
7251 const gsl_matrix *matrix,
7252 const atm_t *atm,
7253 const obs_t *obs,
7254 const char *rowspace,
7255 const char *colspace,
7256 const char *sort) {
7257
7258 FILE *out;
7259
7260 char file[LEN], quantity[LEN];
7261
7262 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
7263
7264 size_t i, j, nc, nr;
7265
7266 /* Check output flag... */
7267 if (!ctl->write_matrix)
7268 return;
7269
7270 /* Allocate... */
7271 ALLOC(cida, int,
7272 M);
7273 ALLOC(ciqa, int,
7274 N);
7275 ALLOC(cipa, int,
7276 N);
7277 ALLOC(cira, int,
7278 M);
7279 ALLOC(rida, int,
7280 M);
7281 ALLOC(riqa, int,
7282 N);
7283 ALLOC(ripa, int,
7284 N);
7285 ALLOC(rira, int,
7286 M);
7287
7288 /* Set filename... */
7289 if (dirname != NULL)
7290 sprintf(file, "%s/%s", dirname, filename);
7291 else
7292 sprintf(file, "%s", filename);
7293
7294 /* Write info... */
7295 LOG(1, "Write matrix: %s", file);
7296
7297 /* Create file... */
7298 if (!(out = fopen(file, "w")))
7299 ERRMSG("Cannot create file!");
7300
7301 /* Write header (row space)... */
7302 if (rowspace[0] == 'y') {
7303
7304 fprintf(out,
7305 "# $1 = Row: index (measurement space)\n"
7306 "# $2 = Row: channel wavenumber [cm^-1]\n"
7307 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7308 "# $4 = Row: view point altitude [km]\n"
7309 "# $5 = Row: view point longitude [deg]\n"
7310 "# $6 = Row: view point latitude [deg]\n");
7311
7312 /* Get number of rows... */
7313 nr = obs2y(ctl, obs, NULL, rida, rira);
7314
7315 } else {
7316
7317 fprintf(out,
7318 "# $1 = Row: index (state space)\n"
7319 "# $2 = Row: name of quantity\n"
7320 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7321 "# $4 = Row: altitude [km]\n"
7322 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
7323
7324 /* Get number of rows... */
7325 nr = atm2x(ctl, atm, NULL, riqa, ripa);
7326 }
7327
7328 /* Write header (column space)... */
7329 if (colspace[0] == 'y') {
7330
7331 fprintf(out,
7332 "# $7 = Col: index (measurement space)\n"
7333 "# $8 = Col: channel wavenumber [cm^-1]\n"
7334 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7335 "# $10 = Col: view point altitude [km]\n"
7336 "# $11 = Col: view point longitude [deg]\n"
7337 "# $12 = Col: view point latitude [deg]\n");
7338
7339 /* Get number of columns... */
7340 nc = obs2y(ctl, obs, NULL, cida, cira);
7341
7342 } else {
7343
7344 fprintf(out,
7345 "# $7 = Col: index (state space)\n"
7346 "# $8 = Col: name of quantity\n"
7347 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7348 "# $10 = Col: altitude [km]\n"
7349 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
7350
7351 /* Get number of columns... */
7352 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
7353 }
7354
7355 /* Write header entry... */
7356 fprintf(out, "# $13 = Matrix element\n\n");
7357
7358 /* Write matrix data... */
7359 i = j = 0;
7360 while (i < nr && j < nc) {
7361
7362 /* Write info about the row... */
7363 if (rowspace[0] == 'y')
7364 fprintf(out, "%d %.4f %.2f %g %g %g",
7365 (int) i, ctl->nu[rida[i]],
7366 obs->time[rira[i]], obs->vpz[rira[i]],
7367 obs->vplon[rira[i]], obs->vplat[rira[i]]);
7368 else {
7369 idx2name(ctl, riqa[i], quantity);
7370 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
7371 atm->time[ripa[i]], atm->z[ripa[i]],
7372 atm->lon[ripa[i]], atm->lat[ripa[i]]);
7373 }
7374
7375 /* Write info about the column... */
7376 if (colspace[0] == 'y')
7377 fprintf(out, " %d %.4f %.2f %g %g %g",
7378 (int) j, ctl->nu[cida[j]],
7379 obs->time[cira[j]], obs->vpz[cira[j]],
7380 obs->vplon[cira[j]], obs->vplat[cira[j]]);
7381 else {
7382 idx2name(ctl, ciqa[j], quantity);
7383 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
7384 atm->time[cipa[j]], atm->z[cipa[j]],
7385 atm->lon[cipa[j]], atm->lat[cipa[j]]);
7386 }
7387
7388 /* Write matrix entry... */
7389 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
7390
7391 /* Set matrix indices... */
7392 if (sort[0] == 'r') {
7393 j++;
7394 if (j >= nc) {
7395 j = 0;
7396 i++;
7397 fprintf(out, "\n");
7398 }
7399 } else {
7400 i++;
7401 if (i >= nr) {
7402 i = 0;
7403 j++;
7404 fprintf(out, "\n");
7405 }
7406 }
7407 }
7408
7409 /* Close file... */
7410 fclose(out);
7411
7412 /* Free... */
7413 free(cida);
7414 free(ciqa);
7415 free(cipa);
7416 free(cira);
7417 free(rida);
7418 free(riqa);
7419 free(ripa);
7420 free(rira);
7421}
7422
7423/*****************************************************************************/
7424
7426 const char *dirname,
7427 const char *filename,
7428 const ctl_t *ctl,
7429 const obs_t *obs) {
7430
7431 char file[LEN];
7432
7433 /* Set filename... */
7434 if (dirname != NULL)
7435 sprintf(file, "%s/%s", dirname, filename);
7436 else
7437 sprintf(file, "%s", filename);
7438
7439 /* Write info... */
7440 LOG(1, "Write observation data: %s", file);
7441
7442 /* Write ASCII data... */
7443 if (ctl->obsfmt == 1)
7444 write_obs_asc(file, ctl, obs);
7445
7446 /* Write binary data... */
7447 else if (ctl->obsfmt == 2)
7448 write_obs_bin(file, ctl, obs);
7449
7450 /* Write netCDF data... */
7451 else if (ctl->obsfmt == 3)
7452 write_obs_nc(file, ctl, obs, 0);
7453
7454 /* Error... */
7455 else
7456 ERRMSG("Unknown observation file format, check OBSFMT!");
7457
7458 /* Write info... */
7459 double mini, maxi;
7460 LOG(2, "Number of ray paths: %d", obs->nr);
7461 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
7462 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
7463 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
7464 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
7465 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
7466 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
7467 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
7468 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
7469 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
7470 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
7471 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
7472 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
7473 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
7474 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
7475 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
7476 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
7477 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
7478 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
7479 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
7480 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
7481 for (int id = 0; id < ctl->nd; id++) {
7482 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
7483 if (ctl->write_bbt) {
7484 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
7485 ctl->nu[id], mini, maxi);
7486 } else {
7487 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
7488 ctl->nu[id], mini, maxi);
7489 }
7490 }
7491 for (int id = 0; id < ctl->nd; id++) {
7492 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
7493 if (ctl->write_bbt) {
7494 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
7495 ctl->nu[id], mini, maxi);
7496 }
7497 }
7498}
7499
7500/*****************************************************************************/
7501
7503 const char *filename,
7504 const ctl_t *ctl,
7505 const obs_t *obs) {
7506
7507 int n = 10;
7508
7509 /* Create file... */
7510 FILE *out;
7511 if (!(out = fopen(filename, "w")))
7512 ERRMSG("Cannot create file!");
7513
7514 /* Write header... */
7515 fprintf(out,
7516 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
7517 "# $2 = observer altitude [km]\n"
7518 "# $3 = observer longitude [deg]\n"
7519 "# $4 = observer latitude [deg]\n"
7520 "# $5 = view point altitude [km]\n"
7521 "# $6 = view point longitude [deg]\n"
7522 "# $7 = view point latitude [deg]\n"
7523 "# $8 = tangent point altitude [km]\n"
7524 "# $9 = tangent point longitude [deg]\n"
7525 "# $10 = tangent point latitude [deg]\n");
7526 for (int id = 0; id < ctl->nd; id++)
7527 if (ctl->write_bbt)
7528 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
7529 ++n, ctl->nu[id]);
7530 else
7531 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
7532 ++n, ctl->nu[id]);
7533 for (int id = 0; id < ctl->nd; id++)
7534 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
7535 ctl->nu[id]);
7536
7537 /* Write data... */
7538 for (int ir = 0; ir < obs->nr; ir++) {
7539 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
7540 fprintf(out, "\n");
7541 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
7542 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
7543 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
7544 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
7545 for (int id = 0; id < ctl->nd; id++)
7546 fprintf(out, " %g", obs->rad[id][ir]);
7547 for (int id = 0; id < ctl->nd; id++)
7548 fprintf(out, " %g", obs->tau[id][ir]);
7549 fprintf(out, "\n");
7550 }
7551
7552 /* Close file... */
7553 fclose(out);
7554}
7555
7556/*****************************************************************************/
7557
7559 const char *filename,
7560 const ctl_t *ctl,
7561 const obs_t *obs) {
7562
7563 /* Create file... */
7564 FILE *out;
7565 if (!(out = fopen(filename, "w")))
7566 ERRMSG("Cannot create file!");
7567
7568 /* Write header... */
7569 FWRITE("OBS1", char,
7570 4,
7571 out);
7572 FWRITE(&ctl->nd, int,
7573 1,
7574 out);
7575
7576 /* Write data... */
7577 size_t nr = (size_t) obs->nr;
7578 FWRITE(&nr, size_t,
7579 1,
7580 out);
7581 FWRITE(obs->time, double,
7582 nr,
7583 out);
7584 FWRITE(obs->obsz, double,
7585 nr,
7586 out);
7587 FWRITE(obs->obslon, double,
7588 nr,
7589 out);
7590 FWRITE(obs->obslat, double,
7591 nr,
7592 out);
7593 FWRITE(obs->vpz, double,
7594 nr,
7595 out);
7596 FWRITE(obs->vplon, double,
7597 nr,
7598 out);
7599 FWRITE(obs->vplat, double,
7600 nr,
7601 out);
7602 FWRITE(obs->tpz, double,
7603 nr,
7604 out);
7605 FWRITE(obs->tplon, double,
7606 nr,
7607 out);
7608 FWRITE(obs->tplat, double,
7609 nr,
7610 out);
7611 for (int id = 0; id < ctl->nd; id++)
7612 FWRITE(obs->rad[id], double,
7613 nr,
7614 out);
7615 for (int id = 0; id < ctl->nd; id++)
7616 FWRITE(obs->tau[id], double,
7617 nr,
7618 out);
7619
7620 /* Close file... */
7621 fclose(out);
7622}
7623
7624/*****************************************************************************/
7625
7627 const char *filename,
7628 const ctl_t *ctl,
7629 const obs_t *obs,
7630 const int profile) {
7631
7632 char longname[LEN], varname[LEN];
7633
7634 int ncid, varid, dim_profile, dim_ray;
7635
7636 size_t ray_max;
7637
7638 /* Open or create file... */
7639 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7640 NC(nc_create(filename, NC_NETCDF4, &ncid));
7641
7642 /* Enter define mode... */
7643 int r = nc_redef(ncid);
7644 if (r != NC_NOERR && r != NC_EINDEFINE)
7645 NC(r);
7646
7647 /* Define profile dimension (unlimited)... */
7648 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
7649 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
7650
7651 /* Define ray dimension (fixed)... */
7652 if (nc_inq_dimid(ncid, "ray", &dim_ray) == NC_NOERR) {
7653 NC(nc_inq_dimlen(ncid, dim_ray, &ray_max));
7654 if (ray_max < 1 || ray_max > (size_t) NR)
7655 ERRMSG("netCDF dimension ray is out of range!");
7656 if ((size_t) obs->nr > ray_max)
7657 ERRMSG("profile has too many rays!");
7658 } else {
7659 ray_max = (size_t) obs->nr;
7660 NC(nc_def_dim(ncid, "ray", ray_max, &dim_ray));
7661 }
7662
7663 /* Dimension ID array... */
7664 int dimids[2] = { dim_profile, dim_ray };
7665
7666 /* Tunables for compression/quantization... */
7667 const int deflate_level = 0;
7668 const int quant_digits = 0;
7669
7670 /* Define nray (1D over profile)... */
7671 if (nc_inq_varid(ncid, "nray", &varid) != NC_NOERR)
7672 NC_DEF_VAR("nray", NC_INT, 1, dimids, "number of ray paths", "1", 0, 0);
7673
7674 /* Define geometry variables (2D over profile, ray)... */
7675 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
7676 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
7677 "time in seconds since 2000-01-01, 00:00 UTC", "s",
7678 deflate_level, 0);
7679
7680 if (nc_inq_varid(ncid, "obs_z", &varid) != NC_NOERR)
7681 NC_DEF_VAR("obs_z", NC_DOUBLE, 2, dimids,
7682 "observer altitude", "km", deflate_level, 0);
7683
7684 if (nc_inq_varid(ncid, "obs_lon", &varid) != NC_NOERR)
7685 NC_DEF_VAR("obs_lon", NC_DOUBLE, 2, dimids,
7686 "observer longitude", "degrees_east", deflate_level, 0);
7687
7688 if (nc_inq_varid(ncid, "obs_lat", &varid) != NC_NOERR)
7689 NC_DEF_VAR("obs_lat", NC_DOUBLE, 2, dimids,
7690 "observer latitude", "degrees_north", deflate_level, 0);
7691
7692 if (nc_inq_varid(ncid, "vp_z", &varid) != NC_NOERR)
7693 NC_DEF_VAR("vp_z", NC_DOUBLE, 2, dimids,
7694 "view point altitude", "km", deflate_level, 0);
7695
7696 if (nc_inq_varid(ncid, "vp_lon", &varid) != NC_NOERR)
7697 NC_DEF_VAR("vp_lon", NC_DOUBLE, 2, dimids,
7698 "view point longitude", "degrees_east", deflate_level, 0);
7699
7700 if (nc_inq_varid(ncid, "vp_lat", &varid) != NC_NOERR)
7701 NC_DEF_VAR("vp_lat", NC_DOUBLE, 2, dimids,
7702 "view point latitude", "degrees_north", deflate_level, 0);
7703
7704 if (nc_inq_varid(ncid, "tp_z", &varid) != NC_NOERR)
7705 NC_DEF_VAR("tp_z", NC_DOUBLE, 2, dimids,
7706 "tangent point altitude", "km", deflate_level, 0);
7707
7708 if (nc_inq_varid(ncid, "tp_lon", &varid) != NC_NOERR)
7709 NC_DEF_VAR("tp_lon", NC_DOUBLE, 2, dimids,
7710 "tangent point longitude", "degrees_east", deflate_level, 0);
7711
7712 if (nc_inq_varid(ncid, "tp_lat", &varid) != NC_NOERR)
7713 NC_DEF_VAR("tp_lat", NC_DOUBLE, 2, dimids,
7714 "tangent point latitude", "degrees_north", deflate_level, 0);
7715
7716 /* Define radiance/transmittance per channel (2D profile,ray)... */
7717 for (int id = 0; id < ctl->nd; id++) {
7718
7719 sprintf(varname, "rad_%.4f", ctl->nu[id]);
7720 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7721 if (ctl->write_bbt) {
7722 sprintf(longname, "brightness temperature (%.4f cm^-1)", ctl->nu[id]);
7723 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "K",
7724 deflate_level, quant_digits);
7725 } else {
7726 sprintf(longname, "radiance (%.4f cm^-1)", ctl->nu[id]);
7727 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
7728 "W/(m^2 sr cm^-1)", deflate_level, quant_digits);
7729 }
7730 }
7731
7732 sprintf(varname, "tau_%.4f", ctl->nu[id]);
7733 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7734 sprintf(longname, "transmittance (%.4f cm^-1)", ctl->nu[id]);
7735 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "1",
7736 deflate_level, quant_digits);
7737 }
7738 }
7739
7740 /* Leave define mode... */
7741 NC(nc_enddef(ncid));
7742
7743 /* Hyperslabs... */
7744 size_t start[2] = { (size_t) profile, 0 };
7745 size_t count[2] = { 1, (size_t) obs->nr };
7746
7747 /* Write nray(profile)... */
7748 int nr = obs->nr;
7749 NC(nc_inq_varid(ncid, "nray", &varid));
7750 NC(nc_put_vara_int(ncid, varid, start, count, &nr));
7751
7752 /* Write geometry... */
7753 NC(nc_inq_varid(ncid, "time", &varid));
7754 NC(nc_put_vara_double(ncid, varid, start, count, obs->time));
7755
7756 NC(nc_inq_varid(ncid, "obs_z", &varid));
7757 NC(nc_put_vara_double(ncid, varid, start, count, obs->obsz));
7758
7759 NC(nc_inq_varid(ncid, "obs_lon", &varid));
7760 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslon));
7761
7762 NC(nc_inq_varid(ncid, "obs_lat", &varid));
7763 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslat));
7764
7765 NC(nc_inq_varid(ncid, "vp_z", &varid));
7766 NC(nc_put_vara_double(ncid, varid, start, count, obs->vpz));
7767
7768 NC(nc_inq_varid(ncid, "vp_lon", &varid));
7769 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplon));
7770
7771 NC(nc_inq_varid(ncid, "vp_lat", &varid));
7772 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplat));
7773
7774 NC(nc_inq_varid(ncid, "tp_z", &varid));
7775 NC(nc_put_vara_double(ncid, varid, start, count, obs->tpz));
7776
7777 NC(nc_inq_varid(ncid, "tp_lon", &varid));
7778 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplon));
7779
7780 NC(nc_inq_varid(ncid, "tp_lat", &varid));
7781 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplat));
7782
7783 /* Write spectral variables per channel... */
7784 for (int id = 0; id < ctl->nd; id++) {
7785 sprintf(varname, "rad_%.4f", ctl->nu[id]);
7786 NC(nc_inq_varid(ncid, varname, &varid));
7787 NC(nc_put_vara_double(ncid, varid, start, count, obs->rad[id]));
7788
7789 sprintf(varname, "tau_%.4f", ctl->nu[id]);
7790 NC(nc_inq_varid(ncid, varname, &varid));
7791 NC(nc_put_vara_double(ncid, varid, start, count, obs->tau[id]));
7792 }
7793
7794 /* Close file... */
7795 NC(nc_sync(ncid));
7796 NC(nc_close(ncid));
7797}
7798
7799/*****************************************************************************/
7800
7802 const char *filename,
7803 const double *x,
7804 const double *y,
7805 const int n) {
7806
7807 FILE *out;
7808
7809 /* Write info... */
7810 LOG(1, "Write shape function: %s", filename);
7811
7812 /* Create file... */
7813 if (!(out = fopen(filename, "w")))
7814 ERRMSG("Cannot create file!");
7815
7816 /* Write header... */
7817 fprintf(out,
7818 "# $1 = shape function x-value [-]\n"
7819 "# $2 = shape function y-value [-]\n\n");
7820
7821 /* Write data... */
7822 for (int i = 0; i < n; i++)
7823 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
7824
7825 /* Close file... */
7826 fclose(out);
7827}
7828
7829/*****************************************************************************/
7830
7832 const char *quantity,
7833 const ret_t *ret,
7834 const ctl_t *ctl,
7835 const atm_t *atm,
7836 const gsl_matrix *s) {
7837
7838 static atm_t atm_aux;
7839
7840 char filename[LEN];
7841
7842 /* Get sizes... */
7843 const size_t n = s->size1;
7844
7845 /* Allocate... */
7846 gsl_vector *x_aux = gsl_vector_alloc(n);
7847
7848 /* Compute standard deviation... */
7849 for (size_t i = 0; i < n; i++)
7850 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
7851
7852 /* Write to disk... */
7853 copy_atm(ctl, &atm_aux, atm, 1);
7854 x2atm(ctl, x_aux, &atm_aux);
7855 sprintf(filename, "atm_err_%s.tab", quantity);
7856 write_atm(ret->dir, filename, ctl, &atm_aux);
7857
7858 /* Free... */
7859 gsl_vector_free(x_aux);
7860}
7861
7862/*****************************************************************************/
7863
7865 const ctl_t *ctl,
7866 const tbl_t *tbl) {
7867
7868 /* Write ASCII look-up tables... */
7869 if (ctl->tblfmt == 1)
7870 write_tbl_asc(ctl, tbl);
7871
7872 /* Write binary look-up tables... */
7873 else if (ctl->tblfmt == 2)
7874 write_tbl_bin(ctl, tbl);
7875
7876 /* Write per-gas look-up tables... */
7877 else if (ctl->tblfmt == 3)
7878 write_tbl_gas(ctl, tbl);
7879
7880 /* Error message... */
7881 else
7882 ERRMSG("Unknown look-up table format!");
7883}
7884
7885/*****************************************************************************/
7886
7888 const ctl_t *ctl,
7889 const tbl_t *tbl) {
7890
7891 /* Loop over emitters and detectors... */
7892 for (int ig = 0; ig < ctl->ng; ig++)
7893 for (int id = 0; id < ctl->nd; id++) {
7894
7895 /* Set filename... */
7896 char filename[2 * LEN];
7897 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
7898 ctl->nu[id], ctl->emitter[ig]);
7899
7900 /* Write info... */
7901 LOG(1, "Write emissivity table: %s", filename);
7902
7903 /* Create file... */
7904 FILE *out;
7905 if (!(out = fopen(filename, "w")))
7906 ERRMSG("Cannot create file!");
7907
7908 /* Write header... */
7909 fprintf(out,
7910 "# $1 = pressure [hPa]\n"
7911 "# $2 = temperature [K]\n"
7912 "# $3 = column density [molecules/cm^2]\n"
7913 "# $4 = emissivity [-]\n");
7914
7915 /* Save table file... */
7916 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
7917 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
7918 fprintf(out, "\n");
7919 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
7920 fprintf(out, "%g %g %e %e\n",
7921 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
7922 tbl->u[id][ig][ip][it][iu], tbl->eps[id][ig][ip][it][iu]);
7923 }
7924
7925 /* Close file... */
7926 fclose(out);
7927 }
7928}
7929
7930/*****************************************************************************/
7931
7933 const ctl_t *ctl,
7934 const tbl_t *tbl) {
7935
7936 /* Loop over emitters and detectors... */
7937 for (int ig = 0; ig < ctl->ng; ig++)
7938 for (int id = 0; id < ctl->nd; id++) {
7939
7940 /* Set filename... */
7941 char filename[2 * LEN];
7942 sprintf(filename, "%s_%.4f_%s.bin", ctl->tblbase,
7943 ctl->nu[id], ctl->emitter[ig]);
7944
7945 /* Write info... */
7946 LOG(1, "Write emissivity table: %s", filename);
7947
7948 /* Create file... */
7949 FILE *out;
7950 if (!(out = fopen(filename, "w")))
7951 ERRMSG("Cannot create file!");
7952
7953 /* Write binary data... */
7954 FWRITE(&tbl->np[id][ig], int,
7955 1,
7956 out);
7957 FWRITE(tbl->p[id][ig], double,
7958 (size_t) tbl->np[id][ig],
7959 out);
7960 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
7961 FWRITE(&tbl->nt[id][ig][ip], int,
7962 1,
7963 out);
7964 FWRITE(tbl->t[id][ig][ip], double,
7965 (size_t) tbl->nt[id][ig][ip],
7966 out);
7967 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
7968 FWRITE(&tbl->nu[id][ig][ip][it], int,
7969 1,
7970 out);
7971 FWRITE(tbl->u[id][ig][ip][it], float,
7972 (size_t) tbl->nu[id][ig][ip][it],
7973 out);
7974 FWRITE(tbl->eps[id][ig][ip][it], float,
7975 (size_t) tbl->nu[id][ig][ip][it],
7976 out);
7977 }
7978 }
7979
7980 /* Close file... */
7981 fclose(out);
7982 }
7983}
7984
7985/*****************************************************************************/
7986
7988 const ctl_t *ctl,
7989 const tbl_t *tbl) {
7990
7991 /* Loop over emitters... */
7992 for (int ig = 0; ig < ctl->ng; ig++) {
7993
7994 /* Construct filename... */
7995 char filename[2 * LEN];
7996 sprintf(filename, "%s_%s.tbl", ctl->tblbase, ctl->emitter[ig]);
7997
7998 /* Try to open existing file first... */
7999 tbl_gas_t gas;
8000 if (read_tbl_gas_open(filename, &gas) != 0) {
8001 LOG(1, "Gas file does not exist, creating: %s", filename);
8002
8003 /* Create with capacity for all frequencies... */
8004 if (write_tbl_gas_create(filename) != 0)
8005 ERRMSG("Cannot create gas table file!");
8006
8007 /* Now open it... */
8008 if (read_tbl_gas_open(filename, &gas) != 0)
8009 ERRMSG("Cannot open newly created gas table file!");
8010 }
8011
8012 /* Loop over frequencies... */
8013 for (int id = 0; id < ctl->nd; id++) {
8014
8015 /* Write one frequency table block into the gas file... */
8016 if (write_tbl_gas_single(&gas, ctl->nu[id], tbl, id, ig) != 0)
8017 ERRMSG("Error writing table block!");
8018 }
8019
8020 /* Close gas-table file (flushes index)... */
8021 read_tbl_gas_close(&gas);
8022 }
8023}
8024
8025/*****************************************************************************/
8026
8028 const char *path) {
8029
8030 /* Open file... */
8031 FILE *fp = fopen(path, "wb+");
8032 if (!fp)
8033 return -1;
8034
8035 const char magic[4] = { 'G', 'T', 'L', '1' };
8036 int32_t ntables = 0;
8037
8038 /* Write header... */
8039 FWRITE(magic, char,
8040 4,
8041 fp);
8042 FWRITE(&ntables, int32_t, 1, fp);
8043
8044 /* Zeroed index... */
8045 tbl_gas_index_t zero = { 0 };
8046 for (int i = 0; i < MAX_TABLES; i++)
8047 FWRITE(&zero, tbl_gas_index_t, 1, fp);
8048
8049 /* Close file... */
8050 fflush(fp);
8051 fclose(fp);
8052
8053 return 0;
8054}
8055
8056/*****************************************************************************/
8057
8059 tbl_gas_t *g,
8060 const double freq,
8061 const tbl_t *tbl,
8062 const int id,
8063 const int ig) {
8064
8065 int idx = -1;
8066
8067 /* Check if a table for this frequency already exists... */
8068 for (int i = 0; i < g->ntables; i++) {
8069 if (g->index[i].freq == freq) {
8070 idx = i;
8071 break;
8072 }
8073 }
8074
8075 /* New entry if not found... */
8076 if (idx < 0) {
8077 idx = g->ntables++;
8078 if (g->ntables > MAX_TABLES)
8079 ERRMSG("Gas table index overflow!");
8080 }
8081
8082 /* Append payload block at end of file... */
8083 if (fseek(g->fp, 0, SEEK_END) != 0)
8084 ERRMSG("Seek error in write_tbl_gas_single_flat!");
8085
8086 int64_t offset = (int64_t) ftell(g->fp);
8087 if (offset < 0)
8088 ERRMSG("ftell failed in write_tbl_gas_single_flat!");
8089
8090 long start = ftell(g->fp);
8091 if (start < 0)
8092 ERRMSG("ftell failed at payload start!");
8093
8094 /* Write number of pressures... */
8095 FWRITE(&tbl->np[id][ig], int,
8096 1,
8097 g->fp);
8098
8099 /* Write pressure grid... */
8100 FWRITE(tbl->p[id][ig], double,
8101 (size_t) tbl->np[id][ig],
8102 g->fp);
8103
8104 /* Loop over pressure levels... */
8105 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
8106
8107 /* Write number of temperatures... */
8108 FWRITE(&tbl->nt[id][ig][ip], int,
8109 1,
8110 g->fp);
8111
8112 /* Write temperature grid... */
8113 FWRITE(tbl->t[id][ig][ip], double,
8114 (size_t) tbl->nt[id][ig][ip],
8115 g->fp);
8116
8117 /* Loop over temperature levels... */
8118 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
8119
8120 /* Write number of u points... */
8121 FWRITE(&tbl->nu[id][ig][ip][it], int,
8122 1,
8123 g->fp);
8124
8125 /* Write u array... */
8126 FWRITE(tbl->u[id][ig][ip][it], float,
8127 (size_t) tbl->nu[id][ig][ip][it],
8128 g->fp);
8129
8130 /* Write emissivity array... */
8131 FWRITE(tbl->eps[id][ig][ip][it], float,
8132 (size_t) tbl->nu[id][ig][ip][it],
8133 g->fp);
8134 }
8135 }
8136
8137 /* Update index entry... */
8138 long end = ftell(g->fp);
8139 if (end < 0)
8140 ERRMSG("ftell failed at payload end!");
8141
8142 int64_t size = (int64_t) (end - start);
8143
8144 g->index[idx].freq = freq;
8145 g->index[idx].offset = offset;
8146 g->index[idx].size = size;
8147
8148 g->dirty = 1;
8149
8150 return 0;
8151}
8152
8153/*****************************************************************************/
8154
8156 const ctl_t *ctl,
8157 const gsl_vector *x,
8158 atm_t *atm) {
8159
8160 size_t n = 0;
8161
8162 /* Get pressure... */
8163 for (int ip = 0; ip < atm->np; ip++)
8164 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
8165 x2atm_help(&atm->p[ip], x, &n);
8166
8167 /* Get temperature... */
8168 for (int ip = 0; ip < atm->np; ip++)
8169 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
8170 x2atm_help(&atm->t[ip], x, &n);
8171
8172 /* Get volume mixing ratio... */
8173 for (int ig = 0; ig < ctl->ng; ig++)
8174 for (int ip = 0; ip < atm->np; ip++)
8175 if (atm->z[ip] >= ctl->retq_zmin[ig]
8176 && atm->z[ip] <= ctl->retq_zmax[ig])
8177 x2atm_help(&atm->q[ig][ip], x, &n);
8178
8179 /* Get extinction... */
8180 for (int iw = 0; iw < ctl->nw; iw++)
8181 for (int ip = 0; ip < atm->np; ip++)
8182 if (atm->z[ip] >= ctl->retk_zmin[iw]
8183 && atm->z[ip] <= ctl->retk_zmax[iw])
8184 x2atm_help(&atm->k[iw][ip], x, &n);
8185
8186 /* Get cloud data... */
8187 if (ctl->ret_clz)
8188 x2atm_help(&atm->clz, x, &n);
8189 if (ctl->ret_cldz)
8190 x2atm_help(&atm->cldz, x, &n);
8191 if (ctl->ret_clk)
8192 for (int icl = 0; icl < ctl->ncl; icl++)
8193 x2atm_help(&atm->clk[icl], x, &n);
8194
8195 /* Get surface data... */
8196 if (ctl->ret_sft)
8197 x2atm_help(&atm->sft, x, &n);
8198 if (ctl->ret_sfeps)
8199 for (int isf = 0; isf < ctl->nsf; isf++)
8200 x2atm_help(&atm->sfeps[isf], x, &n);
8201}
8202
8203/*****************************************************************************/
8204
8206 double *value,
8207 const gsl_vector *x,
8208 size_t *n) {
8209
8210 /* Get state vector element... */
8211 *value = gsl_vector_get(x, *n);
8212 (*n)++;
8213}
8214
8215/*****************************************************************************/
8216
8218 const ctl_t *ctl,
8219 const gsl_vector *y,
8220 obs_t *obs) {
8221
8222 size_t m = 0;
8223
8224 /* Decompose measurement vector... */
8225 for (int ir = 0; ir < obs->nr; ir++)
8226 for (int id = 0; id < ctl->nd; id++)
8227 if (isfinite(obs->rad[id][ir])) {
8228 obs->rad[id][ir] = gsl_vector_get(y, m);
8229 m++;
8230 }
8231}
void analyze_avk(const ret_t *ret, const ctl_t *ctl, const atm_t *atm, const int *iqa, const int *ipa, const gsl_matrix *avk)
Analyze averaging kernel (AVK) matrix for retrieval diagnostics.
Definition: jurassic.c:29
void read_tbl_bin(const ctl_t *ctl, tbl_t *tbl, const int id, const int ig)
Read a single binary emissivity lookup table.
Definition: jurassic.c:6235
double cost_function(const gsl_vector *dx, const gsl_vector *dy, const gsl_matrix *s_a_inv, const gsl_vector *sig_eps_inv)
Compute the normalized quadratic cost function for optimal estimation.
Definition: jurassic.c:1179
double read_obs_rfm(const char *basename, const double z, const double *nu, const double *f, const int n)
Read and spectrally convolve an RFM output spectrum.
Definition: jurassic.c:5871
void read_matrix(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
Definition: jurassic.c:5552
void timer(const char *name, const char *file, const char *func, int line, int mode)
Simple wall-clock timer for runtime diagnostics.
Definition: jurassic.c:6764
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:5982
double cos_sza(const double sec, const double lon, const double lat)
Calculates the cosine of the solar zenith angle.
Definition: jurassic.c:1138
void read_atm_bin(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in binary format.
Definition: jurassic.c:5239
void write_obs_asc(const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data to an ASCII text file.
Definition: jurassic.c:7502
void write_atm(const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data to a file.
Definition: jurassic.c:6802
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4458
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:4140
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:3695
double ctmo2(const double nu, const double p, const double t)
Compute O₂ collision-induced absorption coefficient.
Definition: jurassic.c:3196
void write_obs_nc(const char *filename, const ctl_t *ctl, const obs_t *obs, const int profile)
Write one observation profile to a NetCDF file.
Definition: jurassic.c:7626
int write_tbl_gas_single(tbl_gas_t *g, const double freq, const tbl_t *tbl, const int id, const int ig)
Append or overwrite a single frequency-table block in a per-gas file.
Definition: jurassic.c:8058
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3933
int read_tbl_gas_single(const tbl_gas_t *g, const double freq, tbl_t *tbl, const int id, const int ig)
Read one emissivity table block from a per-gas table file.
Definition: jurassic.c:6387
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
Definition: jurassic.c:5434
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:3459
void read_obs_bin(const char *filename, const ctl_t *ctl, obs_t *obs)
Read binary-formatted observation data from a file.
Definition: jurassic.c:5718
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:4873
void matrix_product(const gsl_matrix *a, const gsl_vector *b, const int transpose, gsl_matrix *c)
Compute structured matrix products of the form or .
Definition: jurassic.c:4529
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4428
void write_tbl_asc(const ctl_t *ctl, const tbl_t *tbl)
Write all lookup tables in human-readable ASCII format.
Definition: jurassic.c:7887
void day2doy(int year, int mon, int day, int *doy)
Convert a calendar date to day-of-year.
Definition: jurassic.c:3346
void write_atm_nc(const char *filename, const ctl_t *ctl, const atm_t *atm, int profile)
Write one atmospheric profile to a netCDF file.
Definition: jurassic.c:7024
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:6733
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Map retrieval state vector back to atmospheric structure.
Definition: jurassic.c:8155
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:2075
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:4051
void write_tbl_bin(const ctl_t *ctl, const tbl_t *tbl)
Write all lookup tables in compact binary format.
Definition: jurassic.c:7932
void write_atm_rfm(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric profile in RFM-compatible format.
Definition: jurassic.c:7209
void set_cov_meas(const ret_t *ret, const ctl_t *ctl, const obs_t *obs, gsl_vector *sig_noise, gsl_vector *sig_formod, gsl_vector *sig_eps_inv)
Construct measurement error standard deviations and their inverse.
Definition: jurassic.c:6645
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:4268
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:4236
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Write all emissivity lookup tables in the format specified by the control structure.
Definition: jurassic.c:7864
void write_tbl_gas(const ctl_t *ctl, const tbl_t *tbl)
Write lookup tables into per-gas binary table files with indexed blocks.
Definition: jurassic.c:7987
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:4026
void read_tbl_gas(const ctl_t *ctl, tbl_t *tbl, const int id, const int ig)
Read one frequency block from a per-gas binary table file.
Definition: jurassic.c:6295
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
Definition: jurassic.c:3396
void optimal_estimation(ret_t *ret, ctl_t *ctl, tbl_t *tbl, obs_t *obs_meas, obs_t *obs_i, atm_t *atm_apr, atm_t *atm_i, double *chisq)
Perform optimal estimation retrieval using Levenberg–Marquardt minimization.
Definition: jurassic.c:4601
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:6689
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:3560
double ctmco2(const double nu, const double p, const double t, const double u)
Compute carbon dioxide continuum (optical depth).
Definition: jurassic.c:1212
void write_atm_asc(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data to an ASCII file.
Definition: jurassic.c:6873
void read_atm(const char *dirname, const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric input data from a file.
Definition: jurassic.c:5109
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:3308
void read_obs(const char *dirname, const char *filename, const ctl_t *ctl, obs_t *obs)
Read observation data from an input file.
Definition: jurassic.c:5592
void write_obs(const char *dirname, const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data to an output file in ASCII or binary format.
Definition: jurassic.c:7425
void write_obs_bin(const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data in binary format to a file.
Definition: jurassic.c:7558
void x2atm_help(double *value, const gsl_vector *x, size_t *n)
Helper function to extract a single value from the retrieval state vector.
Definition: jurassic.c:8205
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:3495
void doy2day(int year, int doy, int *mon, int *day)
Convert a day-of-year value to a calendar date.
Definition: jurassic.c:3366
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:4333
void read_obs_nc(const char *filename, const ctl_t *ctl, obs_t *obs, const int profile)
Read one observation profile from a NetCDF file.
Definition: jurassic.c:5796
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize the source-function (Planck radiance) lookup table.
Definition: jurassic.c:3972
void matrix_invert(gsl_matrix *a)
Invert a square matrix, optimized for diagonal or symmetric positive-definite matrices.
Definition: jurassic.c:4499
void read_ret(int argc, char *argv[], const ctl_t *ctl, ret_t *ret)
Read retrieval configuration and error parameters.
Definition: jurassic.c:5929
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:6465
void write_shape(const char *filename, const double *x, const double *y, const int n)
Write tabulated shape function data to a text file.
Definition: jurassic.c:7801
void formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
Execute the selected forward model.
Definition: jurassic.c:3409
void read_atm_asc(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in ASCII format.
Definition: jurassic.c:5187
void read_tbl_asc(const ctl_t *ctl, tbl_t *tbl, const int id, const int ig)
Read a single ASCII emissivity lookup table.
Definition: jurassic.c:6137
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:3836
void analyze_avk_quantity(const gsl_matrix *avk, const int iq, const int *ipa, const size_t *n0, const size_t *n1, double *cont, double *res)
Analyze averaging kernel submatrix for a specific retrieved quantity.
Definition: jurassic.c:86
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:4300
tbl_t * read_tbl(const ctl_t *ctl)
Read all emissivity lookup tables for all gases and frequencies.
Definition: jurassic.c:6085
void read_atm_nc(const char *filename, const ctl_t *ctl, atm_t *atm, int profile)
Read one atmospheric profile from a netCDF file.
Definition: jurassic.c:5333
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:3258
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:4574
void y2obs(const ctl_t *ctl, const gsl_vector *y, obs_t *obs)
Copy elements from the measurement vector y into the observation structure.
Definition: jurassic.c:8217
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3873
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:6043
double ctmn2(const double nu, const double p, const double t)
Compute N₂ collision-induced absorption coefficient.
Definition: jurassic.c:3127
int read_tbl_gas_close(tbl_gas_t *g)
Close a per-gas binary table file and optionally rewrite metadata.
Definition: jurassic.c:6325
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
int read_tbl_gas_open(const char *path, tbl_gas_t *g)
Open a per-gas binary table file for reading and writing.
Definition: jurassic.c:6358
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:3853
void write_matrix(const char *dirname, const char *filename, const ctl_t *ctl, const gsl_matrix *matrix, const atm_t *atm, const obs_t *obs, const char *rowspace, const char *colspace, const char *sort)
Write a fully annotated matrix (e.g., Jacobian or gain matrix) to file.
Definition: jurassic.c:7247
void set_cov_apr(const ret_t *ret, const ctl_t *ctl, const atm_t *atm, const int *iqa, const int *ipa, gsl_matrix *s_a)
Construct the a priori covariance matrix for retrieval parameters.
Definition: jurassic.c:6534
void write_stddev(const char *quantity, const ret_t *ret, const ctl_t *ctl, const atm_t *atm, const gsl_matrix *s)
Write retrieval standard deviation profiles to disk.
Definition: jurassic.c:7831
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4477
void write_atm_bin(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data to a binary file.
Definition: jurassic.c:6940
void read_obs_asc(const char *filename, const ctl_t *ctl, obs_t *obs)
Read ASCII-formatted observation data from a file.
Definition: jurassic.c:5673
int write_tbl_gas_create(const char *path)
Create a new per-gas table file with an empty index.
Definition: jurassic.c:8027
JURASSIC library declarations.
#define N
Maximum size of state vector.
Definition: jurassic.h:278
#define IDXCLZ
Index for cloud layer height.
Definition: jurassic.h:348
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:268
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:189
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
Definition: jurassic.h:413
#define P0
Standard pressure [hPa].
Definition: jurassic.h:184
#define KB
Boltzmann constant [kg m^2/(K s^2)].
Definition: jurassic.h:159
#define POW2(x)
Compute the square of a value.
Definition: jurassic.h:967
#define NFOV
Number of ray paths used for FOV calculations.
Definition: jurassic.h:298
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
Definition: jurassic.h:526
#define NC(cmd)
Execute a NetCDF command and check for errors.
Definition: jurassic.h:645
#define DOTP(a, b)
Compute dot product of two 3D vectors.
Definition: jurassic.h:483
#define O2
Oxygen concentration.
Definition: jurassic.h:179
#define UMAX
Maximum column density [molecules/cm^2].
Definition: jurassic.h:224
#define MIN(a, b)
Determine the minimum of two values.
Definition: jurassic.h:632
#define IDXCLDZ
Index for cloud layer depth.
Definition: jurassic.h:351
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition: jurassic.h:1162
#define NC_PUT_INT(varname, ptr, hyperslab)
Write integer data to a NetCDF variable.
Definition: jurassic.h:805
#define RFMNPTS
Maximum number of RFM spectral grid points.
Definition: jurassic.h:328
#define IDXK(iw)
Indices for extinction.
Definition: jurassic.h:345
#define M
Maximum size of measurement vector.
Definition: jurassic.h:273
#define G0
Standard gravity [m/s^2].
Definition: jurassic.h:149
#define NQ
Maximum number of quantities.
Definition: jurassic.h:283
#define ND
Maximum number of radiance channels.
Definition: jurassic.h:238
#define NA
Avogadro's number.
Definition: jurassic.h:169
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
Definition: jurassic.h:593
#define MAX_TABLES
Maximum number of frequency-table entries allowed in a gas table file.
Definition: jurassic.h:323
#define NSHAPE
Maximum number of shape function grid points.
Definition: jurassic.h:293
#define IDXSFT
Index for surface layer temperature.
Definition: jurassic.h:357
#define RI
Ideal gas constant [J/(mol K)].
Definition: jurassic.h:194
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
Definition: jurassic.h:922
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
Definition: jurassic.h:360
#define IDXCLK(icl)
Indices for cloud layer extinction.
Definition: jurassic.h:354
#define LOGX(x0, y0, x1, y1, x)
Compute logarithmic interpolation in x.
Definition: jurassic.h:570
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
Definition: jurassic.h:1048
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:1129
#define TBLNU
Maximum number of column densities in emissivity tables.
Definition: jurassic.h:313
#define IDXP
Index for pressure.
Definition: jurassic.h:336
#define ALLOC(ptr, type, n)
Allocate memory for an array.
Definition: jurassic.h:383
#define DEG2RAD(deg)
Convert degrees to radians.
Definition: jurassic.h:430
#define TSUN
Effective temperature of the sun [K].
Definition: jurassic.h:214
#define RAD2DEG(rad)
Convert radians to degrees.
Definition: jurassic.h:996
#define TBLNT
Maximum number of temperatures in emissivity tables.
Definition: jurassic.h:308
#define NP
Maximum number of atmospheric data points.
Definition: jurassic.h:248
#define POW3(x)
Compute the cube of a value.
Definition: jurassic.h:980
#define PLANCK(T, nu)
Compute spectral radiance using Planck’s law.
Definition: jurassic.h:953
#define NG
Maximum number of emitters.
Definition: jurassic.h:243
#define EPSMAX
Maximum emissivity.
Definition: jurassic.h:144
#define LOG(level,...)
Print a log message with a specified logging level.
Definition: jurassic.h:1092
#define TBLNS
Maximum number of source function temperature levels.
Definition: jurassic.h:318
#define NC_DEF_VAR(varname, type, ndims, dims, long_name, units, level, quant)
Define a NetCDF variable with attributes.
Definition: jurassic.h:674
#define N2
Nitrogen concentration.
Definition: jurassic.h:174
#define REFRAC(p, T)
Compute air refractivity (n - 1).
Definition: jurassic.h:1012
#define TBLNP
Maximum number of pressure levels in emissivity tables.
Definition: jurassic.h:303
#define NSF
Maximum number of surface layer spectral grid points.
Definition: jurassic.h:258
#define NCL
Maximum number of cloud layer spectral grid points.
Definition: jurassic.h:233
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
Definition: jurassic.h:448
#define NC_PUT_DOUBLE(varname, ptr, hyperslab)
Write double precision data to a NetCDF variable.
Definition: jurassic.h:758
#define FREAD(ptr, type, size, out)
Read binary data from a file.
Definition: jurassic.h:503
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:549
#define NLOS
Maximum number of LOS points.
Definition: jurassic.h:288
#define NR
Maximum number of ray paths.
Definition: jurassic.h:253
#define IDXQ(ig)
Indices for volume mixing ratios.
Definition: jurassic.h:342
#define TMAX
Maximum temperature for source function [K].
Definition: jurassic.h:209
#define TMIN
Minimum temperature for source function [K].
Definition: jurassic.h:204
#define NW
Maximum number of spectral windows.
Definition: jurassic.h:263
#define MAX(a, b)
Determine the maximum of two values.
Definition: jurassic.h:614
#define IDXT
Index for temperature.
Definition: jurassic.h:339
Atmospheric profile data.
Definition: jurassic.h:1212
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1218
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:1254
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:1239
double lat[NP]
Latitude [deg].
Definition: jurassic.h:1227
double lon[NP]
Longitude [deg].
Definition: jurassic.h:1224
double t[NP]
Temperature [K].
Definition: jurassic.h:1233
double clz
Cloud layer height [km].
Definition: jurassic.h:1242
int np
Number of data points.
Definition: jurassic.h:1215
double cldz
Cloud layer depth [km].
Definition: jurassic.h:1245
double sft
Surface temperature [K].
Definition: jurassic.h:1251
double z[NP]
Altitude [km].
Definition: jurassic.h:1221
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:1248
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:1236
double p[NP]
Pressure [hPa].
Definition: jurassic.h:1230
Control parameters.
Definition: jurassic.h:1265
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1406
int nw
Number of spectral windows.
Definition: jurassic.h:1292
int atmfmt
Atmospheric data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1322
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1364
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:1289
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:1274
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1385
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1307
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1415
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1316
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1412
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1328
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1331
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1373
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1400
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1397
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1388
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1337
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1352
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1418
int window[ND]
Window index of each channel.
Definition: jurassic.h:1295
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1334
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1409
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1379
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1376
int ng
Number of emitters.
Definition: jurassic.h:1268
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1301
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1343
int ig_o2
Emitter index of O2.
Definition: jurassic.h:1283
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1370
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1313
int nd
Number of radiance channels.
Definition: jurassic.h:1286
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1361
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1310
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1382
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1298
int ig_n2
Emitter index of N2.
Definition: jurassic.h:1280
int obsfmt
Observation data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1325
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1355
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1340
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1394
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:1271
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1304
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1346
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1391
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:1277
int tblfmt
Look-up table file format (1=ASCII, 2=binary).
Definition: jurassic.h:1319
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1349
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1403
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1358
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1367
Line-of-sight data.
Definition: jurassic.h:1429
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1435
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1477
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1474
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1450
double sft
Surface temperature [K].
Definition: jurassic.h:1456
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1471
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1438
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1462
int np
Number of LOS points.
Definition: jurassic.h:1432
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1465
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1441
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1480
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1453
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1459
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1468
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1447
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1444
Observation geometry and radiance data.
Definition: jurassic.h:1491
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1527
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1530
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1521
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1509
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1515
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1503
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1506
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1500
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1524
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1512
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1497
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1518
int nr
Number of ray paths.
Definition: jurassic.h:1494
Retrieval control parameters.
Definition: jurassic.h:1543
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1570
double err_press
Pressure error [%].
Definition: jurassic.h:1567
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1597
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1558
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1600
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1579
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1561
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1555
double err_temp
Temperature error [K].
Definition: jurassic.h:1576
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1588
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1564
double err_clz
Cloud height error [km].
Definition: jurassic.h:1603
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1612
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1609
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1582
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1549
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1552
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1606
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1573
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1591
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1585
char dir[LEN]
Working directory.
Definition: jurassic.h:1546
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1615
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1594
On-disk index entry describing one frequency table block in a gas file.
Definition: jurassic.h:1662
int64_t offset
Byte offset in file where the serialized block begins.
Definition: jurassic.h:1668
int64_t size
Size of the serialized block (in bytes).
Definition: jurassic.h:1671
double freq
Frequency identifier ν_j for this table block.
Definition: jurassic.h:1665
In-memory representation of an open per-gas lookup-table file.
Definition: jurassic.h:1682
FILE * fp
Open file handle ("rb+"), NULL if not open.
Definition: jurassic.h:1685
int dirty
Definition: jurassic.h:1694
int32_t ntables
Number of index entries currently in use.
Definition: jurassic.h:1688
tbl_gas_index_t * index
In-memory index table of length MAX_TABLES.
Definition: jurassic.h:1691
Emissivity look-up tables.
Definition: jurassic.h:1625
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1652
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1637
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1634
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1631
float eps[ND][NG][TBLNP][TBLNT][TBLNU]
Emissivity.
Definition: jurassic.h:1646
float u[ND][NG][TBLNP][TBLNT][TBLNU]
Column density [molecules/cm^2].
Definition: jurassic.h:1643
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1640
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1649
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1628