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 /* Allocate... */
38 atm_t *atm_cont, *atm_res;
39 ALLOC(atm_cont, atm_t, 1);
40 ALLOC(atm_res, atm_t, 1);
41
42 /* Get sizes... */
43 const size_t n = avk->size1;
44
45 /* Find sub-matrices for different quantities... */
46 size_t n0[NQ], n1[NQ];
47 for (int iq = 0; iq < NQ; iq++) {
48 n0[iq] = N;
49 for (size_t i = 0; i < n; i++) {
50 if (iqa[i] == iq && n0[iq] == N)
51 n0[iq] = i;
52 if (iqa[i] == iq)
53 n1[iq] = i - n0[iq] + 1;
54 }
55 }
56
57 /* Initialize... */
58 copy_atm(ctl, atm_cont, atm, 1);
59 copy_atm(ctl, atm_res, atm, 1);
60
61 /* Analyze quantities... */
62 analyze_avk_quantity(avk, IDXP, ipa, n0, n1, atm_cont->p, atm_res->p);
63 analyze_avk_quantity(avk, IDXT, ipa, n0, n1, atm_cont->t, atm_res->t);
64 for (int ig = 0; ig < ctl->ng; ig++)
65 analyze_avk_quantity(avk, IDXQ(ig), ipa, n0, n1,
66 atm_cont->q[ig], atm_res->q[ig]);
67 for (int iw = 0; iw < ctl->nw; iw++)
68 analyze_avk_quantity(avk, IDXK(iw), ipa, n0, n1,
69 atm_cont->k[iw], atm_res->k[iw]);
70 analyze_avk_quantity(avk, IDXCLZ, ipa, n0, n1, &atm_cont->clz,
71 &atm_res->clz);
72 analyze_avk_quantity(avk, IDXCLDZ, ipa, n0, n1, &atm_cont->cldz,
73 &atm_res->cldz);
74 for (int icl = 0; icl < ctl->ncl; icl++)
75 analyze_avk_quantity(avk, IDXCLK(icl), ipa, n0, n1,
76 &atm_cont->clk[icl], &atm_res->clk[icl]);
77 analyze_avk_quantity(avk, IDXSFT, ipa, n0, n1, &atm_cont->sft,
78 &atm_res->sft);
79 for (int isf = 0; isf < ctl->nsf; isf++)
80 analyze_avk_quantity(avk, IDXSFEPS(isf), ipa, n0, n1,
81 &atm_cont->sfeps[isf], &atm_res->sfeps[isf]);
82
83 /* Write results to disk... */
84 const char *dirname;
85 int profile;
86 const char *filename =
87 shared_io_output_target(ret, ret->shared_io_atm_cont_file, "atm_cont.tab",
88 &dirname, &profile);
89 write_atm(dirname, filename, ctl, atm_cont, profile);
91 "atm_res.tab", &dirname, &profile);
92 write_atm(dirname, filename, ctl, atm_res, profile);
93
94 /* Free... */
95 free(atm_cont);
96 free(atm_res);
97}
98
99/*****************************************************************************/
100
102 const gsl_matrix *avk,
103 const int iq,
104 const int *ipa,
105 const size_t *n0,
106 const size_t *n1,
107 double *cont,
108 double *res) {
109
110 /* Loop over state vector elements... */
111 if (n0[iq] < N)
112 for (size_t i = 0; i < n1[iq]; i++) {
113
114 /* Get area of averaging kernel... */
115 for (size_t j = 0; j < n1[iq]; j++)
116 cont[ipa[n0[iq] + i]] += gsl_matrix_get(avk, n0[iq] + i, n0[iq] + j);
117
118 /* Get information density... */
119 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
120 }
121}
122
123/*****************************************************************************/
124
125size_t atm2x(
126 const ctl_t *ctl,
127 const atm_t *atm,
128 gsl_vector *x,
129 int *iqa,
130 int *ipa) {
131
132 size_t n = 0;
133
134 /* Add pressure... */
135 for (int ip = 0; ip < atm->np; ip++)
136 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
137 atm2x_help(atm->p[ip], IDXP, ip, x, iqa, ipa, &n);
138
139 /* Add temperature... */
140 for (int ip = 0; ip < atm->np; ip++)
141 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
142 atm2x_help(atm->t[ip], IDXT, ip, x, iqa, ipa, &n);
143
144 /* Add volume mixing ratios... */
145 for (int ig = 0; ig < ctl->ng; ig++)
146 for (int ip = 0; ip < atm->np; ip++)
147 if (atm->z[ip] >= ctl->retq_zmin[ig]
148 && atm->z[ip] <= ctl->retq_zmax[ig])
149 atm2x_help(atm->q[ig][ip], IDXQ(ig), ip, x, iqa, ipa, &n);
150
151 /* Add extinction... */
152 for (int iw = 0; iw < ctl->nw; iw++)
153 for (int ip = 0; ip < atm->np; ip++)
154 if (atm->z[ip] >= ctl->retk_zmin[iw]
155 && atm->z[ip] <= ctl->retk_zmax[iw])
156 atm2x_help(atm->k[iw][ip], IDXK(iw), ip, x, iqa, ipa, &n);
157
158 /* Add cloud variables... */
159 if (ctl->ret_clz)
160 atm2x_help(atm->clz, IDXCLZ, 0, x, iqa, ipa, &n);
161 if (ctl->ret_cldz)
162 atm2x_help(atm->cldz, IDXCLDZ, 0, x, iqa, ipa, &n);
163 if (ctl->ret_clk)
164 for (int icl = 0; icl < ctl->ncl; icl++)
165 atm2x_help(atm->clk[icl], IDXCLK(icl), 0, x, iqa, ipa, &n);
166
167 /* Add surface variables... */
168 if (ctl->ret_sft)
169 atm2x_help(atm->sft, IDXSFT, 0, x, iqa, ipa, &n);
170 if (ctl->ret_sfeps)
171 for (int isf = 0; isf < ctl->nsf; isf++)
172 atm2x_help(atm->sfeps[isf], IDXSFEPS(isf), 0, x, iqa, ipa, &n);
173
174 return n;
175}
176
177/*****************************************************************************/
178
180 const double value,
181 const int value_iqa,
182 const int value_ip,
183 gsl_vector *x,
184 int *iqa,
185 int *ipa,
186 size_t *n) {
187
188 /* Add element to state vector... */
189 if (x != NULL)
190 gsl_vector_set(x, *n, value);
191 if (iqa != NULL)
192 iqa[*n] = value_iqa;
193 if (ipa != NULL)
194 ipa[*n] = value_ip;
195 (*n)++;
196}
197
198/*****************************************************************************/
199
201 const double *x,
202 double *z,
203 double *lon,
204 double *lat) {
205
206 const double radius = NORM(x);
207
208 *lat = RAD2DEG(asin(x[2] / radius));
209 *lon = RAD2DEG(atan2(x[1], x[0]));
210 *z = radius - RE;
211}
212
213/*****************************************************************************/
214
216 const ctl_t *ctl,
217 atm_t *atm) {
218
219 static const double z[121] = {
220 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
221 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
222 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
223 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
224 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
225 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
226 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
227 };
228
229 static const double pre[121] = {
230 1017, 901.083, 796.45, 702.227, 617.614, 541.644, 473.437, 412.288,
231 357.603, 308.96, 265.994, 228.348, 195.619, 167.351, 143.039, 122.198,
232 104.369, 89.141, 76.1528, 65.0804, 55.641, 47.591, 40.7233, 34.8637,
233 29.8633, 25.5956, 21.9534, 18.8445, 16.1909, 13.9258, 11.9913,
234 10.34, 8.92988, 7.72454, 6.6924, 5.80701, 5.04654, 4.39238, 3.82902,
235 3.34337, 2.92413, 2.56128, 2.2464, 1.97258, 1.73384, 1.52519, 1.34242,
236 1.18197, 1.04086, 0.916546, 0.806832, 0.709875, 0.624101, 0.548176,
237 0.480974, 0.421507, 0.368904, 0.322408, 0.281386, 0.245249, 0.213465,
238 0.185549, 0.161072, 0.139644, 0.120913, 0.104568, 0.0903249, 0.0779269,
239 0.0671493, 0.0577962, 0.0496902, 0.0426736, 0.0366093, 0.0313743,
240 0.0268598, 0.0229699, 0.0196206, 0.0167399, 0.0142646, 0.0121397,
241 0.0103181, 0.00875775, 0.00742226, 0.00628076, 0.00530519, 0.00447183,
242 0.00376124, 0.00315632, 0.00264248, 0.00220738, 0.00184003, 0.00153095,
243 0.00127204, 0.00105608, 0.000876652, 0.00072798, 0.00060492,
244 0.000503201, 0.000419226, 0.000349896, 0.000292659, 0.000245421,
245 0.000206394, 0.000174125, 0.000147441, 0.000125333, 0.000106985,
246 9.173e-05, 7.90172e-05, 6.84172e-05, 5.95574e-05, 5.21183e-05,
247 4.58348e-05, 4.05127e-05, 3.59987e-05, 3.21583e-05, 2.88718e-05,
248 2.60322e-05, 2.35687e-05, 2.14263e-05, 1.95489e-05
249 };
250
251 static const double tem[121] = {
252 285.14, 279.34, 273.91, 268.3, 263.24, 256.55, 250.2, 242.82, 236.17,
253 229.87, 225.04, 221.19, 218.85, 217.19, 216.2, 215.68, 215.42, 215.55,
254 215.92, 216.4, 216.93, 217.45, 218, 218.68, 219.39, 220.25, 221.3,
255 222.41, 223.88, 225.42, 227.2, 229.52, 231.89, 234.51, 236.85, 239.42,
256 241.94, 244.57, 247.36, 250.32, 253.34, 255.82, 258.27, 260.39,
257 262.03, 263.45, 264.2, 264.78, 264.67, 264.38, 263.24, 262.03, 260.02,
258 258.09, 255.63, 253.28, 250.43, 247.81, 245.26, 242.77, 240.38,
259 237.94, 235.79, 233.53, 231.5, 229.53, 227.6, 225.62, 223.77, 222.06,
260 220.33, 218.69, 217.18, 215.64, 214.13, 212.52, 210.86, 209.25,
261 207.49, 205.81, 204.11, 202.22, 200.32, 198.39, 195.92, 193.46,
262 190.94, 188.31, 185.82, 183.57, 181.43, 179.74, 178.64, 178.1, 178.25,
263 178.7, 179.41, 180.67, 182.31, 184.18, 186.6, 189.53, 192.66, 196.54,
264 201.13, 205.93, 211.73, 217.86, 225, 233.53, 242.57, 252.14, 261.48,
265 272.97, 285.26, 299.12, 312.2, 324.17, 338.34, 352.56, 365.28
266 };
267
268 static const double c2h2[121] = {
269 1.352e-09, 2.83e-10, 1.269e-10, 6.926e-11, 4.346e-11, 2.909e-11,
270 2.014e-11, 1.363e-11, 8.71e-12, 5.237e-12, 2.718e-12, 1.375e-12,
271 5.786e-13, 2.16e-13, 7.317e-14, 2.551e-14, 1.055e-14, 4.758e-15,
272 2.056e-15, 7.703e-16, 2.82e-16, 1.035e-16, 4.382e-17, 1.946e-17,
273 9.638e-18, 5.2e-18, 2.811e-18, 1.494e-18, 7.925e-19, 4.213e-19,
274 1.998e-19, 8.78e-20, 3.877e-20, 1.728e-20, 7.743e-21, 3.536e-21,
275 1.623e-21, 7.508e-22, 3.508e-22, 1.65e-22, 7.837e-23, 3.733e-23,
276 1.808e-23, 8.77e-24, 4.285e-24, 2.095e-24, 1.032e-24, 5.082e-25,
277 2.506e-25, 1.236e-25, 6.088e-26, 2.996e-26, 1.465e-26, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
281 };
282
283 static const double c2h6[121] = {
284 2.667e-09, 2.02e-09, 1.658e-09, 1.404e-09, 1.234e-09, 1.109e-09,
285 1.012e-09, 9.262e-10, 8.472e-10, 7.71e-10, 6.932e-10, 6.216e-10,
286 5.503e-10, 4.87e-10, 4.342e-10, 3.861e-10, 3.347e-10, 2.772e-10,
287 2.209e-10, 1.672e-10, 1.197e-10, 8.536e-11, 5.783e-11, 3.846e-11,
288 2.495e-11, 1.592e-11, 1.017e-11, 6.327e-12, 3.895e-12, 2.403e-12,
289 1.416e-12, 8.101e-13, 4.649e-13, 2.686e-13, 1.557e-13, 9.14e-14,
290 5.386e-14, 3.19e-14, 1.903e-14, 1.14e-14, 6.875e-15, 4.154e-15,
291 2.538e-15, 1.553e-15, 9.548e-16, 5.872e-16, 3.63e-16, 2.244e-16,
292 1.388e-16, 8.587e-17, 5.308e-17, 3.279e-17, 2.017e-17, 1.238e-17,
293 7.542e-18, 4.585e-18, 2.776e-18, 1.671e-18, 9.985e-19, 5.937e-19,
294 3.518e-19, 2.07e-19, 1.215e-19, 7.06e-20, 4.097e-20, 2.37e-20,
295 1.363e-20, 7.802e-21, 4.441e-21, 2.523e-21, 1.424e-21, 8.015e-22,
296 4.497e-22, 2.505e-22, 1.391e-22, 7.691e-23, 4.238e-23, 2.331e-23,
297 1.274e-23, 6.929e-24, 3.752e-24, 2.02e-24, 1.083e-24, 5.774e-25,
298 3.041e-25, 1.593e-25, 8.308e-26, 4.299e-26, 2.195e-26, 1.112e-26,
299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0
301 };
302
303 static const double ccl4[121] = {
304 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10,
305 1.075e-10, 1.075e-10, 1.075e-10, 1.06e-10, 1.024e-10, 9.69e-11,
306 8.93e-11, 8.078e-11, 7.213e-11, 6.307e-11, 5.383e-11, 4.49e-11,
307 3.609e-11, 2.705e-11, 1.935e-11, 1.385e-11, 8.35e-12, 5.485e-12,
308 3.853e-12, 2.22e-12, 5.875e-13, 3.445e-13, 1.015e-13, 6.075e-14,
309 4.383e-14, 2.692e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
310 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
311 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
312 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
313 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
314 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
315 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
316 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
317 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
318 1e-14, 1e-14, 1e-14
319 };
320
321 static const double ch3oh[121] = {
322 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10,
323 5.01099e-10, 5.50999e-10, 5.7313e-10, 5.75638e-10, 5.4086e-10,
324 4.77601e-10, 4.12907e-10, 3.6274e-10, 3.26448e-10, 2.9706e-10,
325 2.27698e-10, 1.96999e-10, 1.66212e-10, 1.17941e-10, 1.19844e-10,
326 1.11211e-10, 1.02714e-10, 9.86138e-11, 9.45133e-11, 9.04127e-11,
327 8.05243e-11, 6.3678e-11, 4.68317e-11, 4.00618e-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, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
332 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
333 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
334 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
335 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
336 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
337 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
338 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
339 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
340 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
341 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
342 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
343 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
344 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
345 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
346 3.95786e-11
347 };
348
349 static const double ch4[121] = {
350 1.864e-06, 1.835e-06, 1.819e-06, 1.805e-06, 1.796e-06, 1.788e-06,
351 1.782e-06, 1.776e-06, 1.769e-06, 1.761e-06, 1.749e-06, 1.734e-06,
352 1.716e-06, 1.692e-06, 1.654e-06, 1.61e-06, 1.567e-06, 1.502e-06,
353 1.433e-06, 1.371e-06, 1.323e-06, 1.277e-06, 1.232e-06, 1.188e-06,
354 1.147e-06, 1.108e-06, 1.07e-06, 1.027e-06, 9.854e-07, 9.416e-07,
355 8.933e-07, 8.478e-07, 7.988e-07, 7.515e-07, 7.07e-07, 6.64e-07,
356 6.239e-07, 5.864e-07, 5.512e-07, 5.184e-07, 4.87e-07, 4.571e-07,
357 4.296e-07, 4.04e-07, 3.802e-07, 3.578e-07, 3.383e-07, 3.203e-07,
358 3.032e-07, 2.889e-07, 2.76e-07, 2.635e-07, 2.519e-07, 2.409e-07,
359 2.302e-07, 2.219e-07, 2.144e-07, 2.071e-07, 1.999e-07, 1.93e-07,
360 1.862e-07, 1.795e-07, 1.731e-07, 1.668e-07, 1.607e-07, 1.548e-07,
361 1.49e-07, 1.434e-07, 1.38e-07, 1.328e-07, 1.277e-07, 1.227e-07,
362 1.18e-07, 1.134e-07, 1.089e-07, 1.046e-07, 1.004e-07, 9.635e-08,
363 9.245e-08, 8.867e-08, 8.502e-08, 8.15e-08, 7.809e-08, 7.48e-08,
364 7.159e-08, 6.849e-08, 6.55e-08, 6.262e-08, 5.98e-08, 5.708e-08,
365 5.448e-08, 5.194e-08, 4.951e-08, 4.72e-08, 4.5e-08, 4.291e-08,
366 4.093e-08, 3.905e-08, 3.729e-08, 3.563e-08, 3.408e-08, 3.265e-08,
367 3.128e-08, 2.996e-08, 2.87e-08, 2.76e-08, 2.657e-08, 2.558e-08,
368 2.467e-08, 2.385e-08, 2.307e-08, 2.234e-08, 2.168e-08, 2.108e-08,
369 2.05e-08, 1.998e-08, 1.947e-08, 1.902e-08, 1.86e-08, 1.819e-08,
370 1.782e-08
371 };
372
373 static const double clo[121] = {
374 7.419e-15, 1.061e-14, 1.518e-14, 2.195e-14, 3.175e-14, 4.666e-14,
375 6.872e-14, 1.03e-13, 1.553e-13, 2.375e-13, 3.664e-13, 5.684e-13,
376 8.915e-13, 1.402e-12, 2.269e-12, 4.125e-12, 7.501e-12, 1.257e-11,
377 2.048e-11, 3.338e-11, 5.44e-11, 8.846e-11, 1.008e-10, 1.082e-10,
378 1.157e-10, 1.232e-10, 1.312e-10, 1.539e-10, 1.822e-10, 2.118e-10,
379 2.387e-10, 2.687e-10, 2.875e-10, 3.031e-10, 3.23e-10, 3.648e-10,
380 4.117e-10, 4.477e-10, 4.633e-10, 4.794e-10, 4.95e-10, 5.104e-10,
381 5.259e-10, 5.062e-10, 4.742e-10, 4.443e-10, 4.051e-10, 3.659e-10,
382 3.305e-10, 2.911e-10, 2.54e-10, 2.215e-10, 1.927e-10, 1.675e-10,
383 1.452e-10, 1.259e-10, 1.09e-10, 9.416e-11, 8.119e-11, 6.991e-11,
384 6.015e-11, 5.163e-11, 4.43e-11, 3.789e-11, 3.24e-11, 2.769e-11,
385 2.361e-11, 2.011e-11, 1.71e-11, 1.453e-11, 1.233e-11, 1.045e-11,
386 8.851e-12, 7.48e-12, 6.316e-12, 5.326e-12, 4.487e-12, 3.778e-12,
387 3.176e-12, 2.665e-12, 2.234e-12, 1.87e-12, 1.563e-12, 1.304e-12,
388 1.085e-12, 9.007e-13, 7.468e-13, 6.179e-13, 5.092e-13, 4.188e-13,
389 3.442e-13, 2.816e-13, 2.304e-13, 1.885e-13, 1.542e-13, 1.263e-13,
390 1.035e-13, 8.5e-14, 7.004e-14, 5.783e-14, 4.795e-14, 4.007e-14,
391 3.345e-14, 2.792e-14, 2.33e-14, 1.978e-14, 1.686e-14, 1.438e-14,
392 1.234e-14, 1.07e-14, 9.312e-15, 8.131e-15, 7.164e-15, 6.367e-15,
393 5.67e-15, 5.088e-15, 4.565e-15, 4.138e-15, 3.769e-15, 3.432e-15,
394 3.148e-15
395 };
396
397 static const double clono2[121] = {
398 1.011e-13, 1.515e-13, 2.272e-13, 3.446e-13, 5.231e-13, 8.085e-13,
399 1.253e-12, 1.979e-12, 3.149e-12, 5.092e-12, 8.312e-12, 1.366e-11,
400 2.272e-11, 3.791e-11, 6.209e-11, 9.101e-11, 1.334e-10, 1.951e-10,
401 2.853e-10, 3.94e-10, 4.771e-10, 5.771e-10, 6.675e-10, 7.665e-10,
402 8.504e-10, 8.924e-10, 9.363e-10, 8.923e-10, 8.411e-10, 7.646e-10,
403 6.525e-10, 5.576e-10, 4.398e-10, 3.403e-10, 2.612e-10, 1.915e-10,
404 1.407e-10, 1.028e-10, 7.455e-11, 5.42e-11, 3.708e-11, 2.438e-11,
405 1.618e-11, 1.075e-11, 7.17e-12, 4.784e-12, 3.205e-12, 2.147e-12,
406 1.44e-12, 9.654e-13, 6.469e-13, 4.332e-13, 2.891e-13, 1.926e-13,
407 1.274e-13, 8.422e-14, 5.547e-14, 3.636e-14, 2.368e-14, 1.536e-14,
408 9.937e-15, 6.39e-15, 4.101e-15, 2.61e-15, 1.659e-15, 1.052e-15,
409 6.638e-16, 4.172e-16, 2.61e-16, 1.63e-16, 1.013e-16, 6.275e-17,
410 3.879e-17, 2.383e-17, 1.461e-17, 8.918e-18, 5.43e-18, 3.301e-18,
411 1.997e-18, 1.203e-18, 7.216e-19, 4.311e-19, 2.564e-19, 1.519e-19,
412 8.911e-20, 5.203e-20, 3.026e-20, 1.748e-20, 9.99e-21, 5.673e-21,
413 3.215e-21, 1.799e-21, 1.006e-21, 5.628e-22, 3.146e-22, 1.766e-22,
414 9.94e-23, 5.614e-23, 3.206e-23, 1.841e-23, 1.071e-23, 6.366e-24,
415 3.776e-24, 2.238e-24, 1.326e-24, 8.253e-25, 5.201e-25, 3.279e-25,
416 2.108e-25, 1.395e-25, 9.326e-26, 6.299e-26, 4.365e-26, 3.104e-26,
417 2.219e-26, 1.621e-26, 1.185e-26, 8.92e-27, 6.804e-27, 5.191e-27,
418 4.041e-27
419 };
420
421 static const double co[121] = {
422 1.907e-07, 1.553e-07, 1.362e-07, 1.216e-07, 1.114e-07, 1.036e-07,
423 9.737e-08, 9.152e-08, 8.559e-08, 7.966e-08, 7.277e-08, 6.615e-08,
424 5.884e-08, 5.22e-08, 4.699e-08, 4.284e-08, 3.776e-08, 3.274e-08,
425 2.845e-08, 2.479e-08, 2.246e-08, 2.054e-08, 1.991e-08, 1.951e-08,
426 1.94e-08, 2.009e-08, 2.1e-08, 2.201e-08, 2.322e-08, 2.45e-08,
427 2.602e-08, 2.73e-08, 2.867e-08, 2.998e-08, 3.135e-08, 3.255e-08,
428 3.352e-08, 3.426e-08, 3.484e-08, 3.53e-08, 3.593e-08, 3.671e-08,
429 3.759e-08, 3.945e-08, 4.192e-08, 4.49e-08, 5.03e-08, 5.703e-08,
430 6.538e-08, 7.878e-08, 9.644e-08, 1.196e-07, 1.498e-07, 1.904e-07,
431 2.422e-07, 3.055e-07, 3.804e-07, 4.747e-07, 5.899e-07, 7.272e-07,
432 8.91e-07, 1.071e-06, 1.296e-06, 1.546e-06, 1.823e-06, 2.135e-06,
433 2.44e-06, 2.714e-06, 2.967e-06, 3.189e-06, 3.391e-06, 3.58e-06,
434 3.773e-06, 4.022e-06, 4.346e-06, 4.749e-06, 5.199e-06, 5.668e-06,
435 6.157e-06, 6.688e-06, 7.254e-06, 7.867e-06, 8.539e-06, 9.26e-06,
436 1.009e-05, 1.119e-05, 1.228e-05, 1.365e-05, 1.506e-05, 1.641e-05,
437 1.784e-05, 1.952e-05, 2.132e-05, 2.323e-05, 2.531e-05, 2.754e-05,
438 3.047e-05, 3.459e-05, 3.922e-05, 4.439e-05, 4.825e-05, 5.077e-05,
439 5.34e-05, 5.618e-05, 5.909e-05, 6.207e-05, 6.519e-05, 6.845e-05,
440 6.819e-05, 6.726e-05, 6.622e-05, 6.512e-05, 6.671e-05, 6.862e-05,
441 7.048e-05, 7.264e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05
442 };
443
444 static const double cof2[121] = {
445 7.5e-14, 1.055e-13, 1.485e-13, 2.111e-13, 3.001e-13, 4.333e-13,
446 6.269e-13, 9.221e-13, 1.364e-12, 2.046e-12, 3.093e-12, 4.703e-12,
447 7.225e-12, 1.113e-11, 1.66e-11, 2.088e-11, 2.626e-11, 3.433e-11,
448 4.549e-11, 5.886e-11, 7.21e-11, 8.824e-11, 1.015e-10, 1.155e-10,
449 1.288e-10, 1.388e-10, 1.497e-10, 1.554e-10, 1.606e-10, 1.639e-10,
450 1.64e-10, 1.64e-10, 1.596e-10, 1.542e-10, 1.482e-10, 1.382e-10,
451 1.289e-10, 1.198e-10, 1.109e-10, 1.026e-10, 9.484e-11, 8.75e-11,
452 8.086e-11, 7.49e-11, 6.948e-11, 6.446e-11, 5.961e-11, 5.505e-11,
453 5.085e-11, 4.586e-11, 4.1e-11, 3.665e-11, 3.235e-11, 2.842e-11,
454 2.491e-11, 2.11e-11, 1.769e-11, 1.479e-11, 1.197e-11, 9.631e-12,
455 7.74e-12, 6.201e-12, 4.963e-12, 3.956e-12, 3.151e-12, 2.507e-12,
456 1.99e-12, 1.576e-12, 1.245e-12, 9.83e-13, 7.742e-13, 6.088e-13,
457 4.782e-13, 3.745e-13, 2.929e-13, 2.286e-13, 1.782e-13, 1.388e-13,
458 1.079e-13, 8.362e-14, 6.471e-14, 4.996e-14, 3.85e-14, 2.96e-14,
459 2.265e-14, 1.729e-14, 1.317e-14, 9.998e-15, 7.549e-15, 5.683e-15,
460 4.273e-15, 3.193e-15, 2.385e-15, 1.782e-15, 1.331e-15, 9.957e-16,
461 7.461e-16, 5.601e-16, 4.228e-16, 3.201e-16, 2.438e-16, 1.878e-16,
462 1.445e-16, 1.111e-16, 8.544e-17, 6.734e-17, 5.341e-17, 4.237e-17,
463 3.394e-17, 2.759e-17, 2.254e-17, 1.851e-17, 1.54e-17, 1.297e-17,
464 1.096e-17, 9.365e-18, 8e-18, 6.938e-18, 6.056e-18, 5.287e-18,
465 4.662e-18
466 };
467
468 static const double f11[121] = {
469 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10,
470 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.635e-10, 2.536e-10,
471 2.44e-10, 2.348e-10, 2.258e-10, 2.153e-10, 2.046e-10, 1.929e-10,
472 1.782e-10, 1.648e-10, 1.463e-10, 1.291e-10, 1.1e-10, 8.874e-11,
473 7.165e-11, 5.201e-11, 3.744e-11, 2.577e-11, 1.64e-11, 1.048e-11,
474 5.993e-12, 3.345e-12, 1.839e-12, 9.264e-13, 4.688e-13, 2.329e-13,
475 1.129e-13, 5.505e-14, 2.825e-14, 1.492e-14, 7.997e-15, 5.384e-15,
476 3.988e-15, 2.955e-15, 2.196e-15, 1.632e-15, 1.214e-15, 9.025e-16,
477 6.708e-16, 4.984e-16, 3.693e-16, 2.733e-16, 2.013e-16, 1.481e-16,
478 1.087e-16, 7.945e-17, 5.782e-17, 4.195e-17, 3.038e-17, 2.19e-17,
479 1.577e-17, 1.128e-17, 8.063e-18, 5.753e-18, 4.09e-18, 2.899e-18,
480 2.048e-18, 1.444e-18, 1.015e-18, 7.12e-19, 4.985e-19, 3.474e-19,
481 2.417e-19, 1.677e-19, 1.161e-19, 8.029e-20, 5.533e-20, 3.799e-20,
482 2.602e-20, 1.776e-20, 1.209e-20, 8.202e-21, 5.522e-21, 3.707e-21,
483 2.48e-21, 1.652e-21, 1.091e-21, 7.174e-22, 4.709e-22, 3.063e-22,
484 1.991e-22, 1.294e-22, 8.412e-23, 5.483e-23, 3.581e-23, 2.345e-23,
485 1.548e-23, 1.027e-23, 6.869e-24, 4.673e-24, 3.173e-24, 2.153e-24,
486 1.461e-24, 1.028e-24, 7.302e-25, 5.188e-25, 3.739e-25, 2.753e-25,
487 2.043e-25, 1.528e-25, 1.164e-25, 9.041e-26, 7.051e-26, 5.587e-26,
488 4.428e-26, 3.588e-26, 2.936e-26, 2.402e-26, 1.995e-26
489 };
490
491 static const double f113[121] = {
492 1.9e-11, 1.9e-11, 1.899e-11, 1.899e-11, 1.898e-11, 1.898e-11,
493 1.897e-11, 1.896e-11, 1.895e-11, 1.894e-11, 1.893e-11, 1.89e-11,
494 1.887e-11, 1.871e-11, 1.854e-11, 1.803e-11, 1.751e-11, 1.664e-11,
495 1.576e-11, 1.466e-11, 1.356e-11, 1.236e-11, 1.116e-11, 9.931e-12,
496 8.702e-12, 7.515e-12, 6.4238e-12, 5.3326e-12, 4.3652e-12, 3.5216e-12,
497 2.678e-12, 2.1532e-12, 1.6284e-12, 1.2202e-12, 9.286e-13, 6.37e-13,
498 4.95e-13, 3.53e-13, 2.5004e-13, 1.8612e-13, 1.222e-13, 9.704e-14,
499 7.188e-14, 5.3338e-14, 4.1414e-14, 2.949e-14, 2.3722e-14, 1.7954e-14,
500 1.37794e-14, 1.11982e-14, 8.617e-15, 7.6036e-15, 6.5902e-15,
501 5.5768e-15, 4.5634e-15, 3.55e-15, 3.1008e-15, 2.6516e-15, 2.2024e-15,
502 1.7532e-15, 1.304e-15, 1.1354e-15, 9.668e-16, 7.982e-16, 6.296e-16,
503 4.61e-16, 3.9734e-16, 3.3368e-16, 2.7002e-16, 2.0636e-16, 1.427e-16,
504 1.22804e-16, 1.02908e-16, 8.3012e-17, 6.3116e-17, 4.322e-17,
505 3.6838e-17, 3.0456e-17, 2.4074e-17, 1.7692e-17, 1.131e-17,
506 9.6202e-18, 7.9304e-18, 6.2406e-18, 4.5508e-18, 2.861e-18,
507 2.40476e-18, 1.94852e-18, 1.49228e-18, 1.03604e-18, 5.798e-19,
508 4.8502e-19, 3.9024e-19, 2.9546e-19, 2.0068e-19, 1.059e-19,
509 8.7084e-20, 6.8268e-20, 4.9452e-20, 3.0636e-20, 1.182e-20,
510 9.64344e-21, 7.46688e-21, 5.29032e-21, 3.11376e-21, 9.372e-22,
511 7.5685e-22, 5.765e-22, 3.9615e-22, 2.158e-22, 3.545e-23,
512 2.86046e-23, 2.17592e-23, 1.49138e-23, 8.0684e-24, 1.223e-24,
513 9.92358e-25, 7.61716e-25, 5.31074e-25, 3.00432e-25, 6.979e-26
514 };
515
516 static const double f114[121] = {
517 1.2e-11, 1.2e-11, 1.2e-11, 1.2e-11, 1.199e-11, 1.199e-11,
518 1.199e-11, 1.199e-11, 1.198e-11, 1.198e-11, 1.198e-11, 1.197e-11,
519 1.196e-11, 1.191e-11, 1.185e-11, 1.167e-11, 1.149e-11, 1.12e-11,
520 1.09e-11, 1.053e-11, 1.015e-11, 9.731e-12, 9.311e-12, 8.865e-12,
521 8.419e-12, 7.949e-12, 7.4774e-12, 7.0058e-12, 6.54e-12, 6.08e-12,
522 5.62e-12, 5.1908e-12, 4.7616e-12, 4.3622e-12, 3.9926e-12, 3.623e-12,
523 3.3274e-12, 3.0318e-12, 2.7702e-12, 2.5426e-12, 2.315e-12, 2.1514e-12,
524 1.9878e-12, 1.8448e-12, 1.7224e-12, 1.6e-12, 1.51e-12, 1.42e-12,
525 1.3462e-12, 1.2886e-12, 1.231e-12, 1.1922e-12, 1.1534e-12, 1.1146e-12,
526 1.0758e-12, 1.037e-12, 1.0025e-12, 9.68e-13, 9.335e-13, 8.99e-13,
527 8.645e-13, 8.344e-13, 8.043e-13, 7.742e-13, 7.441e-13, 7.14e-13,
528 6.8718e-13, 6.6036e-13, 6.3354e-13, 6.0672e-13, 5.799e-13, 5.5612e-13,
529 5.3234e-13, 5.0856e-13, 4.8478e-13, 4.61e-13, 4.394e-13, 4.178e-13,
530 3.962e-13, 3.746e-13, 3.53e-13, 3.3288e-13, 3.1276e-13, 2.9264e-13,
531 2.7252e-13, 2.524e-13, 2.3368e-13, 2.1496e-13, 1.9624e-13, 1.7752e-13,
532 1.588e-13, 1.4221e-13, 1.2562e-13, 1.0903e-13, 9.244e-14, 7.585e-14,
533 6.4942e-14, 5.4034e-14, 4.3126e-14, 3.2218e-14, 2.131e-14, 1.76694e-14,
534 1.40288e-14, 1.03882e-14, 6.7476e-15, 3.107e-15, 2.52738e-15,
535 1.94776e-15, 1.36814e-15, 7.8852e-16, 2.089e-16, 1.69288e-16,
536 1.29676e-16, 9.0064e-17, 5.0452e-17, 1.084e-17, 8.85136e-18,
537 6.86272e-18, 4.87408e-18, 2.88544e-18, 8.968e-19
538 };
539
540 static const double f12[121] = {
541 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10,
542 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.429e-10, 5.291e-10,
543 5.155e-10, 5.022e-10, 4.893e-10, 4.772e-10, 4.655e-10, 4.497e-10,
544 4.249e-10, 4.015e-10, 3.632e-10, 3.261e-10, 2.858e-10, 2.408e-10,
545 2.03e-10, 1.685e-10, 1.4e-10, 1.163e-10, 9.65e-11, 8.02e-11, 6.705e-11,
546 5.624e-11, 4.764e-11, 4.249e-11, 3.792e-11, 3.315e-11, 2.819e-11,
547 2.4e-11, 1.999e-11, 1.64e-11, 1.352e-11, 1.14e-11, 9.714e-12,
548 8.28e-12, 7.176e-12, 6.251e-12, 5.446e-12, 4.72e-12, 4.081e-12,
549 3.528e-12, 3.08e-12, 2.699e-12, 2.359e-12, 2.111e-12, 1.901e-12,
550 1.709e-12, 1.534e-12, 1.376e-12, 1.233e-12, 1.103e-12, 9.869e-13,
551 8.808e-13, 7.859e-13, 7.008e-13, 6.241e-13, 5.553e-13, 4.935e-13,
552 4.383e-13, 3.889e-13, 3.447e-13, 3.054e-13, 2.702e-13, 2.389e-13,
553 2.11e-13, 1.862e-13, 1.643e-13, 1.448e-13, 1.274e-13, 1.121e-13,
554 9.844e-14, 8.638e-14, 7.572e-14, 6.62e-14, 5.782e-14, 5.045e-14,
555 4.394e-14, 3.817e-14, 3.311e-14, 2.87e-14, 2.48e-14, 2.142e-14,
556 1.851e-14, 1.599e-14, 1.383e-14, 1.196e-14, 1.036e-14, 9e-15,
557 7.828e-15, 6.829e-15, 5.992e-15, 5.254e-15, 4.606e-15, 4.037e-15,
558 3.583e-15, 3.19e-15, 2.841e-15, 2.542e-15, 2.291e-15, 2.07e-15,
559 1.875e-15, 1.71e-15, 1.57e-15, 1.442e-15, 1.333e-15, 1.232e-15,
560 1.147e-15, 1.071e-15, 1.001e-15, 9.396e-16
561 };
562
563 static const double f14[121] = {
564 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11,
565 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 8.91e-11, 8.73e-11, 8.46e-11,
566 8.19e-11, 7.92e-11, 7.74e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
567 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
568 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
569 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
570 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
571 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
572 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
573 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
574 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
575 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
576 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
577 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
578 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
579 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
580 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11
581 };
582
583 static const double f22[121] = {
584 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10,
585 1.4e-10, 1.4e-10, 1.4e-10, 1.372e-10, 1.317e-10, 1.235e-10, 1.153e-10,
586 1.075e-10, 1.002e-10, 9.332e-11, 8.738e-11, 8.194e-11, 7.7e-11,
587 7.165e-11, 6.753e-11, 6.341e-11, 5.971e-11, 5.6e-11, 5.229e-11,
588 4.859e-11, 4.488e-11, 4.118e-11, 3.83e-11, 3.568e-11, 3.308e-11,
589 3.047e-11, 2.82e-11, 2.594e-11, 2.409e-11, 2.237e-11, 2.065e-11,
590 1.894e-11, 1.771e-11, 1.647e-11, 1.532e-11, 1.416e-11, 1.332e-11,
591 1.246e-11, 1.161e-11, 1.087e-11, 1.017e-11, 9.471e-12, 8.853e-12,
592 8.235e-12, 7.741e-12, 7.247e-12, 6.836e-12, 6.506e-12, 6.176e-12,
593 5.913e-12, 5.65e-12, 5.419e-12, 5.221e-12, 5.024e-12, 4.859e-12,
594 4.694e-12, 4.546e-12, 4.414e-12, 4.282e-12, 4.15e-12, 4.019e-12,
595 3.903e-12, 3.805e-12, 3.706e-12, 3.607e-12, 3.508e-12, 3.41e-12,
596 3.31e-12, 3.212e-12, 3.129e-12, 3.047e-12, 2.964e-12, 2.882e-12,
597 2.8e-12, 2.734e-12, 2.668e-12, 2.602e-12, 2.537e-12, 2.471e-12,
598 2.421e-12, 2.372e-12, 2.322e-12, 2.273e-12, 2.224e-12, 2.182e-12,
599 2.141e-12, 2.1e-12, 2.059e-12, 2.018e-12, 1.977e-12, 1.935e-12,
600 1.894e-12, 1.853e-12, 1.812e-12, 1.77e-12, 1.73e-12, 1.688e-12,
601 1.647e-12, 1.606e-12, 1.565e-12, 1.524e-12, 1.483e-12, 1.441e-12,
602 1.4e-12, 1.359e-12, 1.317e-12, 1.276e-12, 1.235e-12, 1.194e-12,
603 1.153e-12, 1.112e-12, 1.071e-12, 1.029e-12, 9.883e-13
604 };
605
606 static const double h2co[121] = {
607 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11,
608 8.71857e-11, 7.72315e-11, 6.85464e-11, 6.0758e-11, 5.32087e-11,
609 4.5719e-11, 3.79458e-11, 3.07607e-11, 2.46025e-11, 1.94038e-11,
610 1.40882e-11, 1.0623e-11, 8.35457e-12, 6.87427e-12, 7.09071e-12,
611 8.96183e-12, 1.09012e-11, 1.50545e-11, 1.92077e-11, 2.3361e-11,
612 2.7054e-11, 3.01936e-11, 3.33333e-11, 3.69281e-11, 4.08069e-11,
613 4.57318e-11, 5.1348e-11, 5.69642e-11, 6.33173e-11, 6.98984e-11,
614 7.63144e-11, 8.22774e-11, 8.82405e-11, 9.3746e-11, 9.92074e-11,
615 1.04669e-10, 1.10055e-10, 1.15293e-10, 1.20531e-10, 1.26293e-10,
616 1.32585e-10, 1.35966e-10, 1.36242e-10, 1.36519e-10, 1.61155e-10,
617 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
618 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
619 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
620 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
621 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
622 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
623 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
624 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
625 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
626 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
627 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
628 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
629 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
630 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
631 1.99157e-10
632 };
633
634 static const double h2o[121] = {
635 0.01166, 0.008269, 0.005742, 0.003845, 0.00277, 0.001897, 0.001272,
636 0.000827, 0.000539, 0.0003469, 0.0001579, 3.134e-05, 1.341e-05,
637 6.764e-06, 4.498e-06, 3.703e-06, 3.724e-06, 3.899e-06, 4.002e-06,
638 4.122e-06, 4.277e-06, 4.438e-06, 4.558e-06, 4.673e-06, 4.763e-06,
639 4.809e-06, 4.856e-06, 4.936e-06, 5.021e-06, 5.114e-06, 5.222e-06,
640 5.331e-06, 5.414e-06, 5.488e-06, 5.563e-06, 5.633e-06, 5.704e-06,
641 5.767e-06, 5.819e-06, 5.872e-06, 5.914e-06, 5.949e-06, 5.984e-06,
642 6.015e-06, 6.044e-06, 6.073e-06, 6.104e-06, 6.136e-06, 6.167e-06,
643 6.189e-06, 6.208e-06, 6.226e-06, 6.212e-06, 6.185e-06, 6.158e-06,
644 6.114e-06, 6.066e-06, 6.018e-06, 5.877e-06, 5.728e-06, 5.582e-06,
645 5.437e-06, 5.296e-06, 5.156e-06, 5.02e-06, 4.886e-06, 4.754e-06,
646 4.625e-06, 4.498e-06, 4.374e-06, 4.242e-06, 4.096e-06, 3.955e-06,
647 3.817e-06, 3.683e-06, 3.491e-06, 3.204e-06, 2.94e-06, 2.696e-06,
648 2.47e-06, 2.252e-06, 2.019e-06, 1.808e-06, 1.618e-06, 1.445e-06,
649 1.285e-06, 1.105e-06, 9.489e-07, 8.121e-07, 6.938e-07, 5.924e-07,
650 5.04e-07, 4.288e-07, 3.648e-07, 3.103e-07, 2.642e-07, 2.252e-07,
651 1.921e-07, 1.643e-07, 1.408e-07, 1.211e-07, 1.048e-07, 9.063e-08,
652 7.835e-08, 6.774e-08, 5.936e-08, 5.221e-08, 4.592e-08, 4.061e-08,
653 3.62e-08, 3.236e-08, 2.902e-08, 2.62e-08, 2.383e-08, 2.171e-08,
654 1.989e-08, 1.823e-08, 1.684e-08, 1.562e-08, 1.449e-08, 1.351e-08
655 };
656
657 static const double h2o2[121] = {
658 1.779e-10, 7.938e-10, 8.953e-10, 8.032e-10, 6.564e-10, 5.159e-10,
659 4.003e-10, 3.026e-10, 2.222e-10, 1.58e-10, 1.044e-10, 6.605e-11,
660 3.413e-11, 1.453e-11, 1.062e-11, 1.009e-11, 9.597e-12, 1.175e-11,
661 1.572e-11, 2.091e-11, 2.746e-11, 3.603e-11, 4.791e-11, 6.387e-11,
662 8.239e-11, 1.007e-10, 1.23e-10, 1.363e-10, 1.489e-10, 1.585e-10,
663 1.608e-10, 1.632e-10, 1.576e-10, 1.502e-10, 1.423e-10, 1.302e-10,
664 1.192e-10, 1.085e-10, 9.795e-11, 8.854e-11, 8.057e-11, 7.36e-11,
665 6.736e-11, 6.362e-11, 6.087e-11, 5.825e-11, 5.623e-11, 5.443e-11,
666 5.27e-11, 5.098e-11, 4.931e-11, 4.769e-11, 4.611e-11, 4.458e-11,
667 4.308e-11, 4.102e-11, 3.887e-11, 3.682e-11, 3.521e-11, 3.369e-11,
668 3.224e-11, 3.082e-11, 2.946e-11, 2.814e-11, 2.687e-11, 2.566e-11,
669 2.449e-11, 2.336e-11, 2.227e-11, 2.123e-11, 2.023e-11, 1.927e-11,
670 1.835e-11, 1.746e-11, 1.661e-11, 1.58e-11, 1.502e-11, 1.428e-11,
671 1.357e-11, 1.289e-11, 1.224e-11, 1.161e-11, 1.102e-11, 1.045e-11,
672 9.895e-12, 9.369e-12, 8.866e-12, 8.386e-12, 7.922e-12, 7.479e-12,
673 7.06e-12, 6.656e-12, 6.274e-12, 5.914e-12, 5.575e-12, 5.257e-12,
674 4.959e-12, 4.679e-12, 4.42e-12, 4.178e-12, 3.954e-12, 3.75e-12,
675 3.557e-12, 3.372e-12, 3.198e-12, 3.047e-12, 2.908e-12, 2.775e-12,
676 2.653e-12, 2.544e-12, 2.442e-12, 2.346e-12, 2.26e-12, 2.183e-12,
677 2.11e-12, 2.044e-12, 1.98e-12, 1.924e-12, 1.871e-12, 1.821e-12,
678 1.775e-12
679 };
680
681 static const double hcl[121] = {
682 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11,
683 3.70385e-11, 2.21247e-11, 1.88117e-11, 2.36957e-11, 3.72192e-11,
684 5.79399e-11, 8.04158e-11, 1.01779e-10, 1.2301e-10, 1.53924e-10,
685 1.93737e-10, 2.5561e-10, 3.84228e-10, 6.18248e-10, 6.31222e-10,
686 7.84907e-10, 9.36932e-10, 1.03508e-09, 1.13323e-09, 1.23138e-09,
687 1.31985e-09, 1.39669e-09, 1.47352e-09, 1.56375e-09, 1.66234e-09,
688 1.78086e-09, 1.91256e-09, 2.04425e-09, 2.16629e-09, 2.28535e-09,
689 2.39439e-09, 2.47597e-09, 2.55755e-09, 2.60873e-09, 2.65696e-09,
690 2.70519e-09, 2.75658e-09, 2.81422e-09, 2.87187e-09, 2.94013e-09,
691 3.01911e-09, 3.09497e-09, 3.16749e-09, 3.24001e-09, 3.30525e-09,
692 3.3665e-09, 3.42424e-09, 3.4619e-09, 3.49956e-09, 3.52273e-09,
693 3.54214e-09, 3.56154e-09, 3.57918e-09, 3.59049e-09, 3.6018e-09,
694 3.6132e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
695 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
696 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
697 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
698 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
699 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
700 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
701 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
702 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
703 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
704 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
705 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
706 3.62476e-09
707 };
708
709 static const double hcn[121] = {
710 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10,
711 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.498e-10, 5.495e-10, 5.493e-10,
712 5.49e-10, 5.488e-10, 4.717e-10, 3.946e-10, 3.174e-10, 2.4e-10,
713 1.626e-10, 1.619e-10, 1.612e-10, 1.602e-10, 1.593e-10, 1.582e-10,
714 1.572e-10, 1.56e-10, 1.549e-10, 1.539e-10, 1.53e-10, 1.519e-10,
715 1.506e-10, 1.487e-10, 1.467e-10, 1.449e-10, 1.43e-10, 1.413e-10,
716 1.397e-10, 1.382e-10, 1.368e-10, 1.354e-10, 1.337e-10, 1.315e-10,
717 1.292e-10, 1.267e-10, 1.241e-10, 1.215e-10, 1.19e-10, 1.165e-10,
718 1.141e-10, 1.118e-10, 1.096e-10, 1.072e-10, 1.047e-10, 1.021e-10,
719 9.968e-11, 9.739e-11, 9.539e-11, 9.339e-11, 9.135e-11, 8.898e-11,
720 8.664e-11, 8.439e-11, 8.249e-11, 8.075e-11, 7.904e-11, 7.735e-11,
721 7.565e-11, 7.399e-11, 7.245e-11, 7.109e-11, 6.982e-11, 6.863e-11,
722 6.755e-11, 6.657e-11, 6.587e-11, 6.527e-11, 6.476e-11, 6.428e-11,
723 6.382e-11, 6.343e-11, 6.307e-11, 6.272e-11, 6.238e-11, 6.205e-11,
724 6.17e-11, 6.137e-11, 6.102e-11, 6.072e-11, 6.046e-11, 6.03e-11,
725 6.018e-11, 6.01e-11, 6.001e-11, 5.992e-11, 5.984e-11, 5.975e-11,
726 5.967e-11, 5.958e-11, 5.95e-11, 5.941e-11, 5.933e-11, 5.925e-11,
727 5.916e-11, 5.908e-11, 5.899e-11, 5.891e-11, 5.883e-11, 5.874e-11,
728 5.866e-11, 5.858e-11, 5.85e-11, 5.841e-11, 5.833e-11, 5.825e-11,
729 5.817e-11, 5.808e-11, 5.8e-11, 5.792e-11, 5.784e-11
730 };
731
732 static const double hf[121] = {
733 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
734 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
735 2.64279e-11, 2.64279e-11, 2.64279e-11, 3.86691e-11, 5.22002e-11,
736 6.92471e-11, 9.13979e-11, 1.37918e-10, 2.24918e-10, 2.29824e-10,
737 2.94241e-10, 3.58363e-10, 4.12881e-10, 4.67399e-10, 5.21917e-10,
738 5.74229e-10, 6.23889e-10, 6.73549e-10, 7.24119e-10, 7.75256e-10,
739 8.319e-10, 8.92185e-10, 9.52469e-10, 1.01325e-09, 1.07419e-09,
740 1.13565e-09, 1.19856e-09, 1.26146e-09, 1.31439e-09, 1.36635e-09,
741 1.41831e-09, 1.46549e-09, 1.50321e-09, 1.54093e-09, 1.57986e-09,
742 1.62e-09, 1.66286e-09, 1.70863e-09, 1.75439e-09, 1.79827e-09,
743 1.84111e-09, 1.88125e-09, 1.90603e-09, 1.93081e-09, 1.9413e-09,
744 1.94807e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
745 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
746 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
747 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
748 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
749 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
750 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
751 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
752 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
753 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
754 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
755 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
756 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
757 1.95485e-09
758 };
759
760 static const double hno3[121] = {
761 1.809e-10, 7.234e-10, 5.899e-10, 4.342e-10, 3.277e-10, 2.661e-10,
762 2.35e-10, 2.267e-10, 2.389e-10, 2.651e-10, 3.255e-10, 4.099e-10,
763 5.42e-10, 6.978e-10, 8.807e-10, 1.112e-09, 1.405e-09, 2.04e-09,
764 3.111e-09, 4.5e-09, 5.762e-09, 7.37e-09, 7.852e-09, 8.109e-09,
765 8.067e-09, 7.554e-09, 7.076e-09, 6.268e-09, 5.524e-09, 4.749e-09,
766 3.909e-09, 3.223e-09, 2.517e-09, 1.942e-09, 1.493e-09, 1.122e-09,
767 8.449e-10, 6.361e-10, 4.787e-10, 3.611e-10, 2.804e-10, 2.215e-10,
768 1.758e-10, 1.441e-10, 1.197e-10, 9.953e-11, 8.505e-11, 7.334e-11,
769 6.325e-11, 5.625e-11, 5.058e-11, 4.548e-11, 4.122e-11, 3.748e-11,
770 3.402e-11, 3.088e-11, 2.8e-11, 2.536e-11, 2.293e-11, 2.072e-11,
771 1.871e-11, 1.687e-11, 1.52e-11, 1.368e-11, 1.23e-11, 1.105e-11,
772 9.922e-12, 8.898e-12, 7.972e-12, 7.139e-12, 6.385e-12, 5.708e-12,
773 5.099e-12, 4.549e-12, 4.056e-12, 3.613e-12, 3.216e-12, 2.862e-12,
774 2.544e-12, 2.259e-12, 2.004e-12, 1.776e-12, 1.572e-12, 1.391e-12,
775 1.227e-12, 1.082e-12, 9.528e-13, 8.379e-13, 7.349e-13, 6.436e-13,
776 5.634e-13, 4.917e-13, 4.291e-13, 3.745e-13, 3.267e-13, 2.854e-13,
777 2.494e-13, 2.181e-13, 1.913e-13, 1.68e-13, 1.479e-13, 1.31e-13,
778 1.159e-13, 1.025e-13, 9.067e-14, 8.113e-14, 7.281e-14, 6.535e-14,
779 5.892e-14, 5.348e-14, 4.867e-14, 4.439e-14, 4.073e-14, 3.76e-14,
780 3.476e-14, 3.229e-14, 3e-14, 2.807e-14, 2.635e-14, 2.473e-14,
781 2.332e-14
782 };
783
784 static const double hno4[121] = {
785 6.118e-12, 3.594e-12, 2.807e-12, 3.04e-12, 4.458e-12, 7.986e-12,
786 1.509e-11, 2.661e-11, 3.738e-11, 4.652e-11, 4.429e-11, 3.992e-11,
787 3.347e-11, 3.005e-11, 3.173e-11, 4.055e-11, 5.812e-11, 8.489e-11,
788 1.19e-10, 1.482e-10, 1.766e-10, 2.103e-10, 2.35e-10, 2.598e-10,
789 2.801e-10, 2.899e-10, 3e-10, 2.817e-10, 2.617e-10, 2.332e-10,
790 1.933e-10, 1.605e-10, 1.232e-10, 9.285e-11, 6.941e-11, 4.951e-11,
791 3.539e-11, 2.402e-11, 1.522e-11, 9.676e-12, 6.056e-12, 3.745e-12,
792 2.34e-12, 1.463e-12, 9.186e-13, 5.769e-13, 3.322e-13, 1.853e-13,
793 1.035e-13, 7.173e-14, 5.382e-14, 4.036e-14, 3.401e-14, 2.997e-14,
794 2.635e-14, 2.316e-14, 2.034e-14, 1.783e-14, 1.56e-14, 1.363e-14,
795 1.19e-14, 1.037e-14, 9.032e-15, 7.846e-15, 6.813e-15, 5.912e-15,
796 5.121e-15, 4.431e-15, 3.829e-15, 3.306e-15, 2.851e-15, 2.456e-15,
797 2.114e-15, 1.816e-15, 1.559e-15, 1.337e-15, 1.146e-15, 9.811e-16,
798 8.389e-16, 7.162e-16, 6.109e-16, 5.203e-16, 4.425e-16, 3.76e-16,
799 3.184e-16, 2.692e-16, 2.274e-16, 1.917e-16, 1.61e-16, 1.35e-16,
800 1.131e-16, 9.437e-17, 7.874e-17, 6.57e-17, 5.481e-17, 4.579e-17,
801 3.828e-17, 3.204e-17, 2.691e-17, 2.264e-17, 1.912e-17, 1.626e-17,
802 1.382e-17, 1.174e-17, 9.972e-18, 8.603e-18, 7.45e-18, 6.453e-18,
803 5.623e-18, 4.944e-18, 4.361e-18, 3.859e-18, 3.443e-18, 3.096e-18,
804 2.788e-18, 2.528e-18, 2.293e-18, 2.099e-18, 1.929e-18, 1.773e-18,
805 1.64e-18
806 };
807
808 static const double hocl[121] = {
809 1.056e-12, 1.194e-12, 1.35e-12, 1.531e-12, 1.737e-12, 1.982e-12,
810 2.263e-12, 2.599e-12, 2.991e-12, 3.459e-12, 4.012e-12, 4.662e-12,
811 5.438e-12, 6.35e-12, 7.425e-12, 8.686e-12, 1.016e-11, 1.188e-11,
812 1.389e-11, 1.659e-11, 2.087e-11, 2.621e-11, 3.265e-11, 4.064e-11,
813 4.859e-11, 5.441e-11, 6.09e-11, 6.373e-11, 6.611e-11, 6.94e-11,
814 7.44e-11, 7.97e-11, 8.775e-11, 9.722e-11, 1.064e-10, 1.089e-10,
815 1.114e-10, 1.106e-10, 1.053e-10, 1.004e-10, 9.006e-11, 7.778e-11,
816 6.739e-11, 5.636e-11, 4.655e-11, 3.845e-11, 3.042e-11, 2.368e-11,
817 1.845e-11, 1.442e-11, 1.127e-11, 8.814e-12, 6.544e-12, 4.763e-12,
818 3.449e-12, 2.612e-12, 1.999e-12, 1.526e-12, 1.16e-12, 8.793e-13,
819 6.655e-13, 5.017e-13, 3.778e-13, 2.829e-13, 2.117e-13, 1.582e-13,
820 1.178e-13, 8.755e-14, 6.486e-14, 4.799e-14, 3.54e-14, 2.606e-14,
821 1.916e-14, 1.403e-14, 1.026e-14, 7.48e-15, 5.446e-15, 3.961e-15,
822 2.872e-15, 2.076e-15, 1.498e-15, 1.077e-15, 7.726e-16, 5.528e-16,
823 3.929e-16, 2.785e-16, 1.969e-16, 1.386e-16, 9.69e-17, 6.747e-17,
824 4.692e-17, 3.236e-17, 2.232e-17, 1.539e-17, 1.061e-17, 7.332e-18,
825 5.076e-18, 3.522e-18, 2.461e-18, 1.726e-18, 1.22e-18, 8.75e-19,
826 6.264e-19, 4.482e-19, 3.207e-19, 2.368e-19, 1.762e-19, 1.312e-19,
827 9.891e-20, 7.595e-20, 5.87e-20, 4.567e-20, 3.612e-20, 2.904e-20,
828 2.343e-20, 1.917e-20, 1.568e-20, 1.308e-20, 1.1e-20, 9.25e-21,
829 7.881e-21
830 };
831
832 static const double n2o[121] = {
833 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07,
834 3.17e-07, 3.17e-07, 3.17e-07, 3.124e-07, 3.077e-07, 3.03e-07,
835 2.984e-07, 2.938e-07, 2.892e-07, 2.847e-07, 2.779e-07, 2.705e-07,
836 2.631e-07, 2.557e-07, 2.484e-07, 2.345e-07, 2.201e-07, 2.01e-07,
837 1.754e-07, 1.532e-07, 1.329e-07, 1.154e-07, 1.003e-07, 8.735e-08,
838 7.617e-08, 6.512e-08, 5.547e-08, 4.709e-08, 3.915e-08, 3.259e-08,
839 2.738e-08, 2.327e-08, 1.98e-08, 1.711e-08, 1.493e-08, 1.306e-08,
840 1.165e-08, 1.049e-08, 9.439e-09, 8.375e-09, 7.391e-09, 6.525e-09,
841 5.759e-09, 5.083e-09, 4.485e-09, 3.953e-09, 3.601e-09, 3.27e-09,
842 2.975e-09, 2.757e-09, 2.556e-09, 2.37e-09, 2.195e-09, 2.032e-09,
843 1.912e-09, 1.79e-09, 1.679e-09, 1.572e-09, 1.482e-09, 1.402e-09,
844 1.326e-09, 1.254e-09, 1.187e-09, 1.127e-09, 1.071e-09, 1.02e-09,
845 9.673e-10, 9.193e-10, 8.752e-10, 8.379e-10, 8.017e-10, 7.66e-10,
846 7.319e-10, 7.004e-10, 6.721e-10, 6.459e-10, 6.199e-10, 5.942e-10,
847 5.703e-10, 5.488e-10, 5.283e-10, 5.082e-10, 4.877e-10, 4.696e-10,
848 4.52e-10, 4.355e-10, 4.198e-10, 4.039e-10, 3.888e-10, 3.754e-10,
849 3.624e-10, 3.499e-10, 3.381e-10, 3.267e-10, 3.163e-10, 3.058e-10,
850 2.959e-10, 2.864e-10, 2.77e-10, 2.686e-10, 2.604e-10, 2.534e-10,
851 2.462e-10, 2.386e-10, 2.318e-10, 2.247e-10, 2.189e-10, 2.133e-10,
852 2.071e-10, 2.014e-10, 1.955e-10, 1.908e-10, 1.86e-10, 1.817e-10
853 };
854
855 static const double n2o5[121] = {
856 1.231e-11, 3.035e-12, 1.702e-12, 9.877e-13, 8.081e-13, 9.039e-13,
857 1.169e-12, 1.474e-12, 1.651e-12, 1.795e-12, 1.998e-12, 2.543e-12,
858 4.398e-12, 7.698e-12, 1.28e-11, 2.131e-11, 3.548e-11, 5.894e-11,
859 7.645e-11, 1.089e-10, 1.391e-10, 1.886e-10, 2.386e-10, 2.986e-10,
860 3.487e-10, 3.994e-10, 4.5e-10, 4.6e-10, 4.591e-10, 4.1e-10, 3.488e-10,
861 2.846e-10, 2.287e-10, 1.696e-10, 1.011e-10, 6.428e-11, 4.324e-11,
862 2.225e-11, 6.214e-12, 3.608e-12, 8.793e-13, 4.491e-13, 1.04e-13,
863 6.1e-14, 3.436e-14, 6.671e-15, 1.171e-15, 5.848e-16, 1.212e-16,
864 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
865 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
866 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
867 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
868 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
869 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
870 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
871 1e-16, 1e-16
872 };
873
874 static const double nh3[121] = {
875 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
876 1e-10, 1e-10, 1e-10, 1e-10, 9.444e-11, 8.488e-11, 7.241e-11, 5.785e-11,
877 4.178e-11, 3.018e-11, 2.18e-11, 1.574e-11, 1.137e-11, 8.211e-12,
878 5.973e-12, 4.327e-12, 3.118e-12, 2.234e-12, 1.573e-12, 1.04e-12,
879 6.762e-13, 4.202e-13, 2.406e-13, 1.335e-13, 6.938e-14, 3.105e-14,
880 1.609e-14, 1.033e-14, 6.432e-15, 4.031e-15, 2.555e-15, 1.656e-15,
881 1.115e-15, 7.904e-16, 5.63e-16, 4.048e-16, 2.876e-16, 2.004e-16,
882 1.356e-16, 9.237e-17, 6.235e-17, 4.223e-17, 3.009e-17, 2.328e-17,
883 2.002e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
884 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
885 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
886 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
887 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
888 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
889 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
890 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
891 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
892 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
893 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
894 1.914e-17
895 };
896
897 static const double no[121] = {
898 2.586e-10, 4.143e-11, 1.566e-11, 9.591e-12, 8.088e-12, 8.462e-12,
899 1.013e-11, 1.328e-11, 1.855e-11, 2.678e-11, 3.926e-11, 5.464e-11,
900 7.012e-11, 8.912e-11, 1.127e-10, 1.347e-10, 1.498e-10, 1.544e-10,
901 1.602e-10, 1.824e-10, 2.078e-10, 2.366e-10, 2.691e-10, 5.141e-10,
902 8.259e-10, 1.254e-09, 1.849e-09, 2.473e-09, 3.294e-09, 4.16e-09,
903 5.095e-09, 6.11e-09, 6.93e-09, 7.888e-09, 8.903e-09, 9.713e-09,
904 1.052e-08, 1.115e-08, 1.173e-08, 1.21e-08, 1.228e-08, 1.239e-08,
905 1.231e-08, 1.213e-08, 1.192e-08, 1.138e-08, 1.085e-08, 1.008e-08,
906 9.224e-09, 8.389e-09, 7.262e-09, 6.278e-09, 5.335e-09, 4.388e-09,
907 3.589e-09, 2.761e-09, 2.129e-09, 1.633e-09, 1.243e-09, 9.681e-10,
908 8.355e-10, 7.665e-10, 7.442e-10, 8.584e-10, 9.732e-10, 1.063e-09,
909 1.163e-09, 1.286e-09, 1.472e-09, 1.707e-09, 2.032e-09, 2.474e-09,
910 2.977e-09, 3.506e-09, 4.102e-09, 5.013e-09, 6.493e-09, 8.414e-09,
911 1.077e-08, 1.367e-08, 1.777e-08, 2.625e-08, 3.926e-08, 5.545e-08,
912 7.195e-08, 9.464e-08, 1.404e-07, 2.183e-07, 3.329e-07, 4.535e-07,
913 6.158e-07, 8.187e-07, 1.075e-06, 1.422e-06, 1.979e-06, 2.71e-06,
914 3.58e-06, 4.573e-06, 5.951e-06, 7.999e-06, 1.072e-05, 1.372e-05,
915 1.697e-05, 2.112e-05, 2.643e-05, 3.288e-05, 3.994e-05, 4.794e-05,
916 5.606e-05, 6.383e-05, 7.286e-05, 8.156e-05, 8.883e-05, 9.469e-05,
917 9.848e-05, 0.0001023, 0.0001066, 0.0001115, 0.0001145, 0.0001142,
918 0.0001133
919 };
920
921 static const double no2[121] = {
922 3.036e-09, 2.945e-10, 9.982e-11, 5.069e-11, 3.485e-11, 2.982e-11,
923 2.947e-11, 3.164e-11, 3.714e-11, 4.586e-11, 6.164e-11, 8.041e-11,
924 9.982e-11, 1.283e-10, 1.73e-10, 2.56e-10, 3.909e-10, 5.959e-10,
925 9.081e-10, 1.384e-09, 1.788e-09, 2.189e-09, 2.686e-09, 3.091e-09,
926 3.49e-09, 3.796e-09, 4.2e-09, 5.103e-09, 6.005e-09, 6.3e-09, 6.706e-09,
927 7.07e-09, 7.434e-09, 7.663e-09, 7.788e-09, 7.8e-09, 7.597e-09,
928 7.482e-09, 7.227e-09, 6.403e-09, 5.585e-09, 4.606e-09, 3.703e-09,
929 2.984e-09, 2.183e-09, 1.48e-09, 8.441e-10, 5.994e-10, 3.799e-10,
930 2.751e-10, 1.927e-10, 1.507e-10, 1.102e-10, 6.971e-11, 5.839e-11,
931 3.904e-11, 3.087e-11, 2.176e-11, 1.464e-11, 1.209e-11, 8.497e-12,
932 6.477e-12, 4.371e-12, 2.914e-12, 2.424e-12, 1.753e-12, 1.35e-12,
933 9.417e-13, 6.622e-13, 5.148e-13, 3.841e-13, 3.446e-13, 3.01e-13,
934 2.551e-13, 2.151e-13, 1.829e-13, 1.64e-13, 1.475e-13, 1.352e-13,
935 1.155e-13, 9.963e-14, 9.771e-14, 9.577e-14, 9.384e-14, 9.186e-14,
936 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
937 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
938 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
939 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14
940 };
941
942 static const double o3[121] = {
943 2.218e-08, 3.394e-08, 3.869e-08, 4.219e-08, 4.501e-08, 4.778e-08,
944 5.067e-08, 5.402e-08, 5.872e-08, 6.521e-08, 7.709e-08, 9.461e-08,
945 1.269e-07, 1.853e-07, 2.723e-07, 3.964e-07, 5.773e-07, 8.2e-07,
946 1.155e-06, 1.59e-06, 2.076e-06, 2.706e-06, 3.249e-06, 3.848e-06,
947 4.459e-06, 4.986e-06, 5.573e-06, 5.958e-06, 6.328e-06, 6.661e-06,
948 6.9e-06, 7.146e-06, 7.276e-06, 7.374e-06, 7.447e-06, 7.383e-06,
949 7.321e-06, 7.161e-06, 6.879e-06, 6.611e-06, 6.216e-06, 5.765e-06,
950 5.355e-06, 4.905e-06, 4.471e-06, 4.075e-06, 3.728e-06, 3.413e-06,
951 3.125e-06, 2.856e-06, 2.607e-06, 2.379e-06, 2.17e-06, 1.978e-06,
952 1.8e-06, 1.646e-06, 1.506e-06, 1.376e-06, 1.233e-06, 1.102e-06,
953 9.839e-07, 8.771e-07, 7.814e-07, 6.947e-07, 6.102e-07, 5.228e-07,
954 4.509e-07, 3.922e-07, 3.501e-07, 3.183e-07, 2.909e-07, 2.686e-07,
955 2.476e-07, 2.284e-07, 2.109e-07, 2.003e-07, 2.013e-07, 2.022e-07,
956 2.032e-07, 2.042e-07, 2.097e-07, 2.361e-07, 2.656e-07, 2.989e-07,
957 3.37e-07, 3.826e-07, 4.489e-07, 5.26e-07, 6.189e-07, 7.312e-07,
958 8.496e-07, 8.444e-07, 8.392e-07, 8.339e-07, 8.286e-07, 8.234e-07,
959 8.181e-07, 8.129e-07, 8.077e-07, 8.026e-07, 6.918e-07, 5.176e-07,
960 3.865e-07, 2.885e-07, 2.156e-07, 1.619e-07, 1.219e-07, 9.161e-08,
961 6.972e-08, 5.399e-08, 3.498e-08, 2.111e-08, 1.322e-08, 8.482e-09,
962 5.527e-09, 3.423e-09, 2.071e-09, 1.314e-09, 8.529e-10, 5.503e-10,
963 3.665e-10
964 };
965
966 static const double ocs[121] = {
967 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 5.997e-10,
968 5.989e-10, 5.881e-10, 5.765e-10, 5.433e-10, 5.074e-10, 4.567e-10,
969 4.067e-10, 3.601e-10, 3.093e-10, 2.619e-10, 2.232e-10, 1.805e-10,
970 1.46e-10, 1.187e-10, 8.03e-11, 5.435e-11, 3.686e-11, 2.217e-11,
971 1.341e-11, 8.756e-12, 4.511e-12, 2.37e-12, 1.264e-12, 8.28e-13,
972 5.263e-13, 3.209e-13, 1.717e-13, 9.068e-14, 4.709e-14, 2.389e-14,
973 1.236e-14, 1.127e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
974 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
975 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
976 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
977 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
978 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
979 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
980 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
981 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
982 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
983 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
984 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
985 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
986 1.091e-14, 1.091e-14, 1.091e-14
987 };
988
989 static const double sf6[121] = {
990 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12,
991 4.103e-12, 4.103e-12, 4.103e-12, 4.087e-12, 4.064e-12, 4.023e-12,
992 3.988e-12, 3.941e-12, 3.884e-12, 3.755e-12, 3.622e-12, 3.484e-12,
993 3.32e-12, 3.144e-12, 2.978e-12, 2.811e-12, 2.653e-12, 2.489e-12,
994 2.332e-12, 2.199e-12, 2.089e-12, 2.013e-12, 1.953e-12, 1.898e-12,
995 1.859e-12, 1.826e-12, 1.798e-12, 1.776e-12, 1.757e-12, 1.742e-12,
996 1.728e-12, 1.717e-12, 1.707e-12, 1.698e-12, 1.691e-12, 1.685e-12,
997 1.679e-12, 1.675e-12, 1.671e-12, 1.668e-12, 1.665e-12, 1.663e-12,
998 1.661e-12, 1.659e-12, 1.658e-12, 1.657e-12, 1.656e-12, 1.655e-12,
999 1.654e-12, 1.653e-12, 1.653e-12, 1.652e-12, 1.652e-12, 1.652e-12,
1000 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12,
1001 1.651e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1002 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1003 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1004 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1005 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1006 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1007 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1008 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12
1009 };
1010
1011 static const double so2[121] = {
1012 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
1013 1e-10, 1e-10, 9.867e-11, 9.537e-11, 9e-11, 8.404e-11, 7.799e-11,
1014 7.205e-11, 6.616e-11, 6.036e-11, 5.475e-11, 5.007e-11, 4.638e-11,
1015 4.346e-11, 4.055e-11, 3.763e-11, 3.471e-11, 3.186e-11, 2.905e-11,
1016 2.631e-11, 2.358e-11, 2.415e-11, 2.949e-11, 3.952e-11, 5.155e-11,
1017 6.76e-11, 8.741e-11, 1.099e-10, 1.278e-10, 1.414e-10, 1.512e-10,
1018 1.607e-10, 1.699e-10, 1.774e-10, 1.832e-10, 1.871e-10, 1.907e-10,
1019 1.943e-10, 1.974e-10, 1.993e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1020 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1021 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1022 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1023 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1024 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1025 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1026 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10
1027 };
1028
1029 const double *q[NG] = { NULL };
1030
1031 /* Identify variable... */
1032 for (int ig = 0; ig < ctl->ng; ig++) {
1033 q[ig] = NULL;
1034 if (strcasecmp(ctl->emitter[ig], "C2H2") == 0)
1035 q[ig] = c2h2;
1036 if (strcasecmp(ctl->emitter[ig], "C2H6") == 0)
1037 q[ig] = c2h6;
1038 if (strcasecmp(ctl->emitter[ig], "CCl4") == 0)
1039 q[ig] = ccl4;
1040 if (strcasecmp(ctl->emitter[ig], "CH3OH") == 0)
1041 q[ig] = ch3oh;
1042 if (strcasecmp(ctl->emitter[ig], "CH4") == 0)
1043 q[ig] = ch4;
1044 if (strcasecmp(ctl->emitter[ig], "ClO") == 0)
1045 q[ig] = clo;
1046 if (strcasecmp(ctl->emitter[ig], "ClONO2") == 0)
1047 q[ig] = clono2;
1048 if (strcasecmp(ctl->emitter[ig], "CO") == 0)
1049 q[ig] = co;
1050 if (strcasecmp(ctl->emitter[ig], "COF2") == 0)
1051 q[ig] = cof2;
1052 if (strcasecmp(ctl->emitter[ig], "F11") == 0)
1053 q[ig] = f11;
1054 if (strcasecmp(ctl->emitter[ig], "F113") == 0)
1055 q[ig] = f113;
1056 if (strcasecmp(ctl->emitter[ig], "F114") == 0)
1057 q[ig] = f114;
1058 if (strcasecmp(ctl->emitter[ig], "F12") == 0)
1059 q[ig] = f12;
1060 if (strcasecmp(ctl->emitter[ig], "F14") == 0)
1061 q[ig] = f14;
1062 if (strcasecmp(ctl->emitter[ig], "F22") == 0)
1063 q[ig] = f22;
1064 if (strcasecmp(ctl->emitter[ig], "H2CO") == 0)
1065 q[ig] = h2co;
1066 if (strcasecmp(ctl->emitter[ig], "H2O") == 0)
1067 q[ig] = h2o;
1068 if (strcasecmp(ctl->emitter[ig], "H2O2") == 0)
1069 q[ig] = h2o2;
1070 if (strcasecmp(ctl->emitter[ig], "HCl") == 0)
1071 q[ig] = hcl;
1072 if (strcasecmp(ctl->emitter[ig], "HCN") == 0)
1073 q[ig] = hcn;
1074 if (strcasecmp(ctl->emitter[ig], "HF") == 0)
1075 q[ig] = hf;
1076 if (strcasecmp(ctl->emitter[ig], "HNO3") == 0)
1077 q[ig] = hno3;
1078 if (strcasecmp(ctl->emitter[ig], "HNO4") == 0)
1079 q[ig] = hno4;
1080 if (strcasecmp(ctl->emitter[ig], "HOCl") == 0)
1081 q[ig] = hocl;
1082 if (strcasecmp(ctl->emitter[ig], "N2O") == 0)
1083 q[ig] = n2o;
1084 if (strcasecmp(ctl->emitter[ig], "N2O5") == 0)
1085 q[ig] = n2o5;
1086 if (strcasecmp(ctl->emitter[ig], "NH3") == 0)
1087 q[ig] = nh3;
1088 if (strcasecmp(ctl->emitter[ig], "NO") == 0)
1089 q[ig] = no;
1090 if (strcasecmp(ctl->emitter[ig], "NO2") == 0)
1091 q[ig] = no2;
1092 if (strcasecmp(ctl->emitter[ig], "O3") == 0)
1093 q[ig] = o3;
1094 if (strcasecmp(ctl->emitter[ig], "OCS") == 0)
1095 q[ig] = ocs;
1096 if (strcasecmp(ctl->emitter[ig], "SF6") == 0)
1097 q[ig] = sf6;
1098 if (strcasecmp(ctl->emitter[ig], "SO2") == 0)
1099 q[ig] = so2;
1100 }
1101
1102 /* Loop over atmospheric data points... */
1103 for (int ip = 0; ip < atm->np; ip++) {
1104
1105 /* Get altitude index... */
1106 const int iz = locate_reg(z, 121, atm->z[ip]);
1107
1108 /* Interpolate pressure... */
1109 atm->p[ip] = LOGY(z[iz], pre[iz], z[iz + 1], pre[iz + 1], atm->z[ip]);
1110
1111 /* Interpolate temperature... */
1112 atm->t[ip] = LIN(z[iz], tem[iz], z[iz + 1], tem[iz + 1], atm->z[ip]);
1113
1114 /* Interpolate trace gases... */
1115 for (int ig = 0; ig < ctl->ng; ig++)
1116 if (q[ig] != NULL)
1117 atm->q[ig][ip] =
1118 LIN(z[iz], q[ig][iz], z[iz + 1], q[ig][iz + 1], atm->z[ip]);
1119 else
1120 atm->q[ig][ip] = 0;
1121
1122 /* Set CO2... */
1123 if (ctl->ig_co2 >= 0)
1124 atm->q[ctl->ig_co2][ip] = CO2_FIT(atm->time[ip]);
1125
1126 /* Set N2... */
1127 if (ctl->ig_n2 >= 0)
1128 atm->q[ctl->ig_n2][ip] = N2;
1129
1130 /* Set O2... */
1131 if (ctl->ig_o2 >= 0)
1132 atm->q[ctl->ig_o2][ip] = O2;
1133
1134 /* Set extinction to zero... */
1135 for (int iw = 0; iw < ctl->nw; iw++)
1136 atm->k[iw][ip] = 0;
1137
1138 /* Set cloud layer... */
1139 atm->clz = atm->cldz = 0;
1140 for (int icl = 0; icl < ctl->ncl; icl++)
1141 atm->clk[icl] = 0;
1142
1143 /* Set surface... */
1144 atm->sft = 0;
1145 for (int isf = 0; isf < ctl->nsf; isf++)
1146 atm->sfeps[isf] = 1;
1147 }
1148}
1149
1150/*****************************************************************************/
1151
1152double cos_sza(
1153 const double sec,
1154 const double lon,
1155 const double lat) {
1156
1157 /* Number of days and fraction with respect to 2000-01-01T12:00Z... */
1158 const double D = sec / 86400 - 0.5;
1159
1160 /* Geocentric apparent ecliptic longitude [rad]... */
1161 const double g = DEG2RAD(357.529 + 0.98560028 * D);
1162 const double q = 280.459 + 0.98564736 * D;
1163 const double L = DEG2RAD(q + 1.915 * sin(g) + 0.020 * sin(2 * g));
1164
1165 /* Mean obliquity of the ecliptic [rad]... */
1166 const double e = DEG2RAD(23.439 - 0.00000036 * D);
1167
1168 /* Declination [rad]... */
1169 const double sindec = sin(e) * sin(L);
1170
1171 /* Right ascension [rad]... */
1172 const double ra = atan2(cos(e) * sin(L), cos(L));
1173
1174 /* Greenwich Mean Sidereal Time [h]... */
1175 const double GMST = 18.697374558 + 24.06570982441908 * D;
1176
1177 /* Local Sidereal Time [h]... */
1178 const double LST = GMST + lon / 15;
1179
1180 /* Hour angle [rad]... */
1181 const double h = LST / 12 * M_PI - ra;
1182
1183 /* Convert latitude... */
1184 const double lat_help = DEG2RAD(lat);
1185
1186 /* Return cosine of solar zenith angle... */
1187 return sin(lat_help) * sindec + cos(lat_help)
1188 * sqrt(1 - POW2(sindec)) * cos(h);
1189}
1190
1191/*****************************************************************************/
1192
1194 const gsl_vector *dx,
1195 const gsl_vector *dy,
1196 const gsl_matrix *s_a_inv,
1197 const gsl_vector *sig_eps_inv) {
1198
1199 double chisq_a, chisq_m = 0;
1200
1201 /* Get sizes... */
1202 const size_t m = dy->size;
1203 const size_t n = dx->size;
1204
1205 /* Allocate... */
1206 gsl_vector *x_aux = gsl_vector_alloc(n);
1207
1208 /* Determine normalized cost function...
1209 (chi^2 = 1/m * [dy^T * S_eps^{-1} * dy + dx^T * S_a^{-1} * dx]) */
1210 for (size_t i = 0; i < m; i++)
1211 chisq_m += POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
1212 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
1213 gsl_blas_ddot(dx, x_aux, &chisq_a);
1214
1215 /* Free... */
1216 gsl_vector_free(x_aux);
1217
1218 /* Return cost function value... */
1219 return (chisq_m + chisq_a) / (double) m;
1220}
1221
1222/*****************************************************************************/
1223
1224double ctmco2(
1225 const double nu,
1226 const double p,
1227 const double t,
1228 const double u) {
1229
1230 static const double co2296[2001] =
1231 { 9.3388e-5, 9.7711e-5, 1.0224e-4, 1.0697e-4,
1232 1.1193e-4, 1.1712e-4, 1.2255e-4, 1.2824e-4, 1.3419e-4, 1.4043e-4,
1233 1.4695e-4, 1.5378e-4, 1.6094e-4, 1.6842e-4, 1.7626e-4, 1.8447e-4,
1234 1.9307e-4, 2.0207e-4, 2.1149e-4, 2.2136e-4, 2.3169e-4, 2.4251e-4,
1235 2.5384e-4, 2.657e-4, 2.7813e-4, 2.9114e-4, 3.0477e-4, 3.1904e-4,
1236 3.3399e-4, 3.4965e-4, 3.6604e-4, 3.8322e-4, 4.0121e-4, 4.2006e-4,
1237 4.398e-4, 4.6047e-4, 4.8214e-4, 5.0483e-4, 5.286e-4, 5.535e-4,
1238 5.7959e-4, 6.0693e-4, 6.3557e-4, 6.6558e-4, 6.9702e-4, 7.2996e-4,
1239 7.6449e-4, 8.0066e-4, 8.3856e-4, 8.7829e-4, 9.1991e-4, 9.6354e-4,
1240 .0010093, .0010572, .0011074, .00116, .0012152, .001273,
1241 .0013336, .0013972, .0014638, .0015336, .0016068, .0016835,
1242 .001764, .0018483, .0019367, .0020295, .0021267, .0022286,
1243 .0023355, .0024476, .0025652, .0026885, .0028178, .0029534,
1244 .0030956, .0032448, .0034012, .0035654, .0037375, .0039181,
1245 .0041076, .0043063, .0045148, .0047336, .0049632, .005204,
1246 .0054567, .0057219, .0060002, .0062923, .0065988, .0069204,
1247 .007258, .0076123, .0079842, .0083746, .0087844, .0092146,
1248 .0096663, .01014, .010638, .011161, .01171, .012286, .012891,
1249 .013527, .014194, .014895, .015631, .016404, .017217, .01807,
1250 .018966, .019908, .020897, .021936, .023028, .024176, .025382,
1251 .026649, .027981, .02938, .030851, .032397, .034023, .035732,
1252 .037528, .039416, .041402, .04349, .045685, .047994, .050422,
1253 .052975, .055661, .058486, .061458, .064584, .067873, .071334,
1254 .074975, .078807, .082839, .087082, .091549, .096249, .1012,
1255 .10641, .11189, .11767, .12375, .13015, .13689, .14399, .15147,
1256 .15935, .16765, .17639, .18561, .19531, .20554, .21632, .22769,
1257 .23967, .25229, .2656, .27964, .29443, .31004, .3265, .34386,
1258 .36218, .3815, .40188, .42339, .44609, .47004, .49533, .52202,
1259 .5502, .57995, .61137, .64455, .6796, .71663, .75574, .79707,
1260 .84075, .88691, .9357, .98728, 1.0418, 1.0995, 1.1605, 1.225,
1261 1.2932, 1.3654, 1.4418, 1.5227, 1.6083, 1.6989, 1.7948, 1.8964,
1262 2.004, 2.118, 2.2388, 2.3668, 2.5025, 2.6463, 2.7988, 2.9606,
1263 3.1321, 3.314, 3.5071, 3.712, 3.9296, 4.1605, 4.4058, 4.6663,
1264 4.9431, 5.2374, 5.5501, 5.8818, 6.2353, 6.6114, 7.0115, 7.4372,
1265 7.8905, 8.3731, 8.8871, 9.4349, 10.019, 10.641, 11.305, 12.013,
1266 12.769, 13.576, 14.437, 15.358, 16.342, 17.39, 18.513, 19.716,
1267 21.003, 22.379, 23.854, 25.436, 27.126, 28.942, 30.89, 32.973,
1268 35.219, 37.634, 40.224, 43.021, 46.037, 49.29, 52.803, 56.447,
1269 60.418, 64.792, 69.526, 74.637, 80.182, 86.193, 92.713, 99.786,
1270 107.47, 115.84, 124.94, 134.86, 145.69, 157.49, 170.3, 184.39,
1271 199.83, 216.4, 234.55, 254.72, 276.82, 299.85, 326.16, 354.99,
1272 386.51, 416.68, 449.89, 490.12, 534.35, 578.25, 632.26, 692.61,
1273 756.43, 834.75, 924.11, 1016.9, 996.96, 1102.7, 1219.2, 1351.9,
1274 1494.3, 1654.1, 1826.5, 2027.9, 2249., 2453.8, 2714.4, 2999.4,
1275 3209.5, 3509., 3840.4, 3907.5, 4190.7, 4533.5, 4648.3, 5059.1,
1276 5561.6, 6191.4, 6820.8, 7905.9, 9362.2, 2431.3, 2211.3, 2046.8,
1277 2023.8, 1985.9, 1905.9, 1491.1, 1369.8, 1262.2, 1200.7, 887.74,
1278 820.25, 885.23, 887.21, 816.73, 1126.9, 1216.2, 1272.4, 1579.5,
1279 1634.2, 1656.3, 1657.9, 1789.5, 1670.8, 1509.5, 8474.6, 7489.2,
1280 6793.6, 6117., 5574.1, 5141.2, 5084.6, 4745.1, 4413.2, 4102.8,
1281 4024.7, 3715., 3398.6, 3100.8, 2900.4, 2629.2, 2374., 2144.7,
1282 1955.8, 1760.8, 1591.2, 1435.2, 1296.2, 1174., 1065.1, 967.76,
1283 999.48, 897.45, 809.23, 732.77, 670.26, 611.93, 560.11, 518.77,
1284 476.84, 438.8, 408.48, 380.21, 349.24, 322.71, 296.65, 272.85,
1285 251.96, 232.04, 213.88, 197.69, 182.41, 168.41, 155.79, 144.05,
1286 133.31, 123.48, 114.5, 106.21, 98.591, 91.612, 85.156, 79.204,
1287 73.719, 68.666, 63.975, 59.637, 56.35, 52.545, 49.042, 45.788,
1288 42.78, 39.992, 37.441, 35.037, 32.8, 30.744, 28.801, 26.986,
1289 25.297, 23.731, 22.258, 20.883, 19.603, 18.403, 17.295, 16.249,
1290 15.271, 14.356, 13.501, 12.701, 11.954, 11.254, 10.6, 9.9864,
1291 9.4118, 8.8745, 8.3714, 7.8997, 7.4578, 7.0446, 6.6573, 6.2949,
1292 5.9577, 5.6395, 5.3419, 5.063, 4.8037, 4.5608, 4.3452, 4.1364,
1293 3.9413, 3.7394, 3.562, 3.3932, 3.2325, 3.0789, 2.9318, 2.7898,
1294 2.6537, 2.5225, 2.3958, 2.2305, 2.1215, 2.0245, 1.9427, 1.8795,
1295 1.8336, 1.7604, 1.7016, 1.6419, 1.5282, 1.4611, 1.3443, 1.27,
1296 1.1675, 1.0824, 1.0534, .99833, .95854, .92981, .90887, .89346,
1297 .88113, .87068, .86102, .85096, .88262, .86151, .83565, .80518,
1298 .77045, .73736, .74744, .74954, .75773, .82267, .83493, .89402,
1299 .89725, .93426, .95564, .94045, .94174, .93404, .92035, .90456,
1300 .88621, .86673, .78117, .7515, .72056, .68822, .65658, .62764,
1301 .55984, .55598, .57407, .60963, .63763, .66198, .61132, .60972,
1302 .52496, .50649, .41872, .3964, .32422, .27276, .24048, .23772,
1303 .2286, .22711, .23999, .32038, .34371, .36621, .38561, .39953,
1304 .40636, .44913, .42716, .3919, .35477, .33935, .3351, .39746,
1305 .40993, .49398, .49956, .56157, .54742, .57295, .57386, .55417,
1306 .50745, .471, .43446, .39102, .34993, .31269, .27888, .24912,
1307 .22291, .19994, .17972, .16197, .14633, .13252, .12029, .10942,
1308 .099745, .091118, .083404, .076494, .070292, .064716, .059697,
1309 .055173, .051093, .047411, .044089, .041092, .038392, .035965,
1310 .033789, .031846, .030122, .028607, .02729, .026169, .025209,
1311 .024405, .023766, .023288, .022925, .022716, .022681, .022685,
1312 .022768, .023133, .023325, .023486, .024004, .024126, .024083,
1313 .023785, .024023, .023029, .021649, .021108, .019454, .017809,
1314 .017292, .016635, .017037, .018068, .018977, .018756, .017847,
1315 .016557, .016142, .014459, .012869, .012381, .010875, .0098701,
1316 .009285, .0091698, .0091701, .0096145, .010553, .01106, .012613,
1317 .014362, .015017, .016507, .017741, .01768, .017784, .0171,
1318 .016357, .016172, .017257, .018978, .020935, .021741, .023567,
1319 .025183, .025589, .026732, .027648, .028278, .028215, .02856,
1320 .029015, .029062, .028851, .028497, .027825, .027801, .026523,
1321 .02487, .022967, .022168, .020194, .018605, .017903, .018439,
1322 .019697, .020311, .020855, .020057, .018608, .016738, .015963,
1323 .013844, .011801, .011134, .0097573, .0086007, .0086226,
1324 .0083721, .0090978, .0097616, .0098426, .011317, .012853, .01447,
1325 .014657, .015771, .016351, .016079, .014829, .013431, .013185,
1326 .013207, .01448, .016176, .017971, .018265, .019526, .020455,
1327 .019797, .019802, .0194, .018176, .017505, .016197, .015339,
1328 .014401, .013213, .012203, .011186, .010236, .0093288, .0084854,
1329 .0076837, .0069375, .0062614, .0056628, .0051153, .0046015,
1330 .0041501, .003752, .0033996, .0030865, .0028077, .0025586,
1331 .0023355, .0021353, .0019553, .0017931, .0016466, .0015141,
1332 .0013941, .0012852, .0011862, .0010962, .0010142, 9.3935e-4,
1333 8.71e-4, 8.0851e-4, 7.5132e-4, 6.9894e-4, 6.5093e-4, 6.0689e-4,
1334 5.6647e-4, 5.2935e-4, 4.9525e-4, 4.6391e-4, 4.3509e-4, 4.086e-4,
1335 3.8424e-4, 3.6185e-4, 3.4126e-4, 3.2235e-4, 3.0498e-4, 2.8904e-4,
1336 2.7444e-4, 2.6106e-4, 2.4883e-4, 2.3766e-4, 2.275e-4, 2.1827e-4,
1337 2.0992e-4, 2.0239e-4, 1.9563e-4, 1.896e-4, 1.8427e-4, 1.796e-4,
1338 1.7555e-4, 1.7209e-4, 1.692e-4, 1.6687e-4, 1.6505e-4, 1.6375e-4,
1339 1.6294e-4, 1.6261e-4, 1.6274e-4, 1.6334e-4, 1.6438e-4, 1.6587e-4,
1340 1.678e-4, 1.7017e-4, 1.7297e-4, 1.762e-4, 1.7988e-4, 1.8399e-4,
1341 1.8855e-4, 1.9355e-4, 1.9902e-4, 2.0494e-4, 2.1134e-4, 2.1823e-4,
1342 2.2561e-4, 2.335e-4, 2.4192e-4, 2.5088e-4, 2.604e-4, 2.705e-4,
1343 2.8119e-4, 2.9251e-4, 3.0447e-4, 3.171e-4, 3.3042e-4, 3.4447e-4,
1344 3.5927e-4, 3.7486e-4, 3.9127e-4, 4.0854e-4, 4.267e-4, 4.4579e-4,
1345 4.6586e-4, 4.8696e-4, 5.0912e-4, 5.324e-4, 5.5685e-4, 5.8253e-4,
1346 6.0949e-4, 6.378e-4, 6.6753e-4, 6.9873e-4, 7.3149e-4, 7.6588e-4,
1347 8.0198e-4, 8.3987e-4, 8.7964e-4, 9.2139e-4, 9.6522e-4, .0010112,
1348 .0010595, .0011102, .0011634, .0012193, .001278, .0013396,
1349 .0014043, .0014722, .0015436, .0016185, .0016972, .0017799,
1350 .0018668, .001958, .0020539, .0021547, .0022606, .0023719,
1351 .002489, .002612, .0027414, .0028775, .0030206, .0031712,
1352 .0033295, .0034962, .0036716, .0038563, .0040506, .0042553,
1353 .0044709, .004698, .0049373, .0051894, .0054552, .0057354,
1354 .006031, .0063427, .0066717, .0070188, .0073854, .0077726,
1355 .0081816, .0086138, .0090709, .0095543, .010066, .010607,
1356 .011181, .011789, .012433, .013116, .013842, .014613, .015432,
1357 .016304, .017233, .018224, .019281, .020394, .021574, .022836,
1358 .024181, .025594, .027088, .028707, .030401, .032245, .034219,
1359 .036262, .038539, .040987, .043578, .04641, .04949, .052726,
1360 .056326, .0602, .064093, .068521, .073278, .077734, .083064,
1361 .088731, .093885, .1003, .1072, .11365, .12187, .13078, .13989,
1362 .15095, .16299, .17634, .19116, .20628, .22419, .24386, .26587,
1363 .28811, .31399, .34321, .36606, .39675, .42742, .44243, .47197,
1364 .49993, .49027, .51147, .52803, .48931, .49729, .5026, .43854,
1365 .441, .44766, .43414, .46151, .50029, .55247, .43855, .32115,
1366 .32607, .3431, .36119, .38029, .41179, .43996, .47144, .51853,
1367 .55362, .59122, .66338, .69877, .74001, .82923, .86907, .90361,
1368 1.0025, 1.031, 1.0559, 1.104, 1.1178, 1.1341, 1.1547, 1.351,
1369 1.4772, 1.4812, 1.4907, 1.512, 1.5442, 1.5853, 1.6358, 1.6963,
1370 1.7674, 1.8474, 1.9353, 2.0335, 2.143, 2.2592, 2.3853, 2.5217,
1371 2.6686, 2.8273, 2.9998, 3.183, 3.3868, 3.6109, 3.8564, 4.1159,
1372 4.4079, 4.7278, 5.0497, 5.3695, 5.758, 6.0834, 6.4976, 6.9312,
1373 7.38, 7.5746, 7.9833, 8.3791, 8.3956, 8.7501, 9.1067, 9.072,
1374 9.4649, 9.9112, 10.402, 10.829, 11.605, 12.54, 12.713, 10.443,
1375 10.825, 11.375, 11.955, 12.623, 13.326, 14.101, 15.041, 15.547,
1376 16.461, 17.439, 18.716, 19.84, 21.036, 22.642, 23.901, 25.244,
1377 27.03, 28.411, 29.871, 31.403, 33.147, 34.744, 36.456, 39.239,
1378 43.605, 45.162, 47.004, 49.093, 51.391, 53.946, 56.673, 59.629,
1379 63.167, 66.576, 70.254, 74.222, 78.477, 83.034, 87.914, 93.18,
1380 98.77, 104.74, 111.15, 117.95, 125.23, 133.01, 141.33, 150.21,
1381 159.71, 169.89, 180.93, 192.54, 204.99, 218.34, 232.65, 248.,
1382 264.47, 282.14, 301.13, 321.53, 343.48, 367.08, 392.5, 419.88,
1383 449.4, 481.26, 515.64, 552.79, 592.99, 636.48, 683.61, 734.65,
1384 789.99, 850.02, 915.14, 985.81, 1062.5, 1147.1, 1237.8, 1336.4,
1385 1443.2, 1558.9, 1684.2, 1819.2, 1965.2, 2122.6, 2291.7, 2470.8,
1386 2665.7, 2874.9, 3099.4, 3337.9, 3541., 3813.3, 4111.9, 4439.3,
1387 4798.9, 5196., 5639.2, 6087.5, 6657.7, 7306.7, 8040.7, 8845.5,
1388 9702.2, 10670., 11739., 12842., 14141., 15498., 17068., 18729.,
1389 20557., 22559., 25248., 27664., 30207., 32915., 35611., 38081.,
1390 40715., 43191., 41651., 42750., 43785., 44353., 44366., 44189.,
1391 43618., 42862., 41878., 35133., 35215., 36383., 39420., 44055.,
1392 44155., 45850., 46853., 39197., 38274., 29942., 28553., 21792.,
1393 21228., 17106., 14955., 18181., 19557., 21427., 23728., 26301.,
1394 28584., 30775., 32536., 33867., 40089., 39204., 37329., 34452.,
1395 31373., 33921., 34800., 36043., 44415., 45162., 52181., 50895.,
1396 54140., 50840., 50468., 48302., 44915., 40910., 36754., 32755.,
1397 29093., 25860., 22962., 20448., 18247., 16326., 14645., 13165.,
1398 11861., 10708., 9686.9, 8779.7, 7971.9, 7250.8, 6605.7, 6027.2,
1399 5507.3, 5039.1, 4616.6, 4234.8, 3889., 3575.4, 3290.5, 3031.3,
1400 2795.2, 2579.9, 2383.1, 2203.3, 2038.6, 1887.6, 1749.1, 1621.9,
1401 1505., 1397.4, 1298.3, 1207., 1122.8, 1045., 973.1, 906.64,
1402 845.16, 788.22, 735.48, 686.57, 641.21, 599.1, 559.99, 523.64,
1403 489.85, 458.42, 429.16, 401.92, 376.54, 352.88, 330.82, 310.24,
1404 291.03, 273.09, 256.34, 240.69, 226.05, 212.37, 199.57, 187.59,
1405 176.37, 165.87, 156.03, 146.82, 138.17, 130.07, 122.47, 115.34,
1406 108.65, 102.37, 96.473, 90.934, 85.73, 80.84, 76.243, 71.922,
1407 67.858, 64.034, 60.438, 57.052, 53.866, 50.866, 48.04, 45.379,
1408 42.872, 40.51, 38.285, 36.188, 34.211, 32.347, 30.588, 28.929,
1409 27.362, 25.884, 24.489, 23.171, 21.929, 20.755, 19.646, 18.599,
1410 17.61, 16.677, 15.795, 14.961, 14.174, 13.43, 12.725, 12.06,
1411 11.431, 10.834, 10.27, 9.7361, 9.2302, 8.7518, 8.2997, 7.8724,
1412 7.4674, 7.0848, 6.7226, 6.3794, 6.054, 5.745, 5.4525, 5.1752,
1413 4.9121, 4.6625, 4.4259, 4.2015, 3.9888, 3.7872, 3.5961, 3.4149,
1414 3.2431, 3.0802, 2.9257, 2.7792, 2.6402, 2.5084, 2.3834, 2.2648,
1415 2.1522, 2.0455, 1.9441, 1.848, 1.7567, 1.6701, 1.5878, 1.5097,
1416 1.4356, 1.3651, 1.2981, 1.2345, 1.174, 1.1167, 1.062, 1.0101,
1417 .96087, .91414, .86986, .82781, .78777, .74971, .71339, .67882,
1418 .64604, .61473, .58507, .55676, .52987, .5044, .48014, .45715,
1419 .43527, .41453, .3948, .37609, .35831, .34142, .32524, .30995,
1420 .29536, .28142, .26807, .25527, .24311, .23166, .22077, .21053,
1421 .20081, .19143, .18261, .17407, .16603, .15833, .15089, .14385,
1422 .13707, .13065, .12449, .11865, .11306, .10774, .10266, .097818,
1423 .093203, .088815, .084641, .080671, .076892, .073296, .069873,
1424 .066613, .06351, .060555, .05774, .055058, .052504, .050071,
1425 .047752, .045543, .043438, .041432, .039521, .037699, .035962,
1426 .034307, .032729, .031225, .029791, .028423, .02712, .025877,
1427 .024692, .023563, .022485, .021458, .020478, .019543, .018652,
1428 .017802, .016992, .016219, .015481, .014778, .014107, .013467,
1429 .012856, .012274, .011718, .011188, .010682, .0102, .0097393,
1430 .0093001, .008881, .0084812, .0080997, .0077358, .0073885,
1431 .0070571, .0067409, .0064393, .0061514, .0058768, .0056147,
1432 .0053647, .0051262, .0048987, .0046816, .0044745, .0042769,
1433 .0040884, .0039088, .0037373, .0035739, .003418, .0032693,
1434 .0031277, .0029926, .0028639, .0027413, .0026245, .0025133,
1435 .0024074, .0023066, .0022108, .0021196, .002033, .0019507,
1436 .0018726, .0017985, .0017282, .0016617, .0015988, .0015394,
1437 .0014834, .0014306, .0013811, .0013346, .0012911, .0012506,
1438 .0012131, .0011784, .0011465, .0011175, .0010912, .0010678,
1439 .0010472, .0010295, .0010147, .001003, 9.9428e-4, 9.8883e-4,
1440 9.8673e-4, 9.8821e-4, 9.9343e-4, .0010027, .0010164, .0010348,
1441 .0010586, .0010882, .0011245, .0011685, .0012145, .0012666,
1442 .0013095, .0013688, .0014048, .0014663, .0015309, .0015499,
1443 .0016144, .0016312, .001705, .0017892, .0018499, .0019715,
1444 .0021102, .0022442, .0024284, .0025893, .0027703, .0029445,
1445 .0031193, .003346, .0034552, .0036906, .0037584, .0040084,
1446 .0041934, .0044587, .0047093, .0049759, .0053421, .0055134,
1447 .0059048, .0058663, .0061036, .0063259, .0059657, .0060653,
1448 .0060972, .0055539, .0055653, .0055772, .005331, .0054953,
1449 .0055919, .0058684, .006183, .0066675, .0069808, .0075142,
1450 .0078536, .0084282, .0089454, .0094625, .0093703, .0095857,
1451 .0099283, .010063, .010521, .0097778, .0098175, .010379, .010447,
1452 .0105, .010617, .010706, .01078, .011177, .011212, .011304,
1453 .011446, .011603, .011816, .012165, .012545, .013069, .013539,
1454 .01411, .014776, .016103, .017016, .017994, .018978, .01998,
1455 .021799, .022745, .023681, .024627, .025562, .026992, .027958,
1456 .029013, .030154, .031402, .03228, .033651, .035272, .037088,
1457 .039021, .041213, .043597, .045977, .04877, .051809, .054943,
1458 .058064, .061528, .06537, .069309, .071928, .075752, .079589,
1459 .083352, .084096, .087497, .090817, .091198, .094966, .099045,
1460 .10429, .10867, .11518, .12269, .13126, .14087, .15161, .16388,
1461 .16423, .1759, .18721, .19994, .21275, .22513, .23041, .24231,
1462 .25299, .25396, .26396, .27696, .27929, .2908, .30595, .31433,
1463 .3282, .3429, .35944, .37467, .39277, .41245, .43326, .45649,
1464 .48152, .51897, .54686, .57877, .61263, .64962, .68983, .73945,
1465 .78619, .83537, .89622, .95002, 1.0067, 1.0742, 1.1355, 1.2007,
1466 1.2738, 1.347, 1.4254, 1.5094, 1.6009, 1.6976, 1.8019, 1.9148,
1467 2.0357, 2.166, 2.3066, 2.4579, 2.6208, 2.7966, 2.986, 3.188,
1468 3.4081, 3.6456, 3.9, 4.1747, 4.4712, 4.7931, 5.1359, 5.5097,
1469 5.9117, 6.3435, 6.8003, 7.3001, 7.8385, 8.3945, 9.011, 9.6869,
1470 10.392, 11.18, 12.036, 12.938, 13.944, 14.881, 16.029, 17.255,
1471 18.574, 19.945, 21.38, 22.9, 24.477, 26.128, 27.87, 29.037,
1472 30.988, 33.145, 35.506, 37.76, 40.885, 44.487, 48.505, 52.911,
1473 57.56, 61.964, 67.217, 72.26, 78.343, 85.08, 91.867, 99.435,
1474 107.68, 116.97, 127.12, 138.32, 150.26, 163.04, 174.81, 189.26,
1475 205.61, 224.68, 240.98, 261.88, 285.1, 307.58, 334.35, 363.53,
1476 394.68, 427.85, 458.85, 489.25, 472.87, 486.93, 496.27, 501.52,
1477 501.57, 497.14, 488.09, 476.32, 393.76, 388.51, 393.42, 414.45,
1478 455.12, 514.62, 520.38, 547.42, 562.6, 487.47, 480.83, 391.06,
1479 376.92, 303.7, 295.91, 256.03, 236.73, 280.38, 310.71, 335.53,
1480 367.88, 401.94, 435.52, 469.13, 497.94, 588.82, 597.94, 597.2,
1481 588.28, 571.2, 555.75, 603.56, 638.15, 680.75, 801.72, 848.01,
1482 962.15, 990.06, 1068.1, 1076.2, 1115.3, 1134.2, 1136.6, 1119.1,
1483 1108.9, 1090.6, 1068.7, 1041.9, 1005.4, 967.98, 927.08, 780.1,
1484 751.41, 733.12, 742.65, 785.56, 855.16, 852.45, 878.1, 784.59,
1485 777.81, 765.13, 622.93, 498.09, 474.89, 386.9, 378.48, 336.17,
1486 322.04, 329.57, 350.5, 383.38, 420.02, 462.39, 499.71, 531.98,
1487 654.99, 653.43, 639.99, 605.16, 554.16, 504.42, 540.64, 552.33,
1488 679.46, 699.51, 713.91, 832.17, 919.91, 884.96, 907.57, 846.56,
1489 818.56, 768.93, 706.71, 642.17, 575.95, 515.38, 459.07, 409.02,
1490 364.61, 325.46, 291.1, 260.89, 234.39, 211.01, 190.38, 172.11,
1491 155.91, 141.49, 128.63, 117.13, 106.84, 97.584, 89.262, 81.756,
1492 74.975, 68.842, 63.28, 58.232, 53.641, 49.46, 45.649, 42.168,
1493 38.991, 36.078, 33.409, 30.96, 28.71, 26.642, 24.737, 22.985,
1494 21.37, 19.882, 18.512, 17.242, 16.073, 14.987, 13.984, 13.05,
1495 12.186, 11.384, 10.637, 9.9436, 9.2988, 8.6991, 8.141, 7.6215,
1496 7.1378, 6.6872, 6.2671, 5.8754, 5.51, 5.1691, 4.851, 4.5539,
1497 4.2764, 4.0169, 3.7742, 3.5472, 3.3348, 3.1359, 2.9495, 2.7749,
1498 2.6113, 2.4578, 2.3139, 2.1789, 2.0523, 1.9334, 1.8219, 1.7171,
1499 1.6188, 1.5263, 1.4395, 1.3579, 1.2812, 1.209, 1.1411, 1.0773,
1500 1.0171, .96048, .90713, .85684, .80959, .76495, .72282, .68309,
1501 .64563, .61035, .57707, .54573, .51622, .48834, .46199, .43709,
1502 .41359, .39129, .37034, .35064, .33198, .31442, .29784, .28218,
1503 .26732, .25337, .24017, .22774, .21601, .20479, .19426
1504 };
1505
1506 static const double co2260[2001] =
1507 { 5.7971e-5, 6.0733e-5, 6.3628e-5, 6.6662e-5,
1508 6.9843e-5, 7.3176e-5, 7.6671e-5, 8.0334e-5, 8.4175e-5, 8.8201e-5,
1509 9.2421e-5, 9.6846e-5, 1.0149e-4, 1.0635e-4, 1.1145e-4, 1.1679e-4,
1510 1.224e-4, 1.2828e-4, 1.3444e-4, 1.409e-4, 1.4768e-4, 1.5479e-4,
1511 1.6224e-4, 1.7006e-4, 1.7826e-4, 1.8685e-4, 1.9587e-4, 2.0532e-4,
1512 2.1524e-4, 2.2565e-4, 2.3656e-4, 2.48e-4, 2.6001e-4, 2.7261e-4,
1513 2.8582e-4, 2.9968e-4, 3.1422e-4, 3.2948e-4, 3.4548e-4, 3.6228e-4,
1514 3.799e-4, 3.9838e-4, 4.1778e-4, 4.3814e-4, 4.595e-4, 4.8191e-4,
1515 5.0543e-4, 5.3012e-4, 5.5603e-4, 5.8321e-4, 6.1175e-4, 6.417e-4,
1516 6.7314e-4, 7.0614e-4, 7.4078e-4, 7.7714e-4, 8.1531e-4, 8.5538e-4,
1517 8.9745e-4, 9.4162e-4, 9.8798e-4, .0010367, .0010878, .0011415,
1518 .0011978, .001257, .0013191, .0013844, .001453, .0015249,
1519 .0016006, .00168, .0017634, .001851, .001943, .0020397, .0021412,
1520 .0022479, .00236, .0024778, .0026015, .0027316, .0028682,
1521 .0030117, .0031626, .0033211, .0034877, .0036628, .0038469,
1522 .0040403, .0042436, .0044574, .004682, .0049182, .0051665,
1523 .0054276, .0057021, .0059907, .0062942, .0066133, .0069489,
1524 .0073018, .0076729, .0080632, .0084738, .0089056, .0093599,
1525 .0098377, .01034, .010869, .011426, .012011, .012627, .013276,
1526 .013958, .014676, .015431, .016226, .017063, .017944, .018872,
1527 .019848, .020876, .021958, .023098, .024298, .025561, .026892,
1528 .028293, .029769, .031323, .032961, .034686, .036503, .038418,
1529 .040435, .042561, .044801, .047161, .049649, .052271, .055035,
1530 .057948, .061019, .064256, .06767, .07127, .075066, .079069,
1531 .083291, .087744, .092441, .097396, .10262, .10814, .11396,
1532 .1201, .12658, .13342, .14064, .14826, .1563, .1648, .17376,
1533 .18323, .19324, .2038, .21496, .22674, .23919, .25234, .26624,
1534 .28093, .29646, .31287, .33021, .34855, .36794, .38844, .41012,
1535 .43305, .45731, .48297, .51011, .53884, .56924, .60141, .63547,
1536 .67152, .70969, .75012, .79292, .83826, .8863, .93718, .99111,
1537 1.0482, 1.1088, 1.173, 1.2411, 1.3133, 1.3898, 1.471, 1.5571,
1538 1.6485, 1.7455, 1.8485, 1.9577, 2.0737, 2.197, 2.3278, 2.4668,
1539 2.6145, 2.7715, 2.9383, 3.1156, 3.3042, 3.5047, 3.7181, 3.9451,
1540 4.1866, 4.4437, 4.7174, 5.0089, 5.3192, 5.65, 6.0025, 6.3782,
1541 6.7787, 7.206, 7.6617, 8.1479, 8.6669, 9.221, 9.8128, 10.445,
1542 11.12, 11.843, 12.615, 13.441, 14.325, 15.271, 16.283, 17.367,
1543 18.529, 19.776, 21.111, 22.544, 24.082, 25.731, 27.504, 29.409,
1544 31.452, 33.654, 36.024, 38.573, 41.323, 44.29, 47.492, 50.951,
1545 54.608, 58.588, 62.929, 67.629, 72.712, 78.226, 84.207, 90.699,
1546 97.749, 105.42, 113.77, 122.86, 132.78, 143.61, 155.44, 168.33,
1547 182.48, 198.01, 214.87, 233.39, 253.86, 276.34, 300.3, 327.28,
1548 356.89, 389.48, 422.29, 458.99, 501.39, 548.13, 595.62, 652.74,
1549 716.54, 784.57, 866.78, 960.59, 1062.8, 1072.5, 1189.5, 1319.4,
1550 1467.6, 1630.2, 1813.7, 2016.9, 2253., 2515.3, 2773.5, 3092.8,
1551 3444.4, 3720.4, 4104.3, 4527.5, 4645.9, 5021.7, 5462.2, 5597.,
1552 6110.6, 6732.5, 7513.8, 8270.6, 9640.6, 11487., 2796.1, 2680.1,
1553 2441.6, 2404.2, 2334.8, 2215.2, 1642.5, 1477.9, 1328.1, 1223.5,
1554 843.34, 766.96, 831.65, 834.84, 774.85, 1156.3, 1275.6, 1366.1,
1555 1795.6, 1885., 1936.5, 1953.4, 2154.4, 2002.7, 1789.8, 10381.,
1556 9040., 8216.5, 7384.7, 6721.9, 6187.7, 6143.8, 5703.9, 5276.6,
1557 4873.1, 4736., 4325.3, 3927., 3554.1, 3286.1, 2950.1, 2642.4,
1558 2368.7, 2138.9, 1914., 1719.6, 1543.9, 1388.6, 1252.1, 1132.2,
1559 1024.1, 1025.4, 920.58, 829.59, 750.54, 685.01, 624.25, 570.14,
1560 525.81, 481.85, 441.95, 408.71, 377.23, 345.86, 318.51, 292.26,
1561 268.34, 247.04, 227.14, 209.02, 192.69, 177.59, 163.78, 151.26,
1562 139.73, 129.19, 119.53, 110.7, 102.57, 95.109, 88.264, 81.948,
1563 76.13, 70.768, 65.827, 61.251, 57.022, 53.495, 49.824, 46.443,
1564 43.307, 40.405, 37.716, 35.241, 32.923, 30.77, 28.78, 26.915,
1565 25.177, 23.56, 22.059, 20.654, 19.345, 18.126, 16.988, 15.93,
1566 14.939, 14.014, 13.149, 12.343, 11.589, 10.884, 10.225, 9.6093,
1567 9.0327, 8.4934, 7.9889, 7.5166, 7.0744, 6.6604, 6.2727, 5.9098,
1568 5.5701, 5.2529, 4.955, 4.676, 4.4148, 4.171, 3.9426, 3.7332,
1569 3.5347, 3.3493, 3.1677, 3.0025, 2.8466, 2.6994, 2.5601, 2.4277,
1570 2.3016, 2.1814, 2.0664, 1.9564, 1.8279, 1.7311, 1.6427, 1.5645,
1571 1.4982, 1.443, 1.374, 1.3146, 1.2562, 1.17, 1.1105, 1.0272,
1572 .96863, .89718, .83654, .80226, .75908, .72431, .69573, .67174,
1573 .65126, .63315, .61693, .60182, .58715, .59554, .57649, .55526,
1574 .53177, .50622, .48176, .4813, .47642, .47492, .50273, .50293,
1575 .52687, .52239, .53419, .53814, .52626, .52211, .51492, .50622,
1576 .49746, .48841, .4792, .43534, .41999, .40349, .38586, .36799,
1577 .35108, .31089, .30803, .3171, .33599, .35041, .36149, .32924,
1578 .32462, .27309, .25961, .20922, .19504, .15683, .13098, .11588,
1579 .11478, .11204, .11363, .12135, .16423, .17785, .19094, .20236,
1580 .21084, .2154, .24108, .22848, .20871, .18797, .17963, .17834,
1581 .21552, .22284, .26945, .27052, .30108, .28977, .29772, .29224,
1582 .27658, .24956, .22777, .20654, .18392, .16338, .1452, .12916,
1583 .1152, .10304, .092437, .083163, .075031, .067878, .061564,
1584 .055976, .051018, .046609, .042679, .03917, .036032, .033223,
1585 .030706, .02845, .026428, .024617, .022998, .021554, .02027,
1586 .019136, .018141, .017278, .016541, .015926, .015432, .015058,
1587 .014807, .014666, .014635, .014728, .014947, .01527, .015728,
1588 .016345, .017026, .017798, .018839, .019752, .020636, .021886,
1589 .022695, .02327, .023478, .024292, .023544, .022222, .021932,
1590 .020052, .018143, .017722, .017031, .017782, .01938, .020734,
1591 .020476, .019255, .017477, .016878, .014617, .012489, .011765,
1592 .0099077, .0086446, .0079446, .0078644, .0079763, .008671,
1593 .01001, .0108, .012933, .015349, .016341, .018484, .020254,
1594 .020254, .020478, .019591, .018595, .018385, .019913, .022254,
1595 .024847, .025809, .028053, .029924, .030212, .031367, .03222,
1596 .032739, .032537, .03286, .033344, .033507, .033499, .033339,
1597 .032809, .033041, .031723, .029837, .027511, .026603, .024032,
1598 .021914, .020948, .021701, .023425, .024259, .024987, .023818,
1599 .021768, .019223, .018144, .015282, .012604, .01163, .0097907,
1600 .008336, .0082473, .0079582, .0088077, .009779, .010129, .012145,
1601 .014378, .016761, .01726, .018997, .019998, .019809, .01819,
1602 .016358, .016099, .01617, .017939, .020223, .022521, .02277,
1603 .024279, .025247, .024222, .023989, .023224, .021493, .020362,
1604 .018596, .017309, .015975, .014466, .013171, .011921, .01078,
1605 .0097229, .0087612, .0078729, .0070682, .0063494, .0057156,
1606 .0051459, .0046273, .0041712, .0037686, .0034119, .003095,
1607 .0028126, .0025603, .0023342, .0021314, .0019489, .0017845,
1608 .001636, .0015017, .00138, .0012697, .0011694, .0010782,
1609 9.9507e-4, 9.1931e-4, 8.5013e-4, 7.869e-4, 7.2907e-4, 6.7611e-4,
1610 6.2758e-4, 5.8308e-4, 5.4223e-4, 5.0473e-4, 4.7027e-4, 4.3859e-4,
1611 4.0946e-4, 3.8265e-4, 3.5798e-4, 3.3526e-4, 3.1436e-4, 2.9511e-4,
1612 2.7739e-4, 2.6109e-4, 2.4609e-4, 2.3229e-4, 2.1961e-4, 2.0797e-4,
1613 1.9729e-4, 1.875e-4, 1.7855e-4, 1.7038e-4, 1.6294e-4, 1.5619e-4,
1614 1.5007e-4, 1.4456e-4, 1.3961e-4, 1.3521e-4, 1.3131e-4, 1.2789e-4,
1615 1.2494e-4, 1.2242e-4, 1.2032e-4, 1.1863e-4, 1.1733e-4, 1.1641e-4,
1616 1.1585e-4, 1.1565e-4, 1.158e-4, 1.1629e-4, 1.1712e-4, 1.1827e-4,
1617 1.1976e-4, 1.2158e-4, 1.2373e-4, 1.262e-4, 1.2901e-4, 1.3214e-4,
1618 1.3562e-4, 1.3944e-4, 1.4361e-4, 1.4814e-4, 1.5303e-4, 1.5829e-4,
1619 1.6394e-4, 1.6999e-4, 1.7644e-4, 1.8332e-4, 1.9063e-4, 1.984e-4,
1620 2.0663e-4, 2.1536e-4, 2.246e-4, 2.3436e-4, 2.4468e-4, 2.5558e-4,
1621 2.6708e-4, 2.7921e-4, 2.92e-4, 3.0548e-4, 3.1968e-4, 3.3464e-4,
1622 3.5039e-4, 3.6698e-4, 3.8443e-4, 4.0281e-4, 4.2214e-4, 4.4248e-4,
1623 4.6389e-4, 4.864e-4, 5.1009e-4, 5.3501e-4, 5.6123e-4, 5.888e-4,
1624 6.1781e-4, 6.4833e-4, 6.8043e-4, 7.142e-4, 7.4973e-4, 7.8711e-4,
1625 8.2644e-4, 8.6783e-4, 9.1137e-4, 9.5721e-4, .0010054, .0010562,
1626 .0011096, .0011659, .0012251, .0012875, .0013532, .0014224,
1627 .0014953, .001572, .0016529, .0017381, .0018279, .0019226,
1628 .0020224, .0021277, .0022386, .0023557, .0024792, .0026095,
1629 .002747, .0028921, .0030453, .0032071, .003378, .0035586,
1630 .0037494, .003951, .0041642, .0043897, .0046282, .0048805,
1631 .0051476, .0054304, .00573, .0060473, .0063837, .0067404,
1632 .0071188, .0075203, .0079466, .0083994, .0088806, .0093922,
1633 .0099366, .010516, .011134, .011792, .012494, .013244, .014046,
1634 .014898, .015808, .016781, .017822, .018929, .020108, .02138,
1635 .022729, .02419, .02576, .027412, .029233, .031198, .033301,
1636 .035594, .038092, .040767, .04372, .046918, .050246, .053974,
1637 .058009, .061976, .066586, .071537, .076209, .081856, .087998,
1638 .093821, .10113, .10913, .11731, .12724, .13821, .15025, .1639,
1639 .17807, .19472, .21356, .23496, .25758, .28387, .31389, .34104,
1640 .37469, .40989, .43309, .46845, .5042, .5023, .52981, .55275,
1641 .51075, .51976, .52457, .44779, .44721, .4503, .4243, .45244,
1642 .49491, .55399, .39021, .24802, .2501, .2618, .27475, .28879,
1643 .31317, .33643, .36257, .4018, .43275, .46525, .53333, .56599,
1644 .60557, .70142, .74194, .77736, .88567, .91182, .93294, .98407,
1645 .98772, .99176, .9995, 1.2405, 1.3602, 1.338, 1.3255, 1.3267,
1646 1.3404, 1.3634, 1.3967, 1.4407, 1.4961, 1.5603, 1.6328, 1.7153,
1647 1.8094, 1.9091, 2.018, 2.1367, 2.264, 2.4035, 2.5562, 2.7179,
1648 2.9017, 3.1052, 3.3304, 3.5731, 3.8488, 4.1553, 4.4769, 4.7818,
1649 5.1711, 5.5204, 5.9516, 6.4097, 6.8899, 7.1118, 7.5469, 7.9735,
1650 7.9511, 8.3014, 8.6418, 8.4757, 8.8256, 9.2294, 9.6923, 10.033,
1651 10.842, 11.851, 11.78, 8.8435, 9.1381, 9.5956, 10.076, 10.629,
1652 11.22, 11.883, 12.69, 13.163, 13.974, 14.846, 16.027, 17.053,
1653 18.148, 19.715, 20.907, 22.163, 23.956, 25.235, 26.566, 27.94,
1654 29.576, 30.956, 32.432, 35.337, 39.911, 41.128, 42.625, 44.386,
1655 46.369, 48.619, 51.031, 53.674, 56.825, 59.921, 63.286, 66.929,
1656 70.859, 75.081, 79.618, 84.513, 89.739, 95.335, 101.35, 107.76,
1657 114.63, 121.98, 129.87, 138.3, 147.34, 157.04, 167.56, 178.67,
1658 190.61, 203.43, 217.19, 231.99, 247.88, 264.98, 283.37, 303.17,
1659 324.49, 347.47, 372.25, 398.98, 427.85, 459.06, 492.8, 529.31,
1660 568.89, 611.79, 658.35, 708.91, 763.87, 823.65, 888.72, 959.58,
1661 1036.8, 1121.8, 1213.9, 1314.3, 1423.8, 1543., 1672.8, 1813.4,
1662 1966.1, 2131.4, 2309.5, 2499.3, 2705., 2925.7, 3161.6, 3411.3,
1663 3611.5, 3889.2, 4191.1, 4519.3, 4877.9, 5272.9, 5712.9, 6142.7,
1664 6719.6, 7385., 8145., 8977.7, 9831.9, 10827., 11934., 13063.,
1665 14434., 15878., 17591., 19435., 21510., 23835., 26835., 29740.,
1666 32878., 36305., 39830., 43273., 46931., 50499., 49586., 51598.,
1667 53429., 54619., 55081., 55102., 54485., 53487., 52042., 42689.,
1668 42607., 44020., 47994., 54169., 53916., 55808., 56642., 46049.,
1669 44243., 32929., 30658., 21963., 20835., 15962., 13679., 17652.,
1670 19680., 22388., 25625., 29184., 32520., 35720., 38414., 40523.,
1671 49228., 48173., 45678., 41768., 37600., 41313., 42654., 44465.,
1672 55736., 56630., 65409., 63308., 66572., 61845., 60379., 56777.,
1673 51920., 46601., 41367., 36529., 32219., 28470., 25192., 22362.,
1674 19907., 17772., 15907., 14273., 12835., 11567., 10445., 9450.2,
1675 8565.1, 7776., 7070.8, 6439.2, 5872.3, 5362.4, 4903., 4488.3,
1676 4113.4, 3773.8, 3465.8, 3186.1, 2931.7, 2700.1, 2488.8, 2296.,
1677 2119.8, 1958.6, 1810.9, 1675.6, 1551.4, 1437.3, 1332.4, 1236.,
1678 1147.2, 1065.3, 989.86, 920.22, 855.91, 796.48, 741.53, 690.69,
1679 643.62, 600.02, 559.6, 522.13, 487.35, 455.06, 425.08, 397.21,
1680 371.3, 347.2, 324.78, 303.9, 284.46, 266.34, 249.45, 233.7,
1681 219.01, 205.3, 192.5, 180.55, 169.38, 158.95, 149.2, 140.07,
1682 131.54, 123.56, 116.09, 109.09, 102.54, 96.405, 90.655, 85.266,
1683 80.213, 75.475, 71.031, 66.861, 62.948, 59.275, 55.827, 52.587,
1684 49.544, 46.686, 43.998, 41.473, 39.099, 36.867, 34.768, 32.795,
1685 30.939, 29.192, 27.546, 25.998, 24.539, 23.164, 21.869, 20.65,
1686 19.501, 18.419, 17.399, 16.438, 15.532, 14.678, 13.874, 13.115,
1687 12.4, 11.726, 11.088, 10.488, 9.921, 9.3846, 8.8784, 8.3996,
1688 7.9469, 7.5197, 7.1174, 6.738, 6.379, 6.0409, 5.7213, 5.419,
1689 5.1327, 4.8611, 4.6046, 4.3617, 4.1316, 3.9138, 3.7077, 3.5125,
1690 3.3281, 3.1536, 2.9885, 2.8323, 2.6846, 2.5447, 2.4124, 2.2871,
1691 2.1686, 2.0564, 1.9501, 1.8495, 1.7543, 1.6641, 1.5787, 1.4978,
1692 1.4212, 1.3486, 1.2799, 1.2147, 1.1529, 1.0943, 1.0388, .98602,
1693 .93596, .8886, .84352, .80078, .76029, .722, .68585, .65161,
1694 .61901, .58808, .55854, .53044, .5039, .47853, .45459, .43173,
1695 .41008, .38965, .37021, .35186, .33444, .31797, .30234, .28758,
1696 .2736, .26036, .24764, .2357, .22431, .21342, .20295, .19288,
1697 .18334, .17444, .166, .15815, .15072, .14348, .13674, .13015,
1698 .12399, .11807, .11231, .10689, .10164, .096696, .091955,
1699 .087476, .083183, .079113, .075229, .071536, .068026, .064698,
1700 .06154, .058544, .055699, .052997, .050431, .047993, .045676,
1701 .043475, .041382, .039392, .037501, .035702, .033991, .032364,
1702 .030817, .029345, .027945, .026613, .025345, .024139, .022991,
1703 .021899, .02086, .019871, .018929, .018033, .01718, .016368,
1704 .015595, .014859, .014158, .013491, .012856, .012251, .011675,
1705 .011126, .010604, .010107, .0096331, .009182, .0087523, .0083431,
1706 .0079533, .0075821, .0072284, .0068915, .0065706, .0062649,
1707 .0059737, .0056963, .005432, .0051802, .0049404, .0047118,
1708 .0044941, .0042867, .0040891, .0039009, .0037216, .0035507,
1709 .003388, .0032329, .0030852, .0029445, .0028105, .0026829,
1710 .0025613, .0024455, .0023353, .0022303, .0021304, .0020353,
1711 .0019448, .0018587, .0017767, .0016988, .0016247, .0015543,
1712 .0014874, .0014238, .0013635, .0013062, .0012519, .0012005,
1713 .0011517, .0011057, .0010621, .001021, 9.8233e-4, 9.4589e-4,
1714 9.1167e-4, 8.7961e-4, 8.4964e-4, 8.2173e-4, 7.9582e-4, 7.7189e-4,
1715 7.499e-4, 7.2983e-4, 7.1167e-4, 6.9542e-4, 6.8108e-4, 6.6866e-4,
1716 6.5819e-4, 6.4971e-4, 6.4328e-4, 6.3895e-4, 6.3681e-4, 6.3697e-4,
1717 6.3956e-4, 6.4472e-4, 6.5266e-4, 6.6359e-4, 6.778e-4, 6.9563e-4,
1718 7.1749e-4, 7.4392e-4, 7.7556e-4, 8.1028e-4, 8.4994e-4, 8.8709e-4,
1719 9.3413e-4, 9.6953e-4, .0010202, .0010738, .0010976, .0011507,
1720 .0011686, .0012264, .001291, .0013346, .0014246, .0015293,
1721 .0016359, .0017824, .0019255, .0020854, .002247, .0024148,
1722 .0026199, .0027523, .0029704, .0030702, .0033047, .0035013,
1723 .0037576, .0040275, .0043089, .0046927, .0049307, .0053486,
1724 .0053809, .0056699, .0059325, .0055488, .005634, .0056392,
1725 .004946, .0048855, .0048208, .0044386, .0045498, .0046377,
1726 .0048939, .0052396, .0057324, .0060859, .0066906, .0071148,
1727 .0077224, .0082687, .008769, .0084471, .008572, .0087729,
1728 .008775, .0090742, .0080704, .0080288, .0085747, .0086087,
1729 .0086408, .0088752, .0089381, .0089757, .0093532, .0092824,
1730 .0092566, .0092645, .0092735, .009342, .0095806, .0097991,
1731 .010213, .010611, .011129, .011756, .013237, .01412, .015034,
1732 .015936, .01682, .018597, .019315, .019995, .020658, .021289,
1733 .022363, .022996, .023716, .024512, .025434, .026067, .027118,
1734 .028396, .029865, .031442, .033253, .03525, .037296, .039701,
1735 .042356, .045154, .048059, .051294, .054893, .058636, .061407,
1736 .065172, .068974, .072676, .073379, .076547, .079556, .079134,
1737 .082308, .085739, .090192, .09359, .099599, .10669, .11496,
1738 .1244, .13512, .14752, .14494, .15647, .1668, .17863, .19029,
1739 .20124, .20254, .21179, .21982, .21625, .22364, .23405, .23382,
1740 .2434, .25708, .26406, .27621, .28909, .30395, .31717, .33271,
1741 .3496, .36765, .38774, .40949, .446, .46985, .49846, .5287, .562,
1742 .59841, .64598, .68834, .7327, .78978, .8373, .88708, .94744,
1743 1.0006, 1.0574, 1.1215, 1.1856, 1.2546, 1.3292, 1.4107, 1.4974,
1744 1.5913, 1.6931, 1.8028, 1.9212, 2.0492, 2.1874, 2.3365, 2.4978,
1745 2.6718, 2.8588, 3.062, 3.2818, 3.5188, 3.7752, 4.0527, 4.3542,
1746 4.6782, 5.0312, 5.4123, 5.8246, 6.2639, 6.7435, 7.2636, 7.8064,
1747 8.4091, 9.0696, 9.7677, 10.548, 11.4, 12.309, 13.324, 14.284,
1748 15.445, 16.687, 18.019, 19.403, 20.847, 22.366, 23.925, 25.537,
1749 27.213, 28.069, 29.864, 31.829, 33.988, 35.856, 38.829, 42.321,
1750 46.319, 50.606, 55.126, 59.126, 64.162, 68.708, 74.615, 81.176,
1751 87.739, 95.494, 103.83, 113.38, 123.99, 135.8, 148.7, 162.58,
1752 176.32, 192.6, 211.47, 232.7, 252.64, 277.41, 305.38, 333.44,
1753 366.42, 402.66, 442.14, 484.53, 526.42, 568.15, 558.78, 582.6,
1754 600.98, 613.94, 619.44, 618.24, 609.84, 595.96, 484.86, 475.59,
1755 478.49, 501.56, 552.19, 628.44, 630.39, 658.92, 671.96, 562.7,
1756 545.88, 423.43, 400.14, 306.59, 294.13, 246.8, 226.51, 278.21,
1757 314.39, 347.22, 389.13, 433.16, 477.48, 521.67, 560.54, 683.6,
1758 696.37, 695.91, 683.1, 658.24, 634.89, 698.85, 742.87, 796.66,
1759 954.49, 1009.5, 1150.5, 1179.1, 1267.9, 1272.4, 1312.7, 1330.4,
1760 1331.6, 1315.8, 1308.3, 1293.3, 1274.6, 1249.5, 1213.2, 1172.1,
1761 1124.4, 930.33, 893.36, 871.27, 883.54, 940.76, 1036., 1025.6,
1762 1053.1, 914.51, 894.15, 865.03, 670.63, 508.41, 475.15, 370.85,
1763 361.06, 319.38, 312.75, 331.87, 367.13, 415., 467.94, 525.49,
1764 578.41, 624.66, 794.82, 796.97, 780.29, 736.49, 670.18, 603.75,
1765 659.67, 679.8, 857.12, 884.05, 900.65, 1046.1, 1141.9, 1083.,
1766 1089.2, 1e3, 947.08, 872.31, 787.91, 704.75, 624.93, 553.68,
1767 489.91, 434.21, 385.64, 343.3, 306.42, 274.18, 245.94, 221.11,
1768 199.23, 179.88, 162.73, 147.48, 133.88, 121.73, 110.86, 101.1,
1769 92.323, 84.417, 77.281, 70.831, 64.991, 59.694, 54.884, 50.509,
1770 46.526, 42.893, 39.58, 36.549, 33.776, 31.236, 28.907, 26.77,
1771 24.805, 23., 21.339, 19.81, 18.404, 17.105, 15.909, 14.801,
1772 13.778, 12.83, 11.954, 11.142, 10.389, 9.691, 9.0434, 8.4423,
1773 7.8842, 7.3657, 6.8838, 6.4357, 6.0189, 5.6308, 5.2696, 4.9332,
1774 4.6198, 4.3277, 4.0553, 3.8012, 3.5639, 3.3424, 3.1355, 2.9422,
1775 2.7614, 2.5924, 2.4343, 2.2864, 2.148, 2.0184, 1.8971, 1.7835,
1776 1.677, 1.5773, 1.4838, 1.3961, 1.3139, 1.2369, 1.1645, 1.0966,
1777 1.0329, .97309, .91686, .86406, .81439, .76767, .72381, .68252,
1778 .64359, .60695, .57247, .54008, .50957, .48092, .45401, .42862,
1779 .40465, .38202, .36072, .34052, .3216, .30386, .28711, .27135,
1780 .25651, .24252, .2293, .21689, .20517, .19416, .18381, .17396,
1781 .16469
1782 };
1783
1784 static const double co2230[2001] =
1785 { 2.743e-5, 2.8815e-5, 3.027e-5, 3.1798e-5,
1786 3.3405e-5, 3.5094e-5, 3.6869e-5, 3.8734e-5, 4.0694e-5, 4.2754e-5,
1787 4.492e-5, 4.7196e-5, 4.9588e-5, 5.2103e-5, 5.4747e-5, 5.7525e-5,
1788 6.0446e-5, 6.3516e-5, 6.6744e-5, 7.0137e-5, 7.3704e-5, 7.7455e-5,
1789 8.1397e-5, 8.5543e-5, 8.9901e-5, 9.4484e-5, 9.9302e-5, 1.0437e-4,
1790 1.097e-4, 1.153e-4, 1.2119e-4, 1.2738e-4, 1.3389e-4, 1.4074e-4,
1791 1.4795e-4, 1.5552e-4, 1.6349e-4, 1.7187e-4, 1.8068e-4, 1.8995e-4,
1792 1.997e-4, 2.0996e-4, 2.2075e-4, 2.321e-4, 2.4403e-4, 2.5659e-4,
1793 2.698e-4, 2.837e-4, 2.9832e-4, 3.137e-4, 3.2988e-4, 3.4691e-4,
1794 3.6483e-4, 3.8368e-4, 4.0351e-4, 4.2439e-4, 4.4635e-4, 4.6947e-4,
1795 4.9379e-4, 5.1939e-4, 5.4633e-4, 5.7468e-4, 6.0452e-4, 6.3593e-4,
1796 6.69e-4, 7.038e-4, 7.4043e-4, 7.79e-4, 8.1959e-4, 8.6233e-4,
1797 9.0732e-4, 9.5469e-4, .0010046, .0010571, .0011124, .0011706,
1798 .0012319, .0012964, .0013644, .001436, .0015114, .0015908,
1799 .0016745, .0017625, .0018553, .0019531, .002056, .0021645,
1800 .0022788, .0023992, .002526, .0026596, .0028004, .0029488,
1801 .0031052, .0032699, .0034436, .0036265, .0038194, .0040227,
1802 .0042369, .0044628, .0047008, .0049518, .0052164, .0054953,
1803 .0057894, .0060995, .0064265, .0067713, .007135, .0075184,
1804 .0079228, .0083494, .0087993, .0092738, .0097745, .010303,
1805 .01086, .011448, .012068, .012722, .013413, .014142, .014911,
1806 .015723, .01658, .017484, .018439, .019447, .020511, .021635,
1807 .022821, .024074, .025397, .026794, .02827, .029829, .031475,
1808 .033215, .035052, .036994, .039045, .041213, .043504, .045926,
1809 .048485, .05119, .05405, .057074, .060271, .063651, .067225,
1810 .071006, .075004, .079233, .083708, .088441, .093449, .098749,
1811 .10436, .11029, .11657, .12322, .13026, .13772, .14561, .15397,
1812 .16282, .1722, .18214, .19266, .20381, .21563, .22816, .24143,
1813 .2555, .27043, .28625, .30303, .32082, .3397, .35972, .38097,
1814 .40352, .42746, .45286, .47983, .50847, .53888, .57119, .6055,
1815 .64196, .6807, .72187, .76564, .81217, .86165, .91427, .97025,
1816 1.0298, 1.0932, 1.1606, 1.2324, 1.3088, 1.3902, 1.477, 1.5693,
1817 1.6678, 1.7727, 1.8845, 2.0038, 2.131, 2.2666, 2.4114, 2.5659,
1818 2.7309, 2.907, 3.0951, 3.2961, 3.5109, 3.7405, 3.986, 4.2485,
1819 4.5293, 4.8299, 5.1516, 5.4961, 5.8651, 6.2605, 6.6842, 7.1385,
1820 7.6256, 8.1481, 8.7089, 9.3109, 9.9573, 10.652, 11.398, 12.2,
1821 13.063, 13.992, 14.99, 16.064, 17.222, 18.469, 19.813, 21.263,
1822 22.828, 24.516, 26.34, 28.31, 30.437, 32.738, 35.226, 37.914,
1823 40.824, 43.974, 47.377, 51.061, 55.011, 59.299, 63.961, 69.013,
1824 74.492, 80.444, 86.919, 93.836, 101.23, 109.25, 117.98, 127.47,
1825 137.81, 149.07, 161.35, 174.75, 189.42, 205.49, 223.02, 242.26,
1826 263.45, 286.75, 311.94, 340.01, 370.86, 404.92, 440.44, 480.27,
1827 525.17, 574.71, 626.22, 686.8, 754.38, 827.07, 913.38, 1011.7,
1828 1121.5, 1161.6, 1289.5, 1432.2, 1595.4, 1777., 1983.3, 2216.1,
1829 2485.7, 2788.3, 3101.5, 3481., 3902.1, 4257.1, 4740., 5272.8,
1830 5457.9, 5946.2, 6505.3, 6668.4, 7302.4, 8061.6, 9015.8, 9908.3,
1831 11613., 13956., 3249.6, 3243., 2901.5, 2841.3, 2729.6, 2558.2,
1832 1797.8, 1583.2, 1386., 1233.5, 787.74, 701.46, 761.66, 767.21,
1833 722.83, 1180.6, 1332.1, 1461.6, 2032.9, 2166., 2255.9, 2294.7,
1834 2587.2, 2396.5, 2122.4, 12553., 10784., 9832.5, 8827.3, 8029.1,
1835 7377.9, 7347.1, 6783.8, 6239.1, 5721.1, 5503., 4975.1, 4477.8,
1836 4021.3, 3676.8, 3275.3, 2914.9, 2597.4, 2328.2, 2075.4, 1857.6,
1837 1663.6, 1493.3, 1343.8, 1213.3, 1095.6, 1066.5, 958.91, 865.15,
1838 783.31, 714.35, 650.77, 593.98, 546.2, 499.9, 457.87, 421.75,
1839 387.61, 355.25, 326.62, 299.7, 275.21, 253.17, 232.83, 214.31,
1840 197.5, 182.08, 167.98, 155.12, 143.32, 132.5, 122.58, 113.48,
1841 105.11, 97.415, 90.182, 83.463, 77.281, 71.587, 66.341, 61.493,
1842 57.014, 53.062, 49.21, 45.663, 42.38, 39.348, 36.547, 33.967,
1843 31.573, 29.357, 27.314, 25.415, 23.658, 22.03, 20.524, 19.125,
1844 17.829, 16.627, 15.511, 14.476, 13.514, 12.618, 11.786, 11.013,
1845 10.294, 9.6246, 9.0018, 8.4218, 7.8816, 7.3783, 6.9092, 6.4719,
1846 6.0641, 5.6838, 5.3289, 4.998, 4.6893, 4.4014, 4.1325, 3.8813,
1847 3.6469, 3.4283, 3.2241, 3.035, 2.8576, 2.6922, 2.5348, 2.3896,
1848 2.2535, 2.1258, 2.0059, 1.8929, 1.7862, 1.6854, 1.5898, 1.4992,
1849 1.4017, 1.3218, 1.2479, 1.1809, 1.1215, 1.0693, 1.0116, .96016,
1850 .9105, .84859, .80105, .74381, .69982, .65127, .60899, .57843,
1851 .54592, .51792, .49336, .47155, .45201, .43426, .41807, .40303,
1852 .38876, .3863, .37098, .35492, .33801, .32032, .30341, .29874,
1853 .29193, .28689, .29584, .29155, .29826, .29195, .29287, .2904,
1854 .28199, .27709, .27162, .26622, .26133, .25676, .25235, .23137,
1855 .22365, .21519, .20597, .19636, .18699, .16485, .16262, .16643,
1856 .17542, .18198, .18631, .16759, .16338, .13505, .1267, .10053,
1857 .092554, .074093, .062159, .055523, .054849, .05401, .05528,
1858 .058982, .07952, .08647, .093244, .099285, .10393, .10661,
1859 .12072, .11417, .10396, .093265, .089137, .088909, .10902,
1860 .11277, .13625, .13565, .14907, .14167, .1428, .13744, .12768,
1861 .11382, .10244, .091686, .08109, .071739, .063616, .056579,
1862 .050504, .045251, .040689, .036715, .033237, .030181, .027488,
1863 .025107, .022998, .021125, .01946, .017979, .016661, .015489,
1864 .014448, .013526, .012712, .011998, .011375, .010839, .010384,
1865 .010007, .0097053, .0094783, .0093257, .0092489, .0092504,
1866 .0093346, .0095077, .0097676, .01012, .01058, .011157, .011844,
1867 .012672, .013665, .014766, .015999, .017509, .018972, .020444,
1868 .022311, .023742, .0249, .025599, .026981, .026462, .025143,
1869 .025066, .022814, .020458, .020026, .019142, .020189, .022371,
1870 .024163, .023728, .02199, .019506, .018591, .015576, .012784,
1871 .011744, .0094777, .0079148, .0070652, .006986, .0071758,
1872 .008086, .0098025, .01087, .013609, .016764, .018137, .021061,
1873 .023498, .023576, .023965, .022828, .021519, .021283, .023364,
1874 .026457, .029782, .030856, .033486, .035515, .035543, .036558,
1875 .037198, .037472, .037045, .037284, .03777, .038085, .038366,
1876 .038526, .038282, .038915, .037697, .035667, .032941, .031959,
1877 .028692, .025918, .024596, .025592, .027873, .028935, .02984,
1878 .028148, .025305, .021912, .020454, .016732, .013357, .01205,
1879 .009731, .0079881, .0077704, .0074387, .0083895, .0096776,
1880 .010326, .01293, .015955, .019247, .020145, .02267, .024231,
1881 .024184, .022131, .019784, .01955, .01971, .022119, .025116,
1882 .027978, .028107, .029808, .030701, .029164, .028551, .027286,
1883 .024946, .023259, .020982, .019221, .017471, .015643, .014074,
1884 .01261, .011301, .010116, .0090582, .0081036, .0072542, .0065034,
1885 .0058436, .0052571, .0047321, .0042697, .0038607, .0034977,
1886 .0031747, .0028864, .0026284, .002397, .002189, .0020017,
1887 .0018326, .0016798, .0015414, .0014159, .0013019, .0011983,
1888 .0011039, .0010177, 9.391e-4, 8.6717e-4, 8.0131e-4, 7.4093e-4,
1889 6.8553e-4, 6.3464e-4, 5.8787e-4, 5.4487e-4, 5.0533e-4, 4.69e-4,
1890 4.3556e-4, 4.0474e-4, 3.7629e-4, 3.5e-4, 3.2569e-4, 3.032e-4,
1891 2.8239e-4, 2.6314e-4, 2.4535e-4, 2.2891e-4, 2.1374e-4, 1.9975e-4,
1892 1.8685e-4, 1.7498e-4, 1.6406e-4, 1.5401e-4, 1.4479e-4, 1.3633e-4,
1893 1.2858e-4, 1.2148e-4, 1.1499e-4, 1.0907e-4, 1.0369e-4, 9.8791e-5,
1894 9.4359e-5, 9.0359e-5, 8.6766e-5, 8.3555e-5, 8.0703e-5, 7.8192e-5,
1895 7.6003e-5, 7.4119e-5, 7.2528e-5, 7.1216e-5, 7.0171e-5, 6.9385e-5,
1896 6.8848e-5, 6.8554e-5, 6.8496e-5, 6.8669e-5, 6.9069e-5, 6.9694e-5,
1897 7.054e-5, 7.1608e-5, 7.2896e-5, 7.4406e-5, 7.6139e-5, 7.8097e-5,
1898 8.0283e-5, 8.2702e-5, 8.5357e-5, 8.8255e-5, 9.1402e-5, 9.4806e-5,
1899 9.8473e-5, 1.0241e-4, 1.0664e-4, 1.1115e-4, 1.1598e-4, 1.2112e-4,
1900 1.2659e-4, 1.3241e-4, 1.3859e-4, 1.4515e-4, 1.521e-4, 1.5947e-4,
1901 1.6728e-4, 1.7555e-4, 1.8429e-4, 1.9355e-4, 2.0334e-4, 2.1369e-4,
1902 2.2463e-4, 2.3619e-4, 2.4841e-4, 2.6132e-4, 2.7497e-4, 2.8938e-4,
1903 3.0462e-4, 3.2071e-4, 3.3771e-4, 3.5567e-4, 3.7465e-4, 3.947e-4,
1904 4.1588e-4, 4.3828e-4, 4.6194e-4, 4.8695e-4, 5.1338e-4, 5.4133e-4,
1905 5.7087e-4, 6.0211e-4, 6.3515e-4, 6.701e-4, 7.0706e-4, 7.4617e-4,
1906 7.8756e-4, 8.3136e-4, 8.7772e-4, 9.2681e-4, 9.788e-4, .0010339,
1907 .0010922, .001154, .0012195, .0012889, .0013626, .0014407,
1908 .0015235, .0016114, .0017048, .0018038, .001909, .0020207,
1909 .0021395, .0022657, .0023998, .0025426, .0026944, .002856,
1910 .0030281, .0032114, .0034068, .003615, .0038371, .004074,
1911 .004327, .0045971, .0048857, .0051942, .0055239, .0058766,
1912 .0062538, .0066573, .0070891, .007551, .0080455, .0085747,
1913 .0091412, .0097481, .010397, .011092, .011837, .012638, .013495,
1914 .014415, .01541, .016475, .017621, .018857, .020175, .02162,
1915 .023185, .024876, .02672, .028732, .030916, .033319, .035939,
1916 .038736, .041847, .04524, .048715, .052678, .056977, .061203,
1917 .066184, .07164, .076952, .083477, .090674, .098049, .10697,
1918 .1169, .1277, .14011, .15323, .1684, .18601, .20626, .22831,
1919 .25417, .28407, .31405, .34957, .38823, .41923, .46026, .50409,
1920 .51227, .54805, .57976, .53818, .55056, .557, .46741, .46403,
1921 .4636, .42265, .45166, .49852, .56663, .34306, .17779, .17697,
1922 .18346, .19129, .20014, .21778, .23604, .25649, .28676, .31238,
1923 .33856, .39998, .4288, .46568, .56654, .60786, .64473, .76466,
1924 .7897, .80778, .86443, .85736, .84798, .84157, 1.1385, 1.2446,
1925 1.1923, 1.1552, 1.1338, 1.1266, 1.1292, 1.1431, 1.1683, 1.2059,
1926 1.2521, 1.3069, 1.3712, 1.4471, 1.5275, 1.6165, 1.7145, 1.8189,
1927 1.9359, 2.065, 2.2007, 2.3591, 2.5362, 2.7346, 2.9515, 3.2021,
1928 3.4851, 3.7935, 4.0694, 4.4463, 4.807, 5.2443, 5.7178, 6.2231,
1929 6.4796, 6.9461, 7.4099, 7.3652, 7.7182, 8.048, 7.7373, 8.0363,
1930 8.3855, 8.8044, 9.0257, 9.8574, 10.948, 10.563, 6.8979, 7.0744,
1931 7.4121, 7.7663, 8.1768, 8.6243, 9.1437, 9.7847, 10.182, 10.849,
1932 11.572, 12.602, 13.482, 14.431, 15.907, 16.983, 18.11, 19.884,
1933 21.02, 22.18, 23.355, 24.848, 25.954, 27.13, 30.186, 34.893,
1934 35.682, 36.755, 38.111, 39.703, 41.58, 43.606, 45.868, 48.573,
1935 51.298, 54.291, 57.559, 61.116, 64.964, 69.124, 73.628, 78.471,
1936 83.683, 89.307, 95.341, 101.84, 108.83, 116.36, 124.46, 133.18,
1937 142.57, 152.79, 163.69, 175.43, 188.11, 201.79, 216.55, 232.51,
1938 249.74, 268.38, 288.54, 310.35, 333.97, 359.55, 387.26, 417.3,
1939 449.88, 485.2, 523.54, 565.14, 610.28, 659.31, 712.56, 770.43,
1940 833.36, 901.82, 976.36, 1057.6, 1146.8, 1243.8, 1350., 1466.3,
1941 1593.6, 1732.7, 1884.1, 2049.1, 2228.2, 2421.9, 2629.4, 2853.7,
1942 3094.4, 3351.1, 3622.3, 3829.8, 4123.1, 4438.3, 4777.2, 5144.1,
1943 5545.4, 5990.5, 6404.5, 6996.8, 7687.6, 8482.9, 9349.4, 10203.,
1944 11223., 12358., 13493., 14916., 16416., 18236., 20222., 22501.,
1945 25102., 28358., 31707., 35404., 39538., 43911., 48391., 53193.,
1946 58028., 58082., 61276., 64193., 66294., 67480., 67921., 67423.,
1947 66254., 64341., 51737., 51420., 53072., 58145., 66195., 65358.,
1948 67377., 67869., 53509., 50553., 35737., 32425., 21704., 19974.,
1949 14457., 12142., 16798., 19489., 23049., 27270., 31910., 36457.,
1950 40877., 44748., 47876., 59793., 58626., 55454., 50337., 44893.,
1951 50228., 52216., 54747., 69541., 70455., 81014., 77694., 80533.,
1952 73953., 70927., 65539., 59002., 52281., 45953., 40292., 35360.,
1953 31124., 27478., 24346., 21647., 19308., 17271., 15491., 13927.,
1954 12550., 11331., 10250., 9288.8, 8431.4, 7664.9, 6978.3, 6361.8,
1955 5807.4, 5307.7, 4856.8, 4449., 4079.8, 3744.9, 3440.8, 3164.2,
1956 2912.3, 2682.7, 2473., 2281.4, 2106., 1945.3, 1797.9, 1662.5,
1957 1538.1, 1423.6, 1318.1, 1221., 1131.5, 1049., 972.99, 902.87,
1958 838.01, 777.95, 722.2, 670.44, 622.35, 577.68, 536.21, 497.76,
1959 462.12, 429.13, 398.61, 370.39, 344.29, 320.16, 297.85, 277.2,
1960 258.08, 240.38, 223.97, 208.77, 194.66, 181.58, 169.43, 158.15,
1961 147.67, 137.92, 128.86, 120.44, 112.6, 105.3, 98.499, 92.166,
1962 86.264, 80.763, 75.632, 70.846, 66.381, 62.213, 58.321, 54.685,
1963 51.288, 48.114, 45.145, 42.368, 39.772, 37.341, 35.065, 32.937,
1964 30.943, 29.077, 27.33, 25.693, 24.158, 22.717, 21.367, 20.099,
1965 18.909, 17.792, 16.744, 15.761, 14.838, 13.971, 13.157, 12.393,
1966 11.676, 11.003, 10.369, 9.775, 9.2165, 8.6902, 8.1963, 7.7314,
1967 7.2923, 6.8794, 6.4898, 6.122, 5.7764, 5.4525, 5.1484, 4.8611,
1968 4.5918, 4.3379, 4.0982, 3.8716, 3.6567, 3.4545, 3.2634, 3.0828,
1969 2.9122, 2.7512, 2.5993, 2.4561, 2.3211, 2.1938, 2.0737, 1.9603,
1970 1.8534, 1.7525, 1.6572, 1.5673, 1.4824, 1.4022, 1.3265, 1.2551,
1971 1.1876, 1.1239, 1.0637, 1.0069, .9532, .90248, .85454, .80921,
1972 .76631, .72569, .6872, .65072, .61635, .5836, .55261, .52336,
1973 .49581, .46998, .44559, .42236, .40036, .37929, .35924, .34043,
1974 .32238, .30547, .28931, .27405, .25975, .24616, .23341, .22133,
1975 .20997, .19924, .18917, .17967, .17075, .16211, .15411, .14646,
1976 .13912, .13201, .12509, .11857, .11261, .10698, .10186, .097039,
1977 .092236, .087844, .083443, .07938, .075452, .071564, .067931,
1978 .064389, .061078, .057901, .054921, .052061, .049364, .046789,
1979 .04435, .042044, .039866, .037808, .035863, .034023, .032282,
1980 .030634, .029073, .027595, .026194, .024866, .023608, .022415,
1981 .021283, .02021, .019193, .018228, .017312, .016443, .015619,
1982 .014837, .014094, .01339, .012721, .012086, .011483, .010911,
1983 .010368, .009852, .0093623, .0088972, .0084556, .0080362,
1984 .0076379, .0072596, .0069003, .006559, .0062349, .0059269,
1985 .0056344, .0053565, .0050925, .0048417, .0046034, .004377,
1986 .0041618, .0039575, .0037633, .0035788, .0034034, .0032368,
1987 .0030785, .002928, .0027851, .0026492, .0025201, .0023975,
1988 .0022809, .0021701, .0020649, .0019649, .0018699, .0017796,
1989 .0016938, .0016122, .0015348, .0014612, .0013913, .001325,
1990 .0012619, .0012021, .0011452, .0010913, .0010401, 9.9149e-4,
1991 9.454e-4, 9.0169e-4, 8.6024e-4, 8.2097e-4, 7.8377e-4, 7.4854e-4,
1992 7.1522e-4, 6.8371e-4, 6.5393e-4, 6.2582e-4, 5.9932e-4, 5.7435e-4,
1993 5.5087e-4, 5.2882e-4, 5.0814e-4, 4.8881e-4, 4.7076e-4, 4.5398e-4,
1994 4.3843e-4, 4.2407e-4, 4.109e-4, 3.9888e-4, 3.88e-4, 3.7826e-4,
1995 3.6963e-4, 3.6213e-4, 3.5575e-4, 3.505e-4, 3.464e-4, 3.4346e-4,
1996 3.4173e-4, 3.4125e-4, 3.4206e-4, 3.4424e-4, 3.4787e-4, 3.5303e-4,
1997 3.5986e-4, 3.6847e-4, 3.7903e-4, 3.9174e-4, 4.0681e-4, 4.2455e-4,
1998 4.4527e-4, 4.6942e-4, 4.9637e-4, 5.2698e-4, 5.5808e-4, 5.9514e-4,
1999 6.2757e-4, 6.689e-4, 7.1298e-4, 7.3955e-4, 7.8403e-4, 8.0449e-4,
2000 8.5131e-4, 9.0256e-4, 9.3692e-4, .0010051, .0010846, .0011678,
2001 .001282, .0014016, .0015355, .0016764, .0018272, .0020055,
2002 .0021455, .0023421, .0024615, .0026786, .0028787, .0031259,
2003 .0034046, .0036985, .0040917, .0043902, .0048349, .0049531,
2004 .0052989, .0056148, .0052452, .0053357, .005333, .0045069,
2005 .0043851, .004253, .003738, .0038084, .0039013, .0041505,
2006 .0045372, .0050569, .0054507, .0061267, .0066122, .0072449,
2007 .0078012, .0082651, .0076538, .0076573, .0076806, .0075227,
2008 .0076269, .0063758, .006254, .0067749, .0067909, .0068231,
2009 .0072143, .0072762, .0072954, .007679, .0075107, .0073658,
2010 .0072441, .0071074, .0070378, .007176, .0072472, .0075844,
2011 .0079291, .008412, .0090165, .010688, .011535, .012375, .013166,
2012 .013895, .015567, .016011, .016392, .016737, .017043, .017731,
2013 .018031, .018419, .018877, .019474, .019868, .020604, .021538,
2014 .022653, .023869, .025288, .026879, .028547, .030524, .03274,
2015 .035132, .03769, .040567, .043793, .047188, .049962, .053542,
2016 .057205, .060776, .061489, .064419, .067124, .065945, .068487,
2017 .071209, .074783, .077039, .082444, .08902, .09692, .10617,
2018 .11687, .12952, .12362, .13498, .14412, .15492, .16519, .1744,
2019 .17096, .17714, .18208, .17363, .17813, .18564, .18295, .19045,
2020 .20252, .20815, .21844, .22929, .24229, .25321, .26588, .2797,
2021 .29465, .31136, .32961, .36529, .38486, .41027, .43694, .4667,
2022 .49943, .54542, .58348, .62303, .67633, .71755, .76054, .81371,
2023 .85934, .90841, .96438, 1.0207, 1.0821, 1.1491, 1.2226, 1.3018,
2024 1.388, 1.4818, 1.5835, 1.6939, 1.8137, 1.9435, 2.0843, 2.237,
2025 2.4026, 2.5818, 2.7767, 2.9885, 3.2182, 3.4679, 3.7391, 4.0349,
2026 4.3554, 4.7053, 5.0849, 5.4986, 5.9436, 6.4294, 6.9598, 7.5203,
2027 8.143, 8.8253, 9.5568, 10.371, 11.267, 12.233, 13.31, 14.357,
2028 15.598, 16.93, 18.358, 19.849, 21.408, 23.04, 24.706, 26.409,
2029 28.153, 28.795, 30.549, 32.43, 34.49, 36.027, 38.955, 42.465,
2030 46.565, 50.875, 55.378, 59.002, 63.882, 67.949, 73.693, 80.095,
2031 86.403, 94.264, 102.65, 112.37, 123.3, 135.54, 149.14, 163.83,
2032 179.17, 196.89, 217.91, 240.94, 264.13, 292.39, 324.83, 358.21,
2033 397.16, 440.5, 488.6, 541.04, 595.3, 650.43, 652.03, 688.74,
2034 719.47, 743.54, 757.68, 762.35, 756.43, 741.42, 595.43, 580.97,
2035 580.83, 605.68, 667.88, 764.49, 759.93, 789.12, 798.17, 645.66,
2036 615.65, 455.05, 421.09, 306.45, 289.14, 235.7, 215.52, 274.57,
2037 316.53, 357.73, 409.89, 465.06, 521.84, 579.02, 630.64, 794.46,
2038 813., 813.56, 796.25, 761.57, 727.97, 812.14, 866.75, 932.5,
2039 1132.8, 1194.8, 1362.2, 1387.2, 1482.3, 1479.7, 1517.9, 1533.1,
2040 1534.2, 1523.3, 1522.5, 1515.5, 1505.2, 1486.5, 1454., 1412.,
2041 1358.8, 1107.8, 1060.9, 1033.5, 1048.2, 1122.4, 1248.9, 1227.1,
2042 1255.4, 1058.9, 1020.7, 970.59, 715.24, 512.56, 468.47, 349.3,
2043 338.26, 299.22, 301.26, 332.38, 382.08, 445.49, 515.87, 590.85,
2044 662.3, 726.05, 955.59, 964.11, 945.17, 891.48, 807.11, 720.9,
2045 803.36, 834.46, 1073.9, 1107.1, 1123.6, 1296., 1393.7, 1303.1,
2046 1284.3, 1161.8, 1078.8, 976.13, 868.72, 767.4, 674.72, 593.73,
2047 523.12, 462.24, 409.75, 364.34, 325., 290.73, 260.76, 234.46,
2048 211.28, 190.78, 172.61, 156.44, 142.01, 129.12, 117.57, 107.2,
2049 97.877, 89.47, 81.882, 75.021, 68.807, 63.171, 58.052, 53.396,
2050 49.155, 45.288, 41.759, 38.531, 35.576, 32.868, 30.384, 28.102,
2051 26.003, 24.071, 22.293, 20.655, 19.147, 17.756, 16.476, 15.292,
2052 14.198, 13.183, 12.241, 11.367, 10.554, 9.7989, 9.0978, 8.4475,
2053 7.845, 7.2868, 6.7704, 6.2927, 5.8508, 5.4421, 5.064, 4.714,
2054 4.3902, 4.0902, 3.8121, 3.5543, 3.315, 3.093, 2.8869, 2.6953,
2055 2.5172, 2.3517, 2.1977, 2.0544, 1.9211, 1.7969, 1.6812, 1.5735,
2056 1.4731, 1.3794, 1.2921, 1.2107, 1.1346, 1.0637, .99744, .93554,
2057 .87771, .82368, .77313, .72587, .6816, .64014, .60134, .565,
2058 .53086, .49883, .46881, .44074, .4144, .38979, .36679, .34513,
2059 .32474, .30552, .28751, .27045, .25458, .23976, .22584, .21278,
2060 .20051, .18899, .17815, .16801, .15846, .14954, .14117, .13328,
2061 .12584
2062 };
2063
2064 /* Get CO2 continuum absorption... */
2065 const double xw = nu / 2 + 1;
2066 if (xw >= 1 && xw < 2001) {
2067 const int iw = (int) xw;
2068 const double dw = xw - iw;
2069 const double ew = 1 - dw;
2070 const double cw296 = ew * co2296[iw - 1] + dw * co2296[iw];
2071 const double cw260 = ew * co2260[iw - 1] + dw * co2260[iw];
2072 const double cw230 = ew * co2230[iw - 1] + dw * co2230[iw];
2073 const double dt230 = t - 230;
2074 const double dt260 = t - 260;
2075 const double dt296 = t - 296;
2076 const double ctw =
2077 dt260 * 5.050505e-4 * dt296 * cw230 -
2078 dt230 * 9.259259e-4 * dt296 * cw260 +
2079 dt230 * 4.208754e-4 * dt260 * cw296;
2080 return u / NA / 1000 * p / P0 * ctw;
2081 } else
2082 return 0;
2083}
2084
2085/*****************************************************************************/
2086
2087double ctmh2o(
2088 const double nu,
2089 const double p,
2090 const double t,
2091 const double q,
2092 const double u) {
2093
2094 static const double h2o296[2001] =
2095 { .17, .1695, .172, .168, .1687, .1624, .1606,
2096 .1508, .1447, .1344, .1214, .1133, .1009, .09217, .08297, .06989,
2097 .06513, .05469, .05056, .04417, .03779, .03484, .02994, .0272,
2098 .02325, .02063, .01818, .01592, .01405, .01251, .0108, .009647,
2099 .008424, .007519, .006555, .00588, .005136, .004511, .003989,
2100 .003509, .003114, .00274, .002446, .002144, .001895, .001676,
2101 .001486, .001312, .001164, .001031, 9.129e-4, 8.106e-4, 7.213e-4,
2102 6.4e-4, 5.687e-4, 5.063e-4, 4.511e-4, 4.029e-4, 3.596e-4,
2103 3.22e-4, 2.889e-4, 2.597e-4, 2.337e-4, 2.108e-4, 1.907e-4,
2104 1.728e-4, 1.57e-4, 1.43e-4, 1.305e-4, 1.195e-4, 1.097e-4,
2105 1.009e-4, 9.307e-5, 8.604e-5, 7.971e-5, 7.407e-5, 6.896e-5,
2106 6.433e-5, 6.013e-5, 5.631e-5, 5.283e-5, 4.963e-5, 4.669e-5,
2107 4.398e-5, 4.148e-5, 3.917e-5, 3.702e-5, 3.502e-5, 3.316e-5,
2108 3.142e-5, 2.978e-5, 2.825e-5, 2.681e-5, 2.546e-5, 2.419e-5,
2109 2.299e-5, 2.186e-5, 2.079e-5, 1.979e-5, 1.884e-5, 1.795e-5,
2110 1.711e-5, 1.633e-5, 1.559e-5, 1.49e-5, 1.426e-5, 1.367e-5,
2111 1.312e-5, 1.263e-5, 1.218e-5, 1.178e-5, 1.143e-5, 1.112e-5,
2112 1.088e-5, 1.07e-5, 1.057e-5, 1.05e-5, 1.051e-5, 1.059e-5,
2113 1.076e-5, 1.1e-5, 1.133e-5, 1.18e-5, 1.237e-5, 1.308e-5,
2114 1.393e-5, 1.483e-5, 1.614e-5, 1.758e-5, 1.93e-5, 2.123e-5,
2115 2.346e-5, 2.647e-5, 2.93e-5, 3.279e-5, 3.745e-5, 4.152e-5,
2116 4.813e-5, 5.477e-5, 6.203e-5, 7.331e-5, 8.056e-5, 9.882e-5,
2117 1.05e-4, 1.21e-4, 1.341e-4, 1.572e-4, 1.698e-4, 1.968e-4,
2118 2.175e-4, 2.431e-4, 2.735e-4, 2.867e-4, 3.19e-4, 3.371e-4,
2119 3.554e-4, 3.726e-4, 3.837e-4, 3.878e-4, 3.864e-4, 3.858e-4,
2120 3.841e-4, 3.852e-4, 3.815e-4, 3.762e-4, 3.618e-4, 3.579e-4,
2121 3.45e-4, 3.202e-4, 3.018e-4, 2.785e-4, 2.602e-4, 2.416e-4,
2122 2.097e-4, 1.939e-4, 1.689e-4, 1.498e-4, 1.308e-4, 1.17e-4,
2123 1.011e-4, 9.237e-5, 7.909e-5, 7.006e-5, 6.112e-5, 5.401e-5,
2124 4.914e-5, 4.266e-5, 3.963e-5, 3.316e-5, 3.037e-5, 2.598e-5,
2125 2.294e-5, 2.066e-5, 1.813e-5, 1.583e-5, 1.423e-5, 1.247e-5,
2126 1.116e-5, 9.76e-6, 8.596e-6, 7.72e-6, 6.825e-6, 6.108e-6,
2127 5.366e-6, 4.733e-6, 4.229e-6, 3.731e-6, 3.346e-6, 2.972e-6,
2128 2.628e-6, 2.356e-6, 2.102e-6, 1.878e-6, 1.678e-6, 1.507e-6,
2129 1.348e-6, 1.21e-6, 1.089e-6, 9.806e-7, 8.857e-7, 8.004e-7,
2130 7.261e-7, 6.599e-7, 6.005e-7, 5.479e-7, 5.011e-7, 4.595e-7,
2131 4.219e-7, 3.885e-7, 3.583e-7, 3.314e-7, 3.071e-7, 2.852e-7,
2132 2.654e-7, 2.474e-7, 2.311e-7, 2.162e-7, 2.026e-7, 1.902e-7,
2133 1.788e-7, 1.683e-7, 1.587e-7, 1.497e-7, 1.415e-7, 1.338e-7,
2134 1.266e-7, 1.2e-7, 1.138e-7, 1.08e-7, 1.027e-7, 9.764e-8,
2135 9.296e-8, 8.862e-8, 8.458e-8, 8.087e-8, 7.744e-8, 7.429e-8,
2136 7.145e-8, 6.893e-8, 6.664e-8, 6.468e-8, 6.322e-8, 6.162e-8,
2137 6.07e-8, 5.992e-8, 5.913e-8, 5.841e-8, 5.796e-8, 5.757e-8,
2138 5.746e-8, 5.731e-8, 5.679e-8, 5.577e-8, 5.671e-8, 5.656e-8,
2139 5.594e-8, 5.593e-8, 5.602e-8, 5.62e-8, 5.693e-8, 5.725e-8,
2140 5.858e-8, 6.037e-8, 6.249e-8, 6.535e-8, 6.899e-8, 7.356e-8,
2141 7.918e-8, 8.618e-8, 9.385e-8, 1.039e-7, 1.158e-7, 1.29e-7,
2142 1.437e-7, 1.65e-7, 1.871e-7, 2.121e-7, 2.427e-7, 2.773e-7,
2143 3.247e-7, 3.677e-7, 4.037e-7, 4.776e-7, 5.101e-7, 6.214e-7,
2144 6.936e-7, 7.581e-7, 8.486e-7, 9.355e-7, 9.942e-7, 1.063e-6,
2145 1.123e-6, 1.191e-6, 1.215e-6, 1.247e-6, 1.26e-6, 1.271e-6,
2146 1.284e-6, 1.317e-6, 1.323e-6, 1.349e-6, 1.353e-6, 1.362e-6,
2147 1.344e-6, 1.329e-6, 1.336e-6, 1.327e-6, 1.325e-6, 1.359e-6,
2148 1.374e-6, 1.415e-6, 1.462e-6, 1.526e-6, 1.619e-6, 1.735e-6,
2149 1.863e-6, 2.034e-6, 2.265e-6, 2.482e-6, 2.756e-6, 3.103e-6,
2150 3.466e-6, 3.832e-6, 4.378e-6, 4.913e-6, 5.651e-6, 6.311e-6,
2151 7.169e-6, 8.057e-6, 9.253e-6, 1.047e-5, 1.212e-5, 1.36e-5,
2152 1.569e-5, 1.776e-5, 2.02e-5, 2.281e-5, 2.683e-5, 2.994e-5,
2153 3.488e-5, 3.896e-5, 4.499e-5, 5.175e-5, 6.035e-5, 6.34e-5,
2154 7.281e-5, 7.923e-5, 8.348e-5, 9.631e-5, 1.044e-4, 1.102e-4,
2155 1.176e-4, 1.244e-4, 1.283e-4, 1.326e-4, 1.4e-4, 1.395e-4,
2156 1.387e-4, 1.363e-4, 1.314e-4, 1.241e-4, 1.228e-4, 1.148e-4,
2157 1.086e-4, 1.018e-4, 8.89e-5, 8.316e-5, 7.292e-5, 6.452e-5,
2158 5.625e-5, 5.045e-5, 4.38e-5, 3.762e-5, 3.29e-5, 2.836e-5,
2159 2.485e-5, 2.168e-5, 1.895e-5, 1.659e-5, 1.453e-5, 1.282e-5,
2160 1.132e-5, 1.001e-5, 8.836e-6, 7.804e-6, 6.922e-6, 6.116e-6,
2161 5.429e-6, 4.824e-6, 4.278e-6, 3.788e-6, 3.371e-6, 2.985e-6,
2162 2.649e-6, 2.357e-6, 2.09e-6, 1.858e-6, 1.647e-6, 1.462e-6,
2163 1.299e-6, 1.155e-6, 1.028e-6, 9.142e-7, 8.132e-7, 7.246e-7,
2164 6.451e-7, 5.764e-7, 5.151e-7, 4.603e-7, 4.121e-7, 3.694e-7,
2165 3.318e-7, 2.985e-7, 2.69e-7, 2.428e-7, 2.197e-7, 1.992e-7,
2166 1.81e-7, 1.649e-7, 1.506e-7, 1.378e-7, 1.265e-7, 1.163e-7,
2167 1.073e-7, 9.918e-8, 9.191e-8, 8.538e-8, 7.949e-8, 7.419e-8,
2168 6.94e-8, 6.508e-8, 6.114e-8, 5.761e-8, 5.437e-8, 5.146e-8,
2169 4.89e-8, 4.636e-8, 4.406e-8, 4.201e-8, 4.015e-8, 3.84e-8,
2170 3.661e-8, 3.51e-8, 3.377e-8, 3.242e-8, 3.13e-8, 3.015e-8,
2171 2.918e-8, 2.83e-8, 2.758e-8, 2.707e-8, 2.656e-8, 2.619e-8,
2172 2.609e-8, 2.615e-8, 2.63e-8, 2.675e-8, 2.745e-8, 2.842e-8,
2173 2.966e-8, 3.125e-8, 3.318e-8, 3.565e-8, 3.85e-8, 4.191e-8,
2174 4.59e-8, 5.059e-8, 5.607e-8, 6.239e-8, 6.958e-8, 7.796e-8,
2175 8.773e-8, 9.88e-8, 1.114e-7, 1.258e-7, 1.422e-7, 1.61e-7,
2176 1.822e-7, 2.06e-7, 2.337e-7, 2.645e-7, 2.996e-7, 3.393e-7,
2177 3.843e-7, 4.363e-7, 4.935e-7, 5.607e-7, 6.363e-7, 7.242e-7,
2178 8.23e-7, 9.411e-7, 1.071e-6, 1.232e-6, 1.402e-6, 1.6e-6, 1.82e-6,
2179 2.128e-6, 2.386e-6, 2.781e-6, 3.242e-6, 3.653e-6, 4.323e-6,
2180 4.747e-6, 5.321e-6, 5.919e-6, 6.681e-6, 7.101e-6, 7.983e-6,
2181 8.342e-6, 8.741e-6, 9.431e-6, 9.952e-6, 1.026e-5, 1.055e-5,
2182 1.095e-5, 1.095e-5, 1.087e-5, 1.056e-5, 1.026e-5, 9.715e-6,
2183 9.252e-6, 8.452e-6, 7.958e-6, 7.268e-6, 6.295e-6, 6.003e-6, 5e-6,
2184 4.591e-6, 3.983e-6, 3.479e-6, 3.058e-6, 2.667e-6, 2.293e-6,
2185 1.995e-6, 1.747e-6, 1.517e-6, 1.335e-6, 1.165e-6, 1.028e-6,
2186 9.007e-7, 7.956e-7, 7.015e-7, 6.192e-7, 5.491e-7, 4.859e-7,
2187 4.297e-7, 3.799e-7, 3.38e-7, 3.002e-7, 2.659e-7, 2.366e-7,
2188 2.103e-7, 1.861e-7, 1.655e-7, 1.469e-7, 1.309e-7, 1.162e-7,
2189 1.032e-7, 9.198e-8, 8.181e-8, 7.294e-8, 6.516e-8, 5.787e-8,
2190 5.163e-8, 4.612e-8, 4.119e-8, 3.695e-8, 3.308e-8, 2.976e-8,
2191 2.67e-8, 2.407e-8, 2.171e-8, 1.965e-8, 1.78e-8, 1.617e-8,
2192 1.47e-8, 1.341e-8, 1.227e-8, 1.125e-8, 1.033e-8, 9.524e-9,
2193 8.797e-9, 8.162e-9, 7.565e-9, 7.04e-9, 6.56e-9, 6.129e-9,
2194 5.733e-9, 5.376e-9, 5.043e-9, 4.75e-9, 4.466e-9, 4.211e-9,
2195 3.977e-9, 3.759e-9, 3.558e-9, 3.373e-9, 3.201e-9, 3.043e-9,
2196 2.895e-9, 2.76e-9, 2.635e-9, 2.518e-9, 2.411e-9, 2.314e-9,
2197 2.23e-9, 2.151e-9, 2.087e-9, 2.035e-9, 1.988e-9, 1.946e-9,
2198 1.927e-9, 1.916e-9, 1.916e-9, 1.933e-9, 1.966e-9, 2.018e-9,
2199 2.09e-9, 2.182e-9, 2.299e-9, 2.442e-9, 2.623e-9, 2.832e-9,
2200 3.079e-9, 3.368e-9, 3.714e-9, 4.104e-9, 4.567e-9, 5.091e-9,
2201 5.701e-9, 6.398e-9, 7.194e-9, 8.127e-9, 9.141e-9, 1.035e-8,
2202 1.177e-8, 1.338e-8, 1.508e-8, 1.711e-8, 1.955e-8, 2.216e-8,
2203 2.534e-8, 2.871e-8, 3.291e-8, 3.711e-8, 4.285e-8, 4.868e-8,
2204 5.509e-8, 6.276e-8, 7.262e-8, 8.252e-8, 9.4e-8, 1.064e-7,
2205 1.247e-7, 1.411e-7, 1.626e-7, 1.827e-7, 2.044e-7, 2.284e-7,
2206 2.452e-7, 2.854e-7, 3.026e-7, 3.278e-7, 3.474e-7, 3.693e-7,
2207 3.93e-7, 4.104e-7, 4.22e-7, 4.439e-7, 4.545e-7, 4.778e-7,
2208 4.812e-7, 5.018e-7, 4.899e-7, 5.075e-7, 5.073e-7, 5.171e-7,
2209 5.131e-7, 5.25e-7, 5.617e-7, 5.846e-7, 6.239e-7, 6.696e-7,
2210 7.398e-7, 8.073e-7, 9.15e-7, 1.009e-6, 1.116e-6, 1.264e-6,
2211 1.439e-6, 1.644e-6, 1.856e-6, 2.147e-6, 2.317e-6, 2.713e-6,
2212 2.882e-6, 2.99e-6, 3.489e-6, 3.581e-6, 4.033e-6, 4.26e-6,
2213 4.543e-6, 4.84e-6, 4.826e-6, 5.013e-6, 5.252e-6, 5.277e-6,
2214 5.306e-6, 5.236e-6, 5.123e-6, 5.171e-6, 4.843e-6, 4.615e-6,
2215 4.385e-6, 3.97e-6, 3.693e-6, 3.231e-6, 2.915e-6, 2.495e-6,
2216 2.144e-6, 1.91e-6, 1.639e-6, 1.417e-6, 1.226e-6, 1.065e-6,
2217 9.29e-7, 8.142e-7, 7.161e-7, 6.318e-7, 5.581e-7, 4.943e-7,
2218 4.376e-7, 3.884e-7, 3.449e-7, 3.06e-7, 2.712e-7, 2.412e-7,
2219 2.139e-7, 1.903e-7, 1.689e-7, 1.499e-7, 1.331e-7, 1.183e-7,
2220 1.05e-7, 9.362e-8, 8.306e-8, 7.403e-8, 6.578e-8, 5.853e-8,
2221 5.216e-8, 4.632e-8, 4.127e-8, 3.678e-8, 3.279e-8, 2.923e-8,
2222 2.612e-8, 2.339e-8, 2.094e-8, 1.877e-8, 1.686e-8, 1.516e-8,
2223 1.366e-8, 1.234e-8, 1.114e-8, 1.012e-8, 9.182e-9, 8.362e-9,
2224 7.634e-9, 6.981e-9, 6.406e-9, 5.888e-9, 5.428e-9, 5.021e-9,
2225 4.65e-9, 4.326e-9, 4.033e-9, 3.77e-9, 3.536e-9, 3.327e-9,
2226 3.141e-9, 2.974e-9, 2.825e-9, 2.697e-9, 2.584e-9, 2.488e-9,
2227 2.406e-9, 2.34e-9, 2.292e-9, 2.259e-9, 2.244e-9, 2.243e-9,
2228 2.272e-9, 2.31e-9, 2.378e-9, 2.454e-9, 2.618e-9, 2.672e-9,
2229 2.831e-9, 3.05e-9, 3.225e-9, 3.425e-9, 3.677e-9, 3.968e-9,
2230 4.221e-9, 4.639e-9, 4.96e-9, 5.359e-9, 5.649e-9, 6.23e-9,
2231 6.716e-9, 7.218e-9, 7.746e-9, 7.988e-9, 8.627e-9, 8.999e-9,
2232 9.442e-9, 9.82e-9, 1.015e-8, 1.06e-8, 1.079e-8, 1.109e-8,
2233 1.137e-8, 1.186e-8, 1.18e-8, 1.187e-8, 1.194e-8, 1.192e-8,
2234 1.224e-8, 1.245e-8, 1.246e-8, 1.318e-8, 1.377e-8, 1.471e-8,
2235 1.582e-8, 1.713e-8, 1.853e-8, 2.063e-8, 2.27e-8, 2.567e-8,
2236 2.891e-8, 3.264e-8, 3.744e-8, 4.286e-8, 4.915e-8, 5.623e-8,
2237 6.336e-8, 7.293e-8, 8.309e-8, 9.319e-8, 1.091e-7, 1.243e-7,
2238 1.348e-7, 1.449e-7, 1.62e-7, 1.846e-7, 1.937e-7, 2.04e-7,
2239 2.179e-7, 2.298e-7, 2.433e-7, 2.439e-7, 2.464e-7, 2.611e-7,
2240 2.617e-7, 2.582e-7, 2.453e-7, 2.401e-7, 2.349e-7, 2.203e-7,
2241 2.066e-7, 1.939e-7, 1.78e-7, 1.558e-7, 1.391e-7, 1.203e-7,
2242 1.048e-7, 9.464e-8, 8.306e-8, 7.239e-8, 6.317e-8, 5.52e-8,
2243 4.847e-8, 4.282e-8, 3.796e-8, 3.377e-8, 2.996e-8, 2.678e-8,
2244 2.4e-8, 2.134e-8, 1.904e-8, 1.705e-8, 1.523e-8, 1.35e-8,
2245 1.204e-8, 1.07e-8, 9.408e-9, 8.476e-9, 7.47e-9, 6.679e-9,
2246 5.929e-9, 5.267e-9, 4.711e-9, 4.172e-9, 3.761e-9, 3.288e-9,
2247 2.929e-9, 2.609e-9, 2.315e-9, 2.042e-9, 1.844e-9, 1.64e-9,
2248 1.47e-9, 1.31e-9, 1.176e-9, 1.049e-9, 9.377e-10, 8.462e-10,
2249 7.616e-10, 6.854e-10, 6.191e-10, 5.596e-10, 5.078e-10, 4.611e-10,
2250 4.197e-10, 3.83e-10, 3.505e-10, 3.215e-10, 2.956e-10, 2.726e-10,
2251 2.521e-10, 2.338e-10, 2.173e-10, 2.026e-10, 1.895e-10, 1.777e-10,
2252 1.672e-10, 1.579e-10, 1.496e-10, 1.423e-10, 1.358e-10, 1.302e-10,
2253 1.254e-10, 1.216e-10, 1.187e-10, 1.163e-10, 1.147e-10, 1.145e-10,
2254 1.15e-10, 1.17e-10, 1.192e-10, 1.25e-10, 1.298e-10, 1.345e-10,
2255 1.405e-10, 1.538e-10, 1.648e-10, 1.721e-10, 1.872e-10, 1.968e-10,
2256 2.089e-10, 2.172e-10, 2.317e-10, 2.389e-10, 2.503e-10, 2.585e-10,
2257 2.686e-10, 2.8e-10, 2.895e-10, 3.019e-10, 3.037e-10, 3.076e-10,
2258 3.146e-10, 3.198e-10, 3.332e-10, 3.397e-10, 3.54e-10, 3.667e-10,
2259 3.895e-10, 4.071e-10, 4.565e-10, 4.983e-10, 5.439e-10, 5.968e-10,
2260 6.676e-10, 7.456e-10, 8.405e-10, 9.478e-10, 1.064e-9, 1.218e-9,
2261 1.386e-9, 1.581e-9, 1.787e-9, 2.032e-9, 2.347e-9, 2.677e-9,
2262 3.008e-9, 3.544e-9, 4.056e-9, 4.687e-9, 5.331e-9, 6.227e-9,
2263 6.854e-9, 8.139e-9, 8.945e-9, 9.865e-9, 1.125e-8, 1.178e-8,
2264 1.364e-8, 1.436e-8, 1.54e-8, 1.672e-8, 1.793e-8, 1.906e-8,
2265 2.036e-8, 2.144e-8, 2.292e-8, 2.371e-8, 2.493e-8, 2.606e-8,
2266 2.706e-8, 2.866e-8, 3.036e-8, 3.136e-8, 3.405e-8, 3.665e-8,
2267 3.837e-8, 4.229e-8, 4.748e-8, 5.32e-8, 5.763e-8, 6.677e-8,
2268 7.216e-8, 7.716e-8, 8.958e-8, 9.419e-8, 1.036e-7, 1.108e-7,
2269 1.189e-7, 1.246e-7, 1.348e-7, 1.31e-7, 1.361e-7, 1.364e-7,
2270 1.363e-7, 1.343e-7, 1.293e-7, 1.254e-7, 1.235e-7, 1.158e-7,
2271 1.107e-7, 9.961e-8, 9.011e-8, 7.91e-8, 6.916e-8, 6.338e-8,
2272 5.564e-8, 4.827e-8, 4.198e-8, 3.695e-8, 3.276e-8, 2.929e-8,
2273 2.633e-8, 2.391e-8, 2.192e-8, 2.021e-8, 1.89e-8, 1.772e-8,
2274 1.667e-8, 1.603e-8, 1.547e-8, 1.537e-8, 1.492e-8, 1.515e-8,
2275 1.479e-8, 1.45e-8, 1.513e-8, 1.495e-8, 1.529e-8, 1.565e-8,
2276 1.564e-8, 1.553e-8, 1.569e-8, 1.584e-8, 1.57e-8, 1.538e-8,
2277 1.513e-8, 1.472e-8, 1.425e-8, 1.349e-8, 1.328e-8, 1.249e-8,
2278 1.17e-8, 1.077e-8, 9.514e-9, 8.614e-9, 7.46e-9, 6.621e-9,
2279 5.775e-9, 5.006e-9, 4.308e-9, 3.747e-9, 3.24e-9, 2.84e-9,
2280 2.481e-9, 2.184e-9, 1.923e-9, 1.71e-9, 1.504e-9, 1.334e-9,
2281 1.187e-9, 1.053e-9, 9.367e-10, 8.306e-10, 7.419e-10, 6.63e-10,
2282 5.918e-10, 5.277e-10, 4.717e-10, 4.222e-10, 3.783e-10, 3.39e-10,
2283 3.036e-10, 2.729e-10, 2.455e-10, 2.211e-10, 1.995e-10, 1.804e-10,
2284 1.635e-10, 1.485e-10, 1.355e-10, 1.24e-10, 1.139e-10, 1.051e-10,
2285 9.757e-11, 9.114e-11, 8.577e-11, 8.139e-11, 7.792e-11, 7.52e-11,
2286 7.39e-11, 7.311e-11, 7.277e-11, 7.482e-11, 7.698e-11, 8.162e-11,
2287 8.517e-11, 8.968e-11, 9.905e-11, 1.075e-10, 1.187e-10, 1.291e-10,
2288 1.426e-10, 1.573e-10, 1.734e-10, 1.905e-10, 2.097e-10, 2.28e-10,
2289 2.473e-10, 2.718e-10, 2.922e-10, 3.128e-10, 3.361e-10, 3.641e-10,
2290 3.91e-10, 4.196e-10, 4.501e-10, 4.932e-10, 5.258e-10, 5.755e-10,
2291 6.253e-10, 6.664e-10, 7.344e-10, 7.985e-10, 8.877e-10, 1.005e-9,
2292 1.118e-9, 1.251e-9, 1.428e-9, 1.61e-9, 1.888e-9, 2.077e-9,
2293 2.331e-9, 2.751e-9, 3.061e-9, 3.522e-9, 3.805e-9, 4.181e-9,
2294 4.575e-9, 5.167e-9, 5.634e-9, 6.007e-9, 6.501e-9, 6.829e-9,
2295 7.211e-9, 7.262e-9, 7.696e-9, 7.832e-9, 7.799e-9, 7.651e-9,
2296 7.304e-9, 7.15e-9, 6.977e-9, 6.603e-9, 6.209e-9, 5.69e-9,
2297 5.432e-9, 4.764e-9, 4.189e-9, 3.64e-9, 3.203e-9, 2.848e-9,
2298 2.51e-9, 2.194e-9, 1.946e-9, 1.75e-9, 1.567e-9, 1.426e-9,
2299 1.302e-9, 1.197e-9, 1.109e-9, 1.035e-9, 9.719e-10, 9.207e-10,
2300 8.957e-10, 8.578e-10, 8.262e-10, 8.117e-10, 7.987e-10, 7.875e-10,
2301 7.741e-10, 7.762e-10, 7.537e-10, 7.424e-10, 7.474e-10, 7.294e-10,
2302 7.216e-10, 7.233e-10, 7.075e-10, 6.892e-10, 6.618e-10, 6.314e-10,
2303 6.208e-10, 5.689e-10, 5.55e-10, 4.984e-10, 4.6e-10, 4.078e-10,
2304 3.879e-10, 3.459e-10, 2.982e-10, 2.626e-10, 2.329e-10, 1.988e-10,
2305 1.735e-10, 1.487e-10, 1.297e-10, 1.133e-10, 9.943e-11, 8.736e-11,
2306 7.726e-11, 6.836e-11, 6.053e-11, 5.384e-11, 4.789e-11, 4.267e-11,
2307 3.804e-11, 3.398e-11, 3.034e-11, 2.71e-11, 2.425e-11, 2.173e-11,
2308 1.95e-11, 1.752e-11, 1.574e-11, 1.418e-11, 1.278e-11, 1.154e-11,
2309 1.044e-11, 9.463e-12, 8.602e-12, 7.841e-12, 7.171e-12, 6.584e-12,
2310 6.073e-12, 5.631e-12, 5.254e-12, 4.937e-12, 4.679e-12, 4.476e-12,
2311 4.328e-12, 4.233e-12, 4.194e-12, 4.211e-12, 4.286e-12, 4.424e-12,
2312 4.628e-12, 4.906e-12, 5.262e-12, 5.708e-12, 6.254e-12, 6.914e-12,
2313 7.714e-12, 8.677e-12, 9.747e-12, 1.101e-11, 1.256e-11, 1.409e-11,
2314 1.597e-11, 1.807e-11, 2.034e-11, 2.316e-11, 2.622e-11, 2.962e-11,
2315 3.369e-11, 3.819e-11, 4.329e-11, 4.932e-11, 5.589e-11, 6.364e-11,
2316 7.284e-11, 8.236e-11, 9.447e-11, 1.078e-10, 1.229e-10, 1.417e-10,
2317 1.614e-10, 1.843e-10, 2.107e-10, 2.406e-10, 2.728e-10, 3.195e-10,
2318 3.595e-10, 4.153e-10, 4.736e-10, 5.41e-10, 6.088e-10, 6.769e-10,
2319 7.691e-10, 8.545e-10, 9.621e-10, 1.047e-9, 1.161e-9, 1.296e-9,
2320 1.424e-9, 1.576e-9, 1.739e-9, 1.893e-9, 2.08e-9, 2.336e-9,
2321 2.604e-9, 2.76e-9, 3.001e-9, 3.365e-9, 3.55e-9, 3.895e-9,
2322 4.183e-9, 4.614e-9, 4.846e-9, 5.068e-9, 5.427e-9, 5.541e-9,
2323 5.864e-9, 5.997e-9, 5.997e-9, 6.061e-9, 5.944e-9, 5.855e-9,
2324 5.661e-9, 5.523e-9, 5.374e-9, 4.94e-9, 4.688e-9, 4.17e-9,
2325 3.913e-9, 3.423e-9, 2.997e-9, 2.598e-9, 2.253e-9, 1.946e-9,
2326 1.71e-9, 1.507e-9, 1.336e-9, 1.19e-9, 1.068e-9, 9.623e-10,
2327 8.772e-10, 8.007e-10, 7.42e-10, 6.884e-10, 6.483e-10, 6.162e-10,
2328 5.922e-10, 5.688e-10, 5.654e-10, 5.637e-10, 5.701e-10, 5.781e-10,
2329 5.874e-10, 6.268e-10, 6.357e-10, 6.525e-10, 7.137e-10, 7.441e-10,
2330 8.024e-10, 8.485e-10, 9.143e-10, 9.536e-10, 9.717e-10, 1.018e-9,
2331 1.042e-9, 1.054e-9, 1.092e-9, 1.079e-9, 1.064e-9, 1.043e-9,
2332 1.02e-9, 9.687e-10, 9.273e-10, 9.208e-10, 9.068e-10, 7.687e-10,
2333 7.385e-10, 6.595e-10, 5.87e-10, 5.144e-10, 4.417e-10, 3.804e-10,
2334 3.301e-10, 2.866e-10, 2.509e-10, 2.202e-10, 1.947e-10, 1.719e-10,
2335 1.525e-10, 1.361e-10, 1.21e-10, 1.084e-10, 9.8e-11, 8.801e-11,
2336 7.954e-11, 7.124e-11, 6.335e-11, 5.76e-11, 5.132e-11, 4.601e-11,
2337 4.096e-11, 3.657e-11, 3.25e-11, 2.909e-11, 2.587e-11, 2.297e-11,
2338 2.05e-11, 1.828e-11, 1.632e-11, 1.462e-11, 1.314e-11, 1.185e-11,
2339 1.073e-11, 9.76e-12, 8.922e-12, 8.206e-12, 7.602e-12, 7.1e-12,
2340 6.694e-12, 6.378e-12, 6.149e-12, 6.004e-12, 5.941e-12, 5.962e-12,
2341 6.069e-12, 6.265e-12, 6.551e-12, 6.935e-12, 7.457e-12, 8.074e-12,
2342 8.811e-12, 9.852e-12, 1.086e-11, 1.207e-11, 1.361e-11, 1.553e-11,
2343 1.737e-11, 1.93e-11, 2.175e-11, 2.41e-11, 2.706e-11, 3.023e-11,
2344 3.313e-11, 3.657e-11, 4.118e-11, 4.569e-11, 5.025e-11, 5.66e-11,
2345 6.231e-11, 6.881e-11, 7.996e-11, 8.526e-11, 9.694e-11, 1.106e-10,
2346 1.222e-10, 1.355e-10, 1.525e-10, 1.775e-10, 1.924e-10, 2.181e-10,
2347 2.379e-10, 2.662e-10, 2.907e-10, 3.154e-10, 3.366e-10, 3.579e-10,
2348 3.858e-10, 4.046e-10, 4.196e-10, 4.166e-10, 4.457e-10, 4.466e-10,
2349 4.404e-10, 4.337e-10, 4.15e-10, 4.083e-10, 3.91e-10, 3.723e-10,
2350 3.514e-10, 3.303e-10, 2.847e-10, 2.546e-10, 2.23e-10, 1.994e-10,
2351 1.733e-10, 1.488e-10, 1.297e-10, 1.144e-10, 1.004e-10, 8.741e-11,
2352 7.928e-11, 7.034e-11, 6.323e-11, 5.754e-11, 5.25e-11, 4.85e-11,
2353 4.502e-11, 4.286e-11, 4.028e-11, 3.899e-11, 3.824e-11, 3.761e-11,
2354 3.804e-11, 3.839e-11, 3.845e-11, 4.244e-11, 4.382e-11, 4.582e-11,
2355 4.847e-11, 5.209e-11, 5.384e-11, 5.887e-11, 6.371e-11, 6.737e-11,
2356 7.168e-11, 7.415e-11, 7.827e-11, 8.037e-11, 8.12e-11, 8.071e-11,
2357 8.008e-11, 7.851e-11, 7.544e-11, 7.377e-11, 7.173e-11, 6.801e-11,
2358 6.267e-11, 5.727e-11, 5.288e-11, 4.853e-11, 4.082e-11, 3.645e-11,
2359 3.136e-11, 2.672e-11, 2.304e-11, 1.986e-11, 1.725e-11, 1.503e-11,
2360 1.315e-11, 1.153e-11, 1.014e-11, 8.942e-12, 7.901e-12, 6.993e-12,
2361 6.199e-12, 5.502e-12, 4.89e-12, 4.351e-12, 3.878e-12, 3.461e-12,
2362 3.094e-12, 2.771e-12, 2.488e-12, 2.241e-12, 2.025e-12, 1.838e-12,
2363 1.677e-12, 1.541e-12, 1.427e-12, 1.335e-12, 1.262e-12, 1.209e-12,
2364 1.176e-12, 1.161e-12, 1.165e-12, 1.189e-12, 1.234e-12, 1.3e-12,
2365 1.389e-12, 1.503e-12, 1.644e-12, 1.814e-12, 2.017e-12, 2.255e-12,
2366 2.534e-12, 2.858e-12, 3.231e-12, 3.661e-12, 4.153e-12, 4.717e-12,
2367 5.36e-12, 6.094e-12, 6.93e-12, 7.882e-12, 8.966e-12, 1.02e-11,
2368 1.162e-11, 1.324e-11, 1.51e-11, 1.72e-11, 1.965e-11, 2.237e-11,
2369 2.56e-11, 2.927e-11, 3.371e-11, 3.842e-11, 4.429e-11, 5.139e-11,
2370 5.798e-11, 6.697e-11, 7.626e-11, 8.647e-11, 1.022e-10, 1.136e-10,
2371 1.3e-10, 1.481e-10, 1.672e-10, 1.871e-10, 2.126e-10, 2.357e-10,
2372 2.583e-10, 2.997e-10, 3.289e-10, 3.702e-10, 4.012e-10, 4.319e-10,
2373 4.527e-10, 5.001e-10, 5.448e-10, 5.611e-10, 5.76e-10, 5.965e-10,
2374 6.079e-10, 6.207e-10, 6.276e-10, 6.222e-10, 6.137e-10, 6e-10,
2375 5.814e-10, 5.393e-10, 5.35e-10, 4.947e-10, 4.629e-10, 4.117e-10,
2376 3.712e-10, 3.372e-10, 2.923e-10, 2.55e-10, 2.232e-10, 1.929e-10,
2377 1.679e-10, 1.46e-10, 1.289e-10, 1.13e-10, 9.953e-11, 8.763e-11,
2378 7.76e-11, 6.9e-11, 6.16e-11, 5.525e-11, 4.958e-11, 4.489e-11,
2379 4.072e-11, 3.728e-11, 3.438e-11, 3.205e-11, 3.006e-11, 2.848e-11,
2380 2.766e-11, 2.688e-11, 2.664e-11, 2.67e-11, 2.696e-11, 2.786e-11,
2381 2.861e-11, 3.009e-11, 3.178e-11, 3.389e-11, 3.587e-11, 3.819e-11,
2382 4.054e-11, 4.417e-11, 4.703e-11, 5.137e-11, 5.46e-11, 6.055e-11,
2383 6.333e-11, 6.773e-11, 7.219e-11, 7.717e-11, 8.131e-11, 8.491e-11,
2384 8.574e-11, 9.01e-11, 9.017e-11, 8.999e-11, 8.959e-11, 8.838e-11,
2385 8.579e-11, 8.162e-11, 8.098e-11, 7.472e-11, 7.108e-11, 6.559e-11,
2386 5.994e-11, 5.172e-11, 4.424e-11, 3.951e-11, 3.34e-11, 2.902e-11,
2387 2.541e-11, 2.215e-11, 1.945e-11, 1.716e-11, 1.503e-11, 1.339e-11,
2388 1.185e-11, 1.05e-11, 9.336e-12, 8.307e-12, 7.312e-12, 6.55e-12,
2389 5.836e-12, 5.178e-12, 4.6e-12, 4.086e-12, 3.639e-12, 3.247e-12,
2390 2.904e-12, 2.604e-12, 2.341e-12, 2.112e-12, 1.914e-12, 1.744e-12,
2391 1.598e-12, 1.476e-12, 1.374e-12, 1.293e-12, 1.23e-12, 1.185e-12,
2392 1.158e-12, 1.147e-12, 1.154e-12, 1.177e-12, 1.219e-12, 1.28e-12,
2393 1.36e-12, 1.463e-12, 1.591e-12, 1.75e-12, 1.94e-12, 2.156e-12,
2394 2.43e-12, 2.748e-12, 3.052e-12, 3.533e-12, 3.967e-12, 4.471e-12,
2395 5.041e-12, 5.86e-12, 6.664e-12, 7.522e-12, 8.342e-12, 9.412e-12,
2396 1.072e-11, 1.213e-11, 1.343e-11, 1.496e-11, 1.664e-11, 1.822e-11,
2397 2.029e-11, 2.233e-11, 2.457e-11, 2.709e-11, 2.928e-11, 3.115e-11,
2398 3.356e-11, 3.592e-11, 3.818e-11, 3.936e-11, 4.061e-11, 4.149e-11,
2399 4.299e-11, 4.223e-11, 4.251e-11, 4.287e-11, 4.177e-11, 4.094e-11,
2400 3.942e-11, 3.772e-11, 3.614e-11, 3.394e-11, 3.222e-11, 2.791e-11,
2401 2.665e-11, 2.309e-11, 2.032e-11, 1.74e-11, 1.535e-11, 1.323e-11,
2402 1.151e-11, 9.803e-12, 8.65e-12, 7.54e-12, 6.619e-12, 5.832e-12,
2403 5.113e-12, 4.503e-12, 3.975e-12, 3.52e-12, 3.112e-12, 2.797e-12,
2404 2.5e-12, 2.24e-12, 2.013e-12, 1.819e-12, 1.653e-12, 1.513e-12,
2405 1.395e-12, 1.299e-12, 1.225e-12, 1.168e-12, 1.124e-12, 1.148e-12,
2406 1.107e-12, 1.128e-12, 1.169e-12, 1.233e-12, 1.307e-12, 1.359e-12,
2407 1.543e-12, 1.686e-12, 1.794e-12, 2.028e-12, 2.21e-12, 2.441e-12,
2408 2.653e-12, 2.828e-12, 3.093e-12, 3.28e-12, 3.551e-12, 3.677e-12,
2409 3.803e-12, 3.844e-12, 4.068e-12, 4.093e-12, 4.002e-12, 3.904e-12,
2410 3.624e-12, 3.633e-12, 3.622e-12, 3.443e-12, 3.184e-12, 2.934e-12,
2411 2.476e-12, 2.212e-12, 1.867e-12, 1.594e-12, 1.37e-12, 1.192e-12,
2412 1.045e-12, 9.211e-13, 8.17e-13, 7.29e-13, 6.55e-13, 5.929e-13,
2413 5.415e-13, 4.995e-13, 4.661e-13, 4.406e-13, 4.225e-13, 4.116e-13,
2414 4.075e-13, 4.102e-13, 4.198e-13, 4.365e-13, 4.606e-13, 4.925e-13,
2415 5.326e-13, 5.818e-13, 6.407e-13, 7.104e-13, 7.92e-13, 8.868e-13,
2416 9.964e-13, 1.123e-12, 1.268e-12, 1.434e-12, 1.626e-12, 1.848e-12,
2417 2.107e-12, 2.422e-12, 2.772e-12, 3.145e-12, 3.704e-12, 4.27e-12,
2418 4.721e-12, 5.361e-12, 6.083e-12, 7.095e-12, 7.968e-12, 9.228e-12,
2419 1.048e-11, 1.187e-11, 1.336e-11, 1.577e-11, 1.772e-11, 2.017e-11,
2420 2.25e-11, 2.63e-11, 2.911e-11, 3.356e-11, 3.82e-11, 4.173e-11,
2421 4.811e-11, 5.254e-11, 5.839e-11, 6.187e-11, 6.805e-11, 7.118e-11,
2422 7.369e-11, 7.664e-11, 7.794e-11, 7.947e-11, 8.036e-11, 7.954e-11,
2423 7.849e-11, 7.518e-11, 7.462e-11, 6.926e-11, 6.531e-11, 6.197e-11,
2424 5.421e-11, 4.777e-11, 4.111e-11, 3.679e-11, 3.166e-11, 2.786e-11,
2425 2.436e-11, 2.144e-11, 1.859e-11, 1.628e-11, 1.414e-11, 1.237e-11,
2426 1.093e-11, 9.558e-12
2427 };
2428
2429 static const double h2o260[2001] =
2430 { .2752, .2732, .2749, .2676, .2667, .2545,
2431 .2497, .2327, .2218, .2036, .1825, .1694, .1497, .1353, .121,
2432 .1014, .09405, .07848, .07195, .06246, .05306, .04853, .04138,
2433 .03735, .03171, .02785, .02431, .02111, .01845, .0164, .01405,
2434 .01255, .01098, .009797, .008646, .007779, .006898, .006099,
2435 .005453, .004909, .004413, .003959, .003581, .003199, .002871,
2436 .002583, .00233, .002086, .001874, .001684, .001512, .001361,
2437 .001225, .0011, 9.89e-4, 8.916e-4, 8.039e-4, 7.256e-4, 6.545e-4,
2438 5.918e-4, 5.359e-4, 4.867e-4, 4.426e-4, 4.033e-4, 3.682e-4,
2439 3.366e-4, 3.085e-4, 2.833e-4, 2.605e-4, 2.403e-4, 2.221e-4,
2440 2.055e-4, 1.908e-4, 1.774e-4, 1.653e-4, 1.544e-4, 1.443e-4,
2441 1.351e-4, 1.267e-4, 1.19e-4, 1.119e-4, 1.053e-4, 9.922e-5,
2442 9.355e-5, 8.831e-5, 8.339e-5, 7.878e-5, 7.449e-5, 7.043e-5,
2443 6.664e-5, 6.307e-5, 5.969e-5, 5.654e-5, 5.357e-5, 5.075e-5,
2444 4.81e-5, 4.56e-5, 4.322e-5, 4.102e-5, 3.892e-5, 3.696e-5,
2445 3.511e-5, 3.339e-5, 3.177e-5, 3.026e-5, 2.886e-5, 2.756e-5,
2446 2.636e-5, 2.527e-5, 2.427e-5, 2.337e-5, 2.257e-5, 2.185e-5,
2447 2.127e-5, 2.08e-5, 2.041e-5, 2.013e-5, 2e-5, 1.997e-5, 2.009e-5,
2448 2.031e-5, 2.068e-5, 2.124e-5, 2.189e-5, 2.267e-5, 2.364e-5,
2449 2.463e-5, 2.618e-5, 2.774e-5, 2.937e-5, 3.144e-5, 3.359e-5,
2450 3.695e-5, 4.002e-5, 4.374e-5, 4.947e-5, 5.431e-5, 6.281e-5,
2451 7.169e-5, 8.157e-5, 9.728e-5, 1.079e-4, 1.337e-4, 1.442e-4,
2452 1.683e-4, 1.879e-4, 2.223e-4, 2.425e-4, 2.838e-4, 3.143e-4,
2453 3.527e-4, 4.012e-4, 4.237e-4, 4.747e-4, 5.057e-4, 5.409e-4,
2454 5.734e-4, 5.944e-4, 6.077e-4, 6.175e-4, 6.238e-4, 6.226e-4,
2455 6.248e-4, 6.192e-4, 6.098e-4, 5.818e-4, 5.709e-4, 5.465e-4,
2456 5.043e-4, 4.699e-4, 4.294e-4, 3.984e-4, 3.672e-4, 3.152e-4,
2457 2.883e-4, 2.503e-4, 2.211e-4, 1.92e-4, 1.714e-4, 1.485e-4,
2458 1.358e-4, 1.156e-4, 1.021e-4, 8.887e-5, 7.842e-5, 7.12e-5,
2459 6.186e-5, 5.73e-5, 4.792e-5, 4.364e-5, 3.72e-5, 3.28e-5,
2460 2.946e-5, 2.591e-5, 2.261e-5, 2.048e-5, 1.813e-5, 1.63e-5,
2461 1.447e-5, 1.282e-5, 1.167e-5, 1.041e-5, 9.449e-6, 8.51e-6,
2462 7.596e-6, 6.961e-6, 6.272e-6, 5.728e-6, 5.198e-6, 4.667e-6,
2463 4.288e-6, 3.897e-6, 3.551e-6, 3.235e-6, 2.952e-6, 2.688e-6,
2464 2.449e-6, 2.241e-6, 2.05e-6, 1.879e-6, 1.722e-6, 1.582e-6,
2465 1.456e-6, 1.339e-6, 1.236e-6, 1.144e-6, 1.06e-6, 9.83e-7,
2466 9.149e-7, 8.535e-7, 7.973e-7, 7.466e-7, 6.999e-7, 6.574e-7,
2467 6.18e-7, 5.821e-7, 5.487e-7, 5.18e-7, 4.896e-7, 4.631e-7,
2468 4.386e-7, 4.16e-7, 3.945e-7, 3.748e-7, 3.562e-7, 3.385e-7,
2469 3.222e-7, 3.068e-7, 2.922e-7, 2.788e-7, 2.659e-7, 2.539e-7,
2470 2.425e-7, 2.318e-7, 2.219e-7, 2.127e-7, 2.039e-7, 1.958e-7,
2471 1.885e-7, 1.818e-7, 1.758e-7, 1.711e-7, 1.662e-7, 1.63e-7,
2472 1.605e-7, 1.58e-7, 1.559e-7, 1.545e-7, 1.532e-7, 1.522e-7,
2473 1.51e-7, 1.495e-7, 1.465e-7, 1.483e-7, 1.469e-7, 1.448e-7,
2474 1.444e-7, 1.436e-7, 1.426e-7, 1.431e-7, 1.425e-7, 1.445e-7,
2475 1.477e-7, 1.515e-7, 1.567e-7, 1.634e-7, 1.712e-7, 1.802e-7,
2476 1.914e-7, 2.024e-7, 2.159e-7, 2.295e-7, 2.461e-7, 2.621e-7,
2477 2.868e-7, 3.102e-7, 3.394e-7, 3.784e-7, 4.223e-7, 4.864e-7,
2478 5.501e-7, 6.039e-7, 7.193e-7, 7.728e-7, 9.514e-7, 1.073e-6,
2479 1.18e-6, 1.333e-6, 1.472e-6, 1.566e-6, 1.677e-6, 1.784e-6,
2480 1.904e-6, 1.953e-6, 2.02e-6, 2.074e-6, 2.128e-6, 2.162e-6,
2481 2.219e-6, 2.221e-6, 2.249e-6, 2.239e-6, 2.235e-6, 2.185e-6,
2482 2.141e-6, 2.124e-6, 2.09e-6, 2.068e-6, 2.1e-6, 2.104e-6,
2483 2.142e-6, 2.181e-6, 2.257e-6, 2.362e-6, 2.5e-6, 2.664e-6,
2484 2.884e-6, 3.189e-6, 3.48e-6, 3.847e-6, 4.313e-6, 4.79e-6,
2485 5.25e-6, 5.989e-6, 6.692e-6, 7.668e-6, 8.52e-6, 9.606e-6,
2486 1.073e-5, 1.225e-5, 1.377e-5, 1.582e-5, 1.761e-5, 2.029e-5,
2487 2.284e-5, 2.602e-5, 2.94e-5, 3.483e-5, 3.928e-5, 4.618e-5,
2488 5.24e-5, 6.132e-5, 7.183e-5, 8.521e-5, 9.111e-5, 1.07e-4,
2489 1.184e-4, 1.264e-4, 1.475e-4, 1.612e-4, 1.704e-4, 1.818e-4,
2490 1.924e-4, 1.994e-4, 2.061e-4, 2.18e-4, 2.187e-4, 2.2e-4,
2491 2.196e-4, 2.131e-4, 2.015e-4, 1.988e-4, 1.847e-4, 1.729e-4,
2492 1.597e-4, 1.373e-4, 1.262e-4, 1.087e-4, 9.439e-5, 8.061e-5,
2493 7.093e-5, 6.049e-5, 5.12e-5, 4.435e-5, 3.817e-5, 3.34e-5,
2494 2.927e-5, 2.573e-5, 2.291e-5, 2.04e-5, 1.827e-5, 1.636e-5,
2495 1.463e-5, 1.309e-5, 1.17e-5, 1.047e-5, 9.315e-6, 8.328e-6,
2496 7.458e-6, 6.665e-6, 5.94e-6, 5.316e-6, 4.752e-6, 4.252e-6,
2497 3.825e-6, 3.421e-6, 3.064e-6, 2.746e-6, 2.465e-6, 2.216e-6,
2498 1.99e-6, 1.79e-6, 1.609e-6, 1.449e-6, 1.306e-6, 1.177e-6,
2499 1.063e-6, 9.607e-7, 8.672e-7, 7.855e-7, 7.118e-7, 6.46e-7,
2500 5.871e-7, 5.34e-7, 4.868e-7, 4.447e-7, 4.068e-7, 3.729e-7,
2501 3.423e-7, 3.151e-7, 2.905e-7, 2.686e-7, 2.484e-7, 2.306e-7,
2502 2.142e-7, 1.995e-7, 1.86e-7, 1.738e-7, 1.626e-7, 1.522e-7,
2503 1.427e-7, 1.338e-7, 1.258e-7, 1.183e-7, 1.116e-7, 1.056e-7,
2504 9.972e-8, 9.46e-8, 9.007e-8, 8.592e-8, 8.195e-8, 7.816e-8,
2505 7.483e-8, 7.193e-8, 6.892e-8, 6.642e-8, 6.386e-8, 6.154e-8,
2506 5.949e-8, 5.764e-8, 5.622e-8, 5.479e-8, 5.364e-8, 5.301e-8,
2507 5.267e-8, 5.263e-8, 5.313e-8, 5.41e-8, 5.55e-8, 5.745e-8,
2508 6.003e-8, 6.311e-8, 6.713e-8, 7.173e-8, 7.724e-8, 8.368e-8,
2509 9.121e-8, 9.986e-8, 1.097e-7, 1.209e-7, 1.338e-7, 1.486e-7,
2510 1.651e-7, 1.837e-7, 2.048e-7, 2.289e-7, 2.557e-7, 2.857e-7,
2511 3.195e-7, 3.587e-7, 4.015e-7, 4.497e-7, 5.049e-7, 5.665e-7,
2512 6.366e-7, 7.121e-7, 7.996e-7, 8.946e-7, 1.002e-6, 1.117e-6,
2513 1.262e-6, 1.416e-6, 1.611e-6, 1.807e-6, 2.056e-6, 2.351e-6,
2514 2.769e-6, 3.138e-6, 3.699e-6, 4.386e-6, 5.041e-6, 6.074e-6,
2515 6.812e-6, 7.79e-6, 8.855e-6, 1.014e-5, 1.095e-5, 1.245e-5,
2516 1.316e-5, 1.39e-5, 1.504e-5, 1.583e-5, 1.617e-5, 1.652e-5,
2517 1.713e-5, 1.724e-5, 1.715e-5, 1.668e-5, 1.629e-5, 1.552e-5,
2518 1.478e-5, 1.34e-5, 1.245e-5, 1.121e-5, 9.575e-6, 8.956e-6,
2519 7.345e-6, 6.597e-6, 5.612e-6, 4.818e-6, 4.165e-6, 3.579e-6,
2520 3.041e-6, 2.623e-6, 2.29e-6, 1.984e-6, 1.748e-6, 1.534e-6,
2521 1.369e-6, 1.219e-6, 1.092e-6, 9.8e-7, 8.762e-7, 7.896e-7,
2522 7.104e-7, 6.364e-7, 5.691e-7, 5.107e-7, 4.575e-7, 4.09e-7,
2523 3.667e-7, 3.287e-7, 2.931e-7, 2.633e-7, 2.356e-7, 2.111e-7,
2524 1.895e-7, 1.697e-7, 1.525e-7, 1.369e-7, 1.233e-7, 1.114e-7,
2525 9.988e-8, 9.004e-8, 8.149e-8, 7.352e-8, 6.662e-8, 6.03e-8,
2526 5.479e-8, 4.974e-8, 4.532e-8, 4.129e-8, 3.781e-8, 3.462e-8,
2527 3.176e-8, 2.919e-8, 2.687e-8, 2.481e-8, 2.292e-8, 2.119e-8,
2528 1.967e-8, 1.828e-8, 1.706e-8, 1.589e-8, 1.487e-8, 1.393e-8,
2529 1.307e-8, 1.228e-8, 1.156e-8, 1.089e-8, 1.028e-8, 9.696e-9,
2530 9.159e-9, 8.658e-9, 8.187e-9, 7.746e-9, 7.34e-9, 6.953e-9,
2531 6.594e-9, 6.259e-9, 5.948e-9, 5.66e-9, 5.386e-9, 5.135e-9,
2532 4.903e-9, 4.703e-9, 4.515e-9, 4.362e-9, 4.233e-9, 4.117e-9,
2533 4.017e-9, 3.962e-9, 3.924e-9, 3.905e-9, 3.922e-9, 3.967e-9,
2534 4.046e-9, 4.165e-9, 4.32e-9, 4.522e-9, 4.769e-9, 5.083e-9,
2535 5.443e-9, 5.872e-9, 6.366e-9, 6.949e-9, 7.601e-9, 8.371e-9,
2536 9.22e-9, 1.02e-8, 1.129e-8, 1.251e-8, 1.393e-8, 1.542e-8,
2537 1.72e-8, 1.926e-8, 2.152e-8, 2.392e-8, 2.678e-8, 3.028e-8,
2538 3.39e-8, 3.836e-8, 4.309e-8, 4.9e-8, 5.481e-8, 6.252e-8,
2539 7.039e-8, 7.883e-8, 8.849e-8, 1.012e-7, 1.142e-7, 1.3e-7,
2540 1.475e-7, 1.732e-7, 1.978e-7, 2.304e-7, 2.631e-7, 2.988e-7,
2541 3.392e-7, 3.69e-7, 4.355e-7, 4.672e-7, 5.11e-7, 5.461e-7,
2542 5.828e-7, 6.233e-7, 6.509e-7, 6.672e-7, 6.969e-7, 7.104e-7,
2543 7.439e-7, 7.463e-7, 7.708e-7, 7.466e-7, 7.668e-7, 7.549e-7,
2544 7.586e-7, 7.384e-7, 7.439e-7, 7.785e-7, 7.915e-7, 8.31e-7,
2545 8.745e-7, 9.558e-7, 1.038e-6, 1.173e-6, 1.304e-6, 1.452e-6,
2546 1.671e-6, 1.931e-6, 2.239e-6, 2.578e-6, 3.032e-6, 3.334e-6,
2547 3.98e-6, 4.3e-6, 4.518e-6, 5.321e-6, 5.508e-6, 6.211e-6, 6.59e-6,
2548 7.046e-6, 7.555e-6, 7.558e-6, 7.875e-6, 8.319e-6, 8.433e-6,
2549 8.59e-6, 8.503e-6, 8.304e-6, 8.336e-6, 7.739e-6, 7.301e-6,
2550 6.827e-6, 6.078e-6, 5.551e-6, 4.762e-6, 4.224e-6, 3.538e-6,
2551 2.984e-6, 2.619e-6, 2.227e-6, 1.923e-6, 1.669e-6, 1.462e-6,
2552 1.294e-6, 1.155e-6, 1.033e-6, 9.231e-7, 8.238e-7, 7.36e-7,
2553 6.564e-7, 5.869e-7, 5.236e-7, 4.673e-7, 4.174e-7, 3.736e-7,
2554 3.33e-7, 2.976e-7, 2.657e-7, 2.367e-7, 2.106e-7, 1.877e-7,
2555 1.671e-7, 1.494e-7, 1.332e-7, 1.192e-7, 1.065e-7, 9.558e-8,
2556 8.586e-8, 7.717e-8, 6.958e-8, 6.278e-8, 5.666e-8, 5.121e-8,
2557 4.647e-8, 4.213e-8, 3.815e-8, 3.459e-8, 3.146e-8, 2.862e-8,
2558 2.604e-8, 2.375e-8, 2.162e-8, 1.981e-8, 1.817e-8, 1.67e-8,
2559 1.537e-8, 1.417e-8, 1.31e-8, 1.215e-8, 1.128e-8, 1.05e-8,
2560 9.793e-9, 9.158e-9, 8.586e-9, 8.068e-9, 7.595e-9, 7.166e-9,
2561 6.778e-9, 6.427e-9, 6.108e-9, 5.826e-9, 5.571e-9, 5.347e-9,
2562 5.144e-9, 4.968e-9, 4.822e-9, 4.692e-9, 4.589e-9, 4.506e-9,
2563 4.467e-9, 4.44e-9, 4.466e-9, 4.515e-9, 4.718e-9, 4.729e-9,
2564 4.937e-9, 5.249e-9, 5.466e-9, 5.713e-9, 6.03e-9, 6.436e-9,
2565 6.741e-9, 7.33e-9, 7.787e-9, 8.414e-9, 8.908e-9, 9.868e-9,
2566 1.069e-8, 1.158e-8, 1.253e-8, 1.3e-8, 1.409e-8, 1.47e-8,
2567 1.548e-8, 1.612e-8, 1.666e-8, 1.736e-8, 1.763e-8, 1.812e-8,
2568 1.852e-8, 1.923e-8, 1.897e-8, 1.893e-8, 1.888e-8, 1.868e-8,
2569 1.895e-8, 1.899e-8, 1.876e-8, 1.96e-8, 2.02e-8, 2.121e-8,
2570 2.239e-8, 2.379e-8, 2.526e-8, 2.766e-8, 2.994e-8, 3.332e-8,
2571 3.703e-8, 4.158e-8, 4.774e-8, 5.499e-8, 6.355e-8, 7.349e-8,
2572 8.414e-8, 9.846e-8, 1.143e-7, 1.307e-7, 1.562e-7, 1.817e-7,
2573 2.011e-7, 2.192e-7, 2.485e-7, 2.867e-7, 3.035e-7, 3.223e-7,
2574 3.443e-7, 3.617e-7, 3.793e-7, 3.793e-7, 3.839e-7, 4.081e-7,
2575 4.117e-7, 4.085e-7, 3.92e-7, 3.851e-7, 3.754e-7, 3.49e-7,
2576 3.229e-7, 2.978e-7, 2.691e-7, 2.312e-7, 2.029e-7, 1.721e-7,
2577 1.472e-7, 1.308e-7, 1.132e-7, 9.736e-8, 8.458e-8, 7.402e-8,
2578 6.534e-8, 5.811e-8, 5.235e-8, 4.762e-8, 4.293e-8, 3.896e-8,
2579 3.526e-8, 3.165e-8, 2.833e-8, 2.551e-8, 2.288e-8, 2.036e-8,
2580 1.82e-8, 1.626e-8, 1.438e-8, 1.299e-8, 1.149e-8, 1.03e-8,
2581 9.148e-9, 8.122e-9, 7.264e-9, 6.425e-9, 5.777e-9, 5.06e-9,
2582 4.502e-9, 4.013e-9, 3.567e-9, 3.145e-9, 2.864e-9, 2.553e-9,
2583 2.311e-9, 2.087e-9, 1.886e-9, 1.716e-9, 1.556e-9, 1.432e-9,
2584 1.311e-9, 1.202e-9, 1.104e-9, 1.013e-9, 9.293e-10, 8.493e-10,
2585 7.79e-10, 7.185e-10, 6.642e-10, 6.141e-10, 5.684e-10, 5.346e-10,
2586 5.032e-10, 4.725e-10, 4.439e-10, 4.176e-10, 3.93e-10, 3.714e-10,
2587 3.515e-10, 3.332e-10, 3.167e-10, 3.02e-10, 2.887e-10, 2.769e-10,
2588 2.665e-10, 2.578e-10, 2.503e-10, 2.436e-10, 2.377e-10, 2.342e-10,
2589 2.305e-10, 2.296e-10, 2.278e-10, 2.321e-10, 2.355e-10, 2.402e-10,
2590 2.478e-10, 2.67e-10, 2.848e-10, 2.982e-10, 3.263e-10, 3.438e-10,
2591 3.649e-10, 3.829e-10, 4.115e-10, 4.264e-10, 4.473e-10, 4.63e-10,
2592 4.808e-10, 4.995e-10, 5.142e-10, 5.313e-10, 5.318e-10, 5.358e-10,
2593 5.452e-10, 5.507e-10, 5.698e-10, 5.782e-10, 5.983e-10, 6.164e-10,
2594 6.532e-10, 6.811e-10, 7.624e-10, 8.302e-10, 9.067e-10, 9.937e-10,
2595 1.104e-9, 1.221e-9, 1.361e-9, 1.516e-9, 1.675e-9, 1.883e-9,
2596 2.101e-9, 2.349e-9, 2.614e-9, 2.92e-9, 3.305e-9, 3.724e-9,
2597 4.142e-9, 4.887e-9, 5.614e-9, 6.506e-9, 7.463e-9, 8.817e-9,
2598 9.849e-9, 1.187e-8, 1.321e-8, 1.474e-8, 1.698e-8, 1.794e-8,
2599 2.09e-8, 2.211e-8, 2.362e-8, 2.556e-8, 2.729e-8, 2.88e-8,
2600 3.046e-8, 3.167e-8, 3.367e-8, 3.457e-8, 3.59e-8, 3.711e-8,
2601 3.826e-8, 4.001e-8, 4.211e-8, 4.315e-8, 4.661e-8, 5.01e-8,
2602 5.249e-8, 5.84e-8, 6.628e-8, 7.512e-8, 8.253e-8, 9.722e-8,
2603 1.067e-7, 1.153e-7, 1.347e-7, 1.428e-7, 1.577e-7, 1.694e-7,
2604 1.833e-7, 1.938e-7, 2.108e-7, 2.059e-7, 2.157e-7, 2.185e-7,
2605 2.208e-7, 2.182e-7, 2.093e-7, 2.014e-7, 1.962e-7, 1.819e-7,
2606 1.713e-7, 1.51e-7, 1.34e-7, 1.154e-7, 9.89e-8, 8.88e-8, 7.673e-8,
2607 6.599e-8, 5.73e-8, 5.081e-8, 4.567e-8, 4.147e-8, 3.773e-8,
2608 3.46e-8, 3.194e-8, 2.953e-8, 2.759e-8, 2.594e-8, 2.442e-8,
2609 2.355e-8, 2.283e-8, 2.279e-8, 2.231e-8, 2.279e-8, 2.239e-8,
2610 2.21e-8, 2.309e-8, 2.293e-8, 2.352e-8, 2.415e-8, 2.43e-8,
2611 2.426e-8, 2.465e-8, 2.5e-8, 2.496e-8, 2.465e-8, 2.445e-8,
2612 2.383e-8, 2.299e-8, 2.165e-8, 2.113e-8, 1.968e-8, 1.819e-8,
2613 1.644e-8, 1.427e-8, 1.27e-8, 1.082e-8, 9.428e-9, 8.091e-9,
2614 6.958e-9, 5.988e-9, 5.246e-9, 4.601e-9, 4.098e-9, 3.664e-9,
2615 3.287e-9, 2.942e-9, 2.656e-9, 2.364e-9, 2.118e-9, 1.903e-9,
2616 1.703e-9, 1.525e-9, 1.365e-9, 1.229e-9, 1.107e-9, 9.96e-10,
2617 8.945e-10, 8.08e-10, 7.308e-10, 6.616e-10, 5.994e-10, 5.422e-10,
2618 4.929e-10, 4.478e-10, 4.07e-10, 3.707e-10, 3.379e-10, 3.087e-10,
2619 2.823e-10, 2.592e-10, 2.385e-10, 2.201e-10, 2.038e-10, 1.897e-10,
2620 1.774e-10, 1.667e-10, 1.577e-10, 1.502e-10, 1.437e-10, 1.394e-10,
2621 1.358e-10, 1.324e-10, 1.329e-10, 1.324e-10, 1.36e-10, 1.39e-10,
2622 1.424e-10, 1.544e-10, 1.651e-10, 1.817e-10, 1.984e-10, 2.195e-10,
2623 2.438e-10, 2.7e-10, 2.991e-10, 3.322e-10, 3.632e-10, 3.957e-10,
2624 4.36e-10, 4.701e-10, 5.03e-10, 5.381e-10, 5.793e-10, 6.19e-10,
2625 6.596e-10, 7.004e-10, 7.561e-10, 7.934e-10, 8.552e-10, 9.142e-10,
2626 9.57e-10, 1.027e-9, 1.097e-9, 1.193e-9, 1.334e-9, 1.47e-9,
2627 1.636e-9, 1.871e-9, 2.122e-9, 2.519e-9, 2.806e-9, 3.203e-9,
2628 3.846e-9, 4.362e-9, 5.114e-9, 5.643e-9, 6.305e-9, 6.981e-9,
2629 7.983e-9, 8.783e-9, 9.419e-9, 1.017e-8, 1.063e-8, 1.121e-8,
2630 1.13e-8, 1.201e-8, 1.225e-8, 1.232e-8, 1.223e-8, 1.177e-8,
2631 1.151e-8, 1.116e-8, 1.047e-8, 9.698e-9, 8.734e-9, 8.202e-9,
2632 7.041e-9, 6.074e-9, 5.172e-9, 4.468e-9, 3.913e-9, 3.414e-9,
2633 2.975e-9, 2.65e-9, 2.406e-9, 2.173e-9, 2.009e-9, 1.861e-9,
2634 1.727e-9, 1.612e-9, 1.514e-9, 1.43e-9, 1.362e-9, 1.333e-9,
2635 1.288e-9, 1.249e-9, 1.238e-9, 1.228e-9, 1.217e-9, 1.202e-9,
2636 1.209e-9, 1.177e-9, 1.157e-9, 1.165e-9, 1.142e-9, 1.131e-9,
2637 1.138e-9, 1.117e-9, 1.1e-9, 1.069e-9, 1.023e-9, 1.005e-9,
2638 9.159e-10, 8.863e-10, 7.865e-10, 7.153e-10, 6.247e-10, 5.846e-10,
2639 5.133e-10, 4.36e-10, 3.789e-10, 3.335e-10, 2.833e-10, 2.483e-10,
2640 2.155e-10, 1.918e-10, 1.709e-10, 1.529e-10, 1.374e-10, 1.235e-10,
2641 1.108e-10, 9.933e-11, 8.932e-11, 8.022e-11, 7.224e-11, 6.52e-11,
2642 5.896e-11, 5.328e-11, 4.813e-11, 4.365e-11, 3.961e-11, 3.594e-11,
2643 3.266e-11, 2.967e-11, 2.701e-11, 2.464e-11, 2.248e-11, 2.054e-11,
2644 1.878e-11, 1.721e-11, 1.579e-11, 1.453e-11, 1.341e-11, 1.241e-11,
2645 1.154e-11, 1.078e-11, 1.014e-11, 9.601e-12, 9.167e-12, 8.838e-12,
2646 8.614e-12, 8.493e-12, 8.481e-12, 8.581e-12, 8.795e-12, 9.131e-12,
2647 9.601e-12, 1.021e-11, 1.097e-11, 1.191e-11, 1.303e-11, 1.439e-11,
2648 1.601e-11, 1.778e-11, 1.984e-11, 2.234e-11, 2.474e-11, 2.766e-11,
2649 3.085e-11, 3.415e-11, 3.821e-11, 4.261e-11, 4.748e-11, 5.323e-11,
2650 5.935e-11, 6.619e-11, 7.418e-11, 8.294e-11, 9.26e-11, 1.039e-10,
2651 1.156e-10, 1.297e-10, 1.46e-10, 1.641e-10, 1.858e-10, 2.1e-10,
2652 2.383e-10, 2.724e-10, 3.116e-10, 3.538e-10, 4.173e-10, 4.727e-10,
2653 5.503e-10, 6.337e-10, 7.32e-10, 8.298e-10, 9.328e-10, 1.059e-9,
2654 1.176e-9, 1.328e-9, 1.445e-9, 1.593e-9, 1.77e-9, 1.954e-9,
2655 2.175e-9, 2.405e-9, 2.622e-9, 2.906e-9, 3.294e-9, 3.713e-9,
2656 3.98e-9, 4.384e-9, 4.987e-9, 5.311e-9, 5.874e-9, 6.337e-9,
2657 7.027e-9, 7.39e-9, 7.769e-9, 8.374e-9, 8.605e-9, 9.165e-9,
2658 9.415e-9, 9.511e-9, 9.704e-9, 9.588e-9, 9.45e-9, 9.086e-9,
2659 8.798e-9, 8.469e-9, 7.697e-9, 7.168e-9, 6.255e-9, 5.772e-9,
2660 4.97e-9, 4.271e-9, 3.653e-9, 3.154e-9, 2.742e-9, 2.435e-9,
2661 2.166e-9, 1.936e-9, 1.731e-9, 1.556e-9, 1.399e-9, 1.272e-9,
2662 1.157e-9, 1.066e-9, 9.844e-10, 9.258e-10, 8.787e-10, 8.421e-10,
2663 8.083e-10, 8.046e-10, 8.067e-10, 8.181e-10, 8.325e-10, 8.517e-10,
2664 9.151e-10, 9.351e-10, 9.677e-10, 1.071e-9, 1.126e-9, 1.219e-9,
2665 1.297e-9, 1.408e-9, 1.476e-9, 1.517e-9, 1.6e-9, 1.649e-9,
2666 1.678e-9, 1.746e-9, 1.742e-9, 1.728e-9, 1.699e-9, 1.655e-9,
2667 1.561e-9, 1.48e-9, 1.451e-9, 1.411e-9, 1.171e-9, 1.106e-9,
2668 9.714e-10, 8.523e-10, 7.346e-10, 6.241e-10, 5.371e-10, 4.704e-10,
2669 4.144e-10, 3.683e-10, 3.292e-10, 2.942e-10, 2.62e-10, 2.341e-10,
2670 2.104e-10, 1.884e-10, 1.7e-10, 1.546e-10, 1.394e-10, 1.265e-10,
2671 1.14e-10, 1.019e-10, 9.279e-11, 8.283e-11, 7.458e-11, 6.668e-11,
2672 5.976e-11, 5.33e-11, 4.794e-11, 4.289e-11, 3.841e-11, 3.467e-11,
2673 3.13e-11, 2.832e-11, 2.582e-11, 2.356e-11, 2.152e-11, 1.97e-11,
2674 1.808e-11, 1.664e-11, 1.539e-11, 1.434e-11, 1.344e-11, 1.269e-11,
2675 1.209e-11, 1.162e-11, 1.129e-11, 1.108e-11, 1.099e-11, 1.103e-11,
2676 1.119e-11, 1.148e-11, 1.193e-11, 1.252e-11, 1.329e-11, 1.421e-11,
2677 1.555e-11, 1.685e-11, 1.839e-11, 2.054e-11, 2.317e-11, 2.571e-11,
2678 2.839e-11, 3.171e-11, 3.49e-11, 3.886e-11, 4.287e-11, 4.645e-11,
2679 5.047e-11, 5.592e-11, 6.109e-11, 6.628e-11, 7.381e-11, 8.088e-11,
2680 8.966e-11, 1.045e-10, 1.12e-10, 1.287e-10, 1.486e-10, 1.662e-10,
2681 1.866e-10, 2.133e-10, 2.524e-10, 2.776e-10, 3.204e-10, 3.559e-10,
2682 4.028e-10, 4.448e-10, 4.882e-10, 5.244e-10, 5.605e-10, 6.018e-10,
2683 6.328e-10, 6.579e-10, 6.541e-10, 7.024e-10, 7.074e-10, 7.068e-10,
2684 7.009e-10, 6.698e-10, 6.545e-10, 6.209e-10, 5.834e-10, 5.412e-10,
2685 5.001e-10, 4.231e-10, 3.727e-10, 3.211e-10, 2.833e-10, 2.447e-10,
2686 2.097e-10, 1.843e-10, 1.639e-10, 1.449e-10, 1.27e-10, 1.161e-10,
2687 1.033e-10, 9.282e-11, 8.407e-11, 7.639e-11, 7.023e-11, 6.474e-11,
2688 6.142e-11, 5.76e-11, 5.568e-11, 5.472e-11, 5.39e-11, 5.455e-11,
2689 5.54e-11, 5.587e-11, 6.23e-11, 6.49e-11, 6.868e-11, 7.382e-11,
2690 8.022e-11, 8.372e-11, 9.243e-11, 1.004e-10, 1.062e-10, 1.13e-10,
2691 1.176e-10, 1.244e-10, 1.279e-10, 1.298e-10, 1.302e-10, 1.312e-10,
2692 1.295e-10, 1.244e-10, 1.211e-10, 1.167e-10, 1.098e-10, 9.927e-11,
2693 8.854e-11, 8.011e-11, 7.182e-11, 5.923e-11, 5.212e-11, 4.453e-11,
2694 3.832e-11, 3.371e-11, 2.987e-11, 2.651e-11, 2.354e-11, 2.093e-11,
2695 1.863e-11, 1.662e-11, 1.486e-11, 1.331e-11, 1.193e-11, 1.071e-11,
2696 9.628e-12, 8.66e-12, 7.801e-12, 7.031e-12, 6.347e-12, 5.733e-12,
2697 5.182e-12, 4.695e-12, 4.26e-12, 3.874e-12, 3.533e-12, 3.235e-12,
2698 2.979e-12, 2.76e-12, 2.579e-12, 2.432e-12, 2.321e-12, 2.246e-12,
2699 2.205e-12, 2.196e-12, 2.223e-12, 2.288e-12, 2.387e-12, 2.525e-12,
2700 2.704e-12, 2.925e-12, 3.191e-12, 3.508e-12, 3.876e-12, 4.303e-12,
2701 4.793e-12, 5.347e-12, 5.978e-12, 6.682e-12, 7.467e-12, 8.34e-12,
2702 9.293e-12, 1.035e-11, 1.152e-11, 1.285e-11, 1.428e-11, 1.586e-11,
2703 1.764e-11, 1.972e-11, 2.214e-11, 2.478e-11, 2.776e-11, 3.151e-11,
2704 3.591e-11, 4.103e-11, 4.66e-11, 5.395e-11, 6.306e-11, 7.172e-11,
2705 8.358e-11, 9.67e-11, 1.11e-10, 1.325e-10, 1.494e-10, 1.736e-10,
2706 2.007e-10, 2.296e-10, 2.608e-10, 3.004e-10, 3.361e-10, 3.727e-10,
2707 4.373e-10, 4.838e-10, 5.483e-10, 6.006e-10, 6.535e-10, 6.899e-10,
2708 7.687e-10, 8.444e-10, 8.798e-10, 9.135e-10, 9.532e-10, 9.757e-10,
2709 9.968e-10, 1.006e-9, 9.949e-10, 9.789e-10, 9.564e-10, 9.215e-10,
2710 8.51e-10, 8.394e-10, 7.707e-10, 7.152e-10, 6.274e-10, 5.598e-10,
2711 5.028e-10, 4.3e-10, 3.71e-10, 3.245e-10, 2.809e-10, 2.461e-10,
2712 2.154e-10, 1.91e-10, 1.685e-10, 1.487e-10, 1.313e-10, 1.163e-10,
2713 1.031e-10, 9.172e-11, 8.221e-11, 7.382e-11, 6.693e-11, 6.079e-11,
2714 5.581e-11, 5.167e-11, 4.811e-11, 4.506e-11, 4.255e-11, 4.083e-11,
2715 3.949e-11, 3.881e-11, 3.861e-11, 3.858e-11, 3.951e-11, 4.045e-11,
2716 4.24e-11, 4.487e-11, 4.806e-11, 5.133e-11, 5.518e-11, 5.919e-11,
2717 6.533e-11, 7.031e-11, 7.762e-11, 8.305e-11, 9.252e-11, 9.727e-11,
2718 1.045e-10, 1.117e-10, 1.2e-10, 1.275e-10, 1.341e-10, 1.362e-10,
2719 1.438e-10, 1.45e-10, 1.455e-10, 1.455e-10, 1.434e-10, 1.381e-10,
2720 1.301e-10, 1.276e-10, 1.163e-10, 1.089e-10, 9.911e-11, 8.943e-11,
2721 7.618e-11, 6.424e-11, 5.717e-11, 4.866e-11, 4.257e-11, 3.773e-11,
2722 3.331e-11, 2.958e-11, 2.629e-11, 2.316e-11, 2.073e-11, 1.841e-11,
2723 1.635e-11, 1.464e-11, 1.31e-11, 1.16e-11, 1.047e-11, 9.408e-12,
2724 8.414e-12, 7.521e-12, 6.705e-12, 5.993e-12, 5.371e-12, 4.815e-12,
2725 4.338e-12, 3.921e-12, 3.567e-12, 3.265e-12, 3.01e-12, 2.795e-12,
2726 2.613e-12, 2.464e-12, 2.346e-12, 2.256e-12, 2.195e-12, 2.165e-12,
2727 2.166e-12, 2.198e-12, 2.262e-12, 2.364e-12, 2.502e-12, 2.682e-12,
2728 2.908e-12, 3.187e-12, 3.533e-12, 3.946e-12, 4.418e-12, 5.013e-12,
2729 5.708e-12, 6.379e-12, 7.43e-12, 8.39e-12, 9.51e-12, 1.078e-11,
2730 1.259e-11, 1.438e-11, 1.63e-11, 1.814e-11, 2.055e-11, 2.348e-11,
2731 2.664e-11, 2.956e-11, 3.3e-11, 3.677e-11, 4.032e-11, 4.494e-11,
2732 4.951e-11, 5.452e-11, 6.014e-11, 6.5e-11, 6.915e-11, 7.45e-11,
2733 7.971e-11, 8.468e-11, 8.726e-11, 8.995e-11, 9.182e-11, 9.509e-11,
2734 9.333e-11, 9.386e-11, 9.457e-11, 9.21e-11, 9.019e-11, 8.68e-11,
2735 8.298e-11, 7.947e-11, 7.46e-11, 7.082e-11, 6.132e-11, 5.855e-11,
2736 5.073e-11, 4.464e-11, 3.825e-11, 3.375e-11, 2.911e-11, 2.535e-11,
2737 2.16e-11, 1.907e-11, 1.665e-11, 1.463e-11, 1.291e-11, 1.133e-11,
2738 9.997e-12, 8.836e-12, 7.839e-12, 6.943e-12, 6.254e-12, 5.6e-12,
2739 5.029e-12, 4.529e-12, 4.102e-12, 3.737e-12, 3.428e-12, 3.169e-12,
2740 2.959e-12, 2.798e-12, 2.675e-12, 2.582e-12, 2.644e-12, 2.557e-12,
2741 2.614e-12, 2.717e-12, 2.874e-12, 3.056e-12, 3.187e-12, 3.631e-12,
2742 3.979e-12, 4.248e-12, 4.817e-12, 5.266e-12, 5.836e-12, 6.365e-12,
2743 6.807e-12, 7.47e-12, 7.951e-12, 8.636e-12, 8.972e-12, 9.314e-12,
2744 9.445e-12, 1.003e-11, 1.013e-11, 9.937e-12, 9.729e-12, 9.064e-12,
2745 9.119e-12, 9.124e-12, 8.704e-12, 8.078e-12, 7.47e-12, 6.329e-12,
2746 5.674e-12, 4.808e-12, 4.119e-12, 3.554e-12, 3.103e-12, 2.731e-12,
2747 2.415e-12, 2.15e-12, 1.926e-12, 1.737e-12, 1.578e-12, 1.447e-12,
2748 1.34e-12, 1.255e-12, 1.191e-12, 1.146e-12, 1.121e-12, 1.114e-12,
2749 1.126e-12, 1.156e-12, 1.207e-12, 1.278e-12, 1.372e-12, 1.49e-12,
2750 1.633e-12, 1.805e-12, 2.01e-12, 2.249e-12, 2.528e-12, 2.852e-12,
2751 3.228e-12, 3.658e-12, 4.153e-12, 4.728e-12, 5.394e-12, 6.176e-12,
2752 7.126e-12, 8.188e-12, 9.328e-12, 1.103e-11, 1.276e-11, 1.417e-11,
2753 1.615e-11, 1.84e-11, 2.155e-11, 2.429e-11, 2.826e-11, 3.222e-11,
2754 3.664e-11, 4.14e-11, 4.906e-11, 5.536e-11, 6.327e-11, 7.088e-11,
2755 8.316e-11, 9.242e-11, 1.07e-10, 1.223e-10, 1.341e-10, 1.553e-10,
2756 1.703e-10, 1.9e-10, 2.022e-10, 2.233e-10, 2.345e-10, 2.438e-10,
2757 2.546e-10, 2.599e-10, 2.661e-10, 2.703e-10, 2.686e-10, 2.662e-10,
2758 2.56e-10, 2.552e-10, 2.378e-10, 2.252e-10, 2.146e-10, 1.885e-10,
2759 1.668e-10, 1.441e-10, 1.295e-10, 1.119e-10, 9.893e-11, 8.687e-11,
2760 7.678e-11, 6.685e-11, 5.879e-11, 5.127e-11, 4.505e-11, 3.997e-11,
2761 3.511e-11
2762 };
2763
2764 static const double h2ofrn[2001] = { .01095, .01126, .01205, .01322, .0143,
2765 .01506, .01548, .01534, .01486, .01373, .01262, .01134, .01001,
2766 .008702, .007475, .006481, .00548, .0046, .003833, .00311,
2767 .002543, .002049, .00168, .001374, .001046, 8.193e-4, 6.267e-4,
2768 4.968e-4, 3.924e-4, 2.983e-4, 2.477e-4, 1.997e-4, 1.596e-4,
2769 1.331e-4, 1.061e-4, 8.942e-5, 7.168e-5, 5.887e-5, 4.848e-5,
2770 3.817e-5, 3.17e-5, 2.579e-5, 2.162e-5, 1.768e-5, 1.49e-5,
2771 1.231e-5, 1.013e-5, 8.555e-6, 7.328e-6, 6.148e-6, 5.207e-6,
2772 4.387e-6, 3.741e-6, 3.22e-6, 2.753e-6, 2.346e-6, 1.985e-6,
2773 1.716e-6, 1.475e-6, 1.286e-6, 1.122e-6, 9.661e-7, 8.284e-7,
2774 7.057e-7, 6.119e-7, 5.29e-7, 4.571e-7, 3.948e-7, 3.432e-7,
2775 2.983e-7, 2.589e-7, 2.265e-7, 1.976e-7, 1.704e-7, 1.456e-7,
2776 1.26e-7, 1.101e-7, 9.648e-8, 8.415e-8, 7.34e-8, 6.441e-8,
2777 5.643e-8, 4.94e-8, 4.276e-8, 3.703e-8, 3.227e-8, 2.825e-8,
2778 2.478e-8, 2.174e-8, 1.898e-8, 1.664e-8, 1.458e-8, 1.278e-8,
2779 1.126e-8, 9.891e-9, 8.709e-9, 7.652e-9, 6.759e-9, 5.975e-9,
2780 5.31e-9, 4.728e-9, 4.214e-9, 3.792e-9, 3.463e-9, 3.226e-9,
2781 2.992e-9, 2.813e-9, 2.749e-9, 2.809e-9, 2.913e-9, 3.037e-9,
2782 3.413e-9, 3.738e-9, 4.189e-9, 4.808e-9, 5.978e-9, 7.088e-9,
2783 8.071e-9, 9.61e-9, 1.21e-8, 1.5e-8, 1.764e-8, 2.221e-8, 2.898e-8,
2784 3.948e-8, 5.068e-8, 6.227e-8, 7.898e-8, 1.033e-7, 1.437e-7,
2785 1.889e-7, 2.589e-7, 3.59e-7, 4.971e-7, 7.156e-7, 9.983e-7,
2786 1.381e-6, 1.929e-6, 2.591e-6, 3.453e-6, 4.57e-6, 5.93e-6,
2787 7.552e-6, 9.556e-6, 1.183e-5, 1.425e-5, 1.681e-5, 1.978e-5,
2788 2.335e-5, 2.668e-5, 3.022e-5, 3.371e-5, 3.715e-5, 3.967e-5,
2789 4.06e-5, 4.01e-5, 3.809e-5, 3.491e-5, 3.155e-5, 2.848e-5,
2790 2.678e-5, 2.66e-5, 2.811e-5, 3.071e-5, 3.294e-5, 3.459e-5,
2791 3.569e-5, 3.56e-5, 3.434e-5, 3.186e-5, 2.916e-5, 2.622e-5,
2792 2.275e-5, 1.918e-5, 1.62e-5, 1.373e-5, 1.182e-5, 1.006e-5,
2793 8.556e-6, 7.26e-6, 6.107e-6, 5.034e-6, 4.211e-6, 3.426e-6,
2794 2.865e-6, 2.446e-6, 1.998e-6, 1.628e-6, 1.242e-6, 1.005e-6,
2795 7.853e-7, 6.21e-7, 5.071e-7, 4.156e-7, 3.548e-7, 2.825e-7,
2796 2.261e-7, 1.916e-7, 1.51e-7, 1.279e-7, 1.059e-7, 9.14e-8,
2797 7.707e-8, 6.17e-8, 5.311e-8, 4.263e-8, 3.518e-8, 2.961e-8,
2798 2.457e-8, 2.119e-8, 1.712e-8, 1.439e-8, 1.201e-8, 1.003e-8,
2799 8.564e-9, 7.199e-9, 6.184e-9, 5.206e-9, 4.376e-9, 3.708e-9,
2800 3.157e-9, 2.725e-9, 2.361e-9, 2.074e-9, 1.797e-9, 1.562e-9,
2801 1.364e-9, 1.196e-9, 1.042e-9, 8.862e-10, 7.648e-10, 6.544e-10,
2802 5.609e-10, 4.791e-10, 4.108e-10, 3.531e-10, 3.038e-10, 2.618e-10,
2803 2.268e-10, 1.969e-10, 1.715e-10, 1.496e-10, 1.308e-10, 1.147e-10,
2804 1.008e-10, 8.894e-11, 7.885e-11, 7.031e-11, 6.355e-11, 5.854e-11,
2805 5.534e-11, 5.466e-11, 5.725e-11, 6.447e-11, 7.943e-11, 1.038e-10,
2806 1.437e-10, 2.04e-10, 2.901e-10, 4.051e-10, 5.556e-10, 7.314e-10,
2807 9.291e-10, 1.134e-9, 1.321e-9, 1.482e-9, 1.596e-9, 1.669e-9,
2808 1.715e-9, 1.762e-9, 1.817e-9, 1.828e-9, 1.848e-9, 1.873e-9,
2809 1.902e-9, 1.894e-9, 1.864e-9, 1.841e-9, 1.797e-9, 1.704e-9,
2810 1.559e-9, 1.382e-9, 1.187e-9, 1.001e-9, 8.468e-10, 7.265e-10,
2811 6.521e-10, 6.381e-10, 6.66e-10, 7.637e-10, 9.705e-10, 1.368e-9,
2812 1.856e-9, 2.656e-9, 3.954e-9, 5.96e-9, 8.72e-9, 1.247e-8,
2813 1.781e-8, 2.491e-8, 3.311e-8, 4.272e-8, 5.205e-8, 6.268e-8,
2814 7.337e-8, 8.277e-8, 9.185e-8, 1.004e-7, 1.091e-7, 1.159e-7,
2815 1.188e-7, 1.175e-7, 1.124e-7, 1.033e-7, 9.381e-8, 8.501e-8,
2816 7.956e-8, 7.894e-8, 8.331e-8, 9.102e-8, 9.836e-8, 1.035e-7,
2817 1.064e-7, 1.06e-7, 1.032e-7, 9.808e-8, 9.139e-8, 8.442e-8,
2818 7.641e-8, 6.881e-8, 6.161e-8, 5.404e-8, 4.804e-8, 4.446e-8,
2819 4.328e-8, 4.259e-8, 4.421e-8, 4.673e-8, 4.985e-8, 5.335e-8,
2820 5.796e-8, 6.542e-8, 7.714e-8, 8.827e-8, 1.04e-7, 1.238e-7,
2821 1.499e-7, 1.829e-7, 2.222e-7, 2.689e-7, 3.303e-7, 3.981e-7,
2822 4.84e-7, 5.91e-7, 7.363e-7, 9.087e-7, 1.139e-6, 1.455e-6,
2823 1.866e-6, 2.44e-6, 3.115e-6, 3.941e-6, 4.891e-6, 5.992e-6,
2824 7.111e-6, 8.296e-6, 9.21e-6, 9.987e-6, 1.044e-5, 1.073e-5,
2825 1.092e-5, 1.106e-5, 1.138e-5, 1.171e-5, 1.186e-5, 1.186e-5,
2826 1.179e-5, 1.166e-5, 1.151e-5, 1.16e-5, 1.197e-5, 1.241e-5,
2827 1.268e-5, 1.26e-5, 1.184e-5, 1.063e-5, 9.204e-6, 7.584e-6,
2828 6.053e-6, 4.482e-6, 3.252e-6, 2.337e-6, 1.662e-6, 1.18e-6,
2829 8.15e-7, 5.95e-7, 4.354e-7, 3.302e-7, 2.494e-7, 1.93e-7,
2830 1.545e-7, 1.25e-7, 1.039e-7, 8.602e-8, 7.127e-8, 5.897e-8,
2831 4.838e-8, 4.018e-8, 3.28e-8, 2.72e-8, 2.307e-8, 1.972e-8,
2832 1.654e-8, 1.421e-8, 1.174e-8, 1.004e-8, 8.739e-9, 7.358e-9,
2833 6.242e-9, 5.303e-9, 4.567e-9, 3.94e-9, 3.375e-9, 2.864e-9,
2834 2.422e-9, 2.057e-9, 1.75e-9, 1.505e-9, 1.294e-9, 1.101e-9,
2835 9.401e-10, 8.018e-10, 6.903e-10, 5.965e-10, 5.087e-10, 4.364e-10,
2836 3.759e-10, 3.247e-10, 2.809e-10, 2.438e-10, 2.123e-10, 1.853e-10,
2837 1.622e-10, 1.426e-10, 1.26e-10, 1.125e-10, 1.022e-10, 9.582e-11,
2838 9.388e-11, 9.801e-11, 1.08e-10, 1.276e-10, 1.551e-10, 1.903e-10,
2839 2.291e-10, 2.724e-10, 3.117e-10, 3.4e-10, 3.562e-10, 3.625e-10,
2840 3.619e-10, 3.429e-10, 3.221e-10, 2.943e-10, 2.645e-10, 2.338e-10,
2841 2.062e-10, 1.901e-10, 1.814e-10, 1.827e-10, 1.906e-10, 1.984e-10,
2842 2.04e-10, 2.068e-10, 2.075e-10, 2.018e-10, 1.959e-10, 1.897e-10,
2843 1.852e-10, 1.791e-10, 1.696e-10, 1.634e-10, 1.598e-10, 1.561e-10,
2844 1.518e-10, 1.443e-10, 1.377e-10, 1.346e-10, 1.342e-10, 1.375e-10,
2845 1.525e-10, 1.767e-10, 2.108e-10, 2.524e-10, 2.981e-10, 3.477e-10,
2846 4.262e-10, 5.326e-10, 6.646e-10, 8.321e-10, 1.069e-9, 1.386e-9,
2847 1.743e-9, 2.216e-9, 2.808e-9, 3.585e-9, 4.552e-9, 5.907e-9,
2848 7.611e-9, 9.774e-9, 1.255e-8, 1.666e-8, 2.279e-8, 3.221e-8,
2849 4.531e-8, 6.4e-8, 9.187e-8, 1.295e-7, 1.825e-7, 2.431e-7,
2850 3.181e-7, 4.009e-7, 4.941e-7, 5.88e-7, 6.623e-7, 7.155e-7,
2851 7.451e-7, 7.594e-7, 7.541e-7, 7.467e-7, 7.527e-7, 7.935e-7,
2852 8.461e-7, 8.954e-7, 9.364e-7, 9.843e-7, 1.024e-6, 1.05e-6,
2853 1.059e-6, 1.074e-6, 1.072e-6, 1.043e-6, 9.789e-7, 8.803e-7,
2854 7.662e-7, 6.378e-7, 5.133e-7, 3.958e-7, 2.914e-7, 2.144e-7,
2855 1.57e-7, 1.14e-7, 8.47e-8, 6.2e-8, 4.657e-8, 3.559e-8, 2.813e-8,
2856 2.222e-8, 1.769e-8, 1.391e-8, 1.125e-8, 9.186e-9, 7.704e-9,
2857 6.447e-9, 5.381e-9, 4.442e-9, 3.669e-9, 3.057e-9, 2.564e-9,
2858 2.153e-9, 1.784e-9, 1.499e-9, 1.281e-9, 1.082e-9, 9.304e-10,
2859 8.169e-10, 6.856e-10, 5.866e-10, 5.043e-10, 4.336e-10, 3.731e-10,
2860 3.175e-10, 2.745e-10, 2.374e-10, 2.007e-10, 1.737e-10, 1.508e-10,
2861 1.302e-10, 1.13e-10, 9.672e-11, 8.375e-11, 7.265e-11, 6.244e-11,
2862 5.343e-11, 4.654e-11, 3.975e-11, 3.488e-11, 3.097e-11, 2.834e-11,
2863 2.649e-11, 2.519e-11, 2.462e-11, 2.443e-11, 2.44e-11, 2.398e-11,
2864 2.306e-11, 2.183e-11, 2.021e-11, 1.821e-11, 1.599e-11, 1.403e-11,
2865 1.196e-11, 1.023e-11, 8.728e-12, 7.606e-12, 6.941e-12, 6.545e-12,
2866 6.484e-12, 6.6e-12, 6.718e-12, 6.785e-12, 6.746e-12, 6.724e-12,
2867 6.764e-12, 6.995e-12, 7.144e-12, 7.32e-12, 7.33e-12, 7.208e-12,
2868 6.789e-12, 6.09e-12, 5.337e-12, 4.62e-12, 4.037e-12, 3.574e-12,
2869 3.311e-12, 3.346e-12, 3.566e-12, 3.836e-12, 4.076e-12, 4.351e-12,
2870 4.691e-12, 5.114e-12, 5.427e-12, 6.167e-12, 7.436e-12, 8.842e-12,
2871 1.038e-11, 1.249e-11, 1.54e-11, 1.915e-11, 2.48e-11, 3.256e-11,
2872 4.339e-11, 5.611e-11, 7.519e-11, 1.037e-10, 1.409e-10, 1.883e-10,
2873 2.503e-10, 3.38e-10, 4.468e-10, 5.801e-10, 7.335e-10, 8.98e-10,
2874 1.11e-9, 1.363e-9, 1.677e-9, 2.104e-9, 2.681e-9, 3.531e-9,
2875 4.621e-9, 6.106e-9, 8.154e-9, 1.046e-8, 1.312e-8, 1.607e-8,
2876 1.948e-8, 2.266e-8, 2.495e-8, 2.655e-8, 2.739e-8, 2.739e-8,
2877 2.662e-8, 2.589e-8, 2.59e-8, 2.664e-8, 2.833e-8, 3.023e-8,
2878 3.305e-8, 3.558e-8, 3.793e-8, 3.961e-8, 4.056e-8, 4.102e-8,
2879 4.025e-8, 3.917e-8, 3.706e-8, 3.493e-8, 3.249e-8, 3.096e-8,
2880 3.011e-8, 3.111e-8, 3.395e-8, 3.958e-8, 4.875e-8, 6.066e-8,
2881 7.915e-8, 1.011e-7, 1.3e-7, 1.622e-7, 2.003e-7, 2.448e-7,
2882 2.863e-7, 3.317e-7, 3.655e-7, 3.96e-7, 4.098e-7, 4.168e-7,
2883 4.198e-7, 4.207e-7, 4.289e-7, 4.384e-7, 4.471e-7, 4.524e-7,
2884 4.574e-7, 4.633e-7, 4.785e-7, 5.028e-7, 5.371e-7, 5.727e-7,
2885 5.955e-7, 5.998e-7, 5.669e-7, 5.082e-7, 4.397e-7, 3.596e-7,
2886 2.814e-7, 2.074e-7, 1.486e-7, 1.057e-7, 7.25e-8, 4.946e-8,
2887 3.43e-8, 2.447e-8, 1.793e-8, 1.375e-8, 1.096e-8, 9.091e-9,
2888 7.709e-9, 6.631e-9, 5.714e-9, 4.886e-9, 4.205e-9, 3.575e-9,
2889 3.07e-9, 2.631e-9, 2.284e-9, 2.002e-9, 1.745e-9, 1.509e-9,
2890 1.284e-9, 1.084e-9, 9.163e-10, 7.663e-10, 6.346e-10, 5.283e-10,
2891 4.354e-10, 3.59e-10, 2.982e-10, 2.455e-10, 2.033e-10, 1.696e-10,
2892 1.432e-10, 1.211e-10, 1.02e-10, 8.702e-11, 7.38e-11, 6.293e-11,
2893 5.343e-11, 4.532e-11, 3.907e-11, 3.365e-11, 2.945e-11, 2.558e-11,
2894 2.192e-11, 1.895e-11, 1.636e-11, 1.42e-11, 1.228e-11, 1.063e-11,
2895 9.348e-12, 8.2e-12, 7.231e-12, 6.43e-12, 5.702e-12, 5.052e-12,
2896 4.469e-12, 4e-12, 3.679e-12, 3.387e-12, 3.197e-12, 3.158e-12,
2897 3.327e-12, 3.675e-12, 4.292e-12, 5.437e-12, 7.197e-12, 1.008e-11,
2898 1.437e-11, 2.035e-11, 2.905e-11, 4.062e-11, 5.528e-11, 7.177e-11,
2899 9.064e-11, 1.109e-10, 1.297e-10, 1.473e-10, 1.652e-10, 1.851e-10,
2900 2.079e-10, 2.313e-10, 2.619e-10, 2.958e-10, 3.352e-10, 3.796e-10,
2901 4.295e-10, 4.923e-10, 5.49e-10, 5.998e-10, 6.388e-10, 6.645e-10,
2902 6.712e-10, 6.549e-10, 6.38e-10, 6.255e-10, 6.253e-10, 6.459e-10,
2903 6.977e-10, 7.59e-10, 8.242e-10, 8.92e-10, 9.403e-10, 9.701e-10,
2904 9.483e-10, 9.135e-10, 8.617e-10, 7.921e-10, 7.168e-10, 6.382e-10,
2905 5.677e-10, 5.045e-10, 4.572e-10, 4.312e-10, 4.145e-10, 4.192e-10,
2906 4.541e-10, 5.368e-10, 6.771e-10, 8.962e-10, 1.21e-9, 1.659e-9,
2907 2.33e-9, 3.249e-9, 4.495e-9, 5.923e-9, 7.642e-9, 9.607e-9,
2908 1.178e-8, 1.399e-8, 1.584e-8, 1.73e-8, 1.816e-8, 1.87e-8,
2909 1.868e-8, 1.87e-8, 1.884e-8, 1.99e-8, 2.15e-8, 2.258e-8,
2910 2.364e-8, 2.473e-8, 2.602e-8, 2.689e-8, 2.731e-8, 2.816e-8,
2911 2.859e-8, 2.839e-8, 2.703e-8, 2.451e-8, 2.149e-8, 1.787e-8,
2912 1.449e-8, 1.111e-8, 8.282e-9, 6.121e-9, 4.494e-9, 3.367e-9,
2913 2.487e-9, 1.885e-9, 1.503e-9, 1.249e-9, 1.074e-9, 9.427e-10,
2914 8.439e-10, 7.563e-10, 6.772e-10, 6.002e-10, 5.254e-10, 4.588e-10,
2915 3.977e-10, 3.449e-10, 3.003e-10, 2.624e-10, 2.335e-10, 2.04e-10,
2916 1.771e-10, 1.534e-10, 1.296e-10, 1.097e-10, 9.173e-11, 7.73e-11,
2917 6.547e-11, 5.191e-11, 4.198e-11, 3.361e-11, 2.732e-11, 2.244e-11,
2918 1.791e-11, 1.509e-11, 1.243e-11, 1.035e-11, 8.969e-12, 7.394e-12,
2919 6.323e-12, 5.282e-12, 4.543e-12, 3.752e-12, 3.14e-12, 2.6e-12,
2920 2.194e-12, 1.825e-12, 1.511e-12, 1.245e-12, 1.024e-12, 8.539e-13,
2921 7.227e-13, 6.102e-13, 5.189e-13, 4.43e-13, 3.774e-13, 3.236e-13,
2922 2.8e-13, 2.444e-13, 2.156e-13, 1.932e-13, 1.775e-13, 1.695e-13,
2923 1.672e-13, 1.704e-13, 1.825e-13, 2.087e-13, 2.614e-13, 3.377e-13,
2924 4.817e-13, 6.989e-13, 1.062e-12, 1.562e-12, 2.288e-12, 3.295e-12,
2925 4.55e-12, 5.965e-12, 7.546e-12, 9.395e-12, 1.103e-11, 1.228e-11,
2926 1.318e-11, 1.38e-11, 1.421e-11, 1.39e-11, 1.358e-11, 1.336e-11,
2927 1.342e-11, 1.356e-11, 1.424e-11, 1.552e-11, 1.73e-11, 1.951e-11,
2928 2.128e-11, 2.249e-11, 2.277e-11, 2.226e-11, 2.111e-11, 1.922e-11,
2929 1.775e-11, 1.661e-11, 1.547e-11, 1.446e-11, 1.323e-11, 1.21e-11,
2930 1.054e-11, 9.283e-12, 8.671e-12, 8.67e-12, 9.429e-12, 1.062e-11,
2931 1.255e-11, 1.506e-11, 1.818e-11, 2.26e-11, 2.831e-11, 3.723e-11,
2932 5.092e-11, 6.968e-11, 9.826e-11, 1.349e-10, 1.87e-10, 2.58e-10,
2933 3.43e-10, 4.424e-10, 5.521e-10, 6.812e-10, 8.064e-10, 9.109e-10,
2934 9.839e-10, 1.028e-9, 1.044e-9, 1.029e-9, 1.005e-9, 1.002e-9,
2935 1.038e-9, 1.122e-9, 1.233e-9, 1.372e-9, 1.524e-9, 1.665e-9,
2936 1.804e-9, 1.908e-9, 2.015e-9, 2.117e-9, 2.219e-9, 2.336e-9,
2937 2.531e-9, 2.805e-9, 3.189e-9, 3.617e-9, 4.208e-9, 4.911e-9,
2938 5.619e-9, 6.469e-9, 7.188e-9, 7.957e-9, 8.503e-9, 9.028e-9,
2939 9.571e-9, 9.99e-9, 1.055e-8, 1.102e-8, 1.132e-8, 1.141e-8,
2940 1.145e-8, 1.145e-8, 1.176e-8, 1.224e-8, 1.304e-8, 1.388e-8,
2941 1.445e-8, 1.453e-8, 1.368e-8, 1.22e-8, 1.042e-8, 8.404e-9,
2942 6.403e-9, 4.643e-9, 3.325e-9, 2.335e-9, 1.638e-9, 1.19e-9,
2943 9.161e-10, 7.412e-10, 6.226e-10, 5.516e-10, 5.068e-10, 4.831e-10,
2944 4.856e-10, 5.162e-10, 5.785e-10, 6.539e-10, 7.485e-10, 8.565e-10,
2945 9.534e-10, 1.052e-9, 1.115e-9, 1.173e-9, 1.203e-9, 1.224e-9,
2946 1.243e-9, 1.248e-9, 1.261e-9, 1.265e-9, 1.25e-9, 1.217e-9,
2947 1.176e-9, 1.145e-9, 1.153e-9, 1.199e-9, 1.278e-9, 1.366e-9,
2948 1.426e-9, 1.444e-9, 1.365e-9, 1.224e-9, 1.051e-9, 8.539e-10,
2949 6.564e-10, 4.751e-10, 3.404e-10, 2.377e-10, 1.631e-10, 1.114e-10,
2950 7.87e-11, 5.793e-11, 4.284e-11, 3.3e-11, 2.62e-11, 2.152e-11,
2951 1.777e-11, 1.496e-11, 1.242e-11, 1.037e-11, 8.725e-12, 7.004e-12,
2952 5.718e-12, 4.769e-12, 3.952e-12, 3.336e-12, 2.712e-12, 2.213e-12,
2953 1.803e-12, 1.492e-12, 1.236e-12, 1.006e-12, 8.384e-13, 7.063e-13,
2954 5.879e-13, 4.93e-13, 4.171e-13, 3.569e-13, 3.083e-13, 2.688e-13,
2955 2.333e-13, 2.035e-13, 1.82e-13, 1.682e-13, 1.635e-13, 1.674e-13,
2956 1.769e-13, 2.022e-13, 2.485e-13, 3.127e-13, 4.25e-13, 5.928e-13,
2957 8.514e-13, 1.236e-12, 1.701e-12, 2.392e-12, 3.231e-12, 4.35e-12,
2958 5.559e-12, 6.915e-12, 8.519e-12, 1.013e-11, 1.146e-11, 1.24e-11,
2959 1.305e-11, 1.333e-11, 1.318e-11, 1.263e-11, 1.238e-11, 1.244e-11,
2960 1.305e-11, 1.432e-11, 1.623e-11, 1.846e-11, 2.09e-11, 2.328e-11,
2961 2.526e-11, 2.637e-11, 2.702e-11, 2.794e-11, 2.889e-11, 2.989e-11,
2962 3.231e-11, 3.68e-11, 4.375e-11, 5.504e-11, 7.159e-11, 9.502e-11,
2963 1.279e-10, 1.645e-10, 2.098e-10, 2.618e-10, 3.189e-10, 3.79e-10,
2964 4.303e-10, 4.753e-10, 5.027e-10, 5.221e-10, 5.293e-10, 5.346e-10,
2965 5.467e-10, 5.796e-10, 6.2e-10, 6.454e-10, 6.705e-10, 6.925e-10,
2966 7.233e-10, 7.35e-10, 7.538e-10, 7.861e-10, 8.077e-10, 8.132e-10,
2967 7.749e-10, 7.036e-10, 6.143e-10, 5.093e-10, 4.089e-10, 3.092e-10,
2968 2.299e-10, 1.705e-10, 1.277e-10, 9.723e-11, 7.533e-11, 6.126e-11,
2969 5.154e-11, 4.428e-11, 3.913e-11, 3.521e-11, 3.297e-11, 3.275e-11,
2970 3.46e-11, 3.798e-11, 4.251e-11, 4.745e-11, 5.232e-11, 5.606e-11,
2971 5.82e-11, 5.88e-11, 5.79e-11, 5.661e-11, 5.491e-11, 5.366e-11,
2972 5.341e-11, 5.353e-11, 5.336e-11, 5.293e-11, 5.248e-11, 5.235e-11,
2973 5.208e-11, 5.322e-11, 5.521e-11, 5.725e-11, 5.827e-11, 5.685e-11,
2974 5.245e-11, 4.612e-11, 3.884e-11, 3.129e-11, 2.404e-11, 1.732e-11,
2975 1.223e-11, 8.574e-12, 5.888e-12, 3.986e-12, 2.732e-12, 1.948e-12,
2976 1.414e-12, 1.061e-12, 8.298e-13, 6.612e-13, 5.413e-13, 4.472e-13,
2977 3.772e-13, 3.181e-13, 2.645e-13, 2.171e-13, 1.778e-13, 1.464e-13,
2978 1.183e-13, 9.637e-14, 7.991e-14, 6.668e-14, 5.57e-14, 4.663e-14,
2979 3.848e-14, 3.233e-14, 2.706e-14, 2.284e-14, 1.944e-14, 1.664e-14,
2980 1.43e-14, 1.233e-14, 1.066e-14, 9.234e-15, 8.023e-15, 6.993e-15,
2981 6.119e-15, 5.384e-15, 4.774e-15, 4.283e-15, 3.916e-15, 3.695e-15,
2982 3.682e-15, 4.004e-15, 4.912e-15, 6.853e-15, 1.056e-14, 1.712e-14,
2983 2.804e-14, 4.516e-14, 7.113e-14, 1.084e-13, 1.426e-13, 1.734e-13,
2984 1.978e-13, 2.194e-13, 2.388e-13, 2.489e-13, 2.626e-13, 2.865e-13,
2985 3.105e-13, 3.387e-13, 3.652e-13, 3.984e-13, 4.398e-13, 4.906e-13,
2986 5.55e-13, 6.517e-13, 7.813e-13, 9.272e-13, 1.164e-12, 1.434e-12,
2987 1.849e-12, 2.524e-12, 3.328e-12, 4.523e-12, 6.108e-12, 8.207e-12,
2988 1.122e-11, 1.477e-11, 1.9e-11, 2.412e-11, 2.984e-11, 3.68e-11,
2989 4.353e-11, 4.963e-11, 5.478e-11, 5.903e-11, 6.233e-11, 6.483e-11,
2990 6.904e-11, 7.569e-11, 8.719e-11, 1.048e-10, 1.278e-10, 1.557e-10,
2991 1.869e-10, 2.218e-10, 2.61e-10, 2.975e-10, 3.371e-10, 3.746e-10,
2992 4.065e-10, 4.336e-10, 4.503e-10, 4.701e-10, 4.8e-10, 4.917e-10,
2993 5.038e-10, 5.128e-10, 5.143e-10, 5.071e-10, 5.019e-10, 5.025e-10,
2994 5.183e-10, 5.496e-10, 5.877e-10, 6.235e-10, 6.42e-10, 6.234e-10,
2995 5.698e-10, 4.916e-10, 4.022e-10, 3.126e-10, 2.282e-10, 1.639e-10,
2996 1.142e-10, 7.919e-11, 5.69e-11, 4.313e-11, 3.413e-11, 2.807e-11,
2997 2.41e-11, 2.166e-11, 2.024e-11, 1.946e-11, 1.929e-11, 1.963e-11,
2998 2.035e-11, 2.162e-11, 2.305e-11, 2.493e-11, 2.748e-11, 3.048e-11,
2999 3.413e-11, 3.754e-11, 4.155e-11, 4.635e-11, 5.11e-11, 5.734e-11,
3000 6.338e-11, 6.99e-11, 7.611e-11, 8.125e-11, 8.654e-11, 8.951e-11,
3001 9.182e-11, 9.31e-11, 9.273e-11, 9.094e-11, 8.849e-11, 8.662e-11,
3002 8.67e-11, 8.972e-11, 9.566e-11, 1.025e-10, 1.083e-10, 1.111e-10,
3003 1.074e-10, 9.771e-11, 8.468e-11, 6.958e-11, 5.47e-11, 4.04e-11,
3004 2.94e-11, 2.075e-11, 1.442e-11, 1.01e-11, 7.281e-12, 5.409e-12,
3005 4.138e-12, 3.304e-12, 2.784e-12, 2.473e-12, 2.273e-12, 2.186e-12,
3006 2.118e-12, 2.066e-12, 1.958e-12, 1.818e-12, 1.675e-12, 1.509e-12,
3007 1.349e-12, 1.171e-12, 9.838e-13, 8.213e-13, 6.765e-13, 5.378e-13,
3008 4.161e-13, 3.119e-13, 2.279e-13, 1.637e-13, 1.152e-13, 8.112e-14,
3009 5.919e-14, 4.47e-14, 3.492e-14, 2.811e-14, 2.319e-14, 1.948e-14,
3010 1.66e-14, 1.432e-14, 1.251e-14, 1.109e-14, 1.006e-14, 9.45e-15,
3011 9.384e-15, 1.012e-14, 1.216e-14, 1.636e-14, 2.305e-14, 3.488e-14,
3012 5.572e-14, 8.479e-14, 1.265e-13, 1.905e-13, 2.73e-13, 3.809e-13,
3013 4.955e-13, 6.303e-13, 7.861e-13, 9.427e-13, 1.097e-12, 1.212e-12,
3014 1.328e-12, 1.415e-12, 1.463e-12, 1.495e-12, 1.571e-12, 1.731e-12,
3015 1.981e-12, 2.387e-12, 2.93e-12, 3.642e-12, 4.584e-12, 5.822e-12,
3016 7.278e-12, 9.193e-12, 1.135e-11, 1.382e-11, 1.662e-11, 1.958e-11,
3017 2.286e-11, 2.559e-11, 2.805e-11, 2.988e-11, 3.106e-11, 3.182e-11,
3018 3.2e-11, 3.258e-11, 3.362e-11, 3.558e-11, 3.688e-11, 3.8e-11,
3019 3.929e-11, 4.062e-11, 4.186e-11, 4.293e-11, 4.48e-11, 4.643e-11,
3020 4.704e-11, 4.571e-11, 4.206e-11, 3.715e-11, 3.131e-11, 2.541e-11,
3021 1.978e-11, 1.508e-11, 1.146e-11, 8.7e-12, 6.603e-12, 5.162e-12,
3022 4.157e-12, 3.408e-12, 2.829e-12, 2.405e-12, 2.071e-12, 1.826e-12,
3023 1.648e-12, 1.542e-12, 1.489e-12, 1.485e-12, 1.493e-12, 1.545e-12,
3024 1.637e-12, 1.814e-12, 2.061e-12, 2.312e-12, 2.651e-12, 3.03e-12,
3025 3.46e-12, 3.901e-12, 4.306e-12, 4.721e-12, 5.008e-12, 5.281e-12,
3026 5.541e-12, 5.791e-12, 6.115e-12, 6.442e-12, 6.68e-12, 6.791e-12,
3027 6.831e-12, 6.839e-12, 6.946e-12, 7.128e-12, 7.537e-12, 8.036e-12,
3028 8.392e-12, 8.526e-12, 8.11e-12, 7.325e-12, 6.329e-12, 5.183e-12,
3029 4.081e-12, 2.985e-12, 2.141e-12, 1.492e-12, 1.015e-12, 6.684e-13,
3030 4.414e-13, 2.987e-13, 2.038e-13, 1.391e-13, 9.86e-14, 7.24e-14,
3031 5.493e-14, 4.288e-14, 3.427e-14, 2.787e-14, 2.296e-14, 1.909e-14,
3032 1.598e-14, 1.344e-14, 1.135e-14, 9.616e-15, 8.169e-15, 6.957e-15,
3033 5.938e-15, 5.08e-15, 4.353e-15, 3.738e-15, 3.217e-15, 2.773e-15,
3034 2.397e-15, 2.077e-15, 1.805e-15, 1.575e-15, 1.382e-15, 1.221e-15,
3035 1.09e-15, 9.855e-16, 9.068e-16, 8.537e-16, 8.27e-16, 8.29e-16,
3036 8.634e-16, 9.359e-16, 1.055e-15, 1.233e-15, 1.486e-15, 1.839e-15,
3037 2.326e-15, 2.998e-15, 3.934e-15, 5.256e-15, 7.164e-15, 9.984e-15,
3038 1.427e-14, 2.099e-14, 3.196e-14, 5.121e-14, 7.908e-14, 1.131e-13,
3039 1.602e-13, 2.239e-13, 3.075e-13, 4.134e-13, 5.749e-13, 7.886e-13,
3040 1.071e-12, 1.464e-12, 2.032e-12, 2.8e-12, 3.732e-12, 4.996e-12,
3041 6.483e-12, 8.143e-12, 1.006e-11, 1.238e-11, 1.484e-11, 1.744e-11,
3042 2.02e-11, 2.274e-11, 2.562e-11, 2.848e-11, 3.191e-11, 3.617e-11,
3043 4.081e-11, 4.577e-11, 4.937e-11, 5.204e-11, 5.401e-11, 5.462e-11,
3044 5.507e-11, 5.51e-11, 5.605e-11, 5.686e-11, 5.739e-11, 5.766e-11,
3045 5.74e-11, 5.754e-11, 5.761e-11, 5.777e-11, 5.712e-11, 5.51e-11,
3046 5.088e-11, 4.438e-11, 3.728e-11, 2.994e-11, 2.305e-11, 1.715e-11,
3047 1.256e-11, 9.208e-12, 6.745e-12, 5.014e-12, 3.785e-12, 2.9e-12,
3048 2.239e-12, 1.757e-12, 1.414e-12, 1.142e-12, 9.482e-13, 8.01e-13,
3049 6.961e-13, 6.253e-13, 5.735e-13, 5.433e-13, 5.352e-13, 5.493e-13,
3050 5.706e-13, 6.068e-13, 6.531e-13, 7.109e-13, 7.767e-13, 8.59e-13,
3051 9.792e-13, 1.142e-12, 1.371e-12, 1.65e-12, 1.957e-12, 2.302e-12,
3052 2.705e-12, 3.145e-12, 3.608e-12, 4.071e-12, 4.602e-12, 5.133e-12,
3053 5.572e-12, 5.987e-12, 6.248e-12, 6.533e-12, 6.757e-12, 6.935e-12,
3054 7.224e-12, 7.422e-12, 7.538e-12, 7.547e-12, 7.495e-12, 7.543e-12,
3055 7.725e-12, 8.139e-12, 8.627e-12, 9.146e-12, 9.443e-12, 9.318e-12,
3056 8.649e-12, 7.512e-12, 6.261e-12, 4.915e-12, 3.647e-12, 2.597e-12,
3057 1.785e-12, 1.242e-12, 8.66e-13, 6.207e-13, 4.61e-13, 3.444e-13,
3058 2.634e-13, 2.1e-13, 1.725e-13, 1.455e-13, 1.237e-13, 1.085e-13,
3059 9.513e-14, 7.978e-14, 6.603e-14, 5.288e-14, 4.084e-14, 2.952e-14,
3060 2.157e-14, 1.593e-14, 1.199e-14, 9.267e-15, 7.365e-15, 6.004e-15,
3061 4.995e-15, 4.218e-15, 3.601e-15, 3.101e-15, 2.692e-15, 2.36e-15,
3062 2.094e-15, 1.891e-15, 1.755e-15, 1.699e-15, 1.755e-15, 1.987e-15,
3063 2.506e-15, 3.506e-15, 5.289e-15, 8.311e-15, 1.325e-14, 2.129e-14,
3064 3.237e-14, 4.595e-14, 6.441e-14, 8.433e-14, 1.074e-13, 1.383e-13,
3065 1.762e-13, 2.281e-13, 2.831e-13, 3.523e-13, 4.38e-13, 5.304e-13,
3066 6.29e-13, 7.142e-13, 8.032e-13, 8.934e-13, 9.888e-13, 1.109e-12,
3067 1.261e-12, 1.462e-12, 1.74e-12, 2.099e-12, 2.535e-12, 3.008e-12,
3068 3.462e-12, 3.856e-12, 4.098e-12, 4.239e-12, 4.234e-12, 4.132e-12,
3069 3.986e-12, 3.866e-12, 3.829e-12, 3.742e-12, 3.705e-12, 3.694e-12,
3070 3.765e-12, 3.849e-12, 3.929e-12, 4.056e-12, 4.092e-12, 4.047e-12,
3071 3.792e-12, 3.407e-12, 2.953e-12, 2.429e-12, 1.931e-12, 1.46e-12,
3072 1.099e-12, 8.199e-13, 6.077e-13, 4.449e-13, 3.359e-13, 2.524e-13,
3073 1.881e-13, 1.391e-13, 1.02e-13, 7.544e-14, 5.555e-14, 4.22e-14,
3074 3.321e-14, 2.686e-14, 2.212e-14, 1.78e-14, 1.369e-14, 1.094e-14,
3075 9.13e-15, 8.101e-15, 7.828e-15, 8.393e-15, 1.012e-14, 1.259e-14,
3076 1.538e-14, 1.961e-14, 2.619e-14, 3.679e-14, 5.049e-14, 6.917e-14,
3077 8.88e-14, 1.115e-13, 1.373e-13, 1.619e-13, 1.878e-13, 2.111e-13,
3078 2.33e-13, 2.503e-13, 2.613e-13, 2.743e-13, 2.826e-13, 2.976e-13,
3079 3.162e-13, 3.36e-13, 3.491e-13, 3.541e-13, 3.595e-13, 3.608e-13,
3080 3.709e-13, 3.869e-13, 4.12e-13, 4.366e-13, 4.504e-13, 4.379e-13,
3081 3.955e-13, 3.385e-13, 2.741e-13, 2.089e-13, 1.427e-13, 9.294e-14,
3082 5.775e-14, 3.565e-14, 2.21e-14, 1.398e-14, 9.194e-15, 6.363e-15,
3083 4.644e-15, 3.55e-15, 2.808e-15, 2.274e-15, 1.871e-15, 1.557e-15,
3084 1.308e-15, 1.108e-15, 9.488e-16, 8.222e-16, 7.238e-16, 6.506e-16,
3085 6.008e-16, 5.742e-16, 5.724e-16, 5.991e-16, 6.625e-16, 7.775e-16,
3086 9.734e-16, 1.306e-15, 1.88e-15, 2.879e-15, 4.616e-15, 7.579e-15,
3087 1.248e-14, 2.03e-14, 3.244e-14, 5.171e-14, 7.394e-14, 9.676e-14,
3088 1.199e-13, 1.467e-13, 1.737e-13, 2.02e-13, 2.425e-13, 3.016e-13,
3089 3.7e-13, 4.617e-13, 5.949e-13, 7.473e-13, 9.378e-13, 1.191e-12,
3090 1.481e-12, 1.813e-12, 2.232e-12, 2.722e-12, 3.254e-12, 3.845e-12,
3091 4.458e-12, 5.048e-12, 5.511e-12, 5.898e-12, 6.204e-12, 6.293e-12,
3092 6.386e-12, 6.467e-12, 6.507e-12, 6.466e-12, 6.443e-12, 6.598e-12,
3093 6.873e-12, 7.3e-12, 7.816e-12, 8.368e-12, 8.643e-12, 8.466e-12,
3094 7.871e-12, 6.853e-12, 5.714e-12, 4.482e-12, 3.392e-12, 2.613e-12,
3095 2.008e-12, 1.562e-12, 1.228e-12, 9.888e-13, 7.646e-13, 5.769e-13,
3096 4.368e-13, 3.324e-13, 2.508e-13, 1.916e-13
3097 };
3098
3099 static const double xfcrev[15] =
3100 { 1.003, 1.009, 1.015, 1.023, 1.029, 1.033, 1.037,
3101 1.039, 1.04, 1.046, 1.036, 1.027, 1.01, 1.002, 1.
3102 };
3103
3104 double sfac;
3105
3106 /* Get H2O continuum absorption... */
3107 const double xw = nu / 10 + 1;
3108 if (xw >= 1 && xw < 2001) {
3109 const int iw = (int) xw;
3110 const double dw = xw - iw;
3111 const double ew = 1 - dw;
3112 const double cw296 = ew * h2o296[iw - 1] + dw * h2o296[iw];
3113 const double cw260 = ew * h2o260[iw - 1] + dw * h2o260[iw];
3114 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
3115 if (nu <= 820 || nu >= 960) {
3116 sfac = 1;
3117 } else {
3118 const double xx = (nu - 820) / 10;
3119 const int ix = (int) xx;
3120 const double dx = xx - ix;
3121 sfac = (1 - dx) * xfcrev[ix] + dx * xfcrev[ix + 1];
3122 }
3123 const double ctwslf =
3124 sfac * cw296 * pow(cw260 / cw296, (296 - t) / (296 - 260));
3125 const double vf2 = POW2(nu - 370);
3126 const double vf6 = POW3(vf2);
3127 const double fscal = 36100 / (vf2 + vf6 * 1e-8 + 36100) * -.25 + 1;
3128 const double ctwfrn = cwfrn * fscal;
3129 const double a1 = nu * u * tanh(.7193876 / t * nu);
3130 const double a2 = 296 / t;
3131 const double a3 = p / P0 * (q * ctwslf + (1 - q) * ctwfrn) * 1e-20;
3132 return a1 * a2 * a3;
3133 } else
3134 return 0;
3135}
3136
3137/*****************************************************************************/
3138
3139double ctmn2(
3140 const double nu,
3141 const double p,
3142 const double t) {
3143
3144 static const double ba[98] =
3145 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
3146 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
3147 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
3148 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
3149 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
3150 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
3151 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
3152 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
3153 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
3154 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
3155 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3156 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3157 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3158 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3159 };
3160
3161 static const double betaa[98] =
3162 { 802., 802., 761., 722., 679., 646., 609., 562.,
3163 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3164 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3165 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3166 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3167 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3168 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3169 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3170 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3171 372., 449., 514., 569., 609., 642., 673., 673.
3172 };
3173
3174 static const double nua[98] =
3175 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3176 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3177 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3178 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3179 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3180 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3181 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3182 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3183 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3184 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3185 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3186 };
3187
3188 const double t0 = 273.0, tr = 296.0;
3189
3190 /* Check wavenumber range... */
3191 if (nu < nua[0] || nu > nua[97])
3192 return 0;
3193
3194 /* Interpolate B and beta... */
3195 const int idx = locate_reg(nua, 98, nu);
3196 const double b =
3197 1e6 * LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3198 const double beta =
3199 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3200
3201 /* Compute absorption coefficient... */
3202 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3203 * N2 * b * (N2 + (1 - N2) * (1.294 - 0.4545 * t / tr));
3204}
3205
3206/*****************************************************************************/
3207
3208double ctmo2(
3209 const double nu,
3210 const double p,
3211 const double t) {
3212
3213 static const double ba[90] =
3214 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3215 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3216 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3217 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3218 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3219 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3220 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3221 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3222 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3223 .071, .064, 0.
3224 };
3225
3226 static const double betaa[90] =
3227 { 467., 467., 400., 315., 379., 368., 475., 521.,
3228 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3229 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3230 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3231 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3232 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3233 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3234 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3235 346., 322., 291., 290., 350., 371., 504., 504.
3236 };
3237
3238 static const double nua[90] =
3239 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3240 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3241 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3242 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3243 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3244 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3245 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3246 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3247 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3248 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3249 1800., 1805.
3250 };
3251
3252 const double t0 = 273, tr = 296;
3253
3254 /* Check wavenumber range... */
3255 if (nu < nua[0] || nu > nua[89])
3256 return 0;
3257
3258 /* Interpolate B and beta... */
3259 const int idx = locate_reg(nua, 90, nu);
3260 const double b = LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3261 const double beta =
3262 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3263
3264 /* Compute absorption coefficient... */
3265 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) * O2 * b;
3266}
3267
3268/*****************************************************************************/
3269
3271 const ctl_t *ctl,
3272 atm_t *atm_dest,
3273 const atm_t *atm_src,
3274 const int init) {
3275
3276 /* Data size... */
3277 const size_t s = (size_t) atm_src->np * sizeof(double);
3278
3279 /* Copy data... */
3280 atm_dest->np = atm_src->np;
3281 memcpy(atm_dest->time, atm_src->time, s);
3282 memcpy(atm_dest->z, atm_src->z, s);
3283 memcpy(atm_dest->lon, atm_src->lon, s);
3284 memcpy(atm_dest->lat, atm_src->lat, s);
3285 memcpy(atm_dest->p, atm_src->p, s);
3286 memcpy(atm_dest->t, atm_src->t, s);
3287 for (int ig = 0; ig < ctl->ng; ig++)
3288 memcpy(atm_dest->q[ig], atm_src->q[ig], s);
3289 for (int iw = 0; iw < ctl->nw; iw++)
3290 memcpy(atm_dest->k[iw], atm_src->k[iw], s);
3291 atm_dest->clz = atm_src->clz;
3292 atm_dest->cldz = atm_src->cldz;
3293 for (int icl = 0; icl < ctl->ncl; icl++)
3294 atm_dest->clk[icl] = atm_src->clk[icl];
3295 atm_dest->sft = atm_src->sft;
3296 for (int isf = 0; isf < ctl->nsf; isf++)
3297 atm_dest->sfeps[isf] = atm_src->sfeps[isf];
3298
3299 /* Initialize... */
3300 if (init)
3301 for (int ip = 0; ip < atm_dest->np; ip++) {
3302 atm_dest->p[ip] = 0;
3303 atm_dest->t[ip] = 0;
3304 for (int ig = 0; ig < ctl->ng; ig++)
3305 atm_dest->q[ig][ip] = 0;
3306 for (int iw = 0; iw < ctl->nw; iw++)
3307 atm_dest->k[iw][ip] = 0;
3308 atm_dest->clz = 0;
3309 atm_dest->cldz = 0;
3310 for (int icl = 0; icl < ctl->ncl; icl++)
3311 atm_dest->clk[icl] = 0;
3312 atm_dest->sft = 0;
3313 for (int isf = 0; isf < ctl->nsf; isf++)
3314 atm_dest->sfeps[isf] = 1;
3315 }
3316}
3317
3318/*****************************************************************************/
3319
3321 const ctl_t *ctl,
3322 obs_t *obs_dest,
3323 const obs_t *obs_src,
3324 const int init) {
3325
3326 /* Data size... */
3327 const size_t s = (size_t) obs_src->nr * sizeof(double);
3328
3329 /* Copy data... */
3330 obs_dest->nr = obs_src->nr;
3331 memcpy(obs_dest->time, obs_src->time, s);
3332 memcpy(obs_dest->obsz, obs_src->obsz, s);
3333 memcpy(obs_dest->obslon, obs_src->obslon, s);
3334 memcpy(obs_dest->obslat, obs_src->obslat, s);
3335 memcpy(obs_dest->vpz, obs_src->vpz, s);
3336 memcpy(obs_dest->vplon, obs_src->vplon, s);
3337 memcpy(obs_dest->vplat, obs_src->vplat, s);
3338 memcpy(obs_dest->tpz, obs_src->tpz, s);
3339 memcpy(obs_dest->tplon, obs_src->tplon, s);
3340 memcpy(obs_dest->tplat, obs_src->tplat, s);
3341 for (int id = 0; id < ctl->nd; id++)
3342 memcpy(obs_dest->rad[id], obs_src->rad[id], s);
3343 for (int id = 0; id < ctl->nd; id++)
3344 memcpy(obs_dest->tau[id], obs_src->tau[id], s);
3345
3346 /* Initialize... */
3347 if (init)
3348 for (int id = 0; id < ctl->nd; id++)
3349 for (int ir = 0; ir < obs_dest->nr; ir++)
3350 if (isfinite(obs_dest->rad[id][ir])) {
3351 obs_dest->rad[id][ir] = 0;
3352 obs_dest->tau[id][ir] = 0;
3353 }
3354}
3355
3356/*****************************************************************************/
3357
3359 int year,
3360 int mon,
3361 int day,
3362 int *doy) {
3363
3364 const int d0[12] =
3365 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3366 const int d0l[12] =
3367 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3368
3369 /* Get day of year... */
3370 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
3371 *doy = d0l[mon - 1] + day - 1;
3372 else
3373 *doy = d0[mon - 1] + day - 1;
3374}
3375
3376/*****************************************************************************/
3377
3379 int year,
3380 int doy,
3381 int *mon,
3382 int *day) {
3383
3384 const int d0[12] =
3385 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3386 const int d0l[12] =
3387 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3388 int i;
3389
3390 /* Get month and day... */
3391 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
3392 for (i = 11; i >= 0; i--)
3393 if (d0l[i] <= doy)
3394 break;
3395 *mon = i + 1;
3396 *day = doy - d0l[i] + 1;
3397 } else {
3398 for (i = 11; i >= 0; i--)
3399 if (d0[i] <= doy)
3400 break;
3401 *mon = i + 1;
3402 *day = doy - d0[i] + 1;
3403 }
3404}
3405
3406/*****************************************************************************/
3407
3409 const ctl_t *ctl,
3410 const char *emitter) {
3411
3412 for (int ig = 0; ig < ctl->ng; ig++)
3413 if (strcasecmp(ctl->emitter[ig], emitter) == 0)
3414 return ig;
3415
3416 return -1;
3417}
3418
3419/*****************************************************************************/
3420
3422 const ctl_t *ctl,
3423 const tbl_t *tbl,
3424 atm_t *atm,
3425 obs_t *obs) {
3426
3427 /* Allocate... */
3428 int *mask;
3429 ALLOC(mask, int,
3430 ND * NR);
3431
3432 /* Save observation mask... */
3433 for (int id = 0; id < ctl->nd; id++)
3434 for (int ir = 0; ir < obs->nr; ir++)
3435 mask[id * NR + ir] = !isfinite(obs->rad[id][ir]);
3436
3437 /* Hydrostatic equilibrium... */
3438 hydrostatic(ctl, atm);
3439
3440 /* CGA or EGA forward model... */
3441 if (ctl->formod == 0 || ctl->formod == 1)
3442 for (int ir = 0; ir < obs->nr; ir++)
3443 formod_pencil(ctl, tbl, atm, obs, ir);
3444
3445 /* Call RFM... */
3446 else if (ctl->formod == 2)
3447 formod_rfm(ctl, tbl, atm, obs);
3448
3449 /* Apply field-of-view convolution... */
3450 formod_fov(ctl, obs);
3451
3452 /* Convert radiance to brightness temperature... */
3453 if (ctl->write_bbt)
3454 for (int id = 0; id < ctl->nd; id++)
3455 for (int ir = 0; ir < obs->nr; ir++)
3456 obs->rad[id][ir] = BRIGHT(obs->rad[id][ir], ctl->nu[id]);
3457
3458 /* Apply observation mask... */
3459 for (int id = 0; id < ctl->nd; id++)
3460 for (int ir = 0; ir < obs->nr; ir++)
3461 if (mask[id * NR + ir])
3462 obs->rad[id][ir] = NAN;
3463
3464 /* Free... */
3465 free(mask);
3466}
3467
3468/*****************************************************************************/
3469
3471 const ctl_t *ctl,
3472 const los_t *los,
3473 const int ip,
3474 double *beta) {
3475
3476 /* Extinction... */
3477 for (int id = 0; id < ctl->nd; id++)
3478 beta[id] = los->k[ip][id];
3479
3480 /* CO2 continuum... */
3481 if (ctl->ctm_co2 && ctl->ig_co2 >= 0)
3482 for (int id = 0; id < ctl->nd; id++)
3483 beta[id] += ctmco2(ctl->nu[id], los->p[ip], los->t[ip],
3484 los->u[ip][ctl->ig_co2]) / los->ds[ip];
3485
3486 /* H2O continuum... */
3487 if (ctl->ctm_h2o && ctl->ig_h2o >= 0)
3488 for (int id = 0; id < ctl->nd; id++)
3489 beta[id] += ctmh2o(ctl->nu[id], los->p[ip], los->t[ip],
3490 los->q[ip][ctl->ig_h2o], los->u[ip][ctl->ig_h2o])
3491 / los->ds[ip];
3492
3493 /* N2 continuum... */
3494 if (ctl->ctm_n2)
3495 for (int id = 0; id < ctl->nd; id++)
3496 beta[id] += ctmn2(ctl->nu[id], los->p[ip], los->t[ip]);
3497
3498 /* O2 continuum... */
3499 if (ctl->ctm_o2)
3500 for (int id = 0; id < ctl->nd; id++)
3501 beta[id] += ctmo2(ctl->nu[id], los->p[ip], los->t[ip]);
3502}
3503
3504/*****************************************************************************/
3505
3507 const ctl_t *ctl,
3508 obs_t *obs) {
3509
3510 double rad[ND][NR], tau[ND][NR], z[NR];
3511
3512 /* Do not take into account FOV... */
3513 if (ctl->fov[0] == '-')
3514 return;
3515
3516 /* Allocate... */
3517 obs_t *obs2;
3518 ALLOC(obs2, obs_t, 1);
3519
3520 /* Copy observation data... */
3521 copy_obs(ctl, obs2, obs, 0);
3522
3523 /* Loop over ray paths... */
3524 for (int ir = 0; ir < obs->nr; ir++) {
3525
3526 /* Get radiance and transmittance profiles... */
3527 int nz = 0;
3528 for (int ir2 = MAX(ir - NFOV, 0);
3529 ir2 < MIN(ir + 1 + NFOV, obs->nr); ir2++)
3530 if (obs->time[ir2] == obs->time[ir]) {
3531 z[nz] = obs2->vpz[ir2];
3532 for (int id = 0; id < ctl->nd; id++) {
3533 rad[id][nz] = obs2->rad[id][ir2];
3534 tau[id][nz] = obs2->tau[id][ir2];
3535 }
3536 nz++;
3537 }
3538 if (nz < 2)
3539 ERRMSG("Cannot apply FOV convolution!");
3540
3541 /* Convolute profiles with FOV... */
3542 double wsum = 0;
3543 for (int id = 0; id < ctl->nd; id++) {
3544 obs->rad[id][ir] = 0;
3545 obs->tau[id][ir] = 0;
3546 }
3547 for (int i = 0; i < ctl->fov_n; i++) {
3548 const double zfov = obs->vpz[ir] + ctl->fov_dz[i];
3549 const int idx = locate_irr(z, nz, zfov);
3550 for (int id = 0; id < ctl->nd; id++) {
3551 obs->rad[id][ir] += ctl->fov_w[i]
3552 * LIN(z[idx], rad[id][idx], z[idx + 1], rad[id][idx + 1], zfov);
3553 obs->tau[id][ir] += ctl->fov_w[i]
3554 * LIN(z[idx], tau[id][idx], z[idx + 1], tau[id][idx + 1], zfov);
3555 }
3556 wsum += ctl->fov_w[i];
3557 }
3558 for (int id = 0; id < ctl->nd; id++) {
3559 obs->rad[id][ir] /= wsum;
3560 obs->tau[id][ir] /= wsum;
3561 }
3562 }
3563
3564 /* Free... */
3565 free(obs2);
3566}
3567
3568/*****************************************************************************/
3569
3571 const ctl_t *ctl,
3572 const tbl_t *tbl,
3573 const atm_t *atm,
3574 obs_t *obs,
3575 const int ir) {
3576
3577 double rad[ND], tau[ND], tau_path[ND][NG];
3578
3579 /* Allocate... */
3580 los_t *los;
3581 ALLOC(los, los_t, 1);
3582
3583 /* Initialize... */
3584 for (int id = 0; id < ctl->nd; id++) {
3585 rad[id] = 0;
3586 tau[id] = 1;
3587 for (int ig = 0; ig < ctl->ng; ig++)
3588 tau_path[id][ig] = 1;
3589 }
3590
3591 /* Raytracing... */
3592 raytrace(ctl, atm, obs, los, ir);
3593
3594 /* Loop over LOS points... */
3595 for (int ip = 0; ip < los->np; ip++) {
3596
3597 /* Get trace gas transmittance... */
3598 double tau_gas[ND];
3599 if (ctl->formod == 0)
3600 intpol_tbl_cga(ctl, tbl, los, ip, tau_path, tau_gas);
3601 else
3602 intpol_tbl_ega(ctl, tbl, los, ip, tau_path, tau_gas);
3603
3604 /* Get continuum absorption... */
3605 double beta_ctm[ND];
3606 formod_continua(ctl, los, ip, beta_ctm);
3607
3608 /* Compute Planck function... */
3609 formod_srcfunc(ctl, tbl, los->t[ip], los->src[ip]);
3610
3611 /* Loop over channels... */
3612 for (int id = 0; id < ctl->nd; id++)
3613 if (tau_gas[id] > 0) {
3614
3615 /* Get segment emissivity... */
3616 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3617
3618 /* Compute radiance... */
3619 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3620
3621 /* Compute path transmittance... */
3622 tau[id] *= (1 - los->eps[ip][id]);
3623 }
3624 }
3625
3626 /* Check whether LOS hit the ground... */
3627 if (ctl->sftype >= 1 && los->sft > 0) {
3628
3629 /* Add surface emissions... */
3630 double src_sf[ND];
3631 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3632 for (int id = 0; id < ctl->nd; id++)
3633 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3634
3635 /* Check reflectivity... */
3636 int refl = 0;
3637 if (ctl->sftype >= 2)
3638 for (int id = 0; id < ctl->nd; id++)
3639 if (los->sfeps[id] < 1) {
3640 refl = 1;
3641 break;
3642 }
3643
3644 /* Calculate reflection... */
3645 if (refl) {
3646
3647 /* Initialize... */
3648 double tau_refl[ND];
3649 for (int id = 0; id < ctl->nd; id++)
3650 tau_refl[id] = 1;
3651
3652 /* Add down-welling radiance... */
3653 for (int ip = los->np - 1; ip >= 0; ip--)
3654 for (int id = 0; id < ctl->nd; id++) {
3655 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3656 * tau[id] * (1 - los->sfeps[id]);
3657 tau_refl[id] *= (1 - los->eps[ip][id]);
3658 }
3659
3660 /* Add solar term... */
3661 if (ctl->sftype >= 3) {
3662
3663 /* Get cosine of solar zenith angle... */
3664 double cos_sza_val;
3665 if (ctl->sfsza < 0)
3666 cos_sza_val = cos_sza(obs->time[ir],
3667 los->lon[los->np - 1], los->lat[los->np - 1]);
3668 else
3669 cos_sza_val = cos(DEG2RAD(ctl->sfsza));
3670
3671 /* Check validity (avoid division by zero)... */
3672 if (cos_sza_val > 1e-6) {
3673
3674 /* Compute incidence direction cosine... */
3675 double x0[3], x1[3];
3676 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3677 los->lat[los->np - 1], x0);
3678 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3679 for (int i = 0; i < 3; i++)
3680 x1[i] -= x0[i];
3681 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3682
3683 /* Ratio of incident direction to solar zenith direction... */
3684 const double rcos = cosa / cos_sza_val;
3685
3686 /* Add solar radiance contribution... */
3687 for (int id = 0; id < ctl->nd; id++)
3688 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3689 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3690 }
3691 }
3692 }
3693 }
3694
3695 /* Copy results... */
3696 for (int id = 0; id < ctl->nd; id++) {
3697 obs->rad[id][ir] = rad[id];
3698 obs->tau[id][ir] = tau[id];
3699 }
3700
3701 /* Free... */
3702 free(los);
3703}
3704
3705/*****************************************************************************/
3706
3708 const ctl_t *ctl,
3709 const tbl_t *tbl,
3710 const atm_t *atm,
3711 obs_t *obs) {
3712
3713 los_t *los;
3714
3715 char cmd[2 * LEN], rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3716
3717 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3718 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3719
3720 int n, nadir = 0, zenith = 0;
3721
3722 /* Allocate... */
3723 ALLOC(los, los_t, 1);
3724
3725 /* Check observer positions... */
3726 for (int ir = 1; ir < obs->nr; ir++)
3727 if (obs->obsz[ir] != obs->obsz[0]
3728 || obs->obslon[ir] != obs->obslon[0]
3729 || obs->obslat[ir] != obs->obslat[0])
3730 ERRMSG("RFM interface requires identical observer positions!");
3731
3732 /* Check extinction data... */
3733 for (int iw = 0; iw < ctl->nw; iw++)
3734 for (int ip = 0; ip < atm->np; ip++)
3735 if (atm->k[iw][ip] != 0)
3736 ERRMSG("RFM interface cannot handle extinction data!");
3737
3738 /* Get altitude range of atmospheric data... */
3739 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3740
3741 /* Observer within atmosphere? */
3742 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3743 obsz = obs->obsz[0];
3744 strcat(rfmflg, " OBS");
3745 }
3746
3747 /* Determine tangent altitude or air mass factor... */
3748 for (int ir = 0; ir < obs->nr; ir++) {
3749
3750 /* Raytracing... */
3751 raytrace(ctl, atm, obs, los, ir);
3752
3753 /* Nadir or zenith? (air mass factor / secant of zenith angle) */
3754 if (obs->tpz[ir] <= zmin) {
3755
3756 /* Nadir: path intersects the surface. */
3757 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3758 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3759 for (int i = 0; i < 3; i++)
3760 xd[i] = xo[i] - xv[i];
3761 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3762 nadir++;
3763
3764 } else if (obs->tpz[ir] >= zmax - 1e-3 && obs->vpz[ir] > obs->obsz[ir]) {
3765
3766 /* Zenith: upward-looking path leaves the atmosphere at the top boundary. */
3767 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3768 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3769 for (int i = 0; i < 3; i++)
3770 xd[i] = xv[i] - xo[i];
3771 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3772 zenith++;
3773
3774 } else
3775 /* Limb: use tangent altitude. */
3776 z[ir] = obs->tpz[ir];
3777 }
3778 if ((nadir > 0 && nadir < obs->nr)
3779 || (zenith > 0 && zenith < obs->nr)
3780 || (nadir > 0 && zenith > 0))
3781 ERRMSG("Limb, nadir, and zenith not simultaneously possible!");
3782
3783 /* Viewing geometry... */
3784 if (nadir)
3785 strcat(rfmflg, " NAD");
3786 if (zenith)
3787 strcat(rfmflg, " ZEN");
3788
3789 /* Get surface temperature... */
3790 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3791
3792 /* Refraction? */
3793 if (!nadir && !zenith && !ctl->refrac)
3794 strcat(rfmflg, " GEO");
3795
3796 /* Continua? */
3797 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3798 strcat(rfmflg, " CTM");
3799
3800 /* Write atmospheric data file... */
3801 write_atm_rfm("rfm.atm", ctl, atm);
3802
3803 /* Loop over channels... */
3804 for (int id = 0; id < ctl->nd; id++) {
3805
3806 /* Get filter function from lookup table... */
3807 n = tbl->filt_n[id];
3808 if (n <= 0 || n > NSHAPE)
3809 ERRMSG("Missing or invalid filter function in lookup table!");
3810 memcpy(nu, tbl->filt_nu[id], (size_t) n * sizeof(double));
3811 memcpy(f, tbl->filt_f[id], (size_t) n * sizeof(double));
3812
3813 /* Set spectral range... */
3814 nu0 = nu[0];
3815 nu1 = nu[n - 1];
3816
3817 /* Create RFM driver file... */
3818 FILE *out;
3819 if (!(out = fopen("rfm.drv", "w")))
3820 ERRMSG("Cannot create file!");
3821 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3822 fprintf(out, "*FLG\n%s\n", rfmflg);
3823 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3824 fprintf(out, "*GAS\n");
3825 for (int ig = 0; ig < ctl->ng; ig++)
3826 fprintf(out, "%s\n", ctl->emitter[ig]);
3827 fprintf(out, "*ATM\nrfm.atm\n");
3828 fprintf(out, "*TAN\n");
3829 for (int ir = 0; ir < obs->nr; ir++)
3830 fprintf(out, "%g\n", z[ir]);
3831 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3832 if (obsz >= 0)
3833 fprintf(out, "*OBS\n%g\n", obsz);
3834 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3835 fprintf(out, "*XSC\n");
3836 for (int ig = 0; ig < ctl->ng; ig++)
3837 if (ctl->rfmxsc[ig][0] != '-')
3838 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3839 fprintf(out, "*END\n");
3840 fclose(out);
3841
3842 /* Remove temporary files... */
3843 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3844 ERRMSG("Cannot remove temporary files!");
3845
3846 /* Call RFM... */
3847 sprintf(cmd, "echo | %s", ctl->rfmbin);
3848 if (system(cmd))
3849 ERRMSG("Error while calling RFM!");
3850
3851 /* Read data... */
3852 for (int ir = 0; ir < obs->nr; ir++) {
3853 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3854 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3855 }
3856 }
3857
3858 /* Remove temporary files... */
3859 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3860 ERRMSG("Error while removing temporary files!");
3861
3862 /* Free... */
3863 free(los);
3864}
3865
3866/*****************************************************************************/
3867
3869 const ctl_t *ctl,
3870 const tbl_t *tbl,
3871 const double t,
3872 double *src) {
3873
3874 /* Determine index in temperature array... */
3875 const int it = locate_reg(tbl->st, TBLNS, t);
3876
3877 /* Interpolate Planck function value... */
3878 for (int id = 0; id < ctl->nd; id++)
3879 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3880 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3881}
3882
3883/*****************************************************************************/
3884
3886 const double z,
3887 const double lon,
3888 const double lat,
3889 double *x) {
3890
3891 const double radius = z + RE;
3892 const double latrad = lat / 180. * M_PI;
3893 const double lonrad = lon / 180. * M_PI;
3894 const double coslat = cos(latrad);
3895
3896 x[0] = radius * coslat * cos(lonrad);
3897 x[1] = radius * coslat * sin(lonrad);
3898 x[2] = radius * sin(latrad);
3899}
3900
3901/*****************************************************************************/
3902
3904 const ctl_t *ctl,
3905 atm_t *atm) {
3906
3907 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3908
3909 const int ipts = 20;
3910
3911 double dzmin = 1e99, e = 0;
3912
3913 int ipref = 0;
3914
3915 /* Check reference height... */
3916 if (ctl->hydz < 0)
3917 return;
3918
3919 /* Find air parcel next to reference height... */
3920 for (int ip = 0; ip < atm->np; ip++)
3921 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3922 dzmin = fabs(atm->z[ip] - ctl->hydz);
3923 ipref = ip;
3924 }
3925
3926 /* Upper part of profile... */
3927 for (int ip = ipref + 1; ip < atm->np; ip++) {
3928 double mean = 0;
3929 for (int i = 0; i < ipts; i++) {
3930 if (ctl->ig_h2o >= 0)
3931 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3932 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3933 mean += (e * mmh2o + (1 - e) * mmair)
3934 * G0 / RI
3935 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3936 }
3937
3938 /* Compute p(z,T)... */
3939 atm->p[ip] =
3940 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3941 }
3942
3943 /* Lower part of profile... */
3944 for (int ip = ipref - 1; ip >= 0; ip--) {
3945 double mean = 0;
3946 for (int i = 0; i < ipts; i++) {
3947 if (ctl->ig_h2o >= 0)
3948 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3949 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3950 mean += (e * mmh2o + (1 - e) * mmair)
3951 * G0 / RI
3952 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3953 }
3954
3955 /* Compute p(z,T)... */
3956 atm->p[ip] =
3957 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3958 }
3959}
3960
3961/*****************************************************************************/
3962
3964 const ctl_t *ctl,
3965 const int idx,
3966 char *quantity) {
3967
3968 if (idx == IDXP)
3969 sprintf(quantity, "PRESSURE");
3970
3971 if (idx == IDXT)
3972 sprintf(quantity, "TEMPERATURE");
3973
3974 for (int ig = 0; ig < ctl->ng; ig++)
3975 if (idx == IDXQ(ig))
3976 sprintf(quantity, "%s", ctl->emitter[ig]);
3977
3978 for (int iw = 0; iw < ctl->nw; iw++)
3979 if (idx == IDXK(iw))
3980 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3981
3982 if (idx == IDXCLZ)
3983 sprintf(quantity, "CLOUD_HEIGHT");
3984
3985 if (idx == IDXCLDZ)
3986 sprintf(quantity, "CLOUD_DEPTH");
3987
3988 for (int icl = 0; icl < ctl->ncl; icl++)
3989 if (idx == IDXCLK(icl))
3990 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3991
3992 if (idx == IDXSFT)
3993 sprintf(quantity, "SURFACE_TEMPERATURE");
3994
3995 for (int isf = 0; isf < ctl->nsf; isf++)
3996 if (idx == IDXSFEPS(isf))
3997 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3998}
3999
4000/*****************************************************************************/
4001
4003 const ctl_t *ctl,
4004 tbl_t *tbl) {
4005
4006 /* Write info... */
4007 LOG(1, "Initialize source function table...");
4008 LOG(2, "Number of data points: %d", TBLNS);
4009
4010 /* Loop over channels... */
4011 for (int id = 0; id < ctl->nd; id++) {
4012
4013 /* Get minimum grid spacing... */
4014 double dnu = 1.0;
4015 for (int i = 1; i < tbl->filt_n[id]; i++)
4016 dnu = MIN(dnu, tbl->filt_nu[id][i] - tbl->filt_nu[id][i - 1]);
4017
4018 /* Compute source function table... */
4019#pragma omp parallel for default(none) shared(ctl,tbl,id,dnu)
4020 for (int it = 0; it < TBLNS; it++) {
4021
4022 /* Set temperature... */
4023 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
4024
4025 /* Integrate Planck function... */
4026 double fsum = tbl->sr[it][id] = 0;
4027 for (double fnu = tbl->filt_nu[id][0];
4028 fnu <= tbl->filt_nu[id][tbl->filt_n[id] - 1]; fnu += dnu) {
4029 const int i = locate_irr(tbl->filt_nu[id], tbl->filt_n[id], fnu);
4030 const double ff = LIN(tbl->filt_nu[id][i], tbl->filt_f[id][i],
4031 tbl->filt_nu[id][i + 1], tbl->filt_f[id][i + 1],
4032 fnu);
4033 fsum += ff;
4034 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
4035 }
4036 tbl->sr[it][id] /= fsum;
4037 }
4038
4039 /* Write info... */
4040 LOG(2,
4041 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
4042 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
4043 tbl->sr[TBLNS - 1][id]);
4044 }
4045}
4046
4047/*****************************************************************************/
4048
4050 const ctl_t *ctl,
4051 const atm_t *atm,
4052 const double z,
4053 double *p,
4054 double *t,
4055 double *q,
4056 double *k) {
4057
4058 /* Get array index... */
4059 const int ip = locate_irr(atm->z, atm->np, z);
4060
4061 /* Interpolate... */
4062 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
4063 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
4064 for (int ig = 0; ig < ctl->ng; ig++)
4065 q[ig] =
4066 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
4067 for (int iw = 0; iw < ctl->nw; iw++)
4068 k[iw] =
4069 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
4070}
4071
4072/*****************************************************************************/
4073
4075 const ctl_t *ctl,
4076 const tbl_t *tbl,
4077 const los_t *los,
4078 const int ip,
4079 double tau_path[ND][NG],
4080 double tau_seg[ND]) {
4081
4082 double eps, lnp[NG];
4083
4084 /* Precompute log-pressure... */
4085 for (int ig = 0; ig < ctl->ng; ig++)
4086 lnp[ig] = log(los->cgp[ip][ig]);
4087
4088 /* Loop over channels... */
4089 for (int id = 0; id < ctl->nd; id++) {
4090
4091 /* Initialize... */
4092 tau_seg[id] = 1;
4093
4094 /* Loop over emitters.... */
4095 for (int ig = 0; ig < ctl->ng; ig++) {
4096
4097 /* Check size of table (pressure) and column density... */
4098 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4099 eps = 0;
4100
4101 /* Check transmittance... */
4102 else if (tau_path[id][ig] < 1e-9)
4103 eps = 1;
4104
4105 /* Interpolate... */
4106 else {
4107
4108 /* Determine pressure and temperature indices... */
4109 const int ipr =
4110 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
4111 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
4112 los->cgt[ip][ig]);
4113 const int it1 =
4114 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4115 los->cgt[ip][ig]);
4116
4117 /* Check size of table (temperature and column density)... */
4118 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4119 || tbl->nu[id][ig][ipr][it0] < 2
4120 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4121 || tbl->nu[id][ig][ipr + 1][it1] < 2
4122 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4123 eps = 0;
4124
4125 else {
4126
4127 /* Get emissivities of extended path... */
4128 const double logu = log(los->cgu[ip][ig]);
4129 double eps00 = intpol_tbl_eps(tbl, ig, id, ipr, it0, logu);
4130 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, logu);
4131 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, logu);
4132 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, logu);
4133
4134 /* Interpolate with respect to temperature... */
4135 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4136 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4137 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4138 tbl->t[id][ig][ipr + 1][it1 + 1],
4139 eps11, los->cgt[ip][ig]);
4140
4141 /* Interpolate with respect to log-pressure... */
4142 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4143 tbl->lnp[id][ig][ipr + 1], eps11, lnp[ig]);
4144
4145 /* Check emissivity range... */
4146 eps00 = CLAMP(eps00, 0, 1);
4147
4148 /* Determine segment emissivity... */
4149 eps = 1 - (1 - eps00) / tau_path[id][ig];
4150 }
4151 }
4152
4153 /* Get transmittance of extended path... */
4154 tau_path[id][ig] *= (1 - eps);
4155
4156 /* Get segment transmittance... */
4157 tau_seg[id] *= (1 - eps);
4158 }
4159 }
4160}
4161
4162/*****************************************************************************/
4163
4165 const ctl_t *ctl,
4166 const tbl_t *tbl,
4167 const los_t *los,
4168 const int ip,
4169 double tau_path[ND][NG],
4170 double tau_seg[ND]) {
4171
4172 const double lnp = log(los->p[ip]);
4173
4174 double eps, u;
4175
4176 /* Loop over channels... */
4177 for (int id = 0; id < ctl->nd; id++) {
4178
4179 /* Initialize... */
4180 tau_seg[id] = 1;
4181
4182 /* Loop over emitters.... */
4183 for (int ig = 0; ig < ctl->ng; ig++) {
4184
4185 /* Check size of table (pressure) and column density... */
4186 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4187 eps = 0;
4188
4189 /* Check transmittance... */
4190 else if (tau_path[id][ig] < 1e-9)
4191 eps = 1;
4192
4193 /* Interpolate... */
4194 else {
4195
4196 /* Determine pressure and temperature indices... */
4197 const int ipr =
4198 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4199 const int it0 =
4200 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4201 const int it1 =
4202 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4203 los->t[ip]);
4204
4205 /* Check size of table (temperature and column density)... */
4206 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4207 || tbl->nu[id][ig][ipr][it0] < 2
4208 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4209 || tbl->nu[id][ig][ipr + 1][it1] < 2
4210 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4211 eps = 0;
4212
4213 else {
4214
4215 /* Get emissivities of extended path... */
4216 const double logeps = log(1.0 - tau_path[id][ig]);
4217
4218 u = intpol_tbl_u(tbl, ig, id, ipr, it0, logeps);
4219 double eps00
4220 = intpol_tbl_eps(tbl, ig, id, ipr, it0, log(u + los->u[ip][ig]));
4221
4222 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, logeps);
4223 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1,
4224 log(u + los->u[ip][ig]));
4225
4226 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, logeps);
4227 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1,
4228 log(u + los->u[ip][ig]));
4229
4230 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, logeps);
4231 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1,
4232 log(u + los->u[ip][ig]));
4233
4234 /* Interpolate with respect to temperature... */
4235 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4236 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4237 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4238 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4239
4240 /* Interpolate with respect to log-pressure... */
4241 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4242 tbl->lnp[id][ig][ipr + 1], eps11, lnp);
4243
4244 /* Check emissivity range... */
4245 eps00 = CLAMP(eps00, 0, 1);
4246
4247 /* Determine segment emissivity... */
4248 eps = 1 - (1 - eps00) / tau_path[id][ig];
4249 }
4250 }
4251
4252 /* Get transmittance of extended path... */
4253 tau_path[id][ig] *= (1 - eps);
4254
4255 /* Get segment transmittance... */
4256 tau_seg[id] *= (1 - eps);
4257 }
4258 }
4259}
4260
4261/*****************************************************************************/
4262
4263inline double intpol_tbl_eps(
4264 const tbl_t *tbl,
4265 const int ig,
4266 const int id,
4267 const int ip,
4268 const int it,
4269 const double logu) {
4270
4271 const int nu = tbl->nu[id][ig][ip][it];
4272 const float *logu_arr = tbl->logu[id][ig][ip][it];
4273 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4274
4275 /* Work in log-space and only convert back when needed... */
4276 const double logu_min = (double) logu_arr[0];
4277 const double logu_max = (double) logu_arr[nu - 1];
4278
4279 /* Lower boundary extrapolation (u < u_min)...
4280 eps ~ eps_min * u/u_min => log(eps) = logeps_min + log(u) - log(u_min) */
4281 if (logu < logu_min) {
4282 const double logeps_min = (double) logeps_arr[0];
4283 return exp(logeps_min + logu - logu_min);
4284 }
4285
4286 /* Upper boundary extrapolation (u > u_max)...
4287 * Assume eps(u) approaches 1 exponentially:
4288 * eps(u) = 1 - exp(a * u), a < 0
4289 * Continuity at (u_max, eps_max) gives
4290 * a = log(1 - eps_max) / u_max.
4291 * Use log1p/expm1 and u/u_max = exp(log(u) - log(u_max)) for stability.
4292 */
4293 if (logu > logu_max) {
4294 const double eps_max = exp((double) logeps_arr[nu - 1]);
4295 const double l1m_eps_max = log1p(-eps_max);
4296 const double r = exp(logu - logu_max);
4297 return -expm1(l1m_eps_max * r);
4298 }
4299
4300 /* Interpolation (log-log using precomputed logs)... */
4301 const int idx = locate_tbl(logu_arr, nu, logu);
4302 return exp(LIN(logu_arr[idx], logeps_arr[idx],
4303 logu_arr[idx + 1], logeps_arr[idx + 1], logu));
4304}
4305
4306/*****************************************************************************/
4307
4308inline double intpol_tbl_u(
4309 const tbl_t *tbl,
4310 const int ig,
4311 const int id,
4312 const int ip,
4313 const int it,
4314 const double logeps) {
4315
4316 const int nu = tbl->nu[id][ig][ip][it];
4317 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4318 const float *logu_arr = tbl->logu[id][ig][ip][it];
4319
4320 /* Work in log-space and only convert back when needed.... */
4321 const double logeps_min = (double) logeps_arr[0];
4322 const double logeps_max = (double) logeps_arr[nu - 1];
4323
4324 /* Lower boundary extrapolation (eps < eps_min)...
4325 u ~ u_min * eps/eps_min => log(u) = log(u_min) + log(eps) - log(eps_min) */
4326 if (logeps < logeps_min) {
4327 const double logu_min = (double) logu_arr[0];
4328 return exp(logu_min + logeps - logeps_min);
4329 }
4330
4331 /* Upper boundary extrapolation (eps > eps_max):
4332 * Invert the exponential tail used for eps(u):
4333 * u = log(1 - eps) / a,
4334 * with a = log(1 - eps_max) / u_max.
4335 * Rewritten as
4336 * u = u_max * log(tau) / log(1 - eps_max)
4337 * for numerical stability (log1p).
4338 */
4339 if (logeps > logeps_max) {
4340 const double u_max = exp((double) logu_arr[nu - 1]);
4341 const double l1m_eps_max = log1p(-exp(logeps_max));
4342 const double logtau = log1p(-exp(logeps));
4343 return u_max * (logtau / l1m_eps_max);
4344 }
4345
4346 /* Interpolation (log-log using precomputed logs)... */
4347 const int idx = locate_tbl(logeps_arr, nu, logeps);
4348 return exp(LIN(logeps_arr[idx], logu_arr[idx],
4349 logeps_arr[idx + 1], logu_arr[idx + 1], logeps));
4350}
4351
4352/*****************************************************************************/
4353
4355 const double jsec,
4356 int *year,
4357 int *mon,
4358 int *day,
4359 int *hour,
4360 int *min,
4361 int *sec,
4362 double *remain) {
4363
4364 struct tm t0, *t1;
4365
4366 t0.tm_year = 100;
4367 t0.tm_mon = 0;
4368 t0.tm_mday = 1;
4369 t0.tm_hour = 0;
4370 t0.tm_min = 0;
4371 t0.tm_sec = 0;
4372
4373 const time_t jsec0 = (time_t) jsec + timegm(&t0);
4374 t1 = gmtime(&jsec0);
4375
4376 *year = t1->tm_year + 1900;
4377 *mon = t1->tm_mon + 1;
4378 *day = t1->tm_mday;
4379 *hour = t1->tm_hour;
4380 *min = t1->tm_min;
4381 *sec = t1->tm_sec;
4382 *remain = jsec - floor(jsec);
4383}
4384
4385/*****************************************************************************/
4386
4388 const ctl_t *ctl,
4389 const tbl_t *tbl,
4390 atm_t *atm,
4391 obs_t *obs,
4392 gsl_matrix *k) {
4393
4394 /* Get sizes... */
4395 const size_t m = k->size1;
4396 const size_t n = k->size2;
4397
4398 /* Allocate... */
4399 gsl_vector *x0 = gsl_vector_alloc(n);
4400 gsl_vector *yy0 = gsl_vector_alloc(m);
4401 int *iqa;
4402 ALLOC(iqa, int,
4403 N);
4404
4405 /* Compute radiance for undisturbed atmospheric data... */
4406 formod(ctl, tbl, atm, obs);
4407
4408 /* Compose vectors... */
4409 atm2x(ctl, atm, x0, iqa, NULL);
4410 obs2y(ctl, obs, yy0, NULL, NULL);
4411
4412 /* Initialize kernel matrix... */
4413 gsl_matrix_set_zero(k);
4414
4415 /* Loop over state vector elements... */
4416#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4417 for (size_t j = 0; j < n; j++) {
4418
4419 /* Allocate... */
4420 atm_t *atm1;
4421 obs_t *obs1;
4422 ALLOC(atm1, atm_t, 1);
4423 ALLOC(obs1, obs_t, 1);
4424 gsl_vector *x1 = gsl_vector_alloc(n);
4425 gsl_vector *yy1 = gsl_vector_alloc(m);
4426
4427 /* Set perturbation size... */
4428 double h;
4429 if (iqa[j] == IDXP)
4430 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4431 else if (iqa[j] == IDXT)
4432 h = 1.0;
4433 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4434 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4435 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4436 h = 1e-4;
4437 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4438 h = 1.0;
4439 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4440 h = 1e-4;
4441 else if (iqa[j] == IDXSFT)
4442 h = 1.0;
4443 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4444 h = 1e-2;
4445 else
4446 ERRMSG("Cannot set perturbation size!");
4447
4448 /* Disturb state vector element... */
4449 gsl_vector_memcpy(x1, x0);
4450 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4451 copy_atm(ctl, atm1, atm, 0);
4452 copy_obs(ctl, obs1, obs, 0);
4453 x2atm(ctl, x1, atm1);
4454
4455 /* Compute radiance for disturbed atmospheric data... */
4456 formod(ctl, tbl, atm1, obs1);
4457
4458 /* Compose measurement vector for disturbed radiance data... */
4459 obs2y(ctl, obs1, yy1, NULL, NULL);
4460
4461 /* Compute derivatives... */
4462 for (size_t i = 0; i < m; i++)
4463 gsl_matrix_set(k, i, j,
4464 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4465
4466 /* Free... */
4467 gsl_vector_free(x1);
4468 gsl_vector_free(yy1);
4469 free(atm1);
4470 free(obs1);
4471 }
4472
4473 /* Free... */
4474 gsl_vector_free(x0);
4475 gsl_vector_free(yy0);
4476 free(iqa);
4477}
4478
4479/*****************************************************************************/
4480
4482 const double *xx,
4483 const int n,
4484 const double x) {
4485
4486 int ilo = 0;
4487 int ihi = n - 1;
4488 int i = (ihi + ilo) >> 1;
4489
4490 if (xx[i] < xx[i + 1])
4491 while (ihi > ilo + 1) {
4492 i = (ihi + ilo) >> 1;
4493 if (xx[i] > x)
4494 ihi = i;
4495 else
4496 ilo = i;
4497 } else
4498 while (ihi > ilo + 1) {
4499 i = (ihi + ilo) >> 1;
4500 if (xx[i] <= x)
4501 ihi = i;
4502 else
4503 ilo = i;
4504 }
4505
4506 return ilo;
4507}
4508
4509/*****************************************************************************/
4510
4512 const double *xx,
4513 const int n,
4514 const double x) {
4515
4516 /* Calculate index... */
4517 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4518
4519 /* Check range... */
4520 if (i < 0)
4521 return 0;
4522 else if (i > n - 2)
4523 return n - 2;
4524 else
4525 return i;
4526}
4527
4528/*****************************************************************************/
4529
4530inline int locate_tbl(
4531 const float *xx,
4532 const int n,
4533 const double x) {
4534
4535 int ilo = 0;
4536 int ihi = n - 1;
4537 int i = (ihi + ilo) >> 1;
4538
4539 while (ihi > ilo + 1) {
4540 i = (ihi + ilo) >> 1;
4541 if (xx[i] > x)
4542 ihi = i;
4543 else
4544 ilo = i;
4545 }
4546
4547 return ilo;
4548}
4549
4550/*****************************************************************************/
4551
4553 gsl_matrix *a) {
4554
4555 size_t diag = 1;
4556
4557 /* Get size... */
4558 const size_t n = a->size1;
4559
4560 /* Check if matrix is diagonal... */
4561 for (size_t i = 0; i < n && diag; i++)
4562 for (size_t j = i + 1; j < n; j++)
4563 if (gsl_matrix_get(a, i, j) != 0) {
4564 diag = 0;
4565 break;
4566 }
4567
4568 /* Quick inversion of diagonal matrix... */
4569 if (diag)
4570 for (size_t i = 0; i < n; i++)
4571 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4572
4573 /* Matrix inversion by means of Cholesky decomposition... */
4574 else {
4575 gsl_linalg_cholesky_decomp(a);
4576 gsl_linalg_cholesky_invert(a);
4577 }
4578}
4579
4580/*****************************************************************************/
4581
4583 const gsl_matrix *a,
4584 const gsl_vector *b,
4585 const int transpose,
4586 gsl_matrix *c) {
4587
4588 /* Set sizes... */
4589 const size_t m = a->size1;
4590 const size_t n = a->size2;
4591
4592 /* Allocate... */
4593 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4594
4595 /* Compute A^T B A... */
4596 if (transpose == 1) {
4597
4598 /* Compute B^1/2 A... */
4599 for (size_t i = 0; i < m; i++)
4600 for (size_t j = 0; j < n; j++)
4601 gsl_matrix_set(aux, i, j,
4602 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4603
4604 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4605 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4606 }
4607
4608 /* Compute A B A^T... */
4609 else if (transpose == 2) {
4610
4611 /* Compute A B^1/2... */
4612 for (size_t i = 0; i < m; i++)
4613 for (size_t j = 0; j < n; j++)
4614 gsl_matrix_set(aux, i, j,
4615 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4616
4617 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4618 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4619 }
4620
4621 /* Free... */
4622 gsl_matrix_free(aux);
4623}
4624
4625/*****************************************************************************/
4626
4627size_t obs2y(
4628 const ctl_t *ctl,
4629 const obs_t *obs,
4630 gsl_vector *y,
4631 int *ida,
4632 int *ira) {
4633
4634 size_t m = 0;
4635
4636 /* Determine measurement vector... */
4637 for (int ir = 0; ir < obs->nr; ir++)
4638 for (int id = 0; id < ctl->nd; id++)
4639 if (isfinite(obs->rad[id][ir])) {
4640 if (y != NULL)
4641 gsl_vector_set(y, m, obs->rad[id][ir]);
4642 if (ida != NULL)
4643 ida[m] = id;
4644 if (ira != NULL)
4645 ira[m] = ir;
4646 m++;
4647 }
4648
4649 return m;
4650}
4651
4652/*****************************************************************************/
4653
4655 ret_t *ret,
4656 ctl_t *ctl,
4657 tbl_t *tbl,
4658 obs_t *obs_meas,
4659 obs_t *obs_i,
4660 atm_t *atm_apr,
4661 atm_t *atm_i,
4662 double *chisq) {
4663
4664 double disq = 0, lmpar = 0.001;
4665
4666 /* ------------------------------------------------------------
4667 Initialize...
4668 ------------------------------------------------------------ */
4669
4670 /* Allocate... */
4671 int *ipa, *iqa;
4672 ALLOC(ipa, int,
4673 N);
4674 ALLOC(iqa, int,
4675 N);
4676
4677 /* Get sizes... */
4678 const size_t m = obs2y(ctl, obs_meas, NULL, NULL, NULL);
4679 const size_t n = atm2x(ctl, atm_apr, NULL, iqa, ipa);
4680 if (m == 0 || n == 0) {
4681 WARN("Check problem definition (m = 0 or n = 0)!");
4682 *chisq = GSL_NAN;
4683 return;
4684 }
4685
4686 /* Allocate... */
4687 gsl_matrix *a = gsl_matrix_alloc(n, n);
4688 gsl_matrix *cov = gsl_matrix_alloc(n, n);
4689 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
4690 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
4691
4692 gsl_vector *b = gsl_vector_alloc(n);
4693 gsl_vector *dx = gsl_vector_alloc(n);
4694 gsl_vector *dy = gsl_vector_alloc(m);
4695 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
4696 gsl_vector *sig_formod = gsl_vector_alloc(m);
4697 gsl_vector *sig_noise = gsl_vector_alloc(m);
4698 gsl_vector *x_a = gsl_vector_alloc(n);
4699 gsl_vector *x_i = gsl_vector_alloc(n);
4700 gsl_vector *x_step = gsl_vector_alloc(n);
4701 gsl_vector *y_aux = gsl_vector_alloc(m);
4702 gsl_vector *y_i = gsl_vector_alloc(m);
4703 gsl_vector *y_m = gsl_vector_alloc(m);
4704
4705 /* Set timer... */
4706 SELECT_TIMER("RET_SETUP", "RETRIEVAL");
4707
4708 /* Set initial state... */
4709 copy_atm(ctl, atm_i, atm_apr, 0);
4710 copy_obs(ctl, obs_i, obs_meas, 0);
4711 formod(ctl, tbl, atm_i, obs_i);
4712
4713 /* Set state vectors and observation vectors... */
4714 atm2x(ctl, atm_apr, x_a, NULL, NULL);
4715 atm2x(ctl, atm_i, x_i, NULL, NULL);
4716 obs2y(ctl, obs_meas, y_m, NULL, NULL);
4717 obs2y(ctl, obs_i, y_i, NULL, NULL);
4718
4719 /* Set inverse a priori covariance S_a^-1... */
4720 set_cov_apr(ret, ctl, atm_apr, iqa, ipa, s_a_inv);
4721 int lockfd = shared_io_lock(ret);
4722 const char *dirname;
4723 int profile;
4724 const char *filename =
4726 "matrix_cov_apr.tab", &dirname, &profile);
4727 write_matrix(dirname, filename, ctl, s_a_inv,
4728 atm_i, obs_i, "x", "x", "r", profile);
4729 shared_io_unlock(lockfd);
4730 matrix_invert(s_a_inv);
4731
4732 /* Get measurement errors... */
4733 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
4734
4735 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4736 gsl_vector_memcpy(dx, x_i);
4737 gsl_vector_sub(dx, x_a);
4738 gsl_vector_memcpy(dy, y_m);
4739 gsl_vector_sub(dy, y_i);
4740
4741 /* Compute cost function... */
4742 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4743
4744 /* Write info... */
4745 LOG(2, "it= %d / chi^2/m= %g", 0, *chisq);
4746
4747 /* Compute initial kernel... */
4748 SELECT_TIMER("RET_KERNEL_INIT", "RETRIEVAL");
4749 kernel(ctl, tbl, atm_i, obs_i, k_i);
4750
4751 /* ------------------------------------------------------------
4752 Levenberg-Marquardt minimization...
4753 ------------------------------------------------------------ */
4754
4755 SELECT_TIMER("RET_ITERATE", "RETRIEVAL");
4756
4757 /* Outer loop... */
4758 for (int it = 1; it <= ret->conv_itmax; it++) {
4759
4760 /* Store current cost function value... */
4761 double chisq_old = *chisq;
4762
4763 /* Compute kernel matrix K_i... */
4764 if (it > 1 && it % ret->kernel_recomp == 0)
4765 kernel(ctl, tbl, atm_i, obs_i, k_i);
4766
4767 /* Compute K_i^T * S_eps^{-1} * K_i ... */
4768 if (it == 1 || it % ret->kernel_recomp == 0)
4769 matrix_product(k_i, sig_eps_inv, 1, cov);
4770
4771 /* Determine b = K_i^T * S_eps^{-1} * dy - S_a^{-1} * dx ... */
4772 for (size_t i = 0; i < m; i++)
4773 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
4774 * POW2(gsl_vector_get(sig_eps_inv, i)));
4775 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
4776 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
4777
4778 /* Inner loop... */
4779 for (int it2 = 0; it2 < 20; it2++) {
4780
4781 /* Compute A = (1 + lmpar) * S_a^{-1} + K_i^T * S_eps^{-1} * K_i ... */
4782 gsl_matrix_memcpy(a, s_a_inv);
4783 gsl_matrix_scale(a, 1 + lmpar);
4784 gsl_matrix_add(a, cov);
4785
4786 /* Solve A * x_step = b by means of Cholesky decomposition... */
4787 gsl_linalg_cholesky_decomp(a);
4788 gsl_linalg_cholesky_solve(a, b, x_step);
4789
4790 /* Update atmospheric state... */
4791 gsl_vector_add(x_i, x_step);
4792 copy_atm(ctl, atm_i, atm_apr, 0);
4793 copy_obs(ctl, obs_i, obs_meas, 0);
4794 x2atm(ctl, x_i, atm_i);
4795
4796 /* Check atmospheric state... */
4797 for (int ip = 0; ip < atm_i->np; ip++) {
4798 atm_i->p[ip] = CLAMP(atm_i->p[ip], 5e-7, 5e4);
4799 atm_i->t[ip] = CLAMP(atm_i->t[ip], 100, 400);
4800 for (int ig = 0; ig < ctl->ng; ig++)
4801 atm_i->q[ig][ip] = CLAMP(atm_i->q[ig][ip], 0, 1);
4802 for (int iw = 0; iw < ctl->nw; iw++)
4803 atm_i->k[iw][ip] = MAX(atm_i->k[iw][ip], 0);
4804 }
4805 atm_i->clz = MAX(atm_i->clz, 0);
4806 atm_i->cldz = MAX(atm_i->cldz, 0.1);
4807 for (int icl = 0; icl < ctl->ncl; icl++)
4808 atm_i->clk[icl] = MAX(atm_i->clk[icl], 0);
4809 atm_i->sft = CLAMP(atm_i->sft, 100, 400);
4810 for (int isf = 0; isf < ctl->nsf; isf++)
4811 atm_i->sfeps[isf] = CLAMP(atm_i->sfeps[isf], 0, 1);
4812
4813 /* Forward calculation... */
4814 formod(ctl, tbl, atm_i, obs_i);
4815 obs2y(ctl, obs_i, y_i, NULL, NULL);
4816
4817 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4818 gsl_vector_memcpy(dx, x_i);
4819 gsl_vector_sub(dx, x_a);
4820 gsl_vector_memcpy(dy, y_m);
4821 gsl_vector_sub(dy, y_i);
4822
4823 /* Compute cost function... */
4824 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4825
4826 /* Modify Levenberg-Marquardt parameter... */
4827 if (*chisq > chisq_old) {
4828 lmpar *= 10;
4829 gsl_vector_sub(x_i, x_step);
4830 } else {
4831 lmpar /= 10;
4832 break;
4833 }
4834 }
4835
4836 /* Write info... */
4837 LOG(2, "it= %d / chi^2/m= %g", it, *chisq);
4838
4839 /* Get normalized step size in state space... */
4840 gsl_blas_ddot(x_step, b, &disq);
4841 disq /= (double) n;
4842
4843 /* Convergence test... */
4844 if ((it == 1 || it % ret->kernel_recomp == 0) && disq < ret->conv_dmin)
4845 break;
4846 }
4847
4848 /* ------------------------------------------------------------
4849 Analysis of retrieval results...
4850 ------------------------------------------------------------ */
4851
4852 /* Check if error analysis is requested... */
4853 if (ret->err_ana) {
4854
4855 SELECT_TIMER("RET_DIAGNOSTICS", "OUTPUT");
4856
4857 /* Store results... */
4858 lockfd = shared_io_lock(ret);
4860 "atm_final.tab", &dirname, &profile);
4861 write_atm(dirname, filename, ctl, atm_i, profile);
4863 "obs_final.tab", &dirname, &profile);
4864 write_obs(dirname, filename, ctl, obs_i, profile);
4865 filename =
4867 "matrix_kernel.tab", &dirname, &profile);
4868 write_matrix(dirname, filename, ctl, k_i,
4869 atm_i, obs_i, "y", "x", "r", profile);
4870
4871 /* Allocate... */
4872 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
4873 gsl_matrix *corr = gsl_matrix_alloc(n, n);
4874 gsl_matrix *gain = gsl_matrix_alloc(n, m);
4875
4876 /* Compute inverse retrieval covariance...
4877 cov^{-1} = S_a^{-1} + K_i^T * S_eps^{-1} * K_i */
4878 matrix_product(k_i, sig_eps_inv, 1, cov);
4879 gsl_matrix_add(cov, s_a_inv);
4880
4881 /* Compute retrieval covariance... */
4882 matrix_invert(cov);
4883 filename =
4885 "matrix_cov_ret.tab", &dirname, &profile);
4886 write_matrix(dirname, filename, ctl, cov,
4887 atm_i, obs_i, "x", "x", "r", profile);
4888 write_stddev("total", ret, ctl, atm_i, cov);
4889
4890 /* Compute correlation matrix... */
4891 for (size_t i = 0; i < n; i++)
4892 for (size_t j = 0; j < n; j++)
4893 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
4894 / sqrt(gsl_matrix_get(cov, i, i))
4895 / sqrt(gsl_matrix_get(cov, j, j)));
4897 "matrix_corr.tab", &dirname, &profile);
4898 write_matrix(dirname, filename, ctl, corr,
4899 atm_i, obs_i, "x", "x", "r", profile);
4900
4901 /* Compute gain matrix...
4902 G = cov * K^T * S_eps^{-1} */
4903 for (size_t i = 0; i < n; i++)
4904 for (size_t j = 0; j < m; j++)
4905 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
4906 * POW2(gsl_vector_get(sig_eps_inv, j)));
4907 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
4909 "matrix_gain.tab", &dirname, &profile);
4910 write_matrix(dirname, filename, ctl, gain,
4911 atm_i, obs_i, "x", "y", "c", profile);
4912
4913 /* Compute retrieval error due to noise... */
4914 matrix_product(gain, sig_noise, 2, a);
4915 write_stddev("noise", ret, ctl, atm_i, a);
4916
4917 /* Compute retrieval error due to forward model errors... */
4918 matrix_product(gain, sig_formod, 2, a);
4919 write_stddev("formod", ret, ctl, atm_i, a);
4920
4921 /* Compute averaging kernel matrix
4922 A = G * K ... */
4923 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
4925 "matrix_avk.tab", &dirname, &profile);
4926 write_matrix(dirname, filename, ctl, a,
4927 atm_i, obs_i, "x", "x", "r", profile);
4928
4929 /* Analyze averaging kernel matrix... */
4930 analyze_avk(ret, ctl, atm_i, iqa, ipa, a);
4931 shared_io_unlock(lockfd);
4932
4933 /* Free... */
4934 gsl_matrix_free(auxnm);
4935 gsl_matrix_free(corr);
4936 gsl_matrix_free(gain);
4937 }
4938
4939 /* ------------------------------------------------------------
4940 Finalize...
4941 ------------------------------------------------------------ */
4942
4943 gsl_matrix_free(a);
4944 gsl_matrix_free(cov);
4945 gsl_matrix_free(k_i);
4946 gsl_matrix_free(s_a_inv);
4947
4948 gsl_vector_free(b);
4949 gsl_vector_free(dx);
4950 gsl_vector_free(dy);
4951 gsl_vector_free(sig_eps_inv);
4952 gsl_vector_free(sig_formod);
4953 gsl_vector_free(sig_noise);
4954 gsl_vector_free(x_a);
4955 gsl_vector_free(x_i);
4956 gsl_vector_free(x_step);
4957 gsl_vector_free(y_aux);
4958 gsl_vector_free(y_i);
4959 gsl_vector_free(y_m);
4960
4961 free(ipa);
4962 free(iqa);
4963}
4964
4966 const ctl_t *ctl,
4967 const atm_t *atm,
4968 obs_t *obs,
4969 los_t *los,
4970 const int ir) {
4971
4972 const double h = 0.02, zrefrac = 60;
4973
4974 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4975 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4976
4977 int stop = 0;
4978
4979 /* Initialize... */
4980 los->np = 0;
4981 los->sft = -999;
4982 obs->tpz[ir] = obs->vpz[ir];
4983 obs->tplon[ir] = obs->vplon[ir];
4984 obs->tplat[ir] = obs->vplat[ir];
4985
4986 /* Get altitude range of atmospheric data... */
4987 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4988
4989 /* Check observer altitude... */
4990 if (obs->obsz[ir] < zmin)
4991 ERRMSG("Observer below surface!");
4992
4993 /* Determine Cartesian coordinates for observer and view point... */
4994 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
4995 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
4996
4997 /* Determine initial tangent vector... */
4998 for (int i = 0; i < 3; i++)
4999 ex0[i] = xvp[i] - xobs[i];
5000 norm = NORM(ex0);
5001 for (int i = 0; i < 3; i++)
5002 ex0[i] /= norm;
5003
5004 /* Observer within atmosphere... */
5005 for (int i = 0; i < 3; i++)
5006 x[i] = xobs[i];
5007
5008 /* Observer above atmosphere (search entry point)... */
5009 if (obs->obsz[ir] > zmax) {
5010 double dmax = norm, dmin = 0;
5011 while (fabs(dmin - dmax) > 0.001) {
5012 const double d = (dmax + dmin) / 2;
5013 for (int i = 0; i < 3; i++)
5014 x[i] = xobs[i] + d * ex0[i];
5015 cart2geo(x, &z, &lon, &lat);
5016 if (z <= zmax && z > zmax - 0.001)
5017 break;
5018 if (z < zmax - 0.0005)
5019 dmax = d;
5020 else
5021 dmin = d;
5022 }
5023 }
5024
5025 /* Ray-tracing... */
5026 while (1) {
5027
5028 /* Set step length... */
5029 double ds = ctl->rayds;
5030 if (ctl->raydz > 0) {
5031 norm = NORM(x);
5032 for (int i = 0; i < 3; i++)
5033 xh[i] = x[i] / norm;
5034 const double cosa = fabs(DOTP(ex0, xh));
5035 if (cosa != 0)
5036 ds = MIN(ctl->rayds, ctl->raydz / cosa);
5037 }
5038
5039 /* Determine geolocation... */
5040 cart2geo(x, &z, &lon, &lat);
5041
5042 /* Check if LOS hits the ground or has left atmosphere... */
5043 if (z < zmin || z > zmax) {
5044 stop = (z < zmin ? 2 : 1);
5045 const double frac =
5046 ((z <
5047 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
5048 1]);
5049 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
5050 los->lat[los->np - 1], xh);
5051 for (int i = 0; i < 3; i++)
5052 x[i] = xh[i] + frac * (x[i] - xh[i]);
5053 cart2geo(x, &z, &lon, &lat);
5054 los->ds[los->np - 1] = ds * frac;
5055 ds = 0;
5056 }
5057
5058 /* Interpolate atmospheric data... */
5059 intpol_atm(ctl, atm, z, &p, &t, q, k);
5060
5061 /* Save data... */
5062 los->lon[los->np] = lon;
5063 los->lat[los->np] = lat;
5064 los->z[los->np] = z;
5065 los->p[los->np] = p;
5066 los->t[los->np] = t;
5067 for (int ig = 0; ig < ctl->ng; ig++)
5068 los->q[los->np][ig] = q[ig];
5069 for (int id = 0; id < ctl->nd; id++)
5070 los->k[los->np][id] = k[ctl->window[id]];
5071 los->ds[los->np] = ds;
5072
5073 /* Add cloud extinction... */
5074 if (ctl->ncl > 0 && atm->cldz > 0) {
5075 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
5076 for (int id = 0; id < ctl->nd; id++) {
5077 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
5078 los->k[los->np][id]
5079 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
5080 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
5081 }
5082 }
5083
5084 /* Increment and check number of LOS points... */
5085 if ((++los->np) > NLOS)
5086 ERRMSG("Too many LOS points!");
5087
5088 /* Check stop flag... */
5089 if (stop) {
5090
5091 /* Set surface temperature... */
5092 if (ctl->nsf > 0 && atm->sft > 0)
5093 t = atm->sft;
5094 los->sft = (stop == 2 ? t : -999);
5095
5096 /* Set surface emissivity... */
5097 for (int id = 0; id < ctl->nd; id++) {
5098 los->sfeps[id] = 1.0;
5099 if (ctl->nsf > 0) {
5100 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
5101 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
5102 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
5103 ctl->nu[id]);
5104 }
5105 }
5106
5107 /* Leave raytracer... */
5108 break;
5109 }
5110
5111 /* Determine refractivity... */
5112 if (ctl->refrac && z <= zrefrac)
5113 n = 1 + REFRAC_EDLEN(p, t);
5114 else
5115 n = 1;
5116
5117 /* Construct new tangent vector (first term)... */
5118 for (int i = 0; i < 3; i++)
5119 ex1[i] = ex0[i] * n;
5120
5121 /* Compute gradient of refractivity... */
5122 if (ctl->refrac && z <= zrefrac) {
5123 for (int i = 0; i < 3; i++)
5124 xh[i] = x[i] + 0.5 * ds * ex0[i];
5125 cart2geo(xh, &z, &lon, &lat);
5126 intpol_atm(ctl, atm, z, &p, &t, q, k);
5127 n = REFRAC_EDLEN(p, t);
5128 for (int i = 0; i < 3; i++) {
5129 xh[i] += h;
5130 cart2geo(xh, &z, &lon, &lat);
5131 intpol_atm(ctl, atm, z, &p, &t, q, k);
5132 ng[i] = (REFRAC_EDLEN(p, t) - n) / h;
5133 xh[i] -= h;
5134 }
5135 } else
5136 for (int i = 0; i < 3; i++)
5137 ng[i] = 0;
5138
5139 /* Construct new tangent vector (second term)... */
5140 for (int i = 0; i < 3; i++)
5141 ex1[i] += ds * ng[i];
5142
5143 /* Normalize new tangent vector... */
5144 norm = NORM(ex1);
5145 for (int i = 0; i < 3; i++)
5146 ex1[i] /= norm;
5147
5148 /* Determine next point of LOS... */
5149 for (int i = 0; i < 3; i++)
5150 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
5151
5152 /* Copy tangent vector... */
5153 for (int i = 0; i < 3; i++)
5154 ex0[i] = ex1[i];
5155 }
5156
5157 /* Get tangent point (to be done before changing segment lengths!)... */
5158 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
5159
5160 /* Change segment lengths according to trapezoid rule... */
5161 for (int ip = los->np - 1; ip >= 1; ip--)
5162 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
5163 los->ds[0] *= 0.5;
5164
5165 /* Compute column density... */
5166 for (int ip = 0; ip < los->np; ip++)
5167 for (int ig = 0; ig < ctl->ng; ig++)
5168 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
5169 / (KB * los->t[ip]) * los->ds[ip];
5170
5171 /* Compute Curtis-Godson means... */
5172 for (int ig = 0; ig < ctl->ng; ig++) {
5173 los->cgu[0][ig] = los->u[0][ig];
5174 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
5175 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
5176 }
5177 for (int ip = 1; ip < los->np; ip++)
5178 for (int ig = 0; ig < ctl->ng; ig++) {
5179 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
5180 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
5181 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
5182 }
5183 for (int ip = 0; ip < los->np; ip++)
5184 for (int ig = 0; ig < ctl->ng; ig++)
5185 if (los->cgu[ip][ig] != 0) {
5186 los->cgp[ip][ig] /= los->cgu[ip][ig];
5187 los->cgt[ip][ig] /= los->cgu[ip][ig];
5188 }
5189}
5190
5191/*****************************************************************************/
5192
5194 const char *dirname,
5195 const char *filename,
5196 const ctl_t *ctl,
5197 atm_t *atm,
5198 int profile) {
5199
5200 /* Init... */
5201 atm->np = 0;
5202
5203 /* Set filename... */
5204 char file[LEN];
5205 if (dirname != NULL)
5206 sprintf(file, "%s/%s", dirname, filename);
5207 else
5208 sprintf(file, "%s", filename);
5209
5210 /* Write info... */
5211 LOG(1, "Read atmospheric data: %s", file);
5212
5213 /* Read ASCII data... */
5214 if (ctl->atmfmt == 1)
5215 read_atm_asc(file, ctl, atm);
5216
5217 /* Read binary data... */
5218 else if (ctl->atmfmt == 2)
5219 read_atm_bin(file, ctl, atm);
5220
5221 /* Read netCDF data... */
5222 else if (ctl->atmfmt == 3)
5223 read_atm_nc(file, ctl, atm, profile);
5224
5225 /* Check number of points... */
5226 if (atm->np < 1)
5227 ERRMSG("Could not read any data!");
5228
5229 /* Write info... */
5230 double mini, maxi;
5231 LOG(2, "Number of data points: %d", atm->np);
5232 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5233 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5234 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5235 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5236 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5237 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5238 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5239 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5240 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5241 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5242 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5243 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5244 for (int ig = 0; ig < ctl->ng; ig++) {
5245 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5246 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5247 }
5248 for (int iw = 0; iw < ctl->nw; iw++) {
5249 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5250 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5251 }
5252 if (ctl->ncl > 0) {
5253 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5254 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5255 } else
5256 LOG(2, "Cloud layer: none");
5257 if (ctl->nsf > 0) {
5258 LOG(2,
5259 "Surface: T_s = %g K | eps= %g ... %g",
5260 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5261 } else
5262 LOG(2, "Surface: none");
5263}
5264
5265/*****************************************************************************/
5266
5268 const char *filename,
5269 const ctl_t *ctl,
5270 atm_t *atm) {
5271
5272 /* Init... */
5273 atm->np = 0;
5274
5275 /* Open file... */
5276 FILE *in;
5277 if (!(in = fopen(filename, "r")))
5278 ERRMSG("Cannot open file!");
5279
5280 /* Read line... */
5281 char line[LEN], *tok;
5282 while (fgets(line, LEN, in)) {
5283
5284 /* Read data... */
5285 TOK(line, tok, "%lg", atm->time[atm->np]);
5286 TOK(NULL, tok, "%lg", atm->z[atm->np]);
5287 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
5288 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
5289 TOK(NULL, tok, "%lg", atm->p[atm->np]);
5290 TOK(NULL, tok, "%lg", atm->t[atm->np]);
5291 for (int ig = 0; ig < ctl->ng; ig++)
5292 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
5293 for (int iw = 0; iw < ctl->nw; iw++)
5294 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
5295 if (ctl->ncl > 0 && atm->np == 0) {
5296 TOK(NULL, tok, "%lg", atm->clz);
5297 TOK(NULL, tok, "%lg", atm->cldz);
5298 for (int icl = 0; icl < ctl->ncl; icl++)
5299 TOK(NULL, tok, "%lg", atm->clk[icl]);
5300 }
5301 if (ctl->nsf > 0 && atm->np == 0) {
5302 TOK(NULL, tok, "%lg", atm->sft);
5303 for (int isf = 0; isf < ctl->nsf; isf++)
5304 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
5305 }
5306
5307 /* Increment data point counter... */
5308 if ((++atm->np) > NP)
5309 ERRMSG("Too many data points!");
5310 }
5311
5312 /* Close file... */
5313 fclose(in);
5314}
5315
5316/*****************************************************************************/
5317
5319 const char *filename,
5320 const ctl_t *ctl,
5321 atm_t *atm) {
5322
5323 /* Open file... */
5324 FILE *in;
5325 if (!(in = fopen(filename, "r")))
5326 ERRMSG("Cannot open file!");
5327
5328 /* Read header... */
5329 char magic[4];
5330 FREAD(magic, char,
5331 4,
5332 in);
5333 if (memcmp(magic, "ATM1", 4) != 0)
5334 ERRMSG("Invalid magic string!");
5335
5336 int ng, nw, ncl, nsf;
5337 FREAD(&ng, int,
5338 1,
5339 in);
5340 FREAD(&nw, int,
5341 1,
5342 in);
5343 FREAD(&ncl, int,
5344 1,
5345 in);
5346 FREAD(&nsf, int,
5347 1,
5348 in);
5349 if (ng != ctl->ng || nw != ctl->nw || ncl != ctl->ncl || nsf != ctl->nsf)
5350 ERRMSG("Error reading file header!");
5351
5352 /* Read data... */
5353 size_t np;
5354 FREAD(&np, size_t,
5355 1,
5356 in);
5357 atm->np = (int) np;
5358 if (atm->np > NP)
5359 ERRMSG("Too many data points!");
5360 FREAD(atm->time, double,
5361 np,
5362 in);
5363 FREAD(atm->z, double,
5364 np,
5365 in);
5366 FREAD(atm->lon, double,
5367 np,
5368 in);
5369 FREAD(atm->lat, double,
5370 np,
5371 in);
5372 FREAD(atm->p, double,
5373 np,
5374 in);
5375 FREAD(atm->t, double,
5376 np,
5377 in);
5378 for (int ig = 0; ig < ctl->ng; ig++)
5379 FREAD(atm->q[ig], double,
5380 np,
5381 in);
5382 for (int iw = 0; iw < ctl->nw; iw++)
5383 FREAD(atm->k[iw], double,
5384 np,
5385 in);
5386 if (ctl->ncl > 0) {
5387 FREAD(&atm->clz, double,
5388 1,
5389 in);
5390 FREAD(&atm->cldz, double,
5391 1,
5392 in);
5393 FREAD(atm->clk, double,
5394 (size_t) ctl->ncl,
5395 in);
5396 }
5397 if (ctl->nsf) {
5398 FREAD(&atm->sft, double,
5399 1,
5400 in);
5401 FREAD(atm->sfeps, double,
5402 (size_t) ctl->nsf,
5403 in);
5404 }
5405
5406 /* Close file... */
5407 fclose(in);
5408}
5409
5410/*****************************************************************************/
5411
5413 const char *filename,
5414 const ctl_t *ctl,
5415 atm_t *atm,
5416 int profile) {
5417
5418 int ncid, var_time, var_z, var_lon, var_lat, var_p, var_t, var_q[NG],
5419 var_k[NW], var_cz = -1, var_cdz = -1, var_ck[NCL], var_sft =
5420 -1, var_sfe[NSF], var_nlev = -1;
5421
5422 char varname[LEN];
5423
5424 /* Open file... */
5425 NC(nc_open(filename, NC_NOWRITE, &ncid));
5426
5427 /* Initialize hyperslab... */
5428 size_t start[2] = { (size_t) profile, 0 };
5429 size_t count[2] = { 1, 0 };
5430
5431 /* Determine atm->np... */
5432 NC(nc_inq_varid(ncid, "nlev", &var_nlev));
5433 NC(nc_get_vara_int(ncid, var_nlev, start, count, &atm->np));
5434 if (atm->np < 1 || atm->np > NP)
5435 ERRMSG("Number of level out of range!");
5436
5437 /* Update hyperslab... */
5438 count[1] = (size_t) atm->np;
5439
5440 /* Inquire core variables... */
5441 NC(nc_inq_varid(ncid, "time", &var_time));
5442 NC(nc_inq_varid(ncid, "z", &var_z));
5443 NC(nc_inq_varid(ncid, "lon", &var_lon));
5444 NC(nc_inq_varid(ncid, "lat", &var_lat));
5445 NC(nc_inq_varid(ncid, "p", &var_p));
5446 NC(nc_inq_varid(ncid, "t", &var_t));
5447
5448 /* Inquire emiters... */
5449 for (int ig = 0; ig < ctl->ng; ig++)
5450 NC(nc_inq_varid(ncid, ctl->emitter[ig], &var_q[ig]));
5451
5452 /* Inquire extinctions... */
5453 for (int iw = 0; iw < ctl->nw; iw++) {
5454 sprintf(varname, "ext_win_%d", iw);
5455 NC(nc_inq_varid(ncid, varname, &var_k[iw]));
5456 }
5457
5458 /* Inquire cloud variables... */
5459 if (ctl->ncl > 0) {
5460 NC(nc_inq_varid(ncid, "cld_z", &var_cz));
5461 NC(nc_inq_varid(ncid, "cld_dz", &var_cdz));
5462 for (int icl = 0; icl < ctl->ncl; icl++) {
5463 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
5464 NC(nc_inq_varid(ncid, varname, &var_ck[icl]));
5465 }
5466 }
5467
5468 /* Inquire surface variables... */
5469 if (ctl->nsf > 0) {
5470 NC(nc_inq_varid(ncid, "srf_t", &var_sft));
5471 for (int isf = 0; isf < ctl->nsf; isf++) {
5472 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
5473 NC(nc_inq_varid(ncid, varname, &var_sfe[isf]));
5474 }
5475 }
5476
5477 /* Read core variables... */
5478 NC(nc_get_vara_double(ncid, var_time, start, count, atm->time));
5479 NC(nc_get_vara_double(ncid, var_z, start, count, atm->z));
5480 NC(nc_get_vara_double(ncid, var_lon, start, count, atm->lon));
5481 NC(nc_get_vara_double(ncid, var_lat, start, count, atm->lat));
5482 NC(nc_get_vara_double(ncid, var_p, start, count, atm->p));
5483 NC(nc_get_vara_double(ncid, var_t, start, count, atm->t));
5484
5485 /* Read emitters... */
5486 for (int ig = 0; ig < ctl->ng; ig++)
5487 NC(nc_get_vara_double(ncid, var_q[ig], start, count, atm->q[ig]));
5488
5489 /* Read extinctions... */
5490 for (int iw = 0; iw < ctl->nw; iw++)
5491 NC(nc_get_vara_double(ncid, var_k[iw], start, count, atm->k[iw]));
5492
5493 /* Read cloud variables... */
5494 if (ctl->ncl > 0) {
5495 NC(nc_get_vara_double(ncid, var_cz, start, count, &atm->clz));
5496 NC(nc_get_vara_double(ncid, var_cdz, start, count, &atm->cldz));
5497 for (int icl = 0; icl < ctl->ncl; icl++)
5498 NC(nc_get_vara_double(ncid, var_ck[icl], start, count, &atm->clk[icl]));
5499 }
5500
5501 /* Read surface variables... */
5502 if (ctl->nsf > 0) {
5503 NC(nc_get_vara_double(ncid, var_sft, start, count, &atm->sft));
5504
5505 for (int isf = 0; isf < ctl->nsf; isf++)
5506 NC(nc_get_vara_double
5507 (ncid, var_sfe[isf], start, count, &atm->sfeps[isf]));
5508 }
5509
5510 /* Close file... */
5511 NC(nc_close(ncid));
5512}
5513
5514/*****************************************************************************/
5515
5517 int argc,
5518 char *argv[],
5519 ctl_t *ctl) {
5520
5521 /* Write info... */
5522 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
5523 "(executable: %s | version: %s | compiled: %s, %s)\n",
5524 argv[0], VERSION, __DATE__, __TIME__);
5525
5526 /* Emitters... */
5527 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
5528 if (ctl->ng < 0 || ctl->ng > NG)
5529 ERRMSG("Set 0 <= NG <= MAX!");
5530 for (int ig = 0; ig < ctl->ng; ig++)
5531 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
5532 ctl->ig_co2 = find_emitter(ctl, "CO2");
5533 ctl->ig_h2o = find_emitter(ctl, "H2O");
5534 ctl->ig_n2 = find_emitter(ctl, "N2");
5535 ctl->ig_o2 = find_emitter(ctl, "O2");
5536
5537 /* Radiance channels... */
5538 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
5539 if (ctl->nd < 0 || ctl->nd > ND)
5540 ERRMSG("Set 0 <= ND <= MAX!");
5541 for (int id = 0; id < ctl->nd; id++)
5542 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
5543
5544 /* Spectral windows... */
5545 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
5546 if (ctl->nw < 0 || ctl->nw > NW)
5547 ERRMSG("Set 0 <= NW <= MAX!");
5548 for (int id = 0; id < ctl->nd; id++)
5549 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
5550
5551 /* Cloud data... */
5552 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
5553 if (ctl->ncl < 0 || ctl->ncl > NCL)
5554 ERRMSG("Set 0 <= NCL <= MAX!");
5555 if (ctl->ncl == 1)
5556 ERRMSG("Set NCL > 1!");
5557 for (int icl = 0; icl < ctl->ncl; icl++)
5558 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
5559
5560 /* Surface data... */
5561 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
5562 if (ctl->nsf < 0 || ctl->nsf > NSF)
5563 ERRMSG("Set 0 <= NSF <= MAX!");
5564 if (ctl->nsf == 1)
5565 ERRMSG("Set NSF > 1!");
5566 for (int isf = 0; isf < ctl->nsf; isf++)
5567 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
5568 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
5569 if (ctl->sftype < 0 || ctl->sftype > 3)
5570 ERRMSG("Set 0 <= SFTYPE <= 3!");
5571 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
5572
5573 /* Emissivity look-up tables... */
5574 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
5575 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
5576 if (ctl->tblfmt < 1 || ctl->tblfmt > 3)
5577 ERRMSG("Unknown look-up table file format, set TBLFMT to 1, 2, or 3!");
5578
5579 /* File formats... */
5580 ctl->atmfmt = (int) scan_ctl(argc, argv, "ATMFMT", -1, "1", NULL);
5581 if (ctl->atmfmt < 1 || ctl->atmfmt > 3)
5582 ERRMSG("Unknown atmospheric file format, set ATMFMT to 1, 2, or 3!");
5583 ctl->obsfmt = (int) scan_ctl(argc, argv, "OBSFMT", -1, "1", NULL);
5584 if (ctl->obsfmt < 1 || ctl->obsfmt > 3)
5585 ERRMSG("Unknown observation file format, set OBSFMT to 1, 2, or 3!");
5586 ctl->matrixfmt = (int) scan_ctl(argc, argv, "MATRIXFMT", -1, "1", NULL);
5587 if (ctl->matrixfmt < 1 || ctl->matrixfmt > 3)
5588 ERRMSG("Unknown matrix file format, set MATRIXFMT to 1, 2, or 3!");
5589
5590 /* Hydrostatic equilibrium... */
5591 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
5592
5593 /* Continua... */
5594 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
5595 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
5596 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
5597 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
5598
5599 /* Ray-tracing... */
5600 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
5601 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
5602 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
5603
5604 /* Field of view... */
5605 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
5606 if (ctl->fov[0] != '-')
5607 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
5608
5609 /* Retrieval interface... */
5610 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
5611 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
5612 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
5613 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
5614 for (int ig = 0; ig < ctl->ng; ig++) {
5615 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
5616 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
5617 }
5618 for (int iw = 0; iw < ctl->nw; iw++) {
5619 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
5620 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
5621 }
5622 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
5623 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
5624 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
5625 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
5626 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
5627
5628 /* Output flags... */
5629 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
5630 ctl->write_matrix =
5631 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
5632
5633 /* External forward models... */
5634 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
5635 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
5636 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
5637 for (int ig = 0; ig < ctl->ng; ig++)
5638 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
5639}
5640
5641/*****************************************************************************/
5642
5644 const char *dirname,
5645 const char *filename,
5646 const ctl_t *ctl,
5647 gsl_matrix *matrix,
5648 int dataset) {
5649
5650 /* Read ASCII data... */
5651 if (ctl->matrixfmt == 1)
5652 read_matrix_asc(dirname, filename, matrix);
5653
5654 /* Read binary data... */
5655 else if (ctl->matrixfmt == 2)
5656 read_matrix_bin(dirname, filename, matrix);
5657
5658 /* Read netCDF data... */
5659 else if (ctl->matrixfmt == 3)
5660 read_matrix_nc(dirname, filename, matrix, dataset);
5661
5662 /* Error... */
5663 else
5664 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
5665}
5666
5667/*****************************************************************************/
5668
5670 const char *dirname,
5671 const char *filename,
5672 gsl_matrix *matrix) {
5673
5674 char dum[LEN], file[LEN], line[LEN];
5675
5676 double value;
5677
5678 int i, j;
5679
5680 /* Set filename... */
5681 if (dirname != NULL)
5682 sprintf(file, "%s/%s", dirname, filename);
5683 else
5684 sprintf(file, "%s", filename);
5685
5686 /* Write info... */
5687 LOG(1, "Read matrix: %s", file);
5688
5689 /* Open file... */
5690 FILE *in;
5691 if (!(in = fopen(file, "r")))
5692 ERRMSG("Cannot open file!");
5693
5694 /* Read data... */
5695 gsl_matrix_set_zero(matrix);
5696 while (fgets(line, LEN, in))
5697 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
5698 &i, dum, dum, dum, dum, dum,
5699 &j, dum, dum, dum, dum, dum, &value) == 13)
5700 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
5701
5702 /* Close file... */
5703 fclose(in);
5704}
5705
5706/*****************************************************************************/
5707
5709 const char *dirname,
5710 const char *filename,
5711 gsl_matrix *matrix) {
5712
5713 char file[LEN], magic[4];
5714 size_t nr, nc;
5715
5716 /* Set filename... */
5717 if (dirname != NULL)
5718 sprintf(file, "%s/%s", dirname, filename);
5719 else
5720 sprintf(file, "%s", filename);
5721
5722 /* Write info... */
5723 LOG(1, "Read matrix: %s", file);
5724
5725 /* Open file... */
5726 FILE *in;
5727 if (!(in = fopen(file, "r")))
5728 ERRMSG("Cannot open file!");
5729
5730 /* Read header... */
5731 FREAD(magic, char,
5732 4,
5733 in);
5734 if (memcmp(magic, "MAT1", 4) != 0)
5735 ERRMSG("Invalid magic string!");
5736 FREAD(&nr, size_t,
5737 1,
5738 in);
5739 FREAD(&nc, size_t,
5740 1,
5741 in);
5742 if (nr != matrix->size1 || nc != matrix->size2)
5743 ERRMSG("Error reading file header!");
5744
5745 /* Read data... */
5746 for (size_t i = 0; i < nr; i++)
5747 for (size_t j = 0; j < nc; j++) {
5748 double value;
5749 FREAD(&value, double,
5750 1,
5751 in);
5752 gsl_matrix_set(matrix, i, j, value);
5753 }
5754
5755 /* Close file... */
5756 fclose(in);
5757}
5758
5759/*****************************************************************************/
5760
5762 const char *dirname,
5763 const char *filename,
5764 gsl_matrix *matrix,
5765 int dataset) {
5766
5767 char file[LEN];
5768
5769 int ncid, dimid_row, dimid_col, varid;
5770
5771 size_t nr, nc;
5772
5773 /* Set filename... */
5774 if (dirname != NULL)
5775 sprintf(file, "%s/%s", dirname, filename);
5776 else
5777 sprintf(file, "%s", filename);
5778
5779 /* Write info... */
5780 LOG(1, "Read matrix: %s", file);
5781
5782 /* Open file... */
5783 NC(nc_open(file, NC_NOWRITE, &ncid));
5784
5785 /* Read dimensions... */
5786 NC(nc_inq_dimid(ncid, "row", &dimid_row));
5787 NC(nc_inq_dimid(ncid, "col", &dimid_col));
5788 NC(nc_inq_dimlen(ncid, dimid_row, &nr));
5789 NC(nc_inq_dimlen(ncid, dimid_col, &nc));
5790 if (nr != matrix->size1 || nc != matrix->size2)
5791 ERRMSG("Error reading file header!");
5792
5793 /* Read data... */
5794 NC(nc_inq_varid(ncid, "matrix", &varid));
5795 for (size_t i = 0; i < nr; i++)
5796 for (size_t j = 0; j < nc; j++) {
5797 double value;
5798 size_t start[3] = { (size_t) dataset, i, j };
5799 size_t count[3] = { 1, 1, 1 };
5800 NC(nc_get_vara_double(ncid, varid, start, count, &value));
5801 gsl_matrix_set(matrix, i, j, value);
5802 }
5803
5804 /* Close file... */
5805 NC(nc_close(ncid));
5806}
5807
5808/*****************************************************************************/
5809
5811 const char *dirname,
5812 const char *filename,
5813 const ctl_t *ctl,
5814 obs_t *obs,
5815 int profile) {
5816
5817 /* Set filename... */
5818 char file[LEN];
5819 if (dirname != NULL)
5820 sprintf(file, "%s/%s", dirname, filename);
5821 else
5822 sprintf(file, "%s", filename);
5823
5824 /* Write info... */
5825 LOG(1, "Read observation data: %s", file);
5826
5827 /* Read ASCII data... */
5828 if (ctl->obsfmt == 1)
5829 read_obs_asc(file, ctl, obs);
5830
5831 /* Read binary data... */
5832 else if (ctl->obsfmt == 2)
5833 read_obs_bin(file, ctl, obs);
5834
5835 /* Read netCDF data... */
5836 else if (ctl->obsfmt == 3)
5837 read_obs_nc(file, ctl, obs, profile);
5838
5839 /* Check number of points... */
5840 if (obs->nr < 1)
5841 ERRMSG("Could not read any data!");
5842
5843 /* Write info... */
5844 double mini, maxi;
5845 LOG(2, "Number of ray paths: %d", obs->nr);
5846 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5847 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5848 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5849 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5850 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5851 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5852 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5853 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5854 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5855 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5856 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5857 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5858 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5859 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5860 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5861 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5862 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5863 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5864 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5865 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5866 for (int id = 0; id < ctl->nd; id++) {
5867 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5868 if (ctl->write_bbt) {
5869 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5870 ctl->nu[id], mini, maxi);
5871 } else {
5872 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5873 ctl->nu[id], mini, maxi);
5874 }
5875 }
5876 for (int id = 0; id < ctl->nd; id++) {
5877 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5878 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5879 ctl->nu[id], mini, maxi);
5880 }
5881}
5882
5883/*****************************************************************************/
5884
5886 const char *filename,
5887 const ctl_t *ctl,
5888 obs_t *obs) {
5889
5890 /* Init... */
5891 obs->nr = 0;
5892
5893 /* Open file... */
5894 FILE *in;
5895 if (!(in = fopen(filename, "r")))
5896 ERRMSG("Cannot open file!");
5897
5898 /* Read line... */
5899 char line[LEN], *tok;
5900 while (fgets(line, LEN, in)) {
5901
5902 /* Read data... */
5903 TOK(line, tok, "%lg", obs->time[obs->nr]);
5904 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5905 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5906 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5907 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5908 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5909 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5910 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5911 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5912 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5913 for (int id = 0; id < ctl->nd; id++)
5914 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5915 for (int id = 0; id < ctl->nd; id++)
5916 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5917
5918 /* Increment counter... */
5919 if ((++obs->nr) > NR)
5920 ERRMSG("Too many rays!");
5921 }
5922
5923 /* Close file... */
5924 fclose(in);
5925}
5926
5927/*****************************************************************************/
5928
5930 const char *filename,
5931 const ctl_t *ctl,
5932 obs_t *obs) {
5933
5934 /* Open file... */
5935 FILE *in;
5936 if (!(in = fopen(filename, "r")))
5937 ERRMSG("Cannot open file!");
5938
5939 /* Read header... */
5940 char magic[4];
5941 FREAD(magic, char,
5942 4,
5943 in);
5944 if (memcmp(magic, "OBS1", 4) != 0)
5945 ERRMSG("Invalid magic string!");
5946
5947 int nd;
5948 FREAD(&nd, int,
5949 1,
5950 in);
5951 if (nd != ctl->nd)
5952 ERRMSG("Error reading file header!");
5953
5954 /* Read data... */
5955 size_t nr;
5956 FREAD(&nr, size_t,
5957 1,
5958 in);
5959 obs->nr = (int) nr;
5960 if (obs->nr > NR)
5961 ERRMSG("Too many ray paths!");
5962 FREAD(obs->time, double,
5963 nr,
5964 in);
5965 FREAD(obs->obsz, double,
5966 nr,
5967 in);
5968 FREAD(obs->obslon, double,
5969 nr,
5970 in);
5971 FREAD(obs->obslat, double,
5972 nr,
5973 in);
5974 FREAD(obs->vpz, double,
5975 nr,
5976 in);
5977 FREAD(obs->vplon, double,
5978 nr,
5979 in);
5980 FREAD(obs->vplat, double,
5981 nr,
5982 in);
5983 FREAD(obs->tpz, double,
5984 nr,
5985 in);
5986 FREAD(obs->tplon, double,
5987 nr,
5988 in);
5989 FREAD(obs->tplat, double,
5990 nr,
5991 in);
5992 for (int id = 0; id < ctl->nd; id++)
5993 FREAD(obs->rad[id], double,
5994 nr,
5995 in);
5996 for (int id = 0; id < ctl->nd; id++)
5997 FREAD(obs->tau[id], double,
5998 nr,
5999 in);
6000
6001 /* Close file... */
6002 fclose(in);
6003}
6004
6005/*****************************************************************************/
6006
6008 const char *filename,
6009 const ctl_t *ctl,
6010 obs_t *obs,
6011 const int profile) {
6012
6013 int ncid, var_nray = -1, var_time = -1, var_obsz = -1, var_obslon =
6014 -1, var_obslat = -1, var_vpz = -1, var_vplon = -1, var_vplat =
6015 -1, var_tpz = -1, var_tplon = -1, var_tplat =
6016 -1, var_rad[ND], var_tau[ND];
6017 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
6018
6019 /* Open file... */
6020 NC(nc_open(filename, NC_NOWRITE, &ncid));
6021
6022 /* Initialize hyperslab... */
6023 size_t start[2] = { (size_t) profile, 0 };
6024 size_t count[2] = { 1, 0 };
6025
6026 /* Read nray(profile) -> obs->nr */
6027 NC(nc_inq_varid(ncid, "nray", &var_nray));
6028 NC(nc_get_vara_int(ncid, var_nray, start, count, &obs->nr));
6029 if (obs->nr < 1 || obs->nr > NR)
6030 ERRMSG("Number of ray paths out of range!");
6031
6032 /* Update hyperslab... */
6033 count[1] = (size_t) obs->nr;
6034
6035 /* Inquire geometry variables... */
6036 NC(nc_inq_varid(ncid, "time", &var_time));
6037 NC(nc_inq_varid(ncid, "obs_z", &var_obsz));
6038 NC(nc_inq_varid(ncid, "obs_lon", &var_obslon));
6039 NC(nc_inq_varid(ncid, "obs_lat", &var_obslat));
6040
6041 NC(nc_inq_varid(ncid, "vp_z", &var_vpz));
6042 NC(nc_inq_varid(ncid, "vp_lon", &var_vplon));
6043 NC(nc_inq_varid(ncid, "vp_lat", &var_vplat));
6044
6045 NC(nc_inq_varid(ncid, "tp_z", &var_tpz));
6046 NC(nc_inq_varid(ncid, "tp_lon", &var_tplon));
6047 NC(nc_inq_varid(ncid, "tp_lat", &var_tplat));
6048
6049 /* Inquire spectral variables per channel... */
6050 for (int id = 0; id < ctl->nd; id++) {
6051 char varname[LEN];
6052
6053 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
6054 NC(nc_inq_varid(ncid, varname, &var_rad[id]));
6055
6056 sprintf(varname, "tau_%.4f", ctl->nu[id]);
6057 NC(nc_inq_varid(ncid, varname, &var_tau[id]));
6058 }
6059
6060 /* Read geometry... */
6061 NC(nc_get_vara_double(ncid, var_time, start, count, obs->time));
6062 NC(nc_get_vara_double(ncid, var_obsz, start, count, obs->obsz));
6063 NC(nc_get_vara_double(ncid, var_obslon, start, count, obs->obslon));
6064 NC(nc_get_vara_double(ncid, var_obslat, start, count, obs->obslat));
6065
6066 NC(nc_get_vara_double(ncid, var_vpz, start, count, obs->vpz));
6067 NC(nc_get_vara_double(ncid, var_vplon, start, count, obs->vplon));
6068 NC(nc_get_vara_double(ncid, var_vplat, start, count, obs->vplat));
6069
6070 NC(nc_get_vara_double(ncid, var_tpz, start, count, obs->tpz));
6071 NC(nc_get_vara_double(ncid, var_tplon, start, count, obs->tplon));
6072 NC(nc_get_vara_double(ncid, var_tplat, start, count, obs->tplat));
6073
6074 /* Read radiance and transmittance... */
6075 for (int id = 0; id < ctl->nd; id++) {
6076 NC(nc_get_vara_double(ncid, var_rad[id], start, count, obs->rad[id]));
6077 NC(nc_get_vara_double(ncid, var_tau[id], start, count, obs->tau[id]));
6078 }
6079
6080 /* Close file... */
6081 NC(nc_close(ncid));
6082}
6083
6084/*****************************************************************************/
6085
6087 const char *basename,
6088 const double z,
6089 const double *nu,
6090 const double *f,
6091 const int n) {
6092
6093 double fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
6094
6095 int npts;
6096
6097 /* Allocate... */
6098 ALLOC(nurfm, double,
6099 RFMNPTS);
6100 ALLOC(rad, double,
6101 RFMNPTS);
6102
6103 /* Search RFM spectrum... */
6104 FILE *in;
6105 char filename[LEN];
6106 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
6107 if (!(in = fopen(filename, "r"))) {
6108 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
6109 if (!(in = fopen(filename, "r")))
6110 ERRMSG("Cannot find RFM data file!");
6111 }
6112 fclose(in);
6113
6114 /* Read RFM spectrum... */
6115 read_rfm_spec(filename, nurfm, rad, &npts);
6116
6117 /* Set wavenumbers... */
6118 nu2[0] = nu[0];
6119 nu2[n - 1] = nu[n - 1];
6120 for (int i = 1; i < n - 1; i++)
6121 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
6122
6123 /* Convolute... */
6124 for (int ipts = 0; ipts < npts; ipts++)
6125 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
6126 const int idx = locate_irr(nu2, n, nurfm[ipts]);
6127 const double filt =
6128 LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
6129 fsum += filt;
6130 radsum += filt * rad[ipts];
6131 }
6132
6133 /* Free... */
6134 free(nurfm);
6135 free(rad);
6136
6137 /* Return radiance... */
6138 return radsum / fsum;
6139}
6140
6141/*****************************************************************************/
6142
6144 int argc,
6145 char *argv[],
6146 const ctl_t *ctl,
6147 ret_t *ret) {
6148
6149 /* Iteration control... */
6150 ret->kernel_recomp =
6151 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
6152 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
6153 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
6154
6155 /* Error analysis... */
6156 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "0", NULL);
6157
6158 for (int id = 0; id < ctl->nd; id++)
6159 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
6160
6161 for (int id = 0; id < ctl->nd; id++)
6162 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
6163
6164 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
6165 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
6166 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
6167
6168 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
6169 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
6170 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
6171
6172 for (int ig = 0; ig < ctl->ng; ig++) {
6173 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
6174 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
6175 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
6176 }
6177
6178 for (int iw = 0; iw < ctl->nw; iw++) {
6179 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
6180 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
6181 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
6182 }
6183
6184 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
6185 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
6186 for (int icl = 0; icl < ctl->ncl; icl++)
6187 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
6188
6189 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
6190 for (int isf = 0; isf < ctl->nsf; isf++)
6191 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
6192
6193 /* Shared retrieval I/O... */
6194 ret->shared_io_profile = 0;
6195 scan_ctl(argc, argv, "SHARED_IO_PROFLIST", -1, "-",
6196 ret->shared_io_proflist);
6197 scan_ctl(argc, argv, "SHARED_IO_ATM_APR_FILE", -1, "-",
6199 scan_ctl(argc, argv, "SHARED_IO_OBS_MEAS_FILE", -1, "-",
6201 scan_ctl(argc, argv, "SHARED_IO_ATM_FINAL_FILE", -1, "-",
6203 scan_ctl(argc, argv, "SHARED_IO_OBS_FINAL_FILE", -1, "-",
6205 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_APR_FILE", -1, "-",
6207 scan_ctl(argc, argv, "SHARED_IO_MATRIX_KERNEL_FILE", -1, "-",
6209 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_RET_FILE", -1, "-",
6211 scan_ctl(argc, argv, "SHARED_IO_MATRIX_CORR_FILE", -1, "-",
6213 scan_ctl(argc, argv, "SHARED_IO_MATRIX_GAIN_FILE", -1, "-",
6215 scan_ctl(argc, argv, "SHARED_IO_MATRIX_AVK_FILE", -1, "-",
6217 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_TOTAL_FILE", -1, "-",
6219 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_NOISE_FILE", -1, "-",
6221 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_FORMOD_FILE", -1, "-",
6223 scan_ctl(argc, argv, "SHARED_IO_ATM_CONT_FILE", -1, "-",
6225 scan_ctl(argc, argv, "SHARED_IO_ATM_RES_FILE", -1, "-",
6227}
6228
6229/*****************************************************************************/
6230
6232 const char *filename,
6233 double *nu,
6234 double *rad,
6235 int *npts) {
6236
6237 char *line = NULL, *tok;
6238
6239 size_t line_buf_size = 0;
6240
6241 double dnu, nu0, nu1;
6242
6243 int ipts = 0;
6244
6245 /* Write info... */
6246 LOG(1, "Read RFM data: %s", filename);
6247
6248 /* Open file... */
6249 FILE *in;
6250 if (!(in = fopen(filename, "r")))
6251 ERRMSG("Cannot open file!");
6252
6253 /* Read header... */
6254 for (int i = 0; i < 4; i++)
6255 if (getline(&line, &line_buf_size, in) == -1)
6256 ERRMSG("Error while reading file header!");
6257 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
6258 ERRMSG("Invalid spectrum header format!");
6259
6260 /* Check number of spectral grid points... */
6261 if (*npts > RFMNPTS)
6262 ERRMSG("Too many spectral grid points!");
6263
6264 /* Read radiance data... */
6265 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
6266 tok = strtok(line, " \t\n");
6267 while (tok != NULL && ipts < *npts) {
6268 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
6269 ipts++;
6270 tok = strtok(NULL, " \t\n");
6271 }
6272 }
6273
6274 /* Check number of spectral grid points... */
6275 if (ipts != *npts)
6276 ERRMSG("Error while reading RFM data!");
6277
6278 /* Compute wavenumbers... */
6279 for (ipts = 0; ipts < *npts; ipts++)
6280 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
6281
6282 /* Close file... */
6283 fclose(in);
6284
6285 /* Free.. */
6286 free(line);
6287}
6288
6289/*****************************************************************************/
6290
6292 const char *filename,
6293 double *x,
6294 double *y,
6295 int *n) {
6296
6297 char line[LEN];
6298
6299 /* Write info... */
6300 LOG(1, "Read shape function: %s", filename);
6301
6302 /* Open file... */
6303 FILE *in;
6304 if (!(in = fopen(filename, "r")))
6305 ERRMSG("Cannot open file!");
6306
6307 /* Read data... */
6308 *n = 0;
6309 while (fgets(line, LEN, in))
6310 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
6311 if ((++(*n)) > NSHAPE)
6312 ERRMSG("Too many data points!");
6313
6314 /* Close file... */
6315 fclose(in);
6316
6317 /* Check number of data points... */
6318 if (*n < 2)
6319 ERRMSG("Could not read any data!");
6320
6321 /* Write info... */
6322 double mini, maxi;
6323 LOG(2, "Number of data points: %d", *n);
6324 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
6325 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
6326 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
6327 LOG(2, "Range of y values: %g ... %g", mini, maxi);
6328}
6329
6330/*****************************************************************************/
6331
6333 const ctl_t *ctl) {
6334
6335 /* Allocate... */
6336 tbl_t *tbl;
6337 ALLOC(tbl, tbl_t, 1);
6338
6339 /* Initialize filter function sizes... */
6340 for (int id = 0; id < ctl->nd; id++)
6341 tbl->filt_n[id] = 0;
6342
6343 /* Loop over trace gases... */
6344 for (int ig = 0; ig < ctl->ng; ig++) {
6345
6346 /* Read ASCII look-up tables... */
6347 if (ctl->tblfmt == 1)
6348 for (int id = 0; id < ctl->nd; id++) {
6349 read_tbl_asc(ctl, tbl, id, ig);
6350 TBL_LOG(tbl, id, ig);
6351 }
6352
6353 /* Read binary look-up tables... */
6354 else if (ctl->tblfmt == 2)
6355 for (int id = 0; id < ctl->nd; id++) {
6356 read_tbl_bin(ctl, tbl, id, ig);
6357 TBL_LOG(tbl, id, ig);
6358 }
6359
6360 /* Read netCDF look-up tables... */
6361 else if (ctl->tblfmt == 3) {
6362
6363 /* Open file... */
6364 int ncid;
6365 char filename[2 * LEN];
6366 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
6367 if (nc_open(filename, NC_NOWRITE, &ncid) != NC_NOERR) {
6368 WARN("Missing emissivity table: %s", filename);
6369 continue;
6370 } else
6371 LOG(1, "Read emissivity table: %s", filename);
6372
6373 /* Read channels... */
6374 for (int id = 0; id < ctl->nd; id++) {
6375 read_tbl_nc_channel(ctl, tbl, id, ig, ncid);
6376 TBL_LOG(tbl, id, ig);
6377 }
6378
6379 /* Close file... */
6380 NC(nc_close(ncid));
6381 }
6382 }
6383
6384 /* Calculate log-pressure... */
6385 for (int id = 0; id < ctl->nd; id++)
6386 for (int ig = 0; ig < ctl->ng; ig++)
6387 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6388 tbl->lnp[id][ig][ip] = log(tbl->p[id][ig][ip]);
6389
6390 /* Read filter functions... */
6391 if (ctl->tblfmt == 1)
6392 for (int id = 0; id < ctl->nd; id++) {
6393 char filename[2 * LEN];
6394 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
6395 read_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
6396 &tbl->filt_n[id]);
6397 }
6398
6399 /* Initialize source function lookup tables... */
6400 init_srcfunc(ctl, tbl);
6401
6402 /* Return pointer... */
6403 return tbl;
6404}
6405
6406/*****************************************************************************/
6407
6409 const ctl_t *ctl,
6410 tbl_t *tbl,
6411 const int id,
6412 const int ig) {
6413
6414 /* Initialize... */
6415 double eps, eps_old = -999, press, press_old = -999, temp,
6416 temp_old = -999, u, u_old = -999;
6417 int nrange = 0;
6418
6419 /* Set filename... */
6420 char filename[2 * LEN];
6421 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
6422 ctl->nu[id], ctl->emitter[ig]);
6423
6424 /* Open file... */
6425 FILE *in;
6426 if (!(in = fopen(filename, "r"))) {
6427 WARN("Missing emissivity table: %s", filename);
6428 return;
6429 } else
6430 LOG(1, "Read emissivity table: %s", filename);
6431
6432 /* Init pressure level counter... */
6433 tbl->np[id][ig] = -1;
6434
6435 /* Read data... */
6436 char line[LEN];
6437 while (fgets(line, LEN, in)) {
6438
6439 /* Parse line... */
6440 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
6441 continue;
6442
6443 /* Check ranges... */
6444 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
6445 nrange++;
6446 continue;
6447 }
6448
6449 /* Determine pressure index... */
6450 if (press != press_old) {
6451 press_old = press;
6452 if ((++tbl->np[id][ig]) >= TBLNP)
6453 ERRMSG("Too many pressure levels!");
6454 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
6455 }
6456
6457 /* Determine temperature index... */
6458 if (temp != temp_old) {
6459 temp_old = temp;
6460 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
6461 ERRMSG("Too many temperatures!");
6462 tbl->nu[id][ig][tbl->np[id][ig]]
6463 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
6464
6465 /* Reset dynamic arrays for this (ip,it) node... */
6466 tbl->logu[id][ig][tbl->np[id][ig]]
6467 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6468 tbl->logeps[id][ig][tbl->np[id][ig]]
6469 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6470 }
6471
6472 /* Determine column density index... */
6473 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
6474 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
6475 eps_old = eps;
6476 u_old = u;
6477 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
6478 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
6479 ERRMSG("Too many column densities!");
6480
6481 /* Grow dynamic arrays (nu is used as an index during reading). */
6482 const int ip = tbl->np[id][ig];
6483 const int it = tbl->nt[id][ig][ip];
6484 const int iu = tbl->nu[id][ig][ip][it];
6485 const size_t nnew = (size_t) (iu + 1);
6486
6487 float *tmp = (float *) realloc(tbl->logu[id][ig][ip][it],
6488 nnew * sizeof(float));
6489 if (!tmp)
6490 ERRMSG("Out of memory!");
6491 tbl->logu[id][ig][ip][it] = tmp;
6492
6493 tmp =
6494 (float *) realloc(tbl->logeps[id][ig][ip][it], nnew * sizeof(float));
6495 if (!tmp)
6496 ERRMSG("Out of memory!");
6497 tbl->logeps[id][ig][ip][it] = tmp;
6498 }
6499
6500 /* Store data... */
6501 tbl->p[id][ig][tbl->np[id][ig]] = press;
6502 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6503 = temp;
6504 tbl->logu[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6505 [tbl->nu[id][ig][tbl->np[id][ig]]
6506 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(u);
6507 tbl->logeps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6508 [tbl->nu[id][ig][tbl->np[id][ig]]
6509 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(eps);
6510 }
6511
6512 /* Increment counters... */
6513 tbl->np[id][ig]++;
6514 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6515 tbl->nt[id][ig][ip]++;
6516 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
6517 tbl->nu[id][ig][ip][it]++;
6518 }
6519
6520 /* Check ranges... */
6521 if (nrange > 0)
6522 WARN("Column density or emissivity out of range (%d data points)!",
6523 nrange);
6524
6525 /* Close file... */
6526 fclose(in);
6527}
6528
6529/*****************************************************************************/
6530
6532 const ctl_t *ctl,
6533 tbl_t *tbl,
6534 const int id,
6535 const int ig) {
6536
6537 /* Set filename... */
6538 char filename[2 * LEN];
6539 sprintf(filename, "%s_%.4f_%s.bin",
6540 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
6541
6542 /* Open file... */
6543 FILE *in = fopen(filename, "rb");
6544 if (!in) {
6545 WARN("Missing emissivity table: %s", filename);
6546 return;
6547 } else
6548 LOG(1, "Read emissivity table: %s", filename);
6549
6550 /* Read length.. */
6551 size_t nbytes;
6552 FREAD(&nbytes, size_t,
6553 1,
6554 in);
6555 if (nbytes <= 0)
6556 ERRMSG("Invalid packed table size!");
6557
6558 /* Read packed blob... */
6559 uint8_t *work = NULL;
6560 ALLOC(work, uint8_t, nbytes);
6561 FREAD(work, uint8_t, nbytes, in);
6562
6563 /* Unpack... */
6564 tbl_unpack(tbl, id, ig, work);
6565
6566 /* Close file... */
6567 fclose(in);
6568
6569 /* Free... */
6570 free(work);
6571}
6572
6573/*****************************************************************************/
6574
6576 const ctl_t *ctl,
6577 tbl_t *tbl,
6578 int id,
6579 int ig,
6580 int ncid) {
6581
6582 char varname[LEN];
6583
6584 int varid, dimid;
6585
6586 size_t nbytes;
6587
6588 /* Inquire variable... */
6589 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
6590 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
6591 WARN("Missing emissivity table: %s", varname);
6592 return;
6593 } else
6594 LOG(1, "Read emissivity table: %s", varname);
6595 NC(nc_inq_vardimid(ncid, varid, &dimid));
6596 NC(nc_inq_dimlen(ncid, dimid, &nbytes));
6597
6598 /* Read variable... */
6599 uint8_t *work = NULL;
6600 ALLOC(work, uint8_t, nbytes);
6601 NC(nc_get_var_uchar(ncid, varid, (unsigned char *) work));
6602
6603 /* Unpack... */
6604 tbl_unpack(tbl, id, ig, work);
6605
6606 /* Free... */
6607 free(work);
6608}
6609
6610/*****************************************************************************/
6611
6613 int argc,
6614 char *argv[],
6615 const char *varname,
6616 const int arridx,
6617 const char *defvalue,
6618 char *value) {
6619
6620 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
6621 rvarname[LEN], rval[LEN];
6622
6623 int contain = 0;
6624
6625 /* Open file... */
6626 FILE *in = NULL;
6627 if (argv[1][0] != '-')
6628 if (!(in = fopen(argv[1], "r")))
6629 ERRMSG("Cannot open file!");
6630
6631 /* Set full variable name... */
6632 if (arridx >= 0) {
6633 sprintf(fullname1, "%s[%d]", varname, arridx);
6634 sprintf(fullname2, "%s[*]", varname);
6635 } else {
6636 sprintf(fullname1, "%s", varname);
6637 sprintf(fullname2, "%s", varname);
6638 }
6639
6640 /* Read data... */
6641 if (in != NULL)
6642 while (fgets(line, LEN, in))
6643 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
6644 if (strcasecmp(rvarname, fullname1) == 0 ||
6645 strcasecmp(rvarname, fullname2) == 0) {
6646 contain = 1;
6647 break;
6648 }
6649 for (int i = 1; i < argc - 1; i++)
6650 if (strcasecmp(argv[i], fullname1) == 0 ||
6651 strcasecmp(argv[i], fullname2) == 0) {
6652 sprintf(rval, "%s", argv[i + 1]);
6653 contain = 1;
6654 break;
6655 }
6656
6657 /* Close file... */
6658 if (in != NULL)
6659 fclose(in);
6660
6661 /* Check for missing variables... */
6662 if (!contain) {
6663 if (strlen(defvalue) > 0)
6664 sprintf(rval, "%s", defvalue);
6665 else
6666 ERRMSG("Missing variable %s!\n", fullname1);
6667 }
6668
6669 /* Write info... */
6670 LOG(1, "%s = %s", fullname1, rval);
6671
6672 /* Return values... */
6673 if (value != NULL)
6674 sprintf(value, "%s", rval);
6675 return atof(rval);
6676}
6677
6678/*****************************************************************************/
6679
6681 const ret_t *ret,
6682 const ctl_t *ctl,
6683 const atm_t *atm,
6684 const int *iqa,
6685 const int *ipa,
6686 gsl_matrix *s_a) {
6687
6688 /* Get sizes... */
6689 const size_t n = s_a->size1;
6690
6691 /* Allocate... */
6692 gsl_vector *x_a = gsl_vector_alloc(n);
6693
6694 /* Get sigma vector... */
6695 atm2x(ctl, atm, x_a, NULL, NULL);
6696 for (size_t i = 0; i < n; i++) {
6697 if (iqa[i] == IDXP)
6698 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
6699 if (iqa[i] == IDXT)
6700 gsl_vector_set(x_a, i, ret->err_temp);
6701 for (int ig = 0; ig < ctl->ng; ig++)
6702 if (iqa[i] == IDXQ(ig))
6703 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
6704 for (int iw = 0; iw < ctl->nw; iw++)
6705 if (iqa[i] == IDXK(iw))
6706 gsl_vector_set(x_a, i, ret->err_k[iw]);
6707 if (iqa[i] == IDXCLZ)
6708 gsl_vector_set(x_a, i, ret->err_clz);
6709 if (iqa[i] == IDXCLDZ)
6710 gsl_vector_set(x_a, i, ret->err_cldz);
6711 for (int icl = 0; icl < ctl->ncl; icl++)
6712 if (iqa[i] == IDXCLK(icl))
6713 gsl_vector_set(x_a, i, ret->err_clk[icl]);
6714 if (iqa[i] == IDXSFT)
6715 gsl_vector_set(x_a, i, ret->err_sft);
6716 for (int isf = 0; isf < ctl->nsf; isf++)
6717 if (iqa[i] == IDXSFEPS(isf))
6718 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
6719 }
6720
6721 /* Check standard deviations... */
6722 for (size_t i = 0; i < n; i++)
6723 if (POW2(gsl_vector_get(x_a, i)) <= 0)
6724 ERRMSG("Check a priori data (zero standard deviation)!");
6725
6726 /* Initialize diagonal covariance... */
6727 gsl_matrix_set_zero(s_a);
6728 for (size_t i = 0; i < n; i++)
6729 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
6730
6731 /* Loop over matrix elements... */
6732 for (size_t i = 0; i < n; i++)
6733 for (size_t j = 0; j < n; j++)
6734 if (i != j && iqa[i] == iqa[j]) {
6735
6736 /* Initialize... */
6737 double cz = 0;
6738 double ch = 0;
6739
6740 /* Set correlation lengths for pressure... */
6741 if (iqa[i] == IDXP) {
6742 cz = ret->err_press_cz;
6743 ch = ret->err_press_ch;
6744 }
6745
6746 /* Set correlation lengths for temperature... */
6747 if (iqa[i] == IDXT) {
6748 cz = ret->err_temp_cz;
6749 ch = ret->err_temp_ch;
6750 }
6751
6752 /* Set correlation lengths for volume mixing ratios... */
6753 for (int ig = 0; ig < ctl->ng; ig++)
6754 if (iqa[i] == IDXQ(ig)) {
6755 cz = ret->err_q_cz[ig];
6756 ch = ret->err_q_ch[ig];
6757 }
6758
6759 /* Set correlation lengths for extinction... */
6760 for (int iw = 0; iw < ctl->nw; iw++)
6761 if (iqa[i] == IDXK(iw)) {
6762 cz = ret->err_k_cz[iw];
6763 ch = ret->err_k_ch[iw];
6764 }
6765
6766 /* Compute correlations... */
6767 if (cz > 0 && ch > 0) {
6768
6769 /* Get Cartesian coordinates... */
6770 double x0[3], x1[3];
6771 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
6772 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
6773
6774 /* Compute correlations... */
6775 const double rho =
6776 exp(-DIST(x0, x1) / ch -
6777 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
6778
6779 /* Set covariance... */
6780 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
6781 * gsl_vector_get(x_a, j) * rho);
6782 }
6783 }
6784
6785 /* Free... */
6786 gsl_vector_free(x_a);
6787}
6788
6789/*****************************************************************************/
6790
6792 const ret_t *ret,
6793 const ctl_t *ctl,
6794 const obs_t *obs,
6795 gsl_vector *sig_noise,
6796 gsl_vector *sig_formod,
6797 gsl_vector *sig_eps_inv) {
6798
6799 /* Allocate... */
6800 obs_t *obs_err;
6801 ALLOC(obs_err, obs_t, 1);
6802
6803 /* Get size... */
6804 const size_t m = sig_eps_inv->size;
6805
6806 /* Noise error (always considered in retrieval fit)... */
6807 copy_obs(ctl, obs_err, obs, 1);
6808 for (int ir = 0; ir < obs_err->nr; ir++)
6809 for (int id = 0; id < ctl->nd; id++)
6810 obs_err->rad[id][ir]
6811 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
6812 obs2y(ctl, obs_err, sig_noise, NULL, NULL);
6813
6814 /* Forward model error (always considered in retrieval fit)... */
6815 copy_obs(ctl, obs_err, obs, 1);
6816 for (int ir = 0; ir < obs_err->nr; ir++)
6817 for (int id = 0; id < ctl->nd; id++)
6818 obs_err->rad[id][ir]
6819 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
6820 obs2y(ctl, obs_err, sig_formod, NULL, NULL);
6821
6822 /* Total error... */
6823 for (size_t i = 0; i < m; i++)
6824 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
6825 +
6826 POW2(gsl_vector_get
6827 (sig_formod, i))));
6828
6829 /* Check standard deviations... */
6830 for (size_t i = 0; i < m; i++)
6831 if (gsl_vector_get(sig_eps_inv, i) <= 0)
6832 ERRMSG("Check measurement errors (zero standard deviation)!");
6833
6834 /* Free... */
6835 free(obs_err);
6836}
6837
6838/*****************************************************************************/
6839
6841 const ret_t *ret,
6842 const char *shared_file,
6843 const char *legacy_file,
6844 const char **dirname,
6845 int *profile) {
6846
6847 if (shared_file[0] != '-') {
6848 *dirname = NULL;
6849 *profile = ret->shared_io_profile;
6850 return shared_file;
6851 }
6852
6853 *dirname = ret->dir;
6854 *profile = 0;
6855 return legacy_file;
6856}
6857
6858/*****************************************************************************/
6859
6861 const ret_t *ret,
6862 const char *shared_file,
6863 const char *legacy_file,
6864 const char **dirname,
6865 int *profile) {
6866
6867 if (shared_file[0] != '-') {
6868 *dirname = NULL;
6869 *profile = ret->shared_io_profile;
6870 return shared_file;
6871 }
6872
6873 *dirname = ret->dir;
6874 *profile = 0;
6875 return legacy_file;
6876}
6877
6878/*****************************************************************************/
6879
6881 const ret_t *ret) {
6882
6883 const char *base = shared_io_output_file(ret);
6884 if (base == NULL)
6885 return -1;
6886
6887 char lockfile[LEN];
6888 if (snprintf(lockfile, LEN, "%s.lock", base) >= LEN)
6889 ERRMSG("Lock file name too long!");
6890 int fd = open(lockfile, O_CREAT | O_RDWR, 0666);
6891 if (fd < 0)
6892 ERRMSG("Cannot open lock file!");
6893
6894 struct flock fl;
6895 fl.l_type = F_WRLCK;
6896 fl.l_whence = SEEK_SET;
6897 fl.l_start = 0;
6898 fl.l_len = 0;
6899 if (fcntl(fd, F_SETLKW, &fl) < 0)
6900 ERRMSG("Cannot lock shared output file!");
6901
6902 return fd;
6903}
6904
6905/*****************************************************************************/
6906
6908 int fd) {
6909
6910 if (fd < 0)
6911 return;
6912
6913 struct flock fl;
6914 fl.l_type = F_UNLCK;
6915 fl.l_whence = SEEK_SET;
6916 fl.l_start = 0;
6917 fl.l_len = 0;
6918 if (fcntl(fd, F_SETLK, &fl) < 0)
6919 ERRMSG("Cannot unlock shared output file!");
6920 close(fd);
6921}
6922
6923/*****************************************************************************/
6924
6926 const ret_t *ret) {
6927
6928 if (ret->shared_io_atm_final_file[0] != '-')
6929 return ret->shared_io_atm_final_file;
6930 if (ret->shared_io_obs_final_file[0] != '-')
6931 return ret->shared_io_obs_final_file;
6932 if (ret->shared_io_matrix_cov_apr_file[0] != '-')
6934 if (ret->shared_io_matrix_kernel_file[0] != '-')
6935 return ret->shared_io_matrix_kernel_file;
6936 if (ret->shared_io_matrix_cov_ret_file[0] != '-')
6938 if (ret->shared_io_matrix_corr_file[0] != '-')
6939 return ret->shared_io_matrix_corr_file;
6940 if (ret->shared_io_matrix_gain_file[0] != '-')
6941 return ret->shared_io_matrix_gain_file;
6942 if (ret->shared_io_matrix_avk_file[0] != '-')
6943 return ret->shared_io_matrix_avk_file;
6944 if (ret->shared_io_atm_err_total_file[0] != '-')
6945 return ret->shared_io_atm_err_total_file;
6946 if (ret->shared_io_atm_err_noise_file[0] != '-')
6947 return ret->shared_io_atm_err_noise_file;
6948 if (ret->shared_io_atm_err_formod_file[0] != '-')
6950 if (ret->shared_io_atm_cont_file[0] != '-')
6951 return ret->shared_io_atm_cont_file;
6952 if (ret->shared_io_atm_res_file[0] != '-')
6953 return ret->shared_io_atm_res_file;
6954 return NULL;
6955}
6956
6957/*****************************************************************************/
6958
6960 const los_t *los,
6961 double *tpz,
6962 double *tplon,
6963 double *tplat) {
6964
6965 /* Find minimum altitude... */
6966 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
6967
6968 /* Nadir or zenith... */
6969 if (ip <= 0 || ip >= (size_t) los->np - 1) {
6970 *tpz = los->z[los->np - 1];
6971 *tplon = los->lon[los->np - 1];
6972 *tplat = los->lat[los->np - 1];
6973 }
6974
6975 /* Limb... */
6976 else {
6977
6978 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
6979 const double yy0 = los->z[ip - 1];
6980 const double yy1 = los->z[ip];
6981 const double yy2 = los->z[ip + 1];
6982 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
6983 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
6984 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
6985 const double b = -(yy0 - yy1) / x1 - a * x1;
6986 const double c = yy0;
6987
6988 /* Get tangent point location... */
6989 double dummy, v[3], v0[3], v2[3];
6990 const double x = -b / (2 * a);
6991 *tpz = a * x * x + b * x + c;
6992 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
6993 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
6994 for (int i = 0; i < 3; i++)
6995 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
6996 cart2geo(v, &dummy, tplon, tplat);
6997 }
6998}
6999
7000/*****************************************************************************/
7001
7003 const ctl_t *ctl,
7004 tbl_t *tbl) {
7005
7006 /* Check pointer... */
7007 if (!tbl)
7008 return;
7009
7010 /* Loop over channels and emitters... */
7011 for (int id = 0; id < ctl->nd; id++)
7012 for (int ig = 0; ig < ctl->ng; ig++) {
7013
7014 /* Check number of pressure levels... */
7015 const int np = tbl->np[id][ig];
7016 if (np < 0)
7017 continue;
7018
7019 /* Loop over pressure levels... */
7020 for (int ip = 0; ip < np; ip++) {
7021
7022 /* Loop over temperature levels... */
7023 const int nt = tbl->nt[id][ig][ip];
7024 for (int it = 0; it < nt; it++) {
7025
7026 /* Free... */
7027 free(tbl->logu[id][ig][ip][it]);
7028 free(tbl->logeps[id][ig][ip][it]);
7029 tbl->logu[id][ig][ip][it] = NULL;
7030 tbl->logeps[id][ig][ip][it] = NULL;
7031 }
7032 }
7033 }
7034
7035 /* Free... */
7036 free(tbl);
7037}
7038
7039/*****************************************************************************/
7040
7042 const tbl_t *tbl,
7043 int id,
7044 int ig,
7045 uint8_t *buf,
7046 size_t *bytes_used) {
7047
7048 uint8_t *cur = buf;
7049
7050 /* Pack lookup table... */
7051 int np = tbl->np[id][ig];
7052 memcpy(cur, &np, sizeof(np));
7053 cur += sizeof(np);
7054
7055 memcpy(cur, tbl->p[id][ig], (size_t) np * sizeof(double));
7056 cur += ((size_t) np * sizeof(double));
7057
7058 for (int ip = 0; ip < np; ip++) {
7059 int nt = tbl->nt[id][ig][ip];
7060 memcpy(cur, &nt, sizeof(nt));
7061 cur += sizeof(nt);
7062
7063 memcpy(cur, tbl->t[id][ig][ip], (size_t) nt * sizeof(double));
7064 cur += ((size_t) nt * sizeof(double));
7065
7066 for (int it = 0; it < nt; it++) {
7067 int nu = tbl->nu[id][ig][ip][it];
7068 memcpy(cur, &nu, sizeof(nu));
7069 cur += sizeof(nu);
7070
7071 memcpy(cur, tbl->logu[id][ig][ip][it], (size_t) nu * sizeof(float));
7072 cur += ((size_t) nu * sizeof(float));
7073
7074 memcpy(cur, tbl->logeps[id][ig][ip][it], (size_t) nu * sizeof(float));
7075 cur += ((size_t) nu * sizeof(float));
7076 }
7077 }
7078
7079 /* Pack filter function... */
7080 const int n = tbl->filt_n[id];
7081 memcpy(cur, &n, sizeof(n));
7082 cur += sizeof(n);
7083
7084 memcpy(cur, tbl->filt_nu[id], (size_t) n * sizeof(double));
7085 cur += ((size_t) n * sizeof(double));
7086
7087 memcpy(cur, tbl->filt_f[id], (size_t) n * sizeof(double));
7088 cur += ((size_t) n * sizeof(double));
7089
7090 *bytes_used = (size_t) (cur - buf);
7091}
7092
7093/*****************************************************************************/
7094
7096 const tbl_t *tbl,
7097 int id,
7098 int ig) {
7099
7100 size_t bytes = 0;
7101
7102 /* Size of lookup table... */
7103 const int np = tbl->np[id][ig];
7104 bytes += sizeof(int);
7105 bytes += ((size_t) np * sizeof(double));
7106
7107 for (int ip = 0; ip < np; ip++) {
7108 const int nt = tbl->nt[id][ig][ip];
7109 bytes += sizeof(int);
7110 bytes += ((size_t) nt * sizeof(double));
7111
7112 for (int it = 0; it < nt; it++) {
7113 const int nu = tbl->nu[id][ig][ip][it];
7114 bytes += sizeof(int);
7115 bytes += (2 * (size_t) nu * sizeof(float));
7116 }
7117 }
7118
7119 /* Size of filter function... */
7120 const int n = tbl->filt_n[id];
7121 bytes += sizeof(int);
7122 bytes += (2 * (size_t) n * sizeof(double));
7123
7124 return bytes;
7125}
7126
7127/*****************************************************************************/
7128
7130 tbl_t *tbl,
7131 int id,
7132 int ig,
7133 const uint8_t *buf) {
7134
7135 const uint8_t *cur = buf;
7136
7137 /* Unpack lookup table... */
7138 int np;
7139 memcpy(&np, cur, sizeof(np));
7140 cur += sizeof(np);
7141
7142 if (np < 0 || np > TBLNP)
7143 ERRMSG("np out of range!");
7144 tbl->np[id][ig] = np;
7145
7146 memcpy(tbl->p[id][ig], cur, (size_t) np * sizeof(double));
7147 cur += ((size_t) np * sizeof(double));
7148
7149 for (int ip = 0; ip < np; ip++) {
7150
7151 int nt;
7152 memcpy(&nt, cur, sizeof(nt));
7153 cur += sizeof(nt);
7154
7155 if (nt < 0 || nt > TBLNT)
7156 ERRMSG("nt out of range!");
7157 tbl->nt[id][ig][ip] = nt;
7158
7159 memcpy(tbl->t[id][ig][ip], cur, (size_t) nt * sizeof(double));
7160 cur += ((size_t) nt * sizeof(double));
7161
7162 for (int it = 0; it < nt; it++) {
7163
7164 int nu;
7165 memcpy(&nu, cur, sizeof(nu));
7166 cur += sizeof(nu);
7167
7168 if (nu < 0 || nu > TBLNU)
7169 ERRMSG("nu out of range!");
7170 tbl->nu[id][ig][ip][it] = nu;
7171
7172 ALLOC(tbl->logu[id][ig][ip][it], float,
7173 nu);
7174 ALLOC(tbl->logeps[id][ig][ip][it], float,
7175 nu);
7176
7177 memcpy(tbl->logu[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7178 cur += ((size_t) nu * sizeof(float));
7179
7180 memcpy(tbl->logeps[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7181 cur += ((size_t) nu * sizeof(float));
7182 }
7183 }
7184
7185 /* Unpack filter function... */
7186 int n;
7187 memcpy(&n, cur, sizeof(n));
7188 cur += sizeof(n);
7189
7190 if (n < 2 || n > NSHAPE)
7191 ERRMSG("Missing or invalid filter function (filt_n) in packed table!");
7192 tbl->filt_n[id] = n;
7193
7194 memcpy(tbl->filt_nu[id], cur, (size_t) n * sizeof(double));
7195 cur += ((size_t) n * sizeof(double));
7196
7197 memcpy(tbl->filt_f[id], cur, (size_t) n * sizeof(double));
7198 cur += ((size_t) n * sizeof(double));
7199
7200 return (size_t) (cur - buf);
7201}
7202
7203/*****************************************************************************/
7204
7206 const int year,
7207 const int mon,
7208 const int day,
7209 const int hour,
7210 const int min,
7211 const int sec,
7212 const double remain,
7213 double *jsec) {
7214
7215 struct tm t0, t1;
7216
7217 t0.tm_year = 100;
7218 t0.tm_mon = 0;
7219 t0.tm_mday = 1;
7220 t0.tm_hour = 0;
7221 t0.tm_min = 0;
7222 t0.tm_sec = 0;
7223
7224 t1.tm_year = year - 1900;
7225 t1.tm_mon = mon - 1;
7226 t1.tm_mday = day;
7227 t1.tm_hour = hour;
7228 t1.tm_min = min;
7229 t1.tm_sec = sec;
7230
7231 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
7232}
7233
7234/*****************************************************************************/
7235
7237 const char *name,
7238 const char *group,
7239 int output) {
7240
7241 static char names[NTIMER][100], groups[NTIMER][100];
7242 static double rt_name[NTIMER], rt_group[NTIMER], rt_min[NTIMER],
7243 rt_max[NTIMER], rt_sq[NTIMER], t0, t1;
7244 static int ct_name[NTIMER], iname = -1, igroup = -1, nname, ngroup;
7245
7246 /* Get time... */
7247 t1 = omp_get_wtime();
7248 const double dt = t1 - t0;
7249
7250 /* Accumulate runtime for current timer... */
7251 if (iname >= 0) {
7252 rt_name[iname] += dt;
7253 rt_sq[iname] += POW2(dt);
7254 rt_min[iname] = (ct_name[iname] <= 0 ? dt : MIN(rt_min[iname], dt));
7255 rt_max[iname] = (ct_name[iname] <= 0 ? dt : MAX(rt_max[iname], dt));
7256 ct_name[iname]++;
7257 }
7258 if (igroup >= 0)
7259 rt_group[igroup] += dt;
7260
7261 /* Write summary... */
7262 if (output) {
7263 for (int i = 0; i < nname; i++) {
7264 const double mean = rt_name[i] / ct_name[i];
7265 const double variance = MAX(0.0, rt_sq[i] / ct_name[i] - POW2(mean));
7266 LOG(1,
7267 "TIMER_%s = %.3f s (min= %g s, mean= %g s, stddev= %g s, max= %g s, n= %d)",
7268 names[i], rt_name[i], rt_min[i], mean, sqrt(variance), rt_max[i],
7269 ct_name[i]);
7270 }
7271 for (int i = 0; i < ngroup; i++)
7272 LOG(1, "TIMER_GROUP_%s = %.3f s", groups[i], rt_group[i]);
7273 double total = 0.0;
7274 for (int i = 0; i < nname; i++)
7275 total += rt_name[i];
7276 LOG(1, "TIMER_TOTAL = %.3f s", total);
7277 }
7278
7279 /* Identify next timer name... */
7280 for (iname = 0; iname < nname; iname++)
7281 if (strcasecmp(name, names[iname]) == 0)
7282 break;
7283 for (igroup = 0; igroup < ngroup; igroup++)
7284 if (strcasecmp(group, groups[igroup]) == 0)
7285 break;
7286
7287 /* Add new timer name if needed... */
7288 if (iname >= nname) {
7289 sprintf(names[iname], "%s", name);
7290 if ((++nname) >= NTIMER)
7291 ERRMSG("Too many timers!");
7292 }
7293
7294 /* Add new timer group if needed... */
7295 if (igroup >= ngroup) {
7296 sprintf(groups[igroup], "%s", group);
7297 if ((++ngroup) >= NTIMER)
7298 ERRMSG("Too many groups!");
7299 }
7300
7301 /* Save time stamp for next phase... */
7302 t0 = t1;
7303}
7304
7305/*****************************************************************************/
7306
7308 const char *dirname,
7309 const char *filename,
7310 const ctl_t *ctl,
7311 const atm_t *atm,
7312 int profile) {
7313
7314 /* Set filename... */
7315 char file[LEN];
7316 if (dirname != NULL)
7317 sprintf(file, "%s/%s", dirname, filename);
7318 else
7319 sprintf(file, "%s", filename);
7320
7321 /* Write info... */
7322 LOG(1, "Write atmospheric data: %s", file);
7323
7324 /* Write ASCII data... */
7325 if (ctl->atmfmt == 1)
7326 write_atm_asc(file, ctl, atm);
7327
7328 /* Write binary data... */
7329 else if (ctl->atmfmt == 2)
7330 write_atm_bin(file, ctl, atm);
7331
7332 /* Write netCDF data... */
7333 else if (ctl->atmfmt == 3)
7334 write_atm_nc(file, ctl, atm, profile);
7335
7336 /* Error... */
7337 else
7338 ERRMSG("Unknown file format, check ATMFMT!");
7339
7340 /* Write info... */
7341 double mini, maxi;
7342 LOG(2, "Number of data points: %d", atm->np);
7343 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
7344 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
7345 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
7346 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
7347 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
7348 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
7349 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
7350 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
7351 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
7352 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
7353 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
7354 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
7355 for (int ig = 0; ig < ctl->ng; ig++) {
7356 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
7357 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
7358 }
7359 for (int iw = 0; iw < ctl->nw; iw++) {
7360 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
7361 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
7362 }
7363 if (ctl->ncl > 0) {
7364 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
7365 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
7366 } else
7367 LOG(2, "Cloud layer: none");
7368 if (ctl->nsf > 0) {
7369 LOG(2,
7370 "Surface: T_s = %g K | eps= %g ... %g",
7371 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
7372 } else
7373 LOG(2, "Surface: none");
7374}
7375
7376/*****************************************************************************/
7377
7379 const char *filename,
7380 const ctl_t *ctl,
7381 const atm_t *atm) {
7382
7383 int n = 6;
7384
7385 /* Create file... */
7386 FILE *out;
7387 if (!(out = fopen(filename, "w")))
7388 ERRMSG("Cannot create file!");
7389
7390 /* Write header... */
7391 fprintf(out,
7392 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
7393 "# $2 = altitude [km]\n"
7394 "# $3 = longitude [deg]\n"
7395 "# $4 = latitude [deg]\n"
7396 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
7397 for (int ig = 0; ig < ctl->ng; ig++)
7398 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
7399 ++n, ctl->emitter[ig]);
7400 for (int iw = 0; iw < ctl->nw; iw++)
7401 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
7402 if (ctl->ncl > 0) {
7403 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
7404 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
7405 for (int icl = 0; icl < ctl->ncl; icl++)
7406 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
7407 ++n, ctl->clnu[icl]);
7408 }
7409 if (ctl->nsf > 0) {
7410 fprintf(out, "# $%d = surface temperature [K]\n", ++n);
7411 for (int isf = 0; isf < ctl->nsf; isf++)
7412 fprintf(out, "# $%d = surface emissivity (%.4f cm^-1)\n",
7413 ++n, ctl->sfnu[isf]);
7414 }
7415
7416 /* Write data... */
7417 for (int ip = 0; ip < atm->np; ip++) {
7418 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
7419 fprintf(out, "\n");
7420 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
7421 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
7422 for (int ig = 0; ig < ctl->ng; ig++)
7423 fprintf(out, " %g", atm->q[ig][ip]);
7424 for (int iw = 0; iw < ctl->nw; iw++)
7425 fprintf(out, " %g", atm->k[iw][ip]);
7426 if (ctl->ncl > 0) {
7427 fprintf(out, " %g %g", atm->clz, atm->cldz);
7428 for (int icl = 0; icl < ctl->ncl; icl++)
7429 fprintf(out, " %g", atm->clk[icl]);
7430 }
7431 if (ctl->nsf > 0) {
7432 fprintf(out, " %g", atm->sft);
7433 for (int isf = 0; isf < ctl->nsf; isf++)
7434 fprintf(out, " %g", atm->sfeps[isf]);
7435 }
7436 fprintf(out, "\n");
7437 }
7438
7439 /* Close file... */
7440 fclose(out);
7441}
7442
7443/*****************************************************************************/
7444
7446 const char *filename,
7447 const ctl_t *ctl,
7448 const atm_t *atm) {
7449
7450 /* Create file... */
7451 FILE *out;
7452 if (!(out = fopen(filename, "w")))
7453 ERRMSG("Cannot create file!");
7454
7455 /* Write header... */
7456 FWRITE("ATM1", char,
7457 4,
7458 out);
7459 FWRITE(&ctl->ng, int,
7460 1,
7461 out);
7462 FWRITE(&ctl->nw, int,
7463 1,
7464 out);
7465 FWRITE(&ctl->ncl, int,
7466 1,
7467 out);
7468 FWRITE(&ctl->nsf, int,
7469 1,
7470 out);
7471
7472 /* Write data... */
7473 size_t np = (size_t) atm->np;
7474 FWRITE(&np, size_t,
7475 1,
7476 out);
7477 FWRITE(atm->time, double,
7478 np,
7479 out);
7480 FWRITE(atm->z, double,
7481 np,
7482 out);
7483 FWRITE(atm->lon, double,
7484 np,
7485 out);
7486 FWRITE(atm->lat, double,
7487 np,
7488 out);
7489 FWRITE(atm->p, double,
7490 np,
7491 out);
7492 FWRITE(atm->t, double,
7493 np,
7494 out);
7495 for (int ig = 0; ig < ctl->ng; ig++)
7496 FWRITE(atm->q[ig], double,
7497 np,
7498 out);
7499 for (int iw = 0; iw < ctl->nw; iw++)
7500 FWRITE(atm->k[iw], double,
7501 np,
7502 out);
7503 if (ctl->ncl > 0) {
7504 FWRITE(&atm->clz, double,
7505 1,
7506 out);
7507 FWRITE(&atm->cldz, double,
7508 1,
7509 out);
7510 FWRITE(atm->clk, double,
7511 (size_t) ctl->ncl,
7512 out);
7513 }
7514 if (ctl->nsf > 0) {
7515 FWRITE(&atm->sft, double,
7516 1,
7517 out);
7518 FWRITE(atm->sfeps, double,
7519 (size_t) ctl->nsf,
7520 out);
7521 }
7522
7523 /* Close file... */
7524 fclose(out);
7525}
7526
7527/*****************************************************************************/
7528
7530 const char *filename,
7531 const ctl_t *ctl,
7532 const atm_t *atm,
7533 int profile) {
7534
7535 char longname[LEN], varname[LEN];
7536
7537 int ncid, varid, dim_profile, dim_level;
7538
7539 size_t level_max;
7540
7541 /* Check number of levels... */
7542 if (atm->np < 1 || atm->np > NP)
7543 ERRMSG("Number of levels out of range!");
7544
7545 /* Open or create file... */
7546 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7547 NC(nc_create(filename, NC_NETCDF4, &ncid));
7548
7549 /* Enter define mode... */
7550 int r = nc_redef(ncid);
7551 if (r != NC_NOERR && r != NC_EINDEFINE)
7552 NC(r);
7553
7554 /* Define profile dimension (unlimited)... */
7555 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
7556 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
7557
7558 /* Define level dimension (fixed)... */
7559 if (nc_inq_dimid(ncid, "level", &dim_level) == NC_NOERR) {
7560 NC(nc_inq_dimlen(ncid, dim_level, &level_max));
7561 if (level_max < 1 || level_max > (size_t) NP)
7562 ERRMSG("netCDF dimension level is out of range!");
7563 if ((size_t) atm->np > level_max)
7564 ERRMSG("profile has too many levels!");
7565 } else {
7566 level_max = (size_t) atm->np;
7567 NC(nc_def_dim(ncid, "level", level_max, &dim_level));
7568 }
7569
7570 /* Set dimension IDs... */
7571 int dimids[2] = { dim_profile, dim_level };
7572
7573 /* Tunables for compression/quantization... */
7574 const int deflate_level = 0;
7575 const int quant_digits = 0;
7576
7577 /* Define nlev (1D)... */
7578 if (nc_inq_varid(ncid, "nlev", &varid) != NC_NOERR)
7579 NC_DEF_VAR("nlev", NC_INT, 1, dimids,
7580 "number of vertical levels", "1", 0, 0);
7581
7582 /* Define core variables (2D)... */
7583 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
7584 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
7585 "time in seconds since 2000-01-01, 00:00 UTC", "s",
7586 deflate_level, 0);
7587
7588 if (nc_inq_varid(ncid, "z", &varid) != NC_NOERR)
7589 NC_DEF_VAR("z", NC_DOUBLE, 2, dimids, "altitude", "km", deflate_level, 0);
7590
7591 if (nc_inq_varid(ncid, "lon", &varid) != NC_NOERR)
7592 NC_DEF_VAR("lon", NC_DOUBLE, 2, dimids,
7593 "longitude", "degrees_east", deflate_level, 0);
7594
7595 if (nc_inq_varid(ncid, "lat", &varid) != NC_NOERR)
7596 NC_DEF_VAR("lat", NC_DOUBLE, 2, dimids,
7597 "latitude", "degrees_north", deflate_level, 0);
7598
7599 if (nc_inq_varid(ncid, "p", &varid) != NC_NOERR)
7600 NC_DEF_VAR("p", NC_DOUBLE, 2, dimids,
7601 "pressure", "hPa", deflate_level, quant_digits);
7602
7603 if (nc_inq_varid(ncid, "t", &varid) != NC_NOERR)
7604 NC_DEF_VAR("t", NC_DOUBLE, 2, dimids,
7605 "temperature", "K", deflate_level, quant_digits);
7606
7607 /* Write emitters (2D)... */
7608 for (int ig = 0; ig < ctl->ng; ig++)
7609 if (nc_inq_varid(ncid, ctl->emitter[ig], &varid) != NC_NOERR) {
7610 sprintf(longname, "%s volume mixing ratio", ctl->emitter[ig]);
7611 NC_DEF_VAR(ctl->emitter[ig], NC_DOUBLE, 2, dimids,
7612 longname, "ppv", deflate_level, quant_digits);
7613 }
7614
7615 /* Write extinction (2D)... */
7616 for (int iw = 0; iw < ctl->nw; iw++) {
7617 sprintf(varname, "ext_win_%d", iw);
7618 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7619 sprintf(longname, "extinction (window %d)", iw);
7620 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids,
7621 longname, "km**-1", deflate_level, quant_digits);
7622 }
7623 }
7624
7625 /* Write cloud variables (1D)... */
7626 if (ctl->ncl > 0) {
7627 if (nc_inq_varid(ncid, "cld_z", &varid) != NC_NOERR)
7628 NC_DEF_VAR("cld_z", NC_DOUBLE, 1, dimids,
7629 "cloud layer height", "km", deflate_level, quant_digits);
7630
7631 if (nc_inq_varid(ncid, "cld_dz", &varid) != NC_NOERR)
7632 NC_DEF_VAR("cld_dz", NC_DOUBLE, 1, dimids,
7633 "cloud layer depth", "km", deflate_level, quant_digits);
7634
7635 for (int icl = 0; icl < ctl->ncl; icl++) {
7636 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7637 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7638 sprintf(longname, "cloud layer extinction (%.4f cm^-1)",
7639 ctl->clnu[icl]);
7640 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "km**-1",
7641 deflate_level, quant_digits);
7642 }
7643 }
7644 }
7645
7646 /* Write surface variables (1D)... */
7647 if (ctl->nsf > 0) {
7648 if (nc_inq_varid(ncid, "srf_t", &varid) != NC_NOERR)
7649 NC_DEF_VAR("srf_t", NC_DOUBLE, 1, dimids,
7650 "surface temperature", "K", deflate_level, quant_digits);
7651
7652 for (int isf = 0; isf < ctl->nsf; isf++) {
7653 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7654 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7655 sprintf(longname, "surface emissivity (%.4f cm^-1)", ctl->sfnu[isf]);
7656 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "1",
7657 deflate_level, quant_digits);
7658 }
7659 }
7660 }
7661
7662 /* Leave define mode... */
7663 NC(nc_enddef(ncid));
7664
7665 /* Define hyperslabs... */
7666 size_t start[2] = { (size_t) profile, 0 };
7667 size_t count[2] = { 1, (size_t) atm->np };
7668
7669 /* Write nlev... */
7670 NC_PUT_INT("nlev", &atm->np, 1);
7671
7672 /* Write core variables... */
7673 NC_PUT_DOUBLE("time", atm->time, 1);
7674 NC_PUT_DOUBLE("z", atm->z, 1);
7675 NC_PUT_DOUBLE("lon", atm->lon, 1);
7676 NC_PUT_DOUBLE("lat", atm->lat, 1);
7677 NC_PUT_DOUBLE("p", atm->p, 1);
7678 NC_PUT_DOUBLE("t", atm->t, 1);
7679
7680 /* Write emitters... */
7681 for (int ig = 0; ig < ctl->ng; ig++)
7682 NC_PUT_DOUBLE(ctl->emitter[ig], atm->q[ig], 1);
7683
7684 /* Write extinction... */
7685 for (int iw = 0; iw < ctl->nw; iw++) {
7686 sprintf(varname, "ext_win_%d", iw);
7687 NC_PUT_DOUBLE(varname, atm->k[iw], 1);
7688 }
7689
7690 /* Write cloud variables... */
7691 if (ctl->ncl > 0) {
7692 NC_PUT_DOUBLE("cld_z", &atm->clz, 1);
7693 NC_PUT_DOUBLE("cld_dz", &atm->cldz, 1);
7694 for (int icl = 0; icl < ctl->ncl; icl++) {
7695 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7696 NC_PUT_DOUBLE(varname, &atm->clk[icl], 1);
7697 }
7698 }
7699
7700 /* Write surface variables... */
7701 if (ctl->nsf > 0) {
7702 NC_PUT_DOUBLE("srf_t", &atm->sft, 1);
7703 for (int isf = 0; isf < ctl->nsf; isf++) {
7704 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7705 NC_PUT_DOUBLE(varname, &atm->sfeps[isf], 1);
7706 }
7707 }
7708
7709 /* Close file... */
7710 NC(nc_sync(ncid));
7711 NC(nc_close(ncid));
7712}
7713
7714/*****************************************************************************/
7715
7717 const char *filename,
7718 const ctl_t *ctl,
7719 const atm_t *atm) {
7720
7721 /* Write info... */
7722 LOG(1, "Write RFM data: %s", filename);
7723
7724 /* Create file... */
7725 FILE *out;
7726 if (!(out = fopen(filename, "w")))
7727 ERRMSG("Cannot create file!");
7728
7729 /* Write data... */
7730 fprintf(out, "%d\n", atm->np);
7731 fprintf(out, "*HGT [km]\n");
7732 for (int ip = 0; ip < atm->np; ip++)
7733 fprintf(out, "%g\n", atm->z[ip]);
7734 fprintf(out, "*PRE [mb]\n");
7735 for (int ip = 0; ip < atm->np; ip++)
7736 fprintf(out, "%g\n", atm->p[ip]);
7737 fprintf(out, "*TEM [K]\n");
7738 for (int ip = 0; ip < atm->np; ip++)
7739 fprintf(out, "%g\n", atm->t[ip]);
7740 for (int ig = 0; ig < ctl->ng; ig++) {
7741 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
7742 for (int ip = 0; ip < atm->np; ip++)
7743 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
7744 }
7745 fprintf(out, "*END\n");
7746
7747 /* Close file... */
7748 fclose(out);
7749}
7750
7751/*****************************************************************************/
7752
7754 const char *dirname,
7755 const char *filename,
7756 const ctl_t *ctl,
7757 const gsl_matrix *matrix,
7758 const atm_t *atm,
7759 const obs_t *obs,
7760 const char *rowspace,
7761 const char *colspace,
7762 const char *sort,
7763 int dataset) {
7764
7765 /* Check output flag... */
7766 if (!ctl->write_matrix)
7767 return;
7768
7769 /* Write ASCII data... */
7770 if (ctl->matrixfmt == 1)
7771 write_matrix_asc(dirname, filename, ctl, matrix, atm, obs,
7772 rowspace, colspace, sort);
7773
7774 /* Write binary data... */
7775 else if (ctl->matrixfmt == 2)
7776 write_matrix_bin(dirname, filename, matrix);
7777
7778 /* Write netCDF data... */
7779 else if (ctl->matrixfmt == 3)
7780 write_matrix_nc(dirname, filename, ctl, matrix, atm, obs,
7781 rowspace, colspace, sort, dataset);
7782
7783 /* Error... */
7784 else
7785 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
7786}
7787
7788/*****************************************************************************/
7789
7791 const char *dirname,
7792 const char *filename,
7793 const ctl_t *ctl,
7794 const gsl_matrix *matrix,
7795 const atm_t *atm,
7796 const obs_t *obs,
7797 const char *rowspace,
7798 const char *colspace,
7799 const char *sort) {
7800
7801 char file[LEN], quantity[LEN];
7802
7803 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
7804
7805 size_t i, j, nc, nr;
7806
7807 /* Allocate... */
7808 ALLOC(cida, int,
7809 M);
7810 ALLOC(ciqa, int,
7811 N);
7812 ALLOC(cipa, int,
7813 N);
7814 ALLOC(cira, int,
7815 M);
7816 ALLOC(rida, int,
7817 M);
7818 ALLOC(riqa, int,
7819 N);
7820 ALLOC(ripa, int,
7821 N);
7822 ALLOC(rira, int,
7823 M);
7824
7825 /* Set filename... */
7826 if (dirname != NULL)
7827 sprintf(file, "%s/%s", dirname, filename);
7828 else
7829 sprintf(file, "%s", filename);
7830
7831 /* Write info... */
7832 LOG(1, "Write matrix: %s", file);
7833
7834 /* Create file... */
7835 FILE *out;
7836 if (!(out = fopen(file, "w")))
7837 ERRMSG("Cannot create file!");
7838
7839 /* Write header (row space)... */
7840 if (rowspace[0] == 'y') {
7841
7842 fprintf(out,
7843 "# $1 = Row: index (measurement space)\n"
7844 "# $2 = Row: channel wavenumber [cm^-1]\n"
7845 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7846 "# $4 = Row: view point altitude [km]\n"
7847 "# $5 = Row: view point longitude [deg]\n"
7848 "# $6 = Row: view point latitude [deg]\n");
7849
7850 /* Get number of rows... */
7851 nr = obs2y(ctl, obs, NULL, rida, rira);
7852
7853 } else {
7854
7855 fprintf(out,
7856 "# $1 = Row: index (state space)\n"
7857 "# $2 = Row: name of quantity\n"
7858 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7859 "# $4 = Row: altitude [km]\n"
7860 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
7861
7862 /* Get number of rows... */
7863 nr = atm2x(ctl, atm, NULL, riqa, ripa);
7864 }
7865
7866 /* Write header (column space)... */
7867 if (colspace[0] == 'y') {
7868
7869 fprintf(out,
7870 "# $7 = Col: index (measurement space)\n"
7871 "# $8 = Col: channel wavenumber [cm^-1]\n"
7872 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7873 "# $10 = Col: view point altitude [km]\n"
7874 "# $11 = Col: view point longitude [deg]\n"
7875 "# $12 = Col: view point latitude [deg]\n");
7876
7877 /* Get number of columns... */
7878 nc = obs2y(ctl, obs, NULL, cida, cira);
7879
7880 } else {
7881
7882 fprintf(out,
7883 "# $7 = Col: index (state space)\n"
7884 "# $8 = Col: name of quantity\n"
7885 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7886 "# $10 = Col: altitude [km]\n"
7887 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
7888
7889 /* Get number of columns... */
7890 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
7891 }
7892
7893 /* Write header entry... */
7894 fprintf(out, "# $13 = Matrix element\n\n");
7895
7896 /* Write matrix data... */
7897 i = j = 0;
7898 while (i < nr && j < nc) {
7899
7900 /* Write info about the row... */
7901 if (rowspace[0] == 'y')
7902 fprintf(out, "%d %.4f %.2f %g %g %g",
7903 (int) i, ctl->nu[rida[i]],
7904 obs->time[rira[i]], obs->vpz[rira[i]],
7905 obs->vplon[rira[i]], obs->vplat[rira[i]]);
7906 else {
7907 idx2name(ctl, riqa[i], quantity);
7908 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
7909 atm->time[ripa[i]], atm->z[ripa[i]],
7910 atm->lon[ripa[i]], atm->lat[ripa[i]]);
7911 }
7912
7913 /* Write info about the column... */
7914 if (colspace[0] == 'y')
7915 fprintf(out, " %d %.4f %.2f %g %g %g",
7916 (int) j, ctl->nu[cida[j]],
7917 obs->time[cira[j]], obs->vpz[cira[j]],
7918 obs->vplon[cira[j]], obs->vplat[cira[j]]);
7919 else {
7920 idx2name(ctl, ciqa[j], quantity);
7921 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
7922 atm->time[cipa[j]], atm->z[cipa[j]],
7923 atm->lon[cipa[j]], atm->lat[cipa[j]]);
7924 }
7925
7926 /* Write matrix entry... */
7927 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
7928
7929 /* Set matrix indices... */
7930 if (sort[0] == 'r') {
7931 j++;
7932 if (j >= nc) {
7933 j = 0;
7934 i++;
7935 fprintf(out, "\n");
7936 }
7937 } else {
7938 i++;
7939 if (i >= nr) {
7940 i = 0;
7941 j++;
7942 fprintf(out, "\n");
7943 }
7944 }
7945 }
7946
7947 /* Close file... */
7948 fclose(out);
7949
7950 /* Free... */
7951 free(cida);
7952 free(ciqa);
7953 free(cipa);
7954 free(cira);
7955 free(rida);
7956 free(riqa);
7957 free(ripa);
7958 free(rira);
7959}
7960
7961/*****************************************************************************/
7962
7964 const char *dirname,
7965 const char *filename,
7966 const gsl_matrix *matrix) {
7967
7968 char file[LEN];
7969 const size_t nr = matrix->size1;
7970 const size_t nc = matrix->size2;
7971
7972 /* Set filename... */
7973 if (dirname != NULL)
7974 sprintf(file, "%s/%s", dirname, filename);
7975 else
7976 sprintf(file, "%s", filename);
7977
7978 /* Write info... */
7979 LOG(1, "Write matrix: %s", file);
7980
7981 /* Create file... */
7982 FILE *out;
7983 if (!(out = fopen(file, "w")))
7984 ERRMSG("Cannot create file!");
7985
7986 /* Write header... */
7987 FWRITE("MAT1", char,
7988 4,
7989 out);
7990 FWRITE(&nr, size_t,
7991 1,
7992 out);
7993 FWRITE(&nc, size_t,
7994 1,
7995 out);
7996
7997 /* Write data... */
7998 for (size_t i = 0; i < nr; i++)
7999 for (size_t j = 0; j < nc; j++) {
8000 double value = gsl_matrix_get(matrix, i, j);
8001 FWRITE(&value, double,
8002 1,
8003 out);
8004 }
8005
8006 /* Close file... */
8007 fclose(out);
8008}
8009
8010/*****************************************************************************/
8011
8013 const char *dirname,
8014 const char *filename,
8015 const ctl_t *ctl,
8016 const gsl_matrix *matrix,
8017 const atm_t *atm,
8018 const obs_t *obs,
8019 const char *rowspace,
8020 const char *colspace,
8021 const char *sort,
8022 int dataset) {
8023
8024 char file[LEN];
8025 char quantity[LEN];
8026 const size_t name_strlen = 100;
8027
8028 int ncid, dimid_dataset, dimid_row, dimid_col, dimid_name, varid;
8029 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
8030
8031 size_t nr = matrix->size1, nc = matrix->size2, naux;
8032
8033 /* Allocate metadata index arrays... */
8034 ALLOC(cida, int,
8035 M);
8036 ALLOC(ciqa, int,
8037 N);
8038 ALLOC(cipa, int,
8039 N);
8040 ALLOC(cira, int,
8041 M);
8042 ALLOC(rida, int,
8043 M);
8044 ALLOC(riqa, int,
8045 N);
8046 ALLOC(ripa, int,
8047 N);
8048 ALLOC(rira, int,
8049 M);
8050
8051 /* Set filename... */
8052 if (dirname != NULL)
8053 sprintf(file, "%s/%s", dirname, filename);
8054 else
8055 sprintf(file, "%s", filename);
8056
8057 /* Write info... */
8058 LOG(1, "Write matrix: %s", file);
8059
8060 /* Open or create file... */
8061 if (nc_open(file, NC_WRITE, &ncid) != NC_NOERR)
8062 NC(nc_create(file, NC_NETCDF4, &ncid));
8063
8064 /* Enter define mode... */
8065 int r = nc_redef(ncid);
8066 if (r != NC_NOERR && r != NC_EINDEFINE)
8067 NC(r);
8068
8069 /* Define dataset dimension (unlimited)... */
8070 if (nc_inq_dimid(ncid, "dataset", &dimid_dataset) != NC_NOERR)
8071 NC(nc_def_dim(ncid, "dataset", NC_UNLIMITED, &dimid_dataset));
8072
8073 /* Define row dimension (fixed)... */
8074 if (nc_inq_dimid(ncid, "row", &dimid_row) == NC_NOERR) {
8075 NC(nc_inq_dimlen(ncid, dimid_row, &naux));
8076 if (naux != nr)
8077 ERRMSG("matrix row dimension is incompatible!");
8078 } else
8079 NC(nc_def_dim(ncid, "row", nr, &dimid_row));
8080
8081 /* Define col dimension (fixed)... */
8082 if (nc_inq_dimid(ncid, "col", &dimid_col) == NC_NOERR) {
8083 NC(nc_inq_dimlen(ncid, dimid_col, &naux));
8084 if (naux != nc)
8085 ERRMSG("matrix col dimension is incompatible!");
8086 } else
8087 NC(nc_def_dim(ncid, "col", nc, &dimid_col));
8088
8089 /* Define fixed-length name dimension... */
8090 if (nc_inq_dimid(ncid, "name_strlen", &dimid_name) == NC_NOERR) {
8091 NC(nc_inq_dimlen(ncid, dimid_name, &naux));
8092 if (naux != name_strlen)
8093 ERRMSG("matrix name_strlen dimension is incompatible!");
8094 } else
8095 NC(nc_def_dim(ncid, "name_strlen", name_strlen, &dimid_name));
8096
8097 /* Define variables... */
8098 int dimids3[3] = { dimid_dataset, dimid_row, dimid_col };
8099 int dimids1[1] = { dimid_dataset };
8100 int dimids2_row[2] = { dimid_dataset, dimid_row };
8101 int dimids2_col[2] = { dimid_dataset, dimid_col };
8102 int dimids3_rowname[3] = { dimid_dataset, dimid_row, dimid_name };
8103 int dimids3_colname[3] = { dimid_dataset, dimid_col, dimid_name };
8104 if (nc_inq_varid(ncid, "matrix", &varid) != NC_NOERR) {
8105 NC(nc_def_var(ncid, "matrix", NC_DOUBLE, 3, dimids3, &varid));
8106 NC(nc_put_att_text(ncid, varid, "long_name", 14, "matrix element"));
8107 NC(nc_put_att_text(ncid, varid, "units", 1, "1"));
8108 }
8109 if (nc_inq_varid(ncid, "rowspace", &varid) != NC_NOERR)
8110 NC_DEF_VAR("rowspace", NC_CHAR, 1, dimids1,
8111 "row space selector", "1", 0, 0);
8112 if (nc_inq_varid(ncid, "colspace", &varid) != NC_NOERR)
8113 NC_DEF_VAR("colspace", NC_CHAR, 1, dimids1,
8114 "column space selector", "1", 0, 0);
8115 if (nc_inq_varid(ncid, "sort", &varid) != NC_NOERR)
8116 NC_DEF_VAR("sort", NC_CHAR, 1, dimids1,
8117 "matrix sort selector", "1", 0, 0);
8118 if (nc_inq_varid(ncid, "row_nu", &varid) != NC_NOERR)
8119 NC_DEF_VAR("row_nu", NC_DOUBLE, 2, dimids2_row,
8120 "row channel wavenumber", "cm^-1", 0, 0);
8121 if (nc_inq_varid(ncid, "row_time", &varid) != NC_NOERR)
8122 NC_DEF_VAR("row_time", NC_DOUBLE, 2, dimids2_row,
8123 "row time since 2000-01-01T00:00Z", "s", 0, 0);
8124 if (nc_inq_varid(ncid, "row_z", &varid) != NC_NOERR)
8125 NC_DEF_VAR("row_z", NC_DOUBLE, 2, dimids2_row,
8126 "row altitude", "km", 0, 0);
8127 if (nc_inq_varid(ncid, "row_lon", &varid) != NC_NOERR)
8128 NC_DEF_VAR("row_lon", NC_DOUBLE, 2, dimids2_row,
8129 "row longitude", "degrees_east", 0, 0);
8130 if (nc_inq_varid(ncid, "row_lat", &varid) != NC_NOERR)
8131 NC_DEF_VAR("row_lat", NC_DOUBLE, 2, dimids2_row,
8132 "row latitude", "degrees_north", 0, 0);
8133 if (nc_inq_varid(ncid, "row_quantity", &varid) != NC_NOERR)
8134 NC_DEF_VAR("row_quantity", NC_CHAR, 3, dimids3_rowname,
8135 "row state quantity name", "1", 0, 0);
8136 if (nc_inq_varid(ncid, "col_nu", &varid) != NC_NOERR)
8137 NC_DEF_VAR("col_nu", NC_DOUBLE, 2, dimids2_col,
8138 "column channel wavenumber", "cm^-1", 0, 0);
8139 if (nc_inq_varid(ncid, "col_time", &varid) != NC_NOERR)
8140 NC_DEF_VAR("col_time", NC_DOUBLE, 2, dimids2_col,
8141 "column time since 2000-01-01T00:00Z", "s", 0, 0);
8142 if (nc_inq_varid(ncid, "col_z", &varid) != NC_NOERR)
8143 NC_DEF_VAR("col_z", NC_DOUBLE, 2, dimids2_col,
8144 "column altitude", "km", 0, 0);
8145 if (nc_inq_varid(ncid, "col_lon", &varid) != NC_NOERR)
8146 NC_DEF_VAR("col_lon", NC_DOUBLE, 2, dimids2_col,
8147 "column longitude", "degrees_east", 0, 0);
8148 if (nc_inq_varid(ncid, "col_lat", &varid) != NC_NOERR)
8149 NC_DEF_VAR("col_lat", NC_DOUBLE, 2, dimids2_col,
8150 "column latitude", "degrees_north", 0, 0);
8151 if (nc_inq_varid(ncid, "col_quantity", &varid) != NC_NOERR)
8152 NC_DEF_VAR("col_quantity", NC_CHAR, 3, dimids3_colname,
8153 "column state quantity name", "1", 0, 0);
8154
8155 /* Leave define mode... */
8156 NC(nc_enddef(ncid));
8157
8158 /* Write metadata... */
8159 size_t start1[1] = { (size_t) dataset };
8160 size_t count1[1] = { 1 };
8161 NC(nc_inq_varid(ncid, "rowspace", &varid));
8162 NC(nc_put_vara_text(ncid, varid, start1, count1, rowspace));
8163 NC(nc_inq_varid(ncid, "colspace", &varid));
8164 NC(nc_put_vara_text(ncid, varid, start1, count1, colspace));
8165 NC(nc_inq_varid(ncid, "sort", &varid));
8166 NC(nc_put_vara_text(ncid, varid, start1, count1, sort));
8167
8168 /* Set row and column metadata indices... */
8169 if (rowspace[0] == 'y')
8170 nr = obs2y(ctl, obs, NULL, rida, rira);
8171 else
8172 nr = atm2x(ctl, atm, NULL, riqa, ripa);
8173 if (colspace[0] == 'y')
8174 nc = obs2y(ctl, obs, NULL, cida, cira);
8175 else
8176 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
8177
8178 /* Write row metadata... */
8179 for (size_t i = 0; i < nr; i++) {
8180 const double nu = rowspace[0] == 'y' ? ctl->nu[rida[i]] : GSL_NAN;
8181 const double time =
8182 rowspace[0] == 'y' ? obs->time[rira[i]] : atm->time[ripa[i]];
8183 const double z = rowspace[0] == 'y' ? obs->vpz[rira[i]] : atm->z[ripa[i]];
8184 const double lon =
8185 rowspace[0] == 'y' ? obs->vplon[rira[i]] : atm->lon[ripa[i]];
8186 const double lat =
8187 rowspace[0] == 'y' ? obs->vplat[rira[i]] : atm->lat[ripa[i]];
8188 char qbuf[LEN] = { 0 };
8189 size_t start2[2] = { (size_t) dataset, i };
8190 size_t count2[2] = { 1, 1 };
8191 size_t start3n[3] = { (size_t) dataset, i, 0 };
8192 size_t count3n[3] = { 1, 1, name_strlen };
8193
8194 if (rowspace[0] != 'y') {
8195 idx2name(ctl, riqa[i], quantity);
8196 snprintf(qbuf, LEN, "%s", quantity);
8197 }
8198
8199 NC(nc_inq_varid(ncid, "row_nu", &varid));
8200 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8201 NC(nc_inq_varid(ncid, "row_time", &varid));
8202 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8203 NC(nc_inq_varid(ncid, "row_z", &varid));
8204 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8205 NC(nc_inq_varid(ncid, "row_lon", &varid));
8206 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8207 NC(nc_inq_varid(ncid, "row_lat", &varid));
8208 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8209 NC(nc_inq_varid(ncid, "row_quantity", &varid));
8210 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8211 }
8212
8213 /* Write column metadata... */
8214 for (size_t j = 0; j < nc; j++) {
8215 const double nu = colspace[0] == 'y' ? ctl->nu[cida[j]] : GSL_NAN;
8216 const double time =
8217 colspace[0] == 'y' ? obs->time[cira[j]] : atm->time[cipa[j]];
8218 const double z = colspace[0] == 'y' ? obs->vpz[cira[j]] : atm->z[cipa[j]];
8219 const double lon =
8220 colspace[0] == 'y' ? obs->vplon[cira[j]] : atm->lon[cipa[j]];
8221 const double lat =
8222 colspace[0] == 'y' ? obs->vplat[cira[j]] : atm->lat[cipa[j]];
8223 char qbuf[LEN] = { 0 };
8224 size_t start2[2] = { (size_t) dataset, j };
8225 size_t count2[2] = { 1, 1 };
8226 size_t start3n[3] = { (size_t) dataset, j, 0 };
8227 size_t count3n[3] = { 1, 1, name_strlen };
8228
8229 if (colspace[0] != 'y') {
8230 idx2name(ctl, ciqa[j], quantity);
8231 snprintf(qbuf, LEN, "%s", quantity);
8232 }
8233
8234 NC(nc_inq_varid(ncid, "col_nu", &varid));
8235 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8236 NC(nc_inq_varid(ncid, "col_time", &varid));
8237 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8238 NC(nc_inq_varid(ncid, "col_z", &varid));
8239 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8240 NC(nc_inq_varid(ncid, "col_lon", &varid));
8241 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8242 NC(nc_inq_varid(ncid, "col_lat", &varid));
8243 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8244 NC(nc_inq_varid(ncid, "col_quantity", &varid));
8245 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8246 }
8247
8248 /* Write matrix data... */
8249 NC(nc_inq_varid(ncid, "matrix", &varid));
8250 for (size_t i = 0; i < nr; i++)
8251 for (size_t j = 0; j < nc; j++) {
8252 const double value = gsl_matrix_get(matrix, i, j);
8253 size_t start3[3] = { (size_t) dataset, i, j };
8254 size_t count3[3] = { 1, 1, 1 };
8255 NC(nc_put_vara_double(ncid, varid, start3, count3, &value));
8256 }
8257
8258 /* Close file... */
8259 NC(nc_sync(ncid));
8260 NC(nc_close(ncid));
8261
8262 /* Free... */
8263 free(cida);
8264 free(ciqa);
8265 free(cipa);
8266 free(cira);
8267 free(rida);
8268 free(riqa);
8269 free(ripa);
8270 free(rira);
8271}
8272
8273/*****************************************************************************/
8274
8276 const char *dirname,
8277 const char *filename,
8278 const ctl_t *ctl,
8279 const obs_t *obs,
8280 int profile) {
8281
8282 /* Set filename... */
8283 char file[LEN];
8284 if (dirname != NULL)
8285 sprintf(file, "%s/%s", dirname, filename);
8286 else
8287 sprintf(file, "%s", filename);
8288
8289 /* Write info... */
8290 LOG(1, "Write observation data: %s", file);
8291
8292 /* Write ASCII data... */
8293 if (ctl->obsfmt == 1)
8294 write_obs_asc(file, ctl, obs);
8295
8296 /* Write binary data... */
8297 else if (ctl->obsfmt == 2)
8298 write_obs_bin(file, ctl, obs);
8299
8300 /* Write netCDF data... */
8301 else if (ctl->obsfmt == 3)
8302 write_obs_nc(file, ctl, obs, profile);
8303
8304 /* Write info... */
8305 double mini, maxi;
8306 LOG(2, "Number of ray paths: %d", obs->nr);
8307 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
8308 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
8309 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
8310 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
8311 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
8312 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
8313 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
8314 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
8315 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
8316 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
8317 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
8318 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
8319 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
8320 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
8321 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
8322 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
8323 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
8324 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
8325 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
8326 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
8327 for (int id = 0; id < ctl->nd; id++) {
8328 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
8329 if (ctl->write_bbt) {
8330 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
8331 ctl->nu[id], mini, maxi);
8332 } else {
8333 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
8334 ctl->nu[id], mini, maxi);
8335 }
8336 }
8337 for (int id = 0; id < ctl->nd; id++) {
8338 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
8339 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
8340 ctl->nu[id], mini, maxi);
8341 }
8342}
8343
8344/*****************************************************************************/
8345
8347 const char *filename,
8348 const ctl_t *ctl,
8349 const obs_t *obs) {
8350
8351 int n = 10;
8352
8353 /* Create file... */
8354 FILE *out;
8355 if (!(out = fopen(filename, "w")))
8356 ERRMSG("Cannot create file!");
8357
8358 /* Write header... */
8359 fprintf(out,
8360 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
8361 "# $2 = observer altitude [km]\n"
8362 "# $3 = observer longitude [deg]\n"
8363 "# $4 = observer latitude [deg]\n"
8364 "# $5 = view point altitude [km]\n"
8365 "# $6 = view point longitude [deg]\n"
8366 "# $7 = view point latitude [deg]\n"
8367 "# $8 = tangent point altitude [km]\n"
8368 "# $9 = tangent point longitude [deg]\n"
8369 "# $10 = tangent point latitude [deg]\n");
8370 for (int id = 0; id < ctl->nd; id++)
8371 if (ctl->write_bbt)
8372 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
8373 ++n, ctl->nu[id]);
8374 else
8375 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
8376 ++n, ctl->nu[id]);
8377 for (int id = 0; id < ctl->nd; id++)
8378 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
8379 ctl->nu[id]);
8380
8381 /* Write data... */
8382 for (int ir = 0; ir < obs->nr; ir++) {
8383 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
8384 fprintf(out, "\n");
8385 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
8386 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
8387 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
8388 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
8389 for (int id = 0; id < ctl->nd; id++)
8390 fprintf(out, " %g", obs->rad[id][ir]);
8391 for (int id = 0; id < ctl->nd; id++)
8392 fprintf(out, " %g", obs->tau[id][ir]);
8393 fprintf(out, "\n");
8394 }
8395
8396 /* Close file... */
8397 fclose(out);
8398}
8399
8400/*****************************************************************************/
8401
8403 const char *filename,
8404 const ctl_t *ctl,
8405 const obs_t *obs) {
8406
8407 /* Create file... */
8408 FILE *out;
8409 if (!(out = fopen(filename, "w")))
8410 ERRMSG("Cannot create file!");
8411
8412 /* Write header... */
8413 FWRITE("OBS1", char,
8414 4,
8415 out);
8416 FWRITE(&ctl->nd, int,
8417 1,
8418 out);
8419
8420 /* Write data... */
8421 size_t nr = (size_t) obs->nr;
8422 FWRITE(&nr, size_t,
8423 1,
8424 out);
8425 FWRITE(obs->time, double,
8426 nr,
8427 out);
8428 FWRITE(obs->obsz, double,
8429 nr,
8430 out);
8431 FWRITE(obs->obslon, double,
8432 nr,
8433 out);
8434 FWRITE(obs->obslat, double,
8435 nr,
8436 out);
8437 FWRITE(obs->vpz, double,
8438 nr,
8439 out);
8440 FWRITE(obs->vplon, double,
8441 nr,
8442 out);
8443 FWRITE(obs->vplat, double,
8444 nr,
8445 out);
8446 FWRITE(obs->tpz, double,
8447 nr,
8448 out);
8449 FWRITE(obs->tplon, double,
8450 nr,
8451 out);
8452 FWRITE(obs->tplat, double,
8453 nr,
8454 out);
8455 for (int id = 0; id < ctl->nd; id++)
8456 FWRITE(obs->rad[id], double,
8457 nr,
8458 out);
8459 for (int id = 0; id < ctl->nd; id++)
8460 FWRITE(obs->tau[id], double,
8461 nr,
8462 out);
8463
8464 /* Close file... */
8465 fclose(out);
8466}
8467
8468/*****************************************************************************/
8469
8471 const char *filename,
8472 const ctl_t *ctl,
8473 const obs_t *obs,
8474 const int profile) {
8475
8476 char longname[LEN], varname[LEN];
8477 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
8478
8479 int ncid, varid, dim_profile, dim_ray;
8480
8481 size_t ray_max;
8482
8483 /* Check number of rays... */
8484 if (obs->nr < 1 || obs->nr > NR)
8485 ERRMSG("Number of ray paths out of range!");
8486
8487 /* Open or create file... */
8488 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
8489 NC(nc_create(filename, NC_NETCDF4, &ncid));
8490
8491 /* Enter define mode... */
8492 int r = nc_redef(ncid);
8493 if (r != NC_NOERR && r != NC_EINDEFINE)
8494 NC(r);
8495
8496 /* Define profile dimension (unlimited)... */
8497 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
8498 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
8499
8500 /* Define ray dimension (fixed)... */
8501 if (nc_inq_dimid(ncid, "ray", &dim_ray) == NC_NOERR) {
8502 NC(nc_inq_dimlen(ncid, dim_ray, &ray_max));
8503 if (ray_max < 1 || ray_max > (size_t) NR)
8504 ERRMSG("netCDF dimension ray is out of range!");
8505 if ((size_t) obs->nr > ray_max)
8506 ERRMSG("profile has too many rays!");
8507 } else {
8508 ray_max = (size_t) obs->nr;
8509 NC(nc_def_dim(ncid, "ray", ray_max, &dim_ray));
8510 }
8511
8512 /* Dimension ID array... */
8513 int dimids[2] = { dim_profile, dim_ray };
8514
8515 /* Tunables for compression/quantization... */
8516 const int deflate_level = 0;
8517 const int quant_digits = 0;
8518
8519 /* Define nray (1D over profile)... */
8520 if (nc_inq_varid(ncid, "nray", &varid) != NC_NOERR)
8521 NC_DEF_VAR("nray", NC_INT, 1, dimids, "number of ray paths", "1", 0, 0);
8522
8523 /* Define geometry variables (2D over profile, ray)... */
8524 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
8525 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
8526 "time in seconds since 2000-01-01, 00:00 UTC", "s",
8527 deflate_level, 0);
8528
8529 if (nc_inq_varid(ncid, "obs_z", &varid) != NC_NOERR)
8530 NC_DEF_VAR("obs_z", NC_DOUBLE, 2, dimids,
8531 "observer altitude", "km", deflate_level, 0);
8532
8533 if (nc_inq_varid(ncid, "obs_lon", &varid) != NC_NOERR)
8534 NC_DEF_VAR("obs_lon", NC_DOUBLE, 2, dimids,
8535 "observer longitude", "degrees_east", deflate_level, 0);
8536
8537 if (nc_inq_varid(ncid, "obs_lat", &varid) != NC_NOERR)
8538 NC_DEF_VAR("obs_lat", NC_DOUBLE, 2, dimids,
8539 "observer latitude", "degrees_north", deflate_level, 0);
8540
8541 if (nc_inq_varid(ncid, "vp_z", &varid) != NC_NOERR)
8542 NC_DEF_VAR("vp_z", NC_DOUBLE, 2, dimids,
8543 "view point altitude", "km", deflate_level, 0);
8544
8545 if (nc_inq_varid(ncid, "vp_lon", &varid) != NC_NOERR)
8546 NC_DEF_VAR("vp_lon", NC_DOUBLE, 2, dimids,
8547 "view point longitude", "degrees_east", deflate_level, 0);
8548
8549 if (nc_inq_varid(ncid, "vp_lat", &varid) != NC_NOERR)
8550 NC_DEF_VAR("vp_lat", NC_DOUBLE, 2, dimids,
8551 "view point latitude", "degrees_north", deflate_level, 0);
8552
8553 if (nc_inq_varid(ncid, "tp_z", &varid) != NC_NOERR)
8554 NC_DEF_VAR("tp_z", NC_DOUBLE, 2, dimids,
8555 "tangent point altitude", "km", deflate_level, 0);
8556
8557 if (nc_inq_varid(ncid, "tp_lon", &varid) != NC_NOERR)
8558 NC_DEF_VAR("tp_lon", NC_DOUBLE, 2, dimids,
8559 "tangent point longitude", "degrees_east", deflate_level, 0);
8560
8561 if (nc_inq_varid(ncid, "tp_lat", &varid) != NC_NOERR)
8562 NC_DEF_VAR("tp_lat", NC_DOUBLE, 2, dimids,
8563 "tangent point latitude", "degrees_north", deflate_level, 0);
8564
8565 /* Define radiance/transmittance per channel (2D profile,ray)... */
8566 for (int id = 0; id < ctl->nd; id++) {
8567
8568 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8569 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8570 if (ctl->write_bbt) {
8571 sprintf(longname, "brightness temperature (%.4f cm^-1)", ctl->nu[id]);
8572 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "K",
8573 deflate_level, quant_digits);
8574 } else {
8575 sprintf(longname, "radiance (%.4f cm^-1)", ctl->nu[id]);
8576 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
8577 "W/(m^2 sr cm^-1)", deflate_level, quant_digits);
8578 }
8579 }
8580
8581 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8582 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8583 sprintf(longname, "transmittance (%.4f cm^-1)", ctl->nu[id]);
8584 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "1",
8585 deflate_level, quant_digits);
8586 }
8587 }
8588
8589 /* Leave define mode... */
8590 NC(nc_enddef(ncid));
8591
8592 /* Hyperslabs... */
8593 size_t start[2] = { (size_t) profile, 0 };
8594 size_t count[2] = { 1, (size_t) obs->nr };
8595
8596 /* Write nray(profile)... */
8597 int nr = obs->nr;
8598 NC(nc_inq_varid(ncid, "nray", &varid));
8599 NC(nc_put_vara_int(ncid, varid, start, count, &nr));
8600
8601 /* Write geometry... */
8602 NC(nc_inq_varid(ncid, "time", &varid));
8603 NC(nc_put_vara_double(ncid, varid, start, count, obs->time));
8604
8605 NC(nc_inq_varid(ncid, "obs_z", &varid));
8606 NC(nc_put_vara_double(ncid, varid, start, count, obs->obsz));
8607
8608 NC(nc_inq_varid(ncid, "obs_lon", &varid));
8609 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslon));
8610
8611 NC(nc_inq_varid(ncid, "obs_lat", &varid));
8612 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslat));
8613
8614 NC(nc_inq_varid(ncid, "vp_z", &varid));
8615 NC(nc_put_vara_double(ncid, varid, start, count, obs->vpz));
8616
8617 NC(nc_inq_varid(ncid, "vp_lon", &varid));
8618 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplon));
8619
8620 NC(nc_inq_varid(ncid, "vp_lat", &varid));
8621 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplat));
8622
8623 NC(nc_inq_varid(ncid, "tp_z", &varid));
8624 NC(nc_put_vara_double(ncid, varid, start, count, obs->tpz));
8625
8626 NC(nc_inq_varid(ncid, "tp_lon", &varid));
8627 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplon));
8628
8629 NC(nc_inq_varid(ncid, "tp_lat", &varid));
8630 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplat));
8631
8632 /* Write spectral variables per channel... */
8633 for (int id = 0; id < ctl->nd; id++) {
8634 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8635 NC(nc_inq_varid(ncid, varname, &varid));
8636 NC(nc_put_vara_double(ncid, varid, start, count, obs->rad[id]));
8637
8638 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8639 NC(nc_inq_varid(ncid, varname, &varid));
8640 NC(nc_put_vara_double(ncid, varid, start, count, obs->tau[id]));
8641 }
8642
8643 /* Close file... */
8644 NC(nc_sync(ncid));
8645 NC(nc_close(ncid));
8646}
8647
8648/*****************************************************************************/
8649
8651 const char *filename,
8652 const double *x,
8653 const double *y,
8654 const int n) {
8655
8656 /* Write info... */
8657 LOG(1, "Write shape function: %s", filename);
8658
8659 /* Create file... */
8660 FILE *out;
8661 if (!(out = fopen(filename, "w")))
8662 ERRMSG("Cannot create file!");
8663
8664 /* Write header... */
8665 fprintf(out,
8666 "# $1 = shape function x-value [-]\n"
8667 "# $2 = shape function y-value [-]\n\n");
8668
8669 /* Write data... */
8670 for (int i = 0; i < n; i++)
8671 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
8672
8673 /* Close file... */
8674 fclose(out);
8675}
8676
8677/*****************************************************************************/
8678
8680 const char *quantity,
8681 const ret_t *ret,
8682 const ctl_t *ctl,
8683 const atm_t *atm,
8684 const gsl_matrix *s) {
8685
8686 /* Get sizes... */
8687 const size_t n = s->size1;
8688
8689 /* Allocate... */
8690 atm_t *atm_aux;
8691 ALLOC(atm_aux, atm_t, 1);
8692 gsl_vector *x_aux = gsl_vector_alloc(n);
8693
8694 /* Compute standard deviation... */
8695 for (size_t i = 0; i < n; i++)
8696 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
8697
8698 /* Write to disk... */
8699 char filename[LEN];
8700 const char *dirname;
8701 int profile;
8702 const char *shared_file = "-";
8703 copy_atm(ctl, atm_aux, atm, 1);
8704 x2atm(ctl, x_aux, atm_aux);
8705 if (strcmp(quantity, "total") == 0)
8706 shared_file = ret->shared_io_atm_err_total_file;
8707 else if (strcmp(quantity, "noise") == 0)
8708 shared_file = ret->shared_io_atm_err_noise_file;
8709 else if (strcmp(quantity, "formod") == 0)
8710 shared_file = ret->shared_io_atm_err_formod_file;
8711 sprintf(filename, "atm_err_%s.tab", quantity);
8712 const char *target =
8713 shared_io_output_target(ret, shared_file, filename, &dirname, &profile);
8714 write_atm(dirname, target, ctl, atm_aux, profile);
8715
8716 /* Free... */
8717 gsl_vector_free(x_aux);
8718}
8719
8720/*****************************************************************************/
8721
8723 const ctl_t *ctl,
8724 const tbl_t *tbl) {
8725
8726 /* Loop over emitters and detectors... */
8727 for (int ig = 0; ig < ctl->ng; ig++)
8728 for (int id = 0; id < ctl->nd; id++) {
8729
8730 /* Skip empty tables... */
8731 if (tbl->np[id][ig] <= 0) {
8732 WARN("Skip writing empty emissivity table: emitter=%s, nu=%.4f",
8733 ctl->emitter[ig], ctl->nu[id]);
8734 continue;
8735 }
8736
8737 /* Write ASCII look-up tables... */
8738 if (ctl->tblfmt == 1)
8739 write_tbl_asc(ctl, tbl, id, ig);
8740
8741 /* Write binary look-up tables... */
8742 else if (ctl->tblfmt == 2)
8743 write_tbl_bin(ctl, tbl, id, ig);
8744
8745 /* Write netCDF look-up tables... */
8746 else if (ctl->tblfmt == 3)
8747 write_tbl_nc(ctl, tbl, id, ig);
8748
8749 /* Write info... */
8750 TBL_LOG(tbl, id, ig);
8751 }
8752
8753 /* Write filter functions... */
8754 if (ctl->tblfmt == 1)
8755 for (int id = 0; id < ctl->nd; id++) {
8756 char filename[2 * LEN];
8757 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
8758 write_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
8759 tbl->filt_n[id]);
8760 }
8761}
8762
8763/*****************************************************************************/
8764
8766 const ctl_t *ctl,
8767 const tbl_t *tbl,
8768 const int id,
8769 const int ig) {
8770
8771 /* Set filename... */
8772 char filename[2 * LEN];
8773 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
8774 ctl->nu[id], ctl->emitter[ig]);
8775
8776 /* Create file... */
8777 FILE *out;
8778 if (!(out = fopen(filename, "w"))) {
8779 ERRMSG("Cannot create emissivity table: %s", filename);
8780 } else
8781 LOG(1, "Write emissivity table: %s", filename);
8782
8783 /* Write header... */
8784 fprintf(out,
8785 "# $1 = pressure [hPa]\n"
8786 "# $2 = temperature [K]\n"
8787 "# $3 = column density [molecules/cm^2]\n"
8788 "# $4 = emissivity [-]\n");
8789
8790 /* Save table file... */
8791 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
8792 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
8793 fprintf(out, "\n");
8794 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
8795 fprintf(out, "%g %g %e %e\n",
8796 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
8797 exp(tbl->logu[id][ig][ip][it][iu]),
8798 exp(tbl->logeps[id][ig][ip][it][iu]));
8799 }
8800
8801 /* Close file... */
8802 fclose(out);
8803}
8804
8805/*****************************************************************************/
8806
8808 const ctl_t *ctl,
8809 const tbl_t *tbl,
8810 const int id,
8811 const int ig) {
8812
8813 /* Set filename... */
8814 char filename[2 * LEN];
8815 sprintf(filename, "%s_%.4f_%s.bin",
8816 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
8817
8818 /* Create file... */
8819 FILE *out;
8820 if (!(out = fopen(filename, "w"))) {
8821 ERRMSG("Cannot create emissivity table: %s", filename);
8822 } else
8823 LOG(1, "Write emissivity table: %s", filename);
8824
8825 /* Pack... */
8826 size_t used = 0;
8827 const size_t need = tbl_packed_size(tbl, id, ig);
8828 uint8_t *work = NULL;
8829 ALLOC(work, uint8_t, need);
8830 tbl_pack(tbl, id, ig, work, &used);
8831 if (used != need)
8832 ERRMSG("Internal error: packed size mismatch!");
8833
8834 /* Write length and packed blob... */
8835 FWRITE(&used, size_t,
8836 1,
8837 out);
8838 FWRITE(work, uint8_t, used, out);
8839
8840 /* Close file... */
8841 fclose(out);
8842
8843 /* Free... */
8844 free(work);
8845}
8846
8847/*****************************************************************************/
8848
8850 const ctl_t *ctl,
8851 const tbl_t *tbl,
8852 const int id,
8853 const int ig) {
8854
8855 /* Set filename... */
8856 char filename[2 * LEN];
8857 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
8858
8859 /* Open or create file... */
8860 int ncid;
8861 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR) {
8862 if (nc_create(filename, NC_NETCDF4 | NC_CLOBBER, &ncid) != NC_NOERR)
8863 ERRMSG("Cannot open or create emissivity table: %s", filename);
8864 NC_PUT_ATT_GLOBAL("format_version", "1");
8865 NC_PUT_ATT_GLOBAL("emitter", ctl->emitter[ig]);
8866 NC(nc_enddef(ncid));
8867 }
8868
8869 /* Set variable and dimension name... */
8870 char varname[LEN], dimname[LEN];
8871 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
8872 sprintf(dimname, "len_%.4f", ctl->nu[id]);
8873
8874 /* Write info... */
8875 LOG(1, "Write emissivity table: %s in %s", varname, filename);
8876
8877 /* Allocate work space... */
8878 size_t used = 0;
8879 const size_t need = tbl_packed_size(tbl, id, ig);
8880 uint8_t *work = NULL;
8881 ALLOC(work, uint8_t, need);
8882
8883 /* Pack table... */
8884 tbl_pack(tbl, id, ig, work, &used);
8885 if (used != need)
8886 ERRMSG("Internal error: packed size mismatch!");
8887
8888 /* Prevent overwrite... */
8889 int tmp;
8890 if (nc_inq_varid(ncid, varname, &tmp) == NC_NOERR)
8891 ERRMSG("Table already present!");
8892
8893 /* Add dimension and variable... */
8894 int dimid, varid;
8895 NC(nc_redef(ncid));
8896 NC(nc_def_dim(ncid, dimname, used, &dimid));
8897 int dimids[1] = { dimid };
8898 NC_DEF_VAR(varname, NC_UBYTE, 1, dimids,
8899 "Packed lookup table blob", "1", 0, 0);
8900 NC(nc_enddef(ncid));
8901
8902 /* Write data... */
8903 NC(nc_put_var_uchar(ncid, varid, (const unsigned char *) work));
8904
8905 /* Free... */
8906 free(work);
8907
8908 /* Close file... */
8909 NC(nc_close(ncid));
8910}
8911
8912/*****************************************************************************/
8913
8915 const ctl_t *ctl,
8916 const gsl_vector *x,
8917 atm_t *atm) {
8918
8919 size_t n = 0;
8920
8921 /* Get pressure... */
8922 for (int ip = 0; ip < atm->np; ip++)
8923 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
8924 x2atm_help(&atm->p[ip], x, &n);
8925
8926 /* Get temperature... */
8927 for (int ip = 0; ip < atm->np; ip++)
8928 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
8929 x2atm_help(&atm->t[ip], x, &n);
8930
8931 /* Get volume mixing ratio... */
8932 for (int ig = 0; ig < ctl->ng; ig++)
8933 for (int ip = 0; ip < atm->np; ip++)
8934 if (atm->z[ip] >= ctl->retq_zmin[ig]
8935 && atm->z[ip] <= ctl->retq_zmax[ig])
8936 x2atm_help(&atm->q[ig][ip], x, &n);
8937
8938 /* Get extinction... */
8939 for (int iw = 0; iw < ctl->nw; iw++)
8940 for (int ip = 0; ip < atm->np; ip++)
8941 if (atm->z[ip] >= ctl->retk_zmin[iw]
8942 && atm->z[ip] <= ctl->retk_zmax[iw])
8943 x2atm_help(&atm->k[iw][ip], x, &n);
8944
8945 /* Get cloud data... */
8946 if (ctl->ret_clz)
8947 x2atm_help(&atm->clz, x, &n);
8948 if (ctl->ret_cldz)
8949 x2atm_help(&atm->cldz, x, &n);
8950 if (ctl->ret_clk)
8951 for (int icl = 0; icl < ctl->ncl; icl++)
8952 x2atm_help(&atm->clk[icl], x, &n);
8953
8954 /* Get surface data... */
8955 if (ctl->ret_sft)
8956 x2atm_help(&atm->sft, x, &n);
8957 if (ctl->ret_sfeps)
8958 for (int isf = 0; isf < ctl->nsf; isf++)
8959 x2atm_help(&atm->sfeps[isf], x, &n);
8960}
8961
8962/*****************************************************************************/
8963
8965 double *value,
8966 const gsl_vector *x,
8967 size_t *n) {
8968
8969 /* Get state vector element... */
8970 *value = gsl_vector_get(x, *n);
8971 (*n)++;
8972}
8973
8974/*****************************************************************************/
8975
8977 const ctl_t *ctl,
8978 const gsl_vector *y,
8979 obs_t *obs) {
8980
8981 size_t m = 0;
8982
8983 /* Decompose measurement vector... */
8984 for (int ir = 0; ir < obs->nr; ir++)
8985 for (int id = 0; id < ctl->nd; id++)
8986 if (isfinite(obs->rad[id][ir])) {
8987 obs->rad[id][ir] = gsl_vector_get(y, m);
8988 m++;
8989 }
8990}
double intpol_tbl_eps(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double logu)
Interpolate gas emissivity as a function of column amount.
Definition: jurassic.c:4263
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 compact binary emissivity lookup table.
Definition: jurassic.c:6531
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:1193
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:6086
void write_atm(const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm, int profile)
Write atmospheric data to a file.
Definition: jurassic.c:7307
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:6231
void tbl_pack(const tbl_t *tbl, int id, int ig, uint8_t *buf, size_t *bytes_used)
Pack a lookup table into a contiguous binary buffer.
Definition: jurassic.c:7041
void read_matrix_nc(const char *dirname, const char *filename, gsl_matrix *matrix, int dataset)
Read a numerical matrix from a netCDF file.
Definition: jurassic.c:5761
double cos_sza(const double sec, const double lon, const double lat)
Calculates the cosine of the solar zenith angle.
Definition: jurassic.c:1152
void read_atm_bin(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in binary format.
Definition: jurassic.c:5318
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:8346
void formod_rfm(const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs)
Forward-model radiance and transmittance with the Reference Forward Model (RFM).
Definition: jurassic.c:3707
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4511
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:4164
double ctmo2(const double nu, const double p, const double t)
Compute Oâ‚‚ collision-induced absorption coefficient.
Definition: jurassic.c:3208
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:8470
void tbl_free(const ctl_t *ctl, tbl_t *tbl)
Free lookup table and all internally allocated memory.
Definition: jurassic.c:7002
void write_tbl_asc(const ctl_t *ctl, const tbl_t *tbl, const int id, const int ig)
Write one emissivity lookup table in human-readable ASCII format.
Definition: jurassic.c:8765
void write_tbl_nc(const ctl_t *ctl, const tbl_t *tbl, const int id, const int ig)
Write one packed lookup table to a NetCDF file.
Definition: jurassic.c:8849
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3963
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
Definition: jurassic.c:5516
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:3470
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:5929
int shared_io_lock(const ret_t *ret)
Acquire an exclusive lock for shared retrieval output files.
Definition: jurassic.c:6880
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:4965
void read_obs(const char *dirname, const char *filename, const ctl_t *ctl, obs_t *obs, int profile)
Read observation data from an input file.
Definition: jurassic.c:5810
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:4582
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4481
const char * shared_io_input_target(const ret_t *ret, const char *shared_file, const char *legacy_file, const char **dirname, int *profile)
Resolve retrieval input target for legacy-directory and shared-file modes.
Definition: jurassic.c:6840
void write_matrix_asc(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 an ASCII file.
Definition: jurassic.c:7790
void day2doy(int year, int mon, int day, int *doy)
Convert a calendar date to day-of-year.
Definition: jurassic.c:3358
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:7529
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, int dataset)
Write a fully annotated matrix (e.g., Jacobian or gain matrix) to file.
Definition: jurassic.c:7753
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:7205
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Map retrieval state vector back to atmospheric structure.
Definition: jurassic.c:8914
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:179
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:2087
void write_tbl_bin(const ctl_t *ctl, const tbl_t *tbl, const int id, const int ig)
Write one emissivity lookup table in compact binary format.
Definition: jurassic.c:8807
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:4074
void shared_io_unlock(int fd)
Release a shared retrieval output lock.
Definition: jurassic.c:6907
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:7716
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:6791
void write_obs(const char *dirname, const char *filename, const ctl_t *ctl, const obs_t *obs, int profile)
Write observation data to an output file in ASCII or binary format.
Definition: jurassic.c:8275
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Write emissivity lookup tables to disk.
Definition: jurassic.c:8722
size_t tbl_unpack(tbl_t *tbl, int id, int ig, const uint8_t *buf)
Unpack a lookup table from a contiguous binary buffer.
Definition: jurassic.c:7129
void read_matrix(const char *dirname, const char *filename, const ctl_t *ctl, gsl_matrix *matrix, int dataset)
Read a numerical matrix from a file.
Definition: jurassic.c:5643
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:4049
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
Definition: jurassic.c:3408
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:4654
double intpol_tbl_u(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double logeps)
Interpolate column amount as a function of emissivity.
Definition: jurassic.c:4308
void timer_group(const char *name, const char *group, int output)
Aggregate wall-clock timings for named code phases.
Definition: jurassic.c:7236
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:6959
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:3570
double ctmco2(const double nu, const double p, const double t, const double u)
Compute carbon dioxide continuum (optical depth).
Definition: jurassic.c:1224
void read_atm(const char *dirname, const char *filename, const ctl_t *ctl, atm_t *atm, int profile)
Read atmospheric input data from a file.
Definition: jurassic.c:5193
void write_matrix_nc(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, int dataset)
Write a numerical matrix to a netCDF file.
Definition: jurassic.c:8012
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:7378
void write_matrix_bin(const char *dirname, const char *filename, const gsl_matrix *matrix)
Write a numerical matrix to a binary file.
Definition: jurassic.c:7963
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:3320
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:8402
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:8964
void cart2geo(const double *x, double *z, double *lon, double *lat)
Converts Cartesian coordinates to geographic coordinates.
Definition: jurassic.c:200
void formod_fov(const ctl_t *ctl, obs_t *obs)
Apply field-of-view (FOV) convolution to modeled radiances.
Definition: jurassic.c:3506
void doy2day(int year, int doy, int *mon, int *day)
Convert a day-of-year value to a calendar date.
Definition: jurassic.c:3378
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:4387
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:6007
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize source function lookup tables from emissivity data.
Definition: jurassic.c:4002
void matrix_invert(gsl_matrix *a)
Invert a square matrix, optimized for diagonal or symmetric positive-definite matrices.
Definition: jurassic.c:4552
void read_ret(int argc, char *argv[], const ctl_t *ctl, ret_t *ret)
Read retrieval configuration and error parameters.
Definition: jurassic.c:6143
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:6612
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:8650
void formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
Execute the selected forward model.
Definition: jurassic.c:3421
void read_atm_asc(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in ASCII format.
Definition: jurassic.c:5267
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:6408
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:3868
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:101
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:4354
void read_matrix_asc(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
Definition: jurassic.c:5669
tbl_t * read_tbl(const ctl_t *ctl)
Read emissivity lookup tables from disk.
Definition: jurassic.c:6332
void read_matrix_bin(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from a binary file.
Definition: jurassic.c:5708
void read_tbl_nc_channel(const ctl_t *ctl, tbl_t *tbl, int id, int ig, int ncid)
Read one packed emissivity lookup table from an open NetCDF file.
Definition: jurassic.c:6575
const char * shared_io_output_target(const ret_t *ret, const char *shared_file, const char *legacy_file, const char **dirname, int *profile)
Resolve retrieval output target for legacy-directory and shared-file modes.
Definition: jurassic.c:6860
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:5412
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:3270
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:4627
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:8976
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3903
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:6291
double ctmn2(const double nu, const double p, const double t)
Compute Nâ‚‚ collision-induced absorption coefficient.
Definition: jurassic.c:3139
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:125
void climatology(const ctl_t *ctl, atm_t *atm)
Initializes atmospheric climatology profiles.
Definition: jurassic.c:215
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:3885
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:6680
const char * shared_io_output_file(const ret_t *ret)
Return the primary shared retrieval output file configured for locking.
Definition: jurassic.c:6925
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:8679
size_t tbl_packed_size(const tbl_t *tbl, int id, int ig)
Compute required buffer size (in bytes) for tbl_pack().
Definition: jurassic.c:7095
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4530
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:7445
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:5885
JURASSIC library declarations.
#define N
Maximum size of state vector.
Definition: jurassic.h:278
#define IDXCLZ
Index for cloud layer height.
Definition: jurassic.h:383
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:268
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:224
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
Definition: jurassic.h:448
#define P0
Standard pressure [hPa].
Definition: jurassic.h:219
#define KB
Boltzmann constant [kg m^2/(K s^2)].
Definition: jurassic.h:194
#define POW2(x)
Compute the square of a value.
Definition: jurassic.h:1018
#define NFOV
Number of ray paths used for FOV calculations.
Definition: jurassic.h:293
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
Definition: jurassic.h:601
#define NC_PUT_ATT_GLOBAL(attname, text)
Add a global text attribute to a NetCDF file.
Definition: jurassic.h:895
#define NC(cmd)
Execute a NetCDF command and check for errors.
Definition: jurassic.h:697
#define TBL_LOG(tbl, id, ig)
Log detailed statistics of an emissivity look-up table.
Definition: jurassic.h:1124
#define SELECT_TIMER(id, group)
Switch to a named aggregated timer.
Definition: jurassic.h:1158
#define DOTP(a, b)
Compute dot product of two 3D vectors.
Definition: jurassic.h:558
#define O2
Oxygen concentration.
Definition: jurassic.h:214
#define UMAX
Maximum column density [molecules/cm^2].
Definition: jurassic.h:259
#define MIN(a, b)
Determine the minimum of two values.
Definition: jurassic.h:684
#define IDXCLDZ
Index for cloud layer depth.
Definition: jurassic.h:386
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition: jurassic.h:1325
#define NC_PUT_INT(varname, ptr, hyperslab)
Write integer data to a NetCDF variable.
Definition: jurassic.h:856
#define CLAMP(v, lo, hi)
Clamp a value to a specified range.
Definition: jurassic.h:470
#define RFMNPTS
Maximum number of RFM spectral grid points.
Definition: jurassic.h:343
#define IDXK(iw)
Indices for extinction.
Definition: jurassic.h:380
#define M
Maximum size of measurement vector.
Definition: jurassic.h:273
#define CO2_FIT(TIME)
Climatological CO2 volume mixing ratio as a quadratic function of time.
Definition: jurassic.h:485
#define G0
Standard gravity [m/s^2].
Definition: jurassic.h:184
#define NQ
Maximum number of quantities.
Definition: jurassic.h:313
#define ND
Maximum number of radiance channels.
Definition: jurassic.h:288
#define NA
Avogadro's number.
Definition: jurassic.h:204
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
Definition: jurassic.h:645
#define NSHAPE
Maximum number of shape function grid points.
Definition: jurassic.h:328
#define IDXSFT
Index for surface layer temperature.
Definition: jurassic.h:392
#define RI
Ideal gas constant [J/(mol K)].
Definition: jurassic.h:229
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
Definition: jurassic.h:973
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
Definition: jurassic.h:395
#define IDXCLK(icl)
Indices for cloud layer extinction.
Definition: jurassic.h:389
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
Definition: jurassic.h:1189
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:1292
#define TBLNU
Maximum number of column densities per emissivity curve.
Definition: jurassic.h:363
#define IDXP
Index for pressure.
Definition: jurassic.h:371
#define ALLOC(ptr, type, n)
Allocate memory for an array.
Definition: jurassic.h:418
#define DEG2RAD(deg)
Convert degrees to radians.
Definition: jurassic.h:505
#define TSUN
Effective temperature of the sun [K].
Definition: jurassic.h:249
#define RAD2DEG(rad)
Convert radians to degrees.
Definition: jurassic.h:1047
#define TBLNT
Maximum number of temperatures in emissivity tables.
Definition: jurassic.h:358
#define NP
Maximum number of atmospheric data points.
Definition: jurassic.h:308
#define POW3(x)
Compute the cube of a value.
Definition: jurassic.h:1031
#define NTIMER
Maximum number of aggregated timers.
Definition: jurassic.h:333
#define PLANCK(T, nu)
Compute spectral radiance using Planck’s law.
Definition: jurassic.h:1004
#define REFRAC_EDLEN(p, T)
Compute dry-air refractivity (n - 1) with an Edlen-type relation.
Definition: jurassic.h:1104
#define NG
Maximum number of emitters.
Definition: jurassic.h:298
#define EPSMAX
Maximum emissivity.
Definition: jurassic.h:179
#define LOG(level,...)
Print a log message with a specified logging level.
Definition: jurassic.h:1255
#define TBLNS
Maximum number of source function temperature levels.
Definition: jurassic.h:353
#define NC_DEF_VAR(varname, type, ndims, dims, long_name, units, level, quant)
Define a NetCDF variable with attributes.
Definition: jurassic.h:726
#define N2
Nitrogen concentration.
Definition: jurassic.h:209
#define TBLNP
Maximum number of pressure levels in emissivity tables.
Definition: jurassic.h:348
#define NSF
Maximum number of surface layer spectral grid points.
Definition: jurassic.h:323
#define NCL
Maximum number of cloud layer spectral grid points.
Definition: jurassic.h:283
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
Definition: jurassic.h:523
#define NC_PUT_DOUBLE(varname, ptr, hyperslab)
Write double precision data to a NetCDF variable.
Definition: jurassic.h:809
#define FREAD(ptr, type, size, out)
Read binary data from a file.
Definition: jurassic.h:578
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:624
#define NLOS
Maximum number of LOS points.
Definition: jurassic.h:303
#define NR
Maximum number of ray paths.
Definition: jurassic.h:318
#define IDXQ(ig)
Indices for volume mixing ratios.
Definition: jurassic.h:377
#define TMAX
Maximum temperature for source function [K].
Definition: jurassic.h:239
#define TMIN
Minimum temperature for source function [K].
Definition: jurassic.h:244
#define NW
Maximum number of spectral windows.
Definition: jurassic.h:338
#define MAX(a, b)
Determine the maximum of two values.
Definition: jurassic.h:666
#define IDXT
Index for temperature.
Definition: jurassic.h:374
Atmospheric profile data.
Definition: jurassic.h:1375
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1381
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:1417
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:1402
double lat[NP]
Latitude [deg].
Definition: jurassic.h:1390
double lon[NP]
Longitude [deg].
Definition: jurassic.h:1387
double t[NP]
Temperature [K].
Definition: jurassic.h:1396
double clz
Cloud layer height [km].
Definition: jurassic.h:1405
int np
Number of data points.
Definition: jurassic.h:1378
double cldz
Cloud layer depth [km].
Definition: jurassic.h:1408
double sft
Surface temperature [K].
Definition: jurassic.h:1414
double z[NP]
Altitude [km].
Definition: jurassic.h:1384
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:1411
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:1399
double p[NP]
Pressure [hPa].
Definition: jurassic.h:1393
Control parameters.
Definition: jurassic.h:1428
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1572
int nw
Number of spectral windows.
Definition: jurassic.h:1455
int atmfmt
Atmospheric data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1485
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1530
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:1452
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:1437
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1551
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1470
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1581
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1479
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1578
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1494
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1497
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1539
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1566
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1563
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1554
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1503
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1518
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1584
int window[ND]
Window index of each channel.
Definition: jurassic.h:1458
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1500
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1575
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1545
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1542
int ng
Number of emitters.
Definition: jurassic.h:1431
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1464
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1509
int ig_o2
Emitter index of O2.
Definition: jurassic.h:1446
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1536
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1476
int nd
Number of radiance channels.
Definition: jurassic.h:1449
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1527
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1473
int matrixfmt
Matrix data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1491
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1548
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1461
int ig_n2
Emitter index of N2.
Definition: jurassic.h:1443
int obsfmt
Observation data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1488
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1521
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1506
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1560
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:1434
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1467
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1512
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1557
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:1440
int tblfmt
Look-up table file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1482
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1515
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1569
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1524
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1533
Line-of-sight data.
Definition: jurassic.h:1595
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1601
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1643
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1640
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1616
double sft
Surface temperature [K].
Definition: jurassic.h:1622
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1637
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1604
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1628
int np
Number of LOS points.
Definition: jurassic.h:1598
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1631
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1607
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1646
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1619
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1625
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1634
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1613
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1610
Observation geometry and radiance data.
Definition: jurassic.h:1657
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1693
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1696
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1687
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1675
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1681
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1669
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1672
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1666
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1690
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1678
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1663
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1684
int nr
Number of ray paths.
Definition: jurassic.h:1660
Retrieval control parameters.
Definition: jurassic.h:1709
char shared_io_atm_final_file[LEN]
Optional shared retrieved-atmosphere output file.
Definition: jurassic.h:1796
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1736
double err_press
Pressure error [%].
Definition: jurassic.h:1733
char shared_io_atm_res_file[LEN]
Optional shared averaging-kernel resolution output file.
Definition: jurassic.h:1832
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1763
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1724
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1766
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1745
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1727
char shared_io_matrix_cov_apr_file[LEN]
Optional shared a priori covariance output file.
Definition: jurassic.h:1802
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1721
double err_temp
Temperature error [K].
Definition: jurassic.h:1742
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1754
char shared_io_proflist[LEN]
Optional file containing retrieval profile indices.
Definition: jurassic.h:1787
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1730
double err_clz
Cloud height error [km].
Definition: jurassic.h:1769
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1778
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1775
char shared_io_matrix_gain_file[LEN]
Optional shared gain matrix output file.
Definition: jurassic.h:1814
char shared_io_obs_meas_file[LEN]
Optional shared measured-observation input file.
Definition: jurassic.h:1793
char shared_io_matrix_cov_ret_file[LEN]
Optional shared retrieval covariance output file.
Definition: jurassic.h:1808
char shared_io_matrix_kernel_file[LEN]
Optional shared kernel matrix output file.
Definition: jurassic.h:1805
char shared_io_atm_apr_file[LEN]
Optional shared atmospheric a priori input file.
Definition: jurassic.h:1790
char shared_io_matrix_avk_file[LEN]
Optional shared averaging-kernel matrix output file.
Definition: jurassic.h:1817
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1748
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1715
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1718
char shared_io_atm_err_formod_file[LEN]
Optional shared forward-model retrieval-error output file.
Definition: jurassic.h:1826
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1772
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1739
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1757
char shared_io_matrix_corr_file[LEN]
Optional shared correlation matrix output file.
Definition: jurassic.h:1811
char shared_io_atm_err_total_file[LEN]
Optional shared total retrieval-error output file.
Definition: jurassic.h:1820
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1751
char dir[LEN]
Working directory.
Definition: jurassic.h:1712
char shared_io_atm_err_noise_file[LEN]
Optional shared noise retrieval-error output file.
Definition: jurassic.h:1823
char shared_io_obs_final_file[LEN]
Optional shared retrieved-observation output file.
Definition: jurassic.h:1799
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1781
char shared_io_atm_cont_file[LEN]
Optional shared averaging-kernel contribution output file.
Definition: jurassic.h:1829
int shared_io_profile
Profile index used for shared netCDF retrieval inputs and outputs.
Definition: jurassic.h:1784
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1760
Emissivity look-up tables.
Definition: jurassic.h:1842
float * logu[ND][NG][TBLNP][TBLNT]
Logarithm of column density [molecules/cm^2].
Definition: jurassic.h:1863
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1881
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1854
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1851
int filt_n[ND]
Filter function number of spectral grid points.
Definition: jurassic.h:1869
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1848
float * logeps[ND][NG][TBLNP][TBLNT]
Logarithm of emissivity.
Definition: jurassic.h:1866
double filt_f[ND][NSHAPE]
Filter function values.
Definition: jurassic.h:1875
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1860
double lnp[ND][NG][TBLNP]
Log-pressure [hPa].
Definition: jurassic.h:1857
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1878
double filt_nu[ND][NSHAPE]
Filter function spectral grid points [cm^-1].
Definition: jurassic.h:1872
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1845