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. An exactly zero transmittance represents
3616 a fully opaque segment and must contribute with emissivity one. */
3617 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3618
3619 /* Compute radiance... */
3620 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3621
3622 /* Compute path transmittance... */
3623 tau[id] *= (1 - los->eps[ip][id]);
3624 }
3625 }
3626
3627 /* Check whether LOS hit the ground... */
3628 if (ctl->sftype >= 1 && los->sft > 0) {
3629
3630 /* Add surface emissions... */
3631 double src_sf[ND];
3632 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3633 for (int id = 0; id < ctl->nd; id++)
3634 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3635
3636 /* Check reflectivity... */
3637 int refl = 0;
3638 if (ctl->sftype >= 2)
3639 for (int id = 0; id < ctl->nd; id++)
3640 if (los->sfeps[id] < 1) {
3641 refl = 1;
3642 break;
3643 }
3644
3645 /* Calculate reflection... */
3646 if (refl) {
3647
3648 /* Initialize... */
3649 double tau_refl[ND];
3650 for (int id = 0; id < ctl->nd; id++)
3651 tau_refl[id] = 1;
3652
3653 /* Add down-welling radiance... */
3654 for (int ip = los->np - 1; ip >= 0; ip--)
3655 for (int id = 0; id < ctl->nd; id++) {
3656 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3657 * tau[id] * (1 - los->sfeps[id]);
3658 tau_refl[id] *= (1 - los->eps[ip][id]);
3659 }
3660
3661 /* Add solar term... */
3662 if (ctl->sftype >= 3) {
3663
3664 /* Get cosine of solar zenith angle... */
3665 double cos_sza_val;
3666 if (ctl->sfsza < 0)
3667 cos_sza_val = cos_sza(obs->time[ir],
3668 los->lon[los->np - 1], los->lat[los->np - 1]);
3669 else
3670 cos_sza_val = cos(DEG2RAD(ctl->sfsza));
3671
3672 /* Check validity (avoid division by zero)... */
3673 if (cos_sza_val > 1e-6) {
3674
3675 /* Compute incidence direction cosine... */
3676 double x0[3], x1[3];
3677 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3678 los->lat[los->np - 1], x0);
3679 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3680 for (int i = 0; i < 3; i++)
3681 x1[i] -= x0[i];
3682 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3683
3684 /* Ratio of incident direction to solar zenith direction... */
3685 const double rcos = cosa / cos_sza_val;
3686
3687 /* Add solar radiance contribution... */
3688 for (int id = 0; id < ctl->nd; id++)
3689 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3690 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3691 }
3692 }
3693 }
3694 }
3695
3696 /* Copy results... */
3697 for (int id = 0; id < ctl->nd; id++) {
3698 obs->rad[id][ir] = rad[id];
3699 obs->tau[id][ir] = tau[id];
3700 }
3701
3702 /* Free... */
3703 free(los);
3704}
3705
3706/*****************************************************************************/
3707
3709 const ctl_t *ctl,
3710 const tbl_t *tbl,
3711 const atm_t *atm,
3712 obs_t *obs) {
3713
3714 los_t *los;
3715
3716 char cmd[2 * LEN], rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3717
3718 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3719 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3720
3721 int n, nadir = 0, zenith = 0;
3722
3723 /* Allocate... */
3724 ALLOC(los, los_t, 1);
3725
3726 /* Check observer positions... */
3727 for (int ir = 1; ir < obs->nr; ir++)
3728 if (obs->obsz[ir] != obs->obsz[0]
3729 || obs->obslon[ir] != obs->obslon[0]
3730 || obs->obslat[ir] != obs->obslat[0])
3731 ERRMSG("RFM interface requires identical observer positions!");
3732
3733 /* Check extinction data... */
3734 for (int iw = 0; iw < ctl->nw; iw++)
3735 for (int ip = 0; ip < atm->np; ip++)
3736 if (atm->k[iw][ip] != 0)
3737 ERRMSG("RFM interface cannot handle extinction data!");
3738
3739 /* Get altitude range of atmospheric data... */
3740 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3741
3742 /* Observer within atmosphere? */
3743 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3744 obsz = obs->obsz[0];
3745 strcat(rfmflg, " OBS");
3746 }
3747
3748 /* Determine tangent altitude or air mass factor... */
3749 for (int ir = 0; ir < obs->nr; ir++) {
3750
3751 /* Raytracing... */
3752 raytrace(ctl, atm, obs, los, ir);
3753
3754 /* Nadir or zenith? (air mass factor / secant of zenith angle) */
3755 if (obs->tpz[ir] <= zmin) {
3756
3757 /* Nadir: path intersects the surface. */
3758 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3759 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3760 for (int i = 0; i < 3; i++)
3761 xd[i] = xo[i] - xv[i];
3762 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3763 nadir++;
3764
3765 } else if (obs->tpz[ir] >= zmax - 1e-3 && obs->vpz[ir] > obs->obsz[ir]) {
3766
3767 /* Zenith: upward-looking path leaves the atmosphere at the top boundary. */
3768 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3769 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3770 for (int i = 0; i < 3; i++)
3771 xd[i] = xv[i] - xo[i];
3772 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3773 zenith++;
3774
3775 } else
3776 /* Limb: use tangent altitude. */
3777 z[ir] = obs->tpz[ir];
3778 }
3779 if ((nadir > 0 && nadir < obs->nr)
3780 || (zenith > 0 && zenith < obs->nr)
3781 || (nadir > 0 && zenith > 0))
3782 ERRMSG("Limb, nadir, and zenith not simultaneously possible!");
3783
3784 /* Viewing geometry... */
3785 if (nadir)
3786 strcat(rfmflg, " NAD");
3787 if (zenith)
3788 strcat(rfmflg, " ZEN");
3789
3790 /* Get surface temperature... */
3791 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3792
3793 /* Refraction? */
3794 if (!nadir && !zenith && !ctl->refrac)
3795 strcat(rfmflg, " GEO");
3796
3797 /* Continua? */
3798 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3799 strcat(rfmflg, " CTM");
3800
3801 /* Write atmospheric data file... */
3802 write_atm_rfm("rfm.atm", ctl, atm);
3803
3804 /* Loop over channels... */
3805 for (int id = 0; id < ctl->nd; id++) {
3806
3807 /* Get filter function from lookup table... */
3808 n = tbl->filt_n[id];
3809 if (n <= 0 || n > NSHAPE)
3810 ERRMSG("Missing or invalid filter function in lookup table!");
3811 memcpy(nu, tbl->filt_nu[id], (size_t) n * sizeof(double));
3812 memcpy(f, tbl->filt_f[id], (size_t) n * sizeof(double));
3813
3814 /* Set spectral range... */
3815 nu0 = nu[0];
3816 nu1 = nu[n - 1];
3817
3818 /* Create RFM driver file... */
3819 FILE *out;
3820 if (!(out = fopen("rfm.drv", "w")))
3821 ERRMSG("Cannot create file!");
3822 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3823 fprintf(out, "*FLG\n%s\n", rfmflg);
3824 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3825 fprintf(out, "*GAS\n");
3826 for (int ig = 0; ig < ctl->ng; ig++)
3827 fprintf(out, "%s\n", ctl->emitter[ig]);
3828 fprintf(out, "*ATM\nrfm.atm\n");
3829 fprintf(out, "*TAN\n");
3830 for (int ir = 0; ir < obs->nr; ir++)
3831 fprintf(out, "%g\n", z[ir]);
3832 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3833 if (obsz >= 0)
3834 fprintf(out, "*OBS\n%g\n", obsz);
3835 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3836 fprintf(out, "*XSC\n");
3837 for (int ig = 0; ig < ctl->ng; ig++)
3838 if (ctl->rfmxsc[ig][0] != '-')
3839 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3840 fprintf(out, "*END\n");
3841 fclose(out);
3842
3843 /* Remove temporary files... */
3844 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3845 ERRMSG("Cannot remove temporary files!");
3846
3847 /* Call RFM... */
3848 sprintf(cmd, "echo | %s", ctl->rfmbin);
3849 if (system(cmd))
3850 ERRMSG("Error while calling RFM!");
3851
3852 /* Read data... */
3853 for (int ir = 0; ir < obs->nr; ir++) {
3854 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3855 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3856 }
3857 }
3858
3859 /* Remove temporary files... */
3860 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3861 ERRMSG("Error while removing temporary files!");
3862
3863 /* Free... */
3864 free(los);
3865}
3866
3867/*****************************************************************************/
3868
3870 const ctl_t *ctl,
3871 const tbl_t *tbl,
3872 const double t,
3873 double *src) {
3874
3875 /* Determine index in temperature array... */
3876 const int it = locate_reg(tbl->st, TBLNS, t);
3877
3878 /* Interpolate Planck function value... */
3879 for (int id = 0; id < ctl->nd; id++)
3880 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3881 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3882}
3883
3884/*****************************************************************************/
3885
3887 const double z,
3888 const double lon,
3889 const double lat,
3890 double *x) {
3891
3892 const double radius = z + RE;
3893 const double latrad = lat / 180. * M_PI;
3894 const double lonrad = lon / 180. * M_PI;
3895 const double coslat = cos(latrad);
3896
3897 x[0] = radius * coslat * cos(lonrad);
3898 x[1] = radius * coslat * sin(lonrad);
3899 x[2] = radius * sin(latrad);
3900}
3901
3902/*****************************************************************************/
3903
3905 const ctl_t *ctl,
3906 atm_t *atm) {
3907
3908 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3909
3910 const int ipts = 20;
3911
3912 double dzmin = 1e99, e = 0;
3913
3914 int ipref = 0;
3915
3916 /* Check reference height... */
3917 if (ctl->hydz < 0)
3918 return;
3919
3920 /* Find air parcel next to reference height... */
3921 for (int ip = 0; ip < atm->np; ip++)
3922 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3923 dzmin = fabs(atm->z[ip] - ctl->hydz);
3924 ipref = ip;
3925 }
3926
3927 /* Upper part of profile... */
3928 for (int ip = ipref + 1; ip < atm->np; ip++) {
3929 double mean = 0;
3930 for (int i = 0; i < ipts; i++) {
3931 if (ctl->ig_h2o >= 0)
3932 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3933 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3934 mean += (e * mmh2o + (1 - e) * mmair)
3935 * G0 / RI
3936 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3937 }
3938
3939 /* Compute p(z,T)... */
3940 atm->p[ip] =
3941 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3942 }
3943
3944 /* Lower part of profile... */
3945 for (int ip = ipref - 1; ip >= 0; ip--) {
3946 double mean = 0;
3947 for (int i = 0; i < ipts; i++) {
3948 if (ctl->ig_h2o >= 0)
3949 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3950 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3951 mean += (e * mmh2o + (1 - e) * mmair)
3952 * G0 / RI
3953 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3954 }
3955
3956 /* Compute p(z,T)... */
3957 atm->p[ip] =
3958 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3959 }
3960}
3961
3962/*****************************************************************************/
3963
3965 const ctl_t *ctl,
3966 const int idx,
3967 char *quantity) {
3968
3969 if (idx == IDXP)
3970 sprintf(quantity, "PRESSURE");
3971
3972 if (idx == IDXT)
3973 sprintf(quantity, "TEMPERATURE");
3974
3975 for (int ig = 0; ig < ctl->ng; ig++)
3976 if (idx == IDXQ(ig))
3977 sprintf(quantity, "%s", ctl->emitter[ig]);
3978
3979 for (int iw = 0; iw < ctl->nw; iw++)
3980 if (idx == IDXK(iw))
3981 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3982
3983 if (idx == IDXCLZ)
3984 sprintf(quantity, "CLOUD_HEIGHT");
3985
3986 if (idx == IDXCLDZ)
3987 sprintf(quantity, "CLOUD_DEPTH");
3988
3989 for (int icl = 0; icl < ctl->ncl; icl++)
3990 if (idx == IDXCLK(icl))
3991 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3992
3993 if (idx == IDXSFT)
3994 sprintf(quantity, "SURFACE_TEMPERATURE");
3995
3996 for (int isf = 0; isf < ctl->nsf; isf++)
3997 if (idx == IDXSFEPS(isf))
3998 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3999}
4000
4001/*****************************************************************************/
4002
4004 const ctl_t *ctl,
4005 tbl_t *tbl) {
4006
4007 /* Write info... */
4008 LOG(1, "Initialize source function table...");
4009 LOG(2, "Number of data points: %d", TBLNS);
4010
4011 /* Loop over channels... */
4012 for (int id = 0; id < ctl->nd; id++) {
4013
4014 /* Get minimum grid spacing... */
4015 double dnu = 1.0;
4016 for (int i = 1; i < tbl->filt_n[id]; i++)
4017 dnu = MIN(dnu, tbl->filt_nu[id][i] - tbl->filt_nu[id][i - 1]);
4018
4019 /* Compute source function table... */
4020#pragma omp parallel for default(none) shared(ctl,tbl,id,dnu)
4021 for (int it = 0; it < TBLNS; it++) {
4022
4023 /* Set temperature... */
4024 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
4025
4026 /* Integrate Planck function... */
4027 double fsum = tbl->sr[it][id] = 0;
4028 for (double fnu = tbl->filt_nu[id][0];
4029 fnu <= tbl->filt_nu[id][tbl->filt_n[id] - 1]; fnu += dnu) {
4030 const int i = locate_irr(tbl->filt_nu[id], tbl->filt_n[id], fnu);
4031 const double ff = LIN(tbl->filt_nu[id][i], tbl->filt_f[id][i],
4032 tbl->filt_nu[id][i + 1], tbl->filt_f[id][i + 1],
4033 fnu);
4034 fsum += ff;
4035 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
4036 }
4037 tbl->sr[it][id] /= fsum;
4038 }
4039
4040 /* Write info... */
4041 LOG(2,
4042 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
4043 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
4044 tbl->sr[TBLNS - 1][id]);
4045 }
4046}
4047
4048/*****************************************************************************/
4049
4051 const ctl_t *ctl,
4052 const atm_t *atm,
4053 const double z,
4054 double *p,
4055 double *t,
4056 double *q,
4057 double *k) {
4058
4059 /* Get array index... */
4060 const int ip = locate_irr(atm->z, atm->np, z);
4061
4062 /* Interpolate... */
4063 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
4064 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
4065 for (int ig = 0; ig < ctl->ng; ig++)
4066 q[ig] =
4067 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
4068 for (int iw = 0; iw < ctl->nw; iw++)
4069 k[iw] =
4070 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
4071}
4072
4073/*****************************************************************************/
4074
4076 const ctl_t *ctl,
4077 const tbl_t *tbl,
4078 const los_t *los,
4079 const int ip,
4080 double tau_path[ND][NG],
4081 double tau_seg[ND]) {
4082
4083 double eps, lnp[NG];
4084
4085 /* Precompute log-pressure... */
4086 for (int ig = 0; ig < ctl->ng; ig++)
4087 lnp[ig] = log(los->cgp[ip][ig]);
4088
4089 /* Loop over channels... */
4090 for (int id = 0; id < ctl->nd; id++) {
4091
4092 /* Initialize... */
4093 tau_seg[id] = 1;
4094
4095 /* Loop over emitters.... */
4096 for (int ig = 0; ig < ctl->ng; ig++) {
4097
4098 /* Check size of table (pressure) and column density... */
4099 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4100 eps = 0;
4101
4102 /* Check transmittance... */
4103 else if (tau_path[id][ig] < 1e-9)
4104 eps = 1;
4105
4106 /* Interpolate... */
4107 else {
4108
4109 /* Determine pressure and temperature indices... */
4110 const int ipr =
4111 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
4112 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
4113 los->cgt[ip][ig]);
4114 const int it1 =
4115 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4116 los->cgt[ip][ig]);
4117
4118 /* Check size of table (temperature and column density)... */
4119 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4120 || tbl->nu[id][ig][ipr][it0] < 2
4121 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4122 || tbl->nu[id][ig][ipr + 1][it1] < 2
4123 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4124 eps = 0;
4125
4126 else {
4127
4128 /* Get emissivities of extended path... */
4129 const double logu = log(los->cgu[ip][ig]);
4130 double eps00 = intpol_tbl_eps(tbl, ig, id, ipr, it0, logu);
4131 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, logu);
4132 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, logu);
4133 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, logu);
4134
4135 /* Interpolate with respect to temperature... */
4136 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4137 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4138 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4139 tbl->t[id][ig][ipr + 1][it1 + 1],
4140 eps11, los->cgt[ip][ig]);
4141
4142 /* Interpolate with respect to log-pressure... */
4143 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4144 tbl->lnp[id][ig][ipr + 1], eps11, lnp[ig]);
4145
4146 /* Check emissivity range... */
4147 eps00 = CLAMP(eps00, 0, 1);
4148
4149 /* Determine segment emissivity... */
4150 eps = 1 - (1 - eps00) / tau_path[id][ig];
4151
4152 /* Check emissivity range... */
4153 eps = CLAMP(eps, 0, 1);
4154 }
4155 }
4156
4157 /* Get transmittance of extended path... */
4158 tau_path[id][ig] *= (1 - eps);
4159
4160 /* Get segment transmittance... */
4161 tau_seg[id] *= (1 - eps);
4162 }
4163 }
4164}
4165
4166/*****************************************************************************/
4167
4169 const ctl_t *ctl,
4170 const tbl_t *tbl,
4171 const los_t *los,
4172 const int ip,
4173 double tau_path[ND][NG],
4174 double tau_seg[ND]) {
4175
4176 const double lnp = log(los->p[ip]);
4177
4178 double eps, u;
4179
4180 /* Loop over channels... */
4181 for (int id = 0; id < ctl->nd; id++) {
4182
4183 /* Initialize... */
4184 tau_seg[id] = 1;
4185
4186 /* Loop over emitters.... */
4187 for (int ig = 0; ig < ctl->ng; ig++) {
4188
4189 /* Check size of table (pressure) and column density... */
4190 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4191 eps = 0;
4192
4193 /* Check transmittance... */
4194 else if (tau_path[id][ig] < 1e-9)
4195 eps = 1;
4196
4197 /* Interpolate... */
4198 else {
4199
4200 /* Determine pressure and temperature indices... */
4201 const int ipr =
4202 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4203 const int it0 =
4204 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4205 const int it1 =
4206 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4207 los->t[ip]);
4208
4209 /* Check size of table (temperature and column density)... */
4210 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4211 || tbl->nu[id][ig][ipr][it0] < 2
4212 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4213 || tbl->nu[id][ig][ipr + 1][it1] < 2
4214 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4215 eps = 0;
4216
4217 else {
4218
4219 /* Get emissivities of extended path... */
4220 const double logeps = log(1.0 - tau_path[id][ig]);
4221
4222 u = intpol_tbl_u(tbl, ig, id, ipr, it0, logeps);
4223 double eps00
4224 = intpol_tbl_eps(tbl, ig, id, ipr, it0, log(u + los->u[ip][ig]));
4225
4226 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, logeps);
4227 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1,
4228 log(u + los->u[ip][ig]));
4229
4230 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, logeps);
4231 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1,
4232 log(u + los->u[ip][ig]));
4233
4234 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, logeps);
4235 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1,
4236 log(u + los->u[ip][ig]));
4237
4238 /* Interpolate with respect to temperature... */
4239 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4240 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4241 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4242 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4243
4244 /* Interpolate with respect to log-pressure... */
4245 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4246 tbl->lnp[id][ig][ipr + 1], eps11, lnp);
4247
4248 /* Check emissivity range... */
4249 eps00 = CLAMP(eps00, 0, 1);
4250
4251 /* Determine segment emissivity... */
4252 eps = 1 - (1 - eps00) / tau_path[id][ig];
4253
4254 /* Check emissivity range... */
4255 eps = CLAMP(eps, 0, 1);
4256 }
4257 }
4258
4259 /* Get transmittance of extended path... */
4260 tau_path[id][ig] *= (1 - eps);
4261
4262 /* Get segment transmittance... */
4263 tau_seg[id] *= (1 - eps);
4264 }
4265 }
4266}
4267
4268/*****************************************************************************/
4269
4270inline double intpol_tbl_eps(
4271 const tbl_t *tbl,
4272 const int ig,
4273 const int id,
4274 const int ip,
4275 const int it,
4276 const double logu) {
4277
4278 const int nu = tbl->nu[id][ig][ip][it];
4279 const float *logu_arr = tbl->logu[id][ig][ip][it];
4280 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4281
4282 /* Work in log-space and only convert back when needed... */
4283 const double logu_min = (double) logu_arr[0];
4284 const double logu_max = (double) logu_arr[nu - 1];
4285
4286 /* Lower boundary extrapolation (u < u_min)...
4287 eps ~ eps_min * u/u_min => log(eps) = logeps_min + log(u) - log(u_min) */
4288 if (logu < logu_min) {
4289 const double logeps_min = (double) logeps_arr[0];
4290 return exp(logeps_min + logu - logu_min);
4291 }
4292
4293 /* Upper boundary extrapolation (u > u_max)...
4294 * Assume eps(u) approaches 1 exponentially:
4295 * eps(u) = 1 - exp(a * u), a < 0
4296 * Continuity at (u_max, eps_max) gives
4297 * a = log(1 - eps_max) / u_max.
4298 * Use log1p/expm1 and u/u_max = exp(log(u) - log(u_max)) for stability.
4299 */
4300 if (logu > logu_max) {
4301 const double eps_max = exp((double) logeps_arr[nu - 1]);
4302 const double l1m_eps_max = log1p(-eps_max);
4303 const double r = exp(logu - logu_max);
4304 return -expm1(l1m_eps_max * r);
4305 }
4306
4307 /* Interpolation (log-log using precomputed logs)... */
4308 const int idx = locate_tbl(logu_arr, nu, logu);
4309 return exp(LIN(logu_arr[idx], logeps_arr[idx],
4310 logu_arr[idx + 1], logeps_arr[idx + 1], logu));
4311}
4312
4313/*****************************************************************************/
4314
4315inline double intpol_tbl_u(
4316 const tbl_t *tbl,
4317 const int ig,
4318 const int id,
4319 const int ip,
4320 const int it,
4321 const double logeps) {
4322
4323 const int nu = tbl->nu[id][ig][ip][it];
4324 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4325 const float *logu_arr = tbl->logu[id][ig][ip][it];
4326
4327 /* Work in log-space and only convert back when needed.... */
4328 const double logeps_min = (double) logeps_arr[0];
4329 const double logeps_max = (double) logeps_arr[nu - 1];
4330
4331 /* Lower boundary extrapolation (eps < eps_min)...
4332 u ~ u_min * eps/eps_min => log(u) = log(u_min) + log(eps) - log(eps_min) */
4333 if (logeps < logeps_min) {
4334 const double logu_min = (double) logu_arr[0];
4335 return exp(logu_min + logeps - logeps_min);
4336 }
4337
4338 /* Upper boundary extrapolation (eps > eps_max):
4339 * Invert the exponential tail used for eps(u):
4340 * u = log(1 - eps) / a,
4341 * with a = log(1 - eps_max) / u_max.
4342 * Rewritten as
4343 * u = u_max * log(tau) / log(1 - eps_max)
4344 * for numerical stability (log1p).
4345 */
4346 if (logeps > logeps_max) {
4347 const double u_max = exp((double) logu_arr[nu - 1]);
4348 const double l1m_eps_max = log1p(-exp(logeps_max));
4349 const double logtau = log1p(-exp(logeps));
4350 return u_max * (logtau / l1m_eps_max);
4351 }
4352
4353 /* Interpolation (log-log using precomputed logs)... */
4354 const int idx = locate_tbl(logeps_arr, nu, logeps);
4355 return exp(LIN(logeps_arr[idx], logu_arr[idx],
4356 logeps_arr[idx + 1], logu_arr[idx + 1], logeps));
4357}
4358
4359/*****************************************************************************/
4360
4362 const double jsec,
4363 int *year,
4364 int *mon,
4365 int *day,
4366 int *hour,
4367 int *min,
4368 int *sec,
4369 double *remain) {
4370
4371 struct tm t0, *t1;
4372
4373 t0.tm_year = 100;
4374 t0.tm_mon = 0;
4375 t0.tm_mday = 1;
4376 t0.tm_hour = 0;
4377 t0.tm_min = 0;
4378 t0.tm_sec = 0;
4379
4380 const time_t jsec0 = (time_t) jsec + timegm(&t0);
4381 t1 = gmtime(&jsec0);
4382
4383 *year = t1->tm_year + 1900;
4384 *mon = t1->tm_mon + 1;
4385 *day = t1->tm_mday;
4386 *hour = t1->tm_hour;
4387 *min = t1->tm_min;
4388 *sec = t1->tm_sec;
4389 *remain = jsec - floor(jsec);
4390}
4391
4392/*****************************************************************************/
4393
4395 const ctl_t *ctl,
4396 const tbl_t *tbl,
4397 atm_t *atm,
4398 obs_t *obs,
4399 gsl_matrix *k) {
4400
4401 /* Get sizes... */
4402 const size_t m = k->size1;
4403 const size_t n = k->size2;
4404
4405 /* Allocate... */
4406 gsl_vector *x0 = gsl_vector_alloc(n);
4407 gsl_vector *yy0 = gsl_vector_alloc(m);
4408 int *iqa;
4409 ALLOC(iqa, int,
4410 N);
4411
4412 /* Compute radiance for undisturbed atmospheric data... */
4413 formod(ctl, tbl, atm, obs);
4414
4415 /* Compose vectors... */
4416 atm2x(ctl, atm, x0, iqa, NULL);
4417 obs2y(ctl, obs, yy0, NULL, NULL);
4418
4419 /* Initialize kernel matrix... */
4420 gsl_matrix_set_zero(k);
4421
4422 /* Loop over state vector elements... */
4423#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4424 for (size_t j = 0; j < n; j++) {
4425
4426 /* Allocate... */
4427 atm_t *atm1;
4428 obs_t *obs1;
4429 ALLOC(atm1, atm_t, 1);
4430 ALLOC(obs1, obs_t, 1);
4431 gsl_vector *x1 = gsl_vector_alloc(n);
4432 gsl_vector *yy1 = gsl_vector_alloc(m);
4433
4434 /* Set perturbation size... */
4435 double h;
4436 if (iqa[j] == IDXP)
4437 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4438 else if (iqa[j] == IDXT)
4439 h = 1.0;
4440 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4441 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4442 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4443 h = 1e-4;
4444 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4445 h = 1.0;
4446 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4447 h = 1e-4;
4448 else if (iqa[j] == IDXSFT)
4449 h = 1.0;
4450 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4451 h = 1e-2;
4452 else
4453 ERRMSG("Cannot set perturbation size!");
4454
4455 /* Disturb state vector element... */
4456 gsl_vector_memcpy(x1, x0);
4457 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4458 copy_atm(ctl, atm1, atm, 0);
4459 copy_obs(ctl, obs1, obs, 0);
4460 x2atm(ctl, x1, atm1);
4461
4462 /* Compute radiance for disturbed atmospheric data... */
4463 formod(ctl, tbl, atm1, obs1);
4464
4465 /* Compose measurement vector for disturbed radiance data... */
4466 obs2y(ctl, obs1, yy1, NULL, NULL);
4467
4468 /* Compute derivatives... */
4469 for (size_t i = 0; i < m; i++)
4470 gsl_matrix_set(k, i, j,
4471 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4472
4473 /* Free... */
4474 gsl_vector_free(x1);
4475 gsl_vector_free(yy1);
4476 free(atm1);
4477 free(obs1);
4478 }
4479
4480 /* Free... */
4481 gsl_vector_free(x0);
4482 gsl_vector_free(yy0);
4483 free(iqa);
4484}
4485
4486/*****************************************************************************/
4487
4489 const double *xx,
4490 const int n,
4491 const double x) {
4492
4493 int ilo = 0;
4494 int ihi = n - 1;
4495 int i = (ihi + ilo) >> 1;
4496
4497 if (xx[i] < xx[i + 1])
4498 while (ihi > ilo + 1) {
4499 i = (ihi + ilo) >> 1;
4500 if (xx[i] > x)
4501 ihi = i;
4502 else
4503 ilo = i;
4504 } else
4505 while (ihi > ilo + 1) {
4506 i = (ihi + ilo) >> 1;
4507 if (xx[i] <= x)
4508 ihi = i;
4509 else
4510 ilo = i;
4511 }
4512
4513 return ilo;
4514}
4515
4516/*****************************************************************************/
4517
4519 const double *xx,
4520 const int n,
4521 const double x) {
4522
4523 /* Calculate index... */
4524 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4525
4526 /* Check range... */
4527 if (i < 0)
4528 return 0;
4529 else if (i > n - 2)
4530 return n - 2;
4531 else
4532 return i;
4533}
4534
4535/*****************************************************************************/
4536
4537inline int locate_tbl(
4538 const float *xx,
4539 const int n,
4540 const double x) {
4541
4542 int ilo = 0;
4543 int ihi = n - 1;
4544 int i = (ihi + ilo) >> 1;
4545
4546 while (ihi > ilo + 1) {
4547 i = (ihi + ilo) >> 1;
4548 if (xx[i] > x)
4549 ihi = i;
4550 else
4551 ilo = i;
4552 }
4553
4554 return ilo;
4555}
4556
4557/*****************************************************************************/
4558
4560 gsl_matrix *a) {
4561
4562 size_t diag = 1;
4563
4564 /* Get size... */
4565 const size_t n = a->size1;
4566
4567 /* Check if matrix is diagonal... */
4568 for (size_t i = 0; i < n && diag; i++)
4569 for (size_t j = i + 1; j < n; j++)
4570 if (gsl_matrix_get(a, i, j) != 0) {
4571 diag = 0;
4572 break;
4573 }
4574
4575 /* Quick inversion of diagonal matrix... */
4576 if (diag)
4577 for (size_t i = 0; i < n; i++)
4578 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4579
4580 /* Matrix inversion by means of Cholesky decomposition... */
4581 else {
4582 gsl_linalg_cholesky_decomp(a);
4583 gsl_linalg_cholesky_invert(a);
4584 }
4585}
4586
4587/*****************************************************************************/
4588
4590 const gsl_matrix *a,
4591 const gsl_vector *b,
4592 const int transpose,
4593 gsl_matrix *c) {
4594
4595 /* Set sizes... */
4596 const size_t m = a->size1;
4597 const size_t n = a->size2;
4598
4599 /* Allocate... */
4600 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4601
4602 /* Compute A^T B A... */
4603 if (transpose == 1) {
4604
4605 /* Compute B^1/2 A... */
4606 for (size_t i = 0; i < m; i++)
4607 for (size_t j = 0; j < n; j++)
4608 gsl_matrix_set(aux, i, j,
4609 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4610
4611 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4612 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4613 }
4614
4615 /* Compute A B A^T... */
4616 else if (transpose == 2) {
4617
4618 /* Compute A B^1/2... */
4619 for (size_t i = 0; i < m; i++)
4620 for (size_t j = 0; j < n; j++)
4621 gsl_matrix_set(aux, i, j,
4622 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4623
4624 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4625 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4626 }
4627
4628 /* Free... */
4629 gsl_matrix_free(aux);
4630}
4631
4632/*****************************************************************************/
4633
4634size_t obs2y(
4635 const ctl_t *ctl,
4636 const obs_t *obs,
4637 gsl_vector *y,
4638 int *ida,
4639 int *ira) {
4640
4641 size_t m = 0;
4642
4643 /* Determine measurement vector... */
4644 for (int ir = 0; ir < obs->nr; ir++)
4645 for (int id = 0; id < ctl->nd; id++)
4646 if (isfinite(obs->rad[id][ir])) {
4647 if (y != NULL)
4648 gsl_vector_set(y, m, obs->rad[id][ir]);
4649 if (ida != NULL)
4650 ida[m] = id;
4651 if (ira != NULL)
4652 ira[m] = ir;
4653 m++;
4654 }
4655
4656 return m;
4657}
4658
4659/*****************************************************************************/
4660
4662 ret_t *ret,
4663 ctl_t *ctl,
4664 tbl_t *tbl,
4665 obs_t *obs_meas,
4666 obs_t *obs_i,
4667 atm_t *atm_apr,
4668 atm_t *atm_i,
4669 double *chisq) {
4670
4671 double disq = 0, lmpar = 0.001;
4672
4673 /* ------------------------------------------------------------
4674 Initialize...
4675 ------------------------------------------------------------ */
4676
4677 /* Allocate... */
4678 int *ipa, *iqa;
4679 ALLOC(ipa, int,
4680 N);
4681 ALLOC(iqa, int,
4682 N);
4683
4684 /* Get sizes... */
4685 const size_t m = obs2y(ctl, obs_meas, NULL, NULL, NULL);
4686 const size_t n = atm2x(ctl, atm_apr, NULL, iqa, ipa);
4687 if (m == 0 || n == 0) {
4688 WARN("Check problem definition (m = 0 or n = 0)!");
4689 *chisq = GSL_NAN;
4690 return;
4691 }
4692
4693 /* Allocate... */
4694 gsl_matrix *a = gsl_matrix_alloc(n, n);
4695 gsl_matrix *cov = gsl_matrix_alloc(n, n);
4696 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
4697 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
4698
4699 gsl_vector *b = gsl_vector_alloc(n);
4700 gsl_vector *dx = gsl_vector_alloc(n);
4701 gsl_vector *dy = gsl_vector_alloc(m);
4702 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
4703 gsl_vector *sig_formod = gsl_vector_alloc(m);
4704 gsl_vector *sig_noise = gsl_vector_alloc(m);
4705 gsl_vector *x_a = gsl_vector_alloc(n);
4706 gsl_vector *x_i = gsl_vector_alloc(n);
4707 gsl_vector *x_step = gsl_vector_alloc(n);
4708 gsl_vector *y_aux = gsl_vector_alloc(m);
4709 gsl_vector *y_i = gsl_vector_alloc(m);
4710 gsl_vector *y_m = gsl_vector_alloc(m);
4711
4712 /* Set timer... */
4713 SELECT_TIMER("RET_SETUP", "RETRIEVAL");
4714
4715 /* Set initial state... */
4716 copy_atm(ctl, atm_i, atm_apr, 0);
4717 copy_obs(ctl, obs_i, obs_meas, 0);
4718 formod(ctl, tbl, atm_i, obs_i);
4719
4720 /* Set state vectors and observation vectors... */
4721 atm2x(ctl, atm_apr, x_a, NULL, NULL);
4722 atm2x(ctl, atm_i, x_i, NULL, NULL);
4723 obs2y(ctl, obs_meas, y_m, NULL, NULL);
4724 obs2y(ctl, obs_i, y_i, NULL, NULL);
4725
4726 /* Set inverse a priori covariance S_a^-1... */
4727 set_cov_apr(ret, ctl, atm_apr, iqa, ipa, s_a_inv);
4728 int lockfd = shared_io_lock(ret);
4729 const char *dirname;
4730 int profile;
4731 const char *filename =
4733 "matrix_cov_apr.tab", &dirname, &profile);
4734 write_matrix(dirname, filename, ctl, s_a_inv,
4735 atm_i, obs_i, "x", "x", "r", profile);
4736 shared_io_unlock(lockfd);
4737 matrix_invert(s_a_inv);
4738
4739 /* Get measurement errors... */
4740 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
4741
4742 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4743 gsl_vector_memcpy(dx, x_i);
4744 gsl_vector_sub(dx, x_a);
4745 gsl_vector_memcpy(dy, y_m);
4746 gsl_vector_sub(dy, y_i);
4747
4748 /* Compute cost function... */
4749 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4750
4751 /* Write info... */
4752 LOG(2, "it= %d / chi^2/m= %g", 0, *chisq);
4753
4754 /* Compute initial kernel... */
4755 SELECT_TIMER("RET_KERNEL_INIT", "RETRIEVAL");
4756 kernel(ctl, tbl, atm_i, obs_i, k_i);
4757
4758 /* ------------------------------------------------------------
4759 Levenberg-Marquardt minimization...
4760 ------------------------------------------------------------ */
4761
4762 SELECT_TIMER("RET_ITERATE", "RETRIEVAL");
4763
4764 /* Outer loop... */
4765 for (int it = 1; it <= ret->conv_itmax; it++) {
4766
4767 /* Store current cost function value... */
4768 double chisq_old = *chisq;
4769
4770 /* Compute kernel matrix K_i... */
4771 if (it > 1 && it % ret->kernel_recomp == 0)
4772 kernel(ctl, tbl, atm_i, obs_i, k_i);
4773
4774 /* Compute K_i^T * S_eps^{-1} * K_i ... */
4775 if (it == 1 || it % ret->kernel_recomp == 0)
4776 matrix_product(k_i, sig_eps_inv, 1, cov);
4777
4778 /* Determine b = K_i^T * S_eps^{-1} * dy - S_a^{-1} * dx ... */
4779 for (size_t i = 0; i < m; i++)
4780 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
4781 * POW2(gsl_vector_get(sig_eps_inv, i)));
4782 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
4783 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
4784
4785 /* Inner loop... */
4786 for (int it2 = 0; it2 < 20; it2++) {
4787
4788 /* Compute A = (1 + lmpar) * S_a^{-1} + K_i^T * S_eps^{-1} * K_i ... */
4789 gsl_matrix_memcpy(a, s_a_inv);
4790 gsl_matrix_scale(a, 1 + lmpar);
4791 gsl_matrix_add(a, cov);
4792
4793 /* Solve A * x_step = b by means of Cholesky decomposition... */
4794 gsl_linalg_cholesky_decomp(a);
4795 gsl_linalg_cholesky_solve(a, b, x_step);
4796
4797 /* Update atmospheric state... */
4798 gsl_vector_add(x_i, x_step);
4799 copy_atm(ctl, atm_i, atm_apr, 0);
4800 copy_obs(ctl, obs_i, obs_meas, 0);
4801 x2atm(ctl, x_i, atm_i);
4802
4803 /* Check atmospheric state... */
4804 for (int ip = 0; ip < atm_i->np; ip++) {
4805 atm_i->p[ip] = CLAMP(atm_i->p[ip], 5e-7, 5e4);
4806 atm_i->t[ip] = CLAMP(atm_i->t[ip], 100, 400);
4807 for (int ig = 0; ig < ctl->ng; ig++)
4808 atm_i->q[ig][ip] = CLAMP(atm_i->q[ig][ip], 0, 1);
4809 for (int iw = 0; iw < ctl->nw; iw++)
4810 atm_i->k[iw][ip] = MAX(atm_i->k[iw][ip], 0);
4811 }
4812 atm_i->clz = MAX(atm_i->clz, 0);
4813 atm_i->cldz = MAX(atm_i->cldz, 0.1);
4814 for (int icl = 0; icl < ctl->ncl; icl++)
4815 atm_i->clk[icl] = MAX(atm_i->clk[icl], 0);
4816 atm_i->sft = CLAMP(atm_i->sft, 100, 400);
4817 for (int isf = 0; isf < ctl->nsf; isf++)
4818 atm_i->sfeps[isf] = CLAMP(atm_i->sfeps[isf], 0, 1);
4819
4820 /* Forward calculation... */
4821 formod(ctl, tbl, atm_i, obs_i);
4822 obs2y(ctl, obs_i, y_i, NULL, NULL);
4823
4824 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4825 gsl_vector_memcpy(dx, x_i);
4826 gsl_vector_sub(dx, x_a);
4827 gsl_vector_memcpy(dy, y_m);
4828 gsl_vector_sub(dy, y_i);
4829
4830 /* Compute cost function... */
4831 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4832
4833 /* Modify Levenberg-Marquardt parameter... */
4834 if (*chisq > chisq_old) {
4835 lmpar *= 10;
4836 gsl_vector_sub(x_i, x_step);
4837 } else {
4838 lmpar /= 10;
4839 break;
4840 }
4841 }
4842
4843 /* Write info... */
4844 LOG(2, "it= %d / chi^2/m= %g", it, *chisq);
4845
4846 /* Get normalized step size in state space... */
4847 gsl_blas_ddot(x_step, b, &disq);
4848 disq /= (double) n;
4849
4850 /* Convergence test... */
4851 if ((it == 1 || it % ret->kernel_recomp == 0) && disq < ret->conv_dmin)
4852 break;
4853 }
4854
4855 /* ------------------------------------------------------------
4856 Analysis of retrieval results...
4857 ------------------------------------------------------------ */
4858
4859 /* Check if error analysis is requested... */
4860 if (ret->err_ana) {
4861
4862 SELECT_TIMER("RET_DIAGNOSTICS", "OUTPUT");
4863
4864 /* Store results... */
4865 lockfd = shared_io_lock(ret);
4867 "atm_final.tab", &dirname, &profile);
4868 write_atm(dirname, filename, ctl, atm_i, profile);
4870 "obs_final.tab", &dirname, &profile);
4871 write_obs(dirname, filename, ctl, obs_i, profile);
4872 filename =
4874 "matrix_kernel.tab", &dirname, &profile);
4875 write_matrix(dirname, filename, ctl, k_i,
4876 atm_i, obs_i, "y", "x", "r", profile);
4877
4878 /* Allocate... */
4879 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
4880 gsl_matrix *corr = gsl_matrix_alloc(n, n);
4881 gsl_matrix *gain = gsl_matrix_alloc(n, m);
4882
4883 /* Compute inverse retrieval covariance...
4884 cov^{-1} = S_a^{-1} + K_i^T * S_eps^{-1} * K_i */
4885 matrix_product(k_i, sig_eps_inv, 1, cov);
4886 gsl_matrix_add(cov, s_a_inv);
4887
4888 /* Compute retrieval covariance... */
4889 matrix_invert(cov);
4890 filename =
4892 "matrix_cov_ret.tab", &dirname, &profile);
4893 write_matrix(dirname, filename, ctl, cov,
4894 atm_i, obs_i, "x", "x", "r", profile);
4895 write_stddev("total", ret, ctl, atm_i, cov);
4896
4897 /* Compute correlation matrix... */
4898 for (size_t i = 0; i < n; i++)
4899 for (size_t j = 0; j < n; j++)
4900 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
4901 / sqrt(gsl_matrix_get(cov, i, i))
4902 / sqrt(gsl_matrix_get(cov, j, j)));
4904 "matrix_corr.tab", &dirname, &profile);
4905 write_matrix(dirname, filename, ctl, corr,
4906 atm_i, obs_i, "x", "x", "r", profile);
4907
4908 /* Compute gain matrix...
4909 G = cov * K^T * S_eps^{-1} */
4910 for (size_t i = 0; i < n; i++)
4911 for (size_t j = 0; j < m; j++)
4912 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
4913 * POW2(gsl_vector_get(sig_eps_inv, j)));
4914 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
4916 "matrix_gain.tab", &dirname, &profile);
4917 write_matrix(dirname, filename, ctl, gain,
4918 atm_i, obs_i, "x", "y", "c", profile);
4919
4920 /* Compute retrieval error due to noise... */
4921 matrix_product(gain, sig_noise, 2, a);
4922 write_stddev("noise", ret, ctl, atm_i, a);
4923
4924 /* Compute retrieval error due to forward model errors... */
4925 matrix_product(gain, sig_formod, 2, a);
4926 write_stddev("formod", ret, ctl, atm_i, a);
4927
4928 /* Compute averaging kernel matrix
4929 A = G * K ... */
4930 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
4932 "matrix_avk.tab", &dirname, &profile);
4933 write_matrix(dirname, filename, ctl, a,
4934 atm_i, obs_i, "x", "x", "r", profile);
4935
4936 /* Analyze averaging kernel matrix... */
4937 analyze_avk(ret, ctl, atm_i, iqa, ipa, a);
4938 shared_io_unlock(lockfd);
4939
4940 /* Free... */
4941 gsl_matrix_free(auxnm);
4942 gsl_matrix_free(corr);
4943 gsl_matrix_free(gain);
4944 }
4945
4946 /* ------------------------------------------------------------
4947 Finalize...
4948 ------------------------------------------------------------ */
4949
4950 gsl_matrix_free(a);
4951 gsl_matrix_free(cov);
4952 gsl_matrix_free(k_i);
4953 gsl_matrix_free(s_a_inv);
4954
4955 gsl_vector_free(b);
4956 gsl_vector_free(dx);
4957 gsl_vector_free(dy);
4958 gsl_vector_free(sig_eps_inv);
4959 gsl_vector_free(sig_formod);
4960 gsl_vector_free(sig_noise);
4961 gsl_vector_free(x_a);
4962 gsl_vector_free(x_i);
4963 gsl_vector_free(x_step);
4964 gsl_vector_free(y_aux);
4965 gsl_vector_free(y_i);
4966 gsl_vector_free(y_m);
4967
4968 free(ipa);
4969 free(iqa);
4970}
4971
4972/*****************************************************************************/
4973
4975 const ctl_t *ctl,
4976 const atm_t *atm,
4977 obs_t *obs,
4978 los_t *los,
4979 const int ir) {
4980
4981 const double h = 0.02, zrefrac = 60;
4982
4983 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4984 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4985
4986 int stop = 0;
4987
4988 /* Initialize... */
4989 los->np = 0;
4990 los->sft = -999;
4991 obs->tpz[ir] = obs->vpz[ir];
4992 obs->tplon[ir] = obs->vplon[ir];
4993 obs->tplat[ir] = obs->vplat[ir];
4994
4995 /* Get altitude range of atmospheric data... */
4996 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4997
4998 /* Check observer altitude... */
4999 if (obs->obsz[ir] < zmin)
5000 ERRMSG("Observer below surface!");
5001
5002 /* Determine Cartesian coordinates for observer and view point... */
5003 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
5004 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
5005
5006 /* Determine initial tangent vector... */
5007 for (int i = 0; i < 3; i++)
5008 ex0[i] = xvp[i] - xobs[i];
5009 norm = NORM(ex0);
5010 for (int i = 0; i < 3; i++)
5011 ex0[i] /= norm;
5012
5013 /* Observer within atmosphere... */
5014 for (int i = 0; i < 3; i++)
5015 x[i] = xobs[i];
5016
5017 /* Observer above atmosphere (search entry point)... */
5018 if (obs->obsz[ir] > zmax) {
5019 double dmax = norm, dmin = 0;
5020 while (fabs(dmin - dmax) > 0.001) {
5021 const double d = (dmax + dmin) / 2;
5022 for (int i = 0; i < 3; i++)
5023 x[i] = xobs[i] + d * ex0[i];
5024 cart2geo(x, &z, &lon, &lat);
5025 if (z <= zmax && z > zmax - 0.001)
5026 break;
5027 if (z < zmax - 0.0005)
5028 dmax = d;
5029 else
5030 dmin = d;
5031 }
5032 }
5033
5034 /* Ray-tracing... */
5035 while (1) {
5036
5037 /* Set step length... */
5038 double ds = ctl->rayds;
5039 if (ctl->raydz > 0) {
5040 norm = NORM(x);
5041 for (int i = 0; i < 3; i++)
5042 xh[i] = x[i] / norm;
5043 const double cosa = fabs(DOTP(ex0, xh));
5044 if (cosa != 0)
5045 ds = MIN(ctl->rayds, ctl->raydz / cosa);
5046 }
5047
5048 /* Determine geolocation... */
5049 cart2geo(x, &z, &lon, &lat);
5050
5051 /* Check if LOS hits the ground or has left atmosphere... */
5052 if (z < zmin || z > zmax) {
5053 stop = (z < zmin ? 2 : 1);
5054 const double frac =
5055 ((z <
5056 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
5057 1]);
5058 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
5059 los->lat[los->np - 1], xh);
5060 for (int i = 0; i < 3; i++)
5061 x[i] = xh[i] + frac * (x[i] - xh[i]);
5062 cart2geo(x, &z, &lon, &lat);
5063 los->ds[los->np - 1] = ds * frac;
5064 ds = 0;
5065 }
5066
5067 /* Interpolate atmospheric data... */
5068 intpol_atm(ctl, atm, z, &p, &t, q, k);
5069
5070 /* Abort before writing beyond the fixed LOS scratch buffers... */
5071 if (los->np >= NLOS)
5072 ERRMSG("Too many LOS points!");
5073
5074 /* Save data... */
5075 los->lon[los->np] = lon;
5076 los->lat[los->np] = lat;
5077 los->z[los->np] = z;
5078 los->p[los->np] = p;
5079 los->t[los->np] = t;
5080 for (int ig = 0; ig < ctl->ng; ig++)
5081 los->q[los->np][ig] = q[ig];
5082 for (int id = 0; id < ctl->nd; id++)
5083 los->k[los->np][id] = k[ctl->window[id]];
5084 los->ds[los->np] = ds;
5085
5086 /* Add cloud extinction... */
5087 if (ctl->ncl > 0 && atm->cldz > 0) {
5088 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
5089 for (int id = 0; id < ctl->nd; id++) {
5090 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
5091 los->k[los->np][id]
5092 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
5093 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
5094 }
5095 }
5096
5097 /* Increment number of LOS points... */
5098 los->np++;
5099
5100 /* Check stop flag... */
5101 if (stop) {
5102
5103 /* Set surface temperature... */
5104 if (ctl->nsf > 0 && atm->sft > 0)
5105 t = atm->sft;
5106 los->sft = (stop == 2 ? t : -999);
5107
5108 /* Set surface emissivity... */
5109 for (int id = 0; id < ctl->nd; id++) {
5110 los->sfeps[id] = 1.0;
5111 if (ctl->nsf > 0) {
5112 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
5113 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
5114 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
5115 ctl->nu[id]);
5116 }
5117 }
5118
5119 /* Leave raytracer... */
5120 break;
5121 }
5122
5123 /* Determine refractivity... */
5124 if (ctl->refrac && z <= zrefrac)
5125 n = 1 + REFRAC_EDLEN(p, t);
5126 else
5127 n = 1;
5128
5129 /* Construct new tangent vector (first term)... */
5130 for (int i = 0; i < 3; i++)
5131 ex1[i] = ex0[i] * n;
5132
5133 /* Compute gradient of refractivity... */
5134 if (ctl->refrac && z <= zrefrac) {
5135 for (int i = 0; i < 3; i++)
5136 xh[i] = x[i] + 0.5 * ds * ex0[i];
5137 cart2geo(xh, &z, &lon, &lat);
5138 intpol_atm(ctl, atm, z, &p, &t, q, k);
5139 n = REFRAC_EDLEN(p, t);
5140 for (int i = 0; i < 3; i++) {
5141 xh[i] += h;
5142 cart2geo(xh, &z, &lon, &lat);
5143 intpol_atm(ctl, atm, z, &p, &t, q, k);
5144 ng[i] = (REFRAC_EDLEN(p, t) - n) / h;
5145 xh[i] -= h;
5146 }
5147 } else
5148 for (int i = 0; i < 3; i++)
5149 ng[i] = 0;
5150
5151 /* Construct new tangent vector (second term)... */
5152 for (int i = 0; i < 3; i++)
5153 ex1[i] += ds * ng[i];
5154
5155 /* Normalize new tangent vector... */
5156 norm = NORM(ex1);
5157 for (int i = 0; i < 3; i++)
5158 ex1[i] /= norm;
5159
5160 /* Determine next point of LOS... */
5161 for (int i = 0; i < 3; i++)
5162 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
5163
5164 /* Copy tangent vector... */
5165 for (int i = 0; i < 3; i++)
5166 ex0[i] = ex1[i];
5167 }
5168
5169 /* Get tangent point (to be done before changing segment lengths!)... */
5170 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
5171
5172 /* Change segment lengths according to trapezoid rule... */
5173 for (int ip = los->np - 1; ip >= 1; ip--)
5174 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
5175 los->ds[0] *= 0.5;
5176
5177 /* Compute column density... */
5178 for (int ip = 0; ip < los->np; ip++)
5179 for (int ig = 0; ig < ctl->ng; ig++)
5180 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
5181 / (KB * los->t[ip]) * los->ds[ip];
5182
5183 /* Compute Curtis-Godson means... */
5184 for (int ig = 0; ig < ctl->ng; ig++) {
5185 los->cgu[0][ig] = los->u[0][ig];
5186 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
5187 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
5188 }
5189 for (int ip = 1; ip < los->np; ip++)
5190 for (int ig = 0; ig < ctl->ng; ig++) {
5191 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
5192 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
5193 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
5194 }
5195 for (int ip = 0; ip < los->np; ip++)
5196 for (int ig = 0; ig < ctl->ng; ig++)
5197 if (los->cgu[ip][ig] != 0) {
5198 los->cgp[ip][ig] /= los->cgu[ip][ig];
5199 los->cgt[ip][ig] /= los->cgu[ip][ig];
5200 }
5201}
5202
5203/*****************************************************************************/
5204
5206 const char *dirname,
5207 const char *filename,
5208 const ctl_t *ctl,
5209 atm_t *atm,
5210 int profile) {
5211
5212 /* Init... */
5213 atm->np = 0;
5214
5215 /* Set filename... */
5216 char file[LEN];
5217 if (dirname != NULL)
5218 sprintf(file, "%s/%s", dirname, filename);
5219 else
5220 sprintf(file, "%s", filename);
5221
5222 /* Write info... */
5223 LOG(1, "Read atmospheric data: %s", file);
5224
5225 /* Read ASCII data... */
5226 if (ctl->atmfmt == 1)
5227 read_atm_asc(file, ctl, atm);
5228
5229 /* Read binary data... */
5230 else if (ctl->atmfmt == 2)
5231 read_atm_bin(file, ctl, atm);
5232
5233 /* Read netCDF data... */
5234 else if (ctl->atmfmt == 3)
5235 read_atm_nc(file, ctl, atm, profile);
5236
5237 /* Check number of points... */
5238 if (atm->np < 1)
5239 ERRMSG("Could not read any data!");
5240
5241 /* Write info... */
5242 double mini, maxi;
5243 LOG(2, "Number of data points: %d", atm->np);
5244 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5245 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5246 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5247 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5248 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5249 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5250 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5251 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5252 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5253 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5254 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5255 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5256 for (int ig = 0; ig < ctl->ng; ig++) {
5257 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5258 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5259 }
5260 for (int iw = 0; iw < ctl->nw; iw++) {
5261 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5262 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5263 }
5264 if (ctl->ncl > 0) {
5265 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5266 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5267 } else
5268 LOG(2, "Cloud layer: none");
5269 if (ctl->nsf > 0) {
5270 LOG(2,
5271 "Surface: T_s = %g K | eps= %g ... %g",
5272 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5273 } else
5274 LOG(2, "Surface: none");
5275}
5276
5277/*****************************************************************************/
5278
5280 const char *filename,
5281 const ctl_t *ctl,
5282 atm_t *atm) {
5283
5284 /* Init... */
5285 atm->np = 0;
5286
5287 /* Open file... */
5288 FILE *in;
5289 if (!(in = fopen(filename, "r")))
5290 ERRMSG("Cannot open file!");
5291
5292 /* Read line... */
5293 char line[LEN], *tok;
5294 while (fgets(line, LEN, in)) {
5295
5296 /* Read data... */
5297 TOK(line, tok, "%lg", atm->time[atm->np]);
5298 TOK(NULL, tok, "%lg", atm->z[atm->np]);
5299 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
5300 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
5301 TOK(NULL, tok, "%lg", atm->p[atm->np]);
5302 TOK(NULL, tok, "%lg", atm->t[atm->np]);
5303 for (int ig = 0; ig < ctl->ng; ig++)
5304 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
5305 for (int iw = 0; iw < ctl->nw; iw++)
5306 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
5307 if (ctl->ncl > 0 && atm->np == 0) {
5308 TOK(NULL, tok, "%lg", atm->clz);
5309 TOK(NULL, tok, "%lg", atm->cldz);
5310 for (int icl = 0; icl < ctl->ncl; icl++)
5311 TOK(NULL, tok, "%lg", atm->clk[icl]);
5312 }
5313 if (ctl->nsf > 0 && atm->np == 0) {
5314 TOK(NULL, tok, "%lg", atm->sft);
5315 for (int isf = 0; isf < ctl->nsf; isf++)
5316 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
5317 }
5318
5319 /* Increment data point counter... */
5320 if ((++atm->np) > NP)
5321 ERRMSG("Too many data points!");
5322 }
5323
5324 /* Close file... */
5325 fclose(in);
5326}
5327
5328/*****************************************************************************/
5329
5331 const char *filename,
5332 const ctl_t *ctl,
5333 atm_t *atm) {
5334
5335 /* Open file... */
5336 FILE *in;
5337 if (!(in = fopen(filename, "r")))
5338 ERRMSG("Cannot open file!");
5339
5340 /* Read header... */
5341 char magic[4];
5342 FREAD(magic, char,
5343 4,
5344 in);
5345 if (memcmp(magic, "ATM1", 4) != 0)
5346 ERRMSG("Invalid magic string!");
5347
5348 int ng, nw, ncl, nsf;
5349 FREAD(&ng, int,
5350 1,
5351 in);
5352 FREAD(&nw, int,
5353 1,
5354 in);
5355 FREAD(&ncl, int,
5356 1,
5357 in);
5358 FREAD(&nsf, int,
5359 1,
5360 in);
5361 if (ng != ctl->ng || nw != ctl->nw || ncl != ctl->ncl || nsf != ctl->nsf)
5362 ERRMSG("Error reading file header!");
5363
5364 /* Read data... */
5365 size_t np;
5366 FREAD(&np, size_t,
5367 1,
5368 in);
5369 atm->np = (int) np;
5370 if (atm->np > NP)
5371 ERRMSG("Too many data points!");
5372 FREAD(atm->time, double,
5373 np,
5374 in);
5375 FREAD(atm->z, double,
5376 np,
5377 in);
5378 FREAD(atm->lon, double,
5379 np,
5380 in);
5381 FREAD(atm->lat, double,
5382 np,
5383 in);
5384 FREAD(atm->p, double,
5385 np,
5386 in);
5387 FREAD(atm->t, double,
5388 np,
5389 in);
5390 for (int ig = 0; ig < ctl->ng; ig++)
5391 FREAD(atm->q[ig], double,
5392 np,
5393 in);
5394 for (int iw = 0; iw < ctl->nw; iw++)
5395 FREAD(atm->k[iw], double,
5396 np,
5397 in);
5398 if (ctl->ncl > 0) {
5399 FREAD(&atm->clz, double,
5400 1,
5401 in);
5402 FREAD(&atm->cldz, double,
5403 1,
5404 in);
5405 FREAD(atm->clk, double,
5406 (size_t) ctl->ncl,
5407 in);
5408 }
5409 if (ctl->nsf) {
5410 FREAD(&atm->sft, double,
5411 1,
5412 in);
5413 FREAD(atm->sfeps, double,
5414 (size_t) ctl->nsf,
5415 in);
5416 }
5417
5418 /* Close file... */
5419 fclose(in);
5420}
5421
5422/*****************************************************************************/
5423
5425 const char *filename,
5426 const ctl_t *ctl,
5427 atm_t *atm,
5428 int profile) {
5429
5430 int ncid, var_time, var_z, var_lon, var_lat, var_p, var_t, var_q[NG],
5431 var_k[NW], var_cz = -1, var_cdz = -1, var_ck[NCL], var_sft =
5432 -1, var_sfe[NSF], var_nlev = -1;
5433
5434 char varname[LEN];
5435
5436 /* Open file... */
5437 NC(nc_open(filename, NC_NOWRITE, &ncid));
5438
5439 /* Initialize hyperslab... */
5440 size_t start[2] = { (size_t) profile, 0 };
5441 size_t count[2] = { 1, 0 };
5442
5443 /* Determine atm->np... */
5444 NC(nc_inq_varid(ncid, "nlev", &var_nlev));
5445 NC(nc_get_vara_int(ncid, var_nlev, start, count, &atm->np));
5446 if (atm->np < 1 || atm->np > NP)
5447 ERRMSG("Number of level out of range!");
5448
5449 /* Update hyperslab... */
5450 count[1] = (size_t) atm->np;
5451
5452 /* Inquire core variables... */
5453 NC(nc_inq_varid(ncid, "time", &var_time));
5454 NC(nc_inq_varid(ncid, "z", &var_z));
5455 NC(nc_inq_varid(ncid, "lon", &var_lon));
5456 NC(nc_inq_varid(ncid, "lat", &var_lat));
5457 NC(nc_inq_varid(ncid, "p", &var_p));
5458 NC(nc_inq_varid(ncid, "t", &var_t));
5459
5460 /* Inquire emiters... */
5461 for (int ig = 0; ig < ctl->ng; ig++)
5462 NC(nc_inq_varid(ncid, ctl->emitter[ig], &var_q[ig]));
5463
5464 /* Inquire extinctions... */
5465 for (int iw = 0; iw < ctl->nw; iw++) {
5466 sprintf(varname, "ext_win_%d", iw);
5467 NC(nc_inq_varid(ncid, varname, &var_k[iw]));
5468 }
5469
5470 /* Inquire cloud variables... */
5471 if (ctl->ncl > 0) {
5472 NC(nc_inq_varid(ncid, "cld_z", &var_cz));
5473 NC(nc_inq_varid(ncid, "cld_dz", &var_cdz));
5474 for (int icl = 0; icl < ctl->ncl; icl++) {
5475 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
5476 NC(nc_inq_varid(ncid, varname, &var_ck[icl]));
5477 }
5478 }
5479
5480 /* Inquire surface variables... */
5481 if (ctl->nsf > 0) {
5482 NC(nc_inq_varid(ncid, "srf_t", &var_sft));
5483 for (int isf = 0; isf < ctl->nsf; isf++) {
5484 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
5485 NC(nc_inq_varid(ncid, varname, &var_sfe[isf]));
5486 }
5487 }
5488
5489 /* Read core variables... */
5490 NC(nc_get_vara_double(ncid, var_time, start, count, atm->time));
5491 NC(nc_get_vara_double(ncid, var_z, start, count, atm->z));
5492 NC(nc_get_vara_double(ncid, var_lon, start, count, atm->lon));
5493 NC(nc_get_vara_double(ncid, var_lat, start, count, atm->lat));
5494 NC(nc_get_vara_double(ncid, var_p, start, count, atm->p));
5495 NC(nc_get_vara_double(ncid, var_t, start, count, atm->t));
5496
5497 /* Read emitters... */
5498 for (int ig = 0; ig < ctl->ng; ig++)
5499 NC(nc_get_vara_double(ncid, var_q[ig], start, count, atm->q[ig]));
5500
5501 /* Read extinctions... */
5502 for (int iw = 0; iw < ctl->nw; iw++)
5503 NC(nc_get_vara_double(ncid, var_k[iw], start, count, atm->k[iw]));
5504
5505 /* Read cloud variables... */
5506 if (ctl->ncl > 0) {
5507 NC(nc_get_vara_double(ncid, var_cz, start, count, &atm->clz));
5508 NC(nc_get_vara_double(ncid, var_cdz, start, count, &atm->cldz));
5509 for (int icl = 0; icl < ctl->ncl; icl++)
5510 NC(nc_get_vara_double(ncid, var_ck[icl], start, count, &atm->clk[icl]));
5511 }
5512
5513 /* Read surface variables... */
5514 if (ctl->nsf > 0) {
5515 NC(nc_get_vara_double(ncid, var_sft, start, count, &atm->sft));
5516
5517 for (int isf = 0; isf < ctl->nsf; isf++)
5518 NC(nc_get_vara_double
5519 (ncid, var_sfe[isf], start, count, &atm->sfeps[isf]));
5520 }
5521
5522 /* Close file... */
5523 NC(nc_close(ncid));
5524}
5525
5526/*****************************************************************************/
5527
5529 int argc,
5530 char *argv[],
5531 ctl_t *ctl) {
5532
5533 /* Write info... */
5534 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
5535 "(executable: %s | version: %s | compiled: %s, %s)\n",
5536 argv[0], VERSION, __DATE__, __TIME__);
5537
5538 /* Emitters... */
5539 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
5540 if (ctl->ng < 0 || ctl->ng > NG)
5541 ERRMSG("Set 0 <= NG <= MAX!");
5542 for (int ig = 0; ig < ctl->ng; ig++)
5543 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
5544 ctl->ig_co2 = find_emitter(ctl, "CO2");
5545 ctl->ig_h2o = find_emitter(ctl, "H2O");
5546 ctl->ig_n2 = find_emitter(ctl, "N2");
5547 ctl->ig_o2 = find_emitter(ctl, "O2");
5548
5549 /* Radiance channels... */
5550 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
5551 if (ctl->nd < 0 || ctl->nd > ND)
5552 ERRMSG("Set 0 <= ND <= MAX!");
5553 for (int id = 0; id < ctl->nd; id++)
5554 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
5555
5556 /* Spectral windows... */
5557 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
5558 if (ctl->nw < 0 || ctl->nw > NW)
5559 ERRMSG("Set 0 <= NW <= MAX!");
5560 for (int id = 0; id < ctl->nd; id++)
5561 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
5562
5563 /* Cloud data... */
5564 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
5565 if (ctl->ncl < 0 || ctl->ncl > NCL)
5566 ERRMSG("Set 0 <= NCL <= MAX!");
5567 if (ctl->ncl == 1)
5568 ERRMSG("Set NCL > 1!");
5569 for (int icl = 0; icl < ctl->ncl; icl++)
5570 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
5571
5572 /* Surface data... */
5573 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
5574 if (ctl->nsf < 0 || ctl->nsf > NSF)
5575 ERRMSG("Set 0 <= NSF <= MAX!");
5576 if (ctl->nsf == 1)
5577 ERRMSG("Set NSF > 1!");
5578 for (int isf = 0; isf < ctl->nsf; isf++)
5579 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
5580 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
5581 if (ctl->sftype < 0 || ctl->sftype > 3)
5582 ERRMSG("Set 0 <= SFTYPE <= 3!");
5583 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
5584
5585 /* Emissivity look-up tables... */
5586 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
5587 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
5588 if (ctl->tblfmt < 1 || ctl->tblfmt > 3)
5589 ERRMSG("Unknown look-up table file format, set TBLFMT to 1, 2, or 3!");
5590
5591 /* File formats... */
5592 ctl->atmfmt = (int) scan_ctl(argc, argv, "ATMFMT", -1, "1", NULL);
5593 if (ctl->atmfmt < 1 || ctl->atmfmt > 3)
5594 ERRMSG("Unknown atmospheric file format, set ATMFMT to 1, 2, or 3!");
5595 ctl->obsfmt = (int) scan_ctl(argc, argv, "OBSFMT", -1, "1", NULL);
5596 if (ctl->obsfmt < 1 || ctl->obsfmt > 3)
5597 ERRMSG("Unknown observation file format, set OBSFMT to 1, 2, or 3!");
5598 ctl->matrixfmt = (int) scan_ctl(argc, argv, "MATRIXFMT", -1, "1", NULL);
5599 if (ctl->matrixfmt < 1 || ctl->matrixfmt > 3)
5600 ERRMSG("Unknown matrix file format, set MATRIXFMT to 1, 2, or 3!");
5601
5602 /* Hydrostatic equilibrium... */
5603 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
5604
5605 /* Continua... */
5606 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
5607 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
5608 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
5609 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
5610
5611 /* Ray-tracing... */
5612 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
5613 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
5614 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
5615
5616 /* Field of view... */
5617 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
5618 if (ctl->fov[0] != '-')
5619 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
5620
5621 /* Retrieval interface... */
5622 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
5623 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
5624 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
5625 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
5626 for (int ig = 0; ig < ctl->ng; ig++) {
5627 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
5628 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
5629 }
5630 for (int iw = 0; iw < ctl->nw; iw++) {
5631 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
5632 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
5633 }
5634 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
5635 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
5636 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
5637 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
5638 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
5639
5640 /* Output flags... */
5641 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
5642 ctl->write_matrix =
5643 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
5644
5645 /* External forward models... */
5646 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
5647 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
5648 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
5649 for (int ig = 0; ig < ctl->ng; ig++)
5650 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
5651}
5652
5653/*****************************************************************************/
5654
5656 const char *dirname,
5657 const char *filename,
5658 const ctl_t *ctl,
5659 gsl_matrix *matrix,
5660 int dataset) {
5661
5662 /* Read ASCII data... */
5663 if (ctl->matrixfmt == 1)
5664 read_matrix_asc(dirname, filename, matrix);
5665
5666 /* Read binary data... */
5667 else if (ctl->matrixfmt == 2)
5668 read_matrix_bin(dirname, filename, matrix);
5669
5670 /* Read netCDF data... */
5671 else if (ctl->matrixfmt == 3)
5672 read_matrix_nc(dirname, filename, matrix, dataset);
5673
5674 /* Error... */
5675 else
5676 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
5677}
5678
5679/*****************************************************************************/
5680
5682 const char *dirname,
5683 const char *filename,
5684 gsl_matrix *matrix) {
5685
5686 char dum[LEN], file[LEN], line[LEN];
5687
5688 double value;
5689
5690 int i, j;
5691
5692 /* Set filename... */
5693 if (dirname != NULL)
5694 sprintf(file, "%s/%s", dirname, filename);
5695 else
5696 sprintf(file, "%s", filename);
5697
5698 /* Write info... */
5699 LOG(1, "Read matrix: %s", file);
5700
5701 /* Open file... */
5702 FILE *in;
5703 if (!(in = fopen(file, "r")))
5704 ERRMSG("Cannot open file!");
5705
5706 /* Read data... */
5707 gsl_matrix_set_zero(matrix);
5708 while (fgets(line, LEN, in))
5709 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
5710 &i, dum, dum, dum, dum, dum,
5711 &j, dum, dum, dum, dum, dum, &value) == 13)
5712 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
5713
5714 /* Close file... */
5715 fclose(in);
5716}
5717
5718/*****************************************************************************/
5719
5721 const char *dirname,
5722 const char *filename,
5723 gsl_matrix *matrix) {
5724
5725 char file[LEN], magic[4];
5726 size_t nr, nc;
5727
5728 /* Set filename... */
5729 if (dirname != NULL)
5730 sprintf(file, "%s/%s", dirname, filename);
5731 else
5732 sprintf(file, "%s", filename);
5733
5734 /* Write info... */
5735 LOG(1, "Read matrix: %s", file);
5736
5737 /* Open file... */
5738 FILE *in;
5739 if (!(in = fopen(file, "r")))
5740 ERRMSG("Cannot open file!");
5741
5742 /* Read header... */
5743 FREAD(magic, char,
5744 4,
5745 in);
5746 if (memcmp(magic, "MAT1", 4) != 0)
5747 ERRMSG("Invalid magic string!");
5748 FREAD(&nr, size_t,
5749 1,
5750 in);
5751 FREAD(&nc, size_t,
5752 1,
5753 in);
5754 if (nr != matrix->size1 || nc != matrix->size2)
5755 ERRMSG("Error reading file header!");
5756
5757 /* Read data... */
5758 for (size_t i = 0; i < nr; i++)
5759 for (size_t j = 0; j < nc; j++) {
5760 double value;
5761 FREAD(&value, double,
5762 1,
5763 in);
5764 gsl_matrix_set(matrix, i, j, value);
5765 }
5766
5767 /* Close file... */
5768 fclose(in);
5769}
5770
5771/*****************************************************************************/
5772
5774 const char *dirname,
5775 const char *filename,
5776 gsl_matrix *matrix,
5777 int dataset) {
5778
5779 char file[LEN];
5780
5781 int ncid, dimid_row, dimid_col, varid;
5782
5783 size_t nr, nc;
5784
5785 /* Set filename... */
5786 if (dirname != NULL)
5787 sprintf(file, "%s/%s", dirname, filename);
5788 else
5789 sprintf(file, "%s", filename);
5790
5791 /* Write info... */
5792 LOG(1, "Read matrix: %s", file);
5793
5794 /* Open file... */
5795 NC(nc_open(file, NC_NOWRITE, &ncid));
5796
5797 /* Read dimensions... */
5798 NC(nc_inq_dimid(ncid, "row", &dimid_row));
5799 NC(nc_inq_dimid(ncid, "col", &dimid_col));
5800 NC(nc_inq_dimlen(ncid, dimid_row, &nr));
5801 NC(nc_inq_dimlen(ncid, dimid_col, &nc));
5802 if (nr != matrix->size1 || nc != matrix->size2)
5803 ERRMSG("Error reading file header!");
5804
5805 /* Read data... */
5806 NC(nc_inq_varid(ncid, "matrix", &varid));
5807 for (size_t i = 0; i < nr; i++)
5808 for (size_t j = 0; j < nc; j++) {
5809 double value;
5810 size_t start[3] = { (size_t) dataset, i, j };
5811 size_t count[3] = { 1, 1, 1 };
5812 NC(nc_get_vara_double(ncid, varid, start, count, &value));
5813 gsl_matrix_set(matrix, i, j, value);
5814 }
5815
5816 /* Close file... */
5817 NC(nc_close(ncid));
5818}
5819
5820/*****************************************************************************/
5821
5823 const char *dirname,
5824 const char *filename,
5825 const ctl_t *ctl,
5826 obs_t *obs,
5827 int profile) {
5828
5829 /* Set filename... */
5830 char file[LEN];
5831 if (dirname != NULL)
5832 sprintf(file, "%s/%s", dirname, filename);
5833 else
5834 sprintf(file, "%s", filename);
5835
5836 /* Write info... */
5837 LOG(1, "Read observation data: %s", file);
5838
5839 /* Read ASCII data... */
5840 if (ctl->obsfmt == 1)
5841 read_obs_asc(file, ctl, obs);
5842
5843 /* Read binary data... */
5844 else if (ctl->obsfmt == 2)
5845 read_obs_bin(file, ctl, obs);
5846
5847 /* Read netCDF data... */
5848 else if (ctl->obsfmt == 3)
5849 read_obs_nc(file, ctl, obs, profile);
5850
5851 /* Check number of points... */
5852 if (obs->nr < 1)
5853 ERRMSG("Could not read any data!");
5854
5855 /* Write info... */
5856 double mini, maxi;
5857 LOG(2, "Number of ray paths: %d", obs->nr);
5858 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5859 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5860 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5861 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5862 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5863 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5864 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5865 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5866 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5867 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5868 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5869 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5870 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5871 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5872 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5873 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5874 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5875 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5876 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5877 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5878 for (int id = 0; id < ctl->nd; id++) {
5879 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5880 if (ctl->write_bbt) {
5881 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5882 ctl->nu[id], mini, maxi);
5883 } else {
5884 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5885 ctl->nu[id], mini, maxi);
5886 }
5887 }
5888 for (int id = 0; id < ctl->nd; id++) {
5889 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5890 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5891 ctl->nu[id], mini, maxi);
5892 }
5893}
5894
5895/*****************************************************************************/
5896
5898 const char *filename,
5899 const ctl_t *ctl,
5900 obs_t *obs) {
5901
5902 /* Init... */
5903 obs->nr = 0;
5904
5905 /* Open file... */
5906 FILE *in;
5907 if (!(in = fopen(filename, "r")))
5908 ERRMSG("Cannot open file!");
5909
5910 /* Read line... */
5911 char line[LEN], *tok;
5912 while (fgets(line, LEN, in)) {
5913
5914 /* Read data... */
5915 TOK(line, tok, "%lg", obs->time[obs->nr]);
5916 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5917 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5918 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5919 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5920 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5921 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5922 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5923 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5924 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5925 for (int id = 0; id < ctl->nd; id++)
5926 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5927 for (int id = 0; id < ctl->nd; id++)
5928 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5929
5930 /* Increment counter... */
5931 if ((++obs->nr) > NR)
5932 ERRMSG("Too many rays!");
5933 }
5934
5935 /* Close file... */
5936 fclose(in);
5937}
5938
5939/*****************************************************************************/
5940
5942 const char *filename,
5943 const ctl_t *ctl,
5944 obs_t *obs) {
5945
5946 /* Open file... */
5947 FILE *in;
5948 if (!(in = fopen(filename, "r")))
5949 ERRMSG("Cannot open file!");
5950
5951 /* Read header... */
5952 char magic[4];
5953 FREAD(magic, char,
5954 4,
5955 in);
5956 if (memcmp(magic, "OBS1", 4) != 0)
5957 ERRMSG("Invalid magic string!");
5958
5959 int nd;
5960 FREAD(&nd, int,
5961 1,
5962 in);
5963 if (nd != ctl->nd)
5964 ERRMSG("Error reading file header!");
5965
5966 /* Read data... */
5967 size_t nr;
5968 FREAD(&nr, size_t,
5969 1,
5970 in);
5971 obs->nr = (int) nr;
5972 if (obs->nr > NR)
5973 ERRMSG("Too many ray paths!");
5974 FREAD(obs->time, double,
5975 nr,
5976 in);
5977 FREAD(obs->obsz, double,
5978 nr,
5979 in);
5980 FREAD(obs->obslon, double,
5981 nr,
5982 in);
5983 FREAD(obs->obslat, double,
5984 nr,
5985 in);
5986 FREAD(obs->vpz, double,
5987 nr,
5988 in);
5989 FREAD(obs->vplon, double,
5990 nr,
5991 in);
5992 FREAD(obs->vplat, double,
5993 nr,
5994 in);
5995 FREAD(obs->tpz, double,
5996 nr,
5997 in);
5998 FREAD(obs->tplon, double,
5999 nr,
6000 in);
6001 FREAD(obs->tplat, double,
6002 nr,
6003 in);
6004 for (int id = 0; id < ctl->nd; id++)
6005 FREAD(obs->rad[id], double,
6006 nr,
6007 in);
6008 for (int id = 0; id < ctl->nd; id++)
6009 FREAD(obs->tau[id], double,
6010 nr,
6011 in);
6012
6013 /* Close file... */
6014 fclose(in);
6015}
6016
6017/*****************************************************************************/
6018
6020 const char *filename,
6021 const ctl_t *ctl,
6022 obs_t *obs,
6023 const int profile) {
6024
6025 int ncid, var_nray = -1, var_time = -1, var_obsz = -1, var_obslon =
6026 -1, var_obslat = -1, var_vpz = -1, var_vplon = -1, var_vplat =
6027 -1, var_tpz = -1, var_tplon = -1, var_tplat =
6028 -1, var_rad[ND], var_tau[ND];
6029 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
6030
6031 /* Open file... */
6032 NC(nc_open(filename, NC_NOWRITE, &ncid));
6033
6034 /* Initialize hyperslab... */
6035 size_t start[2] = { (size_t) profile, 0 };
6036 size_t count[2] = { 1, 0 };
6037
6038 /* Read nray(profile) -> obs->nr */
6039 NC(nc_inq_varid(ncid, "nray", &var_nray));
6040 NC(nc_get_vara_int(ncid, var_nray, start, count, &obs->nr));
6041 if (obs->nr < 1 || obs->nr > NR)
6042 ERRMSG("Number of ray paths out of range!");
6043
6044 /* Update hyperslab... */
6045 count[1] = (size_t) obs->nr;
6046
6047 /* Inquire geometry variables... */
6048 NC(nc_inq_varid(ncid, "time", &var_time));
6049 NC(nc_inq_varid(ncid, "obs_z", &var_obsz));
6050 NC(nc_inq_varid(ncid, "obs_lon", &var_obslon));
6051 NC(nc_inq_varid(ncid, "obs_lat", &var_obslat));
6052
6053 NC(nc_inq_varid(ncid, "vp_z", &var_vpz));
6054 NC(nc_inq_varid(ncid, "vp_lon", &var_vplon));
6055 NC(nc_inq_varid(ncid, "vp_lat", &var_vplat));
6056
6057 NC(nc_inq_varid(ncid, "tp_z", &var_tpz));
6058 NC(nc_inq_varid(ncid, "tp_lon", &var_tplon));
6059 NC(nc_inq_varid(ncid, "tp_lat", &var_tplat));
6060
6061 /* Inquire spectral variables per channel... */
6062 for (int id = 0; id < ctl->nd; id++) {
6063 char varname[LEN];
6064
6065 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
6066 NC(nc_inq_varid(ncid, varname, &var_rad[id]));
6067
6068 sprintf(varname, "tau_%.4f", ctl->nu[id]);
6069 NC(nc_inq_varid(ncid, varname, &var_tau[id]));
6070 }
6071
6072 /* Read geometry... */
6073 NC(nc_get_vara_double(ncid, var_time, start, count, obs->time));
6074 NC(nc_get_vara_double(ncid, var_obsz, start, count, obs->obsz));
6075 NC(nc_get_vara_double(ncid, var_obslon, start, count, obs->obslon));
6076 NC(nc_get_vara_double(ncid, var_obslat, start, count, obs->obslat));
6077
6078 NC(nc_get_vara_double(ncid, var_vpz, start, count, obs->vpz));
6079 NC(nc_get_vara_double(ncid, var_vplon, start, count, obs->vplon));
6080 NC(nc_get_vara_double(ncid, var_vplat, start, count, obs->vplat));
6081
6082 NC(nc_get_vara_double(ncid, var_tpz, start, count, obs->tpz));
6083 NC(nc_get_vara_double(ncid, var_tplon, start, count, obs->tplon));
6084 NC(nc_get_vara_double(ncid, var_tplat, start, count, obs->tplat));
6085
6086 /* Read radiance and transmittance... */
6087 for (int id = 0; id < ctl->nd; id++) {
6088 NC(nc_get_vara_double(ncid, var_rad[id], start, count, obs->rad[id]));
6089 NC(nc_get_vara_double(ncid, var_tau[id], start, count, obs->tau[id]));
6090 }
6091
6092 /* Close file... */
6093 NC(nc_close(ncid));
6094}
6095
6096/*****************************************************************************/
6097
6099 const char *basename,
6100 const double z,
6101 const double *nu,
6102 const double *f,
6103 const int n) {
6104
6105 double fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
6106
6107 int npts;
6108
6109 /* Allocate... */
6110 ALLOC(nurfm, double,
6111 RFMNPTS);
6112 ALLOC(rad, double,
6113 RFMNPTS);
6114
6115 /* Search RFM spectrum... */
6116 FILE *in;
6117 char filename[LEN];
6118 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
6119 if (!(in = fopen(filename, "r"))) {
6120 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
6121 if (!(in = fopen(filename, "r")))
6122 ERRMSG("Cannot find RFM data file!");
6123 }
6124 fclose(in);
6125
6126 /* Read RFM spectrum... */
6127 read_rfm_spec(filename, nurfm, rad, &npts);
6128
6129 /* Set wavenumbers... */
6130 nu2[0] = nu[0];
6131 nu2[n - 1] = nu[n - 1];
6132 for (int i = 1; i < n - 1; i++)
6133 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
6134
6135 /* Convolute... */
6136 for (int ipts = 0; ipts < npts; ipts++)
6137 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
6138 const int idx = locate_irr(nu2, n, nurfm[ipts]);
6139 const double filt =
6140 LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
6141 fsum += filt;
6142 radsum += filt * rad[ipts];
6143 }
6144
6145 /* Free... */
6146 free(nurfm);
6147 free(rad);
6148
6149 /* Return radiance... */
6150 return radsum / fsum;
6151}
6152
6153/*****************************************************************************/
6154
6156 int argc,
6157 char *argv[],
6158 const ctl_t *ctl,
6159 ret_t *ret) {
6160
6161 /* Iteration control... */
6162 ret->kernel_recomp =
6163 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
6164 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
6165 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
6166
6167 /* Error analysis... */
6168 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "0", NULL);
6169
6170 for (int id = 0; id < ctl->nd; id++)
6171 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
6172
6173 for (int id = 0; id < ctl->nd; id++)
6174 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
6175
6176 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
6177 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
6178 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
6179
6180 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
6181 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
6182 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
6183
6184 for (int ig = 0; ig < ctl->ng; ig++) {
6185 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
6186 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
6187 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
6188 }
6189
6190 for (int iw = 0; iw < ctl->nw; iw++) {
6191 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
6192 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
6193 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
6194 }
6195
6196 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
6197 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
6198 for (int icl = 0; icl < ctl->ncl; icl++)
6199 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
6200
6201 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
6202 for (int isf = 0; isf < ctl->nsf; isf++)
6203 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
6204
6205 /* Shared retrieval I/O... */
6206 ret->shared_io_profile = 0;
6207 scan_ctl(argc, argv, "SHARED_IO_PROFLIST", -1, "-",
6208 ret->shared_io_proflist);
6209 scan_ctl(argc, argv, "SHARED_IO_ATM_APR_FILE", -1, "-",
6211 scan_ctl(argc, argv, "SHARED_IO_OBS_MEAS_FILE", -1, "-",
6213 scan_ctl(argc, argv, "SHARED_IO_ATM_FINAL_FILE", -1, "-",
6215 scan_ctl(argc, argv, "SHARED_IO_OBS_FINAL_FILE", -1, "-",
6217 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_APR_FILE", -1, "-",
6219 scan_ctl(argc, argv, "SHARED_IO_MATRIX_KERNEL_FILE", -1, "-",
6221 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_RET_FILE", -1, "-",
6223 scan_ctl(argc, argv, "SHARED_IO_MATRIX_CORR_FILE", -1, "-",
6225 scan_ctl(argc, argv, "SHARED_IO_MATRIX_GAIN_FILE", -1, "-",
6227 scan_ctl(argc, argv, "SHARED_IO_MATRIX_AVK_FILE", -1, "-",
6229 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_TOTAL_FILE", -1, "-",
6231 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_NOISE_FILE", -1, "-",
6233 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_FORMOD_FILE", -1, "-",
6235 scan_ctl(argc, argv, "SHARED_IO_ATM_CONT_FILE", -1, "-",
6237 scan_ctl(argc, argv, "SHARED_IO_ATM_RES_FILE", -1, "-",
6239}
6240
6241/*****************************************************************************/
6242
6244 const char *filename,
6245 double *nu,
6246 double *rad,
6247 int *npts) {
6248
6249 char *line = NULL, *tok;
6250
6251 size_t line_buf_size = 0;
6252
6253 double dnu, nu0, nu1;
6254
6255 int ipts = 0;
6256
6257 /* Write info... */
6258 LOG(1, "Read RFM data: %s", filename);
6259
6260 /* Open file... */
6261 FILE *in;
6262 if (!(in = fopen(filename, "r")))
6263 ERRMSG("Cannot open file!");
6264
6265 /* Read header... */
6266 for (int i = 0; i < 4; i++)
6267 if (getline(&line, &line_buf_size, in) == -1)
6268 ERRMSG("Error while reading file header!");
6269 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
6270 ERRMSG("Invalid spectrum header format!");
6271
6272 /* Check number of spectral grid points... */
6273 if (*npts > RFMNPTS)
6274 ERRMSG("Too many spectral grid points!");
6275
6276 /* Read radiance data... */
6277 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
6278 tok = strtok(line, " \t\n");
6279 while (tok != NULL && ipts < *npts) {
6280 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
6281 ipts++;
6282 tok = strtok(NULL, " \t\n");
6283 }
6284 }
6285
6286 /* Check number of spectral grid points... */
6287 if (ipts != *npts)
6288 ERRMSG("Error while reading RFM data!");
6289
6290 /* Compute wavenumbers... */
6291 for (ipts = 0; ipts < *npts; ipts++)
6292 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
6293
6294 /* Close file... */
6295 fclose(in);
6296
6297 /* Free.. */
6298 free(line);
6299}
6300
6301/*****************************************************************************/
6302
6304 const char *filename,
6305 double *x,
6306 double *y,
6307 int *n) {
6308
6309 char line[LEN];
6310
6311 /* Write info... */
6312 LOG(1, "Read shape function: %s", filename);
6313
6314 /* Open file... */
6315 FILE *in;
6316 if (!(in = fopen(filename, "r")))
6317 ERRMSG("Cannot open file!");
6318
6319 /* Read data... */
6320 *n = 0;
6321 while (fgets(line, LEN, in))
6322 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
6323 if ((++(*n)) > NSHAPE)
6324 ERRMSG("Too many data points!");
6325
6326 /* Close file... */
6327 fclose(in);
6328
6329 /* Check number of data points... */
6330 if (*n < 2)
6331 ERRMSG("Could not read any data!");
6332
6333 /* Write info... */
6334 double mini, maxi;
6335 LOG(2, "Number of data points: %d", *n);
6336 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
6337 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
6338 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
6339 LOG(2, "Range of y values: %g ... %g", mini, maxi);
6340}
6341
6342/*****************************************************************************/
6343
6345 const ctl_t *ctl) {
6346
6347 /* Allocate... */
6348 tbl_t *tbl;
6349 ALLOC(tbl, tbl_t, 1);
6350
6351 /* Initialize filter function sizes... */
6352 for (int id = 0; id < ctl->nd; id++)
6353 tbl->filt_n[id] = 0;
6354
6355 /* Loop over trace gases... */
6356 for (int ig = 0; ig < ctl->ng; ig++) {
6357
6358 /* Read ASCII look-up tables... */
6359 if (ctl->tblfmt == 1)
6360 for (int id = 0; id < ctl->nd; id++) {
6361 read_tbl_asc(ctl, tbl, id, ig);
6362 TBL_LOG(tbl, id, ig);
6363 }
6364
6365 /* Read binary look-up tables... */
6366 else if (ctl->tblfmt == 2)
6367 for (int id = 0; id < ctl->nd; id++) {
6368 read_tbl_bin(ctl, tbl, id, ig);
6369 TBL_LOG(tbl, id, ig);
6370 }
6371
6372 /* Read netCDF look-up tables... */
6373 else if (ctl->tblfmt == 3) {
6374
6375 /* Open file... */
6376 int ncid;
6377 char filename[2 * LEN];
6378 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
6379 if (nc_open(filename, NC_NOWRITE, &ncid) != NC_NOERR) {
6380 WARN("Missing emissivity table: %s", filename);
6381 continue;
6382 } else
6383 LOG(1, "Read emissivity table: %s", filename);
6384
6385 /* Read channels... */
6386 for (int id = 0; id < ctl->nd; id++) {
6387 read_tbl_nc_channel(ctl, tbl, id, ig, ncid);
6388 TBL_LOG(tbl, id, ig);
6389 }
6390
6391 /* Close file... */
6392 NC(nc_close(ncid));
6393 }
6394 }
6395
6396 /* Calculate log-pressure... */
6397 for (int id = 0; id < ctl->nd; id++)
6398 for (int ig = 0; ig < ctl->ng; ig++)
6399 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6400 tbl->lnp[id][ig][ip] = log(tbl->p[id][ig][ip]);
6401
6402 /* Read filter functions... */
6403 if (ctl->tblfmt == 1)
6404 for (int id = 0; id < ctl->nd; id++) {
6405 char filename[2 * LEN];
6406 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
6407 read_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
6408 &tbl->filt_n[id]);
6409 }
6410
6411 /* Initialize source function lookup tables... */
6412 init_srcfunc(ctl, tbl);
6413
6414 /* Return pointer... */
6415 return tbl;
6416}
6417
6418/*****************************************************************************/
6419
6421 const ctl_t *ctl,
6422 tbl_t *tbl,
6423 const int id,
6424 const int ig) {
6425
6426 /* Initialize... */
6427 double eps, eps_old = -999, press, press_old = -999, temp,
6428 temp_old = -999, u, u_old = -999;
6429 int nrange = 0;
6430
6431 /* Set filename... */
6432 char filename[2 * LEN];
6433 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
6434 ctl->nu[id], ctl->emitter[ig]);
6435
6436 /* Open file... */
6437 FILE *in;
6438 if (!(in = fopen(filename, "r"))) {
6439 WARN("Missing emissivity table: %s", filename);
6440 return;
6441 } else
6442 LOG(1, "Read emissivity table: %s", filename);
6443
6444 /* Init pressure level counter... */
6445 tbl->np[id][ig] = -1;
6446
6447 /* Read data... */
6448 char line[LEN];
6449 while (fgets(line, LEN, in)) {
6450
6451 /* Parse line... */
6452 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
6453 continue;
6454
6455 /* Check ranges... */
6456 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
6457 nrange++;
6458 continue;
6459 }
6460
6461 /* Determine pressure index... */
6462 if (press != press_old) {
6463 press_old = press;
6464 if ((++tbl->np[id][ig]) >= TBLNP)
6465 ERRMSG("Too many pressure levels!");
6466 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
6467 }
6468
6469 /* Determine temperature index... */
6470 if (temp != temp_old) {
6471 temp_old = temp;
6472 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
6473 ERRMSG("Too many temperatures!");
6474 tbl->nu[id][ig][tbl->np[id][ig]]
6475 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
6476
6477 /* Reset dynamic arrays for this (ip,it) node... */
6478 tbl->logu[id][ig][tbl->np[id][ig]]
6479 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6480 tbl->logeps[id][ig][tbl->np[id][ig]]
6481 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6482 }
6483
6484 /* Determine column density index... */
6485 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
6486 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
6487 eps_old = eps;
6488 u_old = u;
6489 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
6490 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
6491 ERRMSG("Too many column densities!");
6492
6493 /* Grow dynamic arrays (nu is used as an index during reading). */
6494 const int ip = tbl->np[id][ig];
6495 const int it = tbl->nt[id][ig][ip];
6496 const int iu = tbl->nu[id][ig][ip][it];
6497 const size_t nnew = (size_t) (iu + 1);
6498
6499 float *tmp = (float *) realloc(tbl->logu[id][ig][ip][it],
6500 nnew * sizeof(float));
6501 if (!tmp)
6502 ERRMSG("Out of memory!");
6503 tbl->logu[id][ig][ip][it] = tmp;
6504
6505 tmp =
6506 (float *) realloc(tbl->logeps[id][ig][ip][it], nnew * sizeof(float));
6507 if (!tmp)
6508 ERRMSG("Out of memory!");
6509 tbl->logeps[id][ig][ip][it] = tmp;
6510 }
6511
6512 /* Store data... */
6513 tbl->p[id][ig][tbl->np[id][ig]] = press;
6514 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6515 = temp;
6516 tbl->logu[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6517 [tbl->nu[id][ig][tbl->np[id][ig]]
6518 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(u);
6519 tbl->logeps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6520 [tbl->nu[id][ig][tbl->np[id][ig]]
6521 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(eps);
6522 }
6523
6524 /* Increment counters... */
6525 tbl->np[id][ig]++;
6526 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6527 tbl->nt[id][ig][ip]++;
6528 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
6529 tbl->nu[id][ig][ip][it]++;
6530 }
6531
6532 /* Check ranges... */
6533 if (nrange > 0)
6534 WARN("Column density or emissivity out of range (%d data points)!",
6535 nrange);
6536
6537 /* Close file... */
6538 fclose(in);
6539}
6540
6541/*****************************************************************************/
6542
6544 const ctl_t *ctl,
6545 tbl_t *tbl,
6546 const int id,
6547 const int ig) {
6548
6549 /* Set filename... */
6550 char filename[2 * LEN];
6551 sprintf(filename, "%s_%.4f_%s.bin",
6552 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
6553
6554 /* Open file... */
6555 FILE *in = fopen(filename, "rb");
6556 if (!in) {
6557 WARN("Missing emissivity table: %s", filename);
6558 return;
6559 } else
6560 LOG(1, "Read emissivity table: %s", filename);
6561
6562 /* Read length.. */
6563 size_t nbytes;
6564 FREAD(&nbytes, size_t,
6565 1,
6566 in);
6567 if (nbytes <= 0)
6568 ERRMSG("Invalid packed table size!");
6569
6570 /* Read packed blob... */
6571 uint8_t *work = NULL;
6572 ALLOC(work, uint8_t, nbytes);
6573 FREAD(work, uint8_t, nbytes, in);
6574
6575 /* Unpack... */
6576 tbl_unpack(tbl, id, ig, work);
6577
6578 /* Close file... */
6579 fclose(in);
6580
6581 /* Free... */
6582 free(work);
6583}
6584
6585/*****************************************************************************/
6586
6588 const ctl_t *ctl,
6589 tbl_t *tbl,
6590 int id,
6591 int ig,
6592 int ncid) {
6593
6594 char varname[LEN];
6595
6596 int varid, dimid;
6597
6598 size_t nbytes;
6599
6600 /* Inquire variable... */
6601 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
6602 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
6603 WARN("Missing emissivity table: %s", varname);
6604 return;
6605 } else
6606 LOG(1, "Read emissivity table: %s", varname);
6607 NC(nc_inq_vardimid(ncid, varid, &dimid));
6608 NC(nc_inq_dimlen(ncid, dimid, &nbytes));
6609
6610 /* Read variable... */
6611 uint8_t *work = NULL;
6612 ALLOC(work, uint8_t, nbytes);
6613 NC(nc_get_var_uchar(ncid, varid, (unsigned char *) work));
6614
6615 /* Unpack... */
6616 tbl_unpack(tbl, id, ig, work);
6617
6618 /* Free... */
6619 free(work);
6620}
6621
6622/*****************************************************************************/
6623
6625 int argc,
6626 char *argv[],
6627 const char *varname,
6628 const int arridx,
6629 const char *defvalue,
6630 char *value) {
6631
6632 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
6633 rvarname[LEN], rval[LEN];
6634
6635 int contain = 0;
6636
6637 /* Open file... */
6638 FILE *in = NULL;
6639 if (argv[1][0] != '-')
6640 if (!(in = fopen(argv[1], "r")))
6641 ERRMSG("Cannot open file!");
6642
6643 /* Set full variable name... */
6644 if (arridx >= 0) {
6645 sprintf(fullname1, "%s[%d]", varname, arridx);
6646 sprintf(fullname2, "%s[*]", varname);
6647 } else {
6648 sprintf(fullname1, "%s", varname);
6649 sprintf(fullname2, "%s", varname);
6650 }
6651
6652 /* Read data... */
6653 if (in != NULL)
6654 while (fgets(line, LEN, in))
6655 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
6656 if (strcasecmp(rvarname, fullname1) == 0 ||
6657 strcasecmp(rvarname, fullname2) == 0) {
6658 contain = 1;
6659 break;
6660 }
6661 for (int i = 1; i < argc - 1; i++)
6662 if (strcasecmp(argv[i], fullname1) == 0 ||
6663 strcasecmp(argv[i], fullname2) == 0) {
6664 sprintf(rval, "%s", argv[i + 1]);
6665 contain = 1;
6666 break;
6667 }
6668
6669 /* Close file... */
6670 if (in != NULL)
6671 fclose(in);
6672
6673 /* Check for missing variables... */
6674 if (!contain) {
6675 if (strlen(defvalue) > 0)
6676 sprintf(rval, "%s", defvalue);
6677 else
6678 ERRMSG("Missing variable %s!\n", fullname1);
6679 }
6680
6681 /* Write info... */
6682 LOG(1, "%s = %s", fullname1, rval);
6683
6684 /* Return values... */
6685 if (value != NULL)
6686 sprintf(value, "%s", rval);
6687 return atof(rval);
6688}
6689
6690/*****************************************************************************/
6691
6693 const ret_t *ret,
6694 const ctl_t *ctl,
6695 const atm_t *atm,
6696 const int *iqa,
6697 const int *ipa,
6698 gsl_matrix *s_a) {
6699
6700 /* Get sizes... */
6701 const size_t n = s_a->size1;
6702
6703 /* Allocate... */
6704 gsl_vector *x_a = gsl_vector_alloc(n);
6705
6706 /* Get sigma vector... */
6707 atm2x(ctl, atm, x_a, NULL, NULL);
6708 for (size_t i = 0; i < n; i++) {
6709 if (iqa[i] == IDXP)
6710 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
6711 if (iqa[i] == IDXT)
6712 gsl_vector_set(x_a, i, ret->err_temp);
6713 for (int ig = 0; ig < ctl->ng; ig++)
6714 if (iqa[i] == IDXQ(ig))
6715 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
6716 for (int iw = 0; iw < ctl->nw; iw++)
6717 if (iqa[i] == IDXK(iw))
6718 gsl_vector_set(x_a, i, ret->err_k[iw]);
6719 if (iqa[i] == IDXCLZ)
6720 gsl_vector_set(x_a, i, ret->err_clz);
6721 if (iqa[i] == IDXCLDZ)
6722 gsl_vector_set(x_a, i, ret->err_cldz);
6723 for (int icl = 0; icl < ctl->ncl; icl++)
6724 if (iqa[i] == IDXCLK(icl))
6725 gsl_vector_set(x_a, i, ret->err_clk[icl]);
6726 if (iqa[i] == IDXSFT)
6727 gsl_vector_set(x_a, i, ret->err_sft);
6728 for (int isf = 0; isf < ctl->nsf; isf++)
6729 if (iqa[i] == IDXSFEPS(isf))
6730 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
6731 }
6732
6733 /* Check standard deviations... */
6734 for (size_t i = 0; i < n; i++)
6735 if (POW2(gsl_vector_get(x_a, i)) <= 0)
6736 ERRMSG("Check a priori data (zero standard deviation)!");
6737
6738 /* Initialize diagonal covariance... */
6739 gsl_matrix_set_zero(s_a);
6740 for (size_t i = 0; i < n; i++)
6741 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
6742
6743 /* Loop over matrix elements... */
6744 for (size_t i = 0; i < n; i++)
6745 for (size_t j = 0; j < n; j++)
6746 if (i != j && iqa[i] == iqa[j]) {
6747
6748 /* Initialize... */
6749 double cz = 0;
6750 double ch = 0;
6751
6752 /* Set correlation lengths for pressure... */
6753 if (iqa[i] == IDXP) {
6754 cz = ret->err_press_cz;
6755 ch = ret->err_press_ch;
6756 }
6757
6758 /* Set correlation lengths for temperature... */
6759 if (iqa[i] == IDXT) {
6760 cz = ret->err_temp_cz;
6761 ch = ret->err_temp_ch;
6762 }
6763
6764 /* Set correlation lengths for volume mixing ratios... */
6765 for (int ig = 0; ig < ctl->ng; ig++)
6766 if (iqa[i] == IDXQ(ig)) {
6767 cz = ret->err_q_cz[ig];
6768 ch = ret->err_q_ch[ig];
6769 }
6770
6771 /* Set correlation lengths for extinction... */
6772 for (int iw = 0; iw < ctl->nw; iw++)
6773 if (iqa[i] == IDXK(iw)) {
6774 cz = ret->err_k_cz[iw];
6775 ch = ret->err_k_ch[iw];
6776 }
6777
6778 /* Compute correlations... */
6779 if (cz > 0 && ch > 0) {
6780
6781 /* Get Cartesian coordinates... */
6782 double x0[3], x1[3];
6783 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
6784 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
6785
6786 /* Compute correlations... */
6787 const double rho =
6788 exp(-DIST(x0, x1) / ch -
6789 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
6790
6791 /* Set covariance... */
6792 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
6793 * gsl_vector_get(x_a, j) * rho);
6794 }
6795 }
6796
6797 /* Free... */
6798 gsl_vector_free(x_a);
6799}
6800
6801/*****************************************************************************/
6802
6804 const ret_t *ret,
6805 const ctl_t *ctl,
6806 const obs_t *obs,
6807 gsl_vector *sig_noise,
6808 gsl_vector *sig_formod,
6809 gsl_vector *sig_eps_inv) {
6810
6811 /* Allocate... */
6812 obs_t *obs_err;
6813 ALLOC(obs_err, obs_t, 1);
6814
6815 /* Get size... */
6816 const size_t m = sig_eps_inv->size;
6817
6818 /* Noise error (always considered in retrieval fit)... */
6819 copy_obs(ctl, obs_err, obs, 1);
6820 for (int ir = 0; ir < obs_err->nr; ir++)
6821 for (int id = 0; id < ctl->nd; id++)
6822 obs_err->rad[id][ir]
6823 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
6824 obs2y(ctl, obs_err, sig_noise, NULL, NULL);
6825
6826 /* Forward model error (always considered in retrieval fit)... */
6827 copy_obs(ctl, obs_err, obs, 1);
6828 for (int ir = 0; ir < obs_err->nr; ir++)
6829 for (int id = 0; id < ctl->nd; id++)
6830 obs_err->rad[id][ir]
6831 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
6832 obs2y(ctl, obs_err, sig_formod, NULL, NULL);
6833
6834 /* Total error... */
6835 for (size_t i = 0; i < m; i++)
6836 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
6837 +
6838 POW2(gsl_vector_get
6839 (sig_formod, i))));
6840
6841 /* Check standard deviations... */
6842 for (size_t i = 0; i < m; i++)
6843 if (gsl_vector_get(sig_eps_inv, i) <= 0)
6844 ERRMSG("Check measurement errors (zero standard deviation)!");
6845
6846 /* Free... */
6847 free(obs_err);
6848}
6849
6850/*****************************************************************************/
6851
6853 const ret_t *ret,
6854 const char *shared_file,
6855 const char *legacy_file,
6856 const char **dirname,
6857 int *profile) {
6858
6859 if (shared_file[0] != '-') {
6860 *dirname = NULL;
6861 *profile = ret->shared_io_profile;
6862 return shared_file;
6863 }
6864
6865 *dirname = ret->dir;
6866 *profile = 0;
6867 return legacy_file;
6868}
6869
6870/*****************************************************************************/
6871
6873 const ret_t *ret,
6874 const char *shared_file,
6875 const char *legacy_file,
6876 const char **dirname,
6877 int *profile) {
6878
6879 if (shared_file[0] != '-') {
6880 *dirname = NULL;
6881 *profile = ret->shared_io_profile;
6882 return shared_file;
6883 }
6884
6885 *dirname = ret->dir;
6886 *profile = 0;
6887 return legacy_file;
6888}
6889
6890/*****************************************************************************/
6891
6893 const ret_t *ret) {
6894
6895 const char *base = shared_io_output_file(ret);
6896 if (base == NULL)
6897 return -1;
6898
6899 char lockfile[LEN];
6900 if (snprintf(lockfile, LEN, "%s.lock", base) >= LEN)
6901 ERRMSG("Lock file name too long!");
6902 int fd = open(lockfile, O_CREAT | O_RDWR, 0666);
6903 if (fd < 0)
6904 ERRMSG("Cannot open lock file!");
6905
6906 struct flock fl;
6907 fl.l_type = F_WRLCK;
6908 fl.l_whence = SEEK_SET;
6909 fl.l_start = 0;
6910 fl.l_len = 0;
6911 if (fcntl(fd, F_SETLKW, &fl) < 0)
6912 ERRMSG("Cannot lock shared output file!");
6913
6914 return fd;
6915}
6916
6917/*****************************************************************************/
6918
6920 int fd) {
6921
6922 if (fd < 0)
6923 return;
6924
6925 struct flock fl;
6926 fl.l_type = F_UNLCK;
6927 fl.l_whence = SEEK_SET;
6928 fl.l_start = 0;
6929 fl.l_len = 0;
6930 if (fcntl(fd, F_SETLK, &fl) < 0)
6931 ERRMSG("Cannot unlock shared output file!");
6932 close(fd);
6933}
6934
6935/*****************************************************************************/
6936
6938 const ret_t *ret) {
6939
6940 if (ret->shared_io_atm_final_file[0] != '-')
6941 return ret->shared_io_atm_final_file;
6942 if (ret->shared_io_obs_final_file[0] != '-')
6943 return ret->shared_io_obs_final_file;
6944 if (ret->shared_io_matrix_cov_apr_file[0] != '-')
6946 if (ret->shared_io_matrix_kernel_file[0] != '-')
6947 return ret->shared_io_matrix_kernel_file;
6948 if (ret->shared_io_matrix_cov_ret_file[0] != '-')
6950 if (ret->shared_io_matrix_corr_file[0] != '-')
6951 return ret->shared_io_matrix_corr_file;
6952 if (ret->shared_io_matrix_gain_file[0] != '-')
6953 return ret->shared_io_matrix_gain_file;
6954 if (ret->shared_io_matrix_avk_file[0] != '-')
6955 return ret->shared_io_matrix_avk_file;
6956 if (ret->shared_io_atm_err_total_file[0] != '-')
6957 return ret->shared_io_atm_err_total_file;
6958 if (ret->shared_io_atm_err_noise_file[0] != '-')
6959 return ret->shared_io_atm_err_noise_file;
6960 if (ret->shared_io_atm_err_formod_file[0] != '-')
6962 if (ret->shared_io_atm_cont_file[0] != '-')
6963 return ret->shared_io_atm_cont_file;
6964 if (ret->shared_io_atm_res_file[0] != '-')
6965 return ret->shared_io_atm_res_file;
6966 return NULL;
6967}
6968
6969/*****************************************************************************/
6970
6972 const los_t *los,
6973 double *tpz,
6974 double *tplon,
6975 double *tplat) {
6976
6977 /* Find minimum altitude... */
6978 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
6979
6980 /* Nadir or zenith... */
6981 if (ip <= 0 || ip >= (size_t) los->np - 1) {
6982 *tpz = los->z[los->np - 1];
6983 *tplon = los->lon[los->np - 1];
6984 *tplat = los->lat[los->np - 1];
6985 }
6986
6987 /* Limb... */
6988 else {
6989
6990 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
6991 const double yy0 = los->z[ip - 1];
6992 const double yy1 = los->z[ip];
6993 const double yy2 = los->z[ip + 1];
6994 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
6995 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
6996 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
6997 const double b = -(yy0 - yy1) / x1 - a * x1;
6998 const double c = yy0;
6999
7000 /* Get tangent point location... */
7001 double dummy, v[3], v0[3], v2[3];
7002 const double x = -b / (2 * a);
7003 *tpz = a * x * x + b * x + c;
7004 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
7005 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
7006 for (int i = 0; i < 3; i++)
7007 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
7008 cart2geo(v, &dummy, tplon, tplat);
7009 }
7010}
7011
7012/*****************************************************************************/
7013
7015 const ctl_t *ctl,
7016 tbl_t *tbl) {
7017
7018 /* Check pointer... */
7019 if (!tbl)
7020 return;
7021
7022 /* Loop over channels and emitters... */
7023 for (int id = 0; id < ctl->nd; id++)
7024 for (int ig = 0; ig < ctl->ng; ig++) {
7025
7026 /* Check number of pressure levels... */
7027 const int np = tbl->np[id][ig];
7028 if (np < 0)
7029 continue;
7030
7031 /* Loop over pressure levels... */
7032 for (int ip = 0; ip < np; ip++) {
7033
7034 /* Loop over temperature levels... */
7035 const int nt = tbl->nt[id][ig][ip];
7036 for (int it = 0; it < nt; it++) {
7037
7038 /* Free... */
7039 free(tbl->logu[id][ig][ip][it]);
7040 free(tbl->logeps[id][ig][ip][it]);
7041 tbl->logu[id][ig][ip][it] = NULL;
7042 tbl->logeps[id][ig][ip][it] = NULL;
7043 }
7044 }
7045 }
7046
7047 /* Free... */
7048 free(tbl);
7049}
7050
7051/*****************************************************************************/
7052
7054 const tbl_t *tbl,
7055 int id,
7056 int ig,
7057 uint8_t *buf,
7058 size_t *bytes_used) {
7059
7060 uint8_t *cur = buf;
7061
7062 /* Pack lookup table... */
7063 int np = tbl->np[id][ig];
7064 memcpy(cur, &np, sizeof(np));
7065 cur += sizeof(np);
7066
7067 memcpy(cur, tbl->p[id][ig], (size_t) np * sizeof(double));
7068 cur += ((size_t) np * sizeof(double));
7069
7070 for (int ip = 0; ip < np; ip++) {
7071 int nt = tbl->nt[id][ig][ip];
7072 memcpy(cur, &nt, sizeof(nt));
7073 cur += sizeof(nt);
7074
7075 memcpy(cur, tbl->t[id][ig][ip], (size_t) nt * sizeof(double));
7076 cur += ((size_t) nt * sizeof(double));
7077
7078 for (int it = 0; it < nt; it++) {
7079 int nu = tbl->nu[id][ig][ip][it];
7080 memcpy(cur, &nu, sizeof(nu));
7081 cur += sizeof(nu);
7082
7083 memcpy(cur, tbl->logu[id][ig][ip][it], (size_t) nu * sizeof(float));
7084 cur += ((size_t) nu * sizeof(float));
7085
7086 memcpy(cur, tbl->logeps[id][ig][ip][it], (size_t) nu * sizeof(float));
7087 cur += ((size_t) nu * sizeof(float));
7088 }
7089 }
7090
7091 /* Pack filter function... */
7092 const int n = tbl->filt_n[id];
7093 memcpy(cur, &n, sizeof(n));
7094 cur += sizeof(n);
7095
7096 memcpy(cur, tbl->filt_nu[id], (size_t) n * sizeof(double));
7097 cur += ((size_t) n * sizeof(double));
7098
7099 memcpy(cur, tbl->filt_f[id], (size_t) n * sizeof(double));
7100 cur += ((size_t) n * sizeof(double));
7101
7102 *bytes_used = (size_t) (cur - buf);
7103}
7104
7105/*****************************************************************************/
7106
7108 const tbl_t *tbl,
7109 int id,
7110 int ig) {
7111
7112 size_t bytes = 0;
7113
7114 /* Size of lookup table... */
7115 const int np = tbl->np[id][ig];
7116 bytes += sizeof(int);
7117 bytes += ((size_t) np * sizeof(double));
7118
7119 for (int ip = 0; ip < np; ip++) {
7120 const int nt = tbl->nt[id][ig][ip];
7121 bytes += sizeof(int);
7122 bytes += ((size_t) nt * sizeof(double));
7123
7124 for (int it = 0; it < nt; it++) {
7125 const int nu = tbl->nu[id][ig][ip][it];
7126 bytes += sizeof(int);
7127 bytes += (2 * (size_t) nu * sizeof(float));
7128 }
7129 }
7130
7131 /* Size of filter function... */
7132 const int n = tbl->filt_n[id];
7133 bytes += sizeof(int);
7134 bytes += (2 * (size_t) n * sizeof(double));
7135
7136 return bytes;
7137}
7138
7139/*****************************************************************************/
7140
7142 tbl_t *tbl,
7143 int id,
7144 int ig,
7145 const uint8_t *buf) {
7146
7147 const uint8_t *cur = buf;
7148
7149 /* Unpack lookup table... */
7150 int np;
7151 memcpy(&np, cur, sizeof(np));
7152 cur += sizeof(np);
7153
7154 if (np < 0 || np > TBLNP)
7155 ERRMSG("np out of range!");
7156 tbl->np[id][ig] = np;
7157
7158 memcpy(tbl->p[id][ig], cur, (size_t) np * sizeof(double));
7159 cur += ((size_t) np * sizeof(double));
7160
7161 for (int ip = 0; ip < np; ip++) {
7162
7163 int nt;
7164 memcpy(&nt, cur, sizeof(nt));
7165 cur += sizeof(nt);
7166
7167 if (nt < 0 || nt > TBLNT)
7168 ERRMSG("nt out of range!");
7169 tbl->nt[id][ig][ip] = nt;
7170
7171 memcpy(tbl->t[id][ig][ip], cur, (size_t) nt * sizeof(double));
7172 cur += ((size_t) nt * sizeof(double));
7173
7174 for (int it = 0; it < nt; it++) {
7175
7176 int nu;
7177 memcpy(&nu, cur, sizeof(nu));
7178 cur += sizeof(nu);
7179
7180 if (nu < 0 || nu > TBLNU)
7181 ERRMSG("nu out of range!");
7182 tbl->nu[id][ig][ip][it] = nu;
7183
7184 ALLOC(tbl->logu[id][ig][ip][it], float,
7185 nu);
7186 ALLOC(tbl->logeps[id][ig][ip][it], float,
7187 nu);
7188
7189 memcpy(tbl->logu[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7190 cur += ((size_t) nu * sizeof(float));
7191
7192 memcpy(tbl->logeps[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7193 cur += ((size_t) nu * sizeof(float));
7194 }
7195 }
7196
7197 /* Unpack filter function... */
7198 int n;
7199 memcpy(&n, cur, sizeof(n));
7200 cur += sizeof(n);
7201
7202 if (n < 2 || n > NSHAPE)
7203 ERRMSG("Missing or invalid filter function (filt_n) in packed table!");
7204 tbl->filt_n[id] = n;
7205
7206 memcpy(tbl->filt_nu[id], cur, (size_t) n * sizeof(double));
7207 cur += ((size_t) n * sizeof(double));
7208
7209 memcpy(tbl->filt_f[id], cur, (size_t) n * sizeof(double));
7210 cur += ((size_t) n * sizeof(double));
7211
7212 return (size_t) (cur - buf);
7213}
7214
7215/*****************************************************************************/
7216
7218 const int year,
7219 const int mon,
7220 const int day,
7221 const int hour,
7222 const int min,
7223 const int sec,
7224 const double remain,
7225 double *jsec) {
7226
7227 struct tm t0, t1;
7228
7229 t0.tm_year = 100;
7230 t0.tm_mon = 0;
7231 t0.tm_mday = 1;
7232 t0.tm_hour = 0;
7233 t0.tm_min = 0;
7234 t0.tm_sec = 0;
7235
7236 t1.tm_year = year - 1900;
7237 t1.tm_mon = mon - 1;
7238 t1.tm_mday = day;
7239 t1.tm_hour = hour;
7240 t1.tm_min = min;
7241 t1.tm_sec = sec;
7242
7243 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
7244}
7245
7246/*****************************************************************************/
7247
7249 const char *name,
7250 const char *group,
7251 int output) {
7252
7253 static char names[NTIMER][100], groups[NTIMER][100];
7254 static double rt_name[NTIMER], rt_group[NTIMER], rt_min[NTIMER],
7255 rt_max[NTIMER], rt_sq[NTIMER], t0, t1;
7256 static int ct_name[NTIMER], iname = -1, igroup = -1, nname, ngroup;
7257
7258 /* Get time... */
7259 t1 = omp_get_wtime();
7260 const double dt = t1 - t0;
7261
7262 /* Accumulate runtime for current timer... */
7263 if (iname >= 0) {
7264 rt_name[iname] += dt;
7265 rt_sq[iname] += POW2(dt);
7266 rt_min[iname] = (ct_name[iname] <= 0 ? dt : MIN(rt_min[iname], dt));
7267 rt_max[iname] = (ct_name[iname] <= 0 ? dt : MAX(rt_max[iname], dt));
7268 ct_name[iname]++;
7269 }
7270 if (igroup >= 0)
7271 rt_group[igroup] += dt;
7272
7273 /* Write summary... */
7274 if (output) {
7275 for (int i = 0; i < nname; i++) {
7276 const double mean = rt_name[i] / ct_name[i];
7277 const double variance = MAX(0.0, rt_sq[i] / ct_name[i] - POW2(mean));
7278 LOG(1,
7279 "TIMER_%s = %.3f s (min= %g s, mean= %g s, stddev= %g s, max= %g s, n= %d)",
7280 names[i], rt_name[i], rt_min[i], mean, sqrt(variance), rt_max[i],
7281 ct_name[i]);
7282 }
7283 for (int i = 0; i < ngroup; i++)
7284 LOG(1, "TIMER_GROUP_%s = %.3f s", groups[i], rt_group[i]);
7285 double total = 0.0;
7286 for (int i = 0; i < nname; i++)
7287 total += rt_name[i];
7288 LOG(1, "TIMER_TOTAL = %.3f s", total);
7289 }
7290
7291 /* Identify next timer name... */
7292 for (iname = 0; iname < nname; iname++)
7293 if (strcasecmp(name, names[iname]) == 0)
7294 break;
7295 for (igroup = 0; igroup < ngroup; igroup++)
7296 if (strcasecmp(group, groups[igroup]) == 0)
7297 break;
7298
7299 /* Add new timer name if needed... */
7300 if (iname >= nname) {
7301 sprintf(names[iname], "%s", name);
7302 if ((++nname) >= NTIMER)
7303 ERRMSG("Too many timers!");
7304 }
7305
7306 /* Add new timer group if needed... */
7307 if (igroup >= ngroup) {
7308 sprintf(groups[igroup], "%s", group);
7309 if ((++ngroup) >= NTIMER)
7310 ERRMSG("Too many groups!");
7311 }
7312
7313 /* Save time stamp for next phase... */
7314 t0 = t1;
7315}
7316
7317/*****************************************************************************/
7318
7320 const char *dirname,
7321 const char *filename,
7322 const ctl_t *ctl,
7323 const atm_t *atm,
7324 int profile) {
7325
7326 /* Set filename... */
7327 char file[LEN];
7328 if (dirname != NULL)
7329 sprintf(file, "%s/%s", dirname, filename);
7330 else
7331 sprintf(file, "%s", filename);
7332
7333 /* Write info... */
7334 LOG(1, "Write atmospheric data: %s", file);
7335
7336 /* Write ASCII data... */
7337 if (ctl->atmfmt == 1)
7338 write_atm_asc(file, ctl, atm);
7339
7340 /* Write binary data... */
7341 else if (ctl->atmfmt == 2)
7342 write_atm_bin(file, ctl, atm);
7343
7344 /* Write netCDF data... */
7345 else if (ctl->atmfmt == 3)
7346 write_atm_nc(file, ctl, atm, profile);
7347
7348 /* Error... */
7349 else
7350 ERRMSG("Unknown file format, check ATMFMT!");
7351
7352 /* Write info... */
7353 double mini, maxi;
7354 LOG(2, "Number of data points: %d", atm->np);
7355 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
7356 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
7357 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
7358 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
7359 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
7360 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
7361 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
7362 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
7363 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
7364 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
7365 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
7366 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
7367 for (int ig = 0; ig < ctl->ng; ig++) {
7368 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
7369 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
7370 }
7371 for (int iw = 0; iw < ctl->nw; iw++) {
7372 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
7373 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
7374 }
7375 if (ctl->ncl > 0) {
7376 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
7377 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
7378 } else
7379 LOG(2, "Cloud layer: none");
7380 if (ctl->nsf > 0) {
7381 LOG(2,
7382 "Surface: T_s = %g K | eps= %g ... %g",
7383 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
7384 } else
7385 LOG(2, "Surface: none");
7386}
7387
7388/*****************************************************************************/
7389
7391 const char *filename,
7392 const ctl_t *ctl,
7393 const atm_t *atm) {
7394
7395 int n = 6;
7396
7397 /* Create file... */
7398 FILE *out;
7399 if (!(out = fopen(filename, "w")))
7400 ERRMSG("Cannot create file!");
7401
7402 /* Write header... */
7403 fprintf(out,
7404 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
7405 "# $2 = altitude [km]\n"
7406 "# $3 = longitude [deg]\n"
7407 "# $4 = latitude [deg]\n"
7408 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
7409 for (int ig = 0; ig < ctl->ng; ig++)
7410 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
7411 ++n, ctl->emitter[ig]);
7412 for (int iw = 0; iw < ctl->nw; iw++)
7413 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
7414 if (ctl->ncl > 0) {
7415 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
7416 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
7417 for (int icl = 0; icl < ctl->ncl; icl++)
7418 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
7419 ++n, ctl->clnu[icl]);
7420 }
7421 if (ctl->nsf > 0) {
7422 fprintf(out, "# $%d = surface temperature [K]\n", ++n);
7423 for (int isf = 0; isf < ctl->nsf; isf++)
7424 fprintf(out, "# $%d = surface emissivity (%.4f cm^-1)\n",
7425 ++n, ctl->sfnu[isf]);
7426 }
7427
7428 /* Write data... */
7429 for (int ip = 0; ip < atm->np; ip++) {
7430 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
7431 fprintf(out, "\n");
7432 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
7433 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
7434 for (int ig = 0; ig < ctl->ng; ig++)
7435 fprintf(out, " %g", atm->q[ig][ip]);
7436 for (int iw = 0; iw < ctl->nw; iw++)
7437 fprintf(out, " %g", atm->k[iw][ip]);
7438 if (ctl->ncl > 0) {
7439 fprintf(out, " %g %g", atm->clz, atm->cldz);
7440 for (int icl = 0; icl < ctl->ncl; icl++)
7441 fprintf(out, " %g", atm->clk[icl]);
7442 }
7443 if (ctl->nsf > 0) {
7444 fprintf(out, " %g", atm->sft);
7445 for (int isf = 0; isf < ctl->nsf; isf++)
7446 fprintf(out, " %g", atm->sfeps[isf]);
7447 }
7448 fprintf(out, "\n");
7449 }
7450
7451 /* Close file... */
7452 fclose(out);
7453}
7454
7455/*****************************************************************************/
7456
7458 const char *filename,
7459 const ctl_t *ctl,
7460 const atm_t *atm) {
7461
7462 /* Create file... */
7463 FILE *out;
7464 if (!(out = fopen(filename, "w")))
7465 ERRMSG("Cannot create file!");
7466
7467 /* Write header... */
7468 FWRITE("ATM1", char,
7469 4,
7470 out);
7471 FWRITE(&ctl->ng, int,
7472 1,
7473 out);
7474 FWRITE(&ctl->nw, int,
7475 1,
7476 out);
7477 FWRITE(&ctl->ncl, int,
7478 1,
7479 out);
7480 FWRITE(&ctl->nsf, int,
7481 1,
7482 out);
7483
7484 /* Write data... */
7485 size_t np = (size_t) atm->np;
7486 FWRITE(&np, size_t,
7487 1,
7488 out);
7489 FWRITE(atm->time, double,
7490 np,
7491 out);
7492 FWRITE(atm->z, double,
7493 np,
7494 out);
7495 FWRITE(atm->lon, double,
7496 np,
7497 out);
7498 FWRITE(atm->lat, double,
7499 np,
7500 out);
7501 FWRITE(atm->p, double,
7502 np,
7503 out);
7504 FWRITE(atm->t, double,
7505 np,
7506 out);
7507 for (int ig = 0; ig < ctl->ng; ig++)
7508 FWRITE(atm->q[ig], double,
7509 np,
7510 out);
7511 for (int iw = 0; iw < ctl->nw; iw++)
7512 FWRITE(atm->k[iw], double,
7513 np,
7514 out);
7515 if (ctl->ncl > 0) {
7516 FWRITE(&atm->clz, double,
7517 1,
7518 out);
7519 FWRITE(&atm->cldz, double,
7520 1,
7521 out);
7522 FWRITE(atm->clk, double,
7523 (size_t) ctl->ncl,
7524 out);
7525 }
7526 if (ctl->nsf > 0) {
7527 FWRITE(&atm->sft, double,
7528 1,
7529 out);
7530 FWRITE(atm->sfeps, double,
7531 (size_t) ctl->nsf,
7532 out);
7533 }
7534
7535 /* Close file... */
7536 fclose(out);
7537}
7538
7539/*****************************************************************************/
7540
7542 const char *filename,
7543 const ctl_t *ctl,
7544 const atm_t *atm,
7545 int profile) {
7546
7547 char longname[LEN], varname[LEN];
7548
7549 int ncid, varid, dim_profile, dim_level;
7550
7551 size_t level_max;
7552
7553 /* Check number of levels... */
7554 if (atm->np < 1 || atm->np > NP)
7555 ERRMSG("Number of levels out of range!");
7556
7557 /* Open or create file... */
7558 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7559 NC(nc_create(filename, NC_NETCDF4, &ncid));
7560
7561 /* Enter define mode... */
7562 int r = nc_redef(ncid);
7563 if (r != NC_NOERR && r != NC_EINDEFINE)
7564 NC(r);
7565
7566 /* Define profile dimension (unlimited)... */
7567 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
7568 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
7569
7570 /* Define level dimension (fixed)... */
7571 if (nc_inq_dimid(ncid, "level", &dim_level) == NC_NOERR) {
7572 NC(nc_inq_dimlen(ncid, dim_level, &level_max));
7573 if (level_max < 1 || level_max > (size_t) NP)
7574 ERRMSG("netCDF dimension level is out of range!");
7575 if ((size_t) atm->np > level_max)
7576 ERRMSG("profile has too many levels!");
7577 } else {
7578 level_max = (size_t) atm->np;
7579 NC(nc_def_dim(ncid, "level", level_max, &dim_level));
7580 }
7581
7582 /* Set dimension IDs... */
7583 int dimids[2] = { dim_profile, dim_level };
7584
7585 /* Tunables for compression/quantization... */
7586 const int deflate_level = 0;
7587 const int quant_digits = 0;
7588
7589 /* Define nlev (1D)... */
7590 if (nc_inq_varid(ncid, "nlev", &varid) != NC_NOERR)
7591 NC_DEF_VAR("nlev", NC_INT, 1, dimids,
7592 "number of vertical levels", "1", 0, 0);
7593
7594 /* Define core variables (2D)... */
7595 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
7596 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
7597 "time in seconds since 2000-01-01, 00:00 UTC", "s",
7598 deflate_level, 0);
7599
7600 if (nc_inq_varid(ncid, "z", &varid) != NC_NOERR)
7601 NC_DEF_VAR("z", NC_DOUBLE, 2, dimids, "altitude", "km", deflate_level, 0);
7602
7603 if (nc_inq_varid(ncid, "lon", &varid) != NC_NOERR)
7604 NC_DEF_VAR("lon", NC_DOUBLE, 2, dimids,
7605 "longitude", "degrees_east", deflate_level, 0);
7606
7607 if (nc_inq_varid(ncid, "lat", &varid) != NC_NOERR)
7608 NC_DEF_VAR("lat", NC_DOUBLE, 2, dimids,
7609 "latitude", "degrees_north", deflate_level, 0);
7610
7611 if (nc_inq_varid(ncid, "p", &varid) != NC_NOERR)
7612 NC_DEF_VAR("p", NC_DOUBLE, 2, dimids,
7613 "pressure", "hPa", deflate_level, quant_digits);
7614
7615 if (nc_inq_varid(ncid, "t", &varid) != NC_NOERR)
7616 NC_DEF_VAR("t", NC_DOUBLE, 2, dimids,
7617 "temperature", "K", deflate_level, quant_digits);
7618
7619 /* Write emitters (2D)... */
7620 for (int ig = 0; ig < ctl->ng; ig++)
7621 if (nc_inq_varid(ncid, ctl->emitter[ig], &varid) != NC_NOERR) {
7622 sprintf(longname, "%s volume mixing ratio", ctl->emitter[ig]);
7623 NC_DEF_VAR(ctl->emitter[ig], NC_DOUBLE, 2, dimids,
7624 longname, "ppv", deflate_level, quant_digits);
7625 }
7626
7627 /* Write extinction (2D)... */
7628 for (int iw = 0; iw < ctl->nw; iw++) {
7629 sprintf(varname, "ext_win_%d", iw);
7630 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7631 sprintf(longname, "extinction (window %d)", iw);
7632 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids,
7633 longname, "km**-1", deflate_level, quant_digits);
7634 }
7635 }
7636
7637 /* Write cloud variables (1D)... */
7638 if (ctl->ncl > 0) {
7639 if (nc_inq_varid(ncid, "cld_z", &varid) != NC_NOERR)
7640 NC_DEF_VAR("cld_z", NC_DOUBLE, 1, dimids,
7641 "cloud layer height", "km", deflate_level, quant_digits);
7642
7643 if (nc_inq_varid(ncid, "cld_dz", &varid) != NC_NOERR)
7644 NC_DEF_VAR("cld_dz", NC_DOUBLE, 1, dimids,
7645 "cloud layer depth", "km", deflate_level, quant_digits);
7646
7647 for (int icl = 0; icl < ctl->ncl; icl++) {
7648 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7649 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7650 sprintf(longname, "cloud layer extinction (%.4f cm^-1)",
7651 ctl->clnu[icl]);
7652 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "km**-1",
7653 deflate_level, quant_digits);
7654 }
7655 }
7656 }
7657
7658 /* Write surface variables (1D)... */
7659 if (ctl->nsf > 0) {
7660 if (nc_inq_varid(ncid, "srf_t", &varid) != NC_NOERR)
7661 NC_DEF_VAR("srf_t", NC_DOUBLE, 1, dimids,
7662 "surface temperature", "K", deflate_level, quant_digits);
7663
7664 for (int isf = 0; isf < ctl->nsf; isf++) {
7665 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7666 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7667 sprintf(longname, "surface emissivity (%.4f cm^-1)", ctl->sfnu[isf]);
7668 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "1",
7669 deflate_level, quant_digits);
7670 }
7671 }
7672 }
7673
7674 /* Leave define mode... */
7675 NC(nc_enddef(ncid));
7676
7677 /* Define hyperslabs... */
7678 size_t start[2] = { (size_t) profile, 0 };
7679 size_t count[2] = { 1, (size_t) atm->np };
7680
7681 /* Write nlev... */
7682 NC_PUT_INT("nlev", &atm->np, 1);
7683
7684 /* Write core variables... */
7685 NC_PUT_DOUBLE("time", atm->time, 1);
7686 NC_PUT_DOUBLE("z", atm->z, 1);
7687 NC_PUT_DOUBLE("lon", atm->lon, 1);
7688 NC_PUT_DOUBLE("lat", atm->lat, 1);
7689 NC_PUT_DOUBLE("p", atm->p, 1);
7690 NC_PUT_DOUBLE("t", atm->t, 1);
7691
7692 /* Write emitters... */
7693 for (int ig = 0; ig < ctl->ng; ig++)
7694 NC_PUT_DOUBLE(ctl->emitter[ig], atm->q[ig], 1);
7695
7696 /* Write extinction... */
7697 for (int iw = 0; iw < ctl->nw; iw++) {
7698 sprintf(varname, "ext_win_%d", iw);
7699 NC_PUT_DOUBLE(varname, atm->k[iw], 1);
7700 }
7701
7702 /* Write cloud variables... */
7703 if (ctl->ncl > 0) {
7704 NC_PUT_DOUBLE("cld_z", &atm->clz, 1);
7705 NC_PUT_DOUBLE("cld_dz", &atm->cldz, 1);
7706 for (int icl = 0; icl < ctl->ncl; icl++) {
7707 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7708 NC_PUT_DOUBLE(varname, &atm->clk[icl], 1);
7709 }
7710 }
7711
7712 /* Write surface variables... */
7713 if (ctl->nsf > 0) {
7714 NC_PUT_DOUBLE("srf_t", &atm->sft, 1);
7715 for (int isf = 0; isf < ctl->nsf; isf++) {
7716 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7717 NC_PUT_DOUBLE(varname, &atm->sfeps[isf], 1);
7718 }
7719 }
7720
7721 /* Close file... */
7722 NC(nc_sync(ncid));
7723 NC(nc_close(ncid));
7724}
7725
7726/*****************************************************************************/
7727
7729 const char *filename,
7730 const ctl_t *ctl,
7731 const atm_t *atm) {
7732
7733 /* Write info... */
7734 LOG(1, "Write RFM data: %s", filename);
7735
7736 /* Create file... */
7737 FILE *out;
7738 if (!(out = fopen(filename, "w")))
7739 ERRMSG("Cannot create file!");
7740
7741 /* Write data... */
7742 fprintf(out, "%d\n", atm->np);
7743 fprintf(out, "*HGT [km]\n");
7744 for (int ip = 0; ip < atm->np; ip++)
7745 fprintf(out, "%g\n", atm->z[ip]);
7746 fprintf(out, "*PRE [mb]\n");
7747 for (int ip = 0; ip < atm->np; ip++)
7748 fprintf(out, "%g\n", atm->p[ip]);
7749 fprintf(out, "*TEM [K]\n");
7750 for (int ip = 0; ip < atm->np; ip++)
7751 fprintf(out, "%g\n", atm->t[ip]);
7752 for (int ig = 0; ig < ctl->ng; ig++) {
7753 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
7754 for (int ip = 0; ip < atm->np; ip++)
7755 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
7756 }
7757 fprintf(out, "*END\n");
7758
7759 /* Close file... */
7760 fclose(out);
7761}
7762
7763/*****************************************************************************/
7764
7766 const char *dirname,
7767 const char *filename,
7768 const ctl_t *ctl,
7769 const gsl_matrix *matrix,
7770 const atm_t *atm,
7771 const obs_t *obs,
7772 const char *rowspace,
7773 const char *colspace,
7774 const char *sort,
7775 int dataset) {
7776
7777 /* Check output flag... */
7778 if (!ctl->write_matrix)
7779 return;
7780
7781 /* Write ASCII data... */
7782 if (ctl->matrixfmt == 1)
7783 write_matrix_asc(dirname, filename, ctl, matrix, atm, obs,
7784 rowspace, colspace, sort);
7785
7786 /* Write binary data... */
7787 else if (ctl->matrixfmt == 2)
7788 write_matrix_bin(dirname, filename, matrix);
7789
7790 /* Write netCDF data... */
7791 else if (ctl->matrixfmt == 3)
7792 write_matrix_nc(dirname, filename, ctl, matrix, atm, obs,
7793 rowspace, colspace, sort, dataset);
7794
7795 /* Error... */
7796 else
7797 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
7798}
7799
7800/*****************************************************************************/
7801
7803 const char *dirname,
7804 const char *filename,
7805 const ctl_t *ctl,
7806 const gsl_matrix *matrix,
7807 const atm_t *atm,
7808 const obs_t *obs,
7809 const char *rowspace,
7810 const char *colspace,
7811 const char *sort) {
7812
7813 char file[LEN], quantity[LEN];
7814
7815 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
7816
7817 size_t i, j, nc, nr;
7818
7819 /* Allocate... */
7820 ALLOC(cida, int,
7821 M);
7822 ALLOC(ciqa, int,
7823 N);
7824 ALLOC(cipa, int,
7825 N);
7826 ALLOC(cira, int,
7827 M);
7828 ALLOC(rida, int,
7829 M);
7830 ALLOC(riqa, int,
7831 N);
7832 ALLOC(ripa, int,
7833 N);
7834 ALLOC(rira, int,
7835 M);
7836
7837 /* Set filename... */
7838 if (dirname != NULL)
7839 sprintf(file, "%s/%s", dirname, filename);
7840 else
7841 sprintf(file, "%s", filename);
7842
7843 /* Write info... */
7844 LOG(1, "Write matrix: %s", file);
7845
7846 /* Create file... */
7847 FILE *out;
7848 if (!(out = fopen(file, "w")))
7849 ERRMSG("Cannot create file!");
7850
7851 /* Write header (row space)... */
7852 if (rowspace[0] == 'y') {
7853
7854 fprintf(out,
7855 "# $1 = Row: index (measurement space)\n"
7856 "# $2 = Row: channel wavenumber [cm^-1]\n"
7857 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7858 "# $4 = Row: view point altitude [km]\n"
7859 "# $5 = Row: view point longitude [deg]\n"
7860 "# $6 = Row: view point latitude [deg]\n");
7861
7862 /* Get number of rows... */
7863 nr = obs2y(ctl, obs, NULL, rida, rira);
7864
7865 } else {
7866
7867 fprintf(out,
7868 "# $1 = Row: index (state space)\n"
7869 "# $2 = Row: name of quantity\n"
7870 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7871 "# $4 = Row: altitude [km]\n"
7872 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
7873
7874 /* Get number of rows... */
7875 nr = atm2x(ctl, atm, NULL, riqa, ripa);
7876 }
7877
7878 /* Write header (column space)... */
7879 if (colspace[0] == 'y') {
7880
7881 fprintf(out,
7882 "# $7 = Col: index (measurement space)\n"
7883 "# $8 = Col: channel wavenumber [cm^-1]\n"
7884 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7885 "# $10 = Col: view point altitude [km]\n"
7886 "# $11 = Col: view point longitude [deg]\n"
7887 "# $12 = Col: view point latitude [deg]\n");
7888
7889 /* Get number of columns... */
7890 nc = obs2y(ctl, obs, NULL, cida, cira);
7891
7892 } else {
7893
7894 fprintf(out,
7895 "# $7 = Col: index (state space)\n"
7896 "# $8 = Col: name of quantity\n"
7897 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7898 "# $10 = Col: altitude [km]\n"
7899 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
7900
7901 /* Get number of columns... */
7902 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
7903 }
7904
7905 /* Write header entry... */
7906 fprintf(out, "# $13 = Matrix element\n\n");
7907
7908 /* Write matrix data... */
7909 i = j = 0;
7910 while (i < nr && j < nc) {
7911
7912 /* Write info about the row... */
7913 if (rowspace[0] == 'y')
7914 fprintf(out, "%d %.4f %.2f %g %g %g",
7915 (int) i, ctl->nu[rida[i]],
7916 obs->time[rira[i]], obs->vpz[rira[i]],
7917 obs->vplon[rira[i]], obs->vplat[rira[i]]);
7918 else {
7919 idx2name(ctl, riqa[i], quantity);
7920 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
7921 atm->time[ripa[i]], atm->z[ripa[i]],
7922 atm->lon[ripa[i]], atm->lat[ripa[i]]);
7923 }
7924
7925 /* Write info about the column... */
7926 if (colspace[0] == 'y')
7927 fprintf(out, " %d %.4f %.2f %g %g %g",
7928 (int) j, ctl->nu[cida[j]],
7929 obs->time[cira[j]], obs->vpz[cira[j]],
7930 obs->vplon[cira[j]], obs->vplat[cira[j]]);
7931 else {
7932 idx2name(ctl, ciqa[j], quantity);
7933 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
7934 atm->time[cipa[j]], atm->z[cipa[j]],
7935 atm->lon[cipa[j]], atm->lat[cipa[j]]);
7936 }
7937
7938 /* Write matrix entry... */
7939 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
7940
7941 /* Set matrix indices... */
7942 if (sort[0] == 'r') {
7943 j++;
7944 if (j >= nc) {
7945 j = 0;
7946 i++;
7947 fprintf(out, "\n");
7948 }
7949 } else {
7950 i++;
7951 if (i >= nr) {
7952 i = 0;
7953 j++;
7954 fprintf(out, "\n");
7955 }
7956 }
7957 }
7958
7959 /* Close file... */
7960 fclose(out);
7961
7962 /* Free... */
7963 free(cida);
7964 free(ciqa);
7965 free(cipa);
7966 free(cira);
7967 free(rida);
7968 free(riqa);
7969 free(ripa);
7970 free(rira);
7971}
7972
7973/*****************************************************************************/
7974
7976 const char *dirname,
7977 const char *filename,
7978 const gsl_matrix *matrix) {
7979
7980 char file[LEN];
7981 const size_t nr = matrix->size1;
7982 const size_t nc = matrix->size2;
7983
7984 /* Set filename... */
7985 if (dirname != NULL)
7986 sprintf(file, "%s/%s", dirname, filename);
7987 else
7988 sprintf(file, "%s", filename);
7989
7990 /* Write info... */
7991 LOG(1, "Write matrix: %s", file);
7992
7993 /* Create file... */
7994 FILE *out;
7995 if (!(out = fopen(file, "w")))
7996 ERRMSG("Cannot create file!");
7997
7998 /* Write header... */
7999 FWRITE("MAT1", char,
8000 4,
8001 out);
8002 FWRITE(&nr, size_t,
8003 1,
8004 out);
8005 FWRITE(&nc, size_t,
8006 1,
8007 out);
8008
8009 /* Write data... */
8010 for (size_t i = 0; i < nr; i++)
8011 for (size_t j = 0; j < nc; j++) {
8012 double value = gsl_matrix_get(matrix, i, j);
8013 FWRITE(&value, double,
8014 1,
8015 out);
8016 }
8017
8018 /* Close file... */
8019 fclose(out);
8020}
8021
8022/*****************************************************************************/
8023
8025 const char *dirname,
8026 const char *filename,
8027 const ctl_t *ctl,
8028 const gsl_matrix *matrix,
8029 const atm_t *atm,
8030 const obs_t *obs,
8031 const char *rowspace,
8032 const char *colspace,
8033 const char *sort,
8034 int dataset) {
8035
8036 char file[LEN];
8037 char quantity[LEN];
8038 const size_t name_strlen = 100;
8039
8040 int ncid, dimid_dataset, dimid_row, dimid_col, dimid_name, varid;
8041 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
8042
8043 size_t nr = matrix->size1, nc = matrix->size2, naux;
8044
8045 /* Allocate metadata index arrays... */
8046 ALLOC(cida, int,
8047 M);
8048 ALLOC(ciqa, int,
8049 N);
8050 ALLOC(cipa, int,
8051 N);
8052 ALLOC(cira, int,
8053 M);
8054 ALLOC(rida, int,
8055 M);
8056 ALLOC(riqa, int,
8057 N);
8058 ALLOC(ripa, int,
8059 N);
8060 ALLOC(rira, int,
8061 M);
8062
8063 /* Set filename... */
8064 if (dirname != NULL)
8065 sprintf(file, "%s/%s", dirname, filename);
8066 else
8067 sprintf(file, "%s", filename);
8068
8069 /* Write info... */
8070 LOG(1, "Write matrix: %s", file);
8071
8072 /* Open or create file... */
8073 if (nc_open(file, NC_WRITE, &ncid) != NC_NOERR)
8074 NC(nc_create(file, NC_NETCDF4, &ncid));
8075
8076 /* Enter define mode... */
8077 int r = nc_redef(ncid);
8078 if (r != NC_NOERR && r != NC_EINDEFINE)
8079 NC(r);
8080
8081 /* Define dataset dimension (unlimited)... */
8082 if (nc_inq_dimid(ncid, "dataset", &dimid_dataset) != NC_NOERR)
8083 NC(nc_def_dim(ncid, "dataset", NC_UNLIMITED, &dimid_dataset));
8084
8085 /* Define row dimension (fixed)... */
8086 if (nc_inq_dimid(ncid, "row", &dimid_row) == NC_NOERR) {
8087 NC(nc_inq_dimlen(ncid, dimid_row, &naux));
8088 if (naux != nr)
8089 ERRMSG("matrix row dimension is incompatible!");
8090 } else
8091 NC(nc_def_dim(ncid, "row", nr, &dimid_row));
8092
8093 /* Define col dimension (fixed)... */
8094 if (nc_inq_dimid(ncid, "col", &dimid_col) == NC_NOERR) {
8095 NC(nc_inq_dimlen(ncid, dimid_col, &naux));
8096 if (naux != nc)
8097 ERRMSG("matrix col dimension is incompatible!");
8098 } else
8099 NC(nc_def_dim(ncid, "col", nc, &dimid_col));
8100
8101 /* Define fixed-length name dimension... */
8102 if (nc_inq_dimid(ncid, "name_strlen", &dimid_name) == NC_NOERR) {
8103 NC(nc_inq_dimlen(ncid, dimid_name, &naux));
8104 if (naux != name_strlen)
8105 ERRMSG("matrix name_strlen dimension is incompatible!");
8106 } else
8107 NC(nc_def_dim(ncid, "name_strlen", name_strlen, &dimid_name));
8108
8109 /* Define variables... */
8110 int dimids3[3] = { dimid_dataset, dimid_row, dimid_col };
8111 int dimids1[1] = { dimid_dataset };
8112 int dimids2_row[2] = { dimid_dataset, dimid_row };
8113 int dimids2_col[2] = { dimid_dataset, dimid_col };
8114 int dimids3_rowname[3] = { dimid_dataset, dimid_row, dimid_name };
8115 int dimids3_colname[3] = { dimid_dataset, dimid_col, dimid_name };
8116 if (nc_inq_varid(ncid, "matrix", &varid) != NC_NOERR) {
8117 NC(nc_def_var(ncid, "matrix", NC_DOUBLE, 3, dimids3, &varid));
8118 NC(nc_put_att_text(ncid, varid, "long_name", 14, "matrix element"));
8119 NC(nc_put_att_text(ncid, varid, "units", 1, "1"));
8120 }
8121 if (nc_inq_varid(ncid, "rowspace", &varid) != NC_NOERR)
8122 NC_DEF_VAR("rowspace", NC_CHAR, 1, dimids1,
8123 "row space selector", "1", 0, 0);
8124 if (nc_inq_varid(ncid, "colspace", &varid) != NC_NOERR)
8125 NC_DEF_VAR("colspace", NC_CHAR, 1, dimids1,
8126 "column space selector", "1", 0, 0);
8127 if (nc_inq_varid(ncid, "sort", &varid) != NC_NOERR)
8128 NC_DEF_VAR("sort", NC_CHAR, 1, dimids1,
8129 "matrix sort selector", "1", 0, 0);
8130 if (nc_inq_varid(ncid, "row_nu", &varid) != NC_NOERR)
8131 NC_DEF_VAR("row_nu", NC_DOUBLE, 2, dimids2_row,
8132 "row channel wavenumber", "cm^-1", 0, 0);
8133 if (nc_inq_varid(ncid, "row_time", &varid) != NC_NOERR)
8134 NC_DEF_VAR("row_time", NC_DOUBLE, 2, dimids2_row,
8135 "row time since 2000-01-01T00:00Z", "s", 0, 0);
8136 if (nc_inq_varid(ncid, "row_z", &varid) != NC_NOERR)
8137 NC_DEF_VAR("row_z", NC_DOUBLE, 2, dimids2_row,
8138 "row altitude", "km", 0, 0);
8139 if (nc_inq_varid(ncid, "row_lon", &varid) != NC_NOERR)
8140 NC_DEF_VAR("row_lon", NC_DOUBLE, 2, dimids2_row,
8141 "row longitude", "degrees_east", 0, 0);
8142 if (nc_inq_varid(ncid, "row_lat", &varid) != NC_NOERR)
8143 NC_DEF_VAR("row_lat", NC_DOUBLE, 2, dimids2_row,
8144 "row latitude", "degrees_north", 0, 0);
8145 if (nc_inq_varid(ncid, "row_quantity", &varid) != NC_NOERR)
8146 NC_DEF_VAR("row_quantity", NC_CHAR, 3, dimids3_rowname,
8147 "row state quantity name", "1", 0, 0);
8148 if (nc_inq_varid(ncid, "col_nu", &varid) != NC_NOERR)
8149 NC_DEF_VAR("col_nu", NC_DOUBLE, 2, dimids2_col,
8150 "column channel wavenumber", "cm^-1", 0, 0);
8151 if (nc_inq_varid(ncid, "col_time", &varid) != NC_NOERR)
8152 NC_DEF_VAR("col_time", NC_DOUBLE, 2, dimids2_col,
8153 "column time since 2000-01-01T00:00Z", "s", 0, 0);
8154 if (nc_inq_varid(ncid, "col_z", &varid) != NC_NOERR)
8155 NC_DEF_VAR("col_z", NC_DOUBLE, 2, dimids2_col,
8156 "column altitude", "km", 0, 0);
8157 if (nc_inq_varid(ncid, "col_lon", &varid) != NC_NOERR)
8158 NC_DEF_VAR("col_lon", NC_DOUBLE, 2, dimids2_col,
8159 "column longitude", "degrees_east", 0, 0);
8160 if (nc_inq_varid(ncid, "col_lat", &varid) != NC_NOERR)
8161 NC_DEF_VAR("col_lat", NC_DOUBLE, 2, dimids2_col,
8162 "column latitude", "degrees_north", 0, 0);
8163 if (nc_inq_varid(ncid, "col_quantity", &varid) != NC_NOERR)
8164 NC_DEF_VAR("col_quantity", NC_CHAR, 3, dimids3_colname,
8165 "column state quantity name", "1", 0, 0);
8166
8167 /* Leave define mode... */
8168 NC(nc_enddef(ncid));
8169
8170 /* Write metadata... */
8171 size_t start1[1] = { (size_t) dataset };
8172 size_t count1[1] = { 1 };
8173 NC(nc_inq_varid(ncid, "rowspace", &varid));
8174 NC(nc_put_vara_text(ncid, varid, start1, count1, rowspace));
8175 NC(nc_inq_varid(ncid, "colspace", &varid));
8176 NC(nc_put_vara_text(ncid, varid, start1, count1, colspace));
8177 NC(nc_inq_varid(ncid, "sort", &varid));
8178 NC(nc_put_vara_text(ncid, varid, start1, count1, sort));
8179
8180 /* Set row and column metadata indices... */
8181 if (rowspace[0] == 'y')
8182 nr = obs2y(ctl, obs, NULL, rida, rira);
8183 else
8184 nr = atm2x(ctl, atm, NULL, riqa, ripa);
8185 if (colspace[0] == 'y')
8186 nc = obs2y(ctl, obs, NULL, cida, cira);
8187 else
8188 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
8189
8190 /* Write row metadata... */
8191 for (size_t i = 0; i < nr; i++) {
8192 const double nu = rowspace[0] == 'y' ? ctl->nu[rida[i]] : GSL_NAN;
8193 const double time =
8194 rowspace[0] == 'y' ? obs->time[rira[i]] : atm->time[ripa[i]];
8195 const double z = rowspace[0] == 'y' ? obs->vpz[rira[i]] : atm->z[ripa[i]];
8196 const double lon =
8197 rowspace[0] == 'y' ? obs->vplon[rira[i]] : atm->lon[ripa[i]];
8198 const double lat =
8199 rowspace[0] == 'y' ? obs->vplat[rira[i]] : atm->lat[ripa[i]];
8200 char qbuf[LEN] = { 0 };
8201 size_t start2[2] = { (size_t) dataset, i };
8202 size_t count2[2] = { 1, 1 };
8203 size_t start3n[3] = { (size_t) dataset, i, 0 };
8204 size_t count3n[3] = { 1, 1, name_strlen };
8205
8206 if (rowspace[0] != 'y') {
8207 idx2name(ctl, riqa[i], quantity);
8208 snprintf(qbuf, LEN, "%s", quantity);
8209 }
8210
8211 NC(nc_inq_varid(ncid, "row_nu", &varid));
8212 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8213 NC(nc_inq_varid(ncid, "row_time", &varid));
8214 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8215 NC(nc_inq_varid(ncid, "row_z", &varid));
8216 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8217 NC(nc_inq_varid(ncid, "row_lon", &varid));
8218 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8219 NC(nc_inq_varid(ncid, "row_lat", &varid));
8220 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8221 NC(nc_inq_varid(ncid, "row_quantity", &varid));
8222 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8223 }
8224
8225 /* Write column metadata... */
8226 for (size_t j = 0; j < nc; j++) {
8227 const double nu = colspace[0] == 'y' ? ctl->nu[cida[j]] : GSL_NAN;
8228 const double time =
8229 colspace[0] == 'y' ? obs->time[cira[j]] : atm->time[cipa[j]];
8230 const double z = colspace[0] == 'y' ? obs->vpz[cira[j]] : atm->z[cipa[j]];
8231 const double lon =
8232 colspace[0] == 'y' ? obs->vplon[cira[j]] : atm->lon[cipa[j]];
8233 const double lat =
8234 colspace[0] == 'y' ? obs->vplat[cira[j]] : atm->lat[cipa[j]];
8235 char qbuf[LEN] = { 0 };
8236 size_t start2[2] = { (size_t) dataset, j };
8237 size_t count2[2] = { 1, 1 };
8238 size_t start3n[3] = { (size_t) dataset, j, 0 };
8239 size_t count3n[3] = { 1, 1, name_strlen };
8240
8241 if (colspace[0] != 'y') {
8242 idx2name(ctl, ciqa[j], quantity);
8243 snprintf(qbuf, LEN, "%s", quantity);
8244 }
8245
8246 NC(nc_inq_varid(ncid, "col_nu", &varid));
8247 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8248 NC(nc_inq_varid(ncid, "col_time", &varid));
8249 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8250 NC(nc_inq_varid(ncid, "col_z", &varid));
8251 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8252 NC(nc_inq_varid(ncid, "col_lon", &varid));
8253 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8254 NC(nc_inq_varid(ncid, "col_lat", &varid));
8255 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8256 NC(nc_inq_varid(ncid, "col_quantity", &varid));
8257 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8258 }
8259
8260 /* Write matrix data... */
8261 NC(nc_inq_varid(ncid, "matrix", &varid));
8262 for (size_t i = 0; i < nr; i++)
8263 for (size_t j = 0; j < nc; j++) {
8264 const double value = gsl_matrix_get(matrix, i, j);
8265 size_t start3[3] = { (size_t) dataset, i, j };
8266 size_t count3[3] = { 1, 1, 1 };
8267 NC(nc_put_vara_double(ncid, varid, start3, count3, &value));
8268 }
8269
8270 /* Close file... */
8271 NC(nc_sync(ncid));
8272 NC(nc_close(ncid));
8273
8274 /* Free... */
8275 free(cida);
8276 free(ciqa);
8277 free(cipa);
8278 free(cira);
8279 free(rida);
8280 free(riqa);
8281 free(ripa);
8282 free(rira);
8283}
8284
8285/*****************************************************************************/
8286
8288 const char *dirname,
8289 const char *filename,
8290 const ctl_t *ctl,
8291 const obs_t *obs,
8292 int profile) {
8293
8294 /* Set filename... */
8295 char file[LEN];
8296 if (dirname != NULL)
8297 sprintf(file, "%s/%s", dirname, filename);
8298 else
8299 sprintf(file, "%s", filename);
8300
8301 /* Write info... */
8302 LOG(1, "Write observation data: %s", file);
8303
8304 /* Write ASCII data... */
8305 if (ctl->obsfmt == 1)
8306 write_obs_asc(file, ctl, obs);
8307
8308 /* Write binary data... */
8309 else if (ctl->obsfmt == 2)
8310 write_obs_bin(file, ctl, obs);
8311
8312 /* Write netCDF data... */
8313 else if (ctl->obsfmt == 3)
8314 write_obs_nc(file, ctl, obs, profile);
8315
8316 /* Write info... */
8317 double mini, maxi;
8318 LOG(2, "Number of ray paths: %d", obs->nr);
8319 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
8320 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
8321 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
8322 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
8323 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
8324 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
8325 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
8326 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
8327 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
8328 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
8329 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
8330 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
8331 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
8332 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
8333 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
8334 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
8335 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
8336 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
8337 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
8338 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
8339 for (int id = 0; id < ctl->nd; id++) {
8340 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
8341 if (ctl->write_bbt) {
8342 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
8343 ctl->nu[id], mini, maxi);
8344 } else {
8345 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
8346 ctl->nu[id], mini, maxi);
8347 }
8348 }
8349 for (int id = 0; id < ctl->nd; id++) {
8350 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
8351 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
8352 ctl->nu[id], mini, maxi);
8353 }
8354}
8355
8356/*****************************************************************************/
8357
8359 const char *filename,
8360 const ctl_t *ctl,
8361 const obs_t *obs) {
8362
8363 int n = 10;
8364
8365 /* Create file... */
8366 FILE *out;
8367 if (!(out = fopen(filename, "w")))
8368 ERRMSG("Cannot create file!");
8369
8370 /* Write header... */
8371 fprintf(out,
8372 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
8373 "# $2 = observer altitude [km]\n"
8374 "# $3 = observer longitude [deg]\n"
8375 "# $4 = observer latitude [deg]\n"
8376 "# $5 = view point altitude [km]\n"
8377 "# $6 = view point longitude [deg]\n"
8378 "# $7 = view point latitude [deg]\n"
8379 "# $8 = tangent point altitude [km]\n"
8380 "# $9 = tangent point longitude [deg]\n"
8381 "# $10 = tangent point latitude [deg]\n");
8382 for (int id = 0; id < ctl->nd; id++)
8383 if (ctl->write_bbt)
8384 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
8385 ++n, ctl->nu[id]);
8386 else
8387 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
8388 ++n, ctl->nu[id]);
8389 for (int id = 0; id < ctl->nd; id++)
8390 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
8391 ctl->nu[id]);
8392
8393 /* Write data... */
8394 for (int ir = 0; ir < obs->nr; ir++) {
8395 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
8396 fprintf(out, "\n");
8397 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
8398 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
8399 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
8400 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
8401 for (int id = 0; id < ctl->nd; id++)
8402 fprintf(out, " %g", obs->rad[id][ir]);
8403 for (int id = 0; id < ctl->nd; id++)
8404 fprintf(out, " %g", obs->tau[id][ir]);
8405 fprintf(out, "\n");
8406 }
8407
8408 /* Close file... */
8409 fclose(out);
8410}
8411
8412/*****************************************************************************/
8413
8415 const char *filename,
8416 const ctl_t *ctl,
8417 const obs_t *obs) {
8418
8419 /* Create file... */
8420 FILE *out;
8421 if (!(out = fopen(filename, "w")))
8422 ERRMSG("Cannot create file!");
8423
8424 /* Write header... */
8425 FWRITE("OBS1", char,
8426 4,
8427 out);
8428 FWRITE(&ctl->nd, int,
8429 1,
8430 out);
8431
8432 /* Write data... */
8433 size_t nr = (size_t) obs->nr;
8434 FWRITE(&nr, size_t,
8435 1,
8436 out);
8437 FWRITE(obs->time, double,
8438 nr,
8439 out);
8440 FWRITE(obs->obsz, double,
8441 nr,
8442 out);
8443 FWRITE(obs->obslon, double,
8444 nr,
8445 out);
8446 FWRITE(obs->obslat, double,
8447 nr,
8448 out);
8449 FWRITE(obs->vpz, double,
8450 nr,
8451 out);
8452 FWRITE(obs->vplon, double,
8453 nr,
8454 out);
8455 FWRITE(obs->vplat, double,
8456 nr,
8457 out);
8458 FWRITE(obs->tpz, double,
8459 nr,
8460 out);
8461 FWRITE(obs->tplon, double,
8462 nr,
8463 out);
8464 FWRITE(obs->tplat, double,
8465 nr,
8466 out);
8467 for (int id = 0; id < ctl->nd; id++)
8468 FWRITE(obs->rad[id], double,
8469 nr,
8470 out);
8471 for (int id = 0; id < ctl->nd; id++)
8472 FWRITE(obs->tau[id], double,
8473 nr,
8474 out);
8475
8476 /* Close file... */
8477 fclose(out);
8478}
8479
8480/*****************************************************************************/
8481
8483 const char *filename,
8484 const ctl_t *ctl,
8485 const obs_t *obs,
8486 const int profile) {
8487
8488 char longname[LEN], varname[LEN];
8489 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
8490
8491 int ncid, varid, dim_profile, dim_ray;
8492
8493 size_t ray_max;
8494
8495 /* Check number of rays... */
8496 if (obs->nr < 1 || obs->nr > NR)
8497 ERRMSG("Number of ray paths out of range!");
8498
8499 /* Open or create file... */
8500 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
8501 NC(nc_create(filename, NC_NETCDF4, &ncid));
8502
8503 /* Enter define mode... */
8504 int r = nc_redef(ncid);
8505 if (r != NC_NOERR && r != NC_EINDEFINE)
8506 NC(r);
8507
8508 /* Define profile dimension (unlimited)... */
8509 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
8510 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
8511
8512 /* Define ray dimension (fixed)... */
8513 if (nc_inq_dimid(ncid, "ray", &dim_ray) == NC_NOERR) {
8514 NC(nc_inq_dimlen(ncid, dim_ray, &ray_max));
8515 if (ray_max < 1 || ray_max > (size_t) NR)
8516 ERRMSG("netCDF dimension ray is out of range!");
8517 if ((size_t) obs->nr > ray_max)
8518 ERRMSG("profile has too many rays!");
8519 } else {
8520 ray_max = (size_t) obs->nr;
8521 NC(nc_def_dim(ncid, "ray", ray_max, &dim_ray));
8522 }
8523
8524 /* Dimension ID array... */
8525 int dimids[2] = { dim_profile, dim_ray };
8526
8527 /* Tunables for compression/quantization... */
8528 const int deflate_level = 0;
8529 const int quant_digits = 0;
8530
8531 /* Define nray (1D over profile)... */
8532 if (nc_inq_varid(ncid, "nray", &varid) != NC_NOERR)
8533 NC_DEF_VAR("nray", NC_INT, 1, dimids, "number of ray paths", "1", 0, 0);
8534
8535 /* Define geometry variables (2D over profile, ray)... */
8536 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
8537 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
8538 "time in seconds since 2000-01-01, 00:00 UTC", "s",
8539 deflate_level, 0);
8540
8541 if (nc_inq_varid(ncid, "obs_z", &varid) != NC_NOERR)
8542 NC_DEF_VAR("obs_z", NC_DOUBLE, 2, dimids,
8543 "observer altitude", "km", deflate_level, 0);
8544
8545 if (nc_inq_varid(ncid, "obs_lon", &varid) != NC_NOERR)
8546 NC_DEF_VAR("obs_lon", NC_DOUBLE, 2, dimids,
8547 "observer longitude", "degrees_east", deflate_level, 0);
8548
8549 if (nc_inq_varid(ncid, "obs_lat", &varid) != NC_NOERR)
8550 NC_DEF_VAR("obs_lat", NC_DOUBLE, 2, dimids,
8551 "observer latitude", "degrees_north", deflate_level, 0);
8552
8553 if (nc_inq_varid(ncid, "vp_z", &varid) != NC_NOERR)
8554 NC_DEF_VAR("vp_z", NC_DOUBLE, 2, dimids,
8555 "view point altitude", "km", deflate_level, 0);
8556
8557 if (nc_inq_varid(ncid, "vp_lon", &varid) != NC_NOERR)
8558 NC_DEF_VAR("vp_lon", NC_DOUBLE, 2, dimids,
8559 "view point longitude", "degrees_east", deflate_level, 0);
8560
8561 if (nc_inq_varid(ncid, "vp_lat", &varid) != NC_NOERR)
8562 NC_DEF_VAR("vp_lat", NC_DOUBLE, 2, dimids,
8563 "view point latitude", "degrees_north", deflate_level, 0);
8564
8565 if (nc_inq_varid(ncid, "tp_z", &varid) != NC_NOERR)
8566 NC_DEF_VAR("tp_z", NC_DOUBLE, 2, dimids,
8567 "tangent point altitude", "km", deflate_level, 0);
8568
8569 if (nc_inq_varid(ncid, "tp_lon", &varid) != NC_NOERR)
8570 NC_DEF_VAR("tp_lon", NC_DOUBLE, 2, dimids,
8571 "tangent point longitude", "degrees_east", deflate_level, 0);
8572
8573 if (nc_inq_varid(ncid, "tp_lat", &varid) != NC_NOERR)
8574 NC_DEF_VAR("tp_lat", NC_DOUBLE, 2, dimids,
8575 "tangent point latitude", "degrees_north", deflate_level, 0);
8576
8577 /* Define radiance/transmittance per channel (2D profile,ray)... */
8578 for (int id = 0; id < ctl->nd; id++) {
8579
8580 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8581 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8582 if (ctl->write_bbt) {
8583 sprintf(longname, "brightness temperature (%.4f cm^-1)", ctl->nu[id]);
8584 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "K",
8585 deflate_level, quant_digits);
8586 } else {
8587 sprintf(longname, "radiance (%.4f cm^-1)", ctl->nu[id]);
8588 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
8589 "W/(m^2 sr cm^-1)", deflate_level, quant_digits);
8590 }
8591 }
8592
8593 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8594 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8595 sprintf(longname, "transmittance (%.4f cm^-1)", ctl->nu[id]);
8596 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "1",
8597 deflate_level, quant_digits);
8598 }
8599 }
8600
8601 /* Leave define mode... */
8602 NC(nc_enddef(ncid));
8603
8604 /* Hyperslabs... */
8605 size_t start[2] = { (size_t) profile, 0 };
8606 size_t count[2] = { 1, (size_t) obs->nr };
8607
8608 /* Write nray(profile)... */
8609 int nr = obs->nr;
8610 NC(nc_inq_varid(ncid, "nray", &varid));
8611 NC(nc_put_vara_int(ncid, varid, start, count, &nr));
8612
8613 /* Write geometry... */
8614 NC(nc_inq_varid(ncid, "time", &varid));
8615 NC(nc_put_vara_double(ncid, varid, start, count, obs->time));
8616
8617 NC(nc_inq_varid(ncid, "obs_z", &varid));
8618 NC(nc_put_vara_double(ncid, varid, start, count, obs->obsz));
8619
8620 NC(nc_inq_varid(ncid, "obs_lon", &varid));
8621 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslon));
8622
8623 NC(nc_inq_varid(ncid, "obs_lat", &varid));
8624 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslat));
8625
8626 NC(nc_inq_varid(ncid, "vp_z", &varid));
8627 NC(nc_put_vara_double(ncid, varid, start, count, obs->vpz));
8628
8629 NC(nc_inq_varid(ncid, "vp_lon", &varid));
8630 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplon));
8631
8632 NC(nc_inq_varid(ncid, "vp_lat", &varid));
8633 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplat));
8634
8635 NC(nc_inq_varid(ncid, "tp_z", &varid));
8636 NC(nc_put_vara_double(ncid, varid, start, count, obs->tpz));
8637
8638 NC(nc_inq_varid(ncid, "tp_lon", &varid));
8639 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplon));
8640
8641 NC(nc_inq_varid(ncid, "tp_lat", &varid));
8642 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplat));
8643
8644 /* Write spectral variables per channel... */
8645 for (int id = 0; id < ctl->nd; id++) {
8646 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8647 NC(nc_inq_varid(ncid, varname, &varid));
8648 NC(nc_put_vara_double(ncid, varid, start, count, obs->rad[id]));
8649
8650 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8651 NC(nc_inq_varid(ncid, varname, &varid));
8652 NC(nc_put_vara_double(ncid, varid, start, count, obs->tau[id]));
8653 }
8654
8655 /* Close file... */
8656 NC(nc_sync(ncid));
8657 NC(nc_close(ncid));
8658}
8659
8660/*****************************************************************************/
8661
8663 const char *filename,
8664 const double *x,
8665 const double *y,
8666 const int n) {
8667
8668 /* Write info... */
8669 LOG(1, "Write shape function: %s", filename);
8670
8671 /* Create file... */
8672 FILE *out;
8673 if (!(out = fopen(filename, "w")))
8674 ERRMSG("Cannot create file!");
8675
8676 /* Write header... */
8677 fprintf(out,
8678 "# $1 = shape function x-value [-]\n"
8679 "# $2 = shape function y-value [-]\n\n");
8680
8681 /* Write data... */
8682 for (int i = 0; i < n; i++)
8683 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
8684
8685 /* Close file... */
8686 fclose(out);
8687}
8688
8689/*****************************************************************************/
8690
8692 const char *quantity,
8693 const ret_t *ret,
8694 const ctl_t *ctl,
8695 const atm_t *atm,
8696 const gsl_matrix *s) {
8697
8698 /* Get sizes... */
8699 const size_t n = s->size1;
8700
8701 /* Allocate... */
8702 atm_t *atm_aux;
8703 ALLOC(atm_aux, atm_t, 1);
8704 gsl_vector *x_aux = gsl_vector_alloc(n);
8705
8706 /* Compute standard deviation... */
8707 for (size_t i = 0; i < n; i++)
8708 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
8709
8710 /* Write to disk... */
8711 char filename[LEN];
8712 const char *dirname;
8713 int profile;
8714 const char *shared_file = "-";
8715 copy_atm(ctl, atm_aux, atm, 1);
8716 x2atm(ctl, x_aux, atm_aux);
8717 if (strcmp(quantity, "total") == 0)
8718 shared_file = ret->shared_io_atm_err_total_file;
8719 else if (strcmp(quantity, "noise") == 0)
8720 shared_file = ret->shared_io_atm_err_noise_file;
8721 else if (strcmp(quantity, "formod") == 0)
8722 shared_file = ret->shared_io_atm_err_formod_file;
8723 sprintf(filename, "atm_err_%s.tab", quantity);
8724 const char *target =
8725 shared_io_output_target(ret, shared_file, filename, &dirname, &profile);
8726 write_atm(dirname, target, ctl, atm_aux, profile);
8727
8728 /* Free... */
8729 gsl_vector_free(x_aux);
8730}
8731
8732/*****************************************************************************/
8733
8735 const ctl_t *ctl,
8736 const tbl_t *tbl) {
8737
8738 /* Loop over emitters and detectors... */
8739 for (int ig = 0; ig < ctl->ng; ig++)
8740 for (int id = 0; id < ctl->nd; id++) {
8741
8742 /* Skip empty tables... */
8743 if (tbl->np[id][ig] <= 0) {
8744 WARN("Skip writing empty emissivity table: emitter=%s, nu=%.4f",
8745 ctl->emitter[ig], ctl->nu[id]);
8746 continue;
8747 }
8748
8749 /* Write ASCII look-up tables... */
8750 if (ctl->tblfmt == 1)
8751 write_tbl_asc(ctl, tbl, id, ig);
8752
8753 /* Write binary look-up tables... */
8754 else if (ctl->tblfmt == 2)
8755 write_tbl_bin(ctl, tbl, id, ig);
8756
8757 /* Write netCDF look-up tables... */
8758 else if (ctl->tblfmt == 3)
8759 write_tbl_nc(ctl, tbl, id, ig);
8760
8761 /* Write info... */
8762 TBL_LOG(tbl, id, ig);
8763 }
8764
8765 /* Write filter functions... */
8766 if (ctl->tblfmt == 1)
8767 for (int id = 0; id < ctl->nd; id++) {
8768 char filename[2 * LEN];
8769 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
8770 write_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
8771 tbl->filt_n[id]);
8772 }
8773}
8774
8775/*****************************************************************************/
8776
8778 const ctl_t *ctl,
8779 const tbl_t *tbl,
8780 const int id,
8781 const int ig) {
8782
8783 /* Set filename... */
8784 char filename[2 * LEN];
8785 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
8786 ctl->nu[id], ctl->emitter[ig]);
8787
8788 /* Create file... */
8789 FILE *out;
8790 if (!(out = fopen(filename, "w"))) {
8791 ERRMSG("Cannot create emissivity table: %s", filename);
8792 } else
8793 LOG(1, "Write emissivity table: %s", filename);
8794
8795 /* Write header... */
8796 fprintf(out,
8797 "# $1 = pressure [hPa]\n"
8798 "# $2 = temperature [K]\n"
8799 "# $3 = column density [molecules/cm^2]\n"
8800 "# $4 = emissivity [-]\n");
8801
8802 /* Save table file... */
8803 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
8804 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
8805 fprintf(out, "\n");
8806 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
8807 fprintf(out, "%g %g %e %e\n",
8808 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
8809 exp(tbl->logu[id][ig][ip][it][iu]),
8810 exp(tbl->logeps[id][ig][ip][it][iu]));
8811 }
8812
8813 /* Close file... */
8814 fclose(out);
8815}
8816
8817/*****************************************************************************/
8818
8820 const ctl_t *ctl,
8821 const tbl_t *tbl,
8822 const int id,
8823 const int ig) {
8824
8825 /* Set filename... */
8826 char filename[2 * LEN];
8827 sprintf(filename, "%s_%.4f_%s.bin",
8828 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
8829
8830 /* Create file... */
8831 FILE *out;
8832 if (!(out = fopen(filename, "w"))) {
8833 ERRMSG("Cannot create emissivity table: %s", filename);
8834 } else
8835 LOG(1, "Write emissivity table: %s", filename);
8836
8837 /* Pack... */
8838 size_t used = 0;
8839 const size_t need = tbl_packed_size(tbl, id, ig);
8840 uint8_t *work = NULL;
8841 ALLOC(work, uint8_t, need);
8842 tbl_pack(tbl, id, ig, work, &used);
8843 if (used != need)
8844 ERRMSG("Internal error: packed size mismatch!");
8845
8846 /* Write length and packed blob... */
8847 FWRITE(&used, size_t,
8848 1,
8849 out);
8850 FWRITE(work, uint8_t, used, out);
8851
8852 /* Close file... */
8853 fclose(out);
8854
8855 /* Free... */
8856 free(work);
8857}
8858
8859/*****************************************************************************/
8860
8862 const ctl_t *ctl,
8863 const tbl_t *tbl,
8864 const int id,
8865 const int ig) {
8866
8867 /* Set filename... */
8868 char filename[2 * LEN];
8869 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
8870
8871 /* Open or create file... */
8872 int ncid;
8873 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR) {
8874 if (nc_create(filename, NC_NETCDF4 | NC_CLOBBER, &ncid) != NC_NOERR)
8875 ERRMSG("Cannot open or create emissivity table: %s", filename);
8876 NC_PUT_ATT_GLOBAL("format_version", "1");
8877 NC_PUT_ATT_GLOBAL("emitter", ctl->emitter[ig]);
8878 NC(nc_enddef(ncid));
8879 }
8880
8881 /* Set variable and dimension name... */
8882 char varname[LEN], dimname[LEN];
8883 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
8884 sprintf(dimname, "len_%.4f", ctl->nu[id]);
8885
8886 /* Write info... */
8887 LOG(1, "Write emissivity table: %s in %s", varname, filename);
8888
8889 /* Allocate work space... */
8890 size_t used = 0;
8891 const size_t need = tbl_packed_size(tbl, id, ig);
8892 uint8_t *work = NULL;
8893 ALLOC(work, uint8_t, need);
8894
8895 /* Pack table... */
8896 tbl_pack(tbl, id, ig, work, &used);
8897 if (used != need)
8898 ERRMSG("Internal error: packed size mismatch!");
8899
8900 /* Prevent overwrite... */
8901 int tmp;
8902 if (nc_inq_varid(ncid, varname, &tmp) == NC_NOERR)
8903 ERRMSG("Table already present!");
8904
8905 /* Add dimension and variable... */
8906 int dimid, varid;
8907 NC(nc_redef(ncid));
8908 NC(nc_def_dim(ncid, dimname, used, &dimid));
8909 int dimids[1] = { dimid };
8910 NC_DEF_VAR(varname, NC_UBYTE, 1, dimids,
8911 "Packed lookup table blob", "1", 0, 0);
8912 NC(nc_enddef(ncid));
8913
8914 /* Write data... */
8915 NC(nc_put_var_uchar(ncid, varid, (const unsigned char *) work));
8916
8917 /* Free... */
8918 free(work);
8919
8920 /* Close file... */
8921 NC(nc_close(ncid));
8922}
8923
8924/*****************************************************************************/
8925
8927 const ctl_t *ctl,
8928 const gsl_vector *x,
8929 atm_t *atm) {
8930
8931 size_t n = 0;
8932
8933 /* Get pressure... */
8934 for (int ip = 0; ip < atm->np; ip++)
8935 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
8936 x2atm_help(&atm->p[ip], x, &n);
8937
8938 /* Get temperature... */
8939 for (int ip = 0; ip < atm->np; ip++)
8940 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
8941 x2atm_help(&atm->t[ip], x, &n);
8942
8943 /* Get volume mixing ratio... */
8944 for (int ig = 0; ig < ctl->ng; ig++)
8945 for (int ip = 0; ip < atm->np; ip++)
8946 if (atm->z[ip] >= ctl->retq_zmin[ig]
8947 && atm->z[ip] <= ctl->retq_zmax[ig])
8948 x2atm_help(&atm->q[ig][ip], x, &n);
8949
8950 /* Get extinction... */
8951 for (int iw = 0; iw < ctl->nw; iw++)
8952 for (int ip = 0; ip < atm->np; ip++)
8953 if (atm->z[ip] >= ctl->retk_zmin[iw]
8954 && atm->z[ip] <= ctl->retk_zmax[iw])
8955 x2atm_help(&atm->k[iw][ip], x, &n);
8956
8957 /* Get cloud data... */
8958 if (ctl->ret_clz)
8959 x2atm_help(&atm->clz, x, &n);
8960 if (ctl->ret_cldz)
8961 x2atm_help(&atm->cldz, x, &n);
8962 if (ctl->ret_clk)
8963 for (int icl = 0; icl < ctl->ncl; icl++)
8964 x2atm_help(&atm->clk[icl], x, &n);
8965
8966 /* Get surface data... */
8967 if (ctl->ret_sft)
8968 x2atm_help(&atm->sft, x, &n);
8969 if (ctl->ret_sfeps)
8970 for (int isf = 0; isf < ctl->nsf; isf++)
8971 x2atm_help(&atm->sfeps[isf], x, &n);
8972}
8973
8974/*****************************************************************************/
8975
8977 double *value,
8978 const gsl_vector *x,
8979 size_t *n) {
8980
8981 /* Get state vector element... */
8982 *value = gsl_vector_get(x, *n);
8983 (*n)++;
8984}
8985
8986/*****************************************************************************/
8987
8989 const ctl_t *ctl,
8990 const gsl_vector *y,
8991 obs_t *obs) {
8992
8993 size_t m = 0;
8994
8995 /* Decompose measurement vector... */
8996 for (int ir = 0; ir < obs->nr; ir++)
8997 for (int id = 0; id < ctl->nd; id++)
8998 if (isfinite(obs->rad[id][ir])) {
8999 obs->rad[id][ir] = gsl_vector_get(y, m);
9000 m++;
9001 }
9002}
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:4270
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:6543
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:6098
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:7319
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:6243
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:7053
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:5773
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:5330
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:8358
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:3708
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4518
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:4168
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:8482
void tbl_free(const ctl_t *ctl, tbl_t *tbl)
Free lookup table and all internally allocated memory.
Definition: jurassic.c:7014
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:8777
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:8861
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3964
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
Definition: jurassic.c:5528
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:5941
int shared_io_lock(const ret_t *ret)
Acquire an exclusive lock for shared retrieval output files.
Definition: jurassic.c:6892
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:4974
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:5822
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:4589
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4488
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:6852
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:7802
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:7541
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:7765
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:7217
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Map retrieval state vector back to atmospheric structure.
Definition: jurassic.c:8926
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:8819
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:4075
void shared_io_unlock(int fd)
Release a shared retrieval output lock.
Definition: jurassic.c:6919
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:7728
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:6803
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:8287
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Write emissivity lookup tables to disk.
Definition: jurassic.c:8734
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:7141
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:5655
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:4050
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:4661
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:4315
void timer_group(const char *name, const char *group, int output)
Aggregate wall-clock timings for named code phases.
Definition: jurassic.c:7248
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:6971
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:5205
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:8024
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:7390
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:7975
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:8414
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:8976
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:4394
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:6019
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize source function lookup tables from emissivity data.
Definition: jurassic.c:4003
void matrix_invert(gsl_matrix *a)
Invert a square matrix, optimized for diagonal or symmetric positive-definite matrices.
Definition: jurassic.c:4559
void read_ret(int argc, char *argv[], const ctl_t *ctl, ret_t *ret)
Read retrieval configuration and error parameters.
Definition: jurassic.c:6155
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:6624
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:8662
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:5279
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:6420
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:3869
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:4361
void read_matrix_asc(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
Definition: jurassic.c:5681
tbl_t * read_tbl(const ctl_t *ctl)
Read emissivity lookup tables from disk.
Definition: jurassic.c:6344
void read_matrix_bin(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from a binary file.
Definition: jurassic.c:5720
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:6587
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:6872
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:5424
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:4634
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:8988
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3904
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:6303
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:3886
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:6692
const char * shared_io_output_file(const ret_t *ret)
Return the primary shared retrieval output file configured for locking.
Definition: jurassic.c:6937
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:8691
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:7107
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4537
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:7457
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:5897
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:1041
#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:918
#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:1147
#define SELECT_TIMER(id, group)
Switch to a named aggregated timer.
Definition: jurassic.h:1181
#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:1348
#define NC_PUT_INT(varname, ptr, hyperslab)
Write integer data to a NetCDF variable.
Definition: jurassic.h:879
#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:996
#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:1212
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:1315
#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:1070
#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:1054
#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:1027
#define REFRAC_EDLEN(p, T)
Compute dry-air refractivity (n - 1) with an Edlen-type relation.
Definition: jurassic.h:1127
#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:1278
#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:727
#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:832
#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:1398
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1404
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:1440
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:1425
double lat[NP]
Latitude [deg].
Definition: jurassic.h:1413
double lon[NP]
Longitude [deg].
Definition: jurassic.h:1410
double t[NP]
Temperature [K].
Definition: jurassic.h:1419
double clz
Cloud layer height [km].
Definition: jurassic.h:1428
int np
Number of data points.
Definition: jurassic.h:1401
double cldz
Cloud layer depth [km].
Definition: jurassic.h:1431
double sft
Surface temperature [K].
Definition: jurassic.h:1437
double z[NP]
Altitude [km].
Definition: jurassic.h:1407
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:1434
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:1422
double p[NP]
Pressure [hPa].
Definition: jurassic.h:1416
Control parameters.
Definition: jurassic.h:1451
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1595
int nw
Number of spectral windows.
Definition: jurassic.h:1478
int atmfmt
Atmospheric data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1508
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1553
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:1475
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:1460
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1574
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1493
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1604
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1502
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1601
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1517
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1520
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1562
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1589
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1586
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1577
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1526
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1541
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1607
int window[ND]
Window index of each channel.
Definition: jurassic.h:1481
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1523
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1598
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1568
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1565
int ng
Number of emitters.
Definition: jurassic.h:1454
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1487
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1532
int ig_o2
Emitter index of O2.
Definition: jurassic.h:1469
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1559
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1499
int nd
Number of radiance channels.
Definition: jurassic.h:1472
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1550
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1496
int matrixfmt
Matrix data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1514
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1571
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1484
int ig_n2
Emitter index of N2.
Definition: jurassic.h:1466
int obsfmt
Observation data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1511
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1544
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1529
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1583
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:1457
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1490
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1535
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1580
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:1463
int tblfmt
Look-up table file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1505
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1538
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1592
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1547
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1556
Line-of-sight data.
Definition: jurassic.h:1618
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1624
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1666
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1663
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1639
double sft
Surface temperature [K].
Definition: jurassic.h:1645
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1660
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1627
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1651
int np
Number of LOS points.
Definition: jurassic.h:1621
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1654
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1630
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1669
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1642
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1648
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1657
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1636
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1633
Observation geometry and radiance data.
Definition: jurassic.h:1680
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1716
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1719
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1710
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1698
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1704
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1692
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1695
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1689
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1713
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1701
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1686
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1707
int nr
Number of ray paths.
Definition: jurassic.h:1683
Retrieval control parameters.
Definition: jurassic.h:1732
char shared_io_atm_final_file[LEN]
Optional shared retrieved-atmosphere output file.
Definition: jurassic.h:1819
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1759
double err_press
Pressure error [%].
Definition: jurassic.h:1756
char shared_io_atm_res_file[LEN]
Optional shared averaging-kernel resolution output file.
Definition: jurassic.h:1855
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1786
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1747
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1789
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1768
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1750
char shared_io_matrix_cov_apr_file[LEN]
Optional shared a priori covariance output file.
Definition: jurassic.h:1825
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1744
double err_temp
Temperature error [K].
Definition: jurassic.h:1765
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1777
char shared_io_proflist[LEN]
Optional file containing retrieval profile indices.
Definition: jurassic.h:1810
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1753
double err_clz
Cloud height error [km].
Definition: jurassic.h:1792
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1801
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1798
char shared_io_matrix_gain_file[LEN]
Optional shared gain matrix output file.
Definition: jurassic.h:1837
char shared_io_obs_meas_file[LEN]
Optional shared measured-observation input file.
Definition: jurassic.h:1816
char shared_io_matrix_cov_ret_file[LEN]
Optional shared retrieval covariance output file.
Definition: jurassic.h:1831
char shared_io_matrix_kernel_file[LEN]
Optional shared kernel matrix output file.
Definition: jurassic.h:1828
char shared_io_atm_apr_file[LEN]
Optional shared atmospheric a priori input file.
Definition: jurassic.h:1813
char shared_io_matrix_avk_file[LEN]
Optional shared averaging-kernel matrix output file.
Definition: jurassic.h:1840
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1771
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1738
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1741
char shared_io_atm_err_formod_file[LEN]
Optional shared forward-model retrieval-error output file.
Definition: jurassic.h:1849
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1795
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1762
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1780
char shared_io_matrix_corr_file[LEN]
Optional shared correlation matrix output file.
Definition: jurassic.h:1834
char shared_io_atm_err_total_file[LEN]
Optional shared total retrieval-error output file.
Definition: jurassic.h:1843
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1774
char dir[LEN]
Working directory.
Definition: jurassic.h:1735
char shared_io_atm_err_noise_file[LEN]
Optional shared noise retrieval-error output file.
Definition: jurassic.h:1846
char shared_io_obs_final_file[LEN]
Optional shared retrieved-observation output file.
Definition: jurassic.h:1822
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1804
char shared_io_atm_cont_file[LEN]
Optional shared averaging-kernel contribution output file.
Definition: jurassic.h:1852
int shared_io_profile
Profile index used for shared netCDF retrieval inputs and outputs.
Definition: jurassic.h:1807
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1783
Emissivity look-up tables.
Definition: jurassic.h:1865
float * logu[ND][NG][TBLNP][TBLNT]
Logarithm of column density [molecules/cm^2].
Definition: jurassic.h:1886
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1904
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1877
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1874
int filt_n[ND]
Filter function number of spectral grid points.
Definition: jurassic.h:1892
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1871
float * logeps[ND][NG][TBLNP][TBLNT]
Logarithm of emissivity.
Definition: jurassic.h:1889
double filt_f[ND][NSHAPE]
Filter function values.
Definition: jurassic.h:1898
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1883
double lnp[ND][NG][TBLNP]
Log-pressure [hPa].
Definition: jurassic.h:1880
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1901
double filt_nu[ND][NSHAPE]
Filter function spectral grid points [cm^-1].
Definition: jurassic.h:1895
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1868