JURASSIC
jurassic.c
Go to the documentation of this file.
1/*
2 This file is part of JURASSIC.
3
4 JURASSIC is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 JURASSIC is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with JURASSIC. If not, see <http://www.gnu.org/licenses/>.
16
17 Copyright (C) 2003-2026 Forschungszentrum Juelich GmbH
18*/
19
25#include "jurassic.h"
26
27/*****************************************************************************/
28
30 const ret_t *ret,
31 const ctl_t *ctl,
32 const atm_t *atm,
33 const int *iqa,
34 const int *ipa,
35 const gsl_matrix *avk) {
36
37 /* Allocate... */
38 atm_t *atm_cont, *atm_res;
39 ALLOC(atm_cont, atm_t, 1);
40 ALLOC(atm_res, atm_t, 1);
41
42 /* Get sizes... */
43 const size_t n = avk->size1;
44
45 /* Find sub-matrices for different quantities... */
46 size_t n0[NQ], n1[NQ];
47 for (int iq = 0; iq < NQ; iq++) {
48 n0[iq] = N;
49 for (size_t i = 0; i < n; i++) {
50 if (iqa[i] == iq && n0[iq] == N)
51 n0[iq] = i;
52 if (iqa[i] == iq)
53 n1[iq] = i - n0[iq] + 1;
54 }
55 }
56
57 /* Initialize... */
58 copy_atm(ctl, atm_cont, atm, 1);
59 copy_atm(ctl, atm_res, atm, 1);
60
61 /* Analyze quantities... */
62 analyze_avk_quantity(avk, IDXP, ipa, n0, n1, atm_cont->p, atm_res->p);
63 analyze_avk_quantity(avk, IDXT, ipa, n0, n1, atm_cont->t, atm_res->t);
64 for (int ig = 0; ig < ctl->ng; ig++)
65 analyze_avk_quantity(avk, IDXQ(ig), ipa, n0, n1,
66 atm_cont->q[ig], atm_res->q[ig]);
67 for (int iw = 0; iw < ctl->nw; iw++)
68 analyze_avk_quantity(avk, IDXK(iw), ipa, n0, n1,
69 atm_cont->k[iw], atm_res->k[iw]);
70 analyze_avk_quantity(avk, IDXCLZ, ipa, n0, n1, &atm_cont->clz,
71 &atm_res->clz);
72 analyze_avk_quantity(avk, IDXCLDZ, ipa, n0, n1, &atm_cont->cldz,
73 &atm_res->cldz);
74 for (int icl = 0; icl < ctl->ncl; icl++)
75 analyze_avk_quantity(avk, IDXCLK(icl), ipa, n0, n1,
76 &atm_cont->clk[icl], &atm_res->clk[icl]);
77 analyze_avk_quantity(avk, IDXSFT, ipa, n0, n1, &atm_cont->sft,
78 &atm_res->sft);
79 for (int isf = 0; isf < ctl->nsf; isf++)
80 analyze_avk_quantity(avk, IDXSFEPS(isf), ipa, n0, n1,
81 &atm_cont->sfeps[isf], &atm_res->sfeps[isf]);
82
83 /* Write results to disk... */
84 const char *dirname;
85 int profile;
86 const char *filename =
87 shared_io_output_target(ret, ret->shared_io_atm_cont_file, "atm_cont.tab",
88 &dirname, &profile);
89 write_atm(dirname, filename, ctl, atm_cont, profile);
91 "atm_res.tab", &dirname, &profile);
92 write_atm(dirname, filename, ctl, atm_res, profile);
93
94 /* Free... */
95 free(atm_cont);
96 free(atm_res);
97}
98
99/*****************************************************************************/
100
102 const gsl_matrix *avk,
103 const int iq,
104 const int *ipa,
105 const size_t *n0,
106 const size_t *n1,
107 double *cont,
108 double *res) {
109
110 /* Loop over state vector elements... */
111 if (n0[iq] < N)
112 for (size_t i = 0; i < n1[iq]; i++) {
113
114 /* Get area of averaging kernel... */
115 for (size_t j = 0; j < n1[iq]; j++)
116 cont[ipa[n0[iq] + i]] += gsl_matrix_get(avk, n0[iq] + i, n0[iq] + j);
117
118 /* Get information density... */
119 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
120 }
121}
122
123/*****************************************************************************/
124
125size_t atm2x(
126 const ctl_t *ctl,
127 const atm_t *atm,
128 gsl_vector *x,
129 int *iqa,
130 int *ipa) {
131
132 size_t n = 0;
133
134 /* Add pressure... */
135 for (int ip = 0; ip < atm->np; ip++)
136 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
137 atm2x_help(atm->p[ip], IDXP, ip, x, iqa, ipa, &n);
138
139 /* Add temperature... */
140 for (int ip = 0; ip < atm->np; ip++)
141 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
142 atm2x_help(atm->t[ip], IDXT, ip, x, iqa, ipa, &n);
143
144 /* Add volume mixing ratios... */
145 for (int ig = 0; ig < ctl->ng; ig++)
146 for (int ip = 0; ip < atm->np; ip++)
147 if (atm->z[ip] >= ctl->retq_zmin[ig]
148 && atm->z[ip] <= ctl->retq_zmax[ig])
149 atm2x_help(atm->q[ig][ip], IDXQ(ig), ip, x, iqa, ipa, &n);
150
151 /* Add extinction... */
152 for (int iw = 0; iw < ctl->nw; iw++)
153 for (int ip = 0; ip < atm->np; ip++)
154 if (atm->z[ip] >= ctl->retk_zmin[iw]
155 && atm->z[ip] <= ctl->retk_zmax[iw])
156 atm2x_help(atm->k[iw][ip], IDXK(iw), ip, x, iqa, ipa, &n);
157
158 /* Add cloud variables... */
159 if (ctl->ret_clz)
160 atm2x_help(atm->clz, IDXCLZ, 0, x, iqa, ipa, &n);
161 if (ctl->ret_cldz)
162 atm2x_help(atm->cldz, IDXCLDZ, 0, x, iqa, ipa, &n);
163 if (ctl->ret_clk)
164 for (int icl = 0; icl < ctl->ncl; icl++)
165 atm2x_help(atm->clk[icl], IDXCLK(icl), 0, x, iqa, ipa, &n);
166
167 /* Add surface variables... */
168 if (ctl->ret_sft)
169 atm2x_help(atm->sft, IDXSFT, 0, x, iqa, ipa, &n);
170 if (ctl->ret_sfeps)
171 for (int isf = 0; isf < ctl->nsf; isf++)
172 atm2x_help(atm->sfeps[isf], IDXSFEPS(isf), 0, x, iqa, ipa, &n);
173
174 return n;
175}
176
177/*****************************************************************************/
178
180 const double value,
181 const int value_iqa,
182 const int value_ip,
183 gsl_vector *x,
184 int *iqa,
185 int *ipa,
186 size_t *n) {
187
188 /* Add element to state vector... */
189 if (x != NULL)
190 gsl_vector_set(x, *n, value);
191 if (iqa != NULL)
192 iqa[*n] = value_iqa;
193 if (ipa != NULL)
194 ipa[*n] = value_ip;
195 (*n)++;
196}
197
198/*****************************************************************************/
199
201 const double *x,
202 double *z,
203 double *lon,
204 double *lat) {
205
206 const double radius = NORM(x);
207
208 *lat = RAD2DEG(asin(x[2] / radius));
209 *lon = RAD2DEG(atan2(x[1], x[0]));
210 *z = radius - RE;
211}
212
213/*****************************************************************************/
214
216 const ctl_t *ctl,
217 atm_t *atm) {
218
219 static const double z[121] = {
220 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
221 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
222 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
223 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
224 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
225 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
226 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
227 };
228
229 static const double pre[121] = {
230 1017, 901.083, 796.45, 702.227, 617.614, 541.644, 473.437, 412.288,
231 357.603, 308.96, 265.994, 228.348, 195.619, 167.351, 143.039, 122.198,
232 104.369, 89.141, 76.1528, 65.0804, 55.641, 47.591, 40.7233, 34.8637,
233 29.8633, 25.5956, 21.9534, 18.8445, 16.1909, 13.9258, 11.9913,
234 10.34, 8.92988, 7.72454, 6.6924, 5.80701, 5.04654, 4.39238, 3.82902,
235 3.34337, 2.92413, 2.56128, 2.2464, 1.97258, 1.73384, 1.52519, 1.34242,
236 1.18197, 1.04086, 0.916546, 0.806832, 0.709875, 0.624101, 0.548176,
237 0.480974, 0.421507, 0.368904, 0.322408, 0.281386, 0.245249, 0.213465,
238 0.185549, 0.161072, 0.139644, 0.120913, 0.104568, 0.0903249, 0.0779269,
239 0.0671493, 0.0577962, 0.0496902, 0.0426736, 0.0366093, 0.0313743,
240 0.0268598, 0.0229699, 0.0196206, 0.0167399, 0.0142646, 0.0121397,
241 0.0103181, 0.00875775, 0.00742226, 0.00628076, 0.00530519, 0.00447183,
242 0.00376124, 0.00315632, 0.00264248, 0.00220738, 0.00184003, 0.00153095,
243 0.00127204, 0.00105608, 0.000876652, 0.00072798, 0.00060492,
244 0.000503201, 0.000419226, 0.000349896, 0.000292659, 0.000245421,
245 0.000206394, 0.000174125, 0.000147441, 0.000125333, 0.000106985,
246 9.173e-05, 7.90172e-05, 6.84172e-05, 5.95574e-05, 5.21183e-05,
247 4.58348e-05, 4.05127e-05, 3.59987e-05, 3.21583e-05, 2.88718e-05,
248 2.60322e-05, 2.35687e-05, 2.14263e-05, 1.95489e-05
249 };
250
251 static const double tem[121] = {
252 285.14, 279.34, 273.91, 268.3, 263.24, 256.55, 250.2, 242.82, 236.17,
253 229.87, 225.04, 221.19, 218.85, 217.19, 216.2, 215.68, 215.42, 215.55,
254 215.92, 216.4, 216.93, 217.45, 218, 218.68, 219.39, 220.25, 221.3,
255 222.41, 223.88, 225.42, 227.2, 229.52, 231.89, 234.51, 236.85, 239.42,
256 241.94, 244.57, 247.36, 250.32, 253.34, 255.82, 258.27, 260.39,
257 262.03, 263.45, 264.2, 264.78, 264.67, 264.38, 263.24, 262.03, 260.02,
258 258.09, 255.63, 253.28, 250.43, 247.81, 245.26, 242.77, 240.38,
259 237.94, 235.79, 233.53, 231.5, 229.53, 227.6, 225.62, 223.77, 222.06,
260 220.33, 218.69, 217.18, 215.64, 214.13, 212.52, 210.86, 209.25,
261 207.49, 205.81, 204.11, 202.22, 200.32, 198.39, 195.92, 193.46,
262 190.94, 188.31, 185.82, 183.57, 181.43, 179.74, 178.64, 178.1, 178.25,
263 178.7, 179.41, 180.67, 182.31, 184.18, 186.6, 189.53, 192.66, 196.54,
264 201.13, 205.93, 211.73, 217.86, 225, 233.53, 242.57, 252.14, 261.48,
265 272.97, 285.26, 299.12, 312.2, 324.17, 338.34, 352.56, 365.28
266 };
267
268 static const double c2h2[121] = {
269 1.352e-09, 2.83e-10, 1.269e-10, 6.926e-11, 4.346e-11, 2.909e-11,
270 2.014e-11, 1.363e-11, 8.71e-12, 5.237e-12, 2.718e-12, 1.375e-12,
271 5.786e-13, 2.16e-13, 7.317e-14, 2.551e-14, 1.055e-14, 4.758e-15,
272 2.056e-15, 7.703e-16, 2.82e-16, 1.035e-16, 4.382e-17, 1.946e-17,
273 9.638e-18, 5.2e-18, 2.811e-18, 1.494e-18, 7.925e-19, 4.213e-19,
274 1.998e-19, 8.78e-20, 3.877e-20, 1.728e-20, 7.743e-21, 3.536e-21,
275 1.623e-21, 7.508e-22, 3.508e-22, 1.65e-22, 7.837e-23, 3.733e-23,
276 1.808e-23, 8.77e-24, 4.285e-24, 2.095e-24, 1.032e-24, 5.082e-25,
277 2.506e-25, 1.236e-25, 6.088e-26, 2.996e-26, 1.465e-26, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
281 };
282
283 static const double c2h6[121] = {
284 2.667e-09, 2.02e-09, 1.658e-09, 1.404e-09, 1.234e-09, 1.109e-09,
285 1.012e-09, 9.262e-10, 8.472e-10, 7.71e-10, 6.932e-10, 6.216e-10,
286 5.503e-10, 4.87e-10, 4.342e-10, 3.861e-10, 3.347e-10, 2.772e-10,
287 2.209e-10, 1.672e-10, 1.197e-10, 8.536e-11, 5.783e-11, 3.846e-11,
288 2.495e-11, 1.592e-11, 1.017e-11, 6.327e-12, 3.895e-12, 2.403e-12,
289 1.416e-12, 8.101e-13, 4.649e-13, 2.686e-13, 1.557e-13, 9.14e-14,
290 5.386e-14, 3.19e-14, 1.903e-14, 1.14e-14, 6.875e-15, 4.154e-15,
291 2.538e-15, 1.553e-15, 9.548e-16, 5.872e-16, 3.63e-16, 2.244e-16,
292 1.388e-16, 8.587e-17, 5.308e-17, 3.279e-17, 2.017e-17, 1.238e-17,
293 7.542e-18, 4.585e-18, 2.776e-18, 1.671e-18, 9.985e-19, 5.937e-19,
294 3.518e-19, 2.07e-19, 1.215e-19, 7.06e-20, 4.097e-20, 2.37e-20,
295 1.363e-20, 7.802e-21, 4.441e-21, 2.523e-21, 1.424e-21, 8.015e-22,
296 4.497e-22, 2.505e-22, 1.391e-22, 7.691e-23, 4.238e-23, 2.331e-23,
297 1.274e-23, 6.929e-24, 3.752e-24, 2.02e-24, 1.083e-24, 5.774e-25,
298 3.041e-25, 1.593e-25, 8.308e-26, 4.299e-26, 2.195e-26, 1.112e-26,
299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0
301 };
302
303 static const double ccl4[121] = {
304 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10,
305 1.075e-10, 1.075e-10, 1.075e-10, 1.06e-10, 1.024e-10, 9.69e-11,
306 8.93e-11, 8.078e-11, 7.213e-11, 6.307e-11, 5.383e-11, 4.49e-11,
307 3.609e-11, 2.705e-11, 1.935e-11, 1.385e-11, 8.35e-12, 5.485e-12,
308 3.853e-12, 2.22e-12, 5.875e-13, 3.445e-13, 1.015e-13, 6.075e-14,
309 4.383e-14, 2.692e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
310 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
311 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
312 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
313 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
314 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
315 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
316 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
317 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
318 1e-14, 1e-14, 1e-14
319 };
320
321 static const double ch3oh[121] = {
322 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10,
323 5.01099e-10, 5.50999e-10, 5.7313e-10, 5.75638e-10, 5.4086e-10,
324 4.77601e-10, 4.12907e-10, 3.6274e-10, 3.26448e-10, 2.9706e-10,
325 2.27698e-10, 1.96999e-10, 1.66212e-10, 1.17941e-10, 1.19844e-10,
326 1.11211e-10, 1.02714e-10, 9.86138e-11, 9.45133e-11, 9.04127e-11,
327 8.05243e-11, 6.3678e-11, 4.68317e-11, 4.00618e-11, 3.95786e-11,
328 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
329 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
330 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
331 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
332 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
333 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
334 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
335 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
336 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
337 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
338 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
339 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
340 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
341 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
342 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
343 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
344 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
345 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
346 3.95786e-11
347 };
348
349 static const double ch4[121] = {
350 1.864e-06, 1.835e-06, 1.819e-06, 1.805e-06, 1.796e-06, 1.788e-06,
351 1.782e-06, 1.776e-06, 1.769e-06, 1.761e-06, 1.749e-06, 1.734e-06,
352 1.716e-06, 1.692e-06, 1.654e-06, 1.61e-06, 1.567e-06, 1.502e-06,
353 1.433e-06, 1.371e-06, 1.323e-06, 1.277e-06, 1.232e-06, 1.188e-06,
354 1.147e-06, 1.108e-06, 1.07e-06, 1.027e-06, 9.854e-07, 9.416e-07,
355 8.933e-07, 8.478e-07, 7.988e-07, 7.515e-07, 7.07e-07, 6.64e-07,
356 6.239e-07, 5.864e-07, 5.512e-07, 5.184e-07, 4.87e-07, 4.571e-07,
357 4.296e-07, 4.04e-07, 3.802e-07, 3.578e-07, 3.383e-07, 3.203e-07,
358 3.032e-07, 2.889e-07, 2.76e-07, 2.635e-07, 2.519e-07, 2.409e-07,
359 2.302e-07, 2.219e-07, 2.144e-07, 2.071e-07, 1.999e-07, 1.93e-07,
360 1.862e-07, 1.795e-07, 1.731e-07, 1.668e-07, 1.607e-07, 1.548e-07,
361 1.49e-07, 1.434e-07, 1.38e-07, 1.328e-07, 1.277e-07, 1.227e-07,
362 1.18e-07, 1.134e-07, 1.089e-07, 1.046e-07, 1.004e-07, 9.635e-08,
363 9.245e-08, 8.867e-08, 8.502e-08, 8.15e-08, 7.809e-08, 7.48e-08,
364 7.159e-08, 6.849e-08, 6.55e-08, 6.262e-08, 5.98e-08, 5.708e-08,
365 5.448e-08, 5.194e-08, 4.951e-08, 4.72e-08, 4.5e-08, 4.291e-08,
366 4.093e-08, 3.905e-08, 3.729e-08, 3.563e-08, 3.408e-08, 3.265e-08,
367 3.128e-08, 2.996e-08, 2.87e-08, 2.76e-08, 2.657e-08, 2.558e-08,
368 2.467e-08, 2.385e-08, 2.307e-08, 2.234e-08, 2.168e-08, 2.108e-08,
369 2.05e-08, 1.998e-08, 1.947e-08, 1.902e-08, 1.86e-08, 1.819e-08,
370 1.782e-08
371 };
372
373 static const double clo[121] = {
374 7.419e-15, 1.061e-14, 1.518e-14, 2.195e-14, 3.175e-14, 4.666e-14,
375 6.872e-14, 1.03e-13, 1.553e-13, 2.375e-13, 3.664e-13, 5.684e-13,
376 8.915e-13, 1.402e-12, 2.269e-12, 4.125e-12, 7.501e-12, 1.257e-11,
377 2.048e-11, 3.338e-11, 5.44e-11, 8.846e-11, 1.008e-10, 1.082e-10,
378 1.157e-10, 1.232e-10, 1.312e-10, 1.539e-10, 1.822e-10, 2.118e-10,
379 2.387e-10, 2.687e-10, 2.875e-10, 3.031e-10, 3.23e-10, 3.648e-10,
380 4.117e-10, 4.477e-10, 4.633e-10, 4.794e-10, 4.95e-10, 5.104e-10,
381 5.259e-10, 5.062e-10, 4.742e-10, 4.443e-10, 4.051e-10, 3.659e-10,
382 3.305e-10, 2.911e-10, 2.54e-10, 2.215e-10, 1.927e-10, 1.675e-10,
383 1.452e-10, 1.259e-10, 1.09e-10, 9.416e-11, 8.119e-11, 6.991e-11,
384 6.015e-11, 5.163e-11, 4.43e-11, 3.789e-11, 3.24e-11, 2.769e-11,
385 2.361e-11, 2.011e-11, 1.71e-11, 1.453e-11, 1.233e-11, 1.045e-11,
386 8.851e-12, 7.48e-12, 6.316e-12, 5.326e-12, 4.487e-12, 3.778e-12,
387 3.176e-12, 2.665e-12, 2.234e-12, 1.87e-12, 1.563e-12, 1.304e-12,
388 1.085e-12, 9.007e-13, 7.468e-13, 6.179e-13, 5.092e-13, 4.188e-13,
389 3.442e-13, 2.816e-13, 2.304e-13, 1.885e-13, 1.542e-13, 1.263e-13,
390 1.035e-13, 8.5e-14, 7.004e-14, 5.783e-14, 4.795e-14, 4.007e-14,
391 3.345e-14, 2.792e-14, 2.33e-14, 1.978e-14, 1.686e-14, 1.438e-14,
392 1.234e-14, 1.07e-14, 9.312e-15, 8.131e-15, 7.164e-15, 6.367e-15,
393 5.67e-15, 5.088e-15, 4.565e-15, 4.138e-15, 3.769e-15, 3.432e-15,
394 3.148e-15
395 };
396
397 static const double clono2[121] = {
398 1.011e-13, 1.515e-13, 2.272e-13, 3.446e-13, 5.231e-13, 8.085e-13,
399 1.253e-12, 1.979e-12, 3.149e-12, 5.092e-12, 8.312e-12, 1.366e-11,
400 2.272e-11, 3.791e-11, 6.209e-11, 9.101e-11, 1.334e-10, 1.951e-10,
401 2.853e-10, 3.94e-10, 4.771e-10, 5.771e-10, 6.675e-10, 7.665e-10,
402 8.504e-10, 8.924e-10, 9.363e-10, 8.923e-10, 8.411e-10, 7.646e-10,
403 6.525e-10, 5.576e-10, 4.398e-10, 3.403e-10, 2.612e-10, 1.915e-10,
404 1.407e-10, 1.028e-10, 7.455e-11, 5.42e-11, 3.708e-11, 2.438e-11,
405 1.618e-11, 1.075e-11, 7.17e-12, 4.784e-12, 3.205e-12, 2.147e-12,
406 1.44e-12, 9.654e-13, 6.469e-13, 4.332e-13, 2.891e-13, 1.926e-13,
407 1.274e-13, 8.422e-14, 5.547e-14, 3.636e-14, 2.368e-14, 1.536e-14,
408 9.937e-15, 6.39e-15, 4.101e-15, 2.61e-15, 1.659e-15, 1.052e-15,
409 6.638e-16, 4.172e-16, 2.61e-16, 1.63e-16, 1.013e-16, 6.275e-17,
410 3.879e-17, 2.383e-17, 1.461e-17, 8.918e-18, 5.43e-18, 3.301e-18,
411 1.997e-18, 1.203e-18, 7.216e-19, 4.311e-19, 2.564e-19, 1.519e-19,
412 8.911e-20, 5.203e-20, 3.026e-20, 1.748e-20, 9.99e-21, 5.673e-21,
413 3.215e-21, 1.799e-21, 1.006e-21, 5.628e-22, 3.146e-22, 1.766e-22,
414 9.94e-23, 5.614e-23, 3.206e-23, 1.841e-23, 1.071e-23, 6.366e-24,
415 3.776e-24, 2.238e-24, 1.326e-24, 8.253e-25, 5.201e-25, 3.279e-25,
416 2.108e-25, 1.395e-25, 9.326e-26, 6.299e-26, 4.365e-26, 3.104e-26,
417 2.219e-26, 1.621e-26, 1.185e-26, 8.92e-27, 6.804e-27, 5.191e-27,
418 4.041e-27
419 };
420
421 static const double co[121] = {
422 1.907e-07, 1.553e-07, 1.362e-07, 1.216e-07, 1.114e-07, 1.036e-07,
423 9.737e-08, 9.152e-08, 8.559e-08, 7.966e-08, 7.277e-08, 6.615e-08,
424 5.884e-08, 5.22e-08, 4.699e-08, 4.284e-08, 3.776e-08, 3.274e-08,
425 2.845e-08, 2.479e-08, 2.246e-08, 2.054e-08, 1.991e-08, 1.951e-08,
426 1.94e-08, 2.009e-08, 2.1e-08, 2.201e-08, 2.322e-08, 2.45e-08,
427 2.602e-08, 2.73e-08, 2.867e-08, 2.998e-08, 3.135e-08, 3.255e-08,
428 3.352e-08, 3.426e-08, 3.484e-08, 3.53e-08, 3.593e-08, 3.671e-08,
429 3.759e-08, 3.945e-08, 4.192e-08, 4.49e-08, 5.03e-08, 5.703e-08,
430 6.538e-08, 7.878e-08, 9.644e-08, 1.196e-07, 1.498e-07, 1.904e-07,
431 2.422e-07, 3.055e-07, 3.804e-07, 4.747e-07, 5.899e-07, 7.272e-07,
432 8.91e-07, 1.071e-06, 1.296e-06, 1.546e-06, 1.823e-06, 2.135e-06,
433 2.44e-06, 2.714e-06, 2.967e-06, 3.189e-06, 3.391e-06, 3.58e-06,
434 3.773e-06, 4.022e-06, 4.346e-06, 4.749e-06, 5.199e-06, 5.668e-06,
435 6.157e-06, 6.688e-06, 7.254e-06, 7.867e-06, 8.539e-06, 9.26e-06,
436 1.009e-05, 1.119e-05, 1.228e-05, 1.365e-05, 1.506e-05, 1.641e-05,
437 1.784e-05, 1.952e-05, 2.132e-05, 2.323e-05, 2.531e-05, 2.754e-05,
438 3.047e-05, 3.459e-05, 3.922e-05, 4.439e-05, 4.825e-05, 5.077e-05,
439 5.34e-05, 5.618e-05, 5.909e-05, 6.207e-05, 6.519e-05, 6.845e-05,
440 6.819e-05, 6.726e-05, 6.622e-05, 6.512e-05, 6.671e-05, 6.862e-05,
441 7.048e-05, 7.264e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05
442 };
443
444 static const double cof2[121] = {
445 7.5e-14, 1.055e-13, 1.485e-13, 2.111e-13, 3.001e-13, 4.333e-13,
446 6.269e-13, 9.221e-13, 1.364e-12, 2.046e-12, 3.093e-12, 4.703e-12,
447 7.225e-12, 1.113e-11, 1.66e-11, 2.088e-11, 2.626e-11, 3.433e-11,
448 4.549e-11, 5.886e-11, 7.21e-11, 8.824e-11, 1.015e-10, 1.155e-10,
449 1.288e-10, 1.388e-10, 1.497e-10, 1.554e-10, 1.606e-10, 1.639e-10,
450 1.64e-10, 1.64e-10, 1.596e-10, 1.542e-10, 1.482e-10, 1.382e-10,
451 1.289e-10, 1.198e-10, 1.109e-10, 1.026e-10, 9.484e-11, 8.75e-11,
452 8.086e-11, 7.49e-11, 6.948e-11, 6.446e-11, 5.961e-11, 5.505e-11,
453 5.085e-11, 4.586e-11, 4.1e-11, 3.665e-11, 3.235e-11, 2.842e-11,
454 2.491e-11, 2.11e-11, 1.769e-11, 1.479e-11, 1.197e-11, 9.631e-12,
455 7.74e-12, 6.201e-12, 4.963e-12, 3.956e-12, 3.151e-12, 2.507e-12,
456 1.99e-12, 1.576e-12, 1.245e-12, 9.83e-13, 7.742e-13, 6.088e-13,
457 4.782e-13, 3.745e-13, 2.929e-13, 2.286e-13, 1.782e-13, 1.388e-13,
458 1.079e-13, 8.362e-14, 6.471e-14, 4.996e-14, 3.85e-14, 2.96e-14,
459 2.265e-14, 1.729e-14, 1.317e-14, 9.998e-15, 7.549e-15, 5.683e-15,
460 4.273e-15, 3.193e-15, 2.385e-15, 1.782e-15, 1.331e-15, 9.957e-16,
461 7.461e-16, 5.601e-16, 4.228e-16, 3.201e-16, 2.438e-16, 1.878e-16,
462 1.445e-16, 1.111e-16, 8.544e-17, 6.734e-17, 5.341e-17, 4.237e-17,
463 3.394e-17, 2.759e-17, 2.254e-17, 1.851e-17, 1.54e-17, 1.297e-17,
464 1.096e-17, 9.365e-18, 8e-18, 6.938e-18, 6.056e-18, 5.287e-18,
465 4.662e-18
466 };
467
468 static const double f11[121] = {
469 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10,
470 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.635e-10, 2.536e-10,
471 2.44e-10, 2.348e-10, 2.258e-10, 2.153e-10, 2.046e-10, 1.929e-10,
472 1.782e-10, 1.648e-10, 1.463e-10, 1.291e-10, 1.1e-10, 8.874e-11,
473 7.165e-11, 5.201e-11, 3.744e-11, 2.577e-11, 1.64e-11, 1.048e-11,
474 5.993e-12, 3.345e-12, 1.839e-12, 9.264e-13, 4.688e-13, 2.329e-13,
475 1.129e-13, 5.505e-14, 2.825e-14, 1.492e-14, 7.997e-15, 5.384e-15,
476 3.988e-15, 2.955e-15, 2.196e-15, 1.632e-15, 1.214e-15, 9.025e-16,
477 6.708e-16, 4.984e-16, 3.693e-16, 2.733e-16, 2.013e-16, 1.481e-16,
478 1.087e-16, 7.945e-17, 5.782e-17, 4.195e-17, 3.038e-17, 2.19e-17,
479 1.577e-17, 1.128e-17, 8.063e-18, 5.753e-18, 4.09e-18, 2.899e-18,
480 2.048e-18, 1.444e-18, 1.015e-18, 7.12e-19, 4.985e-19, 3.474e-19,
481 2.417e-19, 1.677e-19, 1.161e-19, 8.029e-20, 5.533e-20, 3.799e-20,
482 2.602e-20, 1.776e-20, 1.209e-20, 8.202e-21, 5.522e-21, 3.707e-21,
483 2.48e-21, 1.652e-21, 1.091e-21, 7.174e-22, 4.709e-22, 3.063e-22,
484 1.991e-22, 1.294e-22, 8.412e-23, 5.483e-23, 3.581e-23, 2.345e-23,
485 1.548e-23, 1.027e-23, 6.869e-24, 4.673e-24, 3.173e-24, 2.153e-24,
486 1.461e-24, 1.028e-24, 7.302e-25, 5.188e-25, 3.739e-25, 2.753e-25,
487 2.043e-25, 1.528e-25, 1.164e-25, 9.041e-26, 7.051e-26, 5.587e-26,
488 4.428e-26, 3.588e-26, 2.936e-26, 2.402e-26, 1.995e-26
489 };
490
491 static const double f113[121] = {
492 1.9e-11, 1.9e-11, 1.899e-11, 1.899e-11, 1.898e-11, 1.898e-11,
493 1.897e-11, 1.896e-11, 1.895e-11, 1.894e-11, 1.893e-11, 1.89e-11,
494 1.887e-11, 1.871e-11, 1.854e-11, 1.803e-11, 1.751e-11, 1.664e-11,
495 1.576e-11, 1.466e-11, 1.356e-11, 1.236e-11, 1.116e-11, 9.931e-12,
496 8.702e-12, 7.515e-12, 6.4238e-12, 5.3326e-12, 4.3652e-12, 3.5216e-12,
497 2.678e-12, 2.1532e-12, 1.6284e-12, 1.2202e-12, 9.286e-13, 6.37e-13,
498 4.95e-13, 3.53e-13, 2.5004e-13, 1.8612e-13, 1.222e-13, 9.704e-14,
499 7.188e-14, 5.3338e-14, 4.1414e-14, 2.949e-14, 2.3722e-14, 1.7954e-14,
500 1.37794e-14, 1.11982e-14, 8.617e-15, 7.6036e-15, 6.5902e-15,
501 5.5768e-15, 4.5634e-15, 3.55e-15, 3.1008e-15, 2.6516e-15, 2.2024e-15,
502 1.7532e-15, 1.304e-15, 1.1354e-15, 9.668e-16, 7.982e-16, 6.296e-16,
503 4.61e-16, 3.9734e-16, 3.3368e-16, 2.7002e-16, 2.0636e-16, 1.427e-16,
504 1.22804e-16, 1.02908e-16, 8.3012e-17, 6.3116e-17, 4.322e-17,
505 3.6838e-17, 3.0456e-17, 2.4074e-17, 1.7692e-17, 1.131e-17,
506 9.6202e-18, 7.9304e-18, 6.2406e-18, 4.5508e-18, 2.861e-18,
507 2.40476e-18, 1.94852e-18, 1.49228e-18, 1.03604e-18, 5.798e-19,
508 4.8502e-19, 3.9024e-19, 2.9546e-19, 2.0068e-19, 1.059e-19,
509 8.7084e-20, 6.8268e-20, 4.9452e-20, 3.0636e-20, 1.182e-20,
510 9.64344e-21, 7.46688e-21, 5.29032e-21, 3.11376e-21, 9.372e-22,
511 7.5685e-22, 5.765e-22, 3.9615e-22, 2.158e-22, 3.545e-23,
512 2.86046e-23, 2.17592e-23, 1.49138e-23, 8.0684e-24, 1.223e-24,
513 9.92358e-25, 7.61716e-25, 5.31074e-25, 3.00432e-25, 6.979e-26
514 };
515
516 static const double f114[121] = {
517 1.2e-11, 1.2e-11, 1.2e-11, 1.2e-11, 1.199e-11, 1.199e-11,
518 1.199e-11, 1.199e-11, 1.198e-11, 1.198e-11, 1.198e-11, 1.197e-11,
519 1.196e-11, 1.191e-11, 1.185e-11, 1.167e-11, 1.149e-11, 1.12e-11,
520 1.09e-11, 1.053e-11, 1.015e-11, 9.731e-12, 9.311e-12, 8.865e-12,
521 8.419e-12, 7.949e-12, 7.4774e-12, 7.0058e-12, 6.54e-12, 6.08e-12,
522 5.62e-12, 5.1908e-12, 4.7616e-12, 4.3622e-12, 3.9926e-12, 3.623e-12,
523 3.3274e-12, 3.0318e-12, 2.7702e-12, 2.5426e-12, 2.315e-12, 2.1514e-12,
524 1.9878e-12, 1.8448e-12, 1.7224e-12, 1.6e-12, 1.51e-12, 1.42e-12,
525 1.3462e-12, 1.2886e-12, 1.231e-12, 1.1922e-12, 1.1534e-12, 1.1146e-12,
526 1.0758e-12, 1.037e-12, 1.0025e-12, 9.68e-13, 9.335e-13, 8.99e-13,
527 8.645e-13, 8.344e-13, 8.043e-13, 7.742e-13, 7.441e-13, 7.14e-13,
528 6.8718e-13, 6.6036e-13, 6.3354e-13, 6.0672e-13, 5.799e-13, 5.5612e-13,
529 5.3234e-13, 5.0856e-13, 4.8478e-13, 4.61e-13, 4.394e-13, 4.178e-13,
530 3.962e-13, 3.746e-13, 3.53e-13, 3.3288e-13, 3.1276e-13, 2.9264e-13,
531 2.7252e-13, 2.524e-13, 2.3368e-13, 2.1496e-13, 1.9624e-13, 1.7752e-13,
532 1.588e-13, 1.4221e-13, 1.2562e-13, 1.0903e-13, 9.244e-14, 7.585e-14,
533 6.4942e-14, 5.4034e-14, 4.3126e-14, 3.2218e-14, 2.131e-14, 1.76694e-14,
534 1.40288e-14, 1.03882e-14, 6.7476e-15, 3.107e-15, 2.52738e-15,
535 1.94776e-15, 1.36814e-15, 7.8852e-16, 2.089e-16, 1.69288e-16,
536 1.29676e-16, 9.0064e-17, 5.0452e-17, 1.084e-17, 8.85136e-18,
537 6.86272e-18, 4.87408e-18, 2.88544e-18, 8.968e-19
538 };
539
540 static const double f12[121] = {
541 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10,
542 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.429e-10, 5.291e-10,
543 5.155e-10, 5.022e-10, 4.893e-10, 4.772e-10, 4.655e-10, 4.497e-10,
544 4.249e-10, 4.015e-10, 3.632e-10, 3.261e-10, 2.858e-10, 2.408e-10,
545 2.03e-10, 1.685e-10, 1.4e-10, 1.163e-10, 9.65e-11, 8.02e-11, 6.705e-11,
546 5.624e-11, 4.764e-11, 4.249e-11, 3.792e-11, 3.315e-11, 2.819e-11,
547 2.4e-11, 1.999e-11, 1.64e-11, 1.352e-11, 1.14e-11, 9.714e-12,
548 8.28e-12, 7.176e-12, 6.251e-12, 5.446e-12, 4.72e-12, 4.081e-12,
549 3.528e-12, 3.08e-12, 2.699e-12, 2.359e-12, 2.111e-12, 1.901e-12,
550 1.709e-12, 1.534e-12, 1.376e-12, 1.233e-12, 1.103e-12, 9.869e-13,
551 8.808e-13, 7.859e-13, 7.008e-13, 6.241e-13, 5.553e-13, 4.935e-13,
552 4.383e-13, 3.889e-13, 3.447e-13, 3.054e-13, 2.702e-13, 2.389e-13,
553 2.11e-13, 1.862e-13, 1.643e-13, 1.448e-13, 1.274e-13, 1.121e-13,
554 9.844e-14, 8.638e-14, 7.572e-14, 6.62e-14, 5.782e-14, 5.045e-14,
555 4.394e-14, 3.817e-14, 3.311e-14, 2.87e-14, 2.48e-14, 2.142e-14,
556 1.851e-14, 1.599e-14, 1.383e-14, 1.196e-14, 1.036e-14, 9e-15,
557 7.828e-15, 6.829e-15, 5.992e-15, 5.254e-15, 4.606e-15, 4.037e-15,
558 3.583e-15, 3.19e-15, 2.841e-15, 2.542e-15, 2.291e-15, 2.07e-15,
559 1.875e-15, 1.71e-15, 1.57e-15, 1.442e-15, 1.333e-15, 1.232e-15,
560 1.147e-15, 1.071e-15, 1.001e-15, 9.396e-16
561 };
562
563 static const double f14[121] = {
564 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11,
565 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 8.91e-11, 8.73e-11, 8.46e-11,
566 8.19e-11, 7.92e-11, 7.74e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
567 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
568 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
569 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
570 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
571 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
572 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
573 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
574 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
575 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
576 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
577 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
578 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
579 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
580 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11
581 };
582
583 static const double f22[121] = {
584 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10,
585 1.4e-10, 1.4e-10, 1.4e-10, 1.372e-10, 1.317e-10, 1.235e-10, 1.153e-10,
586 1.075e-10, 1.002e-10, 9.332e-11, 8.738e-11, 8.194e-11, 7.7e-11,
587 7.165e-11, 6.753e-11, 6.341e-11, 5.971e-11, 5.6e-11, 5.229e-11,
588 4.859e-11, 4.488e-11, 4.118e-11, 3.83e-11, 3.568e-11, 3.308e-11,
589 3.047e-11, 2.82e-11, 2.594e-11, 2.409e-11, 2.237e-11, 2.065e-11,
590 1.894e-11, 1.771e-11, 1.647e-11, 1.532e-11, 1.416e-11, 1.332e-11,
591 1.246e-11, 1.161e-11, 1.087e-11, 1.017e-11, 9.471e-12, 8.853e-12,
592 8.235e-12, 7.741e-12, 7.247e-12, 6.836e-12, 6.506e-12, 6.176e-12,
593 5.913e-12, 5.65e-12, 5.419e-12, 5.221e-12, 5.024e-12, 4.859e-12,
594 4.694e-12, 4.546e-12, 4.414e-12, 4.282e-12, 4.15e-12, 4.019e-12,
595 3.903e-12, 3.805e-12, 3.706e-12, 3.607e-12, 3.508e-12, 3.41e-12,
596 3.31e-12, 3.212e-12, 3.129e-12, 3.047e-12, 2.964e-12, 2.882e-12,
597 2.8e-12, 2.734e-12, 2.668e-12, 2.602e-12, 2.537e-12, 2.471e-12,
598 2.421e-12, 2.372e-12, 2.322e-12, 2.273e-12, 2.224e-12, 2.182e-12,
599 2.141e-12, 2.1e-12, 2.059e-12, 2.018e-12, 1.977e-12, 1.935e-12,
600 1.894e-12, 1.853e-12, 1.812e-12, 1.77e-12, 1.73e-12, 1.688e-12,
601 1.647e-12, 1.606e-12, 1.565e-12, 1.524e-12, 1.483e-12, 1.441e-12,
602 1.4e-12, 1.359e-12, 1.317e-12, 1.276e-12, 1.235e-12, 1.194e-12,
603 1.153e-12, 1.112e-12, 1.071e-12, 1.029e-12, 9.883e-13
604 };
605
606 static const double h2co[121] = {
607 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11,
608 8.71857e-11, 7.72315e-11, 6.85464e-11, 6.0758e-11, 5.32087e-11,
609 4.5719e-11, 3.79458e-11, 3.07607e-11, 2.46025e-11, 1.94038e-11,
610 1.40882e-11, 1.0623e-11, 8.35457e-12, 6.87427e-12, 7.09071e-12,
611 8.96183e-12, 1.09012e-11, 1.50545e-11, 1.92077e-11, 2.3361e-11,
612 2.7054e-11, 3.01936e-11, 3.33333e-11, 3.69281e-11, 4.08069e-11,
613 4.57318e-11, 5.1348e-11, 5.69642e-11, 6.33173e-11, 6.98984e-11,
614 7.63144e-11, 8.22774e-11, 8.82405e-11, 9.3746e-11, 9.92074e-11,
615 1.04669e-10, 1.10055e-10, 1.15293e-10, 1.20531e-10, 1.26293e-10,
616 1.32585e-10, 1.35966e-10, 1.36242e-10, 1.36519e-10, 1.61155e-10,
617 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
618 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
619 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
620 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
621 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
622 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
623 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
624 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
625 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
626 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
627 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
628 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
629 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
630 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
631 1.99157e-10
632 };
633
634 static const double h2o[121] = {
635 0.01166, 0.008269, 0.005742, 0.003845, 0.00277, 0.001897, 0.001272,
636 0.000827, 0.000539, 0.0003469, 0.0001579, 3.134e-05, 1.341e-05,
637 6.764e-06, 4.498e-06, 3.703e-06, 3.724e-06, 3.899e-06, 4.002e-06,
638 4.122e-06, 4.277e-06, 4.438e-06, 4.558e-06, 4.673e-06, 4.763e-06,
639 4.809e-06, 4.856e-06, 4.936e-06, 5.021e-06, 5.114e-06, 5.222e-06,
640 5.331e-06, 5.414e-06, 5.488e-06, 5.563e-06, 5.633e-06, 5.704e-06,
641 5.767e-06, 5.819e-06, 5.872e-06, 5.914e-06, 5.949e-06, 5.984e-06,
642 6.015e-06, 6.044e-06, 6.073e-06, 6.104e-06, 6.136e-06, 6.167e-06,
643 6.189e-06, 6.208e-06, 6.226e-06, 6.212e-06, 6.185e-06, 6.158e-06,
644 6.114e-06, 6.066e-06, 6.018e-06, 5.877e-06, 5.728e-06, 5.582e-06,
645 5.437e-06, 5.296e-06, 5.156e-06, 5.02e-06, 4.886e-06, 4.754e-06,
646 4.625e-06, 4.498e-06, 4.374e-06, 4.242e-06, 4.096e-06, 3.955e-06,
647 3.817e-06, 3.683e-06, 3.491e-06, 3.204e-06, 2.94e-06, 2.696e-06,
648 2.47e-06, 2.252e-06, 2.019e-06, 1.808e-06, 1.618e-06, 1.445e-06,
649 1.285e-06, 1.105e-06, 9.489e-07, 8.121e-07, 6.938e-07, 5.924e-07,
650 5.04e-07, 4.288e-07, 3.648e-07, 3.103e-07, 2.642e-07, 2.252e-07,
651 1.921e-07, 1.643e-07, 1.408e-07, 1.211e-07, 1.048e-07, 9.063e-08,
652 7.835e-08, 6.774e-08, 5.936e-08, 5.221e-08, 4.592e-08, 4.061e-08,
653 3.62e-08, 3.236e-08, 2.902e-08, 2.62e-08, 2.383e-08, 2.171e-08,
654 1.989e-08, 1.823e-08, 1.684e-08, 1.562e-08, 1.449e-08, 1.351e-08
655 };
656
657 static const double h2o2[121] = {
658 1.779e-10, 7.938e-10, 8.953e-10, 8.032e-10, 6.564e-10, 5.159e-10,
659 4.003e-10, 3.026e-10, 2.222e-10, 1.58e-10, 1.044e-10, 6.605e-11,
660 3.413e-11, 1.453e-11, 1.062e-11, 1.009e-11, 9.597e-12, 1.175e-11,
661 1.572e-11, 2.091e-11, 2.746e-11, 3.603e-11, 4.791e-11, 6.387e-11,
662 8.239e-11, 1.007e-10, 1.23e-10, 1.363e-10, 1.489e-10, 1.585e-10,
663 1.608e-10, 1.632e-10, 1.576e-10, 1.502e-10, 1.423e-10, 1.302e-10,
664 1.192e-10, 1.085e-10, 9.795e-11, 8.854e-11, 8.057e-11, 7.36e-11,
665 6.736e-11, 6.362e-11, 6.087e-11, 5.825e-11, 5.623e-11, 5.443e-11,
666 5.27e-11, 5.098e-11, 4.931e-11, 4.769e-11, 4.611e-11, 4.458e-11,
667 4.308e-11, 4.102e-11, 3.887e-11, 3.682e-11, 3.521e-11, 3.369e-11,
668 3.224e-11, 3.082e-11, 2.946e-11, 2.814e-11, 2.687e-11, 2.566e-11,
669 2.449e-11, 2.336e-11, 2.227e-11, 2.123e-11, 2.023e-11, 1.927e-11,
670 1.835e-11, 1.746e-11, 1.661e-11, 1.58e-11, 1.502e-11, 1.428e-11,
671 1.357e-11, 1.289e-11, 1.224e-11, 1.161e-11, 1.102e-11, 1.045e-11,
672 9.895e-12, 9.369e-12, 8.866e-12, 8.386e-12, 7.922e-12, 7.479e-12,
673 7.06e-12, 6.656e-12, 6.274e-12, 5.914e-12, 5.575e-12, 5.257e-12,
674 4.959e-12, 4.679e-12, 4.42e-12, 4.178e-12, 3.954e-12, 3.75e-12,
675 3.557e-12, 3.372e-12, 3.198e-12, 3.047e-12, 2.908e-12, 2.775e-12,
676 2.653e-12, 2.544e-12, 2.442e-12, 2.346e-12, 2.26e-12, 2.183e-12,
677 2.11e-12, 2.044e-12, 1.98e-12, 1.924e-12, 1.871e-12, 1.821e-12,
678 1.775e-12
679 };
680
681 static const double hcl[121] = {
682 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11,
683 3.70385e-11, 2.21247e-11, 1.88117e-11, 2.36957e-11, 3.72192e-11,
684 5.79399e-11, 8.04158e-11, 1.01779e-10, 1.2301e-10, 1.53924e-10,
685 1.93737e-10, 2.5561e-10, 3.84228e-10, 6.18248e-10, 6.31222e-10,
686 7.84907e-10, 9.36932e-10, 1.03508e-09, 1.13323e-09, 1.23138e-09,
687 1.31985e-09, 1.39669e-09, 1.47352e-09, 1.56375e-09, 1.66234e-09,
688 1.78086e-09, 1.91256e-09, 2.04425e-09, 2.16629e-09, 2.28535e-09,
689 2.39439e-09, 2.47597e-09, 2.55755e-09, 2.60873e-09, 2.65696e-09,
690 2.70519e-09, 2.75658e-09, 2.81422e-09, 2.87187e-09, 2.94013e-09,
691 3.01911e-09, 3.09497e-09, 3.16749e-09, 3.24001e-09, 3.30525e-09,
692 3.3665e-09, 3.42424e-09, 3.4619e-09, 3.49956e-09, 3.52273e-09,
693 3.54214e-09, 3.56154e-09, 3.57918e-09, 3.59049e-09, 3.6018e-09,
694 3.6132e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
695 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
696 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
697 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
698 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
699 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
700 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
701 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
702 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
703 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
704 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
705 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
706 3.62476e-09
707 };
708
709 static const double hcn[121] = {
710 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10,
711 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.498e-10, 5.495e-10, 5.493e-10,
712 5.49e-10, 5.488e-10, 4.717e-10, 3.946e-10, 3.174e-10, 2.4e-10,
713 1.626e-10, 1.619e-10, 1.612e-10, 1.602e-10, 1.593e-10, 1.582e-10,
714 1.572e-10, 1.56e-10, 1.549e-10, 1.539e-10, 1.53e-10, 1.519e-10,
715 1.506e-10, 1.487e-10, 1.467e-10, 1.449e-10, 1.43e-10, 1.413e-10,
716 1.397e-10, 1.382e-10, 1.368e-10, 1.354e-10, 1.337e-10, 1.315e-10,
717 1.292e-10, 1.267e-10, 1.241e-10, 1.215e-10, 1.19e-10, 1.165e-10,
718 1.141e-10, 1.118e-10, 1.096e-10, 1.072e-10, 1.047e-10, 1.021e-10,
719 9.968e-11, 9.739e-11, 9.539e-11, 9.339e-11, 9.135e-11, 8.898e-11,
720 8.664e-11, 8.439e-11, 8.249e-11, 8.075e-11, 7.904e-11, 7.735e-11,
721 7.565e-11, 7.399e-11, 7.245e-11, 7.109e-11, 6.982e-11, 6.863e-11,
722 6.755e-11, 6.657e-11, 6.587e-11, 6.527e-11, 6.476e-11, 6.428e-11,
723 6.382e-11, 6.343e-11, 6.307e-11, 6.272e-11, 6.238e-11, 6.205e-11,
724 6.17e-11, 6.137e-11, 6.102e-11, 6.072e-11, 6.046e-11, 6.03e-11,
725 6.018e-11, 6.01e-11, 6.001e-11, 5.992e-11, 5.984e-11, 5.975e-11,
726 5.967e-11, 5.958e-11, 5.95e-11, 5.941e-11, 5.933e-11, 5.925e-11,
727 5.916e-11, 5.908e-11, 5.899e-11, 5.891e-11, 5.883e-11, 5.874e-11,
728 5.866e-11, 5.858e-11, 5.85e-11, 5.841e-11, 5.833e-11, 5.825e-11,
729 5.817e-11, 5.808e-11, 5.8e-11, 5.792e-11, 5.784e-11
730 };
731
732 static const double hf[121] = {
733 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
734 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
735 2.64279e-11, 2.64279e-11, 2.64279e-11, 3.86691e-11, 5.22002e-11,
736 6.92471e-11, 9.13979e-11, 1.37918e-10, 2.24918e-10, 2.29824e-10,
737 2.94241e-10, 3.58363e-10, 4.12881e-10, 4.67399e-10, 5.21917e-10,
738 5.74229e-10, 6.23889e-10, 6.73549e-10, 7.24119e-10, 7.75256e-10,
739 8.319e-10, 8.92185e-10, 9.52469e-10, 1.01325e-09, 1.07419e-09,
740 1.13565e-09, 1.19856e-09, 1.26146e-09, 1.31439e-09, 1.36635e-09,
741 1.41831e-09, 1.46549e-09, 1.50321e-09, 1.54093e-09, 1.57986e-09,
742 1.62e-09, 1.66286e-09, 1.70863e-09, 1.75439e-09, 1.79827e-09,
743 1.84111e-09, 1.88125e-09, 1.90603e-09, 1.93081e-09, 1.9413e-09,
744 1.94807e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
745 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
746 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
747 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
748 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
749 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
750 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
751 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
752 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
753 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
754 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
755 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
756 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
757 1.95485e-09
758 };
759
760 static const double hno3[121] = {
761 1.809e-10, 7.234e-10, 5.899e-10, 4.342e-10, 3.277e-10, 2.661e-10,
762 2.35e-10, 2.267e-10, 2.389e-10, 2.651e-10, 3.255e-10, 4.099e-10,
763 5.42e-10, 6.978e-10, 8.807e-10, 1.112e-09, 1.405e-09, 2.04e-09,
764 3.111e-09, 4.5e-09, 5.762e-09, 7.37e-09, 7.852e-09, 8.109e-09,
765 8.067e-09, 7.554e-09, 7.076e-09, 6.268e-09, 5.524e-09, 4.749e-09,
766 3.909e-09, 3.223e-09, 2.517e-09, 1.942e-09, 1.493e-09, 1.122e-09,
767 8.449e-10, 6.361e-10, 4.787e-10, 3.611e-10, 2.804e-10, 2.215e-10,
768 1.758e-10, 1.441e-10, 1.197e-10, 9.953e-11, 8.505e-11, 7.334e-11,
769 6.325e-11, 5.625e-11, 5.058e-11, 4.548e-11, 4.122e-11, 3.748e-11,
770 3.402e-11, 3.088e-11, 2.8e-11, 2.536e-11, 2.293e-11, 2.072e-11,
771 1.871e-11, 1.687e-11, 1.52e-11, 1.368e-11, 1.23e-11, 1.105e-11,
772 9.922e-12, 8.898e-12, 7.972e-12, 7.139e-12, 6.385e-12, 5.708e-12,
773 5.099e-12, 4.549e-12, 4.056e-12, 3.613e-12, 3.216e-12, 2.862e-12,
774 2.544e-12, 2.259e-12, 2.004e-12, 1.776e-12, 1.572e-12, 1.391e-12,
775 1.227e-12, 1.082e-12, 9.528e-13, 8.379e-13, 7.349e-13, 6.436e-13,
776 5.634e-13, 4.917e-13, 4.291e-13, 3.745e-13, 3.267e-13, 2.854e-13,
777 2.494e-13, 2.181e-13, 1.913e-13, 1.68e-13, 1.479e-13, 1.31e-13,
778 1.159e-13, 1.025e-13, 9.067e-14, 8.113e-14, 7.281e-14, 6.535e-14,
779 5.892e-14, 5.348e-14, 4.867e-14, 4.439e-14, 4.073e-14, 3.76e-14,
780 3.476e-14, 3.229e-14, 3e-14, 2.807e-14, 2.635e-14, 2.473e-14,
781 2.332e-14
782 };
783
784 static const double hno4[121] = {
785 6.118e-12, 3.594e-12, 2.807e-12, 3.04e-12, 4.458e-12, 7.986e-12,
786 1.509e-11, 2.661e-11, 3.738e-11, 4.652e-11, 4.429e-11, 3.992e-11,
787 3.347e-11, 3.005e-11, 3.173e-11, 4.055e-11, 5.812e-11, 8.489e-11,
788 1.19e-10, 1.482e-10, 1.766e-10, 2.103e-10, 2.35e-10, 2.598e-10,
789 2.801e-10, 2.899e-10, 3e-10, 2.817e-10, 2.617e-10, 2.332e-10,
790 1.933e-10, 1.605e-10, 1.232e-10, 9.285e-11, 6.941e-11, 4.951e-11,
791 3.539e-11, 2.402e-11, 1.522e-11, 9.676e-12, 6.056e-12, 3.745e-12,
792 2.34e-12, 1.463e-12, 9.186e-13, 5.769e-13, 3.322e-13, 1.853e-13,
793 1.035e-13, 7.173e-14, 5.382e-14, 4.036e-14, 3.401e-14, 2.997e-14,
794 2.635e-14, 2.316e-14, 2.034e-14, 1.783e-14, 1.56e-14, 1.363e-14,
795 1.19e-14, 1.037e-14, 9.032e-15, 7.846e-15, 6.813e-15, 5.912e-15,
796 5.121e-15, 4.431e-15, 3.829e-15, 3.306e-15, 2.851e-15, 2.456e-15,
797 2.114e-15, 1.816e-15, 1.559e-15, 1.337e-15, 1.146e-15, 9.811e-16,
798 8.389e-16, 7.162e-16, 6.109e-16, 5.203e-16, 4.425e-16, 3.76e-16,
799 3.184e-16, 2.692e-16, 2.274e-16, 1.917e-16, 1.61e-16, 1.35e-16,
800 1.131e-16, 9.437e-17, 7.874e-17, 6.57e-17, 5.481e-17, 4.579e-17,
801 3.828e-17, 3.204e-17, 2.691e-17, 2.264e-17, 1.912e-17, 1.626e-17,
802 1.382e-17, 1.174e-17, 9.972e-18, 8.603e-18, 7.45e-18, 6.453e-18,
803 5.623e-18, 4.944e-18, 4.361e-18, 3.859e-18, 3.443e-18, 3.096e-18,
804 2.788e-18, 2.528e-18, 2.293e-18, 2.099e-18, 1.929e-18, 1.773e-18,
805 1.64e-18
806 };
807
808 static const double hocl[121] = {
809 1.056e-12, 1.194e-12, 1.35e-12, 1.531e-12, 1.737e-12, 1.982e-12,
810 2.263e-12, 2.599e-12, 2.991e-12, 3.459e-12, 4.012e-12, 4.662e-12,
811 5.438e-12, 6.35e-12, 7.425e-12, 8.686e-12, 1.016e-11, 1.188e-11,
812 1.389e-11, 1.659e-11, 2.087e-11, 2.621e-11, 3.265e-11, 4.064e-11,
813 4.859e-11, 5.441e-11, 6.09e-11, 6.373e-11, 6.611e-11, 6.94e-11,
814 7.44e-11, 7.97e-11, 8.775e-11, 9.722e-11, 1.064e-10, 1.089e-10,
815 1.114e-10, 1.106e-10, 1.053e-10, 1.004e-10, 9.006e-11, 7.778e-11,
816 6.739e-11, 5.636e-11, 4.655e-11, 3.845e-11, 3.042e-11, 2.368e-11,
817 1.845e-11, 1.442e-11, 1.127e-11, 8.814e-12, 6.544e-12, 4.763e-12,
818 3.449e-12, 2.612e-12, 1.999e-12, 1.526e-12, 1.16e-12, 8.793e-13,
819 6.655e-13, 5.017e-13, 3.778e-13, 2.829e-13, 2.117e-13, 1.582e-13,
820 1.178e-13, 8.755e-14, 6.486e-14, 4.799e-14, 3.54e-14, 2.606e-14,
821 1.916e-14, 1.403e-14, 1.026e-14, 7.48e-15, 5.446e-15, 3.961e-15,
822 2.872e-15, 2.076e-15, 1.498e-15, 1.077e-15, 7.726e-16, 5.528e-16,
823 3.929e-16, 2.785e-16, 1.969e-16, 1.386e-16, 9.69e-17, 6.747e-17,
824 4.692e-17, 3.236e-17, 2.232e-17, 1.539e-17, 1.061e-17, 7.332e-18,
825 5.076e-18, 3.522e-18, 2.461e-18, 1.726e-18, 1.22e-18, 8.75e-19,
826 6.264e-19, 4.482e-19, 3.207e-19, 2.368e-19, 1.762e-19, 1.312e-19,
827 9.891e-20, 7.595e-20, 5.87e-20, 4.567e-20, 3.612e-20, 2.904e-20,
828 2.343e-20, 1.917e-20, 1.568e-20, 1.308e-20, 1.1e-20, 9.25e-21,
829 7.881e-21
830 };
831
832 static const double n2o[121] = {
833 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07,
834 3.17e-07, 3.17e-07, 3.17e-07, 3.124e-07, 3.077e-07, 3.03e-07,
835 2.984e-07, 2.938e-07, 2.892e-07, 2.847e-07, 2.779e-07, 2.705e-07,
836 2.631e-07, 2.557e-07, 2.484e-07, 2.345e-07, 2.201e-07, 2.01e-07,
837 1.754e-07, 1.532e-07, 1.329e-07, 1.154e-07, 1.003e-07, 8.735e-08,
838 7.617e-08, 6.512e-08, 5.547e-08, 4.709e-08, 3.915e-08, 3.259e-08,
839 2.738e-08, 2.327e-08, 1.98e-08, 1.711e-08, 1.493e-08, 1.306e-08,
840 1.165e-08, 1.049e-08, 9.439e-09, 8.375e-09, 7.391e-09, 6.525e-09,
841 5.759e-09, 5.083e-09, 4.485e-09, 3.953e-09, 3.601e-09, 3.27e-09,
842 2.975e-09, 2.757e-09, 2.556e-09, 2.37e-09, 2.195e-09, 2.032e-09,
843 1.912e-09, 1.79e-09, 1.679e-09, 1.572e-09, 1.482e-09, 1.402e-09,
844 1.326e-09, 1.254e-09, 1.187e-09, 1.127e-09, 1.071e-09, 1.02e-09,
845 9.673e-10, 9.193e-10, 8.752e-10, 8.379e-10, 8.017e-10, 7.66e-10,
846 7.319e-10, 7.004e-10, 6.721e-10, 6.459e-10, 6.199e-10, 5.942e-10,
847 5.703e-10, 5.488e-10, 5.283e-10, 5.082e-10, 4.877e-10, 4.696e-10,
848 4.52e-10, 4.355e-10, 4.198e-10, 4.039e-10, 3.888e-10, 3.754e-10,
849 3.624e-10, 3.499e-10, 3.381e-10, 3.267e-10, 3.163e-10, 3.058e-10,
850 2.959e-10, 2.864e-10, 2.77e-10, 2.686e-10, 2.604e-10, 2.534e-10,
851 2.462e-10, 2.386e-10, 2.318e-10, 2.247e-10, 2.189e-10, 2.133e-10,
852 2.071e-10, 2.014e-10, 1.955e-10, 1.908e-10, 1.86e-10, 1.817e-10
853 };
854
855 static const double n2o5[121] = {
856 1.231e-11, 3.035e-12, 1.702e-12, 9.877e-13, 8.081e-13, 9.039e-13,
857 1.169e-12, 1.474e-12, 1.651e-12, 1.795e-12, 1.998e-12, 2.543e-12,
858 4.398e-12, 7.698e-12, 1.28e-11, 2.131e-11, 3.548e-11, 5.894e-11,
859 7.645e-11, 1.089e-10, 1.391e-10, 1.886e-10, 2.386e-10, 2.986e-10,
860 3.487e-10, 3.994e-10, 4.5e-10, 4.6e-10, 4.591e-10, 4.1e-10, 3.488e-10,
861 2.846e-10, 2.287e-10, 1.696e-10, 1.011e-10, 6.428e-11, 4.324e-11,
862 2.225e-11, 6.214e-12, 3.608e-12, 8.793e-13, 4.491e-13, 1.04e-13,
863 6.1e-14, 3.436e-14, 6.671e-15, 1.171e-15, 5.848e-16, 1.212e-16,
864 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
865 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
866 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
867 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
868 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
869 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
870 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
871 1e-16, 1e-16
872 };
873
874 static const double nh3[121] = {
875 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
876 1e-10, 1e-10, 1e-10, 1e-10, 9.444e-11, 8.488e-11, 7.241e-11, 5.785e-11,
877 4.178e-11, 3.018e-11, 2.18e-11, 1.574e-11, 1.137e-11, 8.211e-12,
878 5.973e-12, 4.327e-12, 3.118e-12, 2.234e-12, 1.573e-12, 1.04e-12,
879 6.762e-13, 4.202e-13, 2.406e-13, 1.335e-13, 6.938e-14, 3.105e-14,
880 1.609e-14, 1.033e-14, 6.432e-15, 4.031e-15, 2.555e-15, 1.656e-15,
881 1.115e-15, 7.904e-16, 5.63e-16, 4.048e-16, 2.876e-16, 2.004e-16,
882 1.356e-16, 9.237e-17, 6.235e-17, 4.223e-17, 3.009e-17, 2.328e-17,
883 2.002e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
884 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
885 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
886 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
887 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
888 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
889 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
890 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
891 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
892 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
893 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
894 1.914e-17
895 };
896
897 static const double no[121] = {
898 2.586e-10, 4.143e-11, 1.566e-11, 9.591e-12, 8.088e-12, 8.462e-12,
899 1.013e-11, 1.328e-11, 1.855e-11, 2.678e-11, 3.926e-11, 5.464e-11,
900 7.012e-11, 8.912e-11, 1.127e-10, 1.347e-10, 1.498e-10, 1.544e-10,
901 1.602e-10, 1.824e-10, 2.078e-10, 2.366e-10, 2.691e-10, 5.141e-10,
902 8.259e-10, 1.254e-09, 1.849e-09, 2.473e-09, 3.294e-09, 4.16e-09,
903 5.095e-09, 6.11e-09, 6.93e-09, 7.888e-09, 8.903e-09, 9.713e-09,
904 1.052e-08, 1.115e-08, 1.173e-08, 1.21e-08, 1.228e-08, 1.239e-08,
905 1.231e-08, 1.213e-08, 1.192e-08, 1.138e-08, 1.085e-08, 1.008e-08,
906 9.224e-09, 8.389e-09, 7.262e-09, 6.278e-09, 5.335e-09, 4.388e-09,
907 3.589e-09, 2.761e-09, 2.129e-09, 1.633e-09, 1.243e-09, 9.681e-10,
908 8.355e-10, 7.665e-10, 7.442e-10, 8.584e-10, 9.732e-10, 1.063e-09,
909 1.163e-09, 1.286e-09, 1.472e-09, 1.707e-09, 2.032e-09, 2.474e-09,
910 2.977e-09, 3.506e-09, 4.102e-09, 5.013e-09, 6.493e-09, 8.414e-09,
911 1.077e-08, 1.367e-08, 1.777e-08, 2.625e-08, 3.926e-08, 5.545e-08,
912 7.195e-08, 9.464e-08, 1.404e-07, 2.183e-07, 3.329e-07, 4.535e-07,
913 6.158e-07, 8.187e-07, 1.075e-06, 1.422e-06, 1.979e-06, 2.71e-06,
914 3.58e-06, 4.573e-06, 5.951e-06, 7.999e-06, 1.072e-05, 1.372e-05,
915 1.697e-05, 2.112e-05, 2.643e-05, 3.288e-05, 3.994e-05, 4.794e-05,
916 5.606e-05, 6.383e-05, 7.286e-05, 8.156e-05, 8.883e-05, 9.469e-05,
917 9.848e-05, 0.0001023, 0.0001066, 0.0001115, 0.0001145, 0.0001142,
918 0.0001133
919 };
920
921 static const double no2[121] = {
922 3.036e-09, 2.945e-10, 9.982e-11, 5.069e-11, 3.485e-11, 2.982e-11,
923 2.947e-11, 3.164e-11, 3.714e-11, 4.586e-11, 6.164e-11, 8.041e-11,
924 9.982e-11, 1.283e-10, 1.73e-10, 2.56e-10, 3.909e-10, 5.959e-10,
925 9.081e-10, 1.384e-09, 1.788e-09, 2.189e-09, 2.686e-09, 3.091e-09,
926 3.49e-09, 3.796e-09, 4.2e-09, 5.103e-09, 6.005e-09, 6.3e-09, 6.706e-09,
927 7.07e-09, 7.434e-09, 7.663e-09, 7.788e-09, 7.8e-09, 7.597e-09,
928 7.482e-09, 7.227e-09, 6.403e-09, 5.585e-09, 4.606e-09, 3.703e-09,
929 2.984e-09, 2.183e-09, 1.48e-09, 8.441e-10, 5.994e-10, 3.799e-10,
930 2.751e-10, 1.927e-10, 1.507e-10, 1.102e-10, 6.971e-11, 5.839e-11,
931 3.904e-11, 3.087e-11, 2.176e-11, 1.464e-11, 1.209e-11, 8.497e-12,
932 6.477e-12, 4.371e-12, 2.914e-12, 2.424e-12, 1.753e-12, 1.35e-12,
933 9.417e-13, 6.622e-13, 5.148e-13, 3.841e-13, 3.446e-13, 3.01e-13,
934 2.551e-13, 2.151e-13, 1.829e-13, 1.64e-13, 1.475e-13, 1.352e-13,
935 1.155e-13, 9.963e-14, 9.771e-14, 9.577e-14, 9.384e-14, 9.186e-14,
936 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
937 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
938 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
939 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14
940 };
941
942 static const double o3[121] = {
943 2.218e-08, 3.394e-08, 3.869e-08, 4.219e-08, 4.501e-08, 4.778e-08,
944 5.067e-08, 5.402e-08, 5.872e-08, 6.521e-08, 7.709e-08, 9.461e-08,
945 1.269e-07, 1.853e-07, 2.723e-07, 3.964e-07, 5.773e-07, 8.2e-07,
946 1.155e-06, 1.59e-06, 2.076e-06, 2.706e-06, 3.249e-06, 3.848e-06,
947 4.459e-06, 4.986e-06, 5.573e-06, 5.958e-06, 6.328e-06, 6.661e-06,
948 6.9e-06, 7.146e-06, 7.276e-06, 7.374e-06, 7.447e-06, 7.383e-06,
949 7.321e-06, 7.161e-06, 6.879e-06, 6.611e-06, 6.216e-06, 5.765e-06,
950 5.355e-06, 4.905e-06, 4.471e-06, 4.075e-06, 3.728e-06, 3.413e-06,
951 3.125e-06, 2.856e-06, 2.607e-06, 2.379e-06, 2.17e-06, 1.978e-06,
952 1.8e-06, 1.646e-06, 1.506e-06, 1.376e-06, 1.233e-06, 1.102e-06,
953 9.839e-07, 8.771e-07, 7.814e-07, 6.947e-07, 6.102e-07, 5.228e-07,
954 4.509e-07, 3.922e-07, 3.501e-07, 3.183e-07, 2.909e-07, 2.686e-07,
955 2.476e-07, 2.284e-07, 2.109e-07, 2.003e-07, 2.013e-07, 2.022e-07,
956 2.032e-07, 2.042e-07, 2.097e-07, 2.361e-07, 2.656e-07, 2.989e-07,
957 3.37e-07, 3.826e-07, 4.489e-07, 5.26e-07, 6.189e-07, 7.312e-07,
958 8.496e-07, 8.444e-07, 8.392e-07, 8.339e-07, 8.286e-07, 8.234e-07,
959 8.181e-07, 8.129e-07, 8.077e-07, 8.026e-07, 6.918e-07, 5.176e-07,
960 3.865e-07, 2.885e-07, 2.156e-07, 1.619e-07, 1.219e-07, 9.161e-08,
961 6.972e-08, 5.399e-08, 3.498e-08, 2.111e-08, 1.322e-08, 8.482e-09,
962 5.527e-09, 3.423e-09, 2.071e-09, 1.314e-09, 8.529e-10, 5.503e-10,
963 3.665e-10
964 };
965
966 static const double ocs[121] = {
967 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 5.997e-10,
968 5.989e-10, 5.881e-10, 5.765e-10, 5.433e-10, 5.074e-10, 4.567e-10,
969 4.067e-10, 3.601e-10, 3.093e-10, 2.619e-10, 2.232e-10, 1.805e-10,
970 1.46e-10, 1.187e-10, 8.03e-11, 5.435e-11, 3.686e-11, 2.217e-11,
971 1.341e-11, 8.756e-12, 4.511e-12, 2.37e-12, 1.264e-12, 8.28e-13,
972 5.263e-13, 3.209e-13, 1.717e-13, 9.068e-14, 4.709e-14, 2.389e-14,
973 1.236e-14, 1.127e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
974 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
975 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
976 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
977 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
978 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
979 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
980 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
981 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
982 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
983 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
984 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
985 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
986 1.091e-14, 1.091e-14, 1.091e-14
987 };
988
989 static const double sf6[121] = {
990 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12,
991 4.103e-12, 4.103e-12, 4.103e-12, 4.087e-12, 4.064e-12, 4.023e-12,
992 3.988e-12, 3.941e-12, 3.884e-12, 3.755e-12, 3.622e-12, 3.484e-12,
993 3.32e-12, 3.144e-12, 2.978e-12, 2.811e-12, 2.653e-12, 2.489e-12,
994 2.332e-12, 2.199e-12, 2.089e-12, 2.013e-12, 1.953e-12, 1.898e-12,
995 1.859e-12, 1.826e-12, 1.798e-12, 1.776e-12, 1.757e-12, 1.742e-12,
996 1.728e-12, 1.717e-12, 1.707e-12, 1.698e-12, 1.691e-12, 1.685e-12,
997 1.679e-12, 1.675e-12, 1.671e-12, 1.668e-12, 1.665e-12, 1.663e-12,
998 1.661e-12, 1.659e-12, 1.658e-12, 1.657e-12, 1.656e-12, 1.655e-12,
999 1.654e-12, 1.653e-12, 1.653e-12, 1.652e-12, 1.652e-12, 1.652e-12,
1000 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12,
1001 1.651e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1002 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1003 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1004 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1005 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1006 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1007 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
1008 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12
1009 };
1010
1011 static const double so2[121] = {
1012 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
1013 1e-10, 1e-10, 9.867e-11, 9.537e-11, 9e-11, 8.404e-11, 7.799e-11,
1014 7.205e-11, 6.616e-11, 6.036e-11, 5.475e-11, 5.007e-11, 4.638e-11,
1015 4.346e-11, 4.055e-11, 3.763e-11, 3.471e-11, 3.186e-11, 2.905e-11,
1016 2.631e-11, 2.358e-11, 2.415e-11, 2.949e-11, 3.952e-11, 5.155e-11,
1017 6.76e-11, 8.741e-11, 1.099e-10, 1.278e-10, 1.414e-10, 1.512e-10,
1018 1.607e-10, 1.699e-10, 1.774e-10, 1.832e-10, 1.871e-10, 1.907e-10,
1019 1.943e-10, 1.974e-10, 1.993e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1020 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1021 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1022 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1023 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1024 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1025 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1026 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10
1027 };
1028
1029 const double *q[NG] = { NULL };
1030
1031 /* Identify variable... */
1032 for (int ig = 0; ig < ctl->ng; ig++) {
1033 q[ig] = NULL;
1034 if (strcasecmp(ctl->emitter[ig], "C2H2") == 0)
1035 q[ig] = c2h2;
1036 if (strcasecmp(ctl->emitter[ig], "C2H6") == 0)
1037 q[ig] = c2h6;
1038 if (strcasecmp(ctl->emitter[ig], "CCl4") == 0)
1039 q[ig] = ccl4;
1040 if (strcasecmp(ctl->emitter[ig], "CH3OH") == 0)
1041 q[ig] = ch3oh;
1042 if (strcasecmp(ctl->emitter[ig], "CH4") == 0)
1043 q[ig] = ch4;
1044 if (strcasecmp(ctl->emitter[ig], "ClO") == 0)
1045 q[ig] = clo;
1046 if (strcasecmp(ctl->emitter[ig], "ClONO2") == 0)
1047 q[ig] = clono2;
1048 if (strcasecmp(ctl->emitter[ig], "CO") == 0)
1049 q[ig] = co;
1050 if (strcasecmp(ctl->emitter[ig], "COF2") == 0)
1051 q[ig] = cof2;
1052 if (strcasecmp(ctl->emitter[ig], "F11") == 0)
1053 q[ig] = f11;
1054 if (strcasecmp(ctl->emitter[ig], "F113") == 0)
1055 q[ig] = f113;
1056 if (strcasecmp(ctl->emitter[ig], "F114") == 0)
1057 q[ig] = f114;
1058 if (strcasecmp(ctl->emitter[ig], "F12") == 0)
1059 q[ig] = f12;
1060 if (strcasecmp(ctl->emitter[ig], "F14") == 0)
1061 q[ig] = f14;
1062 if (strcasecmp(ctl->emitter[ig], "F22") == 0)
1063 q[ig] = f22;
1064 if (strcasecmp(ctl->emitter[ig], "H2CO") == 0)
1065 q[ig] = h2co;
1066 if (strcasecmp(ctl->emitter[ig], "H2O") == 0)
1067 q[ig] = h2o;
1068 if (strcasecmp(ctl->emitter[ig], "H2O2") == 0)
1069 q[ig] = h2o2;
1070 if (strcasecmp(ctl->emitter[ig], "HCl") == 0)
1071 q[ig] = hcl;
1072 if (strcasecmp(ctl->emitter[ig], "HCN") == 0)
1073 q[ig] = hcn;
1074 if (strcasecmp(ctl->emitter[ig], "HF") == 0)
1075 q[ig] = hf;
1076 if (strcasecmp(ctl->emitter[ig], "HNO3") == 0)
1077 q[ig] = hno3;
1078 if (strcasecmp(ctl->emitter[ig], "HNO4") == 0)
1079 q[ig] = hno4;
1080 if (strcasecmp(ctl->emitter[ig], "HOCl") == 0)
1081 q[ig] = hocl;
1082 if (strcasecmp(ctl->emitter[ig], "N2O") == 0)
1083 q[ig] = n2o;
1084 if (strcasecmp(ctl->emitter[ig], "N2O5") == 0)
1085 q[ig] = n2o5;
1086 if (strcasecmp(ctl->emitter[ig], "NH3") == 0)
1087 q[ig] = nh3;
1088 if (strcasecmp(ctl->emitter[ig], "NO") == 0)
1089 q[ig] = no;
1090 if (strcasecmp(ctl->emitter[ig], "NO2") == 0)
1091 q[ig] = no2;
1092 if (strcasecmp(ctl->emitter[ig], "O3") == 0)
1093 q[ig] = o3;
1094 if (strcasecmp(ctl->emitter[ig], "OCS") == 0)
1095 q[ig] = ocs;
1096 if (strcasecmp(ctl->emitter[ig], "SF6") == 0)
1097 q[ig] = sf6;
1098 if (strcasecmp(ctl->emitter[ig], "SO2") == 0)
1099 q[ig] = so2;
1100 }
1101
1102 /* Loop over atmospheric data points... */
1103 for (int ip = 0; ip < atm->np; ip++) {
1104
1105 /* Get altitude index... */
1106 const int iz = locate_reg(z, 121, atm->z[ip]);
1107
1108 /* Interpolate pressure... */
1109 atm->p[ip] = LOGY(z[iz], pre[iz], z[iz + 1], pre[iz + 1], atm->z[ip]);
1110
1111 /* Interpolate temperature... */
1112 atm->t[ip] = LIN(z[iz], tem[iz], z[iz + 1], tem[iz + 1], atm->z[ip]);
1113
1114 /* Interpolate trace gases... */
1115 for (int ig = 0; ig < ctl->ng; ig++)
1116 if (q[ig] != NULL)
1117 atm->q[ig][ip] =
1118 LIN(z[iz], q[ig][iz], z[iz + 1], q[ig][iz + 1], atm->z[ip]);
1119 else
1120 atm->q[ig][ip] = 0;
1121
1122 /* Set CO2... */
1123 if (ctl->ig_co2 >= 0)
1124 atm->q[ctl->ig_co2][ip] = CO2_FIT(atm->time[ip]);
1125
1126 /* Set N2... */
1127 if (ctl->ig_n2 >= 0)
1128 atm->q[ctl->ig_n2][ip] = N2;
1129
1130 /* Set O2... */
1131 if (ctl->ig_o2 >= 0)
1132 atm->q[ctl->ig_o2][ip] = O2;
1133
1134 /* Set extinction to zero... */
1135 for (int iw = 0; iw < ctl->nw; iw++)
1136 atm->k[iw][ip] = 0;
1137
1138 /* Set cloud layer... */
1139 atm->clz = atm->cldz = 0;
1140 for (int icl = 0; icl < ctl->ncl; icl++)
1141 atm->clk[icl] = 0;
1142
1143 /* Set surface... */
1144 atm->sft = 0;
1145 for (int isf = 0; isf < ctl->nsf; isf++)
1146 atm->sfeps[isf] = 1;
1147 }
1148}
1149
1150/*****************************************************************************/
1151
1152double cos_sza(
1153 const double sec,
1154 const double lon,
1155 const double lat) {
1156
1157 /* Number of days and fraction with respect to 2000-01-01T12:00Z... */
1158 const double D = sec / 86400 - 0.5;
1159
1160 /* Geocentric apparent ecliptic longitude [rad]... */
1161 const double g = DEG2RAD(357.529 + 0.98560028 * D);
1162 const double q = 280.459 + 0.98564736 * D;
1163 const double L = DEG2RAD(q + 1.915 * sin(g) + 0.020 * sin(2 * g));
1164
1165 /* Mean obliquity of the ecliptic [rad]... */
1166 const double e = DEG2RAD(23.439 - 0.00000036 * D);
1167
1168 /* Declination [rad]... */
1169 const double sindec = sin(e) * sin(L);
1170
1171 /* Right ascension [rad]... */
1172 const double ra = atan2(cos(e) * sin(L), cos(L));
1173
1174 /* Greenwich Mean Sidereal Time [h]... */
1175 const double GMST = 18.697374558 + 24.06570982441908 * D;
1176
1177 /* Local Sidereal Time [h]... */
1178 const double LST = GMST + lon / 15;
1179
1180 /* Hour angle [rad]... */
1181 const double h = LST / 12 * M_PI - ra;
1182
1183 /* Convert latitude... */
1184 const double lat_help = DEG2RAD(lat);
1185
1186 /* Return cosine of solar zenith angle... */
1187 return sin(lat_help) * sindec + cos(lat_help)
1188 * sqrt(1 - POW2(sindec)) * cos(h);
1189}
1190
1191/*****************************************************************************/
1192
1194 const gsl_vector *dx,
1195 const gsl_vector *dy,
1196 const gsl_matrix *s_a_inv,
1197 const gsl_vector *sig_eps_inv) {
1198
1199 double chisq_a, chisq_m = 0;
1200
1201 /* Get sizes... */
1202 const size_t m = dy->size;
1203 const size_t n = dx->size;
1204
1205 /* Allocate... */
1206 gsl_vector *x_aux = gsl_vector_alloc(n);
1207
1208 /* Determine normalized cost function...
1209 (chi^2 = 1/m * [dy^T * S_eps^{-1} * dy + dx^T * S_a^{-1} * dx]) */
1210 for (size_t i = 0; i < m; i++)
1211 chisq_m += POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
1212 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
1213 gsl_blas_ddot(dx, x_aux, &chisq_a);
1214
1215 /* Free... */
1216 gsl_vector_free(x_aux);
1217
1218 /* Return cost function value... */
1219 return (chisq_m + chisq_a) / (double) m;
1220}
1221
1222/*****************************************************************************/
1223
1224double ctmco2(
1225 const double nu,
1226 const double p,
1227 const double t,
1228 const double u) {
1229
1230 static const double co2296[2001] =
1231 { 9.3388e-5, 9.7711e-5, 1.0224e-4, 1.0697e-4,
1232 1.1193e-4, 1.1712e-4, 1.2255e-4, 1.2824e-4, 1.3419e-4, 1.4043e-4,
1233 1.4695e-4, 1.5378e-4, 1.6094e-4, 1.6842e-4, 1.7626e-4, 1.8447e-4,
1234 1.9307e-4, 2.0207e-4, 2.1149e-4, 2.2136e-4, 2.3169e-4, 2.4251e-4,
1235 2.5384e-4, 2.657e-4, 2.7813e-4, 2.9114e-4, 3.0477e-4, 3.1904e-4,
1236 3.3399e-4, 3.4965e-4, 3.6604e-4, 3.8322e-4, 4.0121e-4, 4.2006e-4,
1237 4.398e-4, 4.6047e-4, 4.8214e-4, 5.0483e-4, 5.286e-4, 5.535e-4,
1238 5.7959e-4, 6.0693e-4, 6.3557e-4, 6.6558e-4, 6.9702e-4, 7.2996e-4,
1239 7.6449e-4, 8.0066e-4, 8.3856e-4, 8.7829e-4, 9.1991e-4, 9.6354e-4,
1240 .0010093, .0010572, .0011074, .00116, .0012152, .001273,
1241 .0013336, .0013972, .0014638, .0015336, .0016068, .0016835,
1242 .001764, .0018483, .0019367, .0020295, .0021267, .0022286,
1243 .0023355, .0024476, .0025652, .0026885, .0028178, .0029534,
1244 .0030956, .0032448, .0034012, .0035654, .0037375, .0039181,
1245 .0041076, .0043063, .0045148, .0047336, .0049632, .005204,
1246 .0054567, .0057219, .0060002, .0062923, .0065988, .0069204,
1247 .007258, .0076123, .0079842, .0083746, .0087844, .0092146,
1248 .0096663, .01014, .010638, .011161, .01171, .012286, .012891,
1249 .013527, .014194, .014895, .015631, .016404, .017217, .01807,
1250 .018966, .019908, .020897, .021936, .023028, .024176, .025382,
1251 .026649, .027981, .02938, .030851, .032397, .034023, .035732,
1252 .037528, .039416, .041402, .04349, .045685, .047994, .050422,
1253 .052975, .055661, .058486, .061458, .064584, .067873, .071334,
1254 .074975, .078807, .082839, .087082, .091549, .096249, .1012,
1255 .10641, .11189, .11767, .12375, .13015, .13689, .14399, .15147,
1256 .15935, .16765, .17639, .18561, .19531, .20554, .21632, .22769,
1257 .23967, .25229, .2656, .27964, .29443, .31004, .3265, .34386,
1258 .36218, .3815, .40188, .42339, .44609, .47004, .49533, .52202,
1259 .5502, .57995, .61137, .64455, .6796, .71663, .75574, .79707,
1260 .84075, .88691, .9357, .98728, 1.0418, 1.0995, 1.1605, 1.225,
1261 1.2932, 1.3654, 1.4418, 1.5227, 1.6083, 1.6989, 1.7948, 1.8964,
1262 2.004, 2.118, 2.2388, 2.3668, 2.5025, 2.6463, 2.7988, 2.9606,
1263 3.1321, 3.314, 3.5071, 3.712, 3.9296, 4.1605, 4.4058, 4.6663,
1264 4.9431, 5.2374, 5.5501, 5.8818, 6.2353, 6.6114, 7.0115, 7.4372,
1265 7.8905, 8.3731, 8.8871, 9.4349, 10.019, 10.641, 11.305, 12.013,
1266 12.769, 13.576, 14.437, 15.358, 16.342, 17.39, 18.513, 19.716,
1267 21.003, 22.379, 23.854, 25.436, 27.126, 28.942, 30.89, 32.973,
1268 35.219, 37.634, 40.224, 43.021, 46.037, 49.29, 52.803, 56.447,
1269 60.418, 64.792, 69.526, 74.637, 80.182, 86.193, 92.713, 99.786,
1270 107.47, 115.84, 124.94, 134.86, 145.69, 157.49, 170.3, 184.39,
1271 199.83, 216.4, 234.55, 254.72, 276.82, 299.85, 326.16, 354.99,
1272 386.51, 416.68, 449.89, 490.12, 534.35, 578.25, 632.26, 692.61,
1273 756.43, 834.75, 924.11, 1016.9, 996.96, 1102.7, 1219.2, 1351.9,
1274 1494.3, 1654.1, 1826.5, 2027.9, 2249., 2453.8, 2714.4, 2999.4,
1275 3209.5, 3509., 3840.4, 3907.5, 4190.7, 4533.5, 4648.3, 5059.1,
1276 5561.6, 6191.4, 6820.8, 7905.9, 9362.2, 2431.3, 2211.3, 2046.8,
1277 2023.8, 1985.9, 1905.9, 1491.1, 1369.8, 1262.2, 1200.7, 887.74,
1278 820.25, 885.23, 887.21, 816.73, 1126.9, 1216.2, 1272.4, 1579.5,
1279 1634.2, 1656.3, 1657.9, 1789.5, 1670.8, 1509.5, 8474.6, 7489.2,
1280 6793.6, 6117., 5574.1, 5141.2, 5084.6, 4745.1, 4413.2, 4102.8,
1281 4024.7, 3715., 3398.6, 3100.8, 2900.4, 2629.2, 2374., 2144.7,
1282 1955.8, 1760.8, 1591.2, 1435.2, 1296.2, 1174., 1065.1, 967.76,
1283 999.48, 897.45, 809.23, 732.77, 670.26, 611.93, 560.11, 518.77,
1284 476.84, 438.8, 408.48, 380.21, 349.24, 322.71, 296.65, 272.85,
1285 251.96, 232.04, 213.88, 197.69, 182.41, 168.41, 155.79, 144.05,
1286 133.31, 123.48, 114.5, 106.21, 98.591, 91.612, 85.156, 79.204,
1287 73.719, 68.666, 63.975, 59.637, 56.35, 52.545, 49.042, 45.788,
1288 42.78, 39.992, 37.441, 35.037, 32.8, 30.744, 28.801, 26.986,
1289 25.297, 23.731, 22.258, 20.883, 19.603, 18.403, 17.295, 16.249,
1290 15.271, 14.356, 13.501, 12.701, 11.954, 11.254, 10.6, 9.9864,
1291 9.4118, 8.8745, 8.3714, 7.8997, 7.4578, 7.0446, 6.6573, 6.2949,
1292 5.9577, 5.6395, 5.3419, 5.063, 4.8037, 4.5608, 4.3452, 4.1364,
1293 3.9413, 3.7394, 3.562, 3.3932, 3.2325, 3.0789, 2.9318, 2.7898,
1294 2.6537, 2.5225, 2.3958, 2.2305, 2.1215, 2.0245, 1.9427, 1.8795,
1295 1.8336, 1.7604, 1.7016, 1.6419, 1.5282, 1.4611, 1.3443, 1.27,
1296 1.1675, 1.0824, 1.0534, .99833, .95854, .92981, .90887, .89346,
1297 .88113, .87068, .86102, .85096, .88262, .86151, .83565, .80518,
1298 .77045, .73736, .74744, .74954, .75773, .82267, .83493, .89402,
1299 .89725, .93426, .95564, .94045, .94174, .93404, .92035, .90456,
1300 .88621, .86673, .78117, .7515, .72056, .68822, .65658, .62764,
1301 .55984, .55598, .57407, .60963, .63763, .66198, .61132, .60972,
1302 .52496, .50649, .41872, .3964, .32422, .27276, .24048, .23772,
1303 .2286, .22711, .23999, .32038, .34371, .36621, .38561, .39953,
1304 .40636, .44913, .42716, .3919, .35477, .33935, .3351, .39746,
1305 .40993, .49398, .49956, .56157, .54742, .57295, .57386, .55417,
1306 .50745, .471, .43446, .39102, .34993, .31269, .27888, .24912,
1307 .22291, .19994, .17972, .16197, .14633, .13252, .12029, .10942,
1308 .099745, .091118, .083404, .076494, .070292, .064716, .059697,
1309 .055173, .051093, .047411, .044089, .041092, .038392, .035965,
1310 .033789, .031846, .030122, .028607, .02729, .026169, .025209,
1311 .024405, .023766, .023288, .022925, .022716, .022681, .022685,
1312 .022768, .023133, .023325, .023486, .024004, .024126, .024083,
1313 .023785, .024023, .023029, .021649, .021108, .019454, .017809,
1314 .017292, .016635, .017037, .018068, .018977, .018756, .017847,
1315 .016557, .016142, .014459, .012869, .012381, .010875, .0098701,
1316 .009285, .0091698, .0091701, .0096145, .010553, .01106, .012613,
1317 .014362, .015017, .016507, .017741, .01768, .017784, .0171,
1318 .016357, .016172, .017257, .018978, .020935, .021741, .023567,
1319 .025183, .025589, .026732, .027648, .028278, .028215, .02856,
1320 .029015, .029062, .028851, .028497, .027825, .027801, .026523,
1321 .02487, .022967, .022168, .020194, .018605, .017903, .018439,
1322 .019697, .020311, .020855, .020057, .018608, .016738, .015963,
1323 .013844, .011801, .011134, .0097573, .0086007, .0086226,
1324 .0083721, .0090978, .0097616, .0098426, .011317, .012853, .01447,
1325 .014657, .015771, .016351, .016079, .014829, .013431, .013185,
1326 .013207, .01448, .016176, .017971, .018265, .019526, .020455,
1327 .019797, .019802, .0194, .018176, .017505, .016197, .015339,
1328 .014401, .013213, .012203, .011186, .010236, .0093288, .0084854,
1329 .0076837, .0069375, .0062614, .0056628, .0051153, .0046015,
1330 .0041501, .003752, .0033996, .0030865, .0028077, .0025586,
1331 .0023355, .0021353, .0019553, .0017931, .0016466, .0015141,
1332 .0013941, .0012852, .0011862, .0010962, .0010142, 9.3935e-4,
1333 8.71e-4, 8.0851e-4, 7.5132e-4, 6.9894e-4, 6.5093e-4, 6.0689e-4,
1334 5.6647e-4, 5.2935e-4, 4.9525e-4, 4.6391e-4, 4.3509e-4, 4.086e-4,
1335 3.8424e-4, 3.6185e-4, 3.4126e-4, 3.2235e-4, 3.0498e-4, 2.8904e-4,
1336 2.7444e-4, 2.6106e-4, 2.4883e-4, 2.3766e-4, 2.275e-4, 2.1827e-4,
1337 2.0992e-4, 2.0239e-4, 1.9563e-4, 1.896e-4, 1.8427e-4, 1.796e-4,
1338 1.7555e-4, 1.7209e-4, 1.692e-4, 1.6687e-4, 1.6505e-4, 1.6375e-4,
1339 1.6294e-4, 1.6261e-4, 1.6274e-4, 1.6334e-4, 1.6438e-4, 1.6587e-4,
1340 1.678e-4, 1.7017e-4, 1.7297e-4, 1.762e-4, 1.7988e-4, 1.8399e-4,
1341 1.8855e-4, 1.9355e-4, 1.9902e-4, 2.0494e-4, 2.1134e-4, 2.1823e-4,
1342 2.2561e-4, 2.335e-4, 2.4192e-4, 2.5088e-4, 2.604e-4, 2.705e-4,
1343 2.8119e-4, 2.9251e-4, 3.0447e-4, 3.171e-4, 3.3042e-4, 3.4447e-4,
1344 3.5927e-4, 3.7486e-4, 3.9127e-4, 4.0854e-4, 4.267e-4, 4.4579e-4,
1345 4.6586e-4, 4.8696e-4, 5.0912e-4, 5.324e-4, 5.5685e-4, 5.8253e-4,
1346 6.0949e-4, 6.378e-4, 6.6753e-4, 6.9873e-4, 7.3149e-4, 7.6588e-4,
1347 8.0198e-4, 8.3987e-4, 8.7964e-4, 9.2139e-4, 9.6522e-4, .0010112,
1348 .0010595, .0011102, .0011634, .0012193, .001278, .0013396,
1349 .0014043, .0014722, .0015436, .0016185, .0016972, .0017799,
1350 .0018668, .001958, .0020539, .0021547, .0022606, .0023719,
1351 .002489, .002612, .0027414, .0028775, .0030206, .0031712,
1352 .0033295, .0034962, .0036716, .0038563, .0040506, .0042553,
1353 .0044709, .004698, .0049373, .0051894, .0054552, .0057354,
1354 .006031, .0063427, .0066717, .0070188, .0073854, .0077726,
1355 .0081816, .0086138, .0090709, .0095543, .010066, .010607,
1356 .011181, .011789, .012433, .013116, .013842, .014613, .015432,
1357 .016304, .017233, .018224, .019281, .020394, .021574, .022836,
1358 .024181, .025594, .027088, .028707, .030401, .032245, .034219,
1359 .036262, .038539, .040987, .043578, .04641, .04949, .052726,
1360 .056326, .0602, .064093, .068521, .073278, .077734, .083064,
1361 .088731, .093885, .1003, .1072, .11365, .12187, .13078, .13989,
1362 .15095, .16299, .17634, .19116, .20628, .22419, .24386, .26587,
1363 .28811, .31399, .34321, .36606, .39675, .42742, .44243, .47197,
1364 .49993, .49027, .51147, .52803, .48931, .49729, .5026, .43854,
1365 .441, .44766, .43414, .46151, .50029, .55247, .43855, .32115,
1366 .32607, .3431, .36119, .38029, .41179, .43996, .47144, .51853,
1367 .55362, .59122, .66338, .69877, .74001, .82923, .86907, .90361,
1368 1.0025, 1.031, 1.0559, 1.104, 1.1178, 1.1341, 1.1547, 1.351,
1369 1.4772, 1.4812, 1.4907, 1.512, 1.5442, 1.5853, 1.6358, 1.6963,
1370 1.7674, 1.8474, 1.9353, 2.0335, 2.143, 2.2592, 2.3853, 2.5217,
1371 2.6686, 2.8273, 2.9998, 3.183, 3.3868, 3.6109, 3.8564, 4.1159,
1372 4.4079, 4.7278, 5.0497, 5.3695, 5.758, 6.0834, 6.4976, 6.9312,
1373 7.38, 7.5746, 7.9833, 8.3791, 8.3956, 8.7501, 9.1067, 9.072,
1374 9.4649, 9.9112, 10.402, 10.829, 11.605, 12.54, 12.713, 10.443,
1375 10.825, 11.375, 11.955, 12.623, 13.326, 14.101, 15.041, 15.547,
1376 16.461, 17.439, 18.716, 19.84, 21.036, 22.642, 23.901, 25.244,
1377 27.03, 28.411, 29.871, 31.403, 33.147, 34.744, 36.456, 39.239,
1378 43.605, 45.162, 47.004, 49.093, 51.391, 53.946, 56.673, 59.629,
1379 63.167, 66.576, 70.254, 74.222, 78.477, 83.034, 87.914, 93.18,
1380 98.77, 104.74, 111.15, 117.95, 125.23, 133.01, 141.33, 150.21,
1381 159.71, 169.89, 180.93, 192.54, 204.99, 218.34, 232.65, 248.,
1382 264.47, 282.14, 301.13, 321.53, 343.48, 367.08, 392.5, 419.88,
1383 449.4, 481.26, 515.64, 552.79, 592.99, 636.48, 683.61, 734.65,
1384 789.99, 850.02, 915.14, 985.81, 1062.5, 1147.1, 1237.8, 1336.4,
1385 1443.2, 1558.9, 1684.2, 1819.2, 1965.2, 2122.6, 2291.7, 2470.8,
1386 2665.7, 2874.9, 3099.4, 3337.9, 3541., 3813.3, 4111.9, 4439.3,
1387 4798.9, 5196., 5639.2, 6087.5, 6657.7, 7306.7, 8040.7, 8845.5,
1388 9702.2, 10670., 11739., 12842., 14141., 15498., 17068., 18729.,
1389 20557., 22559., 25248., 27664., 30207., 32915., 35611., 38081.,
1390 40715., 43191., 41651., 42750., 43785., 44353., 44366., 44189.,
1391 43618., 42862., 41878., 35133., 35215., 36383., 39420., 44055.,
1392 44155., 45850., 46853., 39197., 38274., 29942., 28553., 21792.,
1393 21228., 17106., 14955., 18181., 19557., 21427., 23728., 26301.,
1394 28584., 30775., 32536., 33867., 40089., 39204., 37329., 34452.,
1395 31373., 33921., 34800., 36043., 44415., 45162., 52181., 50895.,
1396 54140., 50840., 50468., 48302., 44915., 40910., 36754., 32755.,
1397 29093., 25860., 22962., 20448., 18247., 16326., 14645., 13165.,
1398 11861., 10708., 9686.9, 8779.7, 7971.9, 7250.8, 6605.7, 6027.2,
1399 5507.3, 5039.1, 4616.6, 4234.8, 3889., 3575.4, 3290.5, 3031.3,
1400 2795.2, 2579.9, 2383.1, 2203.3, 2038.6, 1887.6, 1749.1, 1621.9,
1401 1505., 1397.4, 1298.3, 1207., 1122.8, 1045., 973.1, 906.64,
1402 845.16, 788.22, 735.48, 686.57, 641.21, 599.1, 559.99, 523.64,
1403 489.85, 458.42, 429.16, 401.92, 376.54, 352.88, 330.82, 310.24,
1404 291.03, 273.09, 256.34, 240.69, 226.05, 212.37, 199.57, 187.59,
1405 176.37, 165.87, 156.03, 146.82, 138.17, 130.07, 122.47, 115.34,
1406 108.65, 102.37, 96.473, 90.934, 85.73, 80.84, 76.243, 71.922,
1407 67.858, 64.034, 60.438, 57.052, 53.866, 50.866, 48.04, 45.379,
1408 42.872, 40.51, 38.285, 36.188, 34.211, 32.347, 30.588, 28.929,
1409 27.362, 25.884, 24.489, 23.171, 21.929, 20.755, 19.646, 18.599,
1410 17.61, 16.677, 15.795, 14.961, 14.174, 13.43, 12.725, 12.06,
1411 11.431, 10.834, 10.27, 9.7361, 9.2302, 8.7518, 8.2997, 7.8724,
1412 7.4674, 7.0848, 6.7226, 6.3794, 6.054, 5.745, 5.4525, 5.1752,
1413 4.9121, 4.6625, 4.4259, 4.2015, 3.9888, 3.7872, 3.5961, 3.4149,
1414 3.2431, 3.0802, 2.9257, 2.7792, 2.6402, 2.5084, 2.3834, 2.2648,
1415 2.1522, 2.0455, 1.9441, 1.848, 1.7567, 1.6701, 1.5878, 1.5097,
1416 1.4356, 1.3651, 1.2981, 1.2345, 1.174, 1.1167, 1.062, 1.0101,
1417 .96087, .91414, .86986, .82781, .78777, .74971, .71339, .67882,
1418 .64604, .61473, .58507, .55676, .52987, .5044, .48014, .45715,
1419 .43527, .41453, .3948, .37609, .35831, .34142, .32524, .30995,
1420 .29536, .28142, .26807, .25527, .24311, .23166, .22077, .21053,
1421 .20081, .19143, .18261, .17407, .16603, .15833, .15089, .14385,
1422 .13707, .13065, .12449, .11865, .11306, .10774, .10266, .097818,
1423 .093203, .088815, .084641, .080671, .076892, .073296, .069873,
1424 .066613, .06351, .060555, .05774, .055058, .052504, .050071,
1425 .047752, .045543, .043438, .041432, .039521, .037699, .035962,
1426 .034307, .032729, .031225, .029791, .028423, .02712, .025877,
1427 .024692, .023563, .022485, .021458, .020478, .019543, .018652,
1428 .017802, .016992, .016219, .015481, .014778, .014107, .013467,
1429 .012856, .012274, .011718, .011188, .010682, .0102, .0097393,
1430 .0093001, .008881, .0084812, .0080997, .0077358, .0073885,
1431 .0070571, .0067409, .0064393, .0061514, .0058768, .0056147,
1432 .0053647, .0051262, .0048987, .0046816, .0044745, .0042769,
1433 .0040884, .0039088, .0037373, .0035739, .003418, .0032693,
1434 .0031277, .0029926, .0028639, .0027413, .0026245, .0025133,
1435 .0024074, .0023066, .0022108, .0021196, .002033, .0019507,
1436 .0018726, .0017985, .0017282, .0016617, .0015988, .0015394,
1437 .0014834, .0014306, .0013811, .0013346, .0012911, .0012506,
1438 .0012131, .0011784, .0011465, .0011175, .0010912, .0010678,
1439 .0010472, .0010295, .0010147, .001003, 9.9428e-4, 9.8883e-4,
1440 9.8673e-4, 9.8821e-4, 9.9343e-4, .0010027, .0010164, .0010348,
1441 .0010586, .0010882, .0011245, .0011685, .0012145, .0012666,
1442 .0013095, .0013688, .0014048, .0014663, .0015309, .0015499,
1443 .0016144, .0016312, .001705, .0017892, .0018499, .0019715,
1444 .0021102, .0022442, .0024284, .0025893, .0027703, .0029445,
1445 .0031193, .003346, .0034552, .0036906, .0037584, .0040084,
1446 .0041934, .0044587, .0047093, .0049759, .0053421, .0055134,
1447 .0059048, .0058663, .0061036, .0063259, .0059657, .0060653,
1448 .0060972, .0055539, .0055653, .0055772, .005331, .0054953,
1449 .0055919, .0058684, .006183, .0066675, .0069808, .0075142,
1450 .0078536, .0084282, .0089454, .0094625, .0093703, .0095857,
1451 .0099283, .010063, .010521, .0097778, .0098175, .010379, .010447,
1452 .0105, .010617, .010706, .01078, .011177, .011212, .011304,
1453 .011446, .011603, .011816, .012165, .012545, .013069, .013539,
1454 .01411, .014776, .016103, .017016, .017994, .018978, .01998,
1455 .021799, .022745, .023681, .024627, .025562, .026992, .027958,
1456 .029013, .030154, .031402, .03228, .033651, .035272, .037088,
1457 .039021, .041213, .043597, .045977, .04877, .051809, .054943,
1458 .058064, .061528, .06537, .069309, .071928, .075752, .079589,
1459 .083352, .084096, .087497, .090817, .091198, .094966, .099045,
1460 .10429, .10867, .11518, .12269, .13126, .14087, .15161, .16388,
1461 .16423, .1759, .18721, .19994, .21275, .22513, .23041, .24231,
1462 .25299, .25396, .26396, .27696, .27929, .2908, .30595, .31433,
1463 .3282, .3429, .35944, .37467, .39277, .41245, .43326, .45649,
1464 .48152, .51897, .54686, .57877, .61263, .64962, .68983, .73945,
1465 .78619, .83537, .89622, .95002, 1.0067, 1.0742, 1.1355, 1.2007,
1466 1.2738, 1.347, 1.4254, 1.5094, 1.6009, 1.6976, 1.8019, 1.9148,
1467 2.0357, 2.166, 2.3066, 2.4579, 2.6208, 2.7966, 2.986, 3.188,
1468 3.4081, 3.6456, 3.9, 4.1747, 4.4712, 4.7931, 5.1359, 5.5097,
1469 5.9117, 6.3435, 6.8003, 7.3001, 7.8385, 8.3945, 9.011, 9.6869,
1470 10.392, 11.18, 12.036, 12.938, 13.944, 14.881, 16.029, 17.255,
1471 18.574, 19.945, 21.38, 22.9, 24.477, 26.128, 27.87, 29.037,
1472 30.988, 33.145, 35.506, 37.76, 40.885, 44.487, 48.505, 52.911,
1473 57.56, 61.964, 67.217, 72.26, 78.343, 85.08, 91.867, 99.435,
1474 107.68, 116.97, 127.12, 138.32, 150.26, 163.04, 174.81, 189.26,
1475 205.61, 224.68, 240.98, 261.88, 285.1, 307.58, 334.35, 363.53,
1476 394.68, 427.85, 458.85, 489.25, 472.87, 486.93, 496.27, 501.52,
1477 501.57, 497.14, 488.09, 476.32, 393.76, 388.51, 393.42, 414.45,
1478 455.12, 514.62, 520.38, 547.42, 562.6, 487.47, 480.83, 391.06,
1479 376.92, 303.7, 295.91, 256.03, 236.73, 280.38, 310.71, 335.53,
1480 367.88, 401.94, 435.52, 469.13, 497.94, 588.82, 597.94, 597.2,
1481 588.28, 571.2, 555.75, 603.56, 638.15, 680.75, 801.72, 848.01,
1482 962.15, 990.06, 1068.1, 1076.2, 1115.3, 1134.2, 1136.6, 1119.1,
1483 1108.9, 1090.6, 1068.7, 1041.9, 1005.4, 967.98, 927.08, 780.1,
1484 751.41, 733.12, 742.65, 785.56, 855.16, 852.45, 878.1, 784.59,
1485 777.81, 765.13, 622.93, 498.09, 474.89, 386.9, 378.48, 336.17,
1486 322.04, 329.57, 350.5, 383.38, 420.02, 462.39, 499.71, 531.98,
1487 654.99, 653.43, 639.99, 605.16, 554.16, 504.42, 540.64, 552.33,
1488 679.46, 699.51, 713.91, 832.17, 919.91, 884.96, 907.57, 846.56,
1489 818.56, 768.93, 706.71, 642.17, 575.95, 515.38, 459.07, 409.02,
1490 364.61, 325.46, 291.1, 260.89, 234.39, 211.01, 190.38, 172.11,
1491 155.91, 141.49, 128.63, 117.13, 106.84, 97.584, 89.262, 81.756,
1492 74.975, 68.842, 63.28, 58.232, 53.641, 49.46, 45.649, 42.168,
1493 38.991, 36.078, 33.409, 30.96, 28.71, 26.642, 24.737, 22.985,
1494 21.37, 19.882, 18.512, 17.242, 16.073, 14.987, 13.984, 13.05,
1495 12.186, 11.384, 10.637, 9.9436, 9.2988, 8.6991, 8.141, 7.6215,
1496 7.1378, 6.6872, 6.2671, 5.8754, 5.51, 5.1691, 4.851, 4.5539,
1497 4.2764, 4.0169, 3.7742, 3.5472, 3.3348, 3.1359, 2.9495, 2.7749,
1498 2.6113, 2.4578, 2.3139, 2.1789, 2.0523, 1.9334, 1.8219, 1.7171,
1499 1.6188, 1.5263, 1.4395, 1.3579, 1.2812, 1.209, 1.1411, 1.0773,
1500 1.0171, .96048, .90713, .85684, .80959, .76495, .72282, .68309,
1501 .64563, .61035, .57707, .54573, .51622, .48834, .46199, .43709,
1502 .41359, .39129, .37034, .35064, .33198, .31442, .29784, .28218,
1503 .26732, .25337, .24017, .22774, .21601, .20479, .19426
1504 };
1505
1506 static const double co2260[2001] =
1507 { 5.7971e-5, 6.0733e-5, 6.3628e-5, 6.6662e-5,
1508 6.9843e-5, 7.3176e-5, 7.6671e-5, 8.0334e-5, 8.4175e-5, 8.8201e-5,
1509 9.2421e-5, 9.6846e-5, 1.0149e-4, 1.0635e-4, 1.1145e-4, 1.1679e-4,
1510 1.224e-4, 1.2828e-4, 1.3444e-4, 1.409e-4, 1.4768e-4, 1.5479e-4,
1511 1.6224e-4, 1.7006e-4, 1.7826e-4, 1.8685e-4, 1.9587e-4, 2.0532e-4,
1512 2.1524e-4, 2.2565e-4, 2.3656e-4, 2.48e-4, 2.6001e-4, 2.7261e-4,
1513 2.8582e-4, 2.9968e-4, 3.1422e-4, 3.2948e-4, 3.4548e-4, 3.6228e-4,
1514 3.799e-4, 3.9838e-4, 4.1778e-4, 4.3814e-4, 4.595e-4, 4.8191e-4,
1515 5.0543e-4, 5.3012e-4, 5.5603e-4, 5.8321e-4, 6.1175e-4, 6.417e-4,
1516 6.7314e-4, 7.0614e-4, 7.4078e-4, 7.7714e-4, 8.1531e-4, 8.5538e-4,
1517 8.9745e-4, 9.4162e-4, 9.8798e-4, .0010367, .0010878, .0011415,
1518 .0011978, .001257, .0013191, .0013844, .001453, .0015249,
1519 .0016006, .00168, .0017634, .001851, .001943, .0020397, .0021412,
1520 .0022479, .00236, .0024778, .0026015, .0027316, .0028682,
1521 .0030117, .0031626, .0033211, .0034877, .0036628, .0038469,
1522 .0040403, .0042436, .0044574, .004682, .0049182, .0051665,
1523 .0054276, .0057021, .0059907, .0062942, .0066133, .0069489,
1524 .0073018, .0076729, .0080632, .0084738, .0089056, .0093599,
1525 .0098377, .01034, .010869, .011426, .012011, .012627, .013276,
1526 .013958, .014676, .015431, .016226, .017063, .017944, .018872,
1527 .019848, .020876, .021958, .023098, .024298, .025561, .026892,
1528 .028293, .029769, .031323, .032961, .034686, .036503, .038418,
1529 .040435, .042561, .044801, .047161, .049649, .052271, .055035,
1530 .057948, .061019, .064256, .06767, .07127, .075066, .079069,
1531 .083291, .087744, .092441, .097396, .10262, .10814, .11396,
1532 .1201, .12658, .13342, .14064, .14826, .1563, .1648, .17376,
1533 .18323, .19324, .2038, .21496, .22674, .23919, .25234, .26624,
1534 .28093, .29646, .31287, .33021, .34855, .36794, .38844, .41012,
1535 .43305, .45731, .48297, .51011, .53884, .56924, .60141, .63547,
1536 .67152, .70969, .75012, .79292, .83826, .8863, .93718, .99111,
1537 1.0482, 1.1088, 1.173, 1.2411, 1.3133, 1.3898, 1.471, 1.5571,
1538 1.6485, 1.7455, 1.8485, 1.9577, 2.0737, 2.197, 2.3278, 2.4668,
1539 2.6145, 2.7715, 2.9383, 3.1156, 3.3042, 3.5047, 3.7181, 3.9451,
1540 4.1866, 4.4437, 4.7174, 5.0089, 5.3192, 5.65, 6.0025, 6.3782,
1541 6.7787, 7.206, 7.6617, 8.1479, 8.6669, 9.221, 9.8128, 10.445,
1542 11.12, 11.843, 12.615, 13.441, 14.325, 15.271, 16.283, 17.367,
1543 18.529, 19.776, 21.111, 22.544, 24.082, 25.731, 27.504, 29.409,
1544 31.452, 33.654, 36.024, 38.573, 41.323, 44.29, 47.492, 50.951,
1545 54.608, 58.588, 62.929, 67.629, 72.712, 78.226, 84.207, 90.699,
1546 97.749, 105.42, 113.77, 122.86, 132.78, 143.61, 155.44, 168.33,
1547 182.48, 198.01, 214.87, 233.39, 253.86, 276.34, 300.3, 327.28,
1548 356.89, 389.48, 422.29, 458.99, 501.39, 548.13, 595.62, 652.74,
1549 716.54, 784.57, 866.78, 960.59, 1062.8, 1072.5, 1189.5, 1319.4,
1550 1467.6, 1630.2, 1813.7, 2016.9, 2253., 2515.3, 2773.5, 3092.8,
1551 3444.4, 3720.4, 4104.3, 4527.5, 4645.9, 5021.7, 5462.2, 5597.,
1552 6110.6, 6732.5, 7513.8, 8270.6, 9640.6, 11487., 2796.1, 2680.1,
1553 2441.6, 2404.2, 2334.8, 2215.2, 1642.5, 1477.9, 1328.1, 1223.5,
1554 843.34, 766.96, 831.65, 834.84, 774.85, 1156.3, 1275.6, 1366.1,
1555 1795.6, 1885., 1936.5, 1953.4, 2154.4, 2002.7, 1789.8, 10381.,
1556 9040., 8216.5, 7384.7, 6721.9, 6187.7, 6143.8, 5703.9, 5276.6,
1557 4873.1, 4736., 4325.3, 3927., 3554.1, 3286.1, 2950.1, 2642.4,
1558 2368.7, 2138.9, 1914., 1719.6, 1543.9, 1388.6, 1252.1, 1132.2,
1559 1024.1, 1025.4, 920.58, 829.59, 750.54, 685.01, 624.25, 570.14,
1560 525.81, 481.85, 441.95, 408.71, 377.23, 345.86, 318.51, 292.26,
1561 268.34, 247.04, 227.14, 209.02, 192.69, 177.59, 163.78, 151.26,
1562 139.73, 129.19, 119.53, 110.7, 102.57, 95.109, 88.264, 81.948,
1563 76.13, 70.768, 65.827, 61.251, 57.022, 53.495, 49.824, 46.443,
1564 43.307, 40.405, 37.716, 35.241, 32.923, 30.77, 28.78, 26.915,
1565 25.177, 23.56, 22.059, 20.654, 19.345, 18.126, 16.988, 15.93,
1566 14.939, 14.014, 13.149, 12.343, 11.589, 10.884, 10.225, 9.6093,
1567 9.0327, 8.4934, 7.9889, 7.5166, 7.0744, 6.6604, 6.2727, 5.9098,
1568 5.5701, 5.2529, 4.955, 4.676, 4.4148, 4.171, 3.9426, 3.7332,
1569 3.5347, 3.3493, 3.1677, 3.0025, 2.8466, 2.6994, 2.5601, 2.4277,
1570 2.3016, 2.1814, 2.0664, 1.9564, 1.8279, 1.7311, 1.6427, 1.5645,
1571 1.4982, 1.443, 1.374, 1.3146, 1.2562, 1.17, 1.1105, 1.0272,
1572 .96863, .89718, .83654, .80226, .75908, .72431, .69573, .67174,
1573 .65126, .63315, .61693, .60182, .58715, .59554, .57649, .55526,
1574 .53177, .50622, .48176, .4813, .47642, .47492, .50273, .50293,
1575 .52687, .52239, .53419, .53814, .52626, .52211, .51492, .50622,
1576 .49746, .48841, .4792, .43534, .41999, .40349, .38586, .36799,
1577 .35108, .31089, .30803, .3171, .33599, .35041, .36149, .32924,
1578 .32462, .27309, .25961, .20922, .19504, .15683, .13098, .11588,
1579 .11478, .11204, .11363, .12135, .16423, .17785, .19094, .20236,
1580 .21084, .2154, .24108, .22848, .20871, .18797, .17963, .17834,
1581 .21552, .22284, .26945, .27052, .30108, .28977, .29772, .29224,
1582 .27658, .24956, .22777, .20654, .18392, .16338, .1452, .12916,
1583 .1152, .10304, .092437, .083163, .075031, .067878, .061564,
1584 .055976, .051018, .046609, .042679, .03917, .036032, .033223,
1585 .030706, .02845, .026428, .024617, .022998, .021554, .02027,
1586 .019136, .018141, .017278, .016541, .015926, .015432, .015058,
1587 .014807, .014666, .014635, .014728, .014947, .01527, .015728,
1588 .016345, .017026, .017798, .018839, .019752, .020636, .021886,
1589 .022695, .02327, .023478, .024292, .023544, .022222, .021932,
1590 .020052, .018143, .017722, .017031, .017782, .01938, .020734,
1591 .020476, .019255, .017477, .016878, .014617, .012489, .011765,
1592 .0099077, .0086446, .0079446, .0078644, .0079763, .008671,
1593 .01001, .0108, .012933, .015349, .016341, .018484, .020254,
1594 .020254, .020478, .019591, .018595, .018385, .019913, .022254,
1595 .024847, .025809, .028053, .029924, .030212, .031367, .03222,
1596 .032739, .032537, .03286, .033344, .033507, .033499, .033339,
1597 .032809, .033041, .031723, .029837, .027511, .026603, .024032,
1598 .021914, .020948, .021701, .023425, .024259, .024987, .023818,
1599 .021768, .019223, .018144, .015282, .012604, .01163, .0097907,
1600 .008336, .0082473, .0079582, .0088077, .009779, .010129, .012145,
1601 .014378, .016761, .01726, .018997, .019998, .019809, .01819,
1602 .016358, .016099, .01617, .017939, .020223, .022521, .02277,
1603 .024279, .025247, .024222, .023989, .023224, .021493, .020362,
1604 .018596, .017309, .015975, .014466, .013171, .011921, .01078,
1605 .0097229, .0087612, .0078729, .0070682, .0063494, .0057156,
1606 .0051459, .0046273, .0041712, .0037686, .0034119, .003095,
1607 .0028126, .0025603, .0023342, .0021314, .0019489, .0017845,
1608 .001636, .0015017, .00138, .0012697, .0011694, .0010782,
1609 9.9507e-4, 9.1931e-4, 8.5013e-4, 7.869e-4, 7.2907e-4, 6.7611e-4,
1610 6.2758e-4, 5.8308e-4, 5.4223e-4, 5.0473e-4, 4.7027e-4, 4.3859e-4,
1611 4.0946e-4, 3.8265e-4, 3.5798e-4, 3.3526e-4, 3.1436e-4, 2.9511e-4,
1612 2.7739e-4, 2.6109e-4, 2.4609e-4, 2.3229e-4, 2.1961e-4, 2.0797e-4,
1613 1.9729e-4, 1.875e-4, 1.7855e-4, 1.7038e-4, 1.6294e-4, 1.5619e-4,
1614 1.5007e-4, 1.4456e-4, 1.3961e-4, 1.3521e-4, 1.3131e-4, 1.2789e-4,
1615 1.2494e-4, 1.2242e-4, 1.2032e-4, 1.1863e-4, 1.1733e-4, 1.1641e-4,
1616 1.1585e-4, 1.1565e-4, 1.158e-4, 1.1629e-4, 1.1712e-4, 1.1827e-4,
1617 1.1976e-4, 1.2158e-4, 1.2373e-4, 1.262e-4, 1.2901e-4, 1.3214e-4,
1618 1.3562e-4, 1.3944e-4, 1.4361e-4, 1.4814e-4, 1.5303e-4, 1.5829e-4,
1619 1.6394e-4, 1.6999e-4, 1.7644e-4, 1.8332e-4, 1.9063e-4, 1.984e-4,
1620 2.0663e-4, 2.1536e-4, 2.246e-4, 2.3436e-4, 2.4468e-4, 2.5558e-4,
1621 2.6708e-4, 2.7921e-4, 2.92e-4, 3.0548e-4, 3.1968e-4, 3.3464e-4,
1622 3.5039e-4, 3.6698e-4, 3.8443e-4, 4.0281e-4, 4.2214e-4, 4.4248e-4,
1623 4.6389e-4, 4.864e-4, 5.1009e-4, 5.3501e-4, 5.6123e-4, 5.888e-4,
1624 6.1781e-4, 6.4833e-4, 6.8043e-4, 7.142e-4, 7.4973e-4, 7.8711e-4,
1625 8.2644e-4, 8.6783e-4, 9.1137e-4, 9.5721e-4, .0010054, .0010562,
1626 .0011096, .0011659, .0012251, .0012875, .0013532, .0014224,
1627 .0014953, .001572, .0016529, .0017381, .0018279, .0019226,
1628 .0020224, .0021277, .0022386, .0023557, .0024792, .0026095,
1629 .002747, .0028921, .0030453, .0032071, .003378, .0035586,
1630 .0037494, .003951, .0041642, .0043897, .0046282, .0048805,
1631 .0051476, .0054304, .00573, .0060473, .0063837, .0067404,
1632 .0071188, .0075203, .0079466, .0083994, .0088806, .0093922,
1633 .0099366, .010516, .011134, .011792, .012494, .013244, .014046,
1634 .014898, .015808, .016781, .017822, .018929, .020108, .02138,
1635 .022729, .02419, .02576, .027412, .029233, .031198, .033301,
1636 .035594, .038092, .040767, .04372, .046918, .050246, .053974,
1637 .058009, .061976, .066586, .071537, .076209, .081856, .087998,
1638 .093821, .10113, .10913, .11731, .12724, .13821, .15025, .1639,
1639 .17807, .19472, .21356, .23496, .25758, .28387, .31389, .34104,
1640 .37469, .40989, .43309, .46845, .5042, .5023, .52981, .55275,
1641 .51075, .51976, .52457, .44779, .44721, .4503, .4243, .45244,
1642 .49491, .55399, .39021, .24802, .2501, .2618, .27475, .28879,
1643 .31317, .33643, .36257, .4018, .43275, .46525, .53333, .56599,
1644 .60557, .70142, .74194, .77736, .88567, .91182, .93294, .98407,
1645 .98772, .99176, .9995, 1.2405, 1.3602, 1.338, 1.3255, 1.3267,
1646 1.3404, 1.3634, 1.3967, 1.4407, 1.4961, 1.5603, 1.6328, 1.7153,
1647 1.8094, 1.9091, 2.018, 2.1367, 2.264, 2.4035, 2.5562, 2.7179,
1648 2.9017, 3.1052, 3.3304, 3.5731, 3.8488, 4.1553, 4.4769, 4.7818,
1649 5.1711, 5.5204, 5.9516, 6.4097, 6.8899, 7.1118, 7.5469, 7.9735,
1650 7.9511, 8.3014, 8.6418, 8.4757, 8.8256, 9.2294, 9.6923, 10.033,
1651 10.842, 11.851, 11.78, 8.8435, 9.1381, 9.5956, 10.076, 10.629,
1652 11.22, 11.883, 12.69, 13.163, 13.974, 14.846, 16.027, 17.053,
1653 18.148, 19.715, 20.907, 22.163, 23.956, 25.235, 26.566, 27.94,
1654 29.576, 30.956, 32.432, 35.337, 39.911, 41.128, 42.625, 44.386,
1655 46.369, 48.619, 51.031, 53.674, 56.825, 59.921, 63.286, 66.929,
1656 70.859, 75.081, 79.618, 84.513, 89.739, 95.335, 101.35, 107.76,
1657 114.63, 121.98, 129.87, 138.3, 147.34, 157.04, 167.56, 178.67,
1658 190.61, 203.43, 217.19, 231.99, 247.88, 264.98, 283.37, 303.17,
1659 324.49, 347.47, 372.25, 398.98, 427.85, 459.06, 492.8, 529.31,
1660 568.89, 611.79, 658.35, 708.91, 763.87, 823.65, 888.72, 959.58,
1661 1036.8, 1121.8, 1213.9, 1314.3, 1423.8, 1543., 1672.8, 1813.4,
1662 1966.1, 2131.4, 2309.5, 2499.3, 2705., 2925.7, 3161.6, 3411.3,
1663 3611.5, 3889.2, 4191.1, 4519.3, 4877.9, 5272.9, 5712.9, 6142.7,
1664 6719.6, 7385., 8145., 8977.7, 9831.9, 10827., 11934., 13063.,
1665 14434., 15878., 17591., 19435., 21510., 23835., 26835., 29740.,
1666 32878., 36305., 39830., 43273., 46931., 50499., 49586., 51598.,
1667 53429., 54619., 55081., 55102., 54485., 53487., 52042., 42689.,
1668 42607., 44020., 47994., 54169., 53916., 55808., 56642., 46049.,
1669 44243., 32929., 30658., 21963., 20835., 15962., 13679., 17652.,
1670 19680., 22388., 25625., 29184., 32520., 35720., 38414., 40523.,
1671 49228., 48173., 45678., 41768., 37600., 41313., 42654., 44465.,
1672 55736., 56630., 65409., 63308., 66572., 61845., 60379., 56777.,
1673 51920., 46601., 41367., 36529., 32219., 28470., 25192., 22362.,
1674 19907., 17772., 15907., 14273., 12835., 11567., 10445., 9450.2,
1675 8565.1, 7776., 7070.8, 6439.2, 5872.3, 5362.4, 4903., 4488.3,
1676 4113.4, 3773.8, 3465.8, 3186.1, 2931.7, 2700.1, 2488.8, 2296.,
1677 2119.8, 1958.6, 1810.9, 1675.6, 1551.4, 1437.3, 1332.4, 1236.,
1678 1147.2, 1065.3, 989.86, 920.22, 855.91, 796.48, 741.53, 690.69,
1679 643.62, 600.02, 559.6, 522.13, 487.35, 455.06, 425.08, 397.21,
1680 371.3, 347.2, 324.78, 303.9, 284.46, 266.34, 249.45, 233.7,
1681 219.01, 205.3, 192.5, 180.55, 169.38, 158.95, 149.2, 140.07,
1682 131.54, 123.56, 116.09, 109.09, 102.54, 96.405, 90.655, 85.266,
1683 80.213, 75.475, 71.031, 66.861, 62.948, 59.275, 55.827, 52.587,
1684 49.544, 46.686, 43.998, 41.473, 39.099, 36.867, 34.768, 32.795,
1685 30.939, 29.192, 27.546, 25.998, 24.539, 23.164, 21.869, 20.65,
1686 19.501, 18.419, 17.399, 16.438, 15.532, 14.678, 13.874, 13.115,
1687 12.4, 11.726, 11.088, 10.488, 9.921, 9.3846, 8.8784, 8.3996,
1688 7.9469, 7.5197, 7.1174, 6.738, 6.379, 6.0409, 5.7213, 5.419,
1689 5.1327, 4.8611, 4.6046, 4.3617, 4.1316, 3.9138, 3.7077, 3.5125,
1690 3.3281, 3.1536, 2.9885, 2.8323, 2.6846, 2.5447, 2.4124, 2.2871,
1691 2.1686, 2.0564, 1.9501, 1.8495, 1.7543, 1.6641, 1.5787, 1.4978,
1692 1.4212, 1.3486, 1.2799, 1.2147, 1.1529, 1.0943, 1.0388, .98602,
1693 .93596, .8886, .84352, .80078, .76029, .722, .68585, .65161,
1694 .61901, .58808, .55854, .53044, .5039, .47853, .45459, .43173,
1695 .41008, .38965, .37021, .35186, .33444, .31797, .30234, .28758,
1696 .2736, .26036, .24764, .2357, .22431, .21342, .20295, .19288,
1697 .18334, .17444, .166, .15815, .15072, .14348, .13674, .13015,
1698 .12399, .11807, .11231, .10689, .10164, .096696, .091955,
1699 .087476, .083183, .079113, .075229, .071536, .068026, .064698,
1700 .06154, .058544, .055699, .052997, .050431, .047993, .045676,
1701 .043475, .041382, .039392, .037501, .035702, .033991, .032364,
1702 .030817, .029345, .027945, .026613, .025345, .024139, .022991,
1703 .021899, .02086, .019871, .018929, .018033, .01718, .016368,
1704 .015595, .014859, .014158, .013491, .012856, .012251, .011675,
1705 .011126, .010604, .010107, .0096331, .009182, .0087523, .0083431,
1706 .0079533, .0075821, .0072284, .0068915, .0065706, .0062649,
1707 .0059737, .0056963, .005432, .0051802, .0049404, .0047118,
1708 .0044941, .0042867, .0040891, .0039009, .0037216, .0035507,
1709 .003388, .0032329, .0030852, .0029445, .0028105, .0026829,
1710 .0025613, .0024455, .0023353, .0022303, .0021304, .0020353,
1711 .0019448, .0018587, .0017767, .0016988, .0016247, .0015543,
1712 .0014874, .0014238, .0013635, .0013062, .0012519, .0012005,
1713 .0011517, .0011057, .0010621, .001021, 9.8233e-4, 9.4589e-4,
1714 9.1167e-4, 8.7961e-4, 8.4964e-4, 8.2173e-4, 7.9582e-4, 7.7189e-4,
1715 7.499e-4, 7.2983e-4, 7.1167e-4, 6.9542e-4, 6.8108e-4, 6.6866e-4,
1716 6.5819e-4, 6.4971e-4, 6.4328e-4, 6.3895e-4, 6.3681e-4, 6.3697e-4,
1717 6.3956e-4, 6.4472e-4, 6.5266e-4, 6.6359e-4, 6.778e-4, 6.9563e-4,
1718 7.1749e-4, 7.4392e-4, 7.7556e-4, 8.1028e-4, 8.4994e-4, 8.8709e-4,
1719 9.3413e-4, 9.6953e-4, .0010202, .0010738, .0010976, .0011507,
1720 .0011686, .0012264, .001291, .0013346, .0014246, .0015293,
1721 .0016359, .0017824, .0019255, .0020854, .002247, .0024148,
1722 .0026199, .0027523, .0029704, .0030702, .0033047, .0035013,
1723 .0037576, .0040275, .0043089, .0046927, .0049307, .0053486,
1724 .0053809, .0056699, .0059325, .0055488, .005634, .0056392,
1725 .004946, .0048855, .0048208, .0044386, .0045498, .0046377,
1726 .0048939, .0052396, .0057324, .0060859, .0066906, .0071148,
1727 .0077224, .0082687, .008769, .0084471, .008572, .0087729,
1728 .008775, .0090742, .0080704, .0080288, .0085747, .0086087,
1729 .0086408, .0088752, .0089381, .0089757, .0093532, .0092824,
1730 .0092566, .0092645, .0092735, .009342, .0095806, .0097991,
1731 .010213, .010611, .011129, .011756, .013237, .01412, .015034,
1732 .015936, .01682, .018597, .019315, .019995, .020658, .021289,
1733 .022363, .022996, .023716, .024512, .025434, .026067, .027118,
1734 .028396, .029865, .031442, .033253, .03525, .037296, .039701,
1735 .042356, .045154, .048059, .051294, .054893, .058636, .061407,
1736 .065172, .068974, .072676, .073379, .076547, .079556, .079134,
1737 .082308, .085739, .090192, .09359, .099599, .10669, .11496,
1738 .1244, .13512, .14752, .14494, .15647, .1668, .17863, .19029,
1739 .20124, .20254, .21179, .21982, .21625, .22364, .23405, .23382,
1740 .2434, .25708, .26406, .27621, .28909, .30395, .31717, .33271,
1741 .3496, .36765, .38774, .40949, .446, .46985, .49846, .5287, .562,
1742 .59841, .64598, .68834, .7327, .78978, .8373, .88708, .94744,
1743 1.0006, 1.0574, 1.1215, 1.1856, 1.2546, 1.3292, 1.4107, 1.4974,
1744 1.5913, 1.6931, 1.8028, 1.9212, 2.0492, 2.1874, 2.3365, 2.4978,
1745 2.6718, 2.8588, 3.062, 3.2818, 3.5188, 3.7752, 4.0527, 4.3542,
1746 4.6782, 5.0312, 5.4123, 5.8246, 6.2639, 6.7435, 7.2636, 7.8064,
1747 8.4091, 9.0696, 9.7677, 10.548, 11.4, 12.309, 13.324, 14.284,
1748 15.445, 16.687, 18.019, 19.403, 20.847, 22.366, 23.925, 25.537,
1749 27.213, 28.069, 29.864, 31.829, 33.988, 35.856, 38.829, 42.321,
1750 46.319, 50.606, 55.126, 59.126, 64.162, 68.708, 74.615, 81.176,
1751 87.739, 95.494, 103.83, 113.38, 123.99, 135.8, 148.7, 162.58,
1752 176.32, 192.6, 211.47, 232.7, 252.64, 277.41, 305.38, 333.44,
1753 366.42, 402.66, 442.14, 484.53, 526.42, 568.15, 558.78, 582.6,
1754 600.98, 613.94, 619.44, 618.24, 609.84, 595.96, 484.86, 475.59,
1755 478.49, 501.56, 552.19, 628.44, 630.39, 658.92, 671.96, 562.7,
1756 545.88, 423.43, 400.14, 306.59, 294.13, 246.8, 226.51, 278.21,
1757 314.39, 347.22, 389.13, 433.16, 477.48, 521.67, 560.54, 683.6,
1758 696.37, 695.91, 683.1, 658.24, 634.89, 698.85, 742.87, 796.66,
1759 954.49, 1009.5, 1150.5, 1179.1, 1267.9, 1272.4, 1312.7, 1330.4,
1760 1331.6, 1315.8, 1308.3, 1293.3, 1274.6, 1249.5, 1213.2, 1172.1,
1761 1124.4, 930.33, 893.36, 871.27, 883.54, 940.76, 1036., 1025.6,
1762 1053.1, 914.51, 894.15, 865.03, 670.63, 508.41, 475.15, 370.85,
1763 361.06, 319.38, 312.75, 331.87, 367.13, 415., 467.94, 525.49,
1764 578.41, 624.66, 794.82, 796.97, 780.29, 736.49, 670.18, 603.75,
1765 659.67, 679.8, 857.12, 884.05, 900.65, 1046.1, 1141.9, 1083.,
1766 1089.2, 1e3, 947.08, 872.31, 787.91, 704.75, 624.93, 553.68,
1767 489.91, 434.21, 385.64, 343.3, 306.42, 274.18, 245.94, 221.11,
1768 199.23, 179.88, 162.73, 147.48, 133.88, 121.73, 110.86, 101.1,
1769 92.323, 84.417, 77.281, 70.831, 64.991, 59.694, 54.884, 50.509,
1770 46.526, 42.893, 39.58, 36.549, 33.776, 31.236, 28.907, 26.77,
1771 24.805, 23., 21.339, 19.81, 18.404, 17.105, 15.909, 14.801,
1772 13.778, 12.83, 11.954, 11.142, 10.389, 9.691, 9.0434, 8.4423,
1773 7.8842, 7.3657, 6.8838, 6.4357, 6.0189, 5.6308, 5.2696, 4.9332,
1774 4.6198, 4.3277, 4.0553, 3.8012, 3.5639, 3.3424, 3.1355, 2.9422,
1775 2.7614, 2.5924, 2.4343, 2.2864, 2.148, 2.0184, 1.8971, 1.7835,
1776 1.677, 1.5773, 1.4838, 1.3961, 1.3139, 1.2369, 1.1645, 1.0966,
1777 1.0329, .97309, .91686, .86406, .81439, .76767, .72381, .68252,
1778 .64359, .60695, .57247, .54008, .50957, .48092, .45401, .42862,
1779 .40465, .38202, .36072, .34052, .3216, .30386, .28711, .27135,
1780 .25651, .24252, .2293, .21689, .20517, .19416, .18381, .17396,
1781 .16469
1782 };
1783
1784 static const double co2230[2001] =
1785 { 2.743e-5, 2.8815e-5, 3.027e-5, 3.1798e-5,
1786 3.3405e-5, 3.5094e-5, 3.6869e-5, 3.8734e-5, 4.0694e-5, 4.2754e-5,
1787 4.492e-5, 4.7196e-5, 4.9588e-5, 5.2103e-5, 5.4747e-5, 5.7525e-5,
1788 6.0446e-5, 6.3516e-5, 6.6744e-5, 7.0137e-5, 7.3704e-5, 7.7455e-5,
1789 8.1397e-5, 8.5543e-5, 8.9901e-5, 9.4484e-5, 9.9302e-5, 1.0437e-4,
1790 1.097e-4, 1.153e-4, 1.2119e-4, 1.2738e-4, 1.3389e-4, 1.4074e-4,
1791 1.4795e-4, 1.5552e-4, 1.6349e-4, 1.7187e-4, 1.8068e-4, 1.8995e-4,
1792 1.997e-4, 2.0996e-4, 2.2075e-4, 2.321e-4, 2.4403e-4, 2.5659e-4,
1793 2.698e-4, 2.837e-4, 2.9832e-4, 3.137e-4, 3.2988e-4, 3.4691e-4,
1794 3.6483e-4, 3.8368e-4, 4.0351e-4, 4.2439e-4, 4.4635e-4, 4.6947e-4,
1795 4.9379e-4, 5.1939e-4, 5.4633e-4, 5.7468e-4, 6.0452e-4, 6.3593e-4,
1796 6.69e-4, 7.038e-4, 7.4043e-4, 7.79e-4, 8.1959e-4, 8.6233e-4,
1797 9.0732e-4, 9.5469e-4, .0010046, .0010571, .0011124, .0011706,
1798 .0012319, .0012964, .0013644, .001436, .0015114, .0015908,
1799 .0016745, .0017625, .0018553, .0019531, .002056, .0021645,
1800 .0022788, .0023992, .002526, .0026596, .0028004, .0029488,
1801 .0031052, .0032699, .0034436, .0036265, .0038194, .0040227,
1802 .0042369, .0044628, .0047008, .0049518, .0052164, .0054953,
1803 .0057894, .0060995, .0064265, .0067713, .007135, .0075184,
1804 .0079228, .0083494, .0087993, .0092738, .0097745, .010303,
1805 .01086, .011448, .012068, .012722, .013413, .014142, .014911,
1806 .015723, .01658, .017484, .018439, .019447, .020511, .021635,
1807 .022821, .024074, .025397, .026794, .02827, .029829, .031475,
1808 .033215, .035052, .036994, .039045, .041213, .043504, .045926,
1809 .048485, .05119, .05405, .057074, .060271, .063651, .067225,
1810 .071006, .075004, .079233, .083708, .088441, .093449, .098749,
1811 .10436, .11029, .11657, .12322, .13026, .13772, .14561, .15397,
1812 .16282, .1722, .18214, .19266, .20381, .21563, .22816, .24143,
1813 .2555, .27043, .28625, .30303, .32082, .3397, .35972, .38097,
1814 .40352, .42746, .45286, .47983, .50847, .53888, .57119, .6055,
1815 .64196, .6807, .72187, .76564, .81217, .86165, .91427, .97025,
1816 1.0298, 1.0932, 1.1606, 1.2324, 1.3088, 1.3902, 1.477, 1.5693,
1817 1.6678, 1.7727, 1.8845, 2.0038, 2.131, 2.2666, 2.4114, 2.5659,
1818 2.7309, 2.907, 3.0951, 3.2961, 3.5109, 3.7405, 3.986, 4.2485,
1819 4.5293, 4.8299, 5.1516, 5.4961, 5.8651, 6.2605, 6.6842, 7.1385,
1820 7.6256, 8.1481, 8.7089, 9.3109, 9.9573, 10.652, 11.398, 12.2,
1821 13.063, 13.992, 14.99, 16.064, 17.222, 18.469, 19.813, 21.263,
1822 22.828, 24.516, 26.34, 28.31, 30.437, 32.738, 35.226, 37.914,
1823 40.824, 43.974, 47.377, 51.061, 55.011, 59.299, 63.961, 69.013,
1824 74.492, 80.444, 86.919, 93.836, 101.23, 109.25, 117.98, 127.47,
1825 137.81, 149.07, 161.35, 174.75, 189.42, 205.49, 223.02, 242.26,
1826 263.45, 286.75, 311.94, 340.01, 370.86, 404.92, 440.44, 480.27,
1827 525.17, 574.71, 626.22, 686.8, 754.38, 827.07, 913.38, 1011.7,
1828 1121.5, 1161.6, 1289.5, 1432.2, 1595.4, 1777., 1983.3, 2216.1,
1829 2485.7, 2788.3, 3101.5, 3481., 3902.1, 4257.1, 4740., 5272.8,
1830 5457.9, 5946.2, 6505.3, 6668.4, 7302.4, 8061.6, 9015.8, 9908.3,
1831 11613., 13956., 3249.6, 3243., 2901.5, 2841.3, 2729.6, 2558.2,
1832 1797.8, 1583.2, 1386., 1233.5, 787.74, 701.46, 761.66, 767.21,
1833 722.83, 1180.6, 1332.1, 1461.6, 2032.9, 2166., 2255.9, 2294.7,
1834 2587.2, 2396.5, 2122.4, 12553., 10784., 9832.5, 8827.3, 8029.1,
1835 7377.9, 7347.1, 6783.8, 6239.1, 5721.1, 5503., 4975.1, 4477.8,
1836 4021.3, 3676.8, 3275.3, 2914.9, 2597.4, 2328.2, 2075.4, 1857.6,
1837 1663.6, 1493.3, 1343.8, 1213.3, 1095.6, 1066.5, 958.91, 865.15,
1838 783.31, 714.35, 650.77, 593.98, 546.2, 499.9, 457.87, 421.75,
1839 387.61, 355.25, 326.62, 299.7, 275.21, 253.17, 232.83, 214.31,
1840 197.5, 182.08, 167.98, 155.12, 143.32, 132.5, 122.58, 113.48,
1841 105.11, 97.415, 90.182, 83.463, 77.281, 71.587, 66.341, 61.493,
1842 57.014, 53.062, 49.21, 45.663, 42.38, 39.348, 36.547, 33.967,
1843 31.573, 29.357, 27.314, 25.415, 23.658, 22.03, 20.524, 19.125,
1844 17.829, 16.627, 15.511, 14.476, 13.514, 12.618, 11.786, 11.013,
1845 10.294, 9.6246, 9.0018, 8.4218, 7.8816, 7.3783, 6.9092, 6.4719,
1846 6.0641, 5.6838, 5.3289, 4.998, 4.6893, 4.4014, 4.1325, 3.8813,
1847 3.6469, 3.4283, 3.2241, 3.035, 2.8576, 2.6922, 2.5348, 2.3896,
1848 2.2535, 2.1258, 2.0059, 1.8929, 1.7862, 1.6854, 1.5898, 1.4992,
1849 1.4017, 1.3218, 1.2479, 1.1809, 1.1215, 1.0693, 1.0116, .96016,
1850 .9105, .84859, .80105, .74381, .69982, .65127, .60899, .57843,
1851 .54592, .51792, .49336, .47155, .45201, .43426, .41807, .40303,
1852 .38876, .3863, .37098, .35492, .33801, .32032, .30341, .29874,
1853 .29193, .28689, .29584, .29155, .29826, .29195, .29287, .2904,
1854 .28199, .27709, .27162, .26622, .26133, .25676, .25235, .23137,
1855 .22365, .21519, .20597, .19636, .18699, .16485, .16262, .16643,
1856 .17542, .18198, .18631, .16759, .16338, .13505, .1267, .10053,
1857 .092554, .074093, .062159, .055523, .054849, .05401, .05528,
1858 .058982, .07952, .08647, .093244, .099285, .10393, .10661,
1859 .12072, .11417, .10396, .093265, .089137, .088909, .10902,
1860 .11277, .13625, .13565, .14907, .14167, .1428, .13744, .12768,
1861 .11382, .10244, .091686, .08109, .071739, .063616, .056579,
1862 .050504, .045251, .040689, .036715, .033237, .030181, .027488,
1863 .025107, .022998, .021125, .01946, .017979, .016661, .015489,
1864 .014448, .013526, .012712, .011998, .011375, .010839, .010384,
1865 .010007, .0097053, .0094783, .0093257, .0092489, .0092504,
1866 .0093346, .0095077, .0097676, .01012, .01058, .011157, .011844,
1867 .012672, .013665, .014766, .015999, .017509, .018972, .020444,
1868 .022311, .023742, .0249, .025599, .026981, .026462, .025143,
1869 .025066, .022814, .020458, .020026, .019142, .020189, .022371,
1870 .024163, .023728, .02199, .019506, .018591, .015576, .012784,
1871 .011744, .0094777, .0079148, .0070652, .006986, .0071758,
1872 .008086, .0098025, .01087, .013609, .016764, .018137, .021061,
1873 .023498, .023576, .023965, .022828, .021519, .021283, .023364,
1874 .026457, .029782, .030856, .033486, .035515, .035543, .036558,
1875 .037198, .037472, .037045, .037284, .03777, .038085, .038366,
1876 .038526, .038282, .038915, .037697, .035667, .032941, .031959,
1877 .028692, .025918, .024596, .025592, .027873, .028935, .02984,
1878 .028148, .025305, .021912, .020454, .016732, .013357, .01205,
1879 .009731, .0079881, .0077704, .0074387, .0083895, .0096776,
1880 .010326, .01293, .015955, .019247, .020145, .02267, .024231,
1881 .024184, .022131, .019784, .01955, .01971, .022119, .025116,
1882 .027978, .028107, .029808, .030701, .029164, .028551, .027286,
1883 .024946, .023259, .020982, .019221, .017471, .015643, .014074,
1884 .01261, .011301, .010116, .0090582, .0081036, .0072542, .0065034,
1885 .0058436, .0052571, .0047321, .0042697, .0038607, .0034977,
1886 .0031747, .0028864, .0026284, .002397, .002189, .0020017,
1887 .0018326, .0016798, .0015414, .0014159, .0013019, .0011983,
1888 .0011039, .0010177, 9.391e-4, 8.6717e-4, 8.0131e-4, 7.4093e-4,
1889 6.8553e-4, 6.3464e-4, 5.8787e-4, 5.4487e-4, 5.0533e-4, 4.69e-4,
1890 4.3556e-4, 4.0474e-4, 3.7629e-4, 3.5e-4, 3.2569e-4, 3.032e-4,
1891 2.8239e-4, 2.6314e-4, 2.4535e-4, 2.2891e-4, 2.1374e-4, 1.9975e-4,
1892 1.8685e-4, 1.7498e-4, 1.6406e-4, 1.5401e-4, 1.4479e-4, 1.3633e-4,
1893 1.2858e-4, 1.2148e-4, 1.1499e-4, 1.0907e-4, 1.0369e-4, 9.8791e-5,
1894 9.4359e-5, 9.0359e-5, 8.6766e-5, 8.3555e-5, 8.0703e-5, 7.8192e-5,
1895 7.6003e-5, 7.4119e-5, 7.2528e-5, 7.1216e-5, 7.0171e-5, 6.9385e-5,
1896 6.8848e-5, 6.8554e-5, 6.8496e-5, 6.8669e-5, 6.9069e-5, 6.9694e-5,
1897 7.054e-5, 7.1608e-5, 7.2896e-5, 7.4406e-5, 7.6139e-5, 7.8097e-5,
1898 8.0283e-5, 8.2702e-5, 8.5357e-5, 8.8255e-5, 9.1402e-5, 9.4806e-5,
1899 9.8473e-5, 1.0241e-4, 1.0664e-4, 1.1115e-4, 1.1598e-4, 1.2112e-4,
1900 1.2659e-4, 1.3241e-4, 1.3859e-4, 1.4515e-4, 1.521e-4, 1.5947e-4,
1901 1.6728e-4, 1.7555e-4, 1.8429e-4, 1.9355e-4, 2.0334e-4, 2.1369e-4,
1902 2.2463e-4, 2.3619e-4, 2.4841e-4, 2.6132e-4, 2.7497e-4, 2.8938e-4,
1903 3.0462e-4, 3.2071e-4, 3.3771e-4, 3.5567e-4, 3.7465e-4, 3.947e-4,
1904 4.1588e-4, 4.3828e-4, 4.6194e-4, 4.8695e-4, 5.1338e-4, 5.4133e-4,
1905 5.7087e-4, 6.0211e-4, 6.3515e-4, 6.701e-4, 7.0706e-4, 7.4617e-4,
1906 7.8756e-4, 8.3136e-4, 8.7772e-4, 9.2681e-4, 9.788e-4, .0010339,
1907 .0010922, .001154, .0012195, .0012889, .0013626, .0014407,
1908 .0015235, .0016114, .0017048, .0018038, .001909, .0020207,
1909 .0021395, .0022657, .0023998, .0025426, .0026944, .002856,
1910 .0030281, .0032114, .0034068, .003615, .0038371, .004074,
1911 .004327, .0045971, .0048857, .0051942, .0055239, .0058766,
1912 .0062538, .0066573, .0070891, .007551, .0080455, .0085747,
1913 .0091412, .0097481, .010397, .011092, .011837, .012638, .013495,
1914 .014415, .01541, .016475, .017621, .018857, .020175, .02162,
1915 .023185, .024876, .02672, .028732, .030916, .033319, .035939,
1916 .038736, .041847, .04524, .048715, .052678, .056977, .061203,
1917 .066184, .07164, .076952, .083477, .090674, .098049, .10697,
1918 .1169, .1277, .14011, .15323, .1684, .18601, .20626, .22831,
1919 .25417, .28407, .31405, .34957, .38823, .41923, .46026, .50409,
1920 .51227, .54805, .57976, .53818, .55056, .557, .46741, .46403,
1921 .4636, .42265, .45166, .49852, .56663, .34306, .17779, .17697,
1922 .18346, .19129, .20014, .21778, .23604, .25649, .28676, .31238,
1923 .33856, .39998, .4288, .46568, .56654, .60786, .64473, .76466,
1924 .7897, .80778, .86443, .85736, .84798, .84157, 1.1385, 1.2446,
1925 1.1923, 1.1552, 1.1338, 1.1266, 1.1292, 1.1431, 1.1683, 1.2059,
1926 1.2521, 1.3069, 1.3712, 1.4471, 1.5275, 1.6165, 1.7145, 1.8189,
1927 1.9359, 2.065, 2.2007, 2.3591, 2.5362, 2.7346, 2.9515, 3.2021,
1928 3.4851, 3.7935, 4.0694, 4.4463, 4.807, 5.2443, 5.7178, 6.2231,
1929 6.4796, 6.9461, 7.4099, 7.3652, 7.7182, 8.048, 7.7373, 8.0363,
1930 8.3855, 8.8044, 9.0257, 9.8574, 10.948, 10.563, 6.8979, 7.0744,
1931 7.4121, 7.7663, 8.1768, 8.6243, 9.1437, 9.7847, 10.182, 10.849,
1932 11.572, 12.602, 13.482, 14.431, 15.907, 16.983, 18.11, 19.884,
1933 21.02, 22.18, 23.355, 24.848, 25.954, 27.13, 30.186, 34.893,
1934 35.682, 36.755, 38.111, 39.703, 41.58, 43.606, 45.868, 48.573,
1935 51.298, 54.291, 57.559, 61.116, 64.964, 69.124, 73.628, 78.471,
1936 83.683, 89.307, 95.341, 101.84, 108.83, 116.36, 124.46, 133.18,
1937 142.57, 152.79, 163.69, 175.43, 188.11, 201.79, 216.55, 232.51,
1938 249.74, 268.38, 288.54, 310.35, 333.97, 359.55, 387.26, 417.3,
1939 449.88, 485.2, 523.54, 565.14, 610.28, 659.31, 712.56, 770.43,
1940 833.36, 901.82, 976.36, 1057.6, 1146.8, 1243.8, 1350., 1466.3,
1941 1593.6, 1732.7, 1884.1, 2049.1, 2228.2, 2421.9, 2629.4, 2853.7,
1942 3094.4, 3351.1, 3622.3, 3829.8, 4123.1, 4438.3, 4777.2, 5144.1,
1943 5545.4, 5990.5, 6404.5, 6996.8, 7687.6, 8482.9, 9349.4, 10203.,
1944 11223., 12358., 13493., 14916., 16416., 18236., 20222., 22501.,
1945 25102., 28358., 31707., 35404., 39538., 43911., 48391., 53193.,
1946 58028., 58082., 61276., 64193., 66294., 67480., 67921., 67423.,
1947 66254., 64341., 51737., 51420., 53072., 58145., 66195., 65358.,
1948 67377., 67869., 53509., 50553., 35737., 32425., 21704., 19974.,
1949 14457., 12142., 16798., 19489., 23049., 27270., 31910., 36457.,
1950 40877., 44748., 47876., 59793., 58626., 55454., 50337., 44893.,
1951 50228., 52216., 54747., 69541., 70455., 81014., 77694., 80533.,
1952 73953., 70927., 65539., 59002., 52281., 45953., 40292., 35360.,
1953 31124., 27478., 24346., 21647., 19308., 17271., 15491., 13927.,
1954 12550., 11331., 10250., 9288.8, 8431.4, 7664.9, 6978.3, 6361.8,
1955 5807.4, 5307.7, 4856.8, 4449., 4079.8, 3744.9, 3440.8, 3164.2,
1956 2912.3, 2682.7, 2473., 2281.4, 2106., 1945.3, 1797.9, 1662.5,
1957 1538.1, 1423.6, 1318.1, 1221., 1131.5, 1049., 972.99, 902.87,
1958 838.01, 777.95, 722.2, 670.44, 622.35, 577.68, 536.21, 497.76,
1959 462.12, 429.13, 398.61, 370.39, 344.29, 320.16, 297.85, 277.2,
1960 258.08, 240.38, 223.97, 208.77, 194.66, 181.58, 169.43, 158.15,
1961 147.67, 137.92, 128.86, 120.44, 112.6, 105.3, 98.499, 92.166,
1962 86.264, 80.763, 75.632, 70.846, 66.381, 62.213, 58.321, 54.685,
1963 51.288, 48.114, 45.145, 42.368, 39.772, 37.341, 35.065, 32.937,
1964 30.943, 29.077, 27.33, 25.693, 24.158, 22.717, 21.367, 20.099,
1965 18.909, 17.792, 16.744, 15.761, 14.838, 13.971, 13.157, 12.393,
1966 11.676, 11.003, 10.369, 9.775, 9.2165, 8.6902, 8.1963, 7.7314,
1967 7.2923, 6.8794, 6.4898, 6.122, 5.7764, 5.4525, 5.1484, 4.8611,
1968 4.5918, 4.3379, 4.0982, 3.8716, 3.6567, 3.4545, 3.2634, 3.0828,
1969 2.9122, 2.7512, 2.5993, 2.4561, 2.3211, 2.1938, 2.0737, 1.9603,
1970 1.8534, 1.7525, 1.6572, 1.5673, 1.4824, 1.4022, 1.3265, 1.2551,
1971 1.1876, 1.1239, 1.0637, 1.0069, .9532, .90248, .85454, .80921,
1972 .76631, .72569, .6872, .65072, .61635, .5836, .55261, .52336,
1973 .49581, .46998, .44559, .42236, .40036, .37929, .35924, .34043,
1974 .32238, .30547, .28931, .27405, .25975, .24616, .23341, .22133,
1975 .20997, .19924, .18917, .17967, .17075, .16211, .15411, .14646,
1976 .13912, .13201, .12509, .11857, .11261, .10698, .10186, .097039,
1977 .092236, .087844, .083443, .07938, .075452, .071564, .067931,
1978 .064389, .061078, .057901, .054921, .052061, .049364, .046789,
1979 .04435, .042044, .039866, .037808, .035863, .034023, .032282,
1980 .030634, .029073, .027595, .026194, .024866, .023608, .022415,
1981 .021283, .02021, .019193, .018228, .017312, .016443, .015619,
1982 .014837, .014094, .01339, .012721, .012086, .011483, .010911,
1983 .010368, .009852, .0093623, .0088972, .0084556, .0080362,
1984 .0076379, .0072596, .0069003, .006559, .0062349, .0059269,
1985 .0056344, .0053565, .0050925, .0048417, .0046034, .004377,
1986 .0041618, .0039575, .0037633, .0035788, .0034034, .0032368,
1987 .0030785, .002928, .0027851, .0026492, .0025201, .0023975,
1988 .0022809, .0021701, .0020649, .0019649, .0018699, .0017796,
1989 .0016938, .0016122, .0015348, .0014612, .0013913, .001325,
1990 .0012619, .0012021, .0011452, .0010913, .0010401, 9.9149e-4,
1991 9.454e-4, 9.0169e-4, 8.6024e-4, 8.2097e-4, 7.8377e-4, 7.4854e-4,
1992 7.1522e-4, 6.8371e-4, 6.5393e-4, 6.2582e-4, 5.9932e-4, 5.7435e-4,
1993 5.5087e-4, 5.2882e-4, 5.0814e-4, 4.8881e-4, 4.7076e-4, 4.5398e-4,
1994 4.3843e-4, 4.2407e-4, 4.109e-4, 3.9888e-4, 3.88e-4, 3.7826e-4,
1995 3.6963e-4, 3.6213e-4, 3.5575e-4, 3.505e-4, 3.464e-4, 3.4346e-4,
1996 3.4173e-4, 3.4125e-4, 3.4206e-4, 3.4424e-4, 3.4787e-4, 3.5303e-4,
1997 3.5986e-4, 3.6847e-4, 3.7903e-4, 3.9174e-4, 4.0681e-4, 4.2455e-4,
1998 4.4527e-4, 4.6942e-4, 4.9637e-4, 5.2698e-4, 5.5808e-4, 5.9514e-4,
1999 6.2757e-4, 6.689e-4, 7.1298e-4, 7.3955e-4, 7.8403e-4, 8.0449e-4,
2000 8.5131e-4, 9.0256e-4, 9.3692e-4, .0010051, .0010846, .0011678,
2001 .001282, .0014016, .0015355, .0016764, .0018272, .0020055,
2002 .0021455, .0023421, .0024615, .0026786, .0028787, .0031259,
2003 .0034046, .0036985, .0040917, .0043902, .0048349, .0049531,
2004 .0052989, .0056148, .0052452, .0053357, .005333, .0045069,
2005 .0043851, .004253, .003738, .0038084, .0039013, .0041505,
2006 .0045372, .0050569, .0054507, .0061267, .0066122, .0072449,
2007 .0078012, .0082651, .0076538, .0076573, .0076806, .0075227,
2008 .0076269, .0063758, .006254, .0067749, .0067909, .0068231,
2009 .0072143, .0072762, .0072954, .007679, .0075107, .0073658,
2010 .0072441, .0071074, .0070378, .007176, .0072472, .0075844,
2011 .0079291, .008412, .0090165, .010688, .011535, .012375, .013166,
2012 .013895, .015567, .016011, .016392, .016737, .017043, .017731,
2013 .018031, .018419, .018877, .019474, .019868, .020604, .021538,
2014 .022653, .023869, .025288, .026879, .028547, .030524, .03274,
2015 .035132, .03769, .040567, .043793, .047188, .049962, .053542,
2016 .057205, .060776, .061489, .064419, .067124, .065945, .068487,
2017 .071209, .074783, .077039, .082444, .08902, .09692, .10617,
2018 .11687, .12952, .12362, .13498, .14412, .15492, .16519, .1744,
2019 .17096, .17714, .18208, .17363, .17813, .18564, .18295, .19045,
2020 .20252, .20815, .21844, .22929, .24229, .25321, .26588, .2797,
2021 .29465, .31136, .32961, .36529, .38486, .41027, .43694, .4667,
2022 .49943, .54542, .58348, .62303, .67633, .71755, .76054, .81371,
2023 .85934, .90841, .96438, 1.0207, 1.0821, 1.1491, 1.2226, 1.3018,
2024 1.388, 1.4818, 1.5835, 1.6939, 1.8137, 1.9435, 2.0843, 2.237,
2025 2.4026, 2.5818, 2.7767, 2.9885, 3.2182, 3.4679, 3.7391, 4.0349,
2026 4.3554, 4.7053, 5.0849, 5.4986, 5.9436, 6.4294, 6.9598, 7.5203,
2027 8.143, 8.8253, 9.5568, 10.371, 11.267, 12.233, 13.31, 14.357,
2028 15.598, 16.93, 18.358, 19.849, 21.408, 23.04, 24.706, 26.409,
2029 28.153, 28.795, 30.549, 32.43, 34.49, 36.027, 38.955, 42.465,
2030 46.565, 50.875, 55.378, 59.002, 63.882, 67.949, 73.693, 80.095,
2031 86.403, 94.264, 102.65, 112.37, 123.3, 135.54, 149.14, 163.83,
2032 179.17, 196.89, 217.91, 240.94, 264.13, 292.39, 324.83, 358.21,
2033 397.16, 440.5, 488.6, 541.04, 595.3, 650.43, 652.03, 688.74,
2034 719.47, 743.54, 757.68, 762.35, 756.43, 741.42, 595.43, 580.97,
2035 580.83, 605.68, 667.88, 764.49, 759.93, 789.12, 798.17, 645.66,
2036 615.65, 455.05, 421.09, 306.45, 289.14, 235.7, 215.52, 274.57,
2037 316.53, 357.73, 409.89, 465.06, 521.84, 579.02, 630.64, 794.46,
2038 813., 813.56, 796.25, 761.57, 727.97, 812.14, 866.75, 932.5,
2039 1132.8, 1194.8, 1362.2, 1387.2, 1482.3, 1479.7, 1517.9, 1533.1,
2040 1534.2, 1523.3, 1522.5, 1515.5, 1505.2, 1486.5, 1454., 1412.,
2041 1358.8, 1107.8, 1060.9, 1033.5, 1048.2, 1122.4, 1248.9, 1227.1,
2042 1255.4, 1058.9, 1020.7, 970.59, 715.24, 512.56, 468.47, 349.3,
2043 338.26, 299.22, 301.26, 332.38, 382.08, 445.49, 515.87, 590.85,
2044 662.3, 726.05, 955.59, 964.11, 945.17, 891.48, 807.11, 720.9,
2045 803.36, 834.46, 1073.9, 1107.1, 1123.6, 1296., 1393.7, 1303.1,
2046 1284.3, 1161.8, 1078.8, 976.13, 868.72, 767.4, 674.72, 593.73,
2047 523.12, 462.24, 409.75, 364.34, 325., 290.73, 260.76, 234.46,
2048 211.28, 190.78, 172.61, 156.44, 142.01, 129.12, 117.57, 107.2,
2049 97.877, 89.47, 81.882, 75.021, 68.807, 63.171, 58.052, 53.396,
2050 49.155, 45.288, 41.759, 38.531, 35.576, 32.868, 30.384, 28.102,
2051 26.003, 24.071, 22.293, 20.655, 19.147, 17.756, 16.476, 15.292,
2052 14.198, 13.183, 12.241, 11.367, 10.554, 9.7989, 9.0978, 8.4475,
2053 7.845, 7.2868, 6.7704, 6.2927, 5.8508, 5.4421, 5.064, 4.714,
2054 4.3902, 4.0902, 3.8121, 3.5543, 3.315, 3.093, 2.8869, 2.6953,
2055 2.5172, 2.3517, 2.1977, 2.0544, 1.9211, 1.7969, 1.6812, 1.5735,
2056 1.4731, 1.3794, 1.2921, 1.2107, 1.1346, 1.0637, .99744, .93554,
2057 .87771, .82368, .77313, .72587, .6816, .64014, .60134, .565,
2058 .53086, .49883, .46881, .44074, .4144, .38979, .36679, .34513,
2059 .32474, .30552, .28751, .27045, .25458, .23976, .22584, .21278,
2060 .20051, .18899, .17815, .16801, .15846, .14954, .14117, .13328,
2061 .12584
2062 };
2063
2064 /* Get CO2 continuum absorption... */
2065 const double xw = nu / 2 + 1;
2066 if (xw >= 1 && xw < 2001) {
2067 const int iw = (int) xw;
2068 const double dw = xw - iw;
2069 const double ew = 1 - dw;
2070 const double cw296 = ew * co2296[iw - 1] + dw * co2296[iw];
2071 const double cw260 = ew * co2260[iw - 1] + dw * co2260[iw];
2072 const double cw230 = ew * co2230[iw - 1] + dw * co2230[iw];
2073 const double dt230 = t - 230;
2074 const double dt260 = t - 260;
2075 const double dt296 = t - 296;
2076 const double ctw =
2077 dt260 * 5.050505e-4 * dt296 * cw230 -
2078 dt230 * 9.259259e-4 * dt296 * cw260 +
2079 dt230 * 4.208754e-4 * dt260 * cw296;
2080 return u / NA / 1000 * p / P0 * ctw;
2081 } else
2082 return 0;
2083}
2084
2085/*****************************************************************************/
2086
2087double ctmh2o(
2088 const double nu,
2089 const double p,
2090 const double t,
2091 const double q,
2092 const double u) {
2093
2094 static const double h2o296[2001] =
2095 { .17, .1695, .172, .168, .1687, .1624, .1606,
2096 .1508, .1447, .1344, .1214, .1133, .1009, .09217, .08297, .06989,
2097 .06513, .05469, .05056, .04417, .03779, .03484, .02994, .0272,
2098 .02325, .02063, .01818, .01592, .01405, .01251, .0108, .009647,
2099 .008424, .007519, .006555, .00588, .005136, .004511, .003989,
2100 .003509, .003114, .00274, .002446, .002144, .001895, .001676,
2101 .001486, .001312, .001164, .001031, 9.129e-4, 8.106e-4, 7.213e-4,
2102 6.4e-4, 5.687e-4, 5.063e-4, 4.511e-4, 4.029e-4, 3.596e-4,
2103 3.22e-4, 2.889e-4, 2.597e-4, 2.337e-4, 2.108e-4, 1.907e-4,
2104 1.728e-4, 1.57e-4, 1.43e-4, 1.305e-4, 1.195e-4, 1.097e-4,
2105 1.009e-4, 9.307e-5, 8.604e-5, 7.971e-5, 7.407e-5, 6.896e-5,
2106 6.433e-5, 6.013e-5, 5.631e-5, 5.283e-5, 4.963e-5, 4.669e-5,
2107 4.398e-5, 4.148e-5, 3.917e-5, 3.702e-5, 3.502e-5, 3.316e-5,
2108 3.142e-5, 2.978e-5, 2.825e-5, 2.681e-5, 2.546e-5, 2.419e-5,
2109 2.299e-5, 2.186e-5, 2.079e-5, 1.979e-5, 1.884e-5, 1.795e-5,
2110 1.711e-5, 1.633e-5, 1.559e-5, 1.49e-5, 1.426e-5, 1.367e-5,
2111 1.312e-5, 1.263e-5, 1.218e-5, 1.178e-5, 1.143e-5, 1.112e-5,
2112 1.088e-5, 1.07e-5, 1.057e-5, 1.05e-5, 1.051e-5, 1.059e-5,
2113 1.076e-5, 1.1e-5, 1.133e-5, 1.18e-5, 1.237e-5, 1.308e-5,
2114 1.393e-5, 1.483e-5, 1.614e-5, 1.758e-5, 1.93e-5, 2.123e-5,
2115 2.346e-5, 2.647e-5, 2.93e-5, 3.279e-5, 3.745e-5, 4.152e-5,
2116 4.813e-5, 5.477e-5, 6.203e-5, 7.331e-5, 8.056e-5, 9.882e-5,
2117 1.05e-4, 1.21e-4, 1.341e-4, 1.572e-4, 1.698e-4, 1.968e-4,
2118 2.175e-4, 2.431e-4, 2.735e-4, 2.867e-4, 3.19e-4, 3.371e-4,
2119 3.554e-4, 3.726e-4, 3.837e-4, 3.878e-4, 3.864e-4, 3.858e-4,
2120 3.841e-4, 3.852e-4, 3.815e-4, 3.762e-4, 3.618e-4, 3.579e-4,
2121 3.45e-4, 3.202e-4, 3.018e-4, 2.785e-4, 2.602e-4, 2.416e-4,
2122 2.097e-4, 1.939e-4, 1.689e-4, 1.498e-4, 1.308e-4, 1.17e-4,
2123 1.011e-4, 9.237e-5, 7.909e-5, 7.006e-5, 6.112e-5, 5.401e-5,
2124 4.914e-5, 4.266e-5, 3.963e-5, 3.316e-5, 3.037e-5, 2.598e-5,
2125 2.294e-5, 2.066e-5, 1.813e-5, 1.583e-5, 1.423e-5, 1.247e-5,
2126 1.116e-5, 9.76e-6, 8.596e-6, 7.72e-6, 6.825e-6, 6.108e-6,
2127 5.366e-6, 4.733e-6, 4.229e-6, 3.731e-6, 3.346e-6, 2.972e-6,
2128 2.628e-6, 2.356e-6, 2.102e-6, 1.878e-6, 1.678e-6, 1.507e-6,
2129 1.348e-6, 1.21e-6, 1.089e-6, 9.806e-7, 8.857e-7, 8.004e-7,
2130 7.261e-7, 6.599e-7, 6.005e-7, 5.479e-7, 5.011e-7, 4.595e-7,
2131 4.219e-7, 3.885e-7, 3.583e-7, 3.314e-7, 3.071e-7, 2.852e-7,
2132 2.654e-7, 2.474e-7, 2.311e-7, 2.162e-7, 2.026e-7, 1.902e-7,
2133 1.788e-7, 1.683e-7, 1.587e-7, 1.497e-7, 1.415e-7, 1.338e-7,
2134 1.266e-7, 1.2e-7, 1.138e-7, 1.08e-7, 1.027e-7, 9.764e-8,
2135 9.296e-8, 8.862e-8, 8.458e-8, 8.087e-8, 7.744e-8, 7.429e-8,
2136 7.145e-8, 6.893e-8, 6.664e-8, 6.468e-8, 6.322e-8, 6.162e-8,
2137 6.07e-8, 5.992e-8, 5.913e-8, 5.841e-8, 5.796e-8, 5.757e-8,
2138 5.746e-8, 5.731e-8, 5.679e-8, 5.577e-8, 5.671e-8, 5.656e-8,
2139 5.594e-8, 5.593e-8, 5.602e-8, 5.62e-8, 5.693e-8, 5.725e-8,
2140 5.858e-8, 6.037e-8, 6.249e-8, 6.535e-8, 6.899e-8, 7.356e-8,
2141 7.918e-8, 8.618e-8, 9.385e-8, 1.039e-7, 1.158e-7, 1.29e-7,
2142 1.437e-7, 1.65e-7, 1.871e-7, 2.121e-7, 2.427e-7, 2.773e-7,
2143 3.247e-7, 3.677e-7, 4.037e-7, 4.776e-7, 5.101e-7, 6.214e-7,
2144 6.936e-7, 7.581e-7, 8.486e-7, 9.355e-7, 9.942e-7, 1.063e-6,
2145 1.123e-6, 1.191e-6, 1.215e-6, 1.247e-6, 1.26e-6, 1.271e-6,
2146 1.284e-6, 1.317e-6, 1.323e-6, 1.349e-6, 1.353e-6, 1.362e-6,
2147 1.344e-6, 1.329e-6, 1.336e-6, 1.327e-6, 1.325e-6, 1.359e-6,
2148 1.374e-6, 1.415e-6, 1.462e-6, 1.526e-6, 1.619e-6, 1.735e-6,
2149 1.863e-6, 2.034e-6, 2.265e-6, 2.482e-6, 2.756e-6, 3.103e-6,
2150 3.466e-6, 3.832e-6, 4.378e-6, 4.913e-6, 5.651e-6, 6.311e-6,
2151 7.169e-6, 8.057e-6, 9.253e-6, 1.047e-5, 1.212e-5, 1.36e-5,
2152 1.569e-5, 1.776e-5, 2.02e-5, 2.281e-5, 2.683e-5, 2.994e-5,
2153 3.488e-5, 3.896e-5, 4.499e-5, 5.175e-5, 6.035e-5, 6.34e-5,
2154 7.281e-5, 7.923e-5, 8.348e-5, 9.631e-5, 1.044e-4, 1.102e-4,
2155 1.176e-4, 1.244e-4, 1.283e-4, 1.326e-4, 1.4e-4, 1.395e-4,
2156 1.387e-4, 1.363e-4, 1.314e-4, 1.241e-4, 1.228e-4, 1.148e-4,
2157 1.086e-4, 1.018e-4, 8.89e-5, 8.316e-5, 7.292e-5, 6.452e-5,
2158 5.625e-5, 5.045e-5, 4.38e-5, 3.762e-5, 3.29e-5, 2.836e-5,
2159 2.485e-5, 2.168e-5, 1.895e-5, 1.659e-5, 1.453e-5, 1.282e-5,
2160 1.132e-5, 1.001e-5, 8.836e-6, 7.804e-6, 6.922e-6, 6.116e-6,
2161 5.429e-6, 4.824e-6, 4.278e-6, 3.788e-6, 3.371e-6, 2.985e-6,
2162 2.649e-6, 2.357e-6, 2.09e-6, 1.858e-6, 1.647e-6, 1.462e-6,
2163 1.299e-6, 1.155e-6, 1.028e-6, 9.142e-7, 8.132e-7, 7.246e-7,
2164 6.451e-7, 5.764e-7, 5.151e-7, 4.603e-7, 4.121e-7, 3.694e-7,
2165 3.318e-7, 2.985e-7, 2.69e-7, 2.428e-7, 2.197e-7, 1.992e-7,
2166 1.81e-7, 1.649e-7, 1.506e-7, 1.378e-7, 1.265e-7, 1.163e-7,
2167 1.073e-7, 9.918e-8, 9.191e-8, 8.538e-8, 7.949e-8, 7.419e-8,
2168 6.94e-8, 6.508e-8, 6.114e-8, 5.761e-8, 5.437e-8, 5.146e-8,
2169 4.89e-8, 4.636e-8, 4.406e-8, 4.201e-8, 4.015e-8, 3.84e-8,
2170 3.661e-8, 3.51e-8, 3.377e-8, 3.242e-8, 3.13e-8, 3.015e-8,
2171 2.918e-8, 2.83e-8, 2.758e-8, 2.707e-8, 2.656e-8, 2.619e-8,
2172 2.609e-8, 2.615e-8, 2.63e-8, 2.675e-8, 2.745e-8, 2.842e-8,
2173 2.966e-8, 3.125e-8, 3.318e-8, 3.565e-8, 3.85e-8, 4.191e-8,
2174 4.59e-8, 5.059e-8, 5.607e-8, 6.239e-8, 6.958e-8, 7.796e-8,
2175 8.773e-8, 9.88e-8, 1.114e-7, 1.258e-7, 1.422e-7, 1.61e-7,
2176 1.822e-7, 2.06e-7, 2.337e-7, 2.645e-7, 2.996e-7, 3.393e-7,
2177 3.843e-7, 4.363e-7, 4.935e-7, 5.607e-7, 6.363e-7, 7.242e-7,
2178 8.23e-7, 9.411e-7, 1.071e-6, 1.232e-6, 1.402e-6, 1.6e-6, 1.82e-6,
2179 2.128e-6, 2.386e-6, 2.781e-6, 3.242e-6, 3.653e-6, 4.323e-6,
2180 4.747e-6, 5.321e-6, 5.919e-6, 6.681e-6, 7.101e-6, 7.983e-6,
2181 8.342e-6, 8.741e-6, 9.431e-6, 9.952e-6, 1.026e-5, 1.055e-5,
2182 1.095e-5, 1.095e-5, 1.087e-5, 1.056e-5, 1.026e-5, 9.715e-6,
2183 9.252e-6, 8.452e-6, 7.958e-6, 7.268e-6, 6.295e-6, 6.003e-6, 5e-6,
2184 4.591e-6, 3.983e-6, 3.479e-6, 3.058e-6, 2.667e-6, 2.293e-6,
2185 1.995e-6, 1.747e-6, 1.517e-6, 1.335e-6, 1.165e-6, 1.028e-6,
2186 9.007e-7, 7.956e-7, 7.015e-7, 6.192e-7, 5.491e-7, 4.859e-7,
2187 4.297e-7, 3.799e-7, 3.38e-7, 3.002e-7, 2.659e-7, 2.366e-7,
2188 2.103e-7, 1.861e-7, 1.655e-7, 1.469e-7, 1.309e-7, 1.162e-7,
2189 1.032e-7, 9.198e-8, 8.181e-8, 7.294e-8, 6.516e-8, 5.787e-8,
2190 5.163e-8, 4.612e-8, 4.119e-8, 3.695e-8, 3.308e-8, 2.976e-8,
2191 2.67e-8, 2.407e-8, 2.171e-8, 1.965e-8, 1.78e-8, 1.617e-8,
2192 1.47e-8, 1.341e-8, 1.227e-8, 1.125e-8, 1.033e-8, 9.524e-9,
2193 8.797e-9, 8.162e-9, 7.565e-9, 7.04e-9, 6.56e-9, 6.129e-9,
2194 5.733e-9, 5.376e-9, 5.043e-9, 4.75e-9, 4.466e-9, 4.211e-9,
2195 3.977e-9, 3.759e-9, 3.558e-9, 3.373e-9, 3.201e-9, 3.043e-9,
2196 2.895e-9, 2.76e-9, 2.635e-9, 2.518e-9, 2.411e-9, 2.314e-9,
2197 2.23e-9, 2.151e-9, 2.087e-9, 2.035e-9, 1.988e-9, 1.946e-9,
2198 1.927e-9, 1.916e-9, 1.916e-9, 1.933e-9, 1.966e-9, 2.018e-9,
2199 2.09e-9, 2.182e-9, 2.299e-9, 2.442e-9, 2.623e-9, 2.832e-9,
2200 3.079e-9, 3.368e-9, 3.714e-9, 4.104e-9, 4.567e-9, 5.091e-9,
2201 5.701e-9, 6.398e-9, 7.194e-9, 8.127e-9, 9.141e-9, 1.035e-8,
2202 1.177e-8, 1.338e-8, 1.508e-8, 1.711e-8, 1.955e-8, 2.216e-8,
2203 2.534e-8, 2.871e-8, 3.291e-8, 3.711e-8, 4.285e-8, 4.868e-8,
2204 5.509e-8, 6.276e-8, 7.262e-8, 8.252e-8, 9.4e-8, 1.064e-7,
2205 1.247e-7, 1.411e-7, 1.626e-7, 1.827e-7, 2.044e-7, 2.284e-7,
2206 2.452e-7, 2.854e-7, 3.026e-7, 3.278e-7, 3.474e-7, 3.693e-7,
2207 3.93e-7, 4.104e-7, 4.22e-7, 4.439e-7, 4.545e-7, 4.778e-7,
2208 4.812e-7, 5.018e-7, 4.899e-7, 5.075e-7, 5.073e-7, 5.171e-7,
2209 5.131e-7, 5.25e-7, 5.617e-7, 5.846e-7, 6.239e-7, 6.696e-7,
2210 7.398e-7, 8.073e-7, 9.15e-7, 1.009e-6, 1.116e-6, 1.264e-6,
2211 1.439e-6, 1.644e-6, 1.856e-6, 2.147e-6, 2.317e-6, 2.713e-6,
2212 2.882e-6, 2.99e-6, 3.489e-6, 3.581e-6, 4.033e-6, 4.26e-6,
2213 4.543e-6, 4.84e-6, 4.826e-6, 5.013e-6, 5.252e-6, 5.277e-6,
2214 5.306e-6, 5.236e-6, 5.123e-6, 5.171e-6, 4.843e-6, 4.615e-6,
2215 4.385e-6, 3.97e-6, 3.693e-6, 3.231e-6, 2.915e-6, 2.495e-6,
2216 2.144e-6, 1.91e-6, 1.639e-6, 1.417e-6, 1.226e-6, 1.065e-6,
2217 9.29e-7, 8.142e-7, 7.161e-7, 6.318e-7, 5.581e-7, 4.943e-7,
2218 4.376e-7, 3.884e-7, 3.449e-7, 3.06e-7, 2.712e-7, 2.412e-7,
2219 2.139e-7, 1.903e-7, 1.689e-7, 1.499e-7, 1.331e-7, 1.183e-7,
2220 1.05e-7, 9.362e-8, 8.306e-8, 7.403e-8, 6.578e-8, 5.853e-8,
2221 5.216e-8, 4.632e-8, 4.127e-8, 3.678e-8, 3.279e-8, 2.923e-8,
2222 2.612e-8, 2.339e-8, 2.094e-8, 1.877e-8, 1.686e-8, 1.516e-8,
2223 1.366e-8, 1.234e-8, 1.114e-8, 1.012e-8, 9.182e-9, 8.362e-9,
2224 7.634e-9, 6.981e-9, 6.406e-9, 5.888e-9, 5.428e-9, 5.021e-9,
2225 4.65e-9, 4.326e-9, 4.033e-9, 3.77e-9, 3.536e-9, 3.327e-9,
2226 3.141e-9, 2.974e-9, 2.825e-9, 2.697e-9, 2.584e-9, 2.488e-9,
2227 2.406e-9, 2.34e-9, 2.292e-9, 2.259e-9, 2.244e-9, 2.243e-9,
2228 2.272e-9, 2.31e-9, 2.378e-9, 2.454e-9, 2.618e-9, 2.672e-9,
2229 2.831e-9, 3.05e-9, 3.225e-9, 3.425e-9, 3.677e-9, 3.968e-9,
2230 4.221e-9, 4.639e-9, 4.96e-9, 5.359e-9, 5.649e-9, 6.23e-9,
2231 6.716e-9, 7.218e-9, 7.746e-9, 7.988e-9, 8.627e-9, 8.999e-9,
2232 9.442e-9, 9.82e-9, 1.015e-8, 1.06e-8, 1.079e-8, 1.109e-8,
2233 1.137e-8, 1.186e-8, 1.18e-8, 1.187e-8, 1.194e-8, 1.192e-8,
2234 1.224e-8, 1.245e-8, 1.246e-8, 1.318e-8, 1.377e-8, 1.471e-8,
2235 1.582e-8, 1.713e-8, 1.853e-8, 2.063e-8, 2.27e-8, 2.567e-8,
2236 2.891e-8, 3.264e-8, 3.744e-8, 4.286e-8, 4.915e-8, 5.623e-8,
2237 6.336e-8, 7.293e-8, 8.309e-8, 9.319e-8, 1.091e-7, 1.243e-7,
2238 1.348e-7, 1.449e-7, 1.62e-7, 1.846e-7, 1.937e-7, 2.04e-7,
2239 2.179e-7, 2.298e-7, 2.433e-7, 2.439e-7, 2.464e-7, 2.611e-7,
2240 2.617e-7, 2.582e-7, 2.453e-7, 2.401e-7, 2.349e-7, 2.203e-7,
2241 2.066e-7, 1.939e-7, 1.78e-7, 1.558e-7, 1.391e-7, 1.203e-7,
2242 1.048e-7, 9.464e-8, 8.306e-8, 7.239e-8, 6.317e-8, 5.52e-8,
2243 4.847e-8, 4.282e-8, 3.796e-8, 3.377e-8, 2.996e-8, 2.678e-8,
2244 2.4e-8, 2.134e-8, 1.904e-8, 1.705e-8, 1.523e-8, 1.35e-8,
2245 1.204e-8, 1.07e-8, 9.408e-9, 8.476e-9, 7.47e-9, 6.679e-9,
2246 5.929e-9, 5.267e-9, 4.711e-9, 4.172e-9, 3.761e-9, 3.288e-9,
2247 2.929e-9, 2.609e-9, 2.315e-9, 2.042e-9, 1.844e-9, 1.64e-9,
2248 1.47e-9, 1.31e-9, 1.176e-9, 1.049e-9, 9.377e-10, 8.462e-10,
2249 7.616e-10, 6.854e-10, 6.191e-10, 5.596e-10, 5.078e-10, 4.611e-10,
2250 4.197e-10, 3.83e-10, 3.505e-10, 3.215e-10, 2.956e-10, 2.726e-10,
2251 2.521e-10, 2.338e-10, 2.173e-10, 2.026e-10, 1.895e-10, 1.777e-10,
2252 1.672e-10, 1.579e-10, 1.496e-10, 1.423e-10, 1.358e-10, 1.302e-10,
2253 1.254e-10, 1.216e-10, 1.187e-10, 1.163e-10, 1.147e-10, 1.145e-10,
2254 1.15e-10, 1.17e-10, 1.192e-10, 1.25e-10, 1.298e-10, 1.345e-10,
2255 1.405e-10, 1.538e-10, 1.648e-10, 1.721e-10, 1.872e-10, 1.968e-10,
2256 2.089e-10, 2.172e-10, 2.317e-10, 2.389e-10, 2.503e-10, 2.585e-10,
2257 2.686e-10, 2.8e-10, 2.895e-10, 3.019e-10, 3.037e-10, 3.076e-10,
2258 3.146e-10, 3.198e-10, 3.332e-10, 3.397e-10, 3.54e-10, 3.667e-10,
2259 3.895e-10, 4.071e-10, 4.565e-10, 4.983e-10, 5.439e-10, 5.968e-10,
2260 6.676e-10, 7.456e-10, 8.405e-10, 9.478e-10, 1.064e-9, 1.218e-9,
2261 1.386e-9, 1.581e-9, 1.787e-9, 2.032e-9, 2.347e-9, 2.677e-9,
2262 3.008e-9, 3.544e-9, 4.056e-9, 4.687e-9, 5.331e-9, 6.227e-9,
2263 6.854e-9, 8.139e-9, 8.945e-9, 9.865e-9, 1.125e-8, 1.178e-8,
2264 1.364e-8, 1.436e-8, 1.54e-8, 1.672e-8, 1.793e-8, 1.906e-8,
2265 2.036e-8, 2.144e-8, 2.292e-8, 2.371e-8, 2.493e-8, 2.606e-8,
2266 2.706e-8, 2.866e-8, 3.036e-8, 3.136e-8, 3.405e-8, 3.665e-8,
2267 3.837e-8, 4.229e-8, 4.748e-8, 5.32e-8, 5.763e-8, 6.677e-8,
2268 7.216e-8, 7.716e-8, 8.958e-8, 9.419e-8, 1.036e-7, 1.108e-7,
2269 1.189e-7, 1.246e-7, 1.348e-7, 1.31e-7, 1.361e-7, 1.364e-7,
2270 1.363e-7, 1.343e-7, 1.293e-7, 1.254e-7, 1.235e-7, 1.158e-7,
2271 1.107e-7, 9.961e-8, 9.011e-8, 7.91e-8, 6.916e-8, 6.338e-8,
2272 5.564e-8, 4.827e-8, 4.198e-8, 3.695e-8, 3.276e-8, 2.929e-8,
2273 2.633e-8, 2.391e-8, 2.192e-8, 2.021e-8, 1.89e-8, 1.772e-8,
2274 1.667e-8, 1.603e-8, 1.547e-8, 1.537e-8, 1.492e-8, 1.515e-8,
2275 1.479e-8, 1.45e-8, 1.513e-8, 1.495e-8, 1.529e-8, 1.565e-8,
2276 1.564e-8, 1.553e-8, 1.569e-8, 1.584e-8, 1.57e-8, 1.538e-8,
2277 1.513e-8, 1.472e-8, 1.425e-8, 1.349e-8, 1.328e-8, 1.249e-8,
2278 1.17e-8, 1.077e-8, 9.514e-9, 8.614e-9, 7.46e-9, 6.621e-9,
2279 5.775e-9, 5.006e-9, 4.308e-9, 3.747e-9, 3.24e-9, 2.84e-9,
2280 2.481e-9, 2.184e-9, 1.923e-9, 1.71e-9, 1.504e-9, 1.334e-9,
2281 1.187e-9, 1.053e-9, 9.367e-10, 8.306e-10, 7.419e-10, 6.63e-10,
2282 5.918e-10, 5.277e-10, 4.717e-10, 4.222e-10, 3.783e-10, 3.39e-10,
2283 3.036e-10, 2.729e-10, 2.455e-10, 2.211e-10, 1.995e-10, 1.804e-10,
2284 1.635e-10, 1.485e-10, 1.355e-10, 1.24e-10, 1.139e-10, 1.051e-10,
2285 9.757e-11, 9.114e-11, 8.577e-11, 8.139e-11, 7.792e-11, 7.52e-11,
2286 7.39e-11, 7.311e-11, 7.277e-11, 7.482e-11, 7.698e-11, 8.162e-11,
2287 8.517e-11, 8.968e-11, 9.905e-11, 1.075e-10, 1.187e-10, 1.291e-10,
2288 1.426e-10, 1.573e-10, 1.734e-10, 1.905e-10, 2.097e-10, 2.28e-10,
2289 2.473e-10, 2.718e-10, 2.922e-10, 3.128e-10, 3.361e-10, 3.641e-10,
2290 3.91e-10, 4.196e-10, 4.501e-10, 4.932e-10, 5.258e-10, 5.755e-10,
2291 6.253e-10, 6.664e-10, 7.344e-10, 7.985e-10, 8.877e-10, 1.005e-9,
2292 1.118e-9, 1.251e-9, 1.428e-9, 1.61e-9, 1.888e-9, 2.077e-9,
2293 2.331e-9, 2.751e-9, 3.061e-9, 3.522e-9, 3.805e-9, 4.181e-9,
2294 4.575e-9, 5.167e-9, 5.634e-9, 6.007e-9, 6.501e-9, 6.829e-9,
2295 7.211e-9, 7.262e-9, 7.696e-9, 7.832e-9, 7.799e-9, 7.651e-9,
2296 7.304e-9, 7.15e-9, 6.977e-9, 6.603e-9, 6.209e-9, 5.69e-9,
2297 5.432e-9, 4.764e-9, 4.189e-9, 3.64e-9, 3.203e-9, 2.848e-9,
2298 2.51e-9, 2.194e-9, 1.946e-9, 1.75e-9, 1.567e-9, 1.426e-9,
2299 1.302e-9, 1.197e-9, 1.109e-9, 1.035e-9, 9.719e-10, 9.207e-10,
2300 8.957e-10, 8.578e-10, 8.262e-10, 8.117e-10, 7.987e-10, 7.875e-10,
2301 7.741e-10, 7.762e-10, 7.537e-10, 7.424e-10, 7.474e-10, 7.294e-10,
2302 7.216e-10, 7.233e-10, 7.075e-10, 6.892e-10, 6.618e-10, 6.314e-10,
2303 6.208e-10, 5.689e-10, 5.55e-10, 4.984e-10, 4.6e-10, 4.078e-10,
2304 3.879e-10, 3.459e-10, 2.982e-10, 2.626e-10, 2.329e-10, 1.988e-10,
2305 1.735e-10, 1.487e-10, 1.297e-10, 1.133e-10, 9.943e-11, 8.736e-11,
2306 7.726e-11, 6.836e-11, 6.053e-11, 5.384e-11, 4.789e-11, 4.267e-11,
2307 3.804e-11, 3.398e-11, 3.034e-11, 2.71e-11, 2.425e-11, 2.173e-11,
2308 1.95e-11, 1.752e-11, 1.574e-11, 1.418e-11, 1.278e-11, 1.154e-11,
2309 1.044e-11, 9.463e-12, 8.602e-12, 7.841e-12, 7.171e-12, 6.584e-12,
2310 6.073e-12, 5.631e-12, 5.254e-12, 4.937e-12, 4.679e-12, 4.476e-12,
2311 4.328e-12, 4.233e-12, 4.194e-12, 4.211e-12, 4.286e-12, 4.424e-12,
2312 4.628e-12, 4.906e-12, 5.262e-12, 5.708e-12, 6.254e-12, 6.914e-12,
2313 7.714e-12, 8.677e-12, 9.747e-12, 1.101e-11, 1.256e-11, 1.409e-11,
2314 1.597e-11, 1.807e-11, 2.034e-11, 2.316e-11, 2.622e-11, 2.962e-11,
2315 3.369e-11, 3.819e-11, 4.329e-11, 4.932e-11, 5.589e-11, 6.364e-11,
2316 7.284e-11, 8.236e-11, 9.447e-11, 1.078e-10, 1.229e-10, 1.417e-10,
2317 1.614e-10, 1.843e-10, 2.107e-10, 2.406e-10, 2.728e-10, 3.195e-10,
2318 3.595e-10, 4.153e-10, 4.736e-10, 5.41e-10, 6.088e-10, 6.769e-10,
2319 7.691e-10, 8.545e-10, 9.621e-10, 1.047e-9, 1.161e-9, 1.296e-9,
2320 1.424e-9, 1.576e-9, 1.739e-9, 1.893e-9, 2.08e-9, 2.336e-9,
2321 2.604e-9, 2.76e-9, 3.001e-9, 3.365e-9, 3.55e-9, 3.895e-9,
2322 4.183e-9, 4.614e-9, 4.846e-9, 5.068e-9, 5.427e-9, 5.541e-9,
2323 5.864e-9, 5.997e-9, 5.997e-9, 6.061e-9, 5.944e-9, 5.855e-9,
2324 5.661e-9, 5.523e-9, 5.374e-9, 4.94e-9, 4.688e-9, 4.17e-9,
2325 3.913e-9, 3.423e-9, 2.997e-9, 2.598e-9, 2.253e-9, 1.946e-9,
2326 1.71e-9, 1.507e-9, 1.336e-9, 1.19e-9, 1.068e-9, 9.623e-10,
2327 8.772e-10, 8.007e-10, 7.42e-10, 6.884e-10, 6.483e-10, 6.162e-10,
2328 5.922e-10, 5.688e-10, 5.654e-10, 5.637e-10, 5.701e-10, 5.781e-10,
2329 5.874e-10, 6.268e-10, 6.357e-10, 6.525e-10, 7.137e-10, 7.441e-10,
2330 8.024e-10, 8.485e-10, 9.143e-10, 9.536e-10, 9.717e-10, 1.018e-9,
2331 1.042e-9, 1.054e-9, 1.092e-9, 1.079e-9, 1.064e-9, 1.043e-9,
2332 1.02e-9, 9.687e-10, 9.273e-10, 9.208e-10, 9.068e-10, 7.687e-10,
2333 7.385e-10, 6.595e-10, 5.87e-10, 5.144e-10, 4.417e-10, 3.804e-10,
2334 3.301e-10, 2.866e-10, 2.509e-10, 2.202e-10, 1.947e-10, 1.719e-10,
2335 1.525e-10, 1.361e-10, 1.21e-10, 1.084e-10, 9.8e-11, 8.801e-11,
2336 7.954e-11, 7.124e-11, 6.335e-11, 5.76e-11, 5.132e-11, 4.601e-11,
2337 4.096e-11, 3.657e-11, 3.25e-11, 2.909e-11, 2.587e-11, 2.297e-11,
2338 2.05e-11, 1.828e-11, 1.632e-11, 1.462e-11, 1.314e-11, 1.185e-11,
2339 1.073e-11, 9.76e-12, 8.922e-12, 8.206e-12, 7.602e-12, 7.1e-12,
2340 6.694e-12, 6.378e-12, 6.149e-12, 6.004e-12, 5.941e-12, 5.962e-12,
2341 6.069e-12, 6.265e-12, 6.551e-12, 6.935e-12, 7.457e-12, 8.074e-12,
2342 8.811e-12, 9.852e-12, 1.086e-11, 1.207e-11, 1.361e-11, 1.553e-11,
2343 1.737e-11, 1.93e-11, 2.175e-11, 2.41e-11, 2.706e-11, 3.023e-11,
2344 3.313e-11, 3.657e-11, 4.118e-11, 4.569e-11, 5.025e-11, 5.66e-11,
2345 6.231e-11, 6.881e-11, 7.996e-11, 8.526e-11, 9.694e-11, 1.106e-10,
2346 1.222e-10, 1.355e-10, 1.525e-10, 1.775e-10, 1.924e-10, 2.181e-10,
2347 2.379e-10, 2.662e-10, 2.907e-10, 3.154e-10, 3.366e-10, 3.579e-10,
2348 3.858e-10, 4.046e-10, 4.196e-10, 4.166e-10, 4.457e-10, 4.466e-10,
2349 4.404e-10, 4.337e-10, 4.15e-10, 4.083e-10, 3.91e-10, 3.723e-10,
2350 3.514e-10, 3.303e-10, 2.847e-10, 2.546e-10, 2.23e-10, 1.994e-10,
2351 1.733e-10, 1.488e-10, 1.297e-10, 1.144e-10, 1.004e-10, 8.741e-11,
2352 7.928e-11, 7.034e-11, 6.323e-11, 5.754e-11, 5.25e-11, 4.85e-11,
2353 4.502e-11, 4.286e-11, 4.028e-11, 3.899e-11, 3.824e-11, 3.761e-11,
2354 3.804e-11, 3.839e-11, 3.845e-11, 4.244e-11, 4.382e-11, 4.582e-11,
2355 4.847e-11, 5.209e-11, 5.384e-11, 5.887e-11, 6.371e-11, 6.737e-11,
2356 7.168e-11, 7.415e-11, 7.827e-11, 8.037e-11, 8.12e-11, 8.071e-11,
2357 8.008e-11, 7.851e-11, 7.544e-11, 7.377e-11, 7.173e-11, 6.801e-11,
2358 6.267e-11, 5.727e-11, 5.288e-11, 4.853e-11, 4.082e-11, 3.645e-11,
2359 3.136e-11, 2.672e-11, 2.304e-11, 1.986e-11, 1.725e-11, 1.503e-11,
2360 1.315e-11, 1.153e-11, 1.014e-11, 8.942e-12, 7.901e-12, 6.993e-12,
2361 6.199e-12, 5.502e-12, 4.89e-12, 4.351e-12, 3.878e-12, 3.461e-12,
2362 3.094e-12, 2.771e-12, 2.488e-12, 2.241e-12, 2.025e-12, 1.838e-12,
2363 1.677e-12, 1.541e-12, 1.427e-12, 1.335e-12, 1.262e-12, 1.209e-12,
2364 1.176e-12, 1.161e-12, 1.165e-12, 1.189e-12, 1.234e-12, 1.3e-12,
2365 1.389e-12, 1.503e-12, 1.644e-12, 1.814e-12, 2.017e-12, 2.255e-12,
2366 2.534e-12, 2.858e-12, 3.231e-12, 3.661e-12, 4.153e-12, 4.717e-12,
2367 5.36e-12, 6.094e-12, 6.93e-12, 7.882e-12, 8.966e-12, 1.02e-11,
2368 1.162e-11, 1.324e-11, 1.51e-11, 1.72e-11, 1.965e-11, 2.237e-11,
2369 2.56e-11, 2.927e-11, 3.371e-11, 3.842e-11, 4.429e-11, 5.139e-11,
2370 5.798e-11, 6.697e-11, 7.626e-11, 8.647e-11, 1.022e-10, 1.136e-10,
2371 1.3e-10, 1.481e-10, 1.672e-10, 1.871e-10, 2.126e-10, 2.357e-10,
2372 2.583e-10, 2.997e-10, 3.289e-10, 3.702e-10, 4.012e-10, 4.319e-10,
2373 4.527e-10, 5.001e-10, 5.448e-10, 5.611e-10, 5.76e-10, 5.965e-10,
2374 6.079e-10, 6.207e-10, 6.276e-10, 6.222e-10, 6.137e-10, 6e-10,
2375 5.814e-10, 5.393e-10, 5.35e-10, 4.947e-10, 4.629e-10, 4.117e-10,
2376 3.712e-10, 3.372e-10, 2.923e-10, 2.55e-10, 2.232e-10, 1.929e-10,
2377 1.679e-10, 1.46e-10, 1.289e-10, 1.13e-10, 9.953e-11, 8.763e-11,
2378 7.76e-11, 6.9e-11, 6.16e-11, 5.525e-11, 4.958e-11, 4.489e-11,
2379 4.072e-11, 3.728e-11, 3.438e-11, 3.205e-11, 3.006e-11, 2.848e-11,
2380 2.766e-11, 2.688e-11, 2.664e-11, 2.67e-11, 2.696e-11, 2.786e-11,
2381 2.861e-11, 3.009e-11, 3.178e-11, 3.389e-11, 3.587e-11, 3.819e-11,
2382 4.054e-11, 4.417e-11, 4.703e-11, 5.137e-11, 5.46e-11, 6.055e-11,
2383 6.333e-11, 6.773e-11, 7.219e-11, 7.717e-11, 8.131e-11, 8.491e-11,
2384 8.574e-11, 9.01e-11, 9.017e-11, 8.999e-11, 8.959e-11, 8.838e-11,
2385 8.579e-11, 8.162e-11, 8.098e-11, 7.472e-11, 7.108e-11, 6.559e-11,
2386 5.994e-11, 5.172e-11, 4.424e-11, 3.951e-11, 3.34e-11, 2.902e-11,
2387 2.541e-11, 2.215e-11, 1.945e-11, 1.716e-11, 1.503e-11, 1.339e-11,
2388 1.185e-11, 1.05e-11, 9.336e-12, 8.307e-12, 7.312e-12, 6.55e-12,
2389 5.836e-12, 5.178e-12, 4.6e-12, 4.086e-12, 3.639e-12, 3.247e-12,
2390 2.904e-12, 2.604e-12, 2.341e-12, 2.112e-12, 1.914e-12, 1.744e-12,
2391 1.598e-12, 1.476e-12, 1.374e-12, 1.293e-12, 1.23e-12, 1.185e-12,
2392 1.158e-12, 1.147e-12, 1.154e-12, 1.177e-12, 1.219e-12, 1.28e-12,
2393 1.36e-12, 1.463e-12, 1.591e-12, 1.75e-12, 1.94e-12, 2.156e-12,
2394 2.43e-12, 2.748e-12, 3.052e-12, 3.533e-12, 3.967e-12, 4.471e-12,
2395 5.041e-12, 5.86e-12, 6.664e-12, 7.522e-12, 8.342e-12, 9.412e-12,
2396 1.072e-11, 1.213e-11, 1.343e-11, 1.496e-11, 1.664e-11, 1.822e-11,
2397 2.029e-11, 2.233e-11, 2.457e-11, 2.709e-11, 2.928e-11, 3.115e-11,
2398 3.356e-11, 3.592e-11, 3.818e-11, 3.936e-11, 4.061e-11, 4.149e-11,
2399 4.299e-11, 4.223e-11, 4.251e-11, 4.287e-11, 4.177e-11, 4.094e-11,
2400 3.942e-11, 3.772e-11, 3.614e-11, 3.394e-11, 3.222e-11, 2.791e-11,
2401 2.665e-11, 2.309e-11, 2.032e-11, 1.74e-11, 1.535e-11, 1.323e-11,
2402 1.151e-11, 9.803e-12, 8.65e-12, 7.54e-12, 6.619e-12, 5.832e-12,
2403 5.113e-12, 4.503e-12, 3.975e-12, 3.52e-12, 3.112e-12, 2.797e-12,
2404 2.5e-12, 2.24e-12, 2.013e-12, 1.819e-12, 1.653e-12, 1.513e-12,
2405 1.395e-12, 1.299e-12, 1.225e-12, 1.168e-12, 1.124e-12, 1.148e-12,
2406 1.107e-12, 1.128e-12, 1.169e-12, 1.233e-12, 1.307e-12, 1.359e-12,
2407 1.543e-12, 1.686e-12, 1.794e-12, 2.028e-12, 2.21e-12, 2.441e-12,
2408 2.653e-12, 2.828e-12, 3.093e-12, 3.28e-12, 3.551e-12, 3.677e-12,
2409 3.803e-12, 3.844e-12, 4.068e-12, 4.093e-12, 4.002e-12, 3.904e-12,
2410 3.624e-12, 3.633e-12, 3.622e-12, 3.443e-12, 3.184e-12, 2.934e-12,
2411 2.476e-12, 2.212e-12, 1.867e-12, 1.594e-12, 1.37e-12, 1.192e-12,
2412 1.045e-12, 9.211e-13, 8.17e-13, 7.29e-13, 6.55e-13, 5.929e-13,
2413 5.415e-13, 4.995e-13, 4.661e-13, 4.406e-13, 4.225e-13, 4.116e-13,
2414 4.075e-13, 4.102e-13, 4.198e-13, 4.365e-13, 4.606e-13, 4.925e-13,
2415 5.326e-13, 5.818e-13, 6.407e-13, 7.104e-13, 7.92e-13, 8.868e-13,
2416 9.964e-13, 1.123e-12, 1.268e-12, 1.434e-12, 1.626e-12, 1.848e-12,
2417 2.107e-12, 2.422e-12, 2.772e-12, 3.145e-12, 3.704e-12, 4.27e-12,
2418 4.721e-12, 5.361e-12, 6.083e-12, 7.095e-12, 7.968e-12, 9.228e-12,
2419 1.048e-11, 1.187e-11, 1.336e-11, 1.577e-11, 1.772e-11, 2.017e-11,
2420 2.25e-11, 2.63e-11, 2.911e-11, 3.356e-11, 3.82e-11, 4.173e-11,
2421 4.811e-11, 5.254e-11, 5.839e-11, 6.187e-11, 6.805e-11, 7.118e-11,
2422 7.369e-11, 7.664e-11, 7.794e-11, 7.947e-11, 8.036e-11, 7.954e-11,
2423 7.849e-11, 7.518e-11, 7.462e-11, 6.926e-11, 6.531e-11, 6.197e-11,
2424 5.421e-11, 4.777e-11, 4.111e-11, 3.679e-11, 3.166e-11, 2.786e-11,
2425 2.436e-11, 2.144e-11, 1.859e-11, 1.628e-11, 1.414e-11, 1.237e-11,
2426 1.093e-11, 9.558e-12
2427 };
2428
2429 static const double h2o260[2001] =
2430 { .2752, .2732, .2749, .2676, .2667, .2545,
2431 .2497, .2327, .2218, .2036, .1825, .1694, .1497, .1353, .121,
2432 .1014, .09405, .07848, .07195, .06246, .05306, .04853, .04138,
2433 .03735, .03171, .02785, .02431, .02111, .01845, .0164, .01405,
2434 .01255, .01098, .009797, .008646, .007779, .006898, .006099,
2435 .005453, .004909, .004413, .003959, .003581, .003199, .002871,
2436 .002583, .00233, .002086, .001874, .001684, .001512, .001361,
2437 .001225, .0011, 9.89e-4, 8.916e-4, 8.039e-4, 7.256e-4, 6.545e-4,
2438 5.918e-4, 5.359e-4, 4.867e-4, 4.426e-4, 4.033e-4, 3.682e-4,
2439 3.366e-4, 3.085e-4, 2.833e-4, 2.605e-4, 2.403e-4, 2.221e-4,
2440 2.055e-4, 1.908e-4, 1.774e-4, 1.653e-4, 1.544e-4, 1.443e-4,
2441 1.351e-4, 1.267e-4, 1.19e-4, 1.119e-4, 1.053e-4, 9.922e-5,
2442 9.355e-5, 8.831e-5, 8.339e-5, 7.878e-5, 7.449e-5, 7.043e-5,
2443 6.664e-5, 6.307e-5, 5.969e-5, 5.654e-5, 5.357e-5, 5.075e-5,
2444 4.81e-5, 4.56e-5, 4.322e-5, 4.102e-5, 3.892e-5, 3.696e-5,
2445 3.511e-5, 3.339e-5, 3.177e-5, 3.026e-5, 2.886e-5, 2.756e-5,
2446 2.636e-5, 2.527e-5, 2.427e-5, 2.337e-5, 2.257e-5, 2.185e-5,
2447 2.127e-5, 2.08e-5, 2.041e-5, 2.013e-5, 2e-5, 1.997e-5, 2.009e-5,
2448 2.031e-5, 2.068e-5, 2.124e-5, 2.189e-5, 2.267e-5, 2.364e-5,
2449 2.463e-5, 2.618e-5, 2.774e-5, 2.937e-5, 3.144e-5, 3.359e-5,
2450 3.695e-5, 4.002e-5, 4.374e-5, 4.947e-5, 5.431e-5, 6.281e-5,
2451 7.169e-5, 8.157e-5, 9.728e-5, 1.079e-4, 1.337e-4, 1.442e-4,
2452 1.683e-4, 1.879e-4, 2.223e-4, 2.425e-4, 2.838e-4, 3.143e-4,
2453 3.527e-4, 4.012e-4, 4.237e-4, 4.747e-4, 5.057e-4, 5.409e-4,
2454 5.734e-4, 5.944e-4, 6.077e-4, 6.175e-4, 6.238e-4, 6.226e-4,
2455 6.248e-4, 6.192e-4, 6.098e-4, 5.818e-4, 5.709e-4, 5.465e-4,
2456 5.043e-4, 4.699e-4, 4.294e-4, 3.984e-4, 3.672e-4, 3.152e-4,
2457 2.883e-4, 2.503e-4, 2.211e-4, 1.92e-4, 1.714e-4, 1.485e-4,
2458 1.358e-4, 1.156e-4, 1.021e-4, 8.887e-5, 7.842e-5, 7.12e-5,
2459 6.186e-5, 5.73e-5, 4.792e-5, 4.364e-5, 3.72e-5, 3.28e-5,
2460 2.946e-5, 2.591e-5, 2.261e-5, 2.048e-5, 1.813e-5, 1.63e-5,
2461 1.447e-5, 1.282e-5, 1.167e-5, 1.041e-5, 9.449e-6, 8.51e-6,
2462 7.596e-6, 6.961e-6, 6.272e-6, 5.728e-6, 5.198e-6, 4.667e-6,
2463 4.288e-6, 3.897e-6, 3.551e-6, 3.235e-6, 2.952e-6, 2.688e-6,
2464 2.449e-6, 2.241e-6, 2.05e-6, 1.879e-6, 1.722e-6, 1.582e-6,
2465 1.456e-6, 1.339e-6, 1.236e-6, 1.144e-6, 1.06e-6, 9.83e-7,
2466 9.149e-7, 8.535e-7, 7.973e-7, 7.466e-7, 6.999e-7, 6.574e-7,
2467 6.18e-7, 5.821e-7, 5.487e-7, 5.18e-7, 4.896e-7, 4.631e-7,
2468 4.386e-7, 4.16e-7, 3.945e-7, 3.748e-7, 3.562e-7, 3.385e-7,
2469 3.222e-7, 3.068e-7, 2.922e-7, 2.788e-7, 2.659e-7, 2.539e-7,
2470 2.425e-7, 2.318e-7, 2.219e-7, 2.127e-7, 2.039e-7, 1.958e-7,
2471 1.885e-7, 1.818e-7, 1.758e-7, 1.711e-7, 1.662e-7, 1.63e-7,
2472 1.605e-7, 1.58e-7, 1.559e-7, 1.545e-7, 1.532e-7, 1.522e-7,
2473 1.51e-7, 1.495e-7, 1.465e-7, 1.483e-7, 1.469e-7, 1.448e-7,
2474 1.444e-7, 1.436e-7, 1.426e-7, 1.431e-7, 1.425e-7, 1.445e-7,
2475 1.477e-7, 1.515e-7, 1.567e-7, 1.634e-7, 1.712e-7, 1.802e-7,
2476 1.914e-7, 2.024e-7, 2.159e-7, 2.295e-7, 2.461e-7, 2.621e-7,
2477 2.868e-7, 3.102e-7, 3.394e-7, 3.784e-7, 4.223e-7, 4.864e-7,
2478 5.501e-7, 6.039e-7, 7.193e-7, 7.728e-7, 9.514e-7, 1.073e-6,
2479 1.18e-6, 1.333e-6, 1.472e-6, 1.566e-6, 1.677e-6, 1.784e-6,
2480 1.904e-6, 1.953e-6, 2.02e-6, 2.074e-6, 2.128e-6, 2.162e-6,
2481 2.219e-6, 2.221e-6, 2.249e-6, 2.239e-6, 2.235e-6, 2.185e-6,
2482 2.141e-6, 2.124e-6, 2.09e-6, 2.068e-6, 2.1e-6, 2.104e-6,
2483 2.142e-6, 2.181e-6, 2.257e-6, 2.362e-6, 2.5e-6, 2.664e-6,
2484 2.884e-6, 3.189e-6, 3.48e-6, 3.847e-6, 4.313e-6, 4.79e-6,
2485 5.25e-6, 5.989e-6, 6.692e-6, 7.668e-6, 8.52e-6, 9.606e-6,
2486 1.073e-5, 1.225e-5, 1.377e-5, 1.582e-5, 1.761e-5, 2.029e-5,
2487 2.284e-5, 2.602e-5, 2.94e-5, 3.483e-5, 3.928e-5, 4.618e-5,
2488 5.24e-5, 6.132e-5, 7.183e-5, 8.521e-5, 9.111e-5, 1.07e-4,
2489 1.184e-4, 1.264e-4, 1.475e-4, 1.612e-4, 1.704e-4, 1.818e-4,
2490 1.924e-4, 1.994e-4, 2.061e-4, 2.18e-4, 2.187e-4, 2.2e-4,
2491 2.196e-4, 2.131e-4, 2.015e-4, 1.988e-4, 1.847e-4, 1.729e-4,
2492 1.597e-4, 1.373e-4, 1.262e-4, 1.087e-4, 9.439e-5, 8.061e-5,
2493 7.093e-5, 6.049e-5, 5.12e-5, 4.435e-5, 3.817e-5, 3.34e-5,
2494 2.927e-5, 2.573e-5, 2.291e-5, 2.04e-5, 1.827e-5, 1.636e-5,
2495 1.463e-5, 1.309e-5, 1.17e-5, 1.047e-5, 9.315e-6, 8.328e-6,
2496 7.458e-6, 6.665e-6, 5.94e-6, 5.316e-6, 4.752e-6, 4.252e-6,
2497 3.825e-6, 3.421e-6, 3.064e-6, 2.746e-6, 2.465e-6, 2.216e-6,
2498 1.99e-6, 1.79e-6, 1.609e-6, 1.449e-6, 1.306e-6, 1.177e-6,
2499 1.063e-6, 9.607e-7, 8.672e-7, 7.855e-7, 7.118e-7, 6.46e-7,
2500 5.871e-7, 5.34e-7, 4.868e-7, 4.447e-7, 4.068e-7, 3.729e-7,
2501 3.423e-7, 3.151e-7, 2.905e-7, 2.686e-7, 2.484e-7, 2.306e-7,
2502 2.142e-7, 1.995e-7, 1.86e-7, 1.738e-7, 1.626e-7, 1.522e-7,
2503 1.427e-7, 1.338e-7, 1.258e-7, 1.183e-7, 1.116e-7, 1.056e-7,
2504 9.972e-8, 9.46e-8, 9.007e-8, 8.592e-8, 8.195e-8, 7.816e-8,
2505 7.483e-8, 7.193e-8, 6.892e-8, 6.642e-8, 6.386e-8, 6.154e-8,
2506 5.949e-8, 5.764e-8, 5.622e-8, 5.479e-8, 5.364e-8, 5.301e-8,
2507 5.267e-8, 5.263e-8, 5.313e-8, 5.41e-8, 5.55e-8, 5.745e-8,
2508 6.003e-8, 6.311e-8, 6.713e-8, 7.173e-8, 7.724e-8, 8.368e-8,
2509 9.121e-8, 9.986e-8, 1.097e-7, 1.209e-7, 1.338e-7, 1.486e-7,
2510 1.651e-7, 1.837e-7, 2.048e-7, 2.289e-7, 2.557e-7, 2.857e-7,
2511 3.195e-7, 3.587e-7, 4.015e-7, 4.497e-7, 5.049e-7, 5.665e-7,
2512 6.366e-7, 7.121e-7, 7.996e-7, 8.946e-7, 1.002e-6, 1.117e-6,
2513 1.262e-6, 1.416e-6, 1.611e-6, 1.807e-6, 2.056e-6, 2.351e-6,
2514 2.769e-6, 3.138e-6, 3.699e-6, 4.386e-6, 5.041e-6, 6.074e-6,
2515 6.812e-6, 7.79e-6, 8.855e-6, 1.014e-5, 1.095e-5, 1.245e-5,
2516 1.316e-5, 1.39e-5, 1.504e-5, 1.583e-5, 1.617e-5, 1.652e-5,
2517 1.713e-5, 1.724e-5, 1.715e-5, 1.668e-5, 1.629e-5, 1.552e-5,
2518 1.478e-5, 1.34e-5, 1.245e-5, 1.121e-5, 9.575e-6, 8.956e-6,
2519 7.345e-6, 6.597e-6, 5.612e-6, 4.818e-6, 4.165e-6, 3.579e-6,
2520 3.041e-6, 2.623e-6, 2.29e-6, 1.984e-6, 1.748e-6, 1.534e-6,
2521 1.369e-6, 1.219e-6, 1.092e-6, 9.8e-7, 8.762e-7, 7.896e-7,
2522 7.104e-7, 6.364e-7, 5.691e-7, 5.107e-7, 4.575e-7, 4.09e-7,
2523 3.667e-7, 3.287e-7, 2.931e-7, 2.633e-7, 2.356e-7, 2.111e-7,
2524 1.895e-7, 1.697e-7, 1.525e-7, 1.369e-7, 1.233e-7, 1.114e-7,
2525 9.988e-8, 9.004e-8, 8.149e-8, 7.352e-8, 6.662e-8, 6.03e-8,
2526 5.479e-8, 4.974e-8, 4.532e-8, 4.129e-8, 3.781e-8, 3.462e-8,
2527 3.176e-8, 2.919e-8, 2.687e-8, 2.481e-8, 2.292e-8, 2.119e-8,
2528 1.967e-8, 1.828e-8, 1.706e-8, 1.589e-8, 1.487e-8, 1.393e-8,
2529 1.307e-8, 1.228e-8, 1.156e-8, 1.089e-8, 1.028e-8, 9.696e-9,
2530 9.159e-9, 8.658e-9, 8.187e-9, 7.746e-9, 7.34e-9, 6.953e-9,
2531 6.594e-9, 6.259e-9, 5.948e-9, 5.66e-9, 5.386e-9, 5.135e-9,
2532 4.903e-9, 4.703e-9, 4.515e-9, 4.362e-9, 4.233e-9, 4.117e-9,
2533 4.017e-9, 3.962e-9, 3.924e-9, 3.905e-9, 3.922e-9, 3.967e-9,
2534 4.046e-9, 4.165e-9, 4.32e-9, 4.522e-9, 4.769e-9, 5.083e-9,
2535 5.443e-9, 5.872e-9, 6.366e-9, 6.949e-9, 7.601e-9, 8.371e-9,
2536 9.22e-9, 1.02e-8, 1.129e-8, 1.251e-8, 1.393e-8, 1.542e-8,
2537 1.72e-8, 1.926e-8, 2.152e-8, 2.392e-8, 2.678e-8, 3.028e-8,
2538 3.39e-8, 3.836e-8, 4.309e-8, 4.9e-8, 5.481e-8, 6.252e-8,
2539 7.039e-8, 7.883e-8, 8.849e-8, 1.012e-7, 1.142e-7, 1.3e-7,
2540 1.475e-7, 1.732e-7, 1.978e-7, 2.304e-7, 2.631e-7, 2.988e-7,
2541 3.392e-7, 3.69e-7, 4.355e-7, 4.672e-7, 5.11e-7, 5.461e-7,
2542 5.828e-7, 6.233e-7, 6.509e-7, 6.672e-7, 6.969e-7, 7.104e-7,
2543 7.439e-7, 7.463e-7, 7.708e-7, 7.466e-7, 7.668e-7, 7.549e-7,
2544 7.586e-7, 7.384e-7, 7.439e-7, 7.785e-7, 7.915e-7, 8.31e-7,
2545 8.745e-7, 9.558e-7, 1.038e-6, 1.173e-6, 1.304e-6, 1.452e-6,
2546 1.671e-6, 1.931e-6, 2.239e-6, 2.578e-6, 3.032e-6, 3.334e-6,
2547 3.98e-6, 4.3e-6, 4.518e-6, 5.321e-6, 5.508e-6, 6.211e-6, 6.59e-6,
2548 7.046e-6, 7.555e-6, 7.558e-6, 7.875e-6, 8.319e-6, 8.433e-6,
2549 8.59e-6, 8.503e-6, 8.304e-6, 8.336e-6, 7.739e-6, 7.301e-6,
2550 6.827e-6, 6.078e-6, 5.551e-6, 4.762e-6, 4.224e-6, 3.538e-6,
2551 2.984e-6, 2.619e-6, 2.227e-6, 1.923e-6, 1.669e-6, 1.462e-6,
2552 1.294e-6, 1.155e-6, 1.033e-6, 9.231e-7, 8.238e-7, 7.36e-7,
2553 6.564e-7, 5.869e-7, 5.236e-7, 4.673e-7, 4.174e-7, 3.736e-7,
2554 3.33e-7, 2.976e-7, 2.657e-7, 2.367e-7, 2.106e-7, 1.877e-7,
2555 1.671e-7, 1.494e-7, 1.332e-7, 1.192e-7, 1.065e-7, 9.558e-8,
2556 8.586e-8, 7.717e-8, 6.958e-8, 6.278e-8, 5.666e-8, 5.121e-8,
2557 4.647e-8, 4.213e-8, 3.815e-8, 3.459e-8, 3.146e-8, 2.862e-8,
2558 2.604e-8, 2.375e-8, 2.162e-8, 1.981e-8, 1.817e-8, 1.67e-8,
2559 1.537e-8, 1.417e-8, 1.31e-8, 1.215e-8, 1.128e-8, 1.05e-8,
2560 9.793e-9, 9.158e-9, 8.586e-9, 8.068e-9, 7.595e-9, 7.166e-9,
2561 6.778e-9, 6.427e-9, 6.108e-9, 5.826e-9, 5.571e-9, 5.347e-9,
2562 5.144e-9, 4.968e-9, 4.822e-9, 4.692e-9, 4.589e-9, 4.506e-9,
2563 4.467e-9, 4.44e-9, 4.466e-9, 4.515e-9, 4.718e-9, 4.729e-9,
2564 4.937e-9, 5.249e-9, 5.466e-9, 5.713e-9, 6.03e-9, 6.436e-9,
2565 6.741e-9, 7.33e-9, 7.787e-9, 8.414e-9, 8.908e-9, 9.868e-9,
2566 1.069e-8, 1.158e-8, 1.253e-8, 1.3e-8, 1.409e-8, 1.47e-8,
2567 1.548e-8, 1.612e-8, 1.666e-8, 1.736e-8, 1.763e-8, 1.812e-8,
2568 1.852e-8, 1.923e-8, 1.897e-8, 1.893e-8, 1.888e-8, 1.868e-8,
2569 1.895e-8, 1.899e-8, 1.876e-8, 1.96e-8, 2.02e-8, 2.121e-8,
2570 2.239e-8, 2.379e-8, 2.526e-8, 2.766e-8, 2.994e-8, 3.332e-8,
2571 3.703e-8, 4.158e-8, 4.774e-8, 5.499e-8, 6.355e-8, 7.349e-8,
2572 8.414e-8, 9.846e-8, 1.143e-7, 1.307e-7, 1.562e-7, 1.817e-7,
2573 2.011e-7, 2.192e-7, 2.485e-7, 2.867e-7, 3.035e-7, 3.223e-7,
2574 3.443e-7, 3.617e-7, 3.793e-7, 3.793e-7, 3.839e-7, 4.081e-7,
2575 4.117e-7, 4.085e-7, 3.92e-7, 3.851e-7, 3.754e-7, 3.49e-7,
2576 3.229e-7, 2.978e-7, 2.691e-7, 2.312e-7, 2.029e-7, 1.721e-7,
2577 1.472e-7, 1.308e-7, 1.132e-7, 9.736e-8, 8.458e-8, 7.402e-8,
2578 6.534e-8, 5.811e-8, 5.235e-8, 4.762e-8, 4.293e-8, 3.896e-8,
2579 3.526e-8, 3.165e-8, 2.833e-8, 2.551e-8, 2.288e-8, 2.036e-8,
2580 1.82e-8, 1.626e-8, 1.438e-8, 1.299e-8, 1.149e-8, 1.03e-8,
2581 9.148e-9, 8.122e-9, 7.264e-9, 6.425e-9, 5.777e-9, 5.06e-9,
2582 4.502e-9, 4.013e-9, 3.567e-9, 3.145e-9, 2.864e-9, 2.553e-9,
2583 2.311e-9, 2.087e-9, 1.886e-9, 1.716e-9, 1.556e-9, 1.432e-9,
2584 1.311e-9, 1.202e-9, 1.104e-9, 1.013e-9, 9.293e-10, 8.493e-10,
2585 7.79e-10, 7.185e-10, 6.642e-10, 6.141e-10, 5.684e-10, 5.346e-10,
2586 5.032e-10, 4.725e-10, 4.439e-10, 4.176e-10, 3.93e-10, 3.714e-10,
2587 3.515e-10, 3.332e-10, 3.167e-10, 3.02e-10, 2.887e-10, 2.769e-10,
2588 2.665e-10, 2.578e-10, 2.503e-10, 2.436e-10, 2.377e-10, 2.342e-10,
2589 2.305e-10, 2.296e-10, 2.278e-10, 2.321e-10, 2.355e-10, 2.402e-10,
2590 2.478e-10, 2.67e-10, 2.848e-10, 2.982e-10, 3.263e-10, 3.438e-10,
2591 3.649e-10, 3.829e-10, 4.115e-10, 4.264e-10, 4.473e-10, 4.63e-10,
2592 4.808e-10, 4.995e-10, 5.142e-10, 5.313e-10, 5.318e-10, 5.358e-10,
2593 5.452e-10, 5.507e-10, 5.698e-10, 5.782e-10, 5.983e-10, 6.164e-10,
2594 6.532e-10, 6.811e-10, 7.624e-10, 8.302e-10, 9.067e-10, 9.937e-10,
2595 1.104e-9, 1.221e-9, 1.361e-9, 1.516e-9, 1.675e-9, 1.883e-9,
2596 2.101e-9, 2.349e-9, 2.614e-9, 2.92e-9, 3.305e-9, 3.724e-9,
2597 4.142e-9, 4.887e-9, 5.614e-9, 6.506e-9, 7.463e-9, 8.817e-9,
2598 9.849e-9, 1.187e-8, 1.321e-8, 1.474e-8, 1.698e-8, 1.794e-8,
2599 2.09e-8, 2.211e-8, 2.362e-8, 2.556e-8, 2.729e-8, 2.88e-8,
2600 3.046e-8, 3.167e-8, 3.367e-8, 3.457e-8, 3.59e-8, 3.711e-8,
2601 3.826e-8, 4.001e-8, 4.211e-8, 4.315e-8, 4.661e-8, 5.01e-8,
2602 5.249e-8, 5.84e-8, 6.628e-8, 7.512e-8, 8.253e-8, 9.722e-8,
2603 1.067e-7, 1.153e-7, 1.347e-7, 1.428e-7, 1.577e-7, 1.694e-7,
2604 1.833e-7, 1.938e-7, 2.108e-7, 2.059e-7, 2.157e-7, 2.185e-7,
2605 2.208e-7, 2.182e-7, 2.093e-7, 2.014e-7, 1.962e-7, 1.819e-7,
2606 1.713e-7, 1.51e-7, 1.34e-7, 1.154e-7, 9.89e-8, 8.88e-8, 7.673e-8,
2607 6.599e-8, 5.73e-8, 5.081e-8, 4.567e-8, 4.147e-8, 3.773e-8,
2608 3.46e-8, 3.194e-8, 2.953e-8, 2.759e-8, 2.594e-8, 2.442e-8,
2609 2.355e-8, 2.283e-8, 2.279e-8, 2.231e-8, 2.279e-8, 2.239e-8,
2610 2.21e-8, 2.309e-8, 2.293e-8, 2.352e-8, 2.415e-8, 2.43e-8,
2611 2.426e-8, 2.465e-8, 2.5e-8, 2.496e-8, 2.465e-8, 2.445e-8,
2612 2.383e-8, 2.299e-8, 2.165e-8, 2.113e-8, 1.968e-8, 1.819e-8,
2613 1.644e-8, 1.427e-8, 1.27e-8, 1.082e-8, 9.428e-9, 8.091e-9,
2614 6.958e-9, 5.988e-9, 5.246e-9, 4.601e-9, 4.098e-9, 3.664e-9,
2615 3.287e-9, 2.942e-9, 2.656e-9, 2.364e-9, 2.118e-9, 1.903e-9,
2616 1.703e-9, 1.525e-9, 1.365e-9, 1.229e-9, 1.107e-9, 9.96e-10,
2617 8.945e-10, 8.08e-10, 7.308e-10, 6.616e-10, 5.994e-10, 5.422e-10,
2618 4.929e-10, 4.478e-10, 4.07e-10, 3.707e-10, 3.379e-10, 3.087e-10,
2619 2.823e-10, 2.592e-10, 2.385e-10, 2.201e-10, 2.038e-10, 1.897e-10,
2620 1.774e-10, 1.667e-10, 1.577e-10, 1.502e-10, 1.437e-10, 1.394e-10,
2621 1.358e-10, 1.324e-10, 1.329e-10, 1.324e-10, 1.36e-10, 1.39e-10,
2622 1.424e-10, 1.544e-10, 1.651e-10, 1.817e-10, 1.984e-10, 2.195e-10,
2623 2.438e-10, 2.7e-10, 2.991e-10, 3.322e-10, 3.632e-10, 3.957e-10,
2624 4.36e-10, 4.701e-10, 5.03e-10, 5.381e-10, 5.793e-10, 6.19e-10,
2625 6.596e-10, 7.004e-10, 7.561e-10, 7.934e-10, 8.552e-10, 9.142e-10,
2626 9.57e-10, 1.027e-9, 1.097e-9, 1.193e-9, 1.334e-9, 1.47e-9,
2627 1.636e-9, 1.871e-9, 2.122e-9, 2.519e-9, 2.806e-9, 3.203e-9,
2628 3.846e-9, 4.362e-9, 5.114e-9, 5.643e-9, 6.305e-9, 6.981e-9,
2629 7.983e-9, 8.783e-9, 9.419e-9, 1.017e-8, 1.063e-8, 1.121e-8,
2630 1.13e-8, 1.201e-8, 1.225e-8, 1.232e-8, 1.223e-8, 1.177e-8,
2631 1.151e-8, 1.116e-8, 1.047e-8, 9.698e-9, 8.734e-9, 8.202e-9,
2632 7.041e-9, 6.074e-9, 5.172e-9, 4.468e-9, 3.913e-9, 3.414e-9,
2633 2.975e-9, 2.65e-9, 2.406e-9, 2.173e-9, 2.009e-9, 1.861e-9,
2634 1.727e-9, 1.612e-9, 1.514e-9, 1.43e-9, 1.362e-9, 1.333e-9,
2635 1.288e-9, 1.249e-9, 1.238e-9, 1.228e-9, 1.217e-9, 1.202e-9,
2636 1.209e-9, 1.177e-9, 1.157e-9, 1.165e-9, 1.142e-9, 1.131e-9,
2637 1.138e-9, 1.117e-9, 1.1e-9, 1.069e-9, 1.023e-9, 1.005e-9,
2638 9.159e-10, 8.863e-10, 7.865e-10, 7.153e-10, 6.247e-10, 5.846e-10,
2639 5.133e-10, 4.36e-10, 3.789e-10, 3.335e-10, 2.833e-10, 2.483e-10,
2640 2.155e-10, 1.918e-10, 1.709e-10, 1.529e-10, 1.374e-10, 1.235e-10,
2641 1.108e-10, 9.933e-11, 8.932e-11, 8.022e-11, 7.224e-11, 6.52e-11,
2642 5.896e-11, 5.328e-11, 4.813e-11, 4.365e-11, 3.961e-11, 3.594e-11,
2643 3.266e-11, 2.967e-11, 2.701e-11, 2.464e-11, 2.248e-11, 2.054e-11,
2644 1.878e-11, 1.721e-11, 1.579e-11, 1.453e-11, 1.341e-11, 1.241e-11,
2645 1.154e-11, 1.078e-11, 1.014e-11, 9.601e-12, 9.167e-12, 8.838e-12,
2646 8.614e-12, 8.493e-12, 8.481e-12, 8.581e-12, 8.795e-12, 9.131e-12,
2647 9.601e-12, 1.021e-11, 1.097e-11, 1.191e-11, 1.303e-11, 1.439e-11,
2648 1.601e-11, 1.778e-11, 1.984e-11, 2.234e-11, 2.474e-11, 2.766e-11,
2649 3.085e-11, 3.415e-11, 3.821e-11, 4.261e-11, 4.748e-11, 5.323e-11,
2650 5.935e-11, 6.619e-11, 7.418e-11, 8.294e-11, 9.26e-11, 1.039e-10,
2651 1.156e-10, 1.297e-10, 1.46e-10, 1.641e-10, 1.858e-10, 2.1e-10,
2652 2.383e-10, 2.724e-10, 3.116e-10, 3.538e-10, 4.173e-10, 4.727e-10,
2653 5.503e-10, 6.337e-10, 7.32e-10, 8.298e-10, 9.328e-10, 1.059e-9,
2654 1.176e-9, 1.328e-9, 1.445e-9, 1.593e-9, 1.77e-9, 1.954e-9,
2655 2.175e-9, 2.405e-9, 2.622e-9, 2.906e-9, 3.294e-9, 3.713e-9,
2656 3.98e-9, 4.384e-9, 4.987e-9, 5.311e-9, 5.874e-9, 6.337e-9,
2657 7.027e-9, 7.39e-9, 7.769e-9, 8.374e-9, 8.605e-9, 9.165e-9,
2658 9.415e-9, 9.511e-9, 9.704e-9, 9.588e-9, 9.45e-9, 9.086e-9,
2659 8.798e-9, 8.469e-9, 7.697e-9, 7.168e-9, 6.255e-9, 5.772e-9,
2660 4.97e-9, 4.271e-9, 3.653e-9, 3.154e-9, 2.742e-9, 2.435e-9,
2661 2.166e-9, 1.936e-9, 1.731e-9, 1.556e-9, 1.399e-9, 1.272e-9,
2662 1.157e-9, 1.066e-9, 9.844e-10, 9.258e-10, 8.787e-10, 8.421e-10,
2663 8.083e-10, 8.046e-10, 8.067e-10, 8.181e-10, 8.325e-10, 8.517e-10,
2664 9.151e-10, 9.351e-10, 9.677e-10, 1.071e-9, 1.126e-9, 1.219e-9,
2665 1.297e-9, 1.408e-9, 1.476e-9, 1.517e-9, 1.6e-9, 1.649e-9,
2666 1.678e-9, 1.746e-9, 1.742e-9, 1.728e-9, 1.699e-9, 1.655e-9,
2667 1.561e-9, 1.48e-9, 1.451e-9, 1.411e-9, 1.171e-9, 1.106e-9,
2668 9.714e-10, 8.523e-10, 7.346e-10, 6.241e-10, 5.371e-10, 4.704e-10,
2669 4.144e-10, 3.683e-10, 3.292e-10, 2.942e-10, 2.62e-10, 2.341e-10,
2670 2.104e-10, 1.884e-10, 1.7e-10, 1.546e-10, 1.394e-10, 1.265e-10,
2671 1.14e-10, 1.019e-10, 9.279e-11, 8.283e-11, 7.458e-11, 6.668e-11,
2672 5.976e-11, 5.33e-11, 4.794e-11, 4.289e-11, 3.841e-11, 3.467e-11,
2673 3.13e-11, 2.832e-11, 2.582e-11, 2.356e-11, 2.152e-11, 1.97e-11,
2674 1.808e-11, 1.664e-11, 1.539e-11, 1.434e-11, 1.344e-11, 1.269e-11,
2675 1.209e-11, 1.162e-11, 1.129e-11, 1.108e-11, 1.099e-11, 1.103e-11,
2676 1.119e-11, 1.148e-11, 1.193e-11, 1.252e-11, 1.329e-11, 1.421e-11,
2677 1.555e-11, 1.685e-11, 1.839e-11, 2.054e-11, 2.317e-11, 2.571e-11,
2678 2.839e-11, 3.171e-11, 3.49e-11, 3.886e-11, 4.287e-11, 4.645e-11,
2679 5.047e-11, 5.592e-11, 6.109e-11, 6.628e-11, 7.381e-11, 8.088e-11,
2680 8.966e-11, 1.045e-10, 1.12e-10, 1.287e-10, 1.486e-10, 1.662e-10,
2681 1.866e-10, 2.133e-10, 2.524e-10, 2.776e-10, 3.204e-10, 3.559e-10,
2682 4.028e-10, 4.448e-10, 4.882e-10, 5.244e-10, 5.605e-10, 6.018e-10,
2683 6.328e-10, 6.579e-10, 6.541e-10, 7.024e-10, 7.074e-10, 7.068e-10,
2684 7.009e-10, 6.698e-10, 6.545e-10, 6.209e-10, 5.834e-10, 5.412e-10,
2685 5.001e-10, 4.231e-10, 3.727e-10, 3.211e-10, 2.833e-10, 2.447e-10,
2686 2.097e-10, 1.843e-10, 1.639e-10, 1.449e-10, 1.27e-10, 1.161e-10,
2687 1.033e-10, 9.282e-11, 8.407e-11, 7.639e-11, 7.023e-11, 6.474e-11,
2688 6.142e-11, 5.76e-11, 5.568e-11, 5.472e-11, 5.39e-11, 5.455e-11,
2689 5.54e-11, 5.587e-11, 6.23e-11, 6.49e-11, 6.868e-11, 7.382e-11,
2690 8.022e-11, 8.372e-11, 9.243e-11, 1.004e-10, 1.062e-10, 1.13e-10,
2691 1.176e-10, 1.244e-10, 1.279e-10, 1.298e-10, 1.302e-10, 1.312e-10,
2692 1.295e-10, 1.244e-10, 1.211e-10, 1.167e-10, 1.098e-10, 9.927e-11,
2693 8.854e-11, 8.011e-11, 7.182e-11, 5.923e-11, 5.212e-11, 4.453e-11,
2694 3.832e-11, 3.371e-11, 2.987e-11, 2.651e-11, 2.354e-11, 2.093e-11,
2695 1.863e-11, 1.662e-11, 1.486e-11, 1.331e-11, 1.193e-11, 1.071e-11,
2696 9.628e-12, 8.66e-12, 7.801e-12, 7.031e-12, 6.347e-12, 5.733e-12,
2697 5.182e-12, 4.695e-12, 4.26e-12, 3.874e-12, 3.533e-12, 3.235e-12,
2698 2.979e-12, 2.76e-12, 2.579e-12, 2.432e-12, 2.321e-12, 2.246e-12,
2699 2.205e-12, 2.196e-12, 2.223e-12, 2.288e-12, 2.387e-12, 2.525e-12,
2700 2.704e-12, 2.925e-12, 3.191e-12, 3.508e-12, 3.876e-12, 4.303e-12,
2701 4.793e-12, 5.347e-12, 5.978e-12, 6.682e-12, 7.467e-12, 8.34e-12,
2702 9.293e-12, 1.035e-11, 1.152e-11, 1.285e-11, 1.428e-11, 1.586e-11,
2703 1.764e-11, 1.972e-11, 2.214e-11, 2.478e-11, 2.776e-11, 3.151e-11,
2704 3.591e-11, 4.103e-11, 4.66e-11, 5.395e-11, 6.306e-11, 7.172e-11,
2705 8.358e-11, 9.67e-11, 1.11e-10, 1.325e-10, 1.494e-10, 1.736e-10,
2706 2.007e-10, 2.296e-10, 2.608e-10, 3.004e-10, 3.361e-10, 3.727e-10,
2707 4.373e-10, 4.838e-10, 5.483e-10, 6.006e-10, 6.535e-10, 6.899e-10,
2708 7.687e-10, 8.444e-10, 8.798e-10, 9.135e-10, 9.532e-10, 9.757e-10,
2709 9.968e-10, 1.006e-9, 9.949e-10, 9.789e-10, 9.564e-10, 9.215e-10,
2710 8.51e-10, 8.394e-10, 7.707e-10, 7.152e-10, 6.274e-10, 5.598e-10,
2711 5.028e-10, 4.3e-10, 3.71e-10, 3.245e-10, 2.809e-10, 2.461e-10,
2712 2.154e-10, 1.91e-10, 1.685e-10, 1.487e-10, 1.313e-10, 1.163e-10,
2713 1.031e-10, 9.172e-11, 8.221e-11, 7.382e-11, 6.693e-11, 6.079e-11,
2714 5.581e-11, 5.167e-11, 4.811e-11, 4.506e-11, 4.255e-11, 4.083e-11,
2715 3.949e-11, 3.881e-11, 3.861e-11, 3.858e-11, 3.951e-11, 4.045e-11,
2716 4.24e-11, 4.487e-11, 4.806e-11, 5.133e-11, 5.518e-11, 5.919e-11,
2717 6.533e-11, 7.031e-11, 7.762e-11, 8.305e-11, 9.252e-11, 9.727e-11,
2718 1.045e-10, 1.117e-10, 1.2e-10, 1.275e-10, 1.341e-10, 1.362e-10,
2719 1.438e-10, 1.45e-10, 1.455e-10, 1.455e-10, 1.434e-10, 1.381e-10,
2720 1.301e-10, 1.276e-10, 1.163e-10, 1.089e-10, 9.911e-11, 8.943e-11,
2721 7.618e-11, 6.424e-11, 5.717e-11, 4.866e-11, 4.257e-11, 3.773e-11,
2722 3.331e-11, 2.958e-11, 2.629e-11, 2.316e-11, 2.073e-11, 1.841e-11,
2723 1.635e-11, 1.464e-11, 1.31e-11, 1.16e-11, 1.047e-11, 9.408e-12,
2724 8.414e-12, 7.521e-12, 6.705e-12, 5.993e-12, 5.371e-12, 4.815e-12,
2725 4.338e-12, 3.921e-12, 3.567e-12, 3.265e-12, 3.01e-12, 2.795e-12,
2726 2.613e-12, 2.464e-12, 2.346e-12, 2.256e-12, 2.195e-12, 2.165e-12,
2727 2.166e-12, 2.198e-12, 2.262e-12, 2.364e-12, 2.502e-12, 2.682e-12,
2728 2.908e-12, 3.187e-12, 3.533e-12, 3.946e-12, 4.418e-12, 5.013e-12,
2729 5.708e-12, 6.379e-12, 7.43e-12, 8.39e-12, 9.51e-12, 1.078e-11,
2730 1.259e-11, 1.438e-11, 1.63e-11, 1.814e-11, 2.055e-11, 2.348e-11,
2731 2.664e-11, 2.956e-11, 3.3e-11, 3.677e-11, 4.032e-11, 4.494e-11,
2732 4.951e-11, 5.452e-11, 6.014e-11, 6.5e-11, 6.915e-11, 7.45e-11,
2733 7.971e-11, 8.468e-11, 8.726e-11, 8.995e-11, 9.182e-11, 9.509e-11,
2734 9.333e-11, 9.386e-11, 9.457e-11, 9.21e-11, 9.019e-11, 8.68e-11,
2735 8.298e-11, 7.947e-11, 7.46e-11, 7.082e-11, 6.132e-11, 5.855e-11,
2736 5.073e-11, 4.464e-11, 3.825e-11, 3.375e-11, 2.911e-11, 2.535e-11,
2737 2.16e-11, 1.907e-11, 1.665e-11, 1.463e-11, 1.291e-11, 1.133e-11,
2738 9.997e-12, 8.836e-12, 7.839e-12, 6.943e-12, 6.254e-12, 5.6e-12,
2739 5.029e-12, 4.529e-12, 4.102e-12, 3.737e-12, 3.428e-12, 3.169e-12,
2740 2.959e-12, 2.798e-12, 2.675e-12, 2.582e-12, 2.644e-12, 2.557e-12,
2741 2.614e-12, 2.717e-12, 2.874e-12, 3.056e-12, 3.187e-12, 3.631e-12,
2742 3.979e-12, 4.248e-12, 4.817e-12, 5.266e-12, 5.836e-12, 6.365e-12,
2743 6.807e-12, 7.47e-12, 7.951e-12, 8.636e-12, 8.972e-12, 9.314e-12,
2744 9.445e-12, 1.003e-11, 1.013e-11, 9.937e-12, 9.729e-12, 9.064e-12,
2745 9.119e-12, 9.124e-12, 8.704e-12, 8.078e-12, 7.47e-12, 6.329e-12,
2746 5.674e-12, 4.808e-12, 4.119e-12, 3.554e-12, 3.103e-12, 2.731e-12,
2747 2.415e-12, 2.15e-12, 1.926e-12, 1.737e-12, 1.578e-12, 1.447e-12,
2748 1.34e-12, 1.255e-12, 1.191e-12, 1.146e-12, 1.121e-12, 1.114e-12,
2749 1.126e-12, 1.156e-12, 1.207e-12, 1.278e-12, 1.372e-12, 1.49e-12,
2750 1.633e-12, 1.805e-12, 2.01e-12, 2.249e-12, 2.528e-12, 2.852e-12,
2751 3.228e-12, 3.658e-12, 4.153e-12, 4.728e-12, 5.394e-12, 6.176e-12,
2752 7.126e-12, 8.188e-12, 9.328e-12, 1.103e-11, 1.276e-11, 1.417e-11,
2753 1.615e-11, 1.84e-11, 2.155e-11, 2.429e-11, 2.826e-11, 3.222e-11,
2754 3.664e-11, 4.14e-11, 4.906e-11, 5.536e-11, 6.327e-11, 7.088e-11,
2755 8.316e-11, 9.242e-11, 1.07e-10, 1.223e-10, 1.341e-10, 1.553e-10,
2756 1.703e-10, 1.9e-10, 2.022e-10, 2.233e-10, 2.345e-10, 2.438e-10,
2757 2.546e-10, 2.599e-10, 2.661e-10, 2.703e-10, 2.686e-10, 2.662e-10,
2758 2.56e-10, 2.552e-10, 2.378e-10, 2.252e-10, 2.146e-10, 1.885e-10,
2759 1.668e-10, 1.441e-10, 1.295e-10, 1.119e-10, 9.893e-11, 8.687e-11,
2760 7.678e-11, 6.685e-11, 5.879e-11, 5.127e-11, 4.505e-11, 3.997e-11,
2761 3.511e-11
2762 };
2763
2764 static const double h2ofrn[2001] = { .01095, .01126, .01205, .01322, .0143,
2765 .01506, .01548, .01534, .01486, .01373, .01262, .01134, .01001,
2766 .008702, .007475, .006481, .00548, .0046, .003833, .00311,
2767 .002543, .002049, .00168, .001374, .001046, 8.193e-4, 6.267e-4,
2768 4.968e-4, 3.924e-4, 2.983e-4, 2.477e-4, 1.997e-4, 1.596e-4,
2769 1.331e-4, 1.061e-4, 8.942e-5, 7.168e-5, 5.887e-5, 4.848e-5,
2770 3.817e-5, 3.17e-5, 2.579e-5, 2.162e-5, 1.768e-5, 1.49e-5,
2771 1.231e-5, 1.013e-5, 8.555e-6, 7.328e-6, 6.148e-6, 5.207e-6,
2772 4.387e-6, 3.741e-6, 3.22e-6, 2.753e-6, 2.346e-6, 1.985e-6,
2773 1.716e-6, 1.475e-6, 1.286e-6, 1.122e-6, 9.661e-7, 8.284e-7,
2774 7.057e-7, 6.119e-7, 5.29e-7, 4.571e-7, 3.948e-7, 3.432e-7,
2775 2.983e-7, 2.589e-7, 2.265e-7, 1.976e-7, 1.704e-7, 1.456e-7,
2776 1.26e-7, 1.101e-7, 9.648e-8, 8.415e-8, 7.34e-8, 6.441e-8,
2777 5.643e-8, 4.94e-8, 4.276e-8, 3.703e-8, 3.227e-8, 2.825e-8,
2778 2.478e-8, 2.174e-8, 1.898e-8, 1.664e-8, 1.458e-8, 1.278e-8,
2779 1.126e-8, 9.891e-9, 8.709e-9, 7.652e-9, 6.759e-9, 5.975e-9,
2780 5.31e-9, 4.728e-9, 4.214e-9, 3.792e-9, 3.463e-9, 3.226e-9,
2781 2.992e-9, 2.813e-9, 2.749e-9, 2.809e-9, 2.913e-9, 3.037e-9,
2782 3.413e-9, 3.738e-9, 4.189e-9, 4.808e-9, 5.978e-9, 7.088e-9,
2783 8.071e-9, 9.61e-9, 1.21e-8, 1.5e-8, 1.764e-8, 2.221e-8, 2.898e-8,
2784 3.948e-8, 5.068e-8, 6.227e-8, 7.898e-8, 1.033e-7, 1.437e-7,
2785 1.889e-7, 2.589e-7, 3.59e-7, 4.971e-7, 7.156e-7, 9.983e-7,
2786 1.381e-6, 1.929e-6, 2.591e-6, 3.453e-6, 4.57e-6, 5.93e-6,
2787 7.552e-6, 9.556e-6, 1.183e-5, 1.425e-5, 1.681e-5, 1.978e-5,
2788 2.335e-5, 2.668e-5, 3.022e-5, 3.371e-5, 3.715e-5, 3.967e-5,
2789 4.06e-5, 4.01e-5, 3.809e-5, 3.491e-5, 3.155e-5, 2.848e-5,
2790 2.678e-5, 2.66e-5, 2.811e-5, 3.071e-5, 3.294e-5, 3.459e-5,
2791 3.569e-5, 3.56e-5, 3.434e-5, 3.186e-5, 2.916e-5, 2.622e-5,
2792 2.275e-5, 1.918e-5, 1.62e-5, 1.373e-5, 1.182e-5, 1.006e-5,
2793 8.556e-6, 7.26e-6, 6.107e-6, 5.034e-6, 4.211e-6, 3.426e-6,
2794 2.865e-6, 2.446e-6, 1.998e-6, 1.628e-6, 1.242e-6, 1.005e-6,
2795 7.853e-7, 6.21e-7, 5.071e-7, 4.156e-7, 3.548e-7, 2.825e-7,
2796 2.261e-7, 1.916e-7, 1.51e-7, 1.279e-7, 1.059e-7, 9.14e-8,
2797 7.707e-8, 6.17e-8, 5.311e-8, 4.263e-8, 3.518e-8, 2.961e-8,
2798 2.457e-8, 2.119e-8, 1.712e-8, 1.439e-8, 1.201e-8, 1.003e-8,
2799 8.564e-9, 7.199e-9, 6.184e-9, 5.206e-9, 4.376e-9, 3.708e-9,
2800 3.157e-9, 2.725e-9, 2.361e-9, 2.074e-9, 1.797e-9, 1.562e-9,
2801 1.364e-9, 1.196e-9, 1.042e-9, 8.862e-10, 7.648e-10, 6.544e-10,
2802 5.609e-10, 4.791e-10, 4.108e-10, 3.531e-10, 3.038e-10, 2.618e-10,
2803 2.268e-10, 1.969e-10, 1.715e-10, 1.496e-10, 1.308e-10, 1.147e-10,
2804 1.008e-10, 8.894e-11, 7.885e-11, 7.031e-11, 6.355e-11, 5.854e-11,
2805 5.534e-11, 5.466e-11, 5.725e-11, 6.447e-11, 7.943e-11, 1.038e-10,
2806 1.437e-10, 2.04e-10, 2.901e-10, 4.051e-10, 5.556e-10, 7.314e-10,
2807 9.291e-10, 1.134e-9, 1.321e-9, 1.482e-9, 1.596e-9, 1.669e-9,
2808 1.715e-9, 1.762e-9, 1.817e-9, 1.828e-9, 1.848e-9, 1.873e-9,
2809 1.902e-9, 1.894e-9, 1.864e-9, 1.841e-9, 1.797e-9, 1.704e-9,
2810 1.559e-9, 1.382e-9, 1.187e-9, 1.001e-9, 8.468e-10, 7.265e-10,
2811 6.521e-10, 6.381e-10, 6.66e-10, 7.637e-10, 9.705e-10, 1.368e-9,
2812 1.856e-9, 2.656e-9, 3.954e-9, 5.96e-9, 8.72e-9, 1.247e-8,
2813 1.781e-8, 2.491e-8, 3.311e-8, 4.272e-8, 5.205e-8, 6.268e-8,
2814 7.337e-8, 8.277e-8, 9.185e-8, 1.004e-7, 1.091e-7, 1.159e-7,
2815 1.188e-7, 1.175e-7, 1.124e-7, 1.033e-7, 9.381e-8, 8.501e-8,
2816 7.956e-8, 7.894e-8, 8.331e-8, 9.102e-8, 9.836e-8, 1.035e-7,
2817 1.064e-7, 1.06e-7, 1.032e-7, 9.808e-8, 9.139e-8, 8.442e-8,
2818 7.641e-8, 6.881e-8, 6.161e-8, 5.404e-8, 4.804e-8, 4.446e-8,
2819 4.328e-8, 4.259e-8, 4.421e-8, 4.673e-8, 4.985e-8, 5.335e-8,
2820 5.796e-8, 6.542e-8, 7.714e-8, 8.827e-8, 1.04e-7, 1.238e-7,
2821 1.499e-7, 1.829e-7, 2.222e-7, 2.689e-7, 3.303e-7, 3.981e-7,
2822 4.84e-7, 5.91e-7, 7.363e-7, 9.087e-7, 1.139e-6, 1.455e-6,
2823 1.866e-6, 2.44e-6, 3.115e-6, 3.941e-6, 4.891e-6, 5.992e-6,
2824 7.111e-6, 8.296e-6, 9.21e-6, 9.987e-6, 1.044e-5, 1.073e-5,
2825 1.092e-5, 1.106e-5, 1.138e-5, 1.171e-5, 1.186e-5, 1.186e-5,
2826 1.179e-5, 1.166e-5, 1.151e-5, 1.16e-5, 1.197e-5, 1.241e-5,
2827 1.268e-5, 1.26e-5, 1.184e-5, 1.063e-5, 9.204e-6, 7.584e-6,
2828 6.053e-6, 4.482e-6, 3.252e-6, 2.337e-6, 1.662e-6, 1.18e-6,
2829 8.15e-7, 5.95e-7, 4.354e-7, 3.302e-7, 2.494e-7, 1.93e-7,
2830 1.545e-7, 1.25e-7, 1.039e-7, 8.602e-8, 7.127e-8, 5.897e-8,
2831 4.838e-8, 4.018e-8, 3.28e-8, 2.72e-8, 2.307e-8, 1.972e-8,
2832 1.654e-8, 1.421e-8, 1.174e-8, 1.004e-8, 8.739e-9, 7.358e-9,
2833 6.242e-9, 5.303e-9, 4.567e-9, 3.94e-9, 3.375e-9, 2.864e-9,
2834 2.422e-9, 2.057e-9, 1.75e-9, 1.505e-9, 1.294e-9, 1.101e-9,
2835 9.401e-10, 8.018e-10, 6.903e-10, 5.965e-10, 5.087e-10, 4.364e-10,
2836 3.759e-10, 3.247e-10, 2.809e-10, 2.438e-10, 2.123e-10, 1.853e-10,
2837 1.622e-10, 1.426e-10, 1.26e-10, 1.125e-10, 1.022e-10, 9.582e-11,
2838 9.388e-11, 9.801e-11, 1.08e-10, 1.276e-10, 1.551e-10, 1.903e-10,
2839 2.291e-10, 2.724e-10, 3.117e-10, 3.4e-10, 3.562e-10, 3.625e-10,
2840 3.619e-10, 3.429e-10, 3.221e-10, 2.943e-10, 2.645e-10, 2.338e-10,
2841 2.062e-10, 1.901e-10, 1.814e-10, 1.827e-10, 1.906e-10, 1.984e-10,
2842 2.04e-10, 2.068e-10, 2.075e-10, 2.018e-10, 1.959e-10, 1.897e-10,
2843 1.852e-10, 1.791e-10, 1.696e-10, 1.634e-10, 1.598e-10, 1.561e-10,
2844 1.518e-10, 1.443e-10, 1.377e-10, 1.346e-10, 1.342e-10, 1.375e-10,
2845 1.525e-10, 1.767e-10, 2.108e-10, 2.524e-10, 2.981e-10, 3.477e-10,
2846 4.262e-10, 5.326e-10, 6.646e-10, 8.321e-10, 1.069e-9, 1.386e-9,
2847 1.743e-9, 2.216e-9, 2.808e-9, 3.585e-9, 4.552e-9, 5.907e-9,
2848 7.611e-9, 9.774e-9, 1.255e-8, 1.666e-8, 2.279e-8, 3.221e-8,
2849 4.531e-8, 6.4e-8, 9.187e-8, 1.295e-7, 1.825e-7, 2.431e-7,
2850 3.181e-7, 4.009e-7, 4.941e-7, 5.88e-7, 6.623e-7, 7.155e-7,
2851 7.451e-7, 7.594e-7, 7.541e-7, 7.467e-7, 7.527e-7, 7.935e-7,
2852 8.461e-7, 8.954e-7, 9.364e-7, 9.843e-7, 1.024e-6, 1.05e-6,
2853 1.059e-6, 1.074e-6, 1.072e-6, 1.043e-6, 9.789e-7, 8.803e-7,
2854 7.662e-7, 6.378e-7, 5.133e-7, 3.958e-7, 2.914e-7, 2.144e-7,
2855 1.57e-7, 1.14e-7, 8.47e-8, 6.2e-8, 4.657e-8, 3.559e-8, 2.813e-8,
2856 2.222e-8, 1.769e-8, 1.391e-8, 1.125e-8, 9.186e-9, 7.704e-9,
2857 6.447e-9, 5.381e-9, 4.442e-9, 3.669e-9, 3.057e-9, 2.564e-9,
2858 2.153e-9, 1.784e-9, 1.499e-9, 1.281e-9, 1.082e-9, 9.304e-10,
2859 8.169e-10, 6.856e-10, 5.866e-10, 5.043e-10, 4.336e-10, 3.731e-10,
2860 3.175e-10, 2.745e-10, 2.374e-10, 2.007e-10, 1.737e-10, 1.508e-10,
2861 1.302e-10, 1.13e-10, 9.672e-11, 8.375e-11, 7.265e-11, 6.244e-11,
2862 5.343e-11, 4.654e-11, 3.975e-11, 3.488e-11, 3.097e-11, 2.834e-11,
2863 2.649e-11, 2.519e-11, 2.462e-11, 2.443e-11, 2.44e-11, 2.398e-11,
2864 2.306e-11, 2.183e-11, 2.021e-11, 1.821e-11, 1.599e-11, 1.403e-11,
2865 1.196e-11, 1.023e-11, 8.728e-12, 7.606e-12, 6.941e-12, 6.545e-12,
2866 6.484e-12, 6.6e-12, 6.718e-12, 6.785e-12, 6.746e-12, 6.724e-12,
2867 6.764e-12, 6.995e-12, 7.144e-12, 7.32e-12, 7.33e-12, 7.208e-12,
2868 6.789e-12, 6.09e-12, 5.337e-12, 4.62e-12, 4.037e-12, 3.574e-12,
2869 3.311e-12, 3.346e-12, 3.566e-12, 3.836e-12, 4.076e-12, 4.351e-12,
2870 4.691e-12, 5.114e-12, 5.427e-12, 6.167e-12, 7.436e-12, 8.842e-12,
2871 1.038e-11, 1.249e-11, 1.54e-11, 1.915e-11, 2.48e-11, 3.256e-11,
2872 4.339e-11, 5.611e-11, 7.519e-11, 1.037e-10, 1.409e-10, 1.883e-10,
2873 2.503e-10, 3.38e-10, 4.468e-10, 5.801e-10, 7.335e-10, 8.98e-10,
2874 1.11e-9, 1.363e-9, 1.677e-9, 2.104e-9, 2.681e-9, 3.531e-9,
2875 4.621e-9, 6.106e-9, 8.154e-9, 1.046e-8, 1.312e-8, 1.607e-8,
2876 1.948e-8, 2.266e-8, 2.495e-8, 2.655e-8, 2.739e-8, 2.739e-8,
2877 2.662e-8, 2.589e-8, 2.59e-8, 2.664e-8, 2.833e-8, 3.023e-8,
2878 3.305e-8, 3.558e-8, 3.793e-8, 3.961e-8, 4.056e-8, 4.102e-8,
2879 4.025e-8, 3.917e-8, 3.706e-8, 3.493e-8, 3.249e-8, 3.096e-8,
2880 3.011e-8, 3.111e-8, 3.395e-8, 3.958e-8, 4.875e-8, 6.066e-8,
2881 7.915e-8, 1.011e-7, 1.3e-7, 1.622e-7, 2.003e-7, 2.448e-7,
2882 2.863e-7, 3.317e-7, 3.655e-7, 3.96e-7, 4.098e-7, 4.168e-7,
2883 4.198e-7, 4.207e-7, 4.289e-7, 4.384e-7, 4.471e-7, 4.524e-7,
2884 4.574e-7, 4.633e-7, 4.785e-7, 5.028e-7, 5.371e-7, 5.727e-7,
2885 5.955e-7, 5.998e-7, 5.669e-7, 5.082e-7, 4.397e-7, 3.596e-7,
2886 2.814e-7, 2.074e-7, 1.486e-7, 1.057e-7, 7.25e-8, 4.946e-8,
2887 3.43e-8, 2.447e-8, 1.793e-8, 1.375e-8, 1.096e-8, 9.091e-9,
2888 7.709e-9, 6.631e-9, 5.714e-9, 4.886e-9, 4.205e-9, 3.575e-9,
2889 3.07e-9, 2.631e-9, 2.284e-9, 2.002e-9, 1.745e-9, 1.509e-9,
2890 1.284e-9, 1.084e-9, 9.163e-10, 7.663e-10, 6.346e-10, 5.283e-10,
2891 4.354e-10, 3.59e-10, 2.982e-10, 2.455e-10, 2.033e-10, 1.696e-10,
2892 1.432e-10, 1.211e-10, 1.02e-10, 8.702e-11, 7.38e-11, 6.293e-11,
2893 5.343e-11, 4.532e-11, 3.907e-11, 3.365e-11, 2.945e-11, 2.558e-11,
2894 2.192e-11, 1.895e-11, 1.636e-11, 1.42e-11, 1.228e-11, 1.063e-11,
2895 9.348e-12, 8.2e-12, 7.231e-12, 6.43e-12, 5.702e-12, 5.052e-12,
2896 4.469e-12, 4e-12, 3.679e-12, 3.387e-12, 3.197e-12, 3.158e-12,
2897 3.327e-12, 3.675e-12, 4.292e-12, 5.437e-12, 7.197e-12, 1.008e-11,
2898 1.437e-11, 2.035e-11, 2.905e-11, 4.062e-11, 5.528e-11, 7.177e-11,
2899 9.064e-11, 1.109e-10, 1.297e-10, 1.473e-10, 1.652e-10, 1.851e-10,
2900 2.079e-10, 2.313e-10, 2.619e-10, 2.958e-10, 3.352e-10, 3.796e-10,
2901 4.295e-10, 4.923e-10, 5.49e-10, 5.998e-10, 6.388e-10, 6.645e-10,
2902 6.712e-10, 6.549e-10, 6.38e-10, 6.255e-10, 6.253e-10, 6.459e-10,
2903 6.977e-10, 7.59e-10, 8.242e-10, 8.92e-10, 9.403e-10, 9.701e-10,
2904 9.483e-10, 9.135e-10, 8.617e-10, 7.921e-10, 7.168e-10, 6.382e-10,
2905 5.677e-10, 5.045e-10, 4.572e-10, 4.312e-10, 4.145e-10, 4.192e-10,
2906 4.541e-10, 5.368e-10, 6.771e-10, 8.962e-10, 1.21e-9, 1.659e-9,
2907 2.33e-9, 3.249e-9, 4.495e-9, 5.923e-9, 7.642e-9, 9.607e-9,
2908 1.178e-8, 1.399e-8, 1.584e-8, 1.73e-8, 1.816e-8, 1.87e-8,
2909 1.868e-8, 1.87e-8, 1.884e-8, 1.99e-8, 2.15e-8, 2.258e-8,
2910 2.364e-8, 2.473e-8, 2.602e-8, 2.689e-8, 2.731e-8, 2.816e-8,
2911 2.859e-8, 2.839e-8, 2.703e-8, 2.451e-8, 2.149e-8, 1.787e-8,
2912 1.449e-8, 1.111e-8, 8.282e-9, 6.121e-9, 4.494e-9, 3.367e-9,
2913 2.487e-9, 1.885e-9, 1.503e-9, 1.249e-9, 1.074e-9, 9.427e-10,
2914 8.439e-10, 7.563e-10, 6.772e-10, 6.002e-10, 5.254e-10, 4.588e-10,
2915 3.977e-10, 3.449e-10, 3.003e-10, 2.624e-10, 2.335e-10, 2.04e-10,
2916 1.771e-10, 1.534e-10, 1.296e-10, 1.097e-10, 9.173e-11, 7.73e-11,
2917 6.547e-11, 5.191e-11, 4.198e-11, 3.361e-11, 2.732e-11, 2.244e-11,
2918 1.791e-11, 1.509e-11, 1.243e-11, 1.035e-11, 8.969e-12, 7.394e-12,
2919 6.323e-12, 5.282e-12, 4.543e-12, 3.752e-12, 3.14e-12, 2.6e-12,
2920 2.194e-12, 1.825e-12, 1.511e-12, 1.245e-12, 1.024e-12, 8.539e-13,
2921 7.227e-13, 6.102e-13, 5.189e-13, 4.43e-13, 3.774e-13, 3.236e-13,
2922 2.8e-13, 2.444e-13, 2.156e-13, 1.932e-13, 1.775e-13, 1.695e-13,
2923 1.672e-13, 1.704e-13, 1.825e-13, 2.087e-13, 2.614e-13, 3.377e-13,
2924 4.817e-13, 6.989e-13, 1.062e-12, 1.562e-12, 2.288e-12, 3.295e-12,
2925 4.55e-12, 5.965e-12, 7.546e-12, 9.395e-12, 1.103e-11, 1.228e-11,
2926 1.318e-11, 1.38e-11, 1.421e-11, 1.39e-11, 1.358e-11, 1.336e-11,
2927 1.342e-11, 1.356e-11, 1.424e-11, 1.552e-11, 1.73e-11, 1.951e-11,
2928 2.128e-11, 2.249e-11, 2.277e-11, 2.226e-11, 2.111e-11, 1.922e-11,
2929 1.775e-11, 1.661e-11, 1.547e-11, 1.446e-11, 1.323e-11, 1.21e-11,
2930 1.054e-11, 9.283e-12, 8.671e-12, 8.67e-12, 9.429e-12, 1.062e-11,
2931 1.255e-11, 1.506e-11, 1.818e-11, 2.26e-11, 2.831e-11, 3.723e-11,
2932 5.092e-11, 6.968e-11, 9.826e-11, 1.349e-10, 1.87e-10, 2.58e-10,
2933 3.43e-10, 4.424e-10, 5.521e-10, 6.812e-10, 8.064e-10, 9.109e-10,
2934 9.839e-10, 1.028e-9, 1.044e-9, 1.029e-9, 1.005e-9, 1.002e-9,
2935 1.038e-9, 1.122e-9, 1.233e-9, 1.372e-9, 1.524e-9, 1.665e-9,
2936 1.804e-9, 1.908e-9, 2.015e-9, 2.117e-9, 2.219e-9, 2.336e-9,
2937 2.531e-9, 2.805e-9, 3.189e-9, 3.617e-9, 4.208e-9, 4.911e-9,
2938 5.619e-9, 6.469e-9, 7.188e-9, 7.957e-9, 8.503e-9, 9.028e-9,
2939 9.571e-9, 9.99e-9, 1.055e-8, 1.102e-8, 1.132e-8, 1.141e-8,
2940 1.145e-8, 1.145e-8, 1.176e-8, 1.224e-8, 1.304e-8, 1.388e-8,
2941 1.445e-8, 1.453e-8, 1.368e-8, 1.22e-8, 1.042e-8, 8.404e-9,
2942 6.403e-9, 4.643e-9, 3.325e-9, 2.335e-9, 1.638e-9, 1.19e-9,
2943 9.161e-10, 7.412e-10, 6.226e-10, 5.516e-10, 5.068e-10, 4.831e-10,
2944 4.856e-10, 5.162e-10, 5.785e-10, 6.539e-10, 7.485e-10, 8.565e-10,
2945 9.534e-10, 1.052e-9, 1.115e-9, 1.173e-9, 1.203e-9, 1.224e-9,
2946 1.243e-9, 1.248e-9, 1.261e-9, 1.265e-9, 1.25e-9, 1.217e-9,
2947 1.176e-9, 1.145e-9, 1.153e-9, 1.199e-9, 1.278e-9, 1.366e-9,
2948 1.426e-9, 1.444e-9, 1.365e-9, 1.224e-9, 1.051e-9, 8.539e-10,
2949 6.564e-10, 4.751e-10, 3.404e-10, 2.377e-10, 1.631e-10, 1.114e-10,
2950 7.87e-11, 5.793e-11, 4.284e-11, 3.3e-11, 2.62e-11, 2.152e-11,
2951 1.777e-11, 1.496e-11, 1.242e-11, 1.037e-11, 8.725e-12, 7.004e-12,
2952 5.718e-12, 4.769e-12, 3.952e-12, 3.336e-12, 2.712e-12, 2.213e-12,
2953 1.803e-12, 1.492e-12, 1.236e-12, 1.006e-12, 8.384e-13, 7.063e-13,
2954 5.879e-13, 4.93e-13, 4.171e-13, 3.569e-13, 3.083e-13, 2.688e-13,
2955 2.333e-13, 2.035e-13, 1.82e-13, 1.682e-13, 1.635e-13, 1.674e-13,
2956 1.769e-13, 2.022e-13, 2.485e-13, 3.127e-13, 4.25e-13, 5.928e-13,
2957 8.514e-13, 1.236e-12, 1.701e-12, 2.392e-12, 3.231e-12, 4.35e-12,
2958 5.559e-12, 6.915e-12, 8.519e-12, 1.013e-11, 1.146e-11, 1.24e-11,
2959 1.305e-11, 1.333e-11, 1.318e-11, 1.263e-11, 1.238e-11, 1.244e-11,
2960 1.305e-11, 1.432e-11, 1.623e-11, 1.846e-11, 2.09e-11, 2.328e-11,
2961 2.526e-11, 2.637e-11, 2.702e-11, 2.794e-11, 2.889e-11, 2.989e-11,
2962 3.231e-11, 3.68e-11, 4.375e-11, 5.504e-11, 7.159e-11, 9.502e-11,
2963 1.279e-10, 1.645e-10, 2.098e-10, 2.618e-10, 3.189e-10, 3.79e-10,
2964 4.303e-10, 4.753e-10, 5.027e-10, 5.221e-10, 5.293e-10, 5.346e-10,
2965 5.467e-10, 5.796e-10, 6.2e-10, 6.454e-10, 6.705e-10, 6.925e-10,
2966 7.233e-10, 7.35e-10, 7.538e-10, 7.861e-10, 8.077e-10, 8.132e-10,
2967 7.749e-10, 7.036e-10, 6.143e-10, 5.093e-10, 4.089e-10, 3.092e-10,
2968 2.299e-10, 1.705e-10, 1.277e-10, 9.723e-11, 7.533e-11, 6.126e-11,
2969 5.154e-11, 4.428e-11, 3.913e-11, 3.521e-11, 3.297e-11, 3.275e-11,
2970 3.46e-11, 3.798e-11, 4.251e-11, 4.745e-11, 5.232e-11, 5.606e-11,
2971 5.82e-11, 5.88e-11, 5.79e-11, 5.661e-11, 5.491e-11, 5.366e-11,
2972 5.341e-11, 5.353e-11, 5.336e-11, 5.293e-11, 5.248e-11, 5.235e-11,
2973 5.208e-11, 5.322e-11, 5.521e-11, 5.725e-11, 5.827e-11, 5.685e-11,
2974 5.245e-11, 4.612e-11, 3.884e-11, 3.129e-11, 2.404e-11, 1.732e-11,
2975 1.223e-11, 8.574e-12, 5.888e-12, 3.986e-12, 2.732e-12, 1.948e-12,
2976 1.414e-12, 1.061e-12, 8.298e-13, 6.612e-13, 5.413e-13, 4.472e-13,
2977 3.772e-13, 3.181e-13, 2.645e-13, 2.171e-13, 1.778e-13, 1.464e-13,
2978 1.183e-13, 9.637e-14, 7.991e-14, 6.668e-14, 5.57e-14, 4.663e-14,
2979 3.848e-14, 3.233e-14, 2.706e-14, 2.284e-14, 1.944e-14, 1.664e-14,
2980 1.43e-14, 1.233e-14, 1.066e-14, 9.234e-15, 8.023e-15, 6.993e-15,
2981 6.119e-15, 5.384e-15, 4.774e-15, 4.283e-15, 3.916e-15, 3.695e-15,
2982 3.682e-15, 4.004e-15, 4.912e-15, 6.853e-15, 1.056e-14, 1.712e-14,
2983 2.804e-14, 4.516e-14, 7.113e-14, 1.084e-13, 1.426e-13, 1.734e-13,
2984 1.978e-13, 2.194e-13, 2.388e-13, 2.489e-13, 2.626e-13, 2.865e-13,
2985 3.105e-13, 3.387e-13, 3.652e-13, 3.984e-13, 4.398e-13, 4.906e-13,
2986 5.55e-13, 6.517e-13, 7.813e-13, 9.272e-13, 1.164e-12, 1.434e-12,
2987 1.849e-12, 2.524e-12, 3.328e-12, 4.523e-12, 6.108e-12, 8.207e-12,
2988 1.122e-11, 1.477e-11, 1.9e-11, 2.412e-11, 2.984e-11, 3.68e-11,
2989 4.353e-11, 4.963e-11, 5.478e-11, 5.903e-11, 6.233e-11, 6.483e-11,
2990 6.904e-11, 7.569e-11, 8.719e-11, 1.048e-10, 1.278e-10, 1.557e-10,
2991 1.869e-10, 2.218e-10, 2.61e-10, 2.975e-10, 3.371e-10, 3.746e-10,
2992 4.065e-10, 4.336e-10, 4.503e-10, 4.701e-10, 4.8e-10, 4.917e-10,
2993 5.038e-10, 5.128e-10, 5.143e-10, 5.071e-10, 5.019e-10, 5.025e-10,
2994 5.183e-10, 5.496e-10, 5.877e-10, 6.235e-10, 6.42e-10, 6.234e-10,
2995 5.698e-10, 4.916e-10, 4.022e-10, 3.126e-10, 2.282e-10, 1.639e-10,
2996 1.142e-10, 7.919e-11, 5.69e-11, 4.313e-11, 3.413e-11, 2.807e-11,
2997 2.41e-11, 2.166e-11, 2.024e-11, 1.946e-11, 1.929e-11, 1.963e-11,
2998 2.035e-11, 2.162e-11, 2.305e-11, 2.493e-11, 2.748e-11, 3.048e-11,
2999 3.413e-11, 3.754e-11, 4.155e-11, 4.635e-11, 5.11e-11, 5.734e-11,
3000 6.338e-11, 6.99e-11, 7.611e-11, 8.125e-11, 8.654e-11, 8.951e-11,
3001 9.182e-11, 9.31e-11, 9.273e-11, 9.094e-11, 8.849e-11, 8.662e-11,
3002 8.67e-11, 8.972e-11, 9.566e-11, 1.025e-10, 1.083e-10, 1.111e-10,
3003 1.074e-10, 9.771e-11, 8.468e-11, 6.958e-11, 5.47e-11, 4.04e-11,
3004 2.94e-11, 2.075e-11, 1.442e-11, 1.01e-11, 7.281e-12, 5.409e-12,
3005 4.138e-12, 3.304e-12, 2.784e-12, 2.473e-12, 2.273e-12, 2.186e-12,
3006 2.118e-12, 2.066e-12, 1.958e-12, 1.818e-12, 1.675e-12, 1.509e-12,
3007 1.349e-12, 1.171e-12, 9.838e-13, 8.213e-13, 6.765e-13, 5.378e-13,
3008 4.161e-13, 3.119e-13, 2.279e-13, 1.637e-13, 1.152e-13, 8.112e-14,
3009 5.919e-14, 4.47e-14, 3.492e-14, 2.811e-14, 2.319e-14, 1.948e-14,
3010 1.66e-14, 1.432e-14, 1.251e-14, 1.109e-14, 1.006e-14, 9.45e-15,
3011 9.384e-15, 1.012e-14, 1.216e-14, 1.636e-14, 2.305e-14, 3.488e-14,
3012 5.572e-14, 8.479e-14, 1.265e-13, 1.905e-13, 2.73e-13, 3.809e-13,
3013 4.955e-13, 6.303e-13, 7.861e-13, 9.427e-13, 1.097e-12, 1.212e-12,
3014 1.328e-12, 1.415e-12, 1.463e-12, 1.495e-12, 1.571e-12, 1.731e-12,
3015 1.981e-12, 2.387e-12, 2.93e-12, 3.642e-12, 4.584e-12, 5.822e-12,
3016 7.278e-12, 9.193e-12, 1.135e-11, 1.382e-11, 1.662e-11, 1.958e-11,
3017 2.286e-11, 2.559e-11, 2.805e-11, 2.988e-11, 3.106e-11, 3.182e-11,
3018 3.2e-11, 3.258e-11, 3.362e-11, 3.558e-11, 3.688e-11, 3.8e-11,
3019 3.929e-11, 4.062e-11, 4.186e-11, 4.293e-11, 4.48e-11, 4.643e-11,
3020 4.704e-11, 4.571e-11, 4.206e-11, 3.715e-11, 3.131e-11, 2.541e-11,
3021 1.978e-11, 1.508e-11, 1.146e-11, 8.7e-12, 6.603e-12, 5.162e-12,
3022 4.157e-12, 3.408e-12, 2.829e-12, 2.405e-12, 2.071e-12, 1.826e-12,
3023 1.648e-12, 1.542e-12, 1.489e-12, 1.485e-12, 1.493e-12, 1.545e-12,
3024 1.637e-12, 1.814e-12, 2.061e-12, 2.312e-12, 2.651e-12, 3.03e-12,
3025 3.46e-12, 3.901e-12, 4.306e-12, 4.721e-12, 5.008e-12, 5.281e-12,
3026 5.541e-12, 5.791e-12, 6.115e-12, 6.442e-12, 6.68e-12, 6.791e-12,
3027 6.831e-12, 6.839e-12, 6.946e-12, 7.128e-12, 7.537e-12, 8.036e-12,
3028 8.392e-12, 8.526e-12, 8.11e-12, 7.325e-12, 6.329e-12, 5.183e-12,
3029 4.081e-12, 2.985e-12, 2.141e-12, 1.492e-12, 1.015e-12, 6.684e-13,
3030 4.414e-13, 2.987e-13, 2.038e-13, 1.391e-13, 9.86e-14, 7.24e-14,
3031 5.493e-14, 4.288e-14, 3.427e-14, 2.787e-14, 2.296e-14, 1.909e-14,
3032 1.598e-14, 1.344e-14, 1.135e-14, 9.616e-15, 8.169e-15, 6.957e-15,
3033 5.938e-15, 5.08e-15, 4.353e-15, 3.738e-15, 3.217e-15, 2.773e-15,
3034 2.397e-15, 2.077e-15, 1.805e-15, 1.575e-15, 1.382e-15, 1.221e-15,
3035 1.09e-15, 9.855e-16, 9.068e-16, 8.537e-16, 8.27e-16, 8.29e-16,
3036 8.634e-16, 9.359e-16, 1.055e-15, 1.233e-15, 1.486e-15, 1.839e-15,
3037 2.326e-15, 2.998e-15, 3.934e-15, 5.256e-15, 7.164e-15, 9.984e-15,
3038 1.427e-14, 2.099e-14, 3.196e-14, 5.121e-14, 7.908e-14, 1.131e-13,
3039 1.602e-13, 2.239e-13, 3.075e-13, 4.134e-13, 5.749e-13, 7.886e-13,
3040 1.071e-12, 1.464e-12, 2.032e-12, 2.8e-12, 3.732e-12, 4.996e-12,
3041 6.483e-12, 8.143e-12, 1.006e-11, 1.238e-11, 1.484e-11, 1.744e-11,
3042 2.02e-11, 2.274e-11, 2.562e-11, 2.848e-11, 3.191e-11, 3.617e-11,
3043 4.081e-11, 4.577e-11, 4.937e-11, 5.204e-11, 5.401e-11, 5.462e-11,
3044 5.507e-11, 5.51e-11, 5.605e-11, 5.686e-11, 5.739e-11, 5.766e-11,
3045 5.74e-11, 5.754e-11, 5.761e-11, 5.777e-11, 5.712e-11, 5.51e-11,
3046 5.088e-11, 4.438e-11, 3.728e-11, 2.994e-11, 2.305e-11, 1.715e-11,
3047 1.256e-11, 9.208e-12, 6.745e-12, 5.014e-12, 3.785e-12, 2.9e-12,
3048 2.239e-12, 1.757e-12, 1.414e-12, 1.142e-12, 9.482e-13, 8.01e-13,
3049 6.961e-13, 6.253e-13, 5.735e-13, 5.433e-13, 5.352e-13, 5.493e-13,
3050 5.706e-13, 6.068e-13, 6.531e-13, 7.109e-13, 7.767e-13, 8.59e-13,
3051 9.792e-13, 1.142e-12, 1.371e-12, 1.65e-12, 1.957e-12, 2.302e-12,
3052 2.705e-12, 3.145e-12, 3.608e-12, 4.071e-12, 4.602e-12, 5.133e-12,
3053 5.572e-12, 5.987e-12, 6.248e-12, 6.533e-12, 6.757e-12, 6.935e-12,
3054 7.224e-12, 7.422e-12, 7.538e-12, 7.547e-12, 7.495e-12, 7.543e-12,
3055 7.725e-12, 8.139e-12, 8.627e-12, 9.146e-12, 9.443e-12, 9.318e-12,
3056 8.649e-12, 7.512e-12, 6.261e-12, 4.915e-12, 3.647e-12, 2.597e-12,
3057 1.785e-12, 1.242e-12, 8.66e-13, 6.207e-13, 4.61e-13, 3.444e-13,
3058 2.634e-13, 2.1e-13, 1.725e-13, 1.455e-13, 1.237e-13, 1.085e-13,
3059 9.513e-14, 7.978e-14, 6.603e-14, 5.288e-14, 4.084e-14, 2.952e-14,
3060 2.157e-14, 1.593e-14, 1.199e-14, 9.267e-15, 7.365e-15, 6.004e-15,
3061 4.995e-15, 4.218e-15, 3.601e-15, 3.101e-15, 2.692e-15, 2.36e-15,
3062 2.094e-15, 1.891e-15, 1.755e-15, 1.699e-15, 1.755e-15, 1.987e-15,
3063 2.506e-15, 3.506e-15, 5.289e-15, 8.311e-15, 1.325e-14, 2.129e-14,
3064 3.237e-14, 4.595e-14, 6.441e-14, 8.433e-14, 1.074e-13, 1.383e-13,
3065 1.762e-13, 2.281e-13, 2.831e-13, 3.523e-13, 4.38e-13, 5.304e-13,
3066 6.29e-13, 7.142e-13, 8.032e-13, 8.934e-13, 9.888e-13, 1.109e-12,
3067 1.261e-12, 1.462e-12, 1.74e-12, 2.099e-12, 2.535e-12, 3.008e-12,
3068 3.462e-12, 3.856e-12, 4.098e-12, 4.239e-12, 4.234e-12, 4.132e-12,
3069 3.986e-12, 3.866e-12, 3.829e-12, 3.742e-12, 3.705e-12, 3.694e-12,
3070 3.765e-12, 3.849e-12, 3.929e-12, 4.056e-12, 4.092e-12, 4.047e-12,
3071 3.792e-12, 3.407e-12, 2.953e-12, 2.429e-12, 1.931e-12, 1.46e-12,
3072 1.099e-12, 8.199e-13, 6.077e-13, 4.449e-13, 3.359e-13, 2.524e-13,
3073 1.881e-13, 1.391e-13, 1.02e-13, 7.544e-14, 5.555e-14, 4.22e-14,
3074 3.321e-14, 2.686e-14, 2.212e-14, 1.78e-14, 1.369e-14, 1.094e-14,
3075 9.13e-15, 8.101e-15, 7.828e-15, 8.393e-15, 1.012e-14, 1.259e-14,
3076 1.538e-14, 1.961e-14, 2.619e-14, 3.679e-14, 5.049e-14, 6.917e-14,
3077 8.88e-14, 1.115e-13, 1.373e-13, 1.619e-13, 1.878e-13, 2.111e-13,
3078 2.33e-13, 2.503e-13, 2.613e-13, 2.743e-13, 2.826e-13, 2.976e-13,
3079 3.162e-13, 3.36e-13, 3.491e-13, 3.541e-13, 3.595e-13, 3.608e-13,
3080 3.709e-13, 3.869e-13, 4.12e-13, 4.366e-13, 4.504e-13, 4.379e-13,
3081 3.955e-13, 3.385e-13, 2.741e-13, 2.089e-13, 1.427e-13, 9.294e-14,
3082 5.775e-14, 3.565e-14, 2.21e-14, 1.398e-14, 9.194e-15, 6.363e-15,
3083 4.644e-15, 3.55e-15, 2.808e-15, 2.274e-15, 1.871e-15, 1.557e-15,
3084 1.308e-15, 1.108e-15, 9.488e-16, 8.222e-16, 7.238e-16, 6.506e-16,
3085 6.008e-16, 5.742e-16, 5.724e-16, 5.991e-16, 6.625e-16, 7.775e-16,
3086 9.734e-16, 1.306e-15, 1.88e-15, 2.879e-15, 4.616e-15, 7.579e-15,
3087 1.248e-14, 2.03e-14, 3.244e-14, 5.171e-14, 7.394e-14, 9.676e-14,
3088 1.199e-13, 1.467e-13, 1.737e-13, 2.02e-13, 2.425e-13, 3.016e-13,
3089 3.7e-13, 4.617e-13, 5.949e-13, 7.473e-13, 9.378e-13, 1.191e-12,
3090 1.481e-12, 1.813e-12, 2.232e-12, 2.722e-12, 3.254e-12, 3.845e-12,
3091 4.458e-12, 5.048e-12, 5.511e-12, 5.898e-12, 6.204e-12, 6.293e-12,
3092 6.386e-12, 6.467e-12, 6.507e-12, 6.466e-12, 6.443e-12, 6.598e-12,
3093 6.873e-12, 7.3e-12, 7.816e-12, 8.368e-12, 8.643e-12, 8.466e-12,
3094 7.871e-12, 6.853e-12, 5.714e-12, 4.482e-12, 3.392e-12, 2.613e-12,
3095 2.008e-12, 1.562e-12, 1.228e-12, 9.888e-13, 7.646e-13, 5.769e-13,
3096 4.368e-13, 3.324e-13, 2.508e-13, 1.916e-13
3097 };
3098
3099 static const double xfcrev[15] =
3100 { 1.003, 1.009, 1.015, 1.023, 1.029, 1.033, 1.037,
3101 1.039, 1.04, 1.046, 1.036, 1.027, 1.01, 1.002, 1.
3102 };
3103
3104 double sfac;
3105
3106 /* Get H2O continuum absorption... */
3107 const double xw = nu / 10 + 1;
3108 if (xw >= 1 && xw < 2001) {
3109 const int iw = (int) xw;
3110 const double dw = xw - iw;
3111 const double ew = 1 - dw;
3112 const double cw296 = ew * h2o296[iw - 1] + dw * h2o296[iw];
3113 const double cw260 = ew * h2o260[iw - 1] + dw * h2o260[iw];
3114 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
3115 if (nu <= 820 || nu >= 960) {
3116 sfac = 1;
3117 } else {
3118 const double xx = (nu - 820) / 10;
3119 const int ix = (int) xx;
3120 const double dx = xx - ix;
3121 sfac = (1 - dx) * xfcrev[ix] + dx * xfcrev[ix + 1];
3122 }
3123 const double ctwslf =
3124 sfac * cw296 * pow(cw260 / cw296, (296 - t) / (296 - 260));
3125 const double vf2 = POW2(nu - 370);
3126 const double vf6 = POW3(vf2);
3127 const double fscal = 36100 / (vf2 + vf6 * 1e-8 + 36100) * -.25 + 1;
3128 const double ctwfrn = cwfrn * fscal;
3129 const double a1 = nu * u * tanh(.7193876 / t * nu);
3130 const double a2 = 296 / t;
3131 const double a3 = p / P0 * (q * ctwslf + (1 - q) * ctwfrn) * 1e-20;
3132 return a1 * a2 * a3;
3133 } else
3134 return 0;
3135}
3136
3137/*****************************************************************************/
3138
3139double ctmn2(
3140 const double nu,
3141 const double p,
3142 const double t) {
3143
3144 static const double ba[98] =
3145 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
3146 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
3147 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
3148 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
3149 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
3150 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
3151 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
3152 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
3153 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
3154 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
3155 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3156 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3157 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3158 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3159 };
3160
3161 static const double betaa[98] =
3162 { 802., 802., 761., 722., 679., 646., 609., 562.,
3163 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3164 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3165 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3166 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3167 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3168 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3169 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3170 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3171 372., 449., 514., 569., 609., 642., 673., 673.
3172 };
3173
3174 static const double nua[98] =
3175 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3176 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3177 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3178 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3179 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3180 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3181 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3182 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3183 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3184 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3185 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3186 };
3187
3188 const double t0 = 273.0, tr = 296.0;
3189
3190 /* Check wavenumber range... */
3191 if (nu < nua[0] || nu > nua[97])
3192 return 0;
3193
3194 /* Interpolate B and beta... */
3195 const int idx = locate_reg(nua, 98, nu);
3196 const double b =
3197 1e6 * LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3198 const double beta =
3199 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3200
3201 /* Compute absorption coefficient... */
3202 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3203 * N2 * b * (N2 + (1 - N2) * (1.294 - 0.4545 * t / tr));
3204}
3205
3206/*****************************************************************************/
3207
3208double ctmo2(
3209 const double nu,
3210 const double p,
3211 const double t) {
3212
3213 static const double ba[90] =
3214 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3215 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3216 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3217 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3218 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3219 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3220 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3221 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3222 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3223 .071, .064, 0.
3224 };
3225
3226 static const double betaa[90] =
3227 { 467., 467., 400., 315., 379., 368., 475., 521.,
3228 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3229 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3230 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3231 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3232 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3233 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3234 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3235 346., 322., 291., 290., 350., 371., 504., 504.
3236 };
3237
3238 static const double nua[90] =
3239 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3240 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3241 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3242 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3243 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3244 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3245 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3246 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3247 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3248 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3249 1800., 1805.
3250 };
3251
3252 const double t0 = 273, tr = 296;
3253
3254 /* Check wavenumber range... */
3255 if (nu < nua[0] || nu > nua[89])
3256 return 0;
3257
3258 /* Interpolate B and beta... */
3259 const int idx = locate_reg(nua, 90, nu);
3260 const double b = LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3261 const double beta =
3262 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3263
3264 /* Compute absorption coefficient... */
3265 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) * O2 * b;
3266}
3267
3268/*****************************************************************************/
3269
3271 const ctl_t *ctl,
3272 atm_t *atm_dest,
3273 const atm_t *atm_src,
3274 const int init) {
3275
3276 /* Data size... */
3277 const size_t s = (size_t) atm_src->np * sizeof(double);
3278
3279 /* Copy data... */
3280 atm_dest->np = atm_src->np;
3281 memcpy(atm_dest->time, atm_src->time, s);
3282 memcpy(atm_dest->z, atm_src->z, s);
3283 memcpy(atm_dest->lon, atm_src->lon, s);
3284 memcpy(atm_dest->lat, atm_src->lat, s);
3285 memcpy(atm_dest->p, atm_src->p, s);
3286 memcpy(atm_dest->t, atm_src->t, s);
3287 for (int ig = 0; ig < ctl->ng; ig++)
3288 memcpy(atm_dest->q[ig], atm_src->q[ig], s);
3289 for (int iw = 0; iw < ctl->nw; iw++)
3290 memcpy(atm_dest->k[iw], atm_src->k[iw], s);
3291 atm_dest->clz = atm_src->clz;
3292 atm_dest->cldz = atm_src->cldz;
3293 for (int icl = 0; icl < ctl->ncl; icl++)
3294 atm_dest->clk[icl] = atm_src->clk[icl];
3295 atm_dest->sft = atm_src->sft;
3296 for (int isf = 0; isf < ctl->nsf; isf++)
3297 atm_dest->sfeps[isf] = atm_src->sfeps[isf];
3298
3299 /* Initialize... */
3300 if (init)
3301 for (int ip = 0; ip < atm_dest->np; ip++) {
3302 atm_dest->p[ip] = 0;
3303 atm_dest->t[ip] = 0;
3304 for (int ig = 0; ig < ctl->ng; ig++)
3305 atm_dest->q[ig][ip] = 0;
3306 for (int iw = 0; iw < ctl->nw; iw++)
3307 atm_dest->k[iw][ip] = 0;
3308 atm_dest->clz = 0;
3309 atm_dest->cldz = 0;
3310 for (int icl = 0; icl < ctl->ncl; icl++)
3311 atm_dest->clk[icl] = 0;
3312 atm_dest->sft = 0;
3313 for (int isf = 0; isf < ctl->nsf; isf++)
3314 atm_dest->sfeps[isf] = 1;
3315 }
3316}
3317
3318/*****************************************************************************/
3319
3321 const ctl_t *ctl,
3322 obs_t *obs_dest,
3323 const obs_t *obs_src,
3324 const int init) {
3325
3326 /* Data size... */
3327 const size_t s = (size_t) obs_src->nr * sizeof(double);
3328
3329 /* Copy data... */
3330 obs_dest->nr = obs_src->nr;
3331 memcpy(obs_dest->time, obs_src->time, s);
3332 memcpy(obs_dest->obsz, obs_src->obsz, s);
3333 memcpy(obs_dest->obslon, obs_src->obslon, s);
3334 memcpy(obs_dest->obslat, obs_src->obslat, s);
3335 memcpy(obs_dest->vpz, obs_src->vpz, s);
3336 memcpy(obs_dest->vplon, obs_src->vplon, s);
3337 memcpy(obs_dest->vplat, obs_src->vplat, s);
3338 memcpy(obs_dest->tpz, obs_src->tpz, s);
3339 memcpy(obs_dest->tplon, obs_src->tplon, s);
3340 memcpy(obs_dest->tplat, obs_src->tplat, s);
3341 for (int id = 0; id < ctl->nd; id++)
3342 memcpy(obs_dest->rad[id], obs_src->rad[id], s);
3343 for (int id = 0; id < ctl->nd; id++)
3344 memcpy(obs_dest->tau[id], obs_src->tau[id], s);
3345
3346 /* Initialize... */
3347 if (init)
3348 for (int id = 0; id < ctl->nd; id++)
3349 for (int ir = 0; ir < obs_dest->nr; ir++)
3350 if (isfinite(obs_dest->rad[id][ir])) {
3351 obs_dest->rad[id][ir] = 0;
3352 obs_dest->tau[id][ir] = 0;
3353 }
3354}
3355
3356/*****************************************************************************/
3357
3359 int year,
3360 int mon,
3361 int day,
3362 int *doy) {
3363
3364 const int d0[12] =
3365 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3366 const int d0l[12] =
3367 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3368
3369 /* Get day of year... */
3370 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
3371 *doy = d0l[mon - 1] + day - 1;
3372 else
3373 *doy = d0[mon - 1] + day - 1;
3374}
3375
3376/*****************************************************************************/
3377
3379 int year,
3380 int doy,
3381 int *mon,
3382 int *day) {
3383
3384 const int d0[12] =
3385 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3386 const int d0l[12] =
3387 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3388 int i;
3389
3390 /* Get month and day... */
3391 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
3392 for (i = 11; i >= 0; i--)
3393 if (d0l[i] <= doy)
3394 break;
3395 *mon = i + 1;
3396 *day = doy - d0l[i] + 1;
3397 } else {
3398 for (i = 11; i >= 0; i--)
3399 if (d0[i] <= doy)
3400 break;
3401 *mon = i + 1;
3402 *day = doy - d0[i] + 1;
3403 }
3404}
3405
3406/*****************************************************************************/
3407
3409 const ctl_t *ctl,
3410 const char *emitter) {
3411
3412 for (int ig = 0; ig < ctl->ng; ig++)
3413 if (strcasecmp(ctl->emitter[ig], emitter) == 0)
3414 return ig;
3415
3416 return -1;
3417}
3418
3419/*****************************************************************************/
3420
3422 const ctl_t *ctl,
3423 const tbl_t *tbl,
3424 atm_t *atm,
3425 obs_t *obs) {
3426
3427 /* Allocate... */
3428 int *mask;
3429 ALLOC(mask, int,
3430 ND * NR);
3431
3432 /* Save observation mask... */
3433 for (int id = 0; id < ctl->nd; id++)
3434 for (int ir = 0; ir < obs->nr; ir++)
3435 mask[id * NR + ir] = !isfinite(obs->rad[id][ir]);
3436
3437 /* Hydrostatic equilibrium... */
3438 hydrostatic(ctl, atm);
3439
3440 /* CGA or EGA forward model... */
3441 if (ctl->formod == 0 || ctl->formod == 1)
3442 for (int ir = 0; ir < obs->nr; ir++)
3443 formod_pencil(ctl, tbl, atm, obs, ir);
3444
3445 /* Call RFM... */
3446 else if (ctl->formod == 2)
3447 formod_rfm(ctl, tbl, atm, obs);
3448
3449 /* Apply field-of-view convolution... */
3450 formod_fov(ctl, obs);
3451
3452 /* Convert radiance to brightness temperature... */
3453 if (ctl->write_bbt)
3454 for (int id = 0; id < ctl->nd; id++)
3455 for (int ir = 0; ir < obs->nr; ir++)
3456 obs->rad[id][ir] = BRIGHT(obs->rad[id][ir], ctl->nu[id]);
3457
3458 /* Apply observation mask... */
3459 for (int id = 0; id < ctl->nd; id++)
3460 for (int ir = 0; ir < obs->nr; ir++)
3461 if (mask[id * NR + ir])
3462 obs->rad[id][ir] = NAN;
3463
3464 /* Free... */
3465 free(mask);
3466}
3467
3468/*****************************************************************************/
3469
3471 const ctl_t *ctl,
3472 const los_t *los,
3473 const int ip,
3474 double *beta) {
3475
3476 /* Extinction... */
3477 for (int id = 0; id < ctl->nd; id++)
3478 beta[id] = los->k[ip][id];
3479
3480 /* CO2 continuum... */
3481 if (ctl->ctm_co2 && ctl->ig_co2 >= 0)
3482 for (int id = 0; id < ctl->nd; id++)
3483 beta[id] += ctmco2(ctl->nu[id], los->p[ip], los->t[ip],
3484 los->u[ip][ctl->ig_co2]) / los->ds[ip];
3485
3486 /* H2O continuum... */
3487 if (ctl->ctm_h2o && ctl->ig_h2o >= 0)
3488 for (int id = 0; id < ctl->nd; id++)
3489 beta[id] += ctmh2o(ctl->nu[id], los->p[ip], los->t[ip],
3490 los->q[ip][ctl->ig_h2o], los->u[ip][ctl->ig_h2o])
3491 / los->ds[ip];
3492
3493 /* N2 continuum... */
3494 if (ctl->ctm_n2)
3495 for (int id = 0; id < ctl->nd; id++)
3496 beta[id] += ctmn2(ctl->nu[id], los->p[ip], los->t[ip]);
3497
3498 /* O2 continuum... */
3499 if (ctl->ctm_o2)
3500 for (int id = 0; id < ctl->nd; id++)
3501 beta[id] += ctmo2(ctl->nu[id], los->p[ip], los->t[ip]);
3502}
3503
3504/*****************************************************************************/
3505
3507 const ctl_t *ctl,
3508 obs_t *obs) {
3509
3510 double rad[ND][NR], tau[ND][NR], z[NR];
3511
3512 /* Do not take into account FOV... */
3513 if (ctl->fov[0] == '-')
3514 return;
3515
3516 /* Allocate... */
3517 obs_t *obs2;
3518 ALLOC(obs2, obs_t, 1);
3519
3520 /* Copy observation data... */
3521 copy_obs(ctl, obs2, obs, 0);
3522
3523 /* Loop over ray paths... */
3524 for (int ir = 0; ir < obs->nr; ir++) {
3525
3526 /* Get radiance and transmittance profiles... */
3527 int nz = 0;
3528 for (int ir2 = MAX(ir - NFOV, 0);
3529 ir2 < MIN(ir + 1 + NFOV, obs->nr); ir2++)
3530 if (obs->time[ir2] == obs->time[ir]) {
3531 z[nz] = obs2->vpz[ir2];
3532 for (int id = 0; id < ctl->nd; id++) {
3533 rad[id][nz] = obs2->rad[id][ir2];
3534 tau[id][nz] = obs2->tau[id][ir2];
3535 }
3536 nz++;
3537 }
3538 if (nz < 2)
3539 ERRMSG("Cannot apply FOV convolution!");
3540
3541 /* Convolute profiles with FOV... */
3542 double wsum = 0;
3543 for (int id = 0; id < ctl->nd; id++) {
3544 obs->rad[id][ir] = 0;
3545 obs->tau[id][ir] = 0;
3546 }
3547 for (int i = 0; i < ctl->fov_n; i++) {
3548 const double zfov = obs->vpz[ir] + ctl->fov_dz[i];
3549 const int idx = locate_irr(z, nz, zfov);
3550 for (int id = 0; id < ctl->nd; id++) {
3551 obs->rad[id][ir] += ctl->fov_w[i]
3552 * LIN(z[idx], rad[id][idx], z[idx + 1], rad[id][idx + 1], zfov);
3553 obs->tau[id][ir] += ctl->fov_w[i]
3554 * LIN(z[idx], tau[id][idx], z[idx + 1], tau[id][idx + 1], zfov);
3555 }
3556 wsum += ctl->fov_w[i];
3557 }
3558 for (int id = 0; id < ctl->nd; id++) {
3559 obs->rad[id][ir] /= wsum;
3560 obs->tau[id][ir] /= wsum;
3561 }
3562 }
3563
3564 /* Free... */
3565 free(obs2);
3566}
3567
3568/*****************************************************************************/
3569
3571 const ctl_t *ctl,
3572 const tbl_t *tbl,
3573 const atm_t *atm,
3574 obs_t *obs,
3575 const int ir) {
3576
3577 double rad[ND], tau[ND], tau_path[ND][NG];
3578
3579 /* Allocate... */
3580 los_t *los;
3581 ALLOC(los, los_t, 1);
3582
3583 /* Initialize... */
3584 for (int id = 0; id < ctl->nd; id++) {
3585 rad[id] = 0;
3586 tau[id] = 1;
3587 for (int ig = 0; ig < ctl->ng; ig++)
3588 tau_path[id][ig] = 1;
3589 }
3590
3591 /* Raytracing... */
3592 raytrace(ctl, atm, obs, los, ir);
3593
3594 /* Loop over LOS points... */
3595 for (int ip = 0; ip < los->np; ip++) {
3596
3597 /* Get trace gas transmittance... */
3598 double tau_gas[ND];
3599 if (ctl->formod == 0)
3600 intpol_tbl_cga(ctl, tbl, los, ip, tau_path, tau_gas);
3601 else
3602 intpol_tbl_ega(ctl, tbl, los, ip, tau_path, tau_gas);
3603
3604 /* Get continuum absorption... */
3605 double beta_ctm[ND];
3606 formod_continua(ctl, los, ip, beta_ctm);
3607
3608 /* Compute Planck function... */
3609 formod_srcfunc(ctl, tbl, los->t[ip], los->src[ip]);
3610
3611 /* Loop over channels... */
3612 for (int id = 0; id < ctl->nd; id++)
3613 if (tau_gas[id] > 0) {
3614
3615 /* Get segment emissivity... */
3616 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3617
3618 /* Compute radiance... */
3619 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3620
3621 /* Compute path transmittance... */
3622 tau[id] *= (1 - los->eps[ip][id]);
3623 }
3624 }
3625
3626 /* Check whether LOS hit the ground... */
3627 if (ctl->sftype >= 1 && los->sft > 0) {
3628
3629 /* Add surface emissions... */
3630 double src_sf[ND];
3631 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3632 for (int id = 0; id < ctl->nd; id++)
3633 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3634
3635 /* Check reflectivity... */
3636 int refl = 0;
3637 if (ctl->sftype >= 2)
3638 for (int id = 0; id < ctl->nd; id++)
3639 if (los->sfeps[id] < 1) {
3640 refl = 1;
3641 break;
3642 }
3643
3644 /* Calculate reflection... */
3645 if (refl) {
3646
3647 /* Initialize... */
3648 double tau_refl[ND];
3649 for (int id = 0; id < ctl->nd; id++)
3650 tau_refl[id] = 1;
3651
3652 /* Add down-welling radiance... */
3653 for (int ip = los->np - 1; ip >= 0; ip--)
3654 for (int id = 0; id < ctl->nd; id++) {
3655 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3656 * tau[id] * (1 - los->sfeps[id]);
3657 tau_refl[id] *= (1 - los->eps[ip][id]);
3658 }
3659
3660 /* Add solar term... */
3661 if (ctl->sftype >= 3) {
3662
3663 /* Get cosine of solar zenith angle... */
3664 double cos_sza_val;
3665 if (ctl->sfsza < 0)
3666 cos_sza_val = cos_sza(obs->time[ir],
3667 los->lon[los->np - 1], los->lat[los->np - 1]);
3668 else
3669 cos_sza_val = cos(DEG2RAD(ctl->sfsza));
3670
3671 /* Check validity (avoid division by zero)... */
3672 if (cos_sza_val > 1e-6) {
3673
3674 /* Compute incidence direction cosine... */
3675 double x0[3], x1[3];
3676 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3677 los->lat[los->np - 1], x0);
3678 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3679 for (int i = 0; i < 3; i++)
3680 x1[i] -= x0[i];
3681 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3682
3683 /* Ratio of incident direction to solar zenith direction... */
3684 const double rcos = cosa / cos_sza_val;
3685
3686 /* Add solar radiance contribution... */
3687 for (int id = 0; id < ctl->nd; id++)
3688 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3689 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3690 }
3691 }
3692 }
3693 }
3694
3695 /* Copy results... */
3696 for (int id = 0; id < ctl->nd; id++) {
3697 obs->rad[id][ir] = rad[id];
3698 obs->tau[id][ir] = tau[id];
3699 }
3700
3701 /* Free... */
3702 free(los);
3703}
3704
3705/*****************************************************************************/
3706
3708 const ctl_t *ctl,
3709 const tbl_t *tbl,
3710 const atm_t *atm,
3711 obs_t *obs) {
3712
3713 los_t *los;
3714
3715 char cmd[2 * LEN], rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3716
3717 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3718 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3719
3720 int n, nadir = 0, zenith = 0;
3721
3722 /* Allocate... */
3723 ALLOC(los, los_t, 1);
3724
3725 /* Check observer positions... */
3726 for (int ir = 1; ir < obs->nr; ir++)
3727 if (obs->obsz[ir] != obs->obsz[0]
3728 || obs->obslon[ir] != obs->obslon[0]
3729 || obs->obslat[ir] != obs->obslat[0])
3730 ERRMSG("RFM interface requires identical observer positions!");
3731
3732 /* Check extinction data... */
3733 for (int iw = 0; iw < ctl->nw; iw++)
3734 for (int ip = 0; ip < atm->np; ip++)
3735 if (atm->k[iw][ip] != 0)
3736 ERRMSG("RFM interface cannot handle extinction data!");
3737
3738 /* Get altitude range of atmospheric data... */
3739 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3740
3741 /* Observer within atmosphere? */
3742 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3743 obsz = obs->obsz[0];
3744 strcat(rfmflg, " OBS");
3745 }
3746
3747 /* Determine tangent altitude or air mass factor... */
3748 for (int ir = 0; ir < obs->nr; ir++) {
3749
3750 /* Raytracing... */
3751 raytrace(ctl, atm, obs, los, ir);
3752
3753 /* Nadir or zenith? (air mass factor / secant of zenith angle) */
3754 if (obs->tpz[ir] <= zmin) {
3755
3756 /* Nadir: path intersects the surface. */
3757 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3758 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3759 for (int i = 0; i < 3; i++)
3760 xd[i] = xo[i] - xv[i];
3761 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3762 nadir++;
3763
3764 } else if (obs->tpz[ir] >= zmax - 1e-3 && obs->vpz[ir] > obs->obsz[ir]) {
3765
3766 /* Zenith: upward-looking path leaves the atmosphere at the top boundary. */
3767 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3768 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3769 for (int i = 0; i < 3; i++)
3770 xd[i] = xv[i] - xo[i];
3771 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3772 zenith++;
3773
3774 } else
3775 /* Limb: use tangent altitude. */
3776 z[ir] = obs->tpz[ir];
3777 }
3778 if ((nadir > 0 && nadir < obs->nr)
3779 || (zenith > 0 && zenith < obs->nr)
3780 || (nadir > 0 && zenith > 0))
3781 ERRMSG("Limb, nadir, and zenith not simultaneously possible!");
3782
3783 /* Viewing geometry... */
3784 if (nadir)
3785 strcat(rfmflg, " NAD");
3786 if (zenith)
3787 strcat(rfmflg, " ZEN");
3788
3789 /* Get surface temperature... */
3790 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3791
3792 /* Refraction? */
3793 if (!nadir && !zenith && !ctl->refrac)
3794 strcat(rfmflg, " GEO");
3795
3796 /* Continua? */
3797 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3798 strcat(rfmflg, " CTM");
3799
3800 /* Write atmospheric data file... */
3801 write_atm_rfm("rfm.atm", ctl, atm);
3802
3803 /* Loop over channels... */
3804 for (int id = 0; id < ctl->nd; id++) {
3805
3806 /* Get filter function from lookup table... */
3807 n = tbl->filt_n[id];
3808 if (n <= 0 || n > NSHAPE)
3809 ERRMSG("Missing or invalid filter function in lookup table!");
3810 memcpy(nu, tbl->filt_nu[id], (size_t) n * sizeof(double));
3811 memcpy(f, tbl->filt_f[id], (size_t) n * sizeof(double));
3812
3813 /* Set spectral range... */
3814 nu0 = nu[0];
3815 nu1 = nu[n - 1];
3816
3817 /* Create RFM driver file... */
3818 FILE *out;
3819 if (!(out = fopen("rfm.drv", "w")))
3820 ERRMSG("Cannot create file!");
3821 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3822 fprintf(out, "*FLG\n%s\n", rfmflg);
3823 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3824 fprintf(out, "*GAS\n");
3825 for (int ig = 0; ig < ctl->ng; ig++)
3826 fprintf(out, "%s\n", ctl->emitter[ig]);
3827 fprintf(out, "*ATM\nrfm.atm\n");
3828 fprintf(out, "*TAN\n");
3829 for (int ir = 0; ir < obs->nr; ir++)
3830 fprintf(out, "%g\n", z[ir]);
3831 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3832 if (obsz >= 0)
3833 fprintf(out, "*OBS\n%g\n", obsz);
3834 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3835 fprintf(out, "*XSC\n");
3836 for (int ig = 0; ig < ctl->ng; ig++)
3837 if (ctl->rfmxsc[ig][0] != '-')
3838 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3839 fprintf(out, "*END\n");
3840 fclose(out);
3841
3842 /* Remove temporary files... */
3843 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3844 ERRMSG("Cannot remove temporary files!");
3845
3846 /* Call RFM... */
3847 sprintf(cmd, "echo | %s", ctl->rfmbin);
3848 if (system(cmd))
3849 ERRMSG("Error while calling RFM!");
3850
3851 /* Read data... */
3852 for (int ir = 0; ir < obs->nr; ir++) {
3853 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3854 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3855 }
3856 }
3857
3858 /* Remove temporary files... */
3859 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3860 ERRMSG("Error while removing temporary files!");
3861
3862 /* Free... */
3863 free(los);
3864}
3865
3866/*****************************************************************************/
3867
3869 const ctl_t *ctl,
3870 const tbl_t *tbl,
3871 const double t,
3872 double *src) {
3873
3874 /* Determine index in temperature array... */
3875 const int it = locate_reg(tbl->st, TBLNS, t);
3876
3877 /* Interpolate Planck function value... */
3878 for (int id = 0; id < ctl->nd; id++)
3879 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3880 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3881}
3882
3883/*****************************************************************************/
3884
3886 const double z,
3887 const double lon,
3888 const double lat,
3889 double *x) {
3890
3891 const double radius = z + RE;
3892 const double latrad = lat / 180. * M_PI;
3893 const double lonrad = lon / 180. * M_PI;
3894 const double coslat = cos(latrad);
3895
3896 x[0] = radius * coslat * cos(lonrad);
3897 x[1] = radius * coslat * sin(lonrad);
3898 x[2] = radius * sin(latrad);
3899}
3900
3901/*****************************************************************************/
3902
3904 const ctl_t *ctl,
3905 atm_t *atm) {
3906
3907 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3908
3909 const int ipts = 20;
3910
3911 double dzmin = 1e99, e = 0;
3912
3913 int ipref = 0;
3914
3915 /* Check reference height... */
3916 if (ctl->hydz < 0)
3917 return;
3918
3919 /* Find air parcel next to reference height... */
3920 for (int ip = 0; ip < atm->np; ip++)
3921 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3922 dzmin = fabs(atm->z[ip] - ctl->hydz);
3923 ipref = ip;
3924 }
3925
3926 /* Upper part of profile... */
3927 for (int ip = ipref + 1; ip < atm->np; ip++) {
3928 double mean = 0;
3929 for (int i = 0; i < ipts; i++) {
3930 if (ctl->ig_h2o >= 0)
3931 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3932 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3933 mean += (e * mmh2o + (1 - e) * mmair)
3934 * G0 / RI
3935 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3936 }
3937
3938 /* Compute p(z,T)... */
3939 atm->p[ip] =
3940 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3941 }
3942
3943 /* Lower part of profile... */
3944 for (int ip = ipref - 1; ip >= 0; ip--) {
3945 double mean = 0;
3946 for (int i = 0; i < ipts; i++) {
3947 if (ctl->ig_h2o >= 0)
3948 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3949 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3950 mean += (e * mmh2o + (1 - e) * mmair)
3951 * G0 / RI
3952 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3953 }
3954
3955 /* Compute p(z,T)... */
3956 atm->p[ip] =
3957 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3958 }
3959}
3960
3961/*****************************************************************************/
3962
3964 const ctl_t *ctl,
3965 const int idx,
3966 char *quantity) {
3967
3968 if (idx == IDXP)
3969 sprintf(quantity, "PRESSURE");
3970
3971 if (idx == IDXT)
3972 sprintf(quantity, "TEMPERATURE");
3973
3974 for (int ig = 0; ig < ctl->ng; ig++)
3975 if (idx == IDXQ(ig))
3976 sprintf(quantity, "%s", ctl->emitter[ig]);
3977
3978 for (int iw = 0; iw < ctl->nw; iw++)
3979 if (idx == IDXK(iw))
3980 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3981
3982 if (idx == IDXCLZ)
3983 sprintf(quantity, "CLOUD_HEIGHT");
3984
3985 if (idx == IDXCLDZ)
3986 sprintf(quantity, "CLOUD_DEPTH");
3987
3988 for (int icl = 0; icl < ctl->ncl; icl++)
3989 if (idx == IDXCLK(icl))
3990 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3991
3992 if (idx == IDXSFT)
3993 sprintf(quantity, "SURFACE_TEMPERATURE");
3994
3995 for (int isf = 0; isf < ctl->nsf; isf++)
3996 if (idx == IDXSFEPS(isf))
3997 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3998}
3999
4000/*****************************************************************************/
4001
4003 const ctl_t *ctl,
4004 tbl_t *tbl) {
4005
4006 /* Write info... */
4007 LOG(1, "Initialize source function table...");
4008 LOG(2, "Number of data points: %d", TBLNS);
4009
4010 /* Loop over channels... */
4011 for (int id = 0; id < ctl->nd; id++) {
4012
4013 /* Get minimum grid spacing... */
4014 double dnu = 1.0;
4015 for (int i = 1; i < tbl->filt_n[id]; i++)
4016 dnu = MIN(dnu, tbl->filt_nu[id][i] - tbl->filt_nu[id][i - 1]);
4017
4018 /* Compute source function table... */
4019#pragma omp parallel for default(none) shared(ctl,tbl,id,dnu)
4020 for (int it = 0; it < TBLNS; it++) {
4021
4022 /* Set temperature... */
4023 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
4024
4025 /* Integrate Planck function... */
4026 double fsum = tbl->sr[it][id] = 0;
4027 for (double fnu = tbl->filt_nu[id][0];
4028 fnu <= tbl->filt_nu[id][tbl->filt_n[id] - 1]; fnu += dnu) {
4029 const int i = locate_irr(tbl->filt_nu[id], tbl->filt_n[id], fnu);
4030 const double ff = LIN(tbl->filt_nu[id][i], tbl->filt_f[id][i],
4031 tbl->filt_nu[id][i + 1], tbl->filt_f[id][i + 1],
4032 fnu);
4033 fsum += ff;
4034 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
4035 }
4036 tbl->sr[it][id] /= fsum;
4037 }
4038
4039 /* Write info... */
4040 LOG(2,
4041 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
4042 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
4043 tbl->sr[TBLNS - 1][id]);
4044 }
4045}
4046
4047/*****************************************************************************/
4048
4050 const ctl_t *ctl,
4051 const atm_t *atm,
4052 const double z,
4053 double *p,
4054 double *t,
4055 double *q,
4056 double *k) {
4057
4058 /* Get array index... */
4059 const int ip = locate_irr(atm->z, atm->np, z);
4060
4061 /* Interpolate... */
4062 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
4063 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
4064 for (int ig = 0; ig < ctl->ng; ig++)
4065 q[ig] =
4066 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
4067 for (int iw = 0; iw < ctl->nw; iw++)
4068 k[iw] =
4069 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
4070}
4071
4072/*****************************************************************************/
4073
4075 const ctl_t *ctl,
4076 const tbl_t *tbl,
4077 const los_t *los,
4078 const int ip,
4079 double tau_path[ND][NG],
4080 double tau_seg[ND]) {
4081
4082 double eps, lnp[NG];
4083
4084 /* Precompute log-pressure... */
4085 for (int ig = 0; ig < ctl->ng; ig++)
4086 lnp[ig] = log(los->cgp[ip][ig]);
4087
4088 /* Loop over channels... */
4089 for (int id = 0; id < ctl->nd; id++) {
4090
4091 /* Initialize... */
4092 tau_seg[id] = 1;
4093
4094 /* Loop over emitters.... */
4095 for (int ig = 0; ig < ctl->ng; ig++) {
4096
4097 /* Check size of table (pressure) and column density... */
4098 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4099 eps = 0;
4100
4101 /* Check transmittance... */
4102 else if (tau_path[id][ig] < 1e-9)
4103 eps = 1;
4104
4105 /* Interpolate... */
4106 else {
4107
4108 /* Determine pressure and temperature indices... */
4109 const int ipr =
4110 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
4111 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
4112 los->cgt[ip][ig]);
4113 const int it1 =
4114 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4115 los->cgt[ip][ig]);
4116
4117 /* Check size of table (temperature and column density)... */
4118 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4119 || tbl->nu[id][ig][ipr][it0] < 2
4120 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4121 || tbl->nu[id][ig][ipr + 1][it1] < 2
4122 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4123 eps = 0;
4124
4125 else {
4126
4127 /* Get emissivities of extended path... */
4128 const double logu = log(los->cgu[ip][ig]);
4129 double eps00 = intpol_tbl_eps(tbl, ig, id, ipr, it0, logu);
4130 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, logu);
4131 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, logu);
4132 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, logu);
4133
4134 /* Interpolate with respect to temperature... */
4135 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4136 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4137 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4138 tbl->t[id][ig][ipr + 1][it1 + 1],
4139 eps11, los->cgt[ip][ig]);
4140
4141 /* Interpolate with respect to log-pressure... */
4142 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4143 tbl->lnp[id][ig][ipr + 1], eps11, lnp[ig]);
4144
4145 /* Check emissivity range... */
4146 eps00 = CLAMP(eps00, 0, 1);
4147
4148 /* Determine segment emissivity... */
4149 eps = 1 - (1 - eps00) / tau_path[id][ig];
4150
4151 /* Check emissivity range... */
4152 eps = CLAMP(eps, 0, 1);
4153 }
4154 }
4155
4156 /* Get transmittance of extended path... */
4157 tau_path[id][ig] *= (1 - eps);
4158
4159 /* Get segment transmittance... */
4160 tau_seg[id] *= (1 - eps);
4161 }
4162 }
4163}
4164
4165/*****************************************************************************/
4166
4168 const ctl_t *ctl,
4169 const tbl_t *tbl,
4170 const los_t *los,
4171 const int ip,
4172 double tau_path[ND][NG],
4173 double tau_seg[ND]) {
4174
4175 const double lnp = log(los->p[ip]);
4176
4177 double eps, u;
4178
4179 /* Loop over channels... */
4180 for (int id = 0; id < ctl->nd; id++) {
4181
4182 /* Initialize... */
4183 tau_seg[id] = 1;
4184
4185 /* Loop over emitters.... */
4186 for (int ig = 0; ig < ctl->ng; ig++) {
4187
4188 /* Check size of table (pressure) and column density... */
4189 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4190 eps = 0;
4191
4192 /* Check transmittance... */
4193 else if (tau_path[id][ig] < 1e-9)
4194 eps = 1;
4195
4196 /* Interpolate... */
4197 else {
4198
4199 /* Determine pressure and temperature indices... */
4200 const int ipr =
4201 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4202 const int it0 =
4203 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4204 const int it1 =
4205 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4206 los->t[ip]);
4207
4208 /* Check size of table (temperature and column density)... */
4209 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4210 || tbl->nu[id][ig][ipr][it0] < 2
4211 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4212 || tbl->nu[id][ig][ipr + 1][it1] < 2
4213 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4214 eps = 0;
4215
4216 else {
4217
4218 /* Get emissivities of extended path... */
4219 const double logeps = log(1.0 - tau_path[id][ig]);
4220
4221 u = intpol_tbl_u(tbl, ig, id, ipr, it0, logeps);
4222 double eps00
4223 = intpol_tbl_eps(tbl, ig, id, ipr, it0, log(u + los->u[ip][ig]));
4224
4225 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, logeps);
4226 double eps01 = intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1,
4227 log(u + los->u[ip][ig]));
4228
4229 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, logeps);
4230 double eps10 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1,
4231 log(u + los->u[ip][ig]));
4232
4233 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, logeps);
4234 double eps11 = intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1,
4235 log(u + los->u[ip][ig]));
4236
4237 /* Interpolate with respect to temperature... */
4238 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4239 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4240 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4241 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4242
4243 /* Interpolate with respect to log-pressure... */
4244 eps00 = LIN(tbl->lnp[id][ig][ipr], eps00,
4245 tbl->lnp[id][ig][ipr + 1], eps11, lnp);
4246
4247 /* Check emissivity range... */
4248 eps00 = CLAMP(eps00, 0, 1);
4249
4250 /* Determine segment emissivity... */
4251 eps = 1 - (1 - eps00) / tau_path[id][ig];
4252
4253 /* Check emissivity range... */
4254 eps = CLAMP(eps, 0, 1);
4255 }
4256 }
4257
4258 /* Get transmittance of extended path... */
4259 tau_path[id][ig] *= (1 - eps);
4260
4261 /* Get segment transmittance... */
4262 tau_seg[id] *= (1 - eps);
4263 }
4264 }
4265}
4266
4267/*****************************************************************************/
4268
4269inline double intpol_tbl_eps(
4270 const tbl_t *tbl,
4271 const int ig,
4272 const int id,
4273 const int ip,
4274 const int it,
4275 const double logu) {
4276
4277 const int nu = tbl->nu[id][ig][ip][it];
4278 const float *logu_arr = tbl->logu[id][ig][ip][it];
4279 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4280
4281 /* Work in log-space and only convert back when needed... */
4282 const double logu_min = (double) logu_arr[0];
4283 const double logu_max = (double) logu_arr[nu - 1];
4284
4285 /* Lower boundary extrapolation (u < u_min)...
4286 eps ~ eps_min * u/u_min => log(eps) = logeps_min + log(u) - log(u_min) */
4287 if (logu < logu_min) {
4288 const double logeps_min = (double) logeps_arr[0];
4289 return exp(logeps_min + logu - logu_min);
4290 }
4291
4292 /* Upper boundary extrapolation (u > u_max)...
4293 * Assume eps(u) approaches 1 exponentially:
4294 * eps(u) = 1 - exp(a * u), a < 0
4295 * Continuity at (u_max, eps_max) gives
4296 * a = log(1 - eps_max) / u_max.
4297 * Use log1p/expm1 and u/u_max = exp(log(u) - log(u_max)) for stability.
4298 */
4299 if (logu > logu_max) {
4300 const double eps_max = exp((double) logeps_arr[nu - 1]);
4301 const double l1m_eps_max = log1p(-eps_max);
4302 const double r = exp(logu - logu_max);
4303 return -expm1(l1m_eps_max * r);
4304 }
4305
4306 /* Interpolation (log-log using precomputed logs)... */
4307 const int idx = locate_tbl(logu_arr, nu, logu);
4308 return exp(LIN(logu_arr[idx], logeps_arr[idx],
4309 logu_arr[idx + 1], logeps_arr[idx + 1], logu));
4310}
4311
4312/*****************************************************************************/
4313
4314inline double intpol_tbl_u(
4315 const tbl_t *tbl,
4316 const int ig,
4317 const int id,
4318 const int ip,
4319 const int it,
4320 const double logeps) {
4321
4322 const int nu = tbl->nu[id][ig][ip][it];
4323 const float *logeps_arr = tbl->logeps[id][ig][ip][it];
4324 const float *logu_arr = tbl->logu[id][ig][ip][it];
4325
4326 /* Work in log-space and only convert back when needed.... */
4327 const double logeps_min = (double) logeps_arr[0];
4328 const double logeps_max = (double) logeps_arr[nu - 1];
4329
4330 /* Lower boundary extrapolation (eps < eps_min)...
4331 u ~ u_min * eps/eps_min => log(u) = log(u_min) + log(eps) - log(eps_min) */
4332 if (logeps < logeps_min) {
4333 const double logu_min = (double) logu_arr[0];
4334 return exp(logu_min + logeps - logeps_min);
4335 }
4336
4337 /* Upper boundary extrapolation (eps > eps_max):
4338 * Invert the exponential tail used for eps(u):
4339 * u = log(1 - eps) / a,
4340 * with a = log(1 - eps_max) / u_max.
4341 * Rewritten as
4342 * u = u_max * log(tau) / log(1 - eps_max)
4343 * for numerical stability (log1p).
4344 */
4345 if (logeps > logeps_max) {
4346 const double u_max = exp((double) logu_arr[nu - 1]);
4347 const double l1m_eps_max = log1p(-exp(logeps_max));
4348 const double logtau = log1p(-exp(logeps));
4349 return u_max * (logtau / l1m_eps_max);
4350 }
4351
4352 /* Interpolation (log-log using precomputed logs)... */
4353 const int idx = locate_tbl(logeps_arr, nu, logeps);
4354 return exp(LIN(logeps_arr[idx], logu_arr[idx],
4355 logeps_arr[idx + 1], logu_arr[idx + 1], logeps));
4356}
4357
4358/*****************************************************************************/
4359
4361 const double jsec,
4362 int *year,
4363 int *mon,
4364 int *day,
4365 int *hour,
4366 int *min,
4367 int *sec,
4368 double *remain) {
4369
4370 struct tm t0, *t1;
4371
4372 t0.tm_year = 100;
4373 t0.tm_mon = 0;
4374 t0.tm_mday = 1;
4375 t0.tm_hour = 0;
4376 t0.tm_min = 0;
4377 t0.tm_sec = 0;
4378
4379 const time_t jsec0 = (time_t) jsec + timegm(&t0);
4380 t1 = gmtime(&jsec0);
4381
4382 *year = t1->tm_year + 1900;
4383 *mon = t1->tm_mon + 1;
4384 *day = t1->tm_mday;
4385 *hour = t1->tm_hour;
4386 *min = t1->tm_min;
4387 *sec = t1->tm_sec;
4388 *remain = jsec - floor(jsec);
4389}
4390
4391/*****************************************************************************/
4392
4394 const ctl_t *ctl,
4395 const tbl_t *tbl,
4396 atm_t *atm,
4397 obs_t *obs,
4398 gsl_matrix *k) {
4399
4400 /* Get sizes... */
4401 const size_t m = k->size1;
4402 const size_t n = k->size2;
4403
4404 /* Allocate... */
4405 gsl_vector *x0 = gsl_vector_alloc(n);
4406 gsl_vector *yy0 = gsl_vector_alloc(m);
4407 int *iqa;
4408 ALLOC(iqa, int,
4409 N);
4410
4411 /* Compute radiance for undisturbed atmospheric data... */
4412 formod(ctl, tbl, atm, obs);
4413
4414 /* Compose vectors... */
4415 atm2x(ctl, atm, x0, iqa, NULL);
4416 obs2y(ctl, obs, yy0, NULL, NULL);
4417
4418 /* Initialize kernel matrix... */
4419 gsl_matrix_set_zero(k);
4420
4421 /* Loop over state vector elements... */
4422#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4423 for (size_t j = 0; j < n; j++) {
4424
4425 /* Allocate... */
4426 atm_t *atm1;
4427 obs_t *obs1;
4428 ALLOC(atm1, atm_t, 1);
4429 ALLOC(obs1, obs_t, 1);
4430 gsl_vector *x1 = gsl_vector_alloc(n);
4431 gsl_vector *yy1 = gsl_vector_alloc(m);
4432
4433 /* Set perturbation size... */
4434 double h;
4435 if (iqa[j] == IDXP)
4436 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4437 else if (iqa[j] == IDXT)
4438 h = 1.0;
4439 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4440 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4441 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4442 h = 1e-4;
4443 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4444 h = 1.0;
4445 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4446 h = 1e-4;
4447 else if (iqa[j] == IDXSFT)
4448 h = 1.0;
4449 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4450 h = 1e-2;
4451 else
4452 ERRMSG("Cannot set perturbation size!");
4453
4454 /* Disturb state vector element... */
4455 gsl_vector_memcpy(x1, x0);
4456 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4457 copy_atm(ctl, atm1, atm, 0);
4458 copy_obs(ctl, obs1, obs, 0);
4459 x2atm(ctl, x1, atm1);
4460
4461 /* Compute radiance for disturbed atmospheric data... */
4462 formod(ctl, tbl, atm1, obs1);
4463
4464 /* Compose measurement vector for disturbed radiance data... */
4465 obs2y(ctl, obs1, yy1, NULL, NULL);
4466
4467 /* Compute derivatives... */
4468 for (size_t i = 0; i < m; i++)
4469 gsl_matrix_set(k, i, j,
4470 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4471
4472 /* Free... */
4473 gsl_vector_free(x1);
4474 gsl_vector_free(yy1);
4475 free(atm1);
4476 free(obs1);
4477 }
4478
4479 /* Free... */
4480 gsl_vector_free(x0);
4481 gsl_vector_free(yy0);
4482 free(iqa);
4483}
4484
4485/*****************************************************************************/
4486
4488 const double *xx,
4489 const int n,
4490 const double x) {
4491
4492 int ilo = 0;
4493 int ihi = n - 1;
4494 int i = (ihi + ilo) >> 1;
4495
4496 if (xx[i] < xx[i + 1])
4497 while (ihi > ilo + 1) {
4498 i = (ihi + ilo) >> 1;
4499 if (xx[i] > x)
4500 ihi = i;
4501 else
4502 ilo = i;
4503 } else
4504 while (ihi > ilo + 1) {
4505 i = (ihi + ilo) >> 1;
4506 if (xx[i] <= x)
4507 ihi = i;
4508 else
4509 ilo = i;
4510 }
4511
4512 return ilo;
4513}
4514
4515/*****************************************************************************/
4516
4518 const double *xx,
4519 const int n,
4520 const double x) {
4521
4522 /* Calculate index... */
4523 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4524
4525 /* Check range... */
4526 if (i < 0)
4527 return 0;
4528 else if (i > n - 2)
4529 return n - 2;
4530 else
4531 return i;
4532}
4533
4534/*****************************************************************************/
4535
4536inline int locate_tbl(
4537 const float *xx,
4538 const int n,
4539 const double x) {
4540
4541 int ilo = 0;
4542 int ihi = n - 1;
4543 int i = (ihi + ilo) >> 1;
4544
4545 while (ihi > ilo + 1) {
4546 i = (ihi + ilo) >> 1;
4547 if (xx[i] > x)
4548 ihi = i;
4549 else
4550 ilo = i;
4551 }
4552
4553 return ilo;
4554}
4555
4556/*****************************************************************************/
4557
4559 gsl_matrix *a) {
4560
4561 size_t diag = 1;
4562
4563 /* Get size... */
4564 const size_t n = a->size1;
4565
4566 /* Check if matrix is diagonal... */
4567 for (size_t i = 0; i < n && diag; i++)
4568 for (size_t j = i + 1; j < n; j++)
4569 if (gsl_matrix_get(a, i, j) != 0) {
4570 diag = 0;
4571 break;
4572 }
4573
4574 /* Quick inversion of diagonal matrix... */
4575 if (diag)
4576 for (size_t i = 0; i < n; i++)
4577 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4578
4579 /* Matrix inversion by means of Cholesky decomposition... */
4580 else {
4581 gsl_linalg_cholesky_decomp(a);
4582 gsl_linalg_cholesky_invert(a);
4583 }
4584}
4585
4586/*****************************************************************************/
4587
4589 const gsl_matrix *a,
4590 const gsl_vector *b,
4591 const int transpose,
4592 gsl_matrix *c) {
4593
4594 /* Set sizes... */
4595 const size_t m = a->size1;
4596 const size_t n = a->size2;
4597
4598 /* Allocate... */
4599 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4600
4601 /* Compute A^T B A... */
4602 if (transpose == 1) {
4603
4604 /* Compute B^1/2 A... */
4605 for (size_t i = 0; i < m; i++)
4606 for (size_t j = 0; j < n; j++)
4607 gsl_matrix_set(aux, i, j,
4608 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4609
4610 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4611 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4612 }
4613
4614 /* Compute A B A^T... */
4615 else if (transpose == 2) {
4616
4617 /* Compute A B^1/2... */
4618 for (size_t i = 0; i < m; i++)
4619 for (size_t j = 0; j < n; j++)
4620 gsl_matrix_set(aux, i, j,
4621 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4622
4623 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4624 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4625 }
4626
4627 /* Free... */
4628 gsl_matrix_free(aux);
4629}
4630
4631/*****************************************************************************/
4632
4633size_t obs2y(
4634 const ctl_t *ctl,
4635 const obs_t *obs,
4636 gsl_vector *y,
4637 int *ida,
4638 int *ira) {
4639
4640 size_t m = 0;
4641
4642 /* Determine measurement vector... */
4643 for (int ir = 0; ir < obs->nr; ir++)
4644 for (int id = 0; id < ctl->nd; id++)
4645 if (isfinite(obs->rad[id][ir])) {
4646 if (y != NULL)
4647 gsl_vector_set(y, m, obs->rad[id][ir]);
4648 if (ida != NULL)
4649 ida[m] = id;
4650 if (ira != NULL)
4651 ira[m] = ir;
4652 m++;
4653 }
4654
4655 return m;
4656}
4657
4658/*****************************************************************************/
4659
4661 ret_t *ret,
4662 ctl_t *ctl,
4663 tbl_t *tbl,
4664 obs_t *obs_meas,
4665 obs_t *obs_i,
4666 atm_t *atm_apr,
4667 atm_t *atm_i,
4668 double *chisq) {
4669
4670 double disq = 0, lmpar = 0.001;
4671
4672 /* ------------------------------------------------------------
4673 Initialize...
4674 ------------------------------------------------------------ */
4675
4676 /* Allocate... */
4677 int *ipa, *iqa;
4678 ALLOC(ipa, int,
4679 N);
4680 ALLOC(iqa, int,
4681 N);
4682
4683 /* Get sizes... */
4684 const size_t m = obs2y(ctl, obs_meas, NULL, NULL, NULL);
4685 const size_t n = atm2x(ctl, atm_apr, NULL, iqa, ipa);
4686 if (m == 0 || n == 0) {
4687 WARN("Check problem definition (m = 0 or n = 0)!");
4688 *chisq = GSL_NAN;
4689 return;
4690 }
4691
4692 /* Allocate... */
4693 gsl_matrix *a = gsl_matrix_alloc(n, n);
4694 gsl_matrix *cov = gsl_matrix_alloc(n, n);
4695 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
4696 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
4697
4698 gsl_vector *b = gsl_vector_alloc(n);
4699 gsl_vector *dx = gsl_vector_alloc(n);
4700 gsl_vector *dy = gsl_vector_alloc(m);
4701 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
4702 gsl_vector *sig_formod = gsl_vector_alloc(m);
4703 gsl_vector *sig_noise = gsl_vector_alloc(m);
4704 gsl_vector *x_a = gsl_vector_alloc(n);
4705 gsl_vector *x_i = gsl_vector_alloc(n);
4706 gsl_vector *x_step = gsl_vector_alloc(n);
4707 gsl_vector *y_aux = gsl_vector_alloc(m);
4708 gsl_vector *y_i = gsl_vector_alloc(m);
4709 gsl_vector *y_m = gsl_vector_alloc(m);
4710
4711 /* Set timer... */
4712 SELECT_TIMER("RET_SETUP", "RETRIEVAL");
4713
4714 /* Set initial state... */
4715 copy_atm(ctl, atm_i, atm_apr, 0);
4716 copy_obs(ctl, obs_i, obs_meas, 0);
4717 formod(ctl, tbl, atm_i, obs_i);
4718
4719 /* Set state vectors and observation vectors... */
4720 atm2x(ctl, atm_apr, x_a, NULL, NULL);
4721 atm2x(ctl, atm_i, x_i, NULL, NULL);
4722 obs2y(ctl, obs_meas, y_m, NULL, NULL);
4723 obs2y(ctl, obs_i, y_i, NULL, NULL);
4724
4725 /* Set inverse a priori covariance S_a^-1... */
4726 set_cov_apr(ret, ctl, atm_apr, iqa, ipa, s_a_inv);
4727 int lockfd = shared_io_lock(ret);
4728 const char *dirname;
4729 int profile;
4730 const char *filename =
4732 "matrix_cov_apr.tab", &dirname, &profile);
4733 write_matrix(dirname, filename, ctl, s_a_inv,
4734 atm_i, obs_i, "x", "x", "r", profile);
4735 shared_io_unlock(lockfd);
4736 matrix_invert(s_a_inv);
4737
4738 /* Get measurement errors... */
4739 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
4740
4741 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4742 gsl_vector_memcpy(dx, x_i);
4743 gsl_vector_sub(dx, x_a);
4744 gsl_vector_memcpy(dy, y_m);
4745 gsl_vector_sub(dy, y_i);
4746
4747 /* Compute cost function... */
4748 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4749
4750 /* Write info... */
4751 LOG(2, "it= %d / chi^2/m= %g", 0, *chisq);
4752
4753 /* Compute initial kernel... */
4754 SELECT_TIMER("RET_KERNEL_INIT", "RETRIEVAL");
4755 kernel(ctl, tbl, atm_i, obs_i, k_i);
4756
4757 /* ------------------------------------------------------------
4758 Levenberg-Marquardt minimization...
4759 ------------------------------------------------------------ */
4760
4761 SELECT_TIMER("RET_ITERATE", "RETRIEVAL");
4762
4763 /* Outer loop... */
4764 for (int it = 1; it <= ret->conv_itmax; it++) {
4765
4766 /* Store current cost function value... */
4767 double chisq_old = *chisq;
4768
4769 /* Compute kernel matrix K_i... */
4770 if (it > 1 && it % ret->kernel_recomp == 0)
4771 kernel(ctl, tbl, atm_i, obs_i, k_i);
4772
4773 /* Compute K_i^T * S_eps^{-1} * K_i ... */
4774 if (it == 1 || it % ret->kernel_recomp == 0)
4775 matrix_product(k_i, sig_eps_inv, 1, cov);
4776
4777 /* Determine b = K_i^T * S_eps^{-1} * dy - S_a^{-1} * dx ... */
4778 for (size_t i = 0; i < m; i++)
4779 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
4780 * POW2(gsl_vector_get(sig_eps_inv, i)));
4781 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
4782 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
4783
4784 /* Inner loop... */
4785 for (int it2 = 0; it2 < 20; it2++) {
4786
4787 /* Compute A = (1 + lmpar) * S_a^{-1} + K_i^T * S_eps^{-1} * K_i ... */
4788 gsl_matrix_memcpy(a, s_a_inv);
4789 gsl_matrix_scale(a, 1 + lmpar);
4790 gsl_matrix_add(a, cov);
4791
4792 /* Solve A * x_step = b by means of Cholesky decomposition... */
4793 gsl_linalg_cholesky_decomp(a);
4794 gsl_linalg_cholesky_solve(a, b, x_step);
4795
4796 /* Update atmospheric state... */
4797 gsl_vector_add(x_i, x_step);
4798 copy_atm(ctl, atm_i, atm_apr, 0);
4799 copy_obs(ctl, obs_i, obs_meas, 0);
4800 x2atm(ctl, x_i, atm_i);
4801
4802 /* Check atmospheric state... */
4803 for (int ip = 0; ip < atm_i->np; ip++) {
4804 atm_i->p[ip] = CLAMP(atm_i->p[ip], 5e-7, 5e4);
4805 atm_i->t[ip] = CLAMP(atm_i->t[ip], 100, 400);
4806 for (int ig = 0; ig < ctl->ng; ig++)
4807 atm_i->q[ig][ip] = CLAMP(atm_i->q[ig][ip], 0, 1);
4808 for (int iw = 0; iw < ctl->nw; iw++)
4809 atm_i->k[iw][ip] = MAX(atm_i->k[iw][ip], 0);
4810 }
4811 atm_i->clz = MAX(atm_i->clz, 0);
4812 atm_i->cldz = MAX(atm_i->cldz, 0.1);
4813 for (int icl = 0; icl < ctl->ncl; icl++)
4814 atm_i->clk[icl] = MAX(atm_i->clk[icl], 0);
4815 atm_i->sft = CLAMP(atm_i->sft, 100, 400);
4816 for (int isf = 0; isf < ctl->nsf; isf++)
4817 atm_i->sfeps[isf] = CLAMP(atm_i->sfeps[isf], 0, 1);
4818
4819 /* Forward calculation... */
4820 formod(ctl, tbl, atm_i, obs_i);
4821 obs2y(ctl, obs_i, y_i, NULL, NULL);
4822
4823 /* Determine dx = x_i - x_a and dy = y - F(x_i) ... */
4824 gsl_vector_memcpy(dx, x_i);
4825 gsl_vector_sub(dx, x_a);
4826 gsl_vector_memcpy(dy, y_m);
4827 gsl_vector_sub(dy, y_i);
4828
4829 /* Compute cost function... */
4830 *chisq = cost_function(dx, dy, s_a_inv, sig_eps_inv);
4831
4832 /* Modify Levenberg-Marquardt parameter... */
4833 if (*chisq > chisq_old) {
4834 lmpar *= 10;
4835 gsl_vector_sub(x_i, x_step);
4836 } else {
4837 lmpar /= 10;
4838 break;
4839 }
4840 }
4841
4842 /* Write info... */
4843 LOG(2, "it= %d / chi^2/m= %g", it, *chisq);
4844
4845 /* Get normalized step size in state space... */
4846 gsl_blas_ddot(x_step, b, &disq);
4847 disq /= (double) n;
4848
4849 /* Convergence test... */
4850 if ((it == 1 || it % ret->kernel_recomp == 0) && disq < ret->conv_dmin)
4851 break;
4852 }
4853
4854 /* ------------------------------------------------------------
4855 Analysis of retrieval results...
4856 ------------------------------------------------------------ */
4857
4858 /* Check if error analysis is requested... */
4859 if (ret->err_ana) {
4860
4861 SELECT_TIMER("RET_DIAGNOSTICS", "OUTPUT");
4862
4863 /* Store results... */
4864 lockfd = shared_io_lock(ret);
4866 "atm_final.tab", &dirname, &profile);
4867 write_atm(dirname, filename, ctl, atm_i, profile);
4869 "obs_final.tab", &dirname, &profile);
4870 write_obs(dirname, filename, ctl, obs_i, profile);
4871 filename =
4873 "matrix_kernel.tab", &dirname, &profile);
4874 write_matrix(dirname, filename, ctl, k_i,
4875 atm_i, obs_i, "y", "x", "r", profile);
4876
4877 /* Allocate... */
4878 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
4879 gsl_matrix *corr = gsl_matrix_alloc(n, n);
4880 gsl_matrix *gain = gsl_matrix_alloc(n, m);
4881
4882 /* Compute inverse retrieval covariance...
4883 cov^{-1} = S_a^{-1} + K_i^T * S_eps^{-1} * K_i */
4884 matrix_product(k_i, sig_eps_inv, 1, cov);
4885 gsl_matrix_add(cov, s_a_inv);
4886
4887 /* Compute retrieval covariance... */
4888 matrix_invert(cov);
4889 filename =
4891 "matrix_cov_ret.tab", &dirname, &profile);
4892 write_matrix(dirname, filename, ctl, cov,
4893 atm_i, obs_i, "x", "x", "r", profile);
4894 write_stddev("total", ret, ctl, atm_i, cov);
4895
4896 /* Compute correlation matrix... */
4897 for (size_t i = 0; i < n; i++)
4898 for (size_t j = 0; j < n; j++)
4899 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
4900 / sqrt(gsl_matrix_get(cov, i, i))
4901 / sqrt(gsl_matrix_get(cov, j, j)));
4903 "matrix_corr.tab", &dirname, &profile);
4904 write_matrix(dirname, filename, ctl, corr,
4905 atm_i, obs_i, "x", "x", "r", profile);
4906
4907 /* Compute gain matrix...
4908 G = cov * K^T * S_eps^{-1} */
4909 for (size_t i = 0; i < n; i++)
4910 for (size_t j = 0; j < m; j++)
4911 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
4912 * POW2(gsl_vector_get(sig_eps_inv, j)));
4913 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
4915 "matrix_gain.tab", &dirname, &profile);
4916 write_matrix(dirname, filename, ctl, gain,
4917 atm_i, obs_i, "x", "y", "c", profile);
4918
4919 /* Compute retrieval error due to noise... */
4920 matrix_product(gain, sig_noise, 2, a);
4921 write_stddev("noise", ret, ctl, atm_i, a);
4922
4923 /* Compute retrieval error due to forward model errors... */
4924 matrix_product(gain, sig_formod, 2, a);
4925 write_stddev("formod", ret, ctl, atm_i, a);
4926
4927 /* Compute averaging kernel matrix
4928 A = G * K ... */
4929 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
4931 "matrix_avk.tab", &dirname, &profile);
4932 write_matrix(dirname, filename, ctl, a,
4933 atm_i, obs_i, "x", "x", "r", profile);
4934
4935 /* Analyze averaging kernel matrix... */
4936 analyze_avk(ret, ctl, atm_i, iqa, ipa, a);
4937 shared_io_unlock(lockfd);
4938
4939 /* Free... */
4940 gsl_matrix_free(auxnm);
4941 gsl_matrix_free(corr);
4942 gsl_matrix_free(gain);
4943 }
4944
4945 /* ------------------------------------------------------------
4946 Finalize...
4947 ------------------------------------------------------------ */
4948
4949 gsl_matrix_free(a);
4950 gsl_matrix_free(cov);
4951 gsl_matrix_free(k_i);
4952 gsl_matrix_free(s_a_inv);
4953
4954 gsl_vector_free(b);
4955 gsl_vector_free(dx);
4956 gsl_vector_free(dy);
4957 gsl_vector_free(sig_eps_inv);
4958 gsl_vector_free(sig_formod);
4959 gsl_vector_free(sig_noise);
4960 gsl_vector_free(x_a);
4961 gsl_vector_free(x_i);
4962 gsl_vector_free(x_step);
4963 gsl_vector_free(y_aux);
4964 gsl_vector_free(y_i);
4965 gsl_vector_free(y_m);
4966
4967 free(ipa);
4968 free(iqa);
4969}
4970
4972 const ctl_t *ctl,
4973 const atm_t *atm,
4974 obs_t *obs,
4975 los_t *los,
4976 const int ir) {
4977
4978 const double h = 0.02, zrefrac = 60;
4979
4980 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4981 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4982
4983 int stop = 0;
4984
4985 /* Initialize... */
4986 los->np = 0;
4987 los->sft = -999;
4988 obs->tpz[ir] = obs->vpz[ir];
4989 obs->tplon[ir] = obs->vplon[ir];
4990 obs->tplat[ir] = obs->vplat[ir];
4991
4992 /* Get altitude range of atmospheric data... */
4993 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4994
4995 /* Check observer altitude... */
4996 if (obs->obsz[ir] < zmin)
4997 ERRMSG("Observer below surface!");
4998
4999 /* Determine Cartesian coordinates for observer and view point... */
5000 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
5001 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
5002
5003 /* Determine initial tangent vector... */
5004 for (int i = 0; i < 3; i++)
5005 ex0[i] = xvp[i] - xobs[i];
5006 norm = NORM(ex0);
5007 for (int i = 0; i < 3; i++)
5008 ex0[i] /= norm;
5009
5010 /* Observer within atmosphere... */
5011 for (int i = 0; i < 3; i++)
5012 x[i] = xobs[i];
5013
5014 /* Observer above atmosphere (search entry point)... */
5015 if (obs->obsz[ir] > zmax) {
5016 double dmax = norm, dmin = 0;
5017 while (fabs(dmin - dmax) > 0.001) {
5018 const double d = (dmax + dmin) / 2;
5019 for (int i = 0; i < 3; i++)
5020 x[i] = xobs[i] + d * ex0[i];
5021 cart2geo(x, &z, &lon, &lat);
5022 if (z <= zmax && z > zmax - 0.001)
5023 break;
5024 if (z < zmax - 0.0005)
5025 dmax = d;
5026 else
5027 dmin = d;
5028 }
5029 }
5030
5031 /* Ray-tracing... */
5032 while (1) {
5033
5034 /* Set step length... */
5035 double ds = ctl->rayds;
5036 if (ctl->raydz > 0) {
5037 norm = NORM(x);
5038 for (int i = 0; i < 3; i++)
5039 xh[i] = x[i] / norm;
5040 const double cosa = fabs(DOTP(ex0, xh));
5041 if (cosa != 0)
5042 ds = MIN(ctl->rayds, ctl->raydz / cosa);
5043 }
5044
5045 /* Determine geolocation... */
5046 cart2geo(x, &z, &lon, &lat);
5047
5048 /* Check if LOS hits the ground or has left atmosphere... */
5049 if (z < zmin || z > zmax) {
5050 stop = (z < zmin ? 2 : 1);
5051 const double frac =
5052 ((z <
5053 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
5054 1]);
5055 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
5056 los->lat[los->np - 1], xh);
5057 for (int i = 0; i < 3; i++)
5058 x[i] = xh[i] + frac * (x[i] - xh[i]);
5059 cart2geo(x, &z, &lon, &lat);
5060 los->ds[los->np - 1] = ds * frac;
5061 ds = 0;
5062 }
5063
5064 /* Interpolate atmospheric data... */
5065 intpol_atm(ctl, atm, z, &p, &t, q, k);
5066
5067 /* Save data... */
5068 los->lon[los->np] = lon;
5069 los->lat[los->np] = lat;
5070 los->z[los->np] = z;
5071 los->p[los->np] = p;
5072 los->t[los->np] = t;
5073 for (int ig = 0; ig < ctl->ng; ig++)
5074 los->q[los->np][ig] = q[ig];
5075 for (int id = 0; id < ctl->nd; id++)
5076 los->k[los->np][id] = k[ctl->window[id]];
5077 los->ds[los->np] = ds;
5078
5079 /* Add cloud extinction... */
5080 if (ctl->ncl > 0 && atm->cldz > 0) {
5081 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
5082 for (int id = 0; id < ctl->nd; id++) {
5083 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
5084 los->k[los->np][id]
5085 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
5086 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
5087 }
5088 }
5089
5090 /* Increment and check number of LOS points... */
5091 if ((++los->np) > NLOS)
5092 ERRMSG("Too many LOS points!");
5093
5094 /* Check stop flag... */
5095 if (stop) {
5096
5097 /* Set surface temperature... */
5098 if (ctl->nsf > 0 && atm->sft > 0)
5099 t = atm->sft;
5100 los->sft = (stop == 2 ? t : -999);
5101
5102 /* Set surface emissivity... */
5103 for (int id = 0; id < ctl->nd; id++) {
5104 los->sfeps[id] = 1.0;
5105 if (ctl->nsf > 0) {
5106 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
5107 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
5108 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
5109 ctl->nu[id]);
5110 }
5111 }
5112
5113 /* Leave raytracer... */
5114 break;
5115 }
5116
5117 /* Determine refractivity... */
5118 if (ctl->refrac && z <= zrefrac)
5119 n = 1 + REFRAC_EDLEN(p, t);
5120 else
5121 n = 1;
5122
5123 /* Construct new tangent vector (first term)... */
5124 for (int i = 0; i < 3; i++)
5125 ex1[i] = ex0[i] * n;
5126
5127 /* Compute gradient of refractivity... */
5128 if (ctl->refrac && z <= zrefrac) {
5129 for (int i = 0; i < 3; i++)
5130 xh[i] = x[i] + 0.5 * ds * ex0[i];
5131 cart2geo(xh, &z, &lon, &lat);
5132 intpol_atm(ctl, atm, z, &p, &t, q, k);
5133 n = REFRAC_EDLEN(p, t);
5134 for (int i = 0; i < 3; i++) {
5135 xh[i] += h;
5136 cart2geo(xh, &z, &lon, &lat);
5137 intpol_atm(ctl, atm, z, &p, &t, q, k);
5138 ng[i] = (REFRAC_EDLEN(p, t) - n) / h;
5139 xh[i] -= h;
5140 }
5141 } else
5142 for (int i = 0; i < 3; i++)
5143 ng[i] = 0;
5144
5145 /* Construct new tangent vector (second term)... */
5146 for (int i = 0; i < 3; i++)
5147 ex1[i] += ds * ng[i];
5148
5149 /* Normalize new tangent vector... */
5150 norm = NORM(ex1);
5151 for (int i = 0; i < 3; i++)
5152 ex1[i] /= norm;
5153
5154 /* Determine next point of LOS... */
5155 for (int i = 0; i < 3; i++)
5156 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
5157
5158 /* Copy tangent vector... */
5159 for (int i = 0; i < 3; i++)
5160 ex0[i] = ex1[i];
5161 }
5162
5163 /* Get tangent point (to be done before changing segment lengths!)... */
5164 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
5165
5166 /* Change segment lengths according to trapezoid rule... */
5167 for (int ip = los->np - 1; ip >= 1; ip--)
5168 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
5169 los->ds[0] *= 0.5;
5170
5171 /* Compute column density... */
5172 for (int ip = 0; ip < los->np; ip++)
5173 for (int ig = 0; ig < ctl->ng; ig++)
5174 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
5175 / (KB * los->t[ip]) * los->ds[ip];
5176
5177 /* Compute Curtis-Godson means... */
5178 for (int ig = 0; ig < ctl->ng; ig++) {
5179 los->cgu[0][ig] = los->u[0][ig];
5180 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
5181 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
5182 }
5183 for (int ip = 1; ip < los->np; ip++)
5184 for (int ig = 0; ig < ctl->ng; ig++) {
5185 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
5186 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
5187 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
5188 }
5189 for (int ip = 0; ip < los->np; ip++)
5190 for (int ig = 0; ig < ctl->ng; ig++)
5191 if (los->cgu[ip][ig] != 0) {
5192 los->cgp[ip][ig] /= los->cgu[ip][ig];
5193 los->cgt[ip][ig] /= los->cgu[ip][ig];
5194 }
5195}
5196
5197/*****************************************************************************/
5198
5200 const char *dirname,
5201 const char *filename,
5202 const ctl_t *ctl,
5203 atm_t *atm,
5204 int profile) {
5205
5206 /* Init... */
5207 atm->np = 0;
5208
5209 /* Set filename... */
5210 char file[LEN];
5211 if (dirname != NULL)
5212 sprintf(file, "%s/%s", dirname, filename);
5213 else
5214 sprintf(file, "%s", filename);
5215
5216 /* Write info... */
5217 LOG(1, "Read atmospheric data: %s", file);
5218
5219 /* Read ASCII data... */
5220 if (ctl->atmfmt == 1)
5221 read_atm_asc(file, ctl, atm);
5222
5223 /* Read binary data... */
5224 else if (ctl->atmfmt == 2)
5225 read_atm_bin(file, ctl, atm);
5226
5227 /* Read netCDF data... */
5228 else if (ctl->atmfmt == 3)
5229 read_atm_nc(file, ctl, atm, profile);
5230
5231 /* Check number of points... */
5232 if (atm->np < 1)
5233 ERRMSG("Could not read any data!");
5234
5235 /* Write info... */
5236 double mini, maxi;
5237 LOG(2, "Number of data points: %d", atm->np);
5238 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5239 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5240 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5241 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5242 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5243 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5244 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5245 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5246 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5247 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5248 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5249 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5250 for (int ig = 0; ig < ctl->ng; ig++) {
5251 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5252 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5253 }
5254 for (int iw = 0; iw < ctl->nw; iw++) {
5255 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5256 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5257 }
5258 if (ctl->ncl > 0) {
5259 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5260 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5261 } else
5262 LOG(2, "Cloud layer: none");
5263 if (ctl->nsf > 0) {
5264 LOG(2,
5265 "Surface: T_s = %g K | eps= %g ... %g",
5266 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5267 } else
5268 LOG(2, "Surface: none");
5269}
5270
5271/*****************************************************************************/
5272
5274 const char *filename,
5275 const ctl_t *ctl,
5276 atm_t *atm) {
5277
5278 /* Init... */
5279 atm->np = 0;
5280
5281 /* Open file... */
5282 FILE *in;
5283 if (!(in = fopen(filename, "r")))
5284 ERRMSG("Cannot open file!");
5285
5286 /* Read line... */
5287 char line[LEN], *tok;
5288 while (fgets(line, LEN, in)) {
5289
5290 /* Read data... */
5291 TOK(line, tok, "%lg", atm->time[atm->np]);
5292 TOK(NULL, tok, "%lg", atm->z[atm->np]);
5293 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
5294 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
5295 TOK(NULL, tok, "%lg", atm->p[atm->np]);
5296 TOK(NULL, tok, "%lg", atm->t[atm->np]);
5297 for (int ig = 0; ig < ctl->ng; ig++)
5298 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
5299 for (int iw = 0; iw < ctl->nw; iw++)
5300 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
5301 if (ctl->ncl > 0 && atm->np == 0) {
5302 TOK(NULL, tok, "%lg", atm->clz);
5303 TOK(NULL, tok, "%lg", atm->cldz);
5304 for (int icl = 0; icl < ctl->ncl; icl++)
5305 TOK(NULL, tok, "%lg", atm->clk[icl]);
5306 }
5307 if (ctl->nsf > 0 && atm->np == 0) {
5308 TOK(NULL, tok, "%lg", atm->sft);
5309 for (int isf = 0; isf < ctl->nsf; isf++)
5310 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
5311 }
5312
5313 /* Increment data point counter... */
5314 if ((++atm->np) > NP)
5315 ERRMSG("Too many data points!");
5316 }
5317
5318 /* Close file... */
5319 fclose(in);
5320}
5321
5322/*****************************************************************************/
5323
5325 const char *filename,
5326 const ctl_t *ctl,
5327 atm_t *atm) {
5328
5329 /* Open file... */
5330 FILE *in;
5331 if (!(in = fopen(filename, "r")))
5332 ERRMSG("Cannot open file!");
5333
5334 /* Read header... */
5335 char magic[4];
5336 FREAD(magic, char,
5337 4,
5338 in);
5339 if (memcmp(magic, "ATM1", 4) != 0)
5340 ERRMSG("Invalid magic string!");
5341
5342 int ng, nw, ncl, nsf;
5343 FREAD(&ng, int,
5344 1,
5345 in);
5346 FREAD(&nw, int,
5347 1,
5348 in);
5349 FREAD(&ncl, int,
5350 1,
5351 in);
5352 FREAD(&nsf, int,
5353 1,
5354 in);
5355 if (ng != ctl->ng || nw != ctl->nw || ncl != ctl->ncl || nsf != ctl->nsf)
5356 ERRMSG("Error reading file header!");
5357
5358 /* Read data... */
5359 size_t np;
5360 FREAD(&np, size_t,
5361 1,
5362 in);
5363 atm->np = (int) np;
5364 if (atm->np > NP)
5365 ERRMSG("Too many data points!");
5366 FREAD(atm->time, double,
5367 np,
5368 in);
5369 FREAD(atm->z, double,
5370 np,
5371 in);
5372 FREAD(atm->lon, double,
5373 np,
5374 in);
5375 FREAD(atm->lat, double,
5376 np,
5377 in);
5378 FREAD(atm->p, double,
5379 np,
5380 in);
5381 FREAD(atm->t, double,
5382 np,
5383 in);
5384 for (int ig = 0; ig < ctl->ng; ig++)
5385 FREAD(atm->q[ig], double,
5386 np,
5387 in);
5388 for (int iw = 0; iw < ctl->nw; iw++)
5389 FREAD(atm->k[iw], double,
5390 np,
5391 in);
5392 if (ctl->ncl > 0) {
5393 FREAD(&atm->clz, double,
5394 1,
5395 in);
5396 FREAD(&atm->cldz, double,
5397 1,
5398 in);
5399 FREAD(atm->clk, double,
5400 (size_t) ctl->ncl,
5401 in);
5402 }
5403 if (ctl->nsf) {
5404 FREAD(&atm->sft, double,
5405 1,
5406 in);
5407 FREAD(atm->sfeps, double,
5408 (size_t) ctl->nsf,
5409 in);
5410 }
5411
5412 /* Close file... */
5413 fclose(in);
5414}
5415
5416/*****************************************************************************/
5417
5419 const char *filename,
5420 const ctl_t *ctl,
5421 atm_t *atm,
5422 int profile) {
5423
5424 int ncid, var_time, var_z, var_lon, var_lat, var_p, var_t, var_q[NG],
5425 var_k[NW], var_cz = -1, var_cdz = -1, var_ck[NCL], var_sft =
5426 -1, var_sfe[NSF], var_nlev = -1;
5427
5428 char varname[LEN];
5429
5430 /* Open file... */
5431 NC(nc_open(filename, NC_NOWRITE, &ncid));
5432
5433 /* Initialize hyperslab... */
5434 size_t start[2] = { (size_t) profile, 0 };
5435 size_t count[2] = { 1, 0 };
5436
5437 /* Determine atm->np... */
5438 NC(nc_inq_varid(ncid, "nlev", &var_nlev));
5439 NC(nc_get_vara_int(ncid, var_nlev, start, count, &atm->np));
5440 if (atm->np < 1 || atm->np > NP)
5441 ERRMSG("Number of level out of range!");
5442
5443 /* Update hyperslab... */
5444 count[1] = (size_t) atm->np;
5445
5446 /* Inquire core variables... */
5447 NC(nc_inq_varid(ncid, "time", &var_time));
5448 NC(nc_inq_varid(ncid, "z", &var_z));
5449 NC(nc_inq_varid(ncid, "lon", &var_lon));
5450 NC(nc_inq_varid(ncid, "lat", &var_lat));
5451 NC(nc_inq_varid(ncid, "p", &var_p));
5452 NC(nc_inq_varid(ncid, "t", &var_t));
5453
5454 /* Inquire emiters... */
5455 for (int ig = 0; ig < ctl->ng; ig++)
5456 NC(nc_inq_varid(ncid, ctl->emitter[ig], &var_q[ig]));
5457
5458 /* Inquire extinctions... */
5459 for (int iw = 0; iw < ctl->nw; iw++) {
5460 sprintf(varname, "ext_win_%d", iw);
5461 NC(nc_inq_varid(ncid, varname, &var_k[iw]));
5462 }
5463
5464 /* Inquire cloud variables... */
5465 if (ctl->ncl > 0) {
5466 NC(nc_inq_varid(ncid, "cld_z", &var_cz));
5467 NC(nc_inq_varid(ncid, "cld_dz", &var_cdz));
5468 for (int icl = 0; icl < ctl->ncl; icl++) {
5469 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
5470 NC(nc_inq_varid(ncid, varname, &var_ck[icl]));
5471 }
5472 }
5473
5474 /* Inquire surface variables... */
5475 if (ctl->nsf > 0) {
5476 NC(nc_inq_varid(ncid, "srf_t", &var_sft));
5477 for (int isf = 0; isf < ctl->nsf; isf++) {
5478 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
5479 NC(nc_inq_varid(ncid, varname, &var_sfe[isf]));
5480 }
5481 }
5482
5483 /* Read core variables... */
5484 NC(nc_get_vara_double(ncid, var_time, start, count, atm->time));
5485 NC(nc_get_vara_double(ncid, var_z, start, count, atm->z));
5486 NC(nc_get_vara_double(ncid, var_lon, start, count, atm->lon));
5487 NC(nc_get_vara_double(ncid, var_lat, start, count, atm->lat));
5488 NC(nc_get_vara_double(ncid, var_p, start, count, atm->p));
5489 NC(nc_get_vara_double(ncid, var_t, start, count, atm->t));
5490
5491 /* Read emitters... */
5492 for (int ig = 0; ig < ctl->ng; ig++)
5493 NC(nc_get_vara_double(ncid, var_q[ig], start, count, atm->q[ig]));
5494
5495 /* Read extinctions... */
5496 for (int iw = 0; iw < ctl->nw; iw++)
5497 NC(nc_get_vara_double(ncid, var_k[iw], start, count, atm->k[iw]));
5498
5499 /* Read cloud variables... */
5500 if (ctl->ncl > 0) {
5501 NC(nc_get_vara_double(ncid, var_cz, start, count, &atm->clz));
5502 NC(nc_get_vara_double(ncid, var_cdz, start, count, &atm->cldz));
5503 for (int icl = 0; icl < ctl->ncl; icl++)
5504 NC(nc_get_vara_double(ncid, var_ck[icl], start, count, &atm->clk[icl]));
5505 }
5506
5507 /* Read surface variables... */
5508 if (ctl->nsf > 0) {
5509 NC(nc_get_vara_double(ncid, var_sft, start, count, &atm->sft));
5510
5511 for (int isf = 0; isf < ctl->nsf; isf++)
5512 NC(nc_get_vara_double
5513 (ncid, var_sfe[isf], start, count, &atm->sfeps[isf]));
5514 }
5515
5516 /* Close file... */
5517 NC(nc_close(ncid));
5518}
5519
5520/*****************************************************************************/
5521
5523 int argc,
5524 char *argv[],
5525 ctl_t *ctl) {
5526
5527 /* Write info... */
5528 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
5529 "(executable: %s | version: %s | compiled: %s, %s)\n",
5530 argv[0], VERSION, __DATE__, __TIME__);
5531
5532 /* Emitters... */
5533 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
5534 if (ctl->ng < 0 || ctl->ng > NG)
5535 ERRMSG("Set 0 <= NG <= MAX!");
5536 for (int ig = 0; ig < ctl->ng; ig++)
5537 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
5538 ctl->ig_co2 = find_emitter(ctl, "CO2");
5539 ctl->ig_h2o = find_emitter(ctl, "H2O");
5540 ctl->ig_n2 = find_emitter(ctl, "N2");
5541 ctl->ig_o2 = find_emitter(ctl, "O2");
5542
5543 /* Radiance channels... */
5544 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
5545 if (ctl->nd < 0 || ctl->nd > ND)
5546 ERRMSG("Set 0 <= ND <= MAX!");
5547 for (int id = 0; id < ctl->nd; id++)
5548 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
5549
5550 /* Spectral windows... */
5551 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
5552 if (ctl->nw < 0 || ctl->nw > NW)
5553 ERRMSG("Set 0 <= NW <= MAX!");
5554 for (int id = 0; id < ctl->nd; id++)
5555 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
5556
5557 /* Cloud data... */
5558 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
5559 if (ctl->ncl < 0 || ctl->ncl > NCL)
5560 ERRMSG("Set 0 <= NCL <= MAX!");
5561 if (ctl->ncl == 1)
5562 ERRMSG("Set NCL > 1!");
5563 for (int icl = 0; icl < ctl->ncl; icl++)
5564 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
5565
5566 /* Surface data... */
5567 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
5568 if (ctl->nsf < 0 || ctl->nsf > NSF)
5569 ERRMSG("Set 0 <= NSF <= MAX!");
5570 if (ctl->nsf == 1)
5571 ERRMSG("Set NSF > 1!");
5572 for (int isf = 0; isf < ctl->nsf; isf++)
5573 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
5574 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
5575 if (ctl->sftype < 0 || ctl->sftype > 3)
5576 ERRMSG("Set 0 <= SFTYPE <= 3!");
5577 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
5578
5579 /* Emissivity look-up tables... */
5580 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
5581 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
5582 if (ctl->tblfmt < 1 || ctl->tblfmt > 3)
5583 ERRMSG("Unknown look-up table file format, set TBLFMT to 1, 2, or 3!");
5584
5585 /* File formats... */
5586 ctl->atmfmt = (int) scan_ctl(argc, argv, "ATMFMT", -1, "1", NULL);
5587 if (ctl->atmfmt < 1 || ctl->atmfmt > 3)
5588 ERRMSG("Unknown atmospheric file format, set ATMFMT to 1, 2, or 3!");
5589 ctl->obsfmt = (int) scan_ctl(argc, argv, "OBSFMT", -1, "1", NULL);
5590 if (ctl->obsfmt < 1 || ctl->obsfmt > 3)
5591 ERRMSG("Unknown observation file format, set OBSFMT to 1, 2, or 3!");
5592 ctl->matrixfmt = (int) scan_ctl(argc, argv, "MATRIXFMT", -1, "1", NULL);
5593 if (ctl->matrixfmt < 1 || ctl->matrixfmt > 3)
5594 ERRMSG("Unknown matrix file format, set MATRIXFMT to 1, 2, or 3!");
5595
5596 /* Hydrostatic equilibrium... */
5597 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
5598
5599 /* Continua... */
5600 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
5601 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
5602 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
5603 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
5604
5605 /* Ray-tracing... */
5606 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
5607 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
5608 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
5609
5610 /* Field of view... */
5611 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
5612 if (ctl->fov[0] != '-')
5613 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
5614
5615 /* Retrieval interface... */
5616 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
5617 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
5618 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
5619 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
5620 for (int ig = 0; ig < ctl->ng; ig++) {
5621 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
5622 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
5623 }
5624 for (int iw = 0; iw < ctl->nw; iw++) {
5625 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
5626 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
5627 }
5628 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
5629 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
5630 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
5631 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
5632 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
5633
5634 /* Output flags... */
5635 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
5636 ctl->write_matrix =
5637 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
5638
5639 /* External forward models... */
5640 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
5641 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
5642 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
5643 for (int ig = 0; ig < ctl->ng; ig++)
5644 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
5645}
5646
5647/*****************************************************************************/
5648
5650 const char *dirname,
5651 const char *filename,
5652 const ctl_t *ctl,
5653 gsl_matrix *matrix,
5654 int dataset) {
5655
5656 /* Read ASCII data... */
5657 if (ctl->matrixfmt == 1)
5658 read_matrix_asc(dirname, filename, matrix);
5659
5660 /* Read binary data... */
5661 else if (ctl->matrixfmt == 2)
5662 read_matrix_bin(dirname, filename, matrix);
5663
5664 /* Read netCDF data... */
5665 else if (ctl->matrixfmt == 3)
5666 read_matrix_nc(dirname, filename, matrix, dataset);
5667
5668 /* Error... */
5669 else
5670 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
5671}
5672
5673/*****************************************************************************/
5674
5676 const char *dirname,
5677 const char *filename,
5678 gsl_matrix *matrix) {
5679
5680 char dum[LEN], file[LEN], line[LEN];
5681
5682 double value;
5683
5684 int i, j;
5685
5686 /* Set filename... */
5687 if (dirname != NULL)
5688 sprintf(file, "%s/%s", dirname, filename);
5689 else
5690 sprintf(file, "%s", filename);
5691
5692 /* Write info... */
5693 LOG(1, "Read matrix: %s", file);
5694
5695 /* Open file... */
5696 FILE *in;
5697 if (!(in = fopen(file, "r")))
5698 ERRMSG("Cannot open file!");
5699
5700 /* Read data... */
5701 gsl_matrix_set_zero(matrix);
5702 while (fgets(line, LEN, in))
5703 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
5704 &i, dum, dum, dum, dum, dum,
5705 &j, dum, dum, dum, dum, dum, &value) == 13)
5706 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
5707
5708 /* Close file... */
5709 fclose(in);
5710}
5711
5712/*****************************************************************************/
5713
5715 const char *dirname,
5716 const char *filename,
5717 gsl_matrix *matrix) {
5718
5719 char file[LEN], magic[4];
5720 size_t nr, nc;
5721
5722 /* Set filename... */
5723 if (dirname != NULL)
5724 sprintf(file, "%s/%s", dirname, filename);
5725 else
5726 sprintf(file, "%s", filename);
5727
5728 /* Write info... */
5729 LOG(1, "Read matrix: %s", file);
5730
5731 /* Open file... */
5732 FILE *in;
5733 if (!(in = fopen(file, "r")))
5734 ERRMSG("Cannot open file!");
5735
5736 /* Read header... */
5737 FREAD(magic, char,
5738 4,
5739 in);
5740 if (memcmp(magic, "MAT1", 4) != 0)
5741 ERRMSG("Invalid magic string!");
5742 FREAD(&nr, size_t,
5743 1,
5744 in);
5745 FREAD(&nc, size_t,
5746 1,
5747 in);
5748 if (nr != matrix->size1 || nc != matrix->size2)
5749 ERRMSG("Error reading file header!");
5750
5751 /* Read data... */
5752 for (size_t i = 0; i < nr; i++)
5753 for (size_t j = 0; j < nc; j++) {
5754 double value;
5755 FREAD(&value, double,
5756 1,
5757 in);
5758 gsl_matrix_set(matrix, i, j, value);
5759 }
5760
5761 /* Close file... */
5762 fclose(in);
5763}
5764
5765/*****************************************************************************/
5766
5768 const char *dirname,
5769 const char *filename,
5770 gsl_matrix *matrix,
5771 int dataset) {
5772
5773 char file[LEN];
5774
5775 int ncid, dimid_row, dimid_col, varid;
5776
5777 size_t nr, nc;
5778
5779 /* Set filename... */
5780 if (dirname != NULL)
5781 sprintf(file, "%s/%s", dirname, filename);
5782 else
5783 sprintf(file, "%s", filename);
5784
5785 /* Write info... */
5786 LOG(1, "Read matrix: %s", file);
5787
5788 /* Open file... */
5789 NC(nc_open(file, NC_NOWRITE, &ncid));
5790
5791 /* Read dimensions... */
5792 NC(nc_inq_dimid(ncid, "row", &dimid_row));
5793 NC(nc_inq_dimid(ncid, "col", &dimid_col));
5794 NC(nc_inq_dimlen(ncid, dimid_row, &nr));
5795 NC(nc_inq_dimlen(ncid, dimid_col, &nc));
5796 if (nr != matrix->size1 || nc != matrix->size2)
5797 ERRMSG("Error reading file header!");
5798
5799 /* Read data... */
5800 NC(nc_inq_varid(ncid, "matrix", &varid));
5801 for (size_t i = 0; i < nr; i++)
5802 for (size_t j = 0; j < nc; j++) {
5803 double value;
5804 size_t start[3] = { (size_t) dataset, i, j };
5805 size_t count[3] = { 1, 1, 1 };
5806 NC(nc_get_vara_double(ncid, varid, start, count, &value));
5807 gsl_matrix_set(matrix, i, j, value);
5808 }
5809
5810 /* Close file... */
5811 NC(nc_close(ncid));
5812}
5813
5814/*****************************************************************************/
5815
5817 const char *dirname,
5818 const char *filename,
5819 const ctl_t *ctl,
5820 obs_t *obs,
5821 int profile) {
5822
5823 /* Set filename... */
5824 char file[LEN];
5825 if (dirname != NULL)
5826 sprintf(file, "%s/%s", dirname, filename);
5827 else
5828 sprintf(file, "%s", filename);
5829
5830 /* Write info... */
5831 LOG(1, "Read observation data: %s", file);
5832
5833 /* Read ASCII data... */
5834 if (ctl->obsfmt == 1)
5835 read_obs_asc(file, ctl, obs);
5836
5837 /* Read binary data... */
5838 else if (ctl->obsfmt == 2)
5839 read_obs_bin(file, ctl, obs);
5840
5841 /* Read netCDF data... */
5842 else if (ctl->obsfmt == 3)
5843 read_obs_nc(file, ctl, obs, profile);
5844
5845 /* Check number of points... */
5846 if (obs->nr < 1)
5847 ERRMSG("Could not read any data!");
5848
5849 /* Write info... */
5850 double mini, maxi;
5851 LOG(2, "Number of ray paths: %d", obs->nr);
5852 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5853 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5854 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5855 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5856 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5857 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5858 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5859 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5860 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5861 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5862 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5863 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5864 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5865 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5866 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5867 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5868 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5869 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5870 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5871 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5872 for (int id = 0; id < ctl->nd; id++) {
5873 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5874 if (ctl->write_bbt) {
5875 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5876 ctl->nu[id], mini, maxi);
5877 } else {
5878 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5879 ctl->nu[id], mini, maxi);
5880 }
5881 }
5882 for (int id = 0; id < ctl->nd; id++) {
5883 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5884 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5885 ctl->nu[id], mini, maxi);
5886 }
5887}
5888
5889/*****************************************************************************/
5890
5892 const char *filename,
5893 const ctl_t *ctl,
5894 obs_t *obs) {
5895
5896 /* Init... */
5897 obs->nr = 0;
5898
5899 /* Open file... */
5900 FILE *in;
5901 if (!(in = fopen(filename, "r")))
5902 ERRMSG("Cannot open file!");
5903
5904 /* Read line... */
5905 char line[LEN], *tok;
5906 while (fgets(line, LEN, in)) {
5907
5908 /* Read data... */
5909 TOK(line, tok, "%lg", obs->time[obs->nr]);
5910 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5911 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5912 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5913 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5914 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5915 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5916 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5917 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5918 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5919 for (int id = 0; id < ctl->nd; id++)
5920 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5921 for (int id = 0; id < ctl->nd; id++)
5922 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5923
5924 /* Increment counter... */
5925 if ((++obs->nr) > NR)
5926 ERRMSG("Too many rays!");
5927 }
5928
5929 /* Close file... */
5930 fclose(in);
5931}
5932
5933/*****************************************************************************/
5934
5936 const char *filename,
5937 const ctl_t *ctl,
5938 obs_t *obs) {
5939
5940 /* Open file... */
5941 FILE *in;
5942 if (!(in = fopen(filename, "r")))
5943 ERRMSG("Cannot open file!");
5944
5945 /* Read header... */
5946 char magic[4];
5947 FREAD(magic, char,
5948 4,
5949 in);
5950 if (memcmp(magic, "OBS1", 4) != 0)
5951 ERRMSG("Invalid magic string!");
5952
5953 int nd;
5954 FREAD(&nd, int,
5955 1,
5956 in);
5957 if (nd != ctl->nd)
5958 ERRMSG("Error reading file header!");
5959
5960 /* Read data... */
5961 size_t nr;
5962 FREAD(&nr, size_t,
5963 1,
5964 in);
5965 obs->nr = (int) nr;
5966 if (obs->nr > NR)
5967 ERRMSG("Too many ray paths!");
5968 FREAD(obs->time, double,
5969 nr,
5970 in);
5971 FREAD(obs->obsz, double,
5972 nr,
5973 in);
5974 FREAD(obs->obslon, double,
5975 nr,
5976 in);
5977 FREAD(obs->obslat, double,
5978 nr,
5979 in);
5980 FREAD(obs->vpz, double,
5981 nr,
5982 in);
5983 FREAD(obs->vplon, double,
5984 nr,
5985 in);
5986 FREAD(obs->vplat, double,
5987 nr,
5988 in);
5989 FREAD(obs->tpz, double,
5990 nr,
5991 in);
5992 FREAD(obs->tplon, double,
5993 nr,
5994 in);
5995 FREAD(obs->tplat, double,
5996 nr,
5997 in);
5998 for (int id = 0; id < ctl->nd; id++)
5999 FREAD(obs->rad[id], double,
6000 nr,
6001 in);
6002 for (int id = 0; id < ctl->nd; id++)
6003 FREAD(obs->tau[id], double,
6004 nr,
6005 in);
6006
6007 /* Close file... */
6008 fclose(in);
6009}
6010
6011/*****************************************************************************/
6012
6014 const char *filename,
6015 const ctl_t *ctl,
6016 obs_t *obs,
6017 const int profile) {
6018
6019 int ncid, var_nray = -1, var_time = -1, var_obsz = -1, var_obslon =
6020 -1, var_obslat = -1, var_vpz = -1, var_vplon = -1, var_vplat =
6021 -1, var_tpz = -1, var_tplon = -1, var_tplat =
6022 -1, var_rad[ND], var_tau[ND];
6023 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
6024
6025 /* Open file... */
6026 NC(nc_open(filename, NC_NOWRITE, &ncid));
6027
6028 /* Initialize hyperslab... */
6029 size_t start[2] = { (size_t) profile, 0 };
6030 size_t count[2] = { 1, 0 };
6031
6032 /* Read nray(profile) -> obs->nr */
6033 NC(nc_inq_varid(ncid, "nray", &var_nray));
6034 NC(nc_get_vara_int(ncid, var_nray, start, count, &obs->nr));
6035 if (obs->nr < 1 || obs->nr > NR)
6036 ERRMSG("Number of ray paths out of range!");
6037
6038 /* Update hyperslab... */
6039 count[1] = (size_t) obs->nr;
6040
6041 /* Inquire geometry variables... */
6042 NC(nc_inq_varid(ncid, "time", &var_time));
6043 NC(nc_inq_varid(ncid, "obs_z", &var_obsz));
6044 NC(nc_inq_varid(ncid, "obs_lon", &var_obslon));
6045 NC(nc_inq_varid(ncid, "obs_lat", &var_obslat));
6046
6047 NC(nc_inq_varid(ncid, "vp_z", &var_vpz));
6048 NC(nc_inq_varid(ncid, "vp_lon", &var_vplon));
6049 NC(nc_inq_varid(ncid, "vp_lat", &var_vplat));
6050
6051 NC(nc_inq_varid(ncid, "tp_z", &var_tpz));
6052 NC(nc_inq_varid(ncid, "tp_lon", &var_tplon));
6053 NC(nc_inq_varid(ncid, "tp_lat", &var_tplat));
6054
6055 /* Inquire spectral variables per channel... */
6056 for (int id = 0; id < ctl->nd; id++) {
6057 char varname[LEN];
6058
6059 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
6060 NC(nc_inq_varid(ncid, varname, &var_rad[id]));
6061
6062 sprintf(varname, "tau_%.4f", ctl->nu[id]);
6063 NC(nc_inq_varid(ncid, varname, &var_tau[id]));
6064 }
6065
6066 /* Read geometry... */
6067 NC(nc_get_vara_double(ncid, var_time, start, count, obs->time));
6068 NC(nc_get_vara_double(ncid, var_obsz, start, count, obs->obsz));
6069 NC(nc_get_vara_double(ncid, var_obslon, start, count, obs->obslon));
6070 NC(nc_get_vara_double(ncid, var_obslat, start, count, obs->obslat));
6071
6072 NC(nc_get_vara_double(ncid, var_vpz, start, count, obs->vpz));
6073 NC(nc_get_vara_double(ncid, var_vplon, start, count, obs->vplon));
6074 NC(nc_get_vara_double(ncid, var_vplat, start, count, obs->vplat));
6075
6076 NC(nc_get_vara_double(ncid, var_tpz, start, count, obs->tpz));
6077 NC(nc_get_vara_double(ncid, var_tplon, start, count, obs->tplon));
6078 NC(nc_get_vara_double(ncid, var_tplat, start, count, obs->tplat));
6079
6080 /* Read radiance and transmittance... */
6081 for (int id = 0; id < ctl->nd; id++) {
6082 NC(nc_get_vara_double(ncid, var_rad[id], start, count, obs->rad[id]));
6083 NC(nc_get_vara_double(ncid, var_tau[id], start, count, obs->tau[id]));
6084 }
6085
6086 /* Close file... */
6087 NC(nc_close(ncid));
6088}
6089
6090/*****************************************************************************/
6091
6093 const char *basename,
6094 const double z,
6095 const double *nu,
6096 const double *f,
6097 const int n) {
6098
6099 double fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
6100
6101 int npts;
6102
6103 /* Allocate... */
6104 ALLOC(nurfm, double,
6105 RFMNPTS);
6106 ALLOC(rad, double,
6107 RFMNPTS);
6108
6109 /* Search RFM spectrum... */
6110 FILE *in;
6111 char filename[LEN];
6112 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
6113 if (!(in = fopen(filename, "r"))) {
6114 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
6115 if (!(in = fopen(filename, "r")))
6116 ERRMSG("Cannot find RFM data file!");
6117 }
6118 fclose(in);
6119
6120 /* Read RFM spectrum... */
6121 read_rfm_spec(filename, nurfm, rad, &npts);
6122
6123 /* Set wavenumbers... */
6124 nu2[0] = nu[0];
6125 nu2[n - 1] = nu[n - 1];
6126 for (int i = 1; i < n - 1; i++)
6127 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
6128
6129 /* Convolute... */
6130 for (int ipts = 0; ipts < npts; ipts++)
6131 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
6132 const int idx = locate_irr(nu2, n, nurfm[ipts]);
6133 const double filt =
6134 LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
6135 fsum += filt;
6136 radsum += filt * rad[ipts];
6137 }
6138
6139 /* Free... */
6140 free(nurfm);
6141 free(rad);
6142
6143 /* Return radiance... */
6144 return radsum / fsum;
6145}
6146
6147/*****************************************************************************/
6148
6150 int argc,
6151 char *argv[],
6152 const ctl_t *ctl,
6153 ret_t *ret) {
6154
6155 /* Iteration control... */
6156 ret->kernel_recomp =
6157 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
6158 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
6159 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
6160
6161 /* Error analysis... */
6162 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "0", NULL);
6163
6164 for (int id = 0; id < ctl->nd; id++)
6165 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
6166
6167 for (int id = 0; id < ctl->nd; id++)
6168 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
6169
6170 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
6171 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
6172 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
6173
6174 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
6175 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
6176 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
6177
6178 for (int ig = 0; ig < ctl->ng; ig++) {
6179 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
6180 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
6181 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
6182 }
6183
6184 for (int iw = 0; iw < ctl->nw; iw++) {
6185 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
6186 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
6187 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
6188 }
6189
6190 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
6191 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
6192 for (int icl = 0; icl < ctl->ncl; icl++)
6193 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
6194
6195 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
6196 for (int isf = 0; isf < ctl->nsf; isf++)
6197 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
6198
6199 /* Shared retrieval I/O... */
6200 ret->shared_io_profile = 0;
6201 scan_ctl(argc, argv, "SHARED_IO_PROFLIST", -1, "-",
6202 ret->shared_io_proflist);
6203 scan_ctl(argc, argv, "SHARED_IO_ATM_APR_FILE", -1, "-",
6205 scan_ctl(argc, argv, "SHARED_IO_OBS_MEAS_FILE", -1, "-",
6207 scan_ctl(argc, argv, "SHARED_IO_ATM_FINAL_FILE", -1, "-",
6209 scan_ctl(argc, argv, "SHARED_IO_OBS_FINAL_FILE", -1, "-",
6211 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_APR_FILE", -1, "-",
6213 scan_ctl(argc, argv, "SHARED_IO_MATRIX_KERNEL_FILE", -1, "-",
6215 scan_ctl(argc, argv, "SHARED_IO_MATRIX_COV_RET_FILE", -1, "-",
6217 scan_ctl(argc, argv, "SHARED_IO_MATRIX_CORR_FILE", -1, "-",
6219 scan_ctl(argc, argv, "SHARED_IO_MATRIX_GAIN_FILE", -1, "-",
6221 scan_ctl(argc, argv, "SHARED_IO_MATRIX_AVK_FILE", -1, "-",
6223 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_TOTAL_FILE", -1, "-",
6225 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_NOISE_FILE", -1, "-",
6227 scan_ctl(argc, argv, "SHARED_IO_ATM_ERR_FORMOD_FILE", -1, "-",
6229 scan_ctl(argc, argv, "SHARED_IO_ATM_CONT_FILE", -1, "-",
6231 scan_ctl(argc, argv, "SHARED_IO_ATM_RES_FILE", -1, "-",
6233}
6234
6235/*****************************************************************************/
6236
6238 const char *filename,
6239 double *nu,
6240 double *rad,
6241 int *npts) {
6242
6243 char *line = NULL, *tok;
6244
6245 size_t line_buf_size = 0;
6246
6247 double dnu, nu0, nu1;
6248
6249 int ipts = 0;
6250
6251 /* Write info... */
6252 LOG(1, "Read RFM data: %s", filename);
6253
6254 /* Open file... */
6255 FILE *in;
6256 if (!(in = fopen(filename, "r")))
6257 ERRMSG("Cannot open file!");
6258
6259 /* Read header... */
6260 for (int i = 0; i < 4; i++)
6261 if (getline(&line, &line_buf_size, in) == -1)
6262 ERRMSG("Error while reading file header!");
6263 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
6264 ERRMSG("Invalid spectrum header format!");
6265
6266 /* Check number of spectral grid points... */
6267 if (*npts > RFMNPTS)
6268 ERRMSG("Too many spectral grid points!");
6269
6270 /* Read radiance data... */
6271 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
6272 tok = strtok(line, " \t\n");
6273 while (tok != NULL && ipts < *npts) {
6274 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
6275 ipts++;
6276 tok = strtok(NULL, " \t\n");
6277 }
6278 }
6279
6280 /* Check number of spectral grid points... */
6281 if (ipts != *npts)
6282 ERRMSG("Error while reading RFM data!");
6283
6284 /* Compute wavenumbers... */
6285 for (ipts = 0; ipts < *npts; ipts++)
6286 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
6287
6288 /* Close file... */
6289 fclose(in);
6290
6291 /* Free.. */
6292 free(line);
6293}
6294
6295/*****************************************************************************/
6296
6298 const char *filename,
6299 double *x,
6300 double *y,
6301 int *n) {
6302
6303 char line[LEN];
6304
6305 /* Write info... */
6306 LOG(1, "Read shape function: %s", filename);
6307
6308 /* Open file... */
6309 FILE *in;
6310 if (!(in = fopen(filename, "r")))
6311 ERRMSG("Cannot open file!");
6312
6313 /* Read data... */
6314 *n = 0;
6315 while (fgets(line, LEN, in))
6316 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
6317 if ((++(*n)) > NSHAPE)
6318 ERRMSG("Too many data points!");
6319
6320 /* Close file... */
6321 fclose(in);
6322
6323 /* Check number of data points... */
6324 if (*n < 2)
6325 ERRMSG("Could not read any data!");
6326
6327 /* Write info... */
6328 double mini, maxi;
6329 LOG(2, "Number of data points: %d", *n);
6330 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
6331 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
6332 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
6333 LOG(2, "Range of y values: %g ... %g", mini, maxi);
6334}
6335
6336/*****************************************************************************/
6337
6339 const ctl_t *ctl) {
6340
6341 /* Allocate... */
6342 tbl_t *tbl;
6343 ALLOC(tbl, tbl_t, 1);
6344
6345 /* Initialize filter function sizes... */
6346 for (int id = 0; id < ctl->nd; id++)
6347 tbl->filt_n[id] = 0;
6348
6349 /* Loop over trace gases... */
6350 for (int ig = 0; ig < ctl->ng; ig++) {
6351
6352 /* Read ASCII look-up tables... */
6353 if (ctl->tblfmt == 1)
6354 for (int id = 0; id < ctl->nd; id++) {
6355 read_tbl_asc(ctl, tbl, id, ig);
6356 TBL_LOG(tbl, id, ig);
6357 }
6358
6359 /* Read binary look-up tables... */
6360 else if (ctl->tblfmt == 2)
6361 for (int id = 0; id < ctl->nd; id++) {
6362 read_tbl_bin(ctl, tbl, id, ig);
6363 TBL_LOG(tbl, id, ig);
6364 }
6365
6366 /* Read netCDF look-up tables... */
6367 else if (ctl->tblfmt == 3) {
6368
6369 /* Open file... */
6370 int ncid;
6371 char filename[2 * LEN];
6372 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
6373 if (nc_open(filename, NC_NOWRITE, &ncid) != NC_NOERR) {
6374 WARN("Missing emissivity table: %s", filename);
6375 continue;
6376 } else
6377 LOG(1, "Read emissivity table: %s", filename);
6378
6379 /* Read channels... */
6380 for (int id = 0; id < ctl->nd; id++) {
6381 read_tbl_nc_channel(ctl, tbl, id, ig, ncid);
6382 TBL_LOG(tbl, id, ig);
6383 }
6384
6385 /* Close file... */
6386 NC(nc_close(ncid));
6387 }
6388 }
6389
6390 /* Calculate log-pressure... */
6391 for (int id = 0; id < ctl->nd; id++)
6392 for (int ig = 0; ig < ctl->ng; ig++)
6393 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6394 tbl->lnp[id][ig][ip] = log(tbl->p[id][ig][ip]);
6395
6396 /* Read filter functions... */
6397 if (ctl->tblfmt == 1)
6398 for (int id = 0; id < ctl->nd; id++) {
6399 char filename[2 * LEN];
6400 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
6401 read_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
6402 &tbl->filt_n[id]);
6403 }
6404
6405 /* Initialize source function lookup tables... */
6406 init_srcfunc(ctl, tbl);
6407
6408 /* Return pointer... */
6409 return tbl;
6410}
6411
6412/*****************************************************************************/
6413
6415 const ctl_t *ctl,
6416 tbl_t *tbl,
6417 const int id,
6418 const int ig) {
6419
6420 /* Initialize... */
6421 double eps, eps_old = -999, press, press_old = -999, temp,
6422 temp_old = -999, u, u_old = -999;
6423 int nrange = 0;
6424
6425 /* Set filename... */
6426 char filename[2 * LEN];
6427 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
6428 ctl->nu[id], ctl->emitter[ig]);
6429
6430 /* Open file... */
6431 FILE *in;
6432 if (!(in = fopen(filename, "r"))) {
6433 WARN("Missing emissivity table: %s", filename);
6434 return;
6435 } else
6436 LOG(1, "Read emissivity table: %s", filename);
6437
6438 /* Init pressure level counter... */
6439 tbl->np[id][ig] = -1;
6440
6441 /* Read data... */
6442 char line[LEN];
6443 while (fgets(line, LEN, in)) {
6444
6445 /* Parse line... */
6446 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
6447 continue;
6448
6449 /* Check ranges... */
6450 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
6451 nrange++;
6452 continue;
6453 }
6454
6455 /* Determine pressure index... */
6456 if (press != press_old) {
6457 press_old = press;
6458 if ((++tbl->np[id][ig]) >= TBLNP)
6459 ERRMSG("Too many pressure levels!");
6460 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
6461 }
6462
6463 /* Determine temperature index... */
6464 if (temp != temp_old) {
6465 temp_old = temp;
6466 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
6467 ERRMSG("Too many temperatures!");
6468 tbl->nu[id][ig][tbl->np[id][ig]]
6469 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
6470
6471 /* Reset dynamic arrays for this (ip,it) node... */
6472 tbl->logu[id][ig][tbl->np[id][ig]]
6473 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6474 tbl->logeps[id][ig][tbl->np[id][ig]]
6475 [tbl->nt[id][ig][tbl->np[id][ig]]] = NULL;
6476 }
6477
6478 /* Determine column density index... */
6479 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
6480 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
6481 eps_old = eps;
6482 u_old = u;
6483 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
6484 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
6485 ERRMSG("Too many column densities!");
6486
6487 /* Grow dynamic arrays (nu is used as an index during reading). */
6488 const int ip = tbl->np[id][ig];
6489 const int it = tbl->nt[id][ig][ip];
6490 const int iu = tbl->nu[id][ig][ip][it];
6491 const size_t nnew = (size_t) (iu + 1);
6492
6493 float *tmp = (float *) realloc(tbl->logu[id][ig][ip][it],
6494 nnew * sizeof(float));
6495 if (!tmp)
6496 ERRMSG("Out of memory!");
6497 tbl->logu[id][ig][ip][it] = tmp;
6498
6499 tmp =
6500 (float *) realloc(tbl->logeps[id][ig][ip][it], nnew * sizeof(float));
6501 if (!tmp)
6502 ERRMSG("Out of memory!");
6503 tbl->logeps[id][ig][ip][it] = tmp;
6504 }
6505
6506 /* Store data... */
6507 tbl->p[id][ig][tbl->np[id][ig]] = press;
6508 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6509 = temp;
6510 tbl->logu[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6511 [tbl->nu[id][ig][tbl->np[id][ig]]
6512 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(u);
6513 tbl->logeps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
6514 [tbl->nu[id][ig][tbl->np[id][ig]]
6515 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) log(eps);
6516 }
6517
6518 /* Increment counters... */
6519 tbl->np[id][ig]++;
6520 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6521 tbl->nt[id][ig][ip]++;
6522 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
6523 tbl->nu[id][ig][ip][it]++;
6524 }
6525
6526 /* Check ranges... */
6527 if (nrange > 0)
6528 WARN("Column density or emissivity out of range (%d data points)!",
6529 nrange);
6530
6531 /* Close file... */
6532 fclose(in);
6533}
6534
6535/*****************************************************************************/
6536
6538 const ctl_t *ctl,
6539 tbl_t *tbl,
6540 const int id,
6541 const int ig) {
6542
6543 /* Set filename... */
6544 char filename[2 * LEN];
6545 sprintf(filename, "%s_%.4f_%s.bin",
6546 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
6547
6548 /* Open file... */
6549 FILE *in = fopen(filename, "rb");
6550 if (!in) {
6551 WARN("Missing emissivity table: %s", filename);
6552 return;
6553 } else
6554 LOG(1, "Read emissivity table: %s", filename);
6555
6556 /* Read length.. */
6557 size_t nbytes;
6558 FREAD(&nbytes, size_t,
6559 1,
6560 in);
6561 if (nbytes <= 0)
6562 ERRMSG("Invalid packed table size!");
6563
6564 /* Read packed blob... */
6565 uint8_t *work = NULL;
6566 ALLOC(work, uint8_t, nbytes);
6567 FREAD(work, uint8_t, nbytes, in);
6568
6569 /* Unpack... */
6570 tbl_unpack(tbl, id, ig, work);
6571
6572 /* Close file... */
6573 fclose(in);
6574
6575 /* Free... */
6576 free(work);
6577}
6578
6579/*****************************************************************************/
6580
6582 const ctl_t *ctl,
6583 tbl_t *tbl,
6584 int id,
6585 int ig,
6586 int ncid) {
6587
6588 char varname[LEN];
6589
6590 int varid, dimid;
6591
6592 size_t nbytes;
6593
6594 /* Inquire variable... */
6595 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
6596 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
6597 WARN("Missing emissivity table: %s", varname);
6598 return;
6599 } else
6600 LOG(1, "Read emissivity table: %s", varname);
6601 NC(nc_inq_vardimid(ncid, varid, &dimid));
6602 NC(nc_inq_dimlen(ncid, dimid, &nbytes));
6603
6604 /* Read variable... */
6605 uint8_t *work = NULL;
6606 ALLOC(work, uint8_t, nbytes);
6607 NC(nc_get_var_uchar(ncid, varid, (unsigned char *) work));
6608
6609 /* Unpack... */
6610 tbl_unpack(tbl, id, ig, work);
6611
6612 /* Free... */
6613 free(work);
6614}
6615
6616/*****************************************************************************/
6617
6619 int argc,
6620 char *argv[],
6621 const char *varname,
6622 const int arridx,
6623 const char *defvalue,
6624 char *value) {
6625
6626 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
6627 rvarname[LEN], rval[LEN];
6628
6629 int contain = 0;
6630
6631 /* Open file... */
6632 FILE *in = NULL;
6633 if (argv[1][0] != '-')
6634 if (!(in = fopen(argv[1], "r")))
6635 ERRMSG("Cannot open file!");
6636
6637 /* Set full variable name... */
6638 if (arridx >= 0) {
6639 sprintf(fullname1, "%s[%d]", varname, arridx);
6640 sprintf(fullname2, "%s[*]", varname);
6641 } else {
6642 sprintf(fullname1, "%s", varname);
6643 sprintf(fullname2, "%s", varname);
6644 }
6645
6646 /* Read data... */
6647 if (in != NULL)
6648 while (fgets(line, LEN, in))
6649 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
6650 if (strcasecmp(rvarname, fullname1) == 0 ||
6651 strcasecmp(rvarname, fullname2) == 0) {
6652 contain = 1;
6653 break;
6654 }
6655 for (int i = 1; i < argc - 1; i++)
6656 if (strcasecmp(argv[i], fullname1) == 0 ||
6657 strcasecmp(argv[i], fullname2) == 0) {
6658 sprintf(rval, "%s", argv[i + 1]);
6659 contain = 1;
6660 break;
6661 }
6662
6663 /* Close file... */
6664 if (in != NULL)
6665 fclose(in);
6666
6667 /* Check for missing variables... */
6668 if (!contain) {
6669 if (strlen(defvalue) > 0)
6670 sprintf(rval, "%s", defvalue);
6671 else
6672 ERRMSG("Missing variable %s!\n", fullname1);
6673 }
6674
6675 /* Write info... */
6676 LOG(1, "%s = %s", fullname1, rval);
6677
6678 /* Return values... */
6679 if (value != NULL)
6680 sprintf(value, "%s", rval);
6681 return atof(rval);
6682}
6683
6684/*****************************************************************************/
6685
6687 const ret_t *ret,
6688 const ctl_t *ctl,
6689 const atm_t *atm,
6690 const int *iqa,
6691 const int *ipa,
6692 gsl_matrix *s_a) {
6693
6694 /* Get sizes... */
6695 const size_t n = s_a->size1;
6696
6697 /* Allocate... */
6698 gsl_vector *x_a = gsl_vector_alloc(n);
6699
6700 /* Get sigma vector... */
6701 atm2x(ctl, atm, x_a, NULL, NULL);
6702 for (size_t i = 0; i < n; i++) {
6703 if (iqa[i] == IDXP)
6704 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
6705 if (iqa[i] == IDXT)
6706 gsl_vector_set(x_a, i, ret->err_temp);
6707 for (int ig = 0; ig < ctl->ng; ig++)
6708 if (iqa[i] == IDXQ(ig))
6709 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
6710 for (int iw = 0; iw < ctl->nw; iw++)
6711 if (iqa[i] == IDXK(iw))
6712 gsl_vector_set(x_a, i, ret->err_k[iw]);
6713 if (iqa[i] == IDXCLZ)
6714 gsl_vector_set(x_a, i, ret->err_clz);
6715 if (iqa[i] == IDXCLDZ)
6716 gsl_vector_set(x_a, i, ret->err_cldz);
6717 for (int icl = 0; icl < ctl->ncl; icl++)
6718 if (iqa[i] == IDXCLK(icl))
6719 gsl_vector_set(x_a, i, ret->err_clk[icl]);
6720 if (iqa[i] == IDXSFT)
6721 gsl_vector_set(x_a, i, ret->err_sft);
6722 for (int isf = 0; isf < ctl->nsf; isf++)
6723 if (iqa[i] == IDXSFEPS(isf))
6724 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
6725 }
6726
6727 /* Check standard deviations... */
6728 for (size_t i = 0; i < n; i++)
6729 if (POW2(gsl_vector_get(x_a, i)) <= 0)
6730 ERRMSG("Check a priori data (zero standard deviation)!");
6731
6732 /* Initialize diagonal covariance... */
6733 gsl_matrix_set_zero(s_a);
6734 for (size_t i = 0; i < n; i++)
6735 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
6736
6737 /* Loop over matrix elements... */
6738 for (size_t i = 0; i < n; i++)
6739 for (size_t j = 0; j < n; j++)
6740 if (i != j && iqa[i] == iqa[j]) {
6741
6742 /* Initialize... */
6743 double cz = 0;
6744 double ch = 0;
6745
6746 /* Set correlation lengths for pressure... */
6747 if (iqa[i] == IDXP) {
6748 cz = ret->err_press_cz;
6749 ch = ret->err_press_ch;
6750 }
6751
6752 /* Set correlation lengths for temperature... */
6753 if (iqa[i] == IDXT) {
6754 cz = ret->err_temp_cz;
6755 ch = ret->err_temp_ch;
6756 }
6757
6758 /* Set correlation lengths for volume mixing ratios... */
6759 for (int ig = 0; ig < ctl->ng; ig++)
6760 if (iqa[i] == IDXQ(ig)) {
6761 cz = ret->err_q_cz[ig];
6762 ch = ret->err_q_ch[ig];
6763 }
6764
6765 /* Set correlation lengths for extinction... */
6766 for (int iw = 0; iw < ctl->nw; iw++)
6767 if (iqa[i] == IDXK(iw)) {
6768 cz = ret->err_k_cz[iw];
6769 ch = ret->err_k_ch[iw];
6770 }
6771
6772 /* Compute correlations... */
6773 if (cz > 0 && ch > 0) {
6774
6775 /* Get Cartesian coordinates... */
6776 double x0[3], x1[3];
6777 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
6778 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
6779
6780 /* Compute correlations... */
6781 const double rho =
6782 exp(-DIST(x0, x1) / ch -
6783 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
6784
6785 /* Set covariance... */
6786 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
6787 * gsl_vector_get(x_a, j) * rho);
6788 }
6789 }
6790
6791 /* Free... */
6792 gsl_vector_free(x_a);
6793}
6794
6795/*****************************************************************************/
6796
6798 const ret_t *ret,
6799 const ctl_t *ctl,
6800 const obs_t *obs,
6801 gsl_vector *sig_noise,
6802 gsl_vector *sig_formod,
6803 gsl_vector *sig_eps_inv) {
6804
6805 /* Allocate... */
6806 obs_t *obs_err;
6807 ALLOC(obs_err, obs_t, 1);
6808
6809 /* Get size... */
6810 const size_t m = sig_eps_inv->size;
6811
6812 /* Noise error (always considered in retrieval fit)... */
6813 copy_obs(ctl, obs_err, obs, 1);
6814 for (int ir = 0; ir < obs_err->nr; ir++)
6815 for (int id = 0; id < ctl->nd; id++)
6816 obs_err->rad[id][ir]
6817 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
6818 obs2y(ctl, obs_err, sig_noise, NULL, NULL);
6819
6820 /* Forward model error (always considered in retrieval fit)... */
6821 copy_obs(ctl, obs_err, obs, 1);
6822 for (int ir = 0; ir < obs_err->nr; ir++)
6823 for (int id = 0; id < ctl->nd; id++)
6824 obs_err->rad[id][ir]
6825 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
6826 obs2y(ctl, obs_err, sig_formod, NULL, NULL);
6827
6828 /* Total error... */
6829 for (size_t i = 0; i < m; i++)
6830 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
6831 +
6832 POW2(gsl_vector_get
6833 (sig_formod, i))));
6834
6835 /* Check standard deviations... */
6836 for (size_t i = 0; i < m; i++)
6837 if (gsl_vector_get(sig_eps_inv, i) <= 0)
6838 ERRMSG("Check measurement errors (zero standard deviation)!");
6839
6840 /* Free... */
6841 free(obs_err);
6842}
6843
6844/*****************************************************************************/
6845
6847 const ret_t *ret,
6848 const char *shared_file,
6849 const char *legacy_file,
6850 const char **dirname,
6851 int *profile) {
6852
6853 if (shared_file[0] != '-') {
6854 *dirname = NULL;
6855 *profile = ret->shared_io_profile;
6856 return shared_file;
6857 }
6858
6859 *dirname = ret->dir;
6860 *profile = 0;
6861 return legacy_file;
6862}
6863
6864/*****************************************************************************/
6865
6867 const ret_t *ret,
6868 const char *shared_file,
6869 const char *legacy_file,
6870 const char **dirname,
6871 int *profile) {
6872
6873 if (shared_file[0] != '-') {
6874 *dirname = NULL;
6875 *profile = ret->shared_io_profile;
6876 return shared_file;
6877 }
6878
6879 *dirname = ret->dir;
6880 *profile = 0;
6881 return legacy_file;
6882}
6883
6884/*****************************************************************************/
6885
6887 const ret_t *ret) {
6888
6889 const char *base = shared_io_output_file(ret);
6890 if (base == NULL)
6891 return -1;
6892
6893 char lockfile[LEN];
6894 if (snprintf(lockfile, LEN, "%s.lock", base) >= LEN)
6895 ERRMSG("Lock file name too long!");
6896 int fd = open(lockfile, O_CREAT | O_RDWR, 0666);
6897 if (fd < 0)
6898 ERRMSG("Cannot open lock file!");
6899
6900 struct flock fl;
6901 fl.l_type = F_WRLCK;
6902 fl.l_whence = SEEK_SET;
6903 fl.l_start = 0;
6904 fl.l_len = 0;
6905 if (fcntl(fd, F_SETLKW, &fl) < 0)
6906 ERRMSG("Cannot lock shared output file!");
6907
6908 return fd;
6909}
6910
6911/*****************************************************************************/
6912
6914 int fd) {
6915
6916 if (fd < 0)
6917 return;
6918
6919 struct flock fl;
6920 fl.l_type = F_UNLCK;
6921 fl.l_whence = SEEK_SET;
6922 fl.l_start = 0;
6923 fl.l_len = 0;
6924 if (fcntl(fd, F_SETLK, &fl) < 0)
6925 ERRMSG("Cannot unlock shared output file!");
6926 close(fd);
6927}
6928
6929/*****************************************************************************/
6930
6932 const ret_t *ret) {
6933
6934 if (ret->shared_io_atm_final_file[0] != '-')
6935 return ret->shared_io_atm_final_file;
6936 if (ret->shared_io_obs_final_file[0] != '-')
6937 return ret->shared_io_obs_final_file;
6938 if (ret->shared_io_matrix_cov_apr_file[0] != '-')
6940 if (ret->shared_io_matrix_kernel_file[0] != '-')
6941 return ret->shared_io_matrix_kernel_file;
6942 if (ret->shared_io_matrix_cov_ret_file[0] != '-')
6944 if (ret->shared_io_matrix_corr_file[0] != '-')
6945 return ret->shared_io_matrix_corr_file;
6946 if (ret->shared_io_matrix_gain_file[0] != '-')
6947 return ret->shared_io_matrix_gain_file;
6948 if (ret->shared_io_matrix_avk_file[0] != '-')
6949 return ret->shared_io_matrix_avk_file;
6950 if (ret->shared_io_atm_err_total_file[0] != '-')
6951 return ret->shared_io_atm_err_total_file;
6952 if (ret->shared_io_atm_err_noise_file[0] != '-')
6953 return ret->shared_io_atm_err_noise_file;
6954 if (ret->shared_io_atm_err_formod_file[0] != '-')
6956 if (ret->shared_io_atm_cont_file[0] != '-')
6957 return ret->shared_io_atm_cont_file;
6958 if (ret->shared_io_atm_res_file[0] != '-')
6959 return ret->shared_io_atm_res_file;
6960 return NULL;
6961}
6962
6963/*****************************************************************************/
6964
6966 const los_t *los,
6967 double *tpz,
6968 double *tplon,
6969 double *tplat) {
6970
6971 /* Find minimum altitude... */
6972 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
6973
6974 /* Nadir or zenith... */
6975 if (ip <= 0 || ip >= (size_t) los->np - 1) {
6976 *tpz = los->z[los->np - 1];
6977 *tplon = los->lon[los->np - 1];
6978 *tplat = los->lat[los->np - 1];
6979 }
6980
6981 /* Limb... */
6982 else {
6983
6984 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
6985 const double yy0 = los->z[ip - 1];
6986 const double yy1 = los->z[ip];
6987 const double yy2 = los->z[ip + 1];
6988 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
6989 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
6990 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
6991 const double b = -(yy0 - yy1) / x1 - a * x1;
6992 const double c = yy0;
6993
6994 /* Get tangent point location... */
6995 double dummy, v[3], v0[3], v2[3];
6996 const double x = -b / (2 * a);
6997 *tpz = a * x * x + b * x + c;
6998 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
6999 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
7000 for (int i = 0; i < 3; i++)
7001 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
7002 cart2geo(v, &dummy, tplon, tplat);
7003 }
7004}
7005
7006/*****************************************************************************/
7007
7009 const ctl_t *ctl,
7010 tbl_t *tbl) {
7011
7012 /* Check pointer... */
7013 if (!tbl)
7014 return;
7015
7016 /* Loop over channels and emitters... */
7017 for (int id = 0; id < ctl->nd; id++)
7018 for (int ig = 0; ig < ctl->ng; ig++) {
7019
7020 /* Check number of pressure levels... */
7021 const int np = tbl->np[id][ig];
7022 if (np < 0)
7023 continue;
7024
7025 /* Loop over pressure levels... */
7026 for (int ip = 0; ip < np; ip++) {
7027
7028 /* Loop over temperature levels... */
7029 const int nt = tbl->nt[id][ig][ip];
7030 for (int it = 0; it < nt; it++) {
7031
7032 /* Free... */
7033 free(tbl->logu[id][ig][ip][it]);
7034 free(tbl->logeps[id][ig][ip][it]);
7035 tbl->logu[id][ig][ip][it] = NULL;
7036 tbl->logeps[id][ig][ip][it] = NULL;
7037 }
7038 }
7039 }
7040
7041 /* Free... */
7042 free(tbl);
7043}
7044
7045/*****************************************************************************/
7046
7048 const tbl_t *tbl,
7049 int id,
7050 int ig,
7051 uint8_t *buf,
7052 size_t *bytes_used) {
7053
7054 uint8_t *cur = buf;
7055
7056 /* Pack lookup table... */
7057 int np = tbl->np[id][ig];
7058 memcpy(cur, &np, sizeof(np));
7059 cur += sizeof(np);
7060
7061 memcpy(cur, tbl->p[id][ig], (size_t) np * sizeof(double));
7062 cur += ((size_t) np * sizeof(double));
7063
7064 for (int ip = 0; ip < np; ip++) {
7065 int nt = tbl->nt[id][ig][ip];
7066 memcpy(cur, &nt, sizeof(nt));
7067 cur += sizeof(nt);
7068
7069 memcpy(cur, tbl->t[id][ig][ip], (size_t) nt * sizeof(double));
7070 cur += ((size_t) nt * sizeof(double));
7071
7072 for (int it = 0; it < nt; it++) {
7073 int nu = tbl->nu[id][ig][ip][it];
7074 memcpy(cur, &nu, sizeof(nu));
7075 cur += sizeof(nu);
7076
7077 memcpy(cur, tbl->logu[id][ig][ip][it], (size_t) nu * sizeof(float));
7078 cur += ((size_t) nu * sizeof(float));
7079
7080 memcpy(cur, tbl->logeps[id][ig][ip][it], (size_t) nu * sizeof(float));
7081 cur += ((size_t) nu * sizeof(float));
7082 }
7083 }
7084
7085 /* Pack filter function... */
7086 const int n = tbl->filt_n[id];
7087 memcpy(cur, &n, sizeof(n));
7088 cur += sizeof(n);
7089
7090 memcpy(cur, tbl->filt_nu[id], (size_t) n * sizeof(double));
7091 cur += ((size_t) n * sizeof(double));
7092
7093 memcpy(cur, tbl->filt_f[id], (size_t) n * sizeof(double));
7094 cur += ((size_t) n * sizeof(double));
7095
7096 *bytes_used = (size_t) (cur - buf);
7097}
7098
7099/*****************************************************************************/
7100
7102 const tbl_t *tbl,
7103 int id,
7104 int ig) {
7105
7106 size_t bytes = 0;
7107
7108 /* Size of lookup table... */
7109 const int np = tbl->np[id][ig];
7110 bytes += sizeof(int);
7111 bytes += ((size_t) np * sizeof(double));
7112
7113 for (int ip = 0; ip < np; ip++) {
7114 const int nt = tbl->nt[id][ig][ip];
7115 bytes += sizeof(int);
7116 bytes += ((size_t) nt * sizeof(double));
7117
7118 for (int it = 0; it < nt; it++) {
7119 const int nu = tbl->nu[id][ig][ip][it];
7120 bytes += sizeof(int);
7121 bytes += (2 * (size_t) nu * sizeof(float));
7122 }
7123 }
7124
7125 /* Size of filter function... */
7126 const int n = tbl->filt_n[id];
7127 bytes += sizeof(int);
7128 bytes += (2 * (size_t) n * sizeof(double));
7129
7130 return bytes;
7131}
7132
7133/*****************************************************************************/
7134
7136 tbl_t *tbl,
7137 int id,
7138 int ig,
7139 const uint8_t *buf) {
7140
7141 const uint8_t *cur = buf;
7142
7143 /* Unpack lookup table... */
7144 int np;
7145 memcpy(&np, cur, sizeof(np));
7146 cur += sizeof(np);
7147
7148 if (np < 0 || np > TBLNP)
7149 ERRMSG("np out of range!");
7150 tbl->np[id][ig] = np;
7151
7152 memcpy(tbl->p[id][ig], cur, (size_t) np * sizeof(double));
7153 cur += ((size_t) np * sizeof(double));
7154
7155 for (int ip = 0; ip < np; ip++) {
7156
7157 int nt;
7158 memcpy(&nt, cur, sizeof(nt));
7159 cur += sizeof(nt);
7160
7161 if (nt < 0 || nt > TBLNT)
7162 ERRMSG("nt out of range!");
7163 tbl->nt[id][ig][ip] = nt;
7164
7165 memcpy(tbl->t[id][ig][ip], cur, (size_t) nt * sizeof(double));
7166 cur += ((size_t) nt * sizeof(double));
7167
7168 for (int it = 0; it < nt; it++) {
7169
7170 int nu;
7171 memcpy(&nu, cur, sizeof(nu));
7172 cur += sizeof(nu);
7173
7174 if (nu < 0 || nu > TBLNU)
7175 ERRMSG("nu out of range!");
7176 tbl->nu[id][ig][ip][it] = nu;
7177
7178 ALLOC(tbl->logu[id][ig][ip][it], float,
7179 nu);
7180 ALLOC(tbl->logeps[id][ig][ip][it], float,
7181 nu);
7182
7183 memcpy(tbl->logu[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7184 cur += ((size_t) nu * sizeof(float));
7185
7186 memcpy(tbl->logeps[id][ig][ip][it], cur, (size_t) nu * sizeof(float));
7187 cur += ((size_t) nu * sizeof(float));
7188 }
7189 }
7190
7191 /* Unpack filter function... */
7192 int n;
7193 memcpy(&n, cur, sizeof(n));
7194 cur += sizeof(n);
7195
7196 if (n < 2 || n > NSHAPE)
7197 ERRMSG("Missing or invalid filter function (filt_n) in packed table!");
7198 tbl->filt_n[id] = n;
7199
7200 memcpy(tbl->filt_nu[id], cur, (size_t) n * sizeof(double));
7201 cur += ((size_t) n * sizeof(double));
7202
7203 memcpy(tbl->filt_f[id], cur, (size_t) n * sizeof(double));
7204 cur += ((size_t) n * sizeof(double));
7205
7206 return (size_t) (cur - buf);
7207}
7208
7209/*****************************************************************************/
7210
7212 const int year,
7213 const int mon,
7214 const int day,
7215 const int hour,
7216 const int min,
7217 const int sec,
7218 const double remain,
7219 double *jsec) {
7220
7221 struct tm t0, t1;
7222
7223 t0.tm_year = 100;
7224 t0.tm_mon = 0;
7225 t0.tm_mday = 1;
7226 t0.tm_hour = 0;
7227 t0.tm_min = 0;
7228 t0.tm_sec = 0;
7229
7230 t1.tm_year = year - 1900;
7231 t1.tm_mon = mon - 1;
7232 t1.tm_mday = day;
7233 t1.tm_hour = hour;
7234 t1.tm_min = min;
7235 t1.tm_sec = sec;
7236
7237 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
7238}
7239
7240/*****************************************************************************/
7241
7243 const char *name,
7244 const char *group,
7245 int output) {
7246
7247 static char names[NTIMER][100], groups[NTIMER][100];
7248 static double rt_name[NTIMER], rt_group[NTIMER], rt_min[NTIMER],
7249 rt_max[NTIMER], rt_sq[NTIMER], t0, t1;
7250 static int ct_name[NTIMER], iname = -1, igroup = -1, nname, ngroup;
7251
7252 /* Get time... */
7253 t1 = omp_get_wtime();
7254 const double dt = t1 - t0;
7255
7256 /* Accumulate runtime for current timer... */
7257 if (iname >= 0) {
7258 rt_name[iname] += dt;
7259 rt_sq[iname] += POW2(dt);
7260 rt_min[iname] = (ct_name[iname] <= 0 ? dt : MIN(rt_min[iname], dt));
7261 rt_max[iname] = (ct_name[iname] <= 0 ? dt : MAX(rt_max[iname], dt));
7262 ct_name[iname]++;
7263 }
7264 if (igroup >= 0)
7265 rt_group[igroup] += dt;
7266
7267 /* Write summary... */
7268 if (output) {
7269 for (int i = 0; i < nname; i++) {
7270 const double mean = rt_name[i] / ct_name[i];
7271 const double variance = MAX(0.0, rt_sq[i] / ct_name[i] - POW2(mean));
7272 LOG(1,
7273 "TIMER_%s = %.3f s (min= %g s, mean= %g s, stddev= %g s, max= %g s, n= %d)",
7274 names[i], rt_name[i], rt_min[i], mean, sqrt(variance), rt_max[i],
7275 ct_name[i]);
7276 }
7277 for (int i = 0; i < ngroup; i++)
7278 LOG(1, "TIMER_GROUP_%s = %.3f s", groups[i], rt_group[i]);
7279 double total = 0.0;
7280 for (int i = 0; i < nname; i++)
7281 total += rt_name[i];
7282 LOG(1, "TIMER_TOTAL = %.3f s", total);
7283 }
7284
7285 /* Identify next timer name... */
7286 for (iname = 0; iname < nname; iname++)
7287 if (strcasecmp(name, names[iname]) == 0)
7288 break;
7289 for (igroup = 0; igroup < ngroup; igroup++)
7290 if (strcasecmp(group, groups[igroup]) == 0)
7291 break;
7292
7293 /* Add new timer name if needed... */
7294 if (iname >= nname) {
7295 sprintf(names[iname], "%s", name);
7296 if ((++nname) >= NTIMER)
7297 ERRMSG("Too many timers!");
7298 }
7299
7300 /* Add new timer group if needed... */
7301 if (igroup >= ngroup) {
7302 sprintf(groups[igroup], "%s", group);
7303 if ((++ngroup) >= NTIMER)
7304 ERRMSG("Too many groups!");
7305 }
7306
7307 /* Save time stamp for next phase... */
7308 t0 = t1;
7309}
7310
7311/*****************************************************************************/
7312
7314 const char *dirname,
7315 const char *filename,
7316 const ctl_t *ctl,
7317 const atm_t *atm,
7318 int profile) {
7319
7320 /* Set filename... */
7321 char file[LEN];
7322 if (dirname != NULL)
7323 sprintf(file, "%s/%s", dirname, filename);
7324 else
7325 sprintf(file, "%s", filename);
7326
7327 /* Write info... */
7328 LOG(1, "Write atmospheric data: %s", file);
7329
7330 /* Write ASCII data... */
7331 if (ctl->atmfmt == 1)
7332 write_atm_asc(file, ctl, atm);
7333
7334 /* Write binary data... */
7335 else if (ctl->atmfmt == 2)
7336 write_atm_bin(file, ctl, atm);
7337
7338 /* Write netCDF data... */
7339 else if (ctl->atmfmt == 3)
7340 write_atm_nc(file, ctl, atm, profile);
7341
7342 /* Error... */
7343 else
7344 ERRMSG("Unknown file format, check ATMFMT!");
7345
7346 /* Write info... */
7347 double mini, maxi;
7348 LOG(2, "Number of data points: %d", atm->np);
7349 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
7350 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
7351 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
7352 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
7353 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
7354 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
7355 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
7356 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
7357 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
7358 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
7359 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
7360 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
7361 for (int ig = 0; ig < ctl->ng; ig++) {
7362 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
7363 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
7364 }
7365 for (int iw = 0; iw < ctl->nw; iw++) {
7366 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
7367 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
7368 }
7369 if (ctl->ncl > 0) {
7370 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
7371 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
7372 } else
7373 LOG(2, "Cloud layer: none");
7374 if (ctl->nsf > 0) {
7375 LOG(2,
7376 "Surface: T_s = %g K | eps= %g ... %g",
7377 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
7378 } else
7379 LOG(2, "Surface: none");
7380}
7381
7382/*****************************************************************************/
7383
7385 const char *filename,
7386 const ctl_t *ctl,
7387 const atm_t *atm) {
7388
7389 int n = 6;
7390
7391 /* Create file... */
7392 FILE *out;
7393 if (!(out = fopen(filename, "w")))
7394 ERRMSG("Cannot create file!");
7395
7396 /* Write header... */
7397 fprintf(out,
7398 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
7399 "# $2 = altitude [km]\n"
7400 "# $3 = longitude [deg]\n"
7401 "# $4 = latitude [deg]\n"
7402 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
7403 for (int ig = 0; ig < ctl->ng; ig++)
7404 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
7405 ++n, ctl->emitter[ig]);
7406 for (int iw = 0; iw < ctl->nw; iw++)
7407 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
7408 if (ctl->ncl > 0) {
7409 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
7410 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
7411 for (int icl = 0; icl < ctl->ncl; icl++)
7412 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
7413 ++n, ctl->clnu[icl]);
7414 }
7415 if (ctl->nsf > 0) {
7416 fprintf(out, "# $%d = surface temperature [K]\n", ++n);
7417 for (int isf = 0; isf < ctl->nsf; isf++)
7418 fprintf(out, "# $%d = surface emissivity (%.4f cm^-1)\n",
7419 ++n, ctl->sfnu[isf]);
7420 }
7421
7422 /* Write data... */
7423 for (int ip = 0; ip < atm->np; ip++) {
7424 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
7425 fprintf(out, "\n");
7426 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
7427 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
7428 for (int ig = 0; ig < ctl->ng; ig++)
7429 fprintf(out, " %g", atm->q[ig][ip]);
7430 for (int iw = 0; iw < ctl->nw; iw++)
7431 fprintf(out, " %g", atm->k[iw][ip]);
7432 if (ctl->ncl > 0) {
7433 fprintf(out, " %g %g", atm->clz, atm->cldz);
7434 for (int icl = 0; icl < ctl->ncl; icl++)
7435 fprintf(out, " %g", atm->clk[icl]);
7436 }
7437 if (ctl->nsf > 0) {
7438 fprintf(out, " %g", atm->sft);
7439 for (int isf = 0; isf < ctl->nsf; isf++)
7440 fprintf(out, " %g", atm->sfeps[isf]);
7441 }
7442 fprintf(out, "\n");
7443 }
7444
7445 /* Close file... */
7446 fclose(out);
7447}
7448
7449/*****************************************************************************/
7450
7452 const char *filename,
7453 const ctl_t *ctl,
7454 const atm_t *atm) {
7455
7456 /* Create file... */
7457 FILE *out;
7458 if (!(out = fopen(filename, "w")))
7459 ERRMSG("Cannot create file!");
7460
7461 /* Write header... */
7462 FWRITE("ATM1", char,
7463 4,
7464 out);
7465 FWRITE(&ctl->ng, int,
7466 1,
7467 out);
7468 FWRITE(&ctl->nw, int,
7469 1,
7470 out);
7471 FWRITE(&ctl->ncl, int,
7472 1,
7473 out);
7474 FWRITE(&ctl->nsf, int,
7475 1,
7476 out);
7477
7478 /* Write data... */
7479 size_t np = (size_t) atm->np;
7480 FWRITE(&np, size_t,
7481 1,
7482 out);
7483 FWRITE(atm->time, double,
7484 np,
7485 out);
7486 FWRITE(atm->z, double,
7487 np,
7488 out);
7489 FWRITE(atm->lon, double,
7490 np,
7491 out);
7492 FWRITE(atm->lat, double,
7493 np,
7494 out);
7495 FWRITE(atm->p, double,
7496 np,
7497 out);
7498 FWRITE(atm->t, double,
7499 np,
7500 out);
7501 for (int ig = 0; ig < ctl->ng; ig++)
7502 FWRITE(atm->q[ig], double,
7503 np,
7504 out);
7505 for (int iw = 0; iw < ctl->nw; iw++)
7506 FWRITE(atm->k[iw], double,
7507 np,
7508 out);
7509 if (ctl->ncl > 0) {
7510 FWRITE(&atm->clz, double,
7511 1,
7512 out);
7513 FWRITE(&atm->cldz, double,
7514 1,
7515 out);
7516 FWRITE(atm->clk, double,
7517 (size_t) ctl->ncl,
7518 out);
7519 }
7520 if (ctl->nsf > 0) {
7521 FWRITE(&atm->sft, double,
7522 1,
7523 out);
7524 FWRITE(atm->sfeps, double,
7525 (size_t) ctl->nsf,
7526 out);
7527 }
7528
7529 /* Close file... */
7530 fclose(out);
7531}
7532
7533/*****************************************************************************/
7534
7536 const char *filename,
7537 const ctl_t *ctl,
7538 const atm_t *atm,
7539 int profile) {
7540
7541 char longname[LEN], varname[LEN];
7542
7543 int ncid, varid, dim_profile, dim_level;
7544
7545 size_t level_max;
7546
7547 /* Check number of levels... */
7548 if (atm->np < 1 || atm->np > NP)
7549 ERRMSG("Number of levels out of range!");
7550
7551 /* Open or create file... */
7552 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7553 NC(nc_create(filename, NC_NETCDF4, &ncid));
7554
7555 /* Enter define mode... */
7556 int r = nc_redef(ncid);
7557 if (r != NC_NOERR && r != NC_EINDEFINE)
7558 NC(r);
7559
7560 /* Define profile dimension (unlimited)... */
7561 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
7562 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
7563
7564 /* Define level dimension (fixed)... */
7565 if (nc_inq_dimid(ncid, "level", &dim_level) == NC_NOERR) {
7566 NC(nc_inq_dimlen(ncid, dim_level, &level_max));
7567 if (level_max < 1 || level_max > (size_t) NP)
7568 ERRMSG("netCDF dimension level is out of range!");
7569 if ((size_t) atm->np > level_max)
7570 ERRMSG("profile has too many levels!");
7571 } else {
7572 level_max = (size_t) atm->np;
7573 NC(nc_def_dim(ncid, "level", level_max, &dim_level));
7574 }
7575
7576 /* Set dimension IDs... */
7577 int dimids[2] = { dim_profile, dim_level };
7578
7579 /* Tunables for compression/quantization... */
7580 const int deflate_level = 0;
7581 const int quant_digits = 0;
7582
7583 /* Define nlev (1D)... */
7584 if (nc_inq_varid(ncid, "nlev", &varid) != NC_NOERR)
7585 NC_DEF_VAR("nlev", NC_INT, 1, dimids,
7586 "number of vertical levels", "1", 0, 0);
7587
7588 /* Define core variables (2D)... */
7589 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
7590 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
7591 "time in seconds since 2000-01-01, 00:00 UTC", "s",
7592 deflate_level, 0);
7593
7594 if (nc_inq_varid(ncid, "z", &varid) != NC_NOERR)
7595 NC_DEF_VAR("z", NC_DOUBLE, 2, dimids, "altitude", "km", deflate_level, 0);
7596
7597 if (nc_inq_varid(ncid, "lon", &varid) != NC_NOERR)
7598 NC_DEF_VAR("lon", NC_DOUBLE, 2, dimids,
7599 "longitude", "degrees_east", deflate_level, 0);
7600
7601 if (nc_inq_varid(ncid, "lat", &varid) != NC_NOERR)
7602 NC_DEF_VAR("lat", NC_DOUBLE, 2, dimids,
7603 "latitude", "degrees_north", deflate_level, 0);
7604
7605 if (nc_inq_varid(ncid, "p", &varid) != NC_NOERR)
7606 NC_DEF_VAR("p", NC_DOUBLE, 2, dimids,
7607 "pressure", "hPa", deflate_level, quant_digits);
7608
7609 if (nc_inq_varid(ncid, "t", &varid) != NC_NOERR)
7610 NC_DEF_VAR("t", NC_DOUBLE, 2, dimids,
7611 "temperature", "K", deflate_level, quant_digits);
7612
7613 /* Write emitters (2D)... */
7614 for (int ig = 0; ig < ctl->ng; ig++)
7615 if (nc_inq_varid(ncid, ctl->emitter[ig], &varid) != NC_NOERR) {
7616 sprintf(longname, "%s volume mixing ratio", ctl->emitter[ig]);
7617 NC_DEF_VAR(ctl->emitter[ig], NC_DOUBLE, 2, dimids,
7618 longname, "ppv", deflate_level, quant_digits);
7619 }
7620
7621 /* Write extinction (2D)... */
7622 for (int iw = 0; iw < ctl->nw; iw++) {
7623 sprintf(varname, "ext_win_%d", iw);
7624 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7625 sprintf(longname, "extinction (window %d)", iw);
7626 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids,
7627 longname, "km**-1", deflate_level, quant_digits);
7628 }
7629 }
7630
7631 /* Write cloud variables (1D)... */
7632 if (ctl->ncl > 0) {
7633 if (nc_inq_varid(ncid, "cld_z", &varid) != NC_NOERR)
7634 NC_DEF_VAR("cld_z", NC_DOUBLE, 1, dimids,
7635 "cloud layer height", "km", deflate_level, quant_digits);
7636
7637 if (nc_inq_varid(ncid, "cld_dz", &varid) != NC_NOERR)
7638 NC_DEF_VAR("cld_dz", NC_DOUBLE, 1, dimids,
7639 "cloud layer depth", "km", deflate_level, quant_digits);
7640
7641 for (int icl = 0; icl < ctl->ncl; icl++) {
7642 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7643 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7644 sprintf(longname, "cloud layer extinction (%.4f cm^-1)",
7645 ctl->clnu[icl]);
7646 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "km**-1",
7647 deflate_level, quant_digits);
7648 }
7649 }
7650 }
7651
7652 /* Write surface variables (1D)... */
7653 if (ctl->nsf > 0) {
7654 if (nc_inq_varid(ncid, "srf_t", &varid) != NC_NOERR)
7655 NC_DEF_VAR("srf_t", NC_DOUBLE, 1, dimids,
7656 "surface temperature", "K", deflate_level, quant_digits);
7657
7658 for (int isf = 0; isf < ctl->nsf; isf++) {
7659 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7660 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7661 sprintf(longname, "surface emissivity (%.4f cm^-1)", ctl->sfnu[isf]);
7662 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname, "1",
7663 deflate_level, quant_digits);
7664 }
7665 }
7666 }
7667
7668 /* Leave define mode... */
7669 NC(nc_enddef(ncid));
7670
7671 /* Define hyperslabs... */
7672 size_t start[2] = { (size_t) profile, 0 };
7673 size_t count[2] = { 1, (size_t) atm->np };
7674
7675 /* Write nlev... */
7676 NC_PUT_INT("nlev", &atm->np, 1);
7677
7678 /* Write core variables... */
7679 NC_PUT_DOUBLE("time", atm->time, 1);
7680 NC_PUT_DOUBLE("z", atm->z, 1);
7681 NC_PUT_DOUBLE("lon", atm->lon, 1);
7682 NC_PUT_DOUBLE("lat", atm->lat, 1);
7683 NC_PUT_DOUBLE("p", atm->p, 1);
7684 NC_PUT_DOUBLE("t", atm->t, 1);
7685
7686 /* Write emitters... */
7687 for (int ig = 0; ig < ctl->ng; ig++)
7688 NC_PUT_DOUBLE(ctl->emitter[ig], atm->q[ig], 1);
7689
7690 /* Write extinction... */
7691 for (int iw = 0; iw < ctl->nw; iw++) {
7692 sprintf(varname, "ext_win_%d", iw);
7693 NC_PUT_DOUBLE(varname, atm->k[iw], 1);
7694 }
7695
7696 /* Write cloud variables... */
7697 if (ctl->ncl > 0) {
7698 NC_PUT_DOUBLE("cld_z", &atm->clz, 1);
7699 NC_PUT_DOUBLE("cld_dz", &atm->cldz, 1);
7700 for (int icl = 0; icl < ctl->ncl; icl++) {
7701 sprintf(varname, "cld_k_%.4f", ctl->clnu[icl]);
7702 NC_PUT_DOUBLE(varname, &atm->clk[icl], 1);
7703 }
7704 }
7705
7706 /* Write surface variables... */
7707 if (ctl->nsf > 0) {
7708 NC_PUT_DOUBLE("srf_t", &atm->sft, 1);
7709 for (int isf = 0; isf < ctl->nsf; isf++) {
7710 sprintf(varname, "srf_eps_%.4f", ctl->sfnu[isf]);
7711 NC_PUT_DOUBLE(varname, &atm->sfeps[isf], 1);
7712 }
7713 }
7714
7715 /* Close file... */
7716 NC(nc_sync(ncid));
7717 NC(nc_close(ncid));
7718}
7719
7720/*****************************************************************************/
7721
7723 const char *filename,
7724 const ctl_t *ctl,
7725 const atm_t *atm) {
7726
7727 /* Write info... */
7728 LOG(1, "Write RFM data: %s", filename);
7729
7730 /* Create file... */
7731 FILE *out;
7732 if (!(out = fopen(filename, "w")))
7733 ERRMSG("Cannot create file!");
7734
7735 /* Write data... */
7736 fprintf(out, "%d\n", atm->np);
7737 fprintf(out, "*HGT [km]\n");
7738 for (int ip = 0; ip < atm->np; ip++)
7739 fprintf(out, "%g\n", atm->z[ip]);
7740 fprintf(out, "*PRE [mb]\n");
7741 for (int ip = 0; ip < atm->np; ip++)
7742 fprintf(out, "%g\n", atm->p[ip]);
7743 fprintf(out, "*TEM [K]\n");
7744 for (int ip = 0; ip < atm->np; ip++)
7745 fprintf(out, "%g\n", atm->t[ip]);
7746 for (int ig = 0; ig < ctl->ng; ig++) {
7747 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
7748 for (int ip = 0; ip < atm->np; ip++)
7749 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
7750 }
7751 fprintf(out, "*END\n");
7752
7753 /* Close file... */
7754 fclose(out);
7755}
7756
7757/*****************************************************************************/
7758
7760 const char *dirname,
7761 const char *filename,
7762 const ctl_t *ctl,
7763 const gsl_matrix *matrix,
7764 const atm_t *atm,
7765 const obs_t *obs,
7766 const char *rowspace,
7767 const char *colspace,
7768 const char *sort,
7769 int dataset) {
7770
7771 /* Check output flag... */
7772 if (!ctl->write_matrix)
7773 return;
7774
7775 /* Write ASCII data... */
7776 if (ctl->matrixfmt == 1)
7777 write_matrix_asc(dirname, filename, ctl, matrix, atm, obs,
7778 rowspace, colspace, sort);
7779
7780 /* Write binary data... */
7781 else if (ctl->matrixfmt == 2)
7782 write_matrix_bin(dirname, filename, matrix);
7783
7784 /* Write netCDF data... */
7785 else if (ctl->matrixfmt == 3)
7786 write_matrix_nc(dirname, filename, ctl, matrix, atm, obs,
7787 rowspace, colspace, sort, dataset);
7788
7789 /* Error... */
7790 else
7791 ERRMSG("Unknown matrix file format, check MATRIXFMT!");
7792}
7793
7794/*****************************************************************************/
7795
7797 const char *dirname,
7798 const char *filename,
7799 const ctl_t *ctl,
7800 const gsl_matrix *matrix,
7801 const atm_t *atm,
7802 const obs_t *obs,
7803 const char *rowspace,
7804 const char *colspace,
7805 const char *sort) {
7806
7807 char file[LEN], quantity[LEN];
7808
7809 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
7810
7811 size_t i, j, nc, nr;
7812
7813 /* Allocate... */
7814 ALLOC(cida, int,
7815 M);
7816 ALLOC(ciqa, int,
7817 N);
7818 ALLOC(cipa, int,
7819 N);
7820 ALLOC(cira, int,
7821 M);
7822 ALLOC(rida, int,
7823 M);
7824 ALLOC(riqa, int,
7825 N);
7826 ALLOC(ripa, int,
7827 N);
7828 ALLOC(rira, int,
7829 M);
7830
7831 /* Set filename... */
7832 if (dirname != NULL)
7833 sprintf(file, "%s/%s", dirname, filename);
7834 else
7835 sprintf(file, "%s", filename);
7836
7837 /* Write info... */
7838 LOG(1, "Write matrix: %s", file);
7839
7840 /* Create file... */
7841 FILE *out;
7842 if (!(out = fopen(file, "w")))
7843 ERRMSG("Cannot create file!");
7844
7845 /* Write header (row space)... */
7846 if (rowspace[0] == 'y') {
7847
7848 fprintf(out,
7849 "# $1 = Row: index (measurement space)\n"
7850 "# $2 = Row: channel wavenumber [cm^-1]\n"
7851 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7852 "# $4 = Row: view point altitude [km]\n"
7853 "# $5 = Row: view point longitude [deg]\n"
7854 "# $6 = Row: view point latitude [deg]\n");
7855
7856 /* Get number of rows... */
7857 nr = obs2y(ctl, obs, NULL, rida, rira);
7858
7859 } else {
7860
7861 fprintf(out,
7862 "# $1 = Row: index (state space)\n"
7863 "# $2 = Row: name of quantity\n"
7864 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7865 "# $4 = Row: altitude [km]\n"
7866 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
7867
7868 /* Get number of rows... */
7869 nr = atm2x(ctl, atm, NULL, riqa, ripa);
7870 }
7871
7872 /* Write header (column space)... */
7873 if (colspace[0] == 'y') {
7874
7875 fprintf(out,
7876 "# $7 = Col: index (measurement space)\n"
7877 "# $8 = Col: channel wavenumber [cm^-1]\n"
7878 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7879 "# $10 = Col: view point altitude [km]\n"
7880 "# $11 = Col: view point longitude [deg]\n"
7881 "# $12 = Col: view point latitude [deg]\n");
7882
7883 /* Get number of columns... */
7884 nc = obs2y(ctl, obs, NULL, cida, cira);
7885
7886 } else {
7887
7888 fprintf(out,
7889 "# $7 = Col: index (state space)\n"
7890 "# $8 = Col: name of quantity\n"
7891 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7892 "# $10 = Col: altitude [km]\n"
7893 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
7894
7895 /* Get number of columns... */
7896 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
7897 }
7898
7899 /* Write header entry... */
7900 fprintf(out, "# $13 = Matrix element\n\n");
7901
7902 /* Write matrix data... */
7903 i = j = 0;
7904 while (i < nr && j < nc) {
7905
7906 /* Write info about the row... */
7907 if (rowspace[0] == 'y')
7908 fprintf(out, "%d %.4f %.2f %g %g %g",
7909 (int) i, ctl->nu[rida[i]],
7910 obs->time[rira[i]], obs->vpz[rira[i]],
7911 obs->vplon[rira[i]], obs->vplat[rira[i]]);
7912 else {
7913 idx2name(ctl, riqa[i], quantity);
7914 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
7915 atm->time[ripa[i]], atm->z[ripa[i]],
7916 atm->lon[ripa[i]], atm->lat[ripa[i]]);
7917 }
7918
7919 /* Write info about the column... */
7920 if (colspace[0] == 'y')
7921 fprintf(out, " %d %.4f %.2f %g %g %g",
7922 (int) j, ctl->nu[cida[j]],
7923 obs->time[cira[j]], obs->vpz[cira[j]],
7924 obs->vplon[cira[j]], obs->vplat[cira[j]]);
7925 else {
7926 idx2name(ctl, ciqa[j], quantity);
7927 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
7928 atm->time[cipa[j]], atm->z[cipa[j]],
7929 atm->lon[cipa[j]], atm->lat[cipa[j]]);
7930 }
7931
7932 /* Write matrix entry... */
7933 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
7934
7935 /* Set matrix indices... */
7936 if (sort[0] == 'r') {
7937 j++;
7938 if (j >= nc) {
7939 j = 0;
7940 i++;
7941 fprintf(out, "\n");
7942 }
7943 } else {
7944 i++;
7945 if (i >= nr) {
7946 i = 0;
7947 j++;
7948 fprintf(out, "\n");
7949 }
7950 }
7951 }
7952
7953 /* Close file... */
7954 fclose(out);
7955
7956 /* Free... */
7957 free(cida);
7958 free(ciqa);
7959 free(cipa);
7960 free(cira);
7961 free(rida);
7962 free(riqa);
7963 free(ripa);
7964 free(rira);
7965}
7966
7967/*****************************************************************************/
7968
7970 const char *dirname,
7971 const char *filename,
7972 const gsl_matrix *matrix) {
7973
7974 char file[LEN];
7975 const size_t nr = matrix->size1;
7976 const size_t nc = matrix->size2;
7977
7978 /* Set filename... */
7979 if (dirname != NULL)
7980 sprintf(file, "%s/%s", dirname, filename);
7981 else
7982 sprintf(file, "%s", filename);
7983
7984 /* Write info... */
7985 LOG(1, "Write matrix: %s", file);
7986
7987 /* Create file... */
7988 FILE *out;
7989 if (!(out = fopen(file, "w")))
7990 ERRMSG("Cannot create file!");
7991
7992 /* Write header... */
7993 FWRITE("MAT1", char,
7994 4,
7995 out);
7996 FWRITE(&nr, size_t,
7997 1,
7998 out);
7999 FWRITE(&nc, size_t,
8000 1,
8001 out);
8002
8003 /* Write data... */
8004 for (size_t i = 0; i < nr; i++)
8005 for (size_t j = 0; j < nc; j++) {
8006 double value = gsl_matrix_get(matrix, i, j);
8007 FWRITE(&value, double,
8008 1,
8009 out);
8010 }
8011
8012 /* Close file... */
8013 fclose(out);
8014}
8015
8016/*****************************************************************************/
8017
8019 const char *dirname,
8020 const char *filename,
8021 const ctl_t *ctl,
8022 const gsl_matrix *matrix,
8023 const atm_t *atm,
8024 const obs_t *obs,
8025 const char *rowspace,
8026 const char *colspace,
8027 const char *sort,
8028 int dataset) {
8029
8030 char file[LEN];
8031 char quantity[LEN];
8032 const size_t name_strlen = 100;
8033
8034 int ncid, dimid_dataset, dimid_row, dimid_col, dimid_name, varid;
8035 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
8036
8037 size_t nr = matrix->size1, nc = matrix->size2, naux;
8038
8039 /* Allocate metadata index arrays... */
8040 ALLOC(cida, int,
8041 M);
8042 ALLOC(ciqa, int,
8043 N);
8044 ALLOC(cipa, int,
8045 N);
8046 ALLOC(cira, int,
8047 M);
8048 ALLOC(rida, int,
8049 M);
8050 ALLOC(riqa, int,
8051 N);
8052 ALLOC(ripa, int,
8053 N);
8054 ALLOC(rira, int,
8055 M);
8056
8057 /* Set filename... */
8058 if (dirname != NULL)
8059 sprintf(file, "%s/%s", dirname, filename);
8060 else
8061 sprintf(file, "%s", filename);
8062
8063 /* Write info... */
8064 LOG(1, "Write matrix: %s", file);
8065
8066 /* Open or create file... */
8067 if (nc_open(file, NC_WRITE, &ncid) != NC_NOERR)
8068 NC(nc_create(file, NC_NETCDF4, &ncid));
8069
8070 /* Enter define mode... */
8071 int r = nc_redef(ncid);
8072 if (r != NC_NOERR && r != NC_EINDEFINE)
8073 NC(r);
8074
8075 /* Define dataset dimension (unlimited)... */
8076 if (nc_inq_dimid(ncid, "dataset", &dimid_dataset) != NC_NOERR)
8077 NC(nc_def_dim(ncid, "dataset", NC_UNLIMITED, &dimid_dataset));
8078
8079 /* Define row dimension (fixed)... */
8080 if (nc_inq_dimid(ncid, "row", &dimid_row) == NC_NOERR) {
8081 NC(nc_inq_dimlen(ncid, dimid_row, &naux));
8082 if (naux != nr)
8083 ERRMSG("matrix row dimension is incompatible!");
8084 } else
8085 NC(nc_def_dim(ncid, "row", nr, &dimid_row));
8086
8087 /* Define col dimension (fixed)... */
8088 if (nc_inq_dimid(ncid, "col", &dimid_col) == NC_NOERR) {
8089 NC(nc_inq_dimlen(ncid, dimid_col, &naux));
8090 if (naux != nc)
8091 ERRMSG("matrix col dimension is incompatible!");
8092 } else
8093 NC(nc_def_dim(ncid, "col", nc, &dimid_col));
8094
8095 /* Define fixed-length name dimension... */
8096 if (nc_inq_dimid(ncid, "name_strlen", &dimid_name) == NC_NOERR) {
8097 NC(nc_inq_dimlen(ncid, dimid_name, &naux));
8098 if (naux != name_strlen)
8099 ERRMSG("matrix name_strlen dimension is incompatible!");
8100 } else
8101 NC(nc_def_dim(ncid, "name_strlen", name_strlen, &dimid_name));
8102
8103 /* Define variables... */
8104 int dimids3[3] = { dimid_dataset, dimid_row, dimid_col };
8105 int dimids1[1] = { dimid_dataset };
8106 int dimids2_row[2] = { dimid_dataset, dimid_row };
8107 int dimids2_col[2] = { dimid_dataset, dimid_col };
8108 int dimids3_rowname[3] = { dimid_dataset, dimid_row, dimid_name };
8109 int dimids3_colname[3] = { dimid_dataset, dimid_col, dimid_name };
8110 if (nc_inq_varid(ncid, "matrix", &varid) != NC_NOERR) {
8111 NC(nc_def_var(ncid, "matrix", NC_DOUBLE, 3, dimids3, &varid));
8112 NC(nc_put_att_text(ncid, varid, "long_name", 14, "matrix element"));
8113 NC(nc_put_att_text(ncid, varid, "units", 1, "1"));
8114 }
8115 if (nc_inq_varid(ncid, "rowspace", &varid) != NC_NOERR)
8116 NC_DEF_VAR("rowspace", NC_CHAR, 1, dimids1,
8117 "row space selector", "1", 0, 0);
8118 if (nc_inq_varid(ncid, "colspace", &varid) != NC_NOERR)
8119 NC_DEF_VAR("colspace", NC_CHAR, 1, dimids1,
8120 "column space selector", "1", 0, 0);
8121 if (nc_inq_varid(ncid, "sort", &varid) != NC_NOERR)
8122 NC_DEF_VAR("sort", NC_CHAR, 1, dimids1,
8123 "matrix sort selector", "1", 0, 0);
8124 if (nc_inq_varid(ncid, "row_nu", &varid) != NC_NOERR)
8125 NC_DEF_VAR("row_nu", NC_DOUBLE, 2, dimids2_row,
8126 "row channel wavenumber", "cm^-1", 0, 0);
8127 if (nc_inq_varid(ncid, "row_time", &varid) != NC_NOERR)
8128 NC_DEF_VAR("row_time", NC_DOUBLE, 2, dimids2_row,
8129 "row time since 2000-01-01T00:00Z", "s", 0, 0);
8130 if (nc_inq_varid(ncid, "row_z", &varid) != NC_NOERR)
8131 NC_DEF_VAR("row_z", NC_DOUBLE, 2, dimids2_row,
8132 "row altitude", "km", 0, 0);
8133 if (nc_inq_varid(ncid, "row_lon", &varid) != NC_NOERR)
8134 NC_DEF_VAR("row_lon", NC_DOUBLE, 2, dimids2_row,
8135 "row longitude", "degrees_east", 0, 0);
8136 if (nc_inq_varid(ncid, "row_lat", &varid) != NC_NOERR)
8137 NC_DEF_VAR("row_lat", NC_DOUBLE, 2, dimids2_row,
8138 "row latitude", "degrees_north", 0, 0);
8139 if (nc_inq_varid(ncid, "row_quantity", &varid) != NC_NOERR)
8140 NC_DEF_VAR("row_quantity", NC_CHAR, 3, dimids3_rowname,
8141 "row state quantity name", "1", 0, 0);
8142 if (nc_inq_varid(ncid, "col_nu", &varid) != NC_NOERR)
8143 NC_DEF_VAR("col_nu", NC_DOUBLE, 2, dimids2_col,
8144 "column channel wavenumber", "cm^-1", 0, 0);
8145 if (nc_inq_varid(ncid, "col_time", &varid) != NC_NOERR)
8146 NC_DEF_VAR("col_time", NC_DOUBLE, 2, dimids2_col,
8147 "column time since 2000-01-01T00:00Z", "s", 0, 0);
8148 if (nc_inq_varid(ncid, "col_z", &varid) != NC_NOERR)
8149 NC_DEF_VAR("col_z", NC_DOUBLE, 2, dimids2_col,
8150 "column altitude", "km", 0, 0);
8151 if (nc_inq_varid(ncid, "col_lon", &varid) != NC_NOERR)
8152 NC_DEF_VAR("col_lon", NC_DOUBLE, 2, dimids2_col,
8153 "column longitude", "degrees_east", 0, 0);
8154 if (nc_inq_varid(ncid, "col_lat", &varid) != NC_NOERR)
8155 NC_DEF_VAR("col_lat", NC_DOUBLE, 2, dimids2_col,
8156 "column latitude", "degrees_north", 0, 0);
8157 if (nc_inq_varid(ncid, "col_quantity", &varid) != NC_NOERR)
8158 NC_DEF_VAR("col_quantity", NC_CHAR, 3, dimids3_colname,
8159 "column state quantity name", "1", 0, 0);
8160
8161 /* Leave define mode... */
8162 NC(nc_enddef(ncid));
8163
8164 /* Write metadata... */
8165 size_t start1[1] = { (size_t) dataset };
8166 size_t count1[1] = { 1 };
8167 NC(nc_inq_varid(ncid, "rowspace", &varid));
8168 NC(nc_put_vara_text(ncid, varid, start1, count1, rowspace));
8169 NC(nc_inq_varid(ncid, "colspace", &varid));
8170 NC(nc_put_vara_text(ncid, varid, start1, count1, colspace));
8171 NC(nc_inq_varid(ncid, "sort", &varid));
8172 NC(nc_put_vara_text(ncid, varid, start1, count1, sort));
8173
8174 /* Set row and column metadata indices... */
8175 if (rowspace[0] == 'y')
8176 nr = obs2y(ctl, obs, NULL, rida, rira);
8177 else
8178 nr = atm2x(ctl, atm, NULL, riqa, ripa);
8179 if (colspace[0] == 'y')
8180 nc = obs2y(ctl, obs, NULL, cida, cira);
8181 else
8182 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
8183
8184 /* Write row metadata... */
8185 for (size_t i = 0; i < nr; i++) {
8186 const double nu = rowspace[0] == 'y' ? ctl->nu[rida[i]] : GSL_NAN;
8187 const double time =
8188 rowspace[0] == 'y' ? obs->time[rira[i]] : atm->time[ripa[i]];
8189 const double z = rowspace[0] == 'y' ? obs->vpz[rira[i]] : atm->z[ripa[i]];
8190 const double lon =
8191 rowspace[0] == 'y' ? obs->vplon[rira[i]] : atm->lon[ripa[i]];
8192 const double lat =
8193 rowspace[0] == 'y' ? obs->vplat[rira[i]] : atm->lat[ripa[i]];
8194 char qbuf[LEN] = { 0 };
8195 size_t start2[2] = { (size_t) dataset, i };
8196 size_t count2[2] = { 1, 1 };
8197 size_t start3n[3] = { (size_t) dataset, i, 0 };
8198 size_t count3n[3] = { 1, 1, name_strlen };
8199
8200 if (rowspace[0] != 'y') {
8201 idx2name(ctl, riqa[i], quantity);
8202 snprintf(qbuf, LEN, "%s", quantity);
8203 }
8204
8205 NC(nc_inq_varid(ncid, "row_nu", &varid));
8206 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8207 NC(nc_inq_varid(ncid, "row_time", &varid));
8208 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8209 NC(nc_inq_varid(ncid, "row_z", &varid));
8210 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8211 NC(nc_inq_varid(ncid, "row_lon", &varid));
8212 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8213 NC(nc_inq_varid(ncid, "row_lat", &varid));
8214 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8215 NC(nc_inq_varid(ncid, "row_quantity", &varid));
8216 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8217 }
8218
8219 /* Write column metadata... */
8220 for (size_t j = 0; j < nc; j++) {
8221 const double nu = colspace[0] == 'y' ? ctl->nu[cida[j]] : GSL_NAN;
8222 const double time =
8223 colspace[0] == 'y' ? obs->time[cira[j]] : atm->time[cipa[j]];
8224 const double z = colspace[0] == 'y' ? obs->vpz[cira[j]] : atm->z[cipa[j]];
8225 const double lon =
8226 colspace[0] == 'y' ? obs->vplon[cira[j]] : atm->lon[cipa[j]];
8227 const double lat =
8228 colspace[0] == 'y' ? obs->vplat[cira[j]] : atm->lat[cipa[j]];
8229 char qbuf[LEN] = { 0 };
8230 size_t start2[2] = { (size_t) dataset, j };
8231 size_t count2[2] = { 1, 1 };
8232 size_t start3n[3] = { (size_t) dataset, j, 0 };
8233 size_t count3n[3] = { 1, 1, name_strlen };
8234
8235 if (colspace[0] != 'y') {
8236 idx2name(ctl, ciqa[j], quantity);
8237 snprintf(qbuf, LEN, "%s", quantity);
8238 }
8239
8240 NC(nc_inq_varid(ncid, "col_nu", &varid));
8241 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8242 NC(nc_inq_varid(ncid, "col_time", &varid));
8243 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8244 NC(nc_inq_varid(ncid, "col_z", &varid));
8245 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8246 NC(nc_inq_varid(ncid, "col_lon", &varid));
8247 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8248 NC(nc_inq_varid(ncid, "col_lat", &varid));
8249 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8250 NC(nc_inq_varid(ncid, "col_quantity", &varid));
8251 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8252 }
8253
8254 /* Write matrix data... */
8255 NC(nc_inq_varid(ncid, "matrix", &varid));
8256 for (size_t i = 0; i < nr; i++)
8257 for (size_t j = 0; j < nc; j++) {
8258 const double value = gsl_matrix_get(matrix, i, j);
8259 size_t start3[3] = { (size_t) dataset, i, j };
8260 size_t count3[3] = { 1, 1, 1 };
8261 NC(nc_put_vara_double(ncid, varid, start3, count3, &value));
8262 }
8263
8264 /* Close file... */
8265 NC(nc_sync(ncid));
8266 NC(nc_close(ncid));
8267
8268 /* Free... */
8269 free(cida);
8270 free(ciqa);
8271 free(cipa);
8272 free(cira);
8273 free(rida);
8274 free(riqa);
8275 free(ripa);
8276 free(rira);
8277}
8278
8279/*****************************************************************************/
8280
8282 const char *dirname,
8283 const char *filename,
8284 const ctl_t *ctl,
8285 const obs_t *obs,
8286 int profile) {
8287
8288 /* Set filename... */
8289 char file[LEN];
8290 if (dirname != NULL)
8291 sprintf(file, "%s/%s", dirname, filename);
8292 else
8293 sprintf(file, "%s", filename);
8294
8295 /* Write info... */
8296 LOG(1, "Write observation data: %s", file);
8297
8298 /* Write ASCII data... */
8299 if (ctl->obsfmt == 1)
8300 write_obs_asc(file, ctl, obs);
8301
8302 /* Write binary data... */
8303 else if (ctl->obsfmt == 2)
8304 write_obs_bin(file, ctl, obs);
8305
8306 /* Write netCDF data... */
8307 else if (ctl->obsfmt == 3)
8308 write_obs_nc(file, ctl, obs, profile);
8309
8310 /* Write info... */
8311 double mini, maxi;
8312 LOG(2, "Number of ray paths: %d", obs->nr);
8313 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
8314 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
8315 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
8316 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
8317 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
8318 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
8319 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
8320 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
8321 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
8322 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
8323 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
8324 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
8325 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
8326 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
8327 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
8328 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
8329 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
8330 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
8331 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
8332 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
8333 for (int id = 0; id < ctl->nd; id++) {
8334 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
8335 if (ctl->write_bbt) {
8336 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
8337 ctl->nu[id], mini, maxi);
8338 } else {
8339 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
8340 ctl->nu[id], mini, maxi);
8341 }
8342 }
8343 for (int id = 0; id < ctl->nd; id++) {
8344 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
8345 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
8346 ctl->nu[id], mini, maxi);
8347 }
8348}
8349
8350/*****************************************************************************/
8351
8353 const char *filename,
8354 const ctl_t *ctl,
8355 const obs_t *obs) {
8356
8357 int n = 10;
8358
8359 /* Create file... */
8360 FILE *out;
8361 if (!(out = fopen(filename, "w")))
8362 ERRMSG("Cannot create file!");
8363
8364 /* Write header... */
8365 fprintf(out,
8366 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
8367 "# $2 = observer altitude [km]\n"
8368 "# $3 = observer longitude [deg]\n"
8369 "# $4 = observer latitude [deg]\n"
8370 "# $5 = view point altitude [km]\n"
8371 "# $6 = view point longitude [deg]\n"
8372 "# $7 = view point latitude [deg]\n"
8373 "# $8 = tangent point altitude [km]\n"
8374 "# $9 = tangent point longitude [deg]\n"
8375 "# $10 = tangent point latitude [deg]\n");
8376 for (int id = 0; id < ctl->nd; id++)
8377 if (ctl->write_bbt)
8378 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
8379 ++n, ctl->nu[id]);
8380 else
8381 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
8382 ++n, ctl->nu[id]);
8383 for (int id = 0; id < ctl->nd; id++)
8384 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
8385 ctl->nu[id]);
8386
8387 /* Write data... */
8388 for (int ir = 0; ir < obs->nr; ir++) {
8389 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
8390 fprintf(out, "\n");
8391 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
8392 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
8393 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
8394 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
8395 for (int id = 0; id < ctl->nd; id++)
8396 fprintf(out, " %g", obs->rad[id][ir]);
8397 for (int id = 0; id < ctl->nd; id++)
8398 fprintf(out, " %g", obs->tau[id][ir]);
8399 fprintf(out, "\n");
8400 }
8401
8402 /* Close file... */
8403 fclose(out);
8404}
8405
8406/*****************************************************************************/
8407
8409 const char *filename,
8410 const ctl_t *ctl,
8411 const obs_t *obs) {
8412
8413 /* Create file... */
8414 FILE *out;
8415 if (!(out = fopen(filename, "w")))
8416 ERRMSG("Cannot create file!");
8417
8418 /* Write header... */
8419 FWRITE("OBS1", char,
8420 4,
8421 out);
8422 FWRITE(&ctl->nd, int,
8423 1,
8424 out);
8425
8426 /* Write data... */
8427 size_t nr = (size_t) obs->nr;
8428 FWRITE(&nr, size_t,
8429 1,
8430 out);
8431 FWRITE(obs->time, double,
8432 nr,
8433 out);
8434 FWRITE(obs->obsz, double,
8435 nr,
8436 out);
8437 FWRITE(obs->obslon, double,
8438 nr,
8439 out);
8440 FWRITE(obs->obslat, double,
8441 nr,
8442 out);
8443 FWRITE(obs->vpz, double,
8444 nr,
8445 out);
8446 FWRITE(obs->vplon, double,
8447 nr,
8448 out);
8449 FWRITE(obs->vplat, double,
8450 nr,
8451 out);
8452 FWRITE(obs->tpz, double,
8453 nr,
8454 out);
8455 FWRITE(obs->tplon, double,
8456 nr,
8457 out);
8458 FWRITE(obs->tplat, double,
8459 nr,
8460 out);
8461 for (int id = 0; id < ctl->nd; id++)
8462 FWRITE(obs->rad[id], double,
8463 nr,
8464 out);
8465 for (int id = 0; id < ctl->nd; id++)
8466 FWRITE(obs->tau[id], double,
8467 nr,
8468 out);
8469
8470 /* Close file... */
8471 fclose(out);
8472}
8473
8474/*****************************************************************************/
8475
8477 const char *filename,
8478 const ctl_t *ctl,
8479 const obs_t *obs,
8480 const int profile) {
8481
8482 char longname[LEN], varname[LEN];
8483 const char *spec_prefix = ctl->write_bbt ? "bt" : "rad";
8484
8485 int ncid, varid, dim_profile, dim_ray;
8486
8487 size_t ray_max;
8488
8489 /* Check number of rays... */
8490 if (obs->nr < 1 || obs->nr > NR)
8491 ERRMSG("Number of ray paths out of range!");
8492
8493 /* Open or create file... */
8494 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
8495 NC(nc_create(filename, NC_NETCDF4, &ncid));
8496
8497 /* Enter define mode... */
8498 int r = nc_redef(ncid);
8499 if (r != NC_NOERR && r != NC_EINDEFINE)
8500 NC(r);
8501
8502 /* Define profile dimension (unlimited)... */
8503 if (nc_inq_dimid(ncid, "profile", &dim_profile) != NC_NOERR)
8504 NC(nc_def_dim(ncid, "profile", NC_UNLIMITED, &dim_profile));
8505
8506 /* Define ray dimension (fixed)... */
8507 if (nc_inq_dimid(ncid, "ray", &dim_ray) == NC_NOERR) {
8508 NC(nc_inq_dimlen(ncid, dim_ray, &ray_max));
8509 if (ray_max < 1 || ray_max > (size_t) NR)
8510 ERRMSG("netCDF dimension ray is out of range!");
8511 if ((size_t) obs->nr > ray_max)
8512 ERRMSG("profile has too many rays!");
8513 } else {
8514 ray_max = (size_t) obs->nr;
8515 NC(nc_def_dim(ncid, "ray", ray_max, &dim_ray));
8516 }
8517
8518 /* Dimension ID array... */
8519 int dimids[2] = { dim_profile, dim_ray };
8520
8521 /* Tunables for compression/quantization... */
8522 const int deflate_level = 0;
8523 const int quant_digits = 0;
8524
8525 /* Define nray (1D over profile)... */
8526 if (nc_inq_varid(ncid, "nray", &varid) != NC_NOERR)
8527 NC_DEF_VAR("nray", NC_INT, 1, dimids, "number of ray paths", "1", 0, 0);
8528
8529 /* Define geometry variables (2D over profile, ray)... */
8530 if (nc_inq_varid(ncid, "time", &varid) != NC_NOERR)
8531 NC_DEF_VAR("time", NC_DOUBLE, 2, dimids,
8532 "time in seconds since 2000-01-01, 00:00 UTC", "s",
8533 deflate_level, 0);
8534
8535 if (nc_inq_varid(ncid, "obs_z", &varid) != NC_NOERR)
8536 NC_DEF_VAR("obs_z", NC_DOUBLE, 2, dimids,
8537 "observer altitude", "km", deflate_level, 0);
8538
8539 if (nc_inq_varid(ncid, "obs_lon", &varid) != NC_NOERR)
8540 NC_DEF_VAR("obs_lon", NC_DOUBLE, 2, dimids,
8541 "observer longitude", "degrees_east", deflate_level, 0);
8542
8543 if (nc_inq_varid(ncid, "obs_lat", &varid) != NC_NOERR)
8544 NC_DEF_VAR("obs_lat", NC_DOUBLE, 2, dimids,
8545 "observer latitude", "degrees_north", deflate_level, 0);
8546
8547 if (nc_inq_varid(ncid, "vp_z", &varid) != NC_NOERR)
8548 NC_DEF_VAR("vp_z", NC_DOUBLE, 2, dimids,
8549 "view point altitude", "km", deflate_level, 0);
8550
8551 if (nc_inq_varid(ncid, "vp_lon", &varid) != NC_NOERR)
8552 NC_DEF_VAR("vp_lon", NC_DOUBLE, 2, dimids,
8553 "view point longitude", "degrees_east", deflate_level, 0);
8554
8555 if (nc_inq_varid(ncid, "vp_lat", &varid) != NC_NOERR)
8556 NC_DEF_VAR("vp_lat", NC_DOUBLE, 2, dimids,
8557 "view point latitude", "degrees_north", deflate_level, 0);
8558
8559 if (nc_inq_varid(ncid, "tp_z", &varid) != NC_NOERR)
8560 NC_DEF_VAR("tp_z", NC_DOUBLE, 2, dimids,
8561 "tangent point altitude", "km", deflate_level, 0);
8562
8563 if (nc_inq_varid(ncid, "tp_lon", &varid) != NC_NOERR)
8564 NC_DEF_VAR("tp_lon", NC_DOUBLE, 2, dimids,
8565 "tangent point longitude", "degrees_east", deflate_level, 0);
8566
8567 if (nc_inq_varid(ncid, "tp_lat", &varid) != NC_NOERR)
8568 NC_DEF_VAR("tp_lat", NC_DOUBLE, 2, dimids,
8569 "tangent point latitude", "degrees_north", deflate_level, 0);
8570
8571 /* Define radiance/transmittance per channel (2D profile,ray)... */
8572 for (int id = 0; id < ctl->nd; id++) {
8573
8574 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8575 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8576 if (ctl->write_bbt) {
8577 sprintf(longname, "brightness temperature (%.4f cm^-1)", ctl->nu[id]);
8578 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "K",
8579 deflate_level, quant_digits);
8580 } else {
8581 sprintf(longname, "radiance (%.4f cm^-1)", ctl->nu[id]);
8582 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
8583 "W/(m^2 sr cm^-1)", deflate_level, quant_digits);
8584 }
8585 }
8586
8587 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8588 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8589 sprintf(longname, "transmittance (%.4f cm^-1)", ctl->nu[id]);
8590 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname, "1",
8591 deflate_level, quant_digits);
8592 }
8593 }
8594
8595 /* Leave define mode... */
8596 NC(nc_enddef(ncid));
8597
8598 /* Hyperslabs... */
8599 size_t start[2] = { (size_t) profile, 0 };
8600 size_t count[2] = { 1, (size_t) obs->nr };
8601
8602 /* Write nray(profile)... */
8603 int nr = obs->nr;
8604 NC(nc_inq_varid(ncid, "nray", &varid));
8605 NC(nc_put_vara_int(ncid, varid, start, count, &nr));
8606
8607 /* Write geometry... */
8608 NC(nc_inq_varid(ncid, "time", &varid));
8609 NC(nc_put_vara_double(ncid, varid, start, count, obs->time));
8610
8611 NC(nc_inq_varid(ncid, "obs_z", &varid));
8612 NC(nc_put_vara_double(ncid, varid, start, count, obs->obsz));
8613
8614 NC(nc_inq_varid(ncid, "obs_lon", &varid));
8615 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslon));
8616
8617 NC(nc_inq_varid(ncid, "obs_lat", &varid));
8618 NC(nc_put_vara_double(ncid, varid, start, count, obs->obslat));
8619
8620 NC(nc_inq_varid(ncid, "vp_z", &varid));
8621 NC(nc_put_vara_double(ncid, varid, start, count, obs->vpz));
8622
8623 NC(nc_inq_varid(ncid, "vp_lon", &varid));
8624 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplon));
8625
8626 NC(nc_inq_varid(ncid, "vp_lat", &varid));
8627 NC(nc_put_vara_double(ncid, varid, start, count, obs->vplat));
8628
8629 NC(nc_inq_varid(ncid, "tp_z", &varid));
8630 NC(nc_put_vara_double(ncid, varid, start, count, obs->tpz));
8631
8632 NC(nc_inq_varid(ncid, "tp_lon", &varid));
8633 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplon));
8634
8635 NC(nc_inq_varid(ncid, "tp_lat", &varid));
8636 NC(nc_put_vara_double(ncid, varid, start, count, obs->tplat));
8637
8638 /* Write spectral variables per channel... */
8639 for (int id = 0; id < ctl->nd; id++) {
8640 sprintf(varname, "%s_%.4f", spec_prefix, ctl->nu[id]);
8641 NC(nc_inq_varid(ncid, varname, &varid));
8642 NC(nc_put_vara_double(ncid, varid, start, count, obs->rad[id]));
8643
8644 sprintf(varname, "tau_%.4f", ctl->nu[id]);
8645 NC(nc_inq_varid(ncid, varname, &varid));
8646 NC(nc_put_vara_double(ncid, varid, start, count, obs->tau[id]));
8647 }
8648
8649 /* Close file... */
8650 NC(nc_sync(ncid));
8651 NC(nc_close(ncid));
8652}
8653
8654/*****************************************************************************/
8655
8657 const char *filename,
8658 const double *x,
8659 const double *y,
8660 const int n) {
8661
8662 /* Write info... */
8663 LOG(1, "Write shape function: %s", filename);
8664
8665 /* Create file... */
8666 FILE *out;
8667 if (!(out = fopen(filename, "w")))
8668 ERRMSG("Cannot create file!");
8669
8670 /* Write header... */
8671 fprintf(out,
8672 "# $1 = shape function x-value [-]\n"
8673 "# $2 = shape function y-value [-]\n\n");
8674
8675 /* Write data... */
8676 for (int i = 0; i < n; i++)
8677 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
8678
8679 /* Close file... */
8680 fclose(out);
8681}
8682
8683/*****************************************************************************/
8684
8686 const char *quantity,
8687 const ret_t *ret,
8688 const ctl_t *ctl,
8689 const atm_t *atm,
8690 const gsl_matrix *s) {
8691
8692 /* Get sizes... */
8693 const size_t n = s->size1;
8694
8695 /* Allocate... */
8696 atm_t *atm_aux;
8697 ALLOC(atm_aux, atm_t, 1);
8698 gsl_vector *x_aux = gsl_vector_alloc(n);
8699
8700 /* Compute standard deviation... */
8701 for (size_t i = 0; i < n; i++)
8702 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
8703
8704 /* Write to disk... */
8705 char filename[LEN];
8706 const char *dirname;
8707 int profile;
8708 const char *shared_file = "-";
8709 copy_atm(ctl, atm_aux, atm, 1);
8710 x2atm(ctl, x_aux, atm_aux);
8711 if (strcmp(quantity, "total") == 0)
8712 shared_file = ret->shared_io_atm_err_total_file;
8713 else if (strcmp(quantity, "noise") == 0)
8714 shared_file = ret->shared_io_atm_err_noise_file;
8715 else if (strcmp(quantity, "formod") == 0)
8716 shared_file = ret->shared_io_atm_err_formod_file;
8717 sprintf(filename, "atm_err_%s.tab", quantity);
8718 const char *target =
8719 shared_io_output_target(ret, shared_file, filename, &dirname, &profile);
8720 write_atm(dirname, target, ctl, atm_aux, profile);
8721
8722 /* Free... */
8723 gsl_vector_free(x_aux);
8724}
8725
8726/*****************************************************************************/
8727
8729 const ctl_t *ctl,
8730 const tbl_t *tbl) {
8731
8732 /* Loop over emitters and detectors... */
8733 for (int ig = 0; ig < ctl->ng; ig++)
8734 for (int id = 0; id < ctl->nd; id++) {
8735
8736 /* Skip empty tables... */
8737 if (tbl->np[id][ig] <= 0) {
8738 WARN("Skip writing empty emissivity table: emitter=%s, nu=%.4f",
8739 ctl->emitter[ig], ctl->nu[id]);
8740 continue;
8741 }
8742
8743 /* Write ASCII look-up tables... */
8744 if (ctl->tblfmt == 1)
8745 write_tbl_asc(ctl, tbl, id, ig);
8746
8747 /* Write binary look-up tables... */
8748 else if (ctl->tblfmt == 2)
8749 write_tbl_bin(ctl, tbl, id, ig);
8750
8751 /* Write netCDF look-up tables... */
8752 else if (ctl->tblfmt == 3)
8753 write_tbl_nc(ctl, tbl, id, ig);
8754
8755 /* Write info... */
8756 TBL_LOG(tbl, id, ig);
8757 }
8758
8759 /* Write filter functions... */
8760 if (ctl->tblfmt == 1)
8761 for (int id = 0; id < ctl->nd; id++) {
8762 char filename[2 * LEN];
8763 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
8764 write_shape(filename, tbl->filt_nu[id], tbl->filt_f[id],
8765 tbl->filt_n[id]);
8766 }
8767}
8768
8769/*****************************************************************************/
8770
8772 const ctl_t *ctl,
8773 const tbl_t *tbl,
8774 const int id,
8775 const int ig) {
8776
8777 /* Set filename... */
8778 char filename[2 * LEN];
8779 sprintf(filename, "%s_%.4f_%s.tab", ctl->tblbase,
8780 ctl->nu[id], ctl->emitter[ig]);
8781
8782 /* Create file... */
8783 FILE *out;
8784 if (!(out = fopen(filename, "w"))) {
8785 ERRMSG("Cannot create emissivity table: %s", filename);
8786 } else
8787 LOG(1, "Write emissivity table: %s", filename);
8788
8789 /* Write header... */
8790 fprintf(out,
8791 "# $1 = pressure [hPa]\n"
8792 "# $2 = temperature [K]\n"
8793 "# $3 = column density [molecules/cm^2]\n"
8794 "# $4 = emissivity [-]\n");
8795
8796 /* Save table file... */
8797 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
8798 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
8799 fprintf(out, "\n");
8800 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
8801 fprintf(out, "%g %g %e %e\n",
8802 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
8803 exp(tbl->logu[id][ig][ip][it][iu]),
8804 exp(tbl->logeps[id][ig][ip][it][iu]));
8805 }
8806
8807 /* Close file... */
8808 fclose(out);
8809}
8810
8811/*****************************************************************************/
8812
8814 const ctl_t *ctl,
8815 const tbl_t *tbl,
8816 const int id,
8817 const int ig) {
8818
8819 /* Set filename... */
8820 char filename[2 * LEN];
8821 sprintf(filename, "%s_%.4f_%s.bin",
8822 ctl->tblbase, ctl->nu[id], ctl->emitter[ig]);
8823
8824 /* Create file... */
8825 FILE *out;
8826 if (!(out = fopen(filename, "w"))) {
8827 ERRMSG("Cannot create emissivity table: %s", filename);
8828 } else
8829 LOG(1, "Write emissivity table: %s", filename);
8830
8831 /* Pack... */
8832 size_t used = 0;
8833 const size_t need = tbl_packed_size(tbl, id, ig);
8834 uint8_t *work = NULL;
8835 ALLOC(work, uint8_t, need);
8836 tbl_pack(tbl, id, ig, work, &used);
8837 if (used != need)
8838 ERRMSG("Internal error: packed size mismatch!");
8839
8840 /* Write length and packed blob... */
8841 FWRITE(&used, size_t,
8842 1,
8843 out);
8844 FWRITE(work, uint8_t, used, out);
8845
8846 /* Close file... */
8847 fclose(out);
8848
8849 /* Free... */
8850 free(work);
8851}
8852
8853/*****************************************************************************/
8854
8856 const ctl_t *ctl,
8857 const tbl_t *tbl,
8858 const int id,
8859 const int ig) {
8860
8861 /* Set filename... */
8862 char filename[2 * LEN];
8863 sprintf(filename, "%s_%s.nc", ctl->tblbase, ctl->emitter[ig]);
8864
8865 /* Open or create file... */
8866 int ncid;
8867 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR) {
8868 if (nc_create(filename, NC_NETCDF4 | NC_CLOBBER, &ncid) != NC_NOERR)
8869 ERRMSG("Cannot open or create emissivity table: %s", filename);
8870 NC_PUT_ATT_GLOBAL("format_version", "1");
8871 NC_PUT_ATT_GLOBAL("emitter", ctl->emitter[ig]);
8872 NC(nc_enddef(ncid));
8873 }
8874
8875 /* Set variable and dimension name... */
8876 char varname[LEN], dimname[LEN];
8877 sprintf(varname, "tbl_%.4f", ctl->nu[id]);
8878 sprintf(dimname, "len_%.4f", ctl->nu[id]);
8879
8880 /* Write info... */
8881 LOG(1, "Write emissivity table: %s in %s", varname, filename);
8882
8883 /* Allocate work space... */
8884 size_t used = 0;
8885 const size_t need = tbl_packed_size(tbl, id, ig);
8886 uint8_t *work = NULL;
8887 ALLOC(work, uint8_t, need);
8888
8889 /* Pack table... */
8890 tbl_pack(tbl, id, ig, work, &used);
8891 if (used != need)
8892 ERRMSG("Internal error: packed size mismatch!");
8893
8894 /* Prevent overwrite... */
8895 int tmp;
8896 if (nc_inq_varid(ncid, varname, &tmp) == NC_NOERR)
8897 ERRMSG("Table already present!");
8898
8899 /* Add dimension and variable... */
8900 int dimid, varid;
8901 NC(nc_redef(ncid));
8902 NC(nc_def_dim(ncid, dimname, used, &dimid));
8903 int dimids[1] = { dimid };
8904 NC_DEF_VAR(varname, NC_UBYTE, 1, dimids,
8905 "Packed lookup table blob", "1", 0, 0);
8906 NC(nc_enddef(ncid));
8907
8908 /* Write data... */
8909 NC(nc_put_var_uchar(ncid, varid, (const unsigned char *) work));
8910
8911 /* Free... */
8912 free(work);
8913
8914 /* Close file... */
8915 NC(nc_close(ncid));
8916}
8917
8918/*****************************************************************************/
8919
8921 const ctl_t *ctl,
8922 const gsl_vector *x,
8923 atm_t *atm) {
8924
8925 size_t n = 0;
8926
8927 /* Get pressure... */
8928 for (int ip = 0; ip < atm->np; ip++)
8929 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
8930 x2atm_help(&atm->p[ip], x, &n);
8931
8932 /* Get temperature... */
8933 for (int ip = 0; ip < atm->np; ip++)
8934 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
8935 x2atm_help(&atm->t[ip], x, &n);
8936
8937 /* Get volume mixing ratio... */
8938 for (int ig = 0; ig < ctl->ng; ig++)
8939 for (int ip = 0; ip < atm->np; ip++)
8940 if (atm->z[ip] >= ctl->retq_zmin[ig]
8941 && atm->z[ip] <= ctl->retq_zmax[ig])
8942 x2atm_help(&atm->q[ig][ip], x, &n);
8943
8944 /* Get extinction... */
8945 for (int iw = 0; iw < ctl->nw; iw++)
8946 for (int ip = 0; ip < atm->np; ip++)
8947 if (atm->z[ip] >= ctl->retk_zmin[iw]
8948 && atm->z[ip] <= ctl->retk_zmax[iw])
8949 x2atm_help(&atm->k[iw][ip], x, &n);
8950
8951 /* Get cloud data... */
8952 if (ctl->ret_clz)
8953 x2atm_help(&atm->clz, x, &n);
8954 if (ctl->ret_cldz)
8955 x2atm_help(&atm->cldz, x, &n);
8956 if (ctl->ret_clk)
8957 for (int icl = 0; icl < ctl->ncl; icl++)
8958 x2atm_help(&atm->clk[icl], x, &n);
8959
8960 /* Get surface data... */
8961 if (ctl->ret_sft)
8962 x2atm_help(&atm->sft, x, &n);
8963 if (ctl->ret_sfeps)
8964 for (int isf = 0; isf < ctl->nsf; isf++)
8965 x2atm_help(&atm->sfeps[isf], x, &n);
8966}
8967
8968/*****************************************************************************/
8969
8971 double *value,
8972 const gsl_vector *x,
8973 size_t *n) {
8974
8975 /* Get state vector element... */
8976 *value = gsl_vector_get(x, *n);
8977 (*n)++;
8978}
8979
8980/*****************************************************************************/
8981
8983 const ctl_t *ctl,
8984 const gsl_vector *y,
8985 obs_t *obs) {
8986
8987 size_t m = 0;
8988
8989 /* Decompose measurement vector... */
8990 for (int ir = 0; ir < obs->nr; ir++)
8991 for (int id = 0; id < ctl->nd; id++)
8992 if (isfinite(obs->rad[id][ir])) {
8993 obs->rad[id][ir] = gsl_vector_get(y, m);
8994 m++;
8995 }
8996}
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:4269
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:6537
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:6092
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:7313
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:6237
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:7047
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:5767
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:5324
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:8352
void formod_rfm(const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs)
Forward-model radiance and transmittance with the Reference Forward Model (RFM).
Definition: jurassic.c:3707
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4517
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:4167
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:8476
void tbl_free(const ctl_t *ctl, tbl_t *tbl)
Free lookup table and all internally allocated memory.
Definition: jurassic.c:7008
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:8771
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:8855
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3963
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
Definition: jurassic.c:5522
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:5935
int shared_io_lock(const ret_t *ret)
Acquire an exclusive lock for shared retrieval output files.
Definition: jurassic.c:6886
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:4971
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:5816
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:4588
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4487
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:6846
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:7796
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:7535
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:7759
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:7211
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Map retrieval state vector back to atmospheric structure.
Definition: jurassic.c:8920
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:8813
void intpol_tbl_cga(const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
Interpolate emissivities and transmittances using the Curtis–Godson approximation (CGA).
Definition: jurassic.c:4074
void shared_io_unlock(int fd)
Release a shared retrieval output lock.
Definition: jurassic.c:6913
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:7722
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:6797
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:8281
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Write emissivity lookup tables to disk.
Definition: jurassic.c:8728
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:7135
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:5649
void intpol_atm(const ctl_t *ctl, const atm_t *atm, const double z, double *p, double *t, double *q, double *k)
Interpolate atmospheric state variables at a given altitude.
Definition: jurassic.c:4049
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
Definition: jurassic.c:3408
void optimal_estimation(ret_t *ret, ctl_t *ctl, tbl_t *tbl, obs_t *obs_meas, obs_t *obs_i, atm_t *atm_apr, atm_t *atm_i, double *chisq)
Perform optimal estimation retrieval using Levenberg–Marquardt minimization.
Definition: jurassic.c:4660
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:4314
void timer_group(const char *name, const char *group, int output)
Aggregate wall-clock timings for named code phases.
Definition: jurassic.c:7242
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:6965
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:5199
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:8018
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:7384
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:7969
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:8408
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:8970
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:4393
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:6013
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize source function lookup tables from emissivity data.
Definition: jurassic.c:4002
void matrix_invert(gsl_matrix *a)
Invert a square matrix, optimized for diagonal or symmetric positive-definite matrices.
Definition: jurassic.c:4558
void read_ret(int argc, char *argv[], const ctl_t *ctl, ret_t *ret)
Read retrieval configuration and error parameters.
Definition: jurassic.c:6149
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:6618
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:8656
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:5273
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:6414
void formod_srcfunc(const ctl_t *ctl, const tbl_t *tbl, const double t, double *src)
Interpolate the source function (Planck radiance) at a given temperature.
Definition: jurassic.c:3868
void analyze_avk_quantity(const gsl_matrix *avk, const int iq, const int *ipa, const size_t *n0, const size_t *n1, double *cont, double *res)
Analyze averaging kernel submatrix for a specific retrieved quantity.
Definition: jurassic.c:101
void jsec2time(const double jsec, int *year, int *mon, int *day, int *hour, int *min, int *sec, double *remain)
Converts Julian seconds to calendar date and time components.
Definition: jurassic.c:4360
void read_matrix_asc(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
Definition: jurassic.c:5675
tbl_t * read_tbl(const ctl_t *ctl)
Read emissivity lookup tables from disk.
Definition: jurassic.c:6338
void read_matrix_bin(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from a binary file.
Definition: jurassic.c:5714
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:6581
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:6866
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:5418
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:4633
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:8982
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3903
void read_shape(const char *filename, double *x, double *y, int *n)
Read a two-column shape function from an ASCII file.
Definition: jurassic.c:6297
double ctmn2(const double nu, const double p, const double t)
Compute Nâ‚‚ collision-induced absorption coefficient.
Definition: jurassic.c:3139
size_t atm2x(const ctl_t *ctl, const atm_t *atm, gsl_vector *x, int *iqa, int *ipa)
Convert atmospheric data to state vector elements.
Definition: jurassic.c:125
void climatology(const ctl_t *ctl, atm_t *atm)
Initializes atmospheric climatology profiles.
Definition: jurassic.c:215
void geo2cart(const double z, const double lon, const double lat, double *x)
Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates.
Definition: jurassic.c:3885
void set_cov_apr(const ret_t *ret, const ctl_t *ctl, const atm_t *atm, const int *iqa, const int *ipa, gsl_matrix *s_a)
Construct the a priori covariance matrix for retrieval parameters.
Definition: jurassic.c:6686
const char * shared_io_output_file(const ret_t *ret)
Return the primary shared retrieval output file configured for locking.
Definition: jurassic.c:6931
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:8685
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:7101
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4536
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:7451
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:5891
JURASSIC library declarations.
#define N
Maximum size of state vector.
Definition: jurassic.h:278
#define IDXCLZ
Index for cloud layer height.
Definition: jurassic.h:383
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:268
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:224
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
Definition: jurassic.h:448
#define P0
Standard pressure [hPa].
Definition: jurassic.h:219
#define KB
Boltzmann constant [kg m^2/(K s^2)].
Definition: jurassic.h:194
#define POW2(x)
Compute the square of a value.
Definition: jurassic.h:1018
#define NFOV
Number of ray paths used for FOV calculations.
Definition: jurassic.h:293
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
Definition: jurassic.h:601
#define NC_PUT_ATT_GLOBAL(attname, text)
Add a global text attribute to a NetCDF file.
Definition: jurassic.h:895
#define NC(cmd)
Execute a NetCDF command and check for errors.
Definition: jurassic.h:697
#define TBL_LOG(tbl, id, ig)
Log detailed statistics of an emissivity look-up table.
Definition: jurassic.h:1124
#define SELECT_TIMER(id, group)
Switch to a named aggregated timer.
Definition: jurassic.h:1158
#define DOTP(a, b)
Compute dot product of two 3D vectors.
Definition: jurassic.h:558
#define O2
Oxygen concentration.
Definition: jurassic.h:214
#define UMAX
Maximum column density [molecules/cm^2].
Definition: jurassic.h:259
#define MIN(a, b)
Determine the minimum of two values.
Definition: jurassic.h:684
#define IDXCLDZ
Index for cloud layer depth.
Definition: jurassic.h:386
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition: jurassic.h:1325
#define NC_PUT_INT(varname, ptr, hyperslab)
Write integer data to a NetCDF variable.
Definition: jurassic.h:856
#define CLAMP(v, lo, hi)
Clamp a value to a specified range.
Definition: jurassic.h:470
#define RFMNPTS
Maximum number of RFM spectral grid points.
Definition: jurassic.h:343
#define IDXK(iw)
Indices for extinction.
Definition: jurassic.h:380
#define M
Maximum size of measurement vector.
Definition: jurassic.h:273
#define CO2_FIT(TIME)
Climatological CO2 volume mixing ratio as a quadratic function of time.
Definition: jurassic.h:485
#define G0
Standard gravity [m/s^2].
Definition: jurassic.h:184
#define NQ
Maximum number of quantities.
Definition: jurassic.h:313
#define ND
Maximum number of radiance channels.
Definition: jurassic.h:288
#define NA
Avogadro's number.
Definition: jurassic.h:204
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
Definition: jurassic.h:645
#define NSHAPE
Maximum number of shape function grid points.
Definition: jurassic.h:328
#define IDXSFT
Index for surface layer temperature.
Definition: jurassic.h:392
#define RI
Ideal gas constant [J/(mol K)].
Definition: jurassic.h:229
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
Definition: jurassic.h:973
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
Definition: jurassic.h:395
#define IDXCLK(icl)
Indices for cloud layer extinction.
Definition: jurassic.h:389
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
Definition: jurassic.h:1189
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:1292
#define TBLNU
Maximum number of column densities per emissivity curve.
Definition: jurassic.h:363
#define IDXP
Index for pressure.
Definition: jurassic.h:371
#define ALLOC(ptr, type, n)
Allocate memory for an array.
Definition: jurassic.h:418
#define DEG2RAD(deg)
Convert degrees to radians.
Definition: jurassic.h:505
#define TSUN
Effective temperature of the sun [K].
Definition: jurassic.h:249
#define RAD2DEG(rad)
Convert radians to degrees.
Definition: jurassic.h:1047
#define TBLNT
Maximum number of temperatures in emissivity tables.
Definition: jurassic.h:358
#define NP
Maximum number of atmospheric data points.
Definition: jurassic.h:308
#define POW3(x)
Compute the cube of a value.
Definition: jurassic.h:1031
#define NTIMER
Maximum number of aggregated timers.
Definition: jurassic.h:333
#define PLANCK(T, nu)
Compute spectral radiance using Planck’s law.
Definition: jurassic.h:1004
#define REFRAC_EDLEN(p, T)
Compute dry-air refractivity (n - 1) with an Edlen-type relation.
Definition: jurassic.h:1104
#define NG
Maximum number of emitters.
Definition: jurassic.h:298
#define EPSMAX
Maximum emissivity.
Definition: jurassic.h:179
#define LOG(level,...)
Print a log message with a specified logging level.
Definition: jurassic.h:1255
#define TBLNS
Maximum number of source function temperature levels.
Definition: jurassic.h:353
#define NC_DEF_VAR(varname, type, ndims, dims, long_name, units, level, quant)
Define a NetCDF variable with attributes.
Definition: jurassic.h:726
#define N2
Nitrogen concentration.
Definition: jurassic.h:209
#define TBLNP
Maximum number of pressure levels in emissivity tables.
Definition: jurassic.h:348
#define NSF
Maximum number of surface layer spectral grid points.
Definition: jurassic.h:323
#define NCL
Maximum number of cloud layer spectral grid points.
Definition: jurassic.h:283
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
Definition: jurassic.h:523
#define NC_PUT_DOUBLE(varname, ptr, hyperslab)
Write double precision data to a NetCDF variable.
Definition: jurassic.h:809
#define FREAD(ptr, type, size, out)
Read binary data from a file.
Definition: jurassic.h:578
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:624
#define NLOS
Maximum number of LOS points.
Definition: jurassic.h:303
#define NR
Maximum number of ray paths.
Definition: jurassic.h:318
#define IDXQ(ig)
Indices for volume mixing ratios.
Definition: jurassic.h:377
#define TMAX
Maximum temperature for source function [K].
Definition: jurassic.h:239
#define TMIN
Minimum temperature for source function [K].
Definition: jurassic.h:244
#define NW
Maximum number of spectral windows.
Definition: jurassic.h:338
#define MAX(a, b)
Determine the maximum of two values.
Definition: jurassic.h:666
#define IDXT
Index for temperature.
Definition: jurassic.h:374
Atmospheric profile data.
Definition: jurassic.h:1375
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1381
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:1417
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:1402
double lat[NP]
Latitude [deg].
Definition: jurassic.h:1390
double lon[NP]
Longitude [deg].
Definition: jurassic.h:1387
double t[NP]
Temperature [K].
Definition: jurassic.h:1396
double clz
Cloud layer height [km].
Definition: jurassic.h:1405
int np
Number of data points.
Definition: jurassic.h:1378
double cldz
Cloud layer depth [km].
Definition: jurassic.h:1408
double sft
Surface temperature [K].
Definition: jurassic.h:1414
double z[NP]
Altitude [km].
Definition: jurassic.h:1384
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:1411
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:1399
double p[NP]
Pressure [hPa].
Definition: jurassic.h:1393
Control parameters.
Definition: jurassic.h:1428
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1572
int nw
Number of spectral windows.
Definition: jurassic.h:1455
int atmfmt
Atmospheric data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1485
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1530
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:1452
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:1437
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1551
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1470
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1581
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1479
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1578
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1494
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1497
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1539
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1566
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1563
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1554
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1503
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1518
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1584
int window[ND]
Window index of each channel.
Definition: jurassic.h:1458
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1500
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1575
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1545
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1542
int ng
Number of emitters.
Definition: jurassic.h:1431
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1464
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1509
int ig_o2
Emitter index of O2.
Definition: jurassic.h:1446
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1536
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1476
int nd
Number of radiance channels.
Definition: jurassic.h:1449
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1527
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1473
int matrixfmt
Matrix data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1491
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1548
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1461
int ig_n2
Emitter index of N2.
Definition: jurassic.h:1443
int obsfmt
Observation data file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1488
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1521
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1506
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1560
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:1434
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1467
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1512
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1557
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:1440
int tblfmt
Look-up table file format (1=ASCII, 2=binary, 3=netCDF).
Definition: jurassic.h:1482
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1515
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1569
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1524
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1533
Line-of-sight data.
Definition: jurassic.h:1595
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1601
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1643
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1640
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1616
double sft
Surface temperature [K].
Definition: jurassic.h:1622
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1637
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1604
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1628
int np
Number of LOS points.
Definition: jurassic.h:1598
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1631
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1607
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1646
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1619
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1625
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1634
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1613
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1610
Observation geometry and radiance data.
Definition: jurassic.h:1657
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1693
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1696
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1687
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1675
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1681
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1669
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1672
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1666
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1690
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1678
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1663
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1684
int nr
Number of ray paths.
Definition: jurassic.h:1660
Retrieval control parameters.
Definition: jurassic.h:1709
char shared_io_atm_final_file[LEN]
Optional shared retrieved-atmosphere output file.
Definition: jurassic.h:1796
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1736
double err_press
Pressure error [%].
Definition: jurassic.h:1733
char shared_io_atm_res_file[LEN]
Optional shared averaging-kernel resolution output file.
Definition: jurassic.h:1832
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1763
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1724
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1766
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1745
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1727
char shared_io_matrix_cov_apr_file[LEN]
Optional shared a priori covariance output file.
Definition: jurassic.h:1802
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1721
double err_temp
Temperature error [K].
Definition: jurassic.h:1742
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1754
char shared_io_proflist[LEN]
Optional file containing retrieval profile indices.
Definition: jurassic.h:1787
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1730
double err_clz
Cloud height error [km].
Definition: jurassic.h:1769
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1778
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1775
char shared_io_matrix_gain_file[LEN]
Optional shared gain matrix output file.
Definition: jurassic.h:1814
char shared_io_obs_meas_file[LEN]
Optional shared measured-observation input file.
Definition: jurassic.h:1793
char shared_io_matrix_cov_ret_file[LEN]
Optional shared retrieval covariance output file.
Definition: jurassic.h:1808
char shared_io_matrix_kernel_file[LEN]
Optional shared kernel matrix output file.
Definition: jurassic.h:1805
char shared_io_atm_apr_file[LEN]
Optional shared atmospheric a priori input file.
Definition: jurassic.h:1790
char shared_io_matrix_avk_file[LEN]
Optional shared averaging-kernel matrix output file.
Definition: jurassic.h:1817
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1748
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1715
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1718
char shared_io_atm_err_formod_file[LEN]
Optional shared forward-model retrieval-error output file.
Definition: jurassic.h:1826
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1772
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1739
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1757
char shared_io_matrix_corr_file[LEN]
Optional shared correlation matrix output file.
Definition: jurassic.h:1811
char shared_io_atm_err_total_file[LEN]
Optional shared total retrieval-error output file.
Definition: jurassic.h:1820
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1751
char dir[LEN]
Working directory.
Definition: jurassic.h:1712
char shared_io_atm_err_noise_file[LEN]
Optional shared noise retrieval-error output file.
Definition: jurassic.h:1823
char shared_io_obs_final_file[LEN]
Optional shared retrieved-observation output file.
Definition: jurassic.h:1799
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1781
char shared_io_atm_cont_file[LEN]
Optional shared averaging-kernel contribution output file.
Definition: jurassic.h:1829
int shared_io_profile
Profile index used for shared netCDF retrieval inputs and outputs.
Definition: jurassic.h:1784
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1760
Emissivity look-up tables.
Definition: jurassic.h:1842
float * logu[ND][NG][TBLNP][TBLNT]
Logarithm of column density [molecules/cm^2].
Definition: jurassic.h:1863
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1881
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1854
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1851
int filt_n[ND]
Filter function number of spectral grid points.
Definition: jurassic.h:1869
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1848
float * logeps[ND][NG][TBLNP][TBLNT]
Logarithm of emissivity.
Definition: jurassic.h:1866
double filt_f[ND][NSHAPE]
Filter function values.
Definition: jurassic.h:1875
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1860
double lnp[ND][NG][TBLNP]
Log-pressure [hPa].
Definition: jurassic.h:1857
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1878
double filt_nu[ND][NSHAPE]
Filter function spectral grid points [cm^-1].
Definition: jurassic.h:1872
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1845