35 const gsl_matrix *avk) {
38 atm_t *atm_cont, *atm_res;
43 const size_t n = avk->size1;
46 size_t n0[
NQ], n1[
NQ];
47 for (
int iq = 0; iq <
NQ; iq++) {
49 for (
size_t i = 0; i < n; i++) {
50 if (iqa[i] == iq && n0[iq] ==
N)
53 n1[iq] = i - n0[iq] + 1;
64 for (
int ig = 0; ig < ctl->
ng; ig++)
66 atm_cont->
q[ig], atm_res->
q[ig]);
67 for (
int iw = 0; iw < ctl->
nw; iw++)
69 atm_cont->
k[iw], atm_res->
k[iw]);
74 for (
int icl = 0; icl < ctl->
ncl; icl++)
76 &atm_cont->
clk[icl], &atm_res->
clk[icl]);
79 for (
int isf = 0; isf < ctl->
nsf; isf++)
86 const char *filename =
89 write_atm(dirname, filename, ctl, atm_cont, profile);
91 "atm_res.tab", &dirname, &profile);
92 write_atm(dirname, filename, ctl, atm_res, profile);
102 const gsl_matrix *avk,
112 for (
size_t i = 0; i < n1[iq]; i++) {
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);
119 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
135 for (
int ip = 0; ip < atm->
np; ip++)
140 for (
int ip = 0; ip < atm->
np; ip++)
145 for (
int ig = 0; ig < ctl->
ng; ig++)
146 for (
int ip = 0; ip < atm->
np; ip++)
152 for (
int iw = 0; iw < ctl->
nw; iw++)
153 for (
int ip = 0; ip < atm->
np; ip++)
164 for (
int icl = 0; icl < ctl->
ncl; icl++)
171 for (
int isf = 0; isf < ctl->
nsf; isf++)
190 gsl_vector_set(x, *n, value);
206 const double radius =
NORM(x);
208 *lat =
RAD2DEG(asin(x[2] / radius));
209 *lon =
RAD2DEG(atan2(x[1], x[0]));
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
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
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
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
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
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,
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,
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,
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,
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,
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
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,
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
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
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
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
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
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
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,
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
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,
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,
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
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,
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,
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,
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,
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
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,
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,
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,
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
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,
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
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
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
1029 const double *q[
NG] = { NULL };
1032 for (
int ig = 0; ig < ctl->
ng; ig++) {
1034 if (strcasecmp(ctl->
emitter[ig],
"C2H2") == 0)
1036 if (strcasecmp(ctl->
emitter[ig],
"C2H6") == 0)
1038 if (strcasecmp(ctl->
emitter[ig],
"CCl4") == 0)
1040 if (strcasecmp(ctl->
emitter[ig],
"CH3OH") == 0)
1042 if (strcasecmp(ctl->
emitter[ig],
"CH4") == 0)
1044 if (strcasecmp(ctl->
emitter[ig],
"ClO") == 0)
1046 if (strcasecmp(ctl->
emitter[ig],
"ClONO2") == 0)
1048 if (strcasecmp(ctl->
emitter[ig],
"CO") == 0)
1050 if (strcasecmp(ctl->
emitter[ig],
"COF2") == 0)
1052 if (strcasecmp(ctl->
emitter[ig],
"F11") == 0)
1054 if (strcasecmp(ctl->
emitter[ig],
"F113") == 0)
1056 if (strcasecmp(ctl->
emitter[ig],
"F114") == 0)
1058 if (strcasecmp(ctl->
emitter[ig],
"F12") == 0)
1060 if (strcasecmp(ctl->
emitter[ig],
"F14") == 0)
1062 if (strcasecmp(ctl->
emitter[ig],
"F22") == 0)
1064 if (strcasecmp(ctl->
emitter[ig],
"H2CO") == 0)
1066 if (strcasecmp(ctl->
emitter[ig],
"H2O") == 0)
1068 if (strcasecmp(ctl->
emitter[ig],
"H2O2") == 0)
1070 if (strcasecmp(ctl->
emitter[ig],
"HCl") == 0)
1072 if (strcasecmp(ctl->
emitter[ig],
"HCN") == 0)
1074 if (strcasecmp(ctl->
emitter[ig],
"HF") == 0)
1076 if (strcasecmp(ctl->
emitter[ig],
"HNO3") == 0)
1078 if (strcasecmp(ctl->
emitter[ig],
"HNO4") == 0)
1080 if (strcasecmp(ctl->
emitter[ig],
"HOCl") == 0)
1082 if (strcasecmp(ctl->
emitter[ig],
"N2O") == 0)
1084 if (strcasecmp(ctl->
emitter[ig],
"N2O5") == 0)
1086 if (strcasecmp(ctl->
emitter[ig],
"NH3") == 0)
1088 if (strcasecmp(ctl->
emitter[ig],
"NO") == 0)
1090 if (strcasecmp(ctl->
emitter[ig],
"NO2") == 0)
1092 if (strcasecmp(ctl->
emitter[ig],
"O3") == 0)
1094 if (strcasecmp(ctl->
emitter[ig],
"OCS") == 0)
1096 if (strcasecmp(ctl->
emitter[ig],
"SF6") == 0)
1098 if (strcasecmp(ctl->
emitter[ig],
"SO2") == 0)
1103 for (
int ip = 0; ip < atm->
np; ip++) {
1109 atm->
p[ip] =
LOGY(z[iz], pre[iz], z[iz + 1], pre[iz + 1], atm->
z[ip]);
1112 atm->
t[ip] =
LIN(z[iz], tem[iz], z[iz + 1], tem[iz + 1], atm->
z[ip]);
1115 for (
int ig = 0; ig < ctl->
ng; ig++)
1118 LIN(z[iz], q[ig][iz], z[iz + 1], q[ig][iz + 1], atm->
z[ip]);
1127 if (ctl->
ig_n2 >= 0)
1131 if (ctl->
ig_o2 >= 0)
1135 for (
int iw = 0; iw < ctl->
nw; iw++)
1140 for (
int icl = 0; icl < ctl->
ncl; icl++)
1145 for (
int isf = 0; isf < ctl->
nsf; isf++)
1146 atm->
sfeps[isf] = 1;
1158 const double D = sec / 86400 - 0.5;
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));
1166 const double e =
DEG2RAD(23.439 - 0.00000036 * D);
1169 const double sindec = sin(e) * sin(L);
1172 const double ra = atan2(cos(e) * sin(L), cos(L));
1175 const double GMST = 18.697374558 + 24.06570982441908 * D;
1178 const double LST = GMST + lon / 15;
1181 const double h = LST / 12 * M_PI - ra;
1184 const double lat_help =
DEG2RAD(lat);
1187 return sin(lat_help) * sindec + cos(lat_help)
1188 * sqrt(1 -
POW2(sindec)) * cos(h);
1194 const gsl_vector *dx,
1195 const gsl_vector *dy,
1196 const gsl_matrix *s_a_inv,
1197 const gsl_vector *sig_eps_inv) {
1199 double chisq_a, chisq_m = 0;
1202 const size_t m = dy->size;
1203 const size_t n = dx->size;
1206 gsl_vector *x_aux = gsl_vector_alloc(n);
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);
1216 gsl_vector_free(x_aux);
1219 return (chisq_m + chisq_a) / (double) m;
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
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,
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,
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;
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;
2095 static const double h2oslf[2001] =
2096 { 2.877e-21, 2.855e-21, 2.731e-21, 2.49e-21, 2.178e-21, 1.863e-21, 1.595e-21,
2097 1.381e-21, 1.221e-21, 1.095e-21, 9.882e-22, 8.926e-22, 8.041e-22, 7.217e-22,
2098 6.45e-22, 5.74e-22, 5.088e-22, 4.492e-22, 3.952e-22, 3.466e-22, 3.031e-22,
2099 2.644e-22, 2.302e-22, 2.001e-22, 1.738e-22, 1.509e-22, 1.311e-22, 1.139e-22,
2100 9.913e-23, 8.639e-23, 7.544e-23, 6.603e-23, 5.794e-23, 5.096e-23, 4.495e-23,
2101 3.974e-23, 3.523e-23, 3.13e-23, 2.786e-23, 2.485e-23, 2.221e-23, 1.987e-23,
2102 1.78e-23, 1.596e-23, 1.433e-23, 1.287e-23, 1.156e-23, 1.04e-23, 9.349e-24,
2103 8.41e-24, 7.568e-24, 6.81e-24, 6.13e-24, 5.517e-24, 4.967e-24, 4.471e-24,
2104 4.025e-24, 3.624e-24, 3.262e-24, 2.937e-24, 2.644e-24, 2.381e-24, 2.143e-24,
2105 1.93e-24, 1.737e-24, 1.564e-24, 1.413e-24, 1.284e-24, 1.176e-24, 1.087e-24,
2106 1.013e-24, 9.489e-25, 8.961e-25, 8.451e-25, 7.943e-25, 7.43e-25, 6.912e-25,
2107 6.447e-25, 6.025e-25, 5.642e-25, 5.292e-25, 4.971e-25, 4.69e-25, 4.444e-25,
2108 4.216e-25, 4.012e-25, 3.814e-25, 3.621e-25, 3.442e-25, 3.268e-25, 3.1e-25,
2109 2.957e-25, 2.78e-25, 2.617e-25, 2.445e-25, 2.305e-25, 2.187e-25, 2.08e-25,
2110 1.98e-25, 1.885e-25, 1.796e-25, 1.711e-25, 1.633e-25, 1.559e-25, 1.49e-25,
2111 1.426e-25, 1.367e-25, 1.312e-25, 1.263e-25, 1.218e-25, 1.178e-25, 1.143e-25,
2112 1.112e-25, 1.088e-25, 1.07e-25, 1.057e-25, 1.05e-25, 1.051e-25, 1.059e-25,
2113 1.076e-25, 1.1e-25, 1.133e-25, 1.18e-25, 1.237e-25, 1.308e-25, 1.393e-25,
2114 1.483e-25, 1.614e-25, 1.758e-25, 1.93e-25, 2.123e-25, 2.346e-25, 2.647e-25,
2115 2.93e-25, 3.279e-25, 3.745e-25, 4.152e-25, 4.813e-25, 5.477e-25, 6.203e-25,
2116 7.331e-25, 8.056e-25, 9.882e-25, 1.05e-24, 1.21e-24, 1.341e-24, 1.572e-24,
2117 1.698e-24, 1.968e-24, 2.175e-24, 2.431e-24, 2.735e-24, 2.867e-24, 3.19e-24,
2118 3.371e-24, 3.554e-24, 3.726e-24, 3.837e-24, 3.878e-24, 3.864e-24, 3.858e-24,
2119 3.841e-24, 3.852e-24, 3.815e-24, 3.762e-24, 3.618e-24, 3.579e-24, 3.45e-24,
2120 3.202e-24, 3.018e-24, 2.785e-24, 2.602e-24, 2.416e-24, 2.097e-24, 1.939e-24,
2121 1.689e-24, 1.498e-24, 1.308e-24, 1.17e-24, 1.011e-24, 9.237e-25, 7.909e-25,
2122 7.006e-25, 6.112e-25, 5.401e-25, 4.914e-25, 4.266e-25, 3.963e-25, 3.316e-25,
2123 3.037e-25, 2.598e-25, 2.294e-25, 2.066e-25, 1.813e-25, 1.583e-25, 1.423e-25,
2124 1.247e-25, 1.116e-25, 9.76e-26, 8.596e-26, 7.72e-26, 7.091e-26, 6.499e-26,
2125 5.801e-26, 5.15e-26, 4.5e-26, 4e-26, 3.509e-26, 3.1e-26, 2.714e-26,
2126 2.406e-26, 2.108e-26, 1.875e-26, 1.669e-26, 1.555e-26, 1.444e-26, 1.345e-26,
2127 1.257e-26, 1.175e-26, 1.102e-26, 1.035e-26, 9.745e-27, 9.194e-27, 8.685e-27,
2128 8.222e-27, 7.798e-27, 7.412e-27, 7.052e-27, 6.724e-27, 6.42e-27, 6.143e-27,
2129 5.886e-27, 5.649e-27, 5.43e-27, 5.228e-27, 5.041e-27, 4.868e-27, 4.708e-27,
2130 4.559e-27, 4.421e-27, 4.293e-27, 4.174e-27, 4.064e-27, 3.961e-27, 3.865e-27,
2131 3.775e-27, 3.692e-27, 3.614e-27, 3.542e-27, 3.474e-27, 3.411e-27, 3.353e-27,
2132 3.298e-27, 3.248e-27, 3.201e-27, 3.158e-27, 3.119e-27, 3.084e-27, 3.053e-27,
2133 3.025e-27, 3.003e-27, 2.988e-27, 2.976e-27, 2.977e-27, 2.989e-27, 3.015e-27,
2134 3.057e-27, 3.112e-27, 3.161e-27, 3.186e-27, 3.176e-27, 3.142e-27, 3.099e-27,
2135 3.065e-27, 3.011e-27, 2.955e-27, 2.914e-27, 2.884e-27, 2.864e-27, 2.858e-27,
2136 2.851e-27, 2.857e-27, 2.87e-27, 2.888e-27, 2.914e-27, 2.948e-27, 2.99e-27,
2137 3.042e-27, 3.105e-27, 3.185e-27, 3.276e-27, 3.385e-27, 3.511e-27, 3.646e-27,
2138 3.858e-27, 4.081e-27, 4.335e-27, 4.643e-27, 5.011e-27, 5.494e-27, 5.953e-27,
2139 6.354e-27, 7.116e-27, 7.498e-27, 8.613e-27, 9.35e-27, 1.002e-26, 1.09e-26,
2140 1.174e-26, 1.23e-26, 1.288e-26, 1.334e-26, 1.383e-26, 1.38e-26, 1.39e-26,
2141 1.373e-26, 1.354e-26, 1.335e-26, 1.343e-26, 1.323e-26, 1.349e-26, 1.353e-26,
2142 1.362e-26, 1.344e-26, 1.329e-26, 1.336e-26, 1.327e-26, 1.325e-26, 1.359e-26,
2143 1.374e-26, 1.415e-26, 1.462e-26, 1.526e-26, 1.619e-26, 1.735e-26, 1.863e-26,
2144 2.034e-26, 2.265e-26, 2.482e-26, 2.756e-26, 3.103e-26, 3.466e-26, 3.832e-26,
2145 4.378e-26, 4.913e-26, 5.651e-26, 6.311e-26, 7.169e-26, 8.057e-26, 9.253e-26,
2146 1.047e-25, 1.212e-25, 1.36e-25, 1.569e-25, 1.776e-25, 2.02e-25, 2.281e-25,
2147 2.683e-25, 2.994e-25, 3.488e-25, 3.896e-25, 4.499e-25, 5.175e-25, 6.035e-25,
2148 6.34e-25, 7.281e-25, 7.923e-25, 8.348e-25, 9.631e-25, 1.044e-24, 1.102e-24,
2149 1.176e-24, 1.244e-24, 1.283e-24, 1.326e-24, 1.4e-24, 1.395e-24, 1.387e-24,
2150 1.363e-24, 1.314e-24, 1.241e-24, 1.228e-24, 1.148e-24, 1.086e-24, 1.018e-24,
2151 8.89e-25, 8.316e-25, 7.292e-25, 6.452e-25, 5.625e-25, 5.045e-25, 4.38e-25,
2152 3.762e-25, 3.29e-25, 2.836e-25, 2.485e-25, 2.168e-25, 1.895e-25, 1.659e-25,
2153 1.453e-25, 1.282e-25, 1.132e-25, 1.001e-25, 8.836e-26, 7.804e-26, 6.922e-26,
2154 6.116e-26, 5.429e-26, 4.824e-26, 4.278e-26, 3.788e-26, 3.371e-26, 2.985e-26,
2155 2.649e-26, 2.357e-26, 2.09e-26, 1.858e-26, 1.647e-26, 1.462e-26, 1.299e-26,
2156 1.155e-26, 1.028e-26, 9.142e-27, 8.132e-27, 7.246e-27, 6.418e-27, 5.726e-27,
2157 5.221e-27, 4.89e-27, 4.666e-27, 4.443e-27, 4.203e-27, 3.978e-27, 3.77e-27,
2158 3.575e-27, 3.395e-27, 3.227e-27, 3.07e-27, 2.924e-27, 2.788e-27, 2.661e-27,
2159 2.543e-27, 2.433e-27, 2.329e-27, 2.233e-27, 2.143e-27, 2.058e-27, 1.98e-27,
2160 1.906e-27, 1.837e-27, 1.773e-27, 1.713e-27, 1.657e-27, 1.605e-27, 1.557e-27,
2161 1.514e-27, 1.472e-27, 1.435e-27, 1.404e-27, 1.377e-27, 1.354e-27, 1.332e-27,
2162 1.308e-27, 1.282e-27, 1.256e-27, 1.227e-27, 1.192e-27, 1.159e-27, 1.134e-27,
2163 1.114e-27, 1.098e-27, 1.081e-27, 1.066e-27, 1.055e-27, 1.045e-27, 1.036e-27,
2164 1.03e-27, 1.026e-27, 1.025e-27, 1.025e-27, 1.028e-27, 1.033e-27, 1.041e-27,
2165 1.049e-27, 1.06e-27, 1.075e-27, 1.093e-27, 1.114e-27, 1.139e-27, 1.166e-27,
2166 1.199e-27, 1.239e-27, 1.282e-27, 1.316e-27, 1.355e-27, 1.436e-27, 1.588e-27,
2167 1.807e-27, 2.06e-27, 2.337e-27, 2.645e-27, 2.996e-27, 3.393e-27, 3.843e-27,
2168 4.363e-27, 4.935e-27, 5.607e-27, 6.363e-27, 7.242e-27, 8.23e-27, 9.411e-27,
2169 1.071e-26, 1.232e-26, 1.402e-26, 1.6e-26, 1.82e-26, 2.128e-26, 2.386e-26,
2170 2.781e-26, 3.242e-26, 3.653e-26, 4.323e-26, 4.747e-26, 5.321e-26, 5.919e-26,
2171 6.681e-26, 7.101e-26, 7.983e-26, 8.342e-26, 8.741e-26, 9.431e-26, 9.952e-26,
2172 1.026e-25, 1.055e-25, 1.095e-25, 1.095e-25, 1.087e-25, 1.056e-25, 1.026e-25,
2173 9.715e-26, 9.252e-26, 8.452e-26, 7.958e-26, 7.268e-26, 6.295e-26, 6.003e-26,
2174 5e-26, 4.591e-26, 3.983e-26, 3.479e-26, 3.058e-26, 2.667e-26, 2.293e-26,
2175 1.995e-26, 1.747e-26, 1.517e-26, 1.335e-26, 1.165e-26, 1.028e-26, 9.007e-27,
2176 7.956e-27, 7.015e-27, 6.192e-27, 5.491e-27, 4.859e-27, 4.297e-27, 3.799e-27,
2177 3.38e-27, 3.002e-27, 2.659e-27, 2.366e-27, 2.103e-27, 1.861e-27, 1.655e-27,
2178 1.469e-27, 1.309e-27, 1.162e-27, 1.032e-27, 9.198e-28, 8.181e-28, 7.294e-28,
2179 6.516e-28, 5.787e-28, 5.163e-28, 4.612e-28, 4.096e-28, 3.654e-28, 3.299e-28,
2180 3.052e-28, 2.856e-28, 2.683e-28, 2.507e-28, 2.346e-28, 2.194e-28, 2.053e-28,
2181 1.921e-28, 1.799e-28, 1.686e-28, 1.58e-28, 1.481e-28, 1.389e-28, 1.304e-28,
2182 1.226e-28, 1.151e-28, 1.083e-28, 1.02e-28, 9.618e-29, 9.08e-29, 8.575e-29,
2183 8.08e-29, 7.624e-29, 7.176e-29, 6.761e-29, 6.37e-29, 6.004e-29, 5.672e-29,
2184 5.371e-29, 5.097e-29, 4.845e-29, 4.608e-29, 4.39e-29, 4.192e-29, 4.011e-29,
2185 3.846e-29, 3.698e-29, 3.568e-29, 3.45e-29, 3.351e-29, 3.268e-29, 3.195e-29,
2186 3.131e-29, 3.091e-29, 3.06e-29, 3.039e-29, 3.034e-29, 3.045e-29, 3.072e-29,
2187 3.116e-29, 3.176e-29, 3.253e-29, 3.347e-29, 3.467e-29, 3.605e-29, 3.763e-29,
2188 3.946e-29, 4.162e-29, 4.399e-29, 4.677e-29, 4.983e-29, 5.336e-29, 5.728e-29,
2189 6.168e-29, 6.684e-29, 7.214e-29, 7.861e-29, 8.62e-29, 9.481e-29, 1.032e-28,
2190 1.135e-28, 1.264e-28, 1.396e-28, 1.567e-28, 1.74e-28, 1.977e-28, 2.2e-28,
2191 2.563e-28, 2.935e-28, 3.386e-28, 3.993e-28, 4.828e-28, 5.714e-28, 6.877e-28,
2192 8.135e-28, 9.779e-28, 1.132e-27, 1.344e-27, 1.544e-27, 1.82e-27, 2.207e-27,
2193 2.509e-27, 2.854e-27, 3.026e-27, 3.278e-27, 3.474e-27, 3.693e-27, 3.93e-27,
2194 4.104e-27, 4.22e-27, 4.439e-27, 4.545e-27, 4.778e-27, 4.812e-27, 5.018e-27,
2195 4.899e-27, 5.075e-27, 5.073e-27, 5.171e-27, 5.131e-27, 5.25e-27, 5.617e-27,
2196 5.846e-27, 6.239e-27, 6.696e-27, 7.398e-27, 8.073e-27, 9.15e-27, 1.009e-26,
2197 1.116e-26, 1.264e-26, 1.439e-26, 1.644e-26, 1.856e-26, 2.147e-26, 2.317e-26,
2198 2.713e-26, 2.882e-26, 2.99e-26, 3.489e-26, 3.581e-26, 4.033e-26, 4.26e-26,
2199 4.543e-26, 4.84e-26, 4.826e-26, 5.013e-26, 5.252e-26, 5.277e-26, 5.306e-26,
2200 5.234e-26, 5.111e-26, 5.134e-26, 4.748e-26, 4.434e-26, 4.109e-26, 3.605e-26,
2201 3.252e-26, 2.731e-26, 2.369e-26, 1.922e-26, 1.558e-26, 1.321e-26, 1.058e-26,
2202 8.515e-27, 6.811e-27, 5.431e-27, 4.348e-27, 3.51e-27, 2.853e-27, 2.344e-27,
2203 1.949e-27, 1.649e-27, 1.409e-27, 1.232e-27, 1.098e-27, 9.866e-28, 8.899e-28,
2204 8.135e-28, 7.409e-28, 6.809e-28, 6.237e-28, 5.728e-28, 5.267e-28, 4.865e-28,
2205 4.482e-28, 4.169e-28, 3.841e-28, 3.573e-28, 3.304e-28, 3.065e-28, 2.851e-28,
2206 2.634e-28, 2.448e-28, 2.275e-28, 2.114e-28, 1.965e-28, 1.83e-28, 1.707e-28,
2207 1.591e-28, 1.484e-28, 1.386e-28, 1.294e-28, 1.209e-28, 1.131e-28, 1.056e-28,
2208 9.901e-29, 9.263e-29, 8.68e-29, 8.137e-29, 7.627e-29, 7.158e-29, 6.715e-29,
2209 6.305e-29, 5.927e-29, 5.568e-29, 5.242e-29, 4.935e-29, 4.648e-29, 4.383e-29,
2210 4.137e-29, 3.909e-29, 3.697e-29, 3.5e-29, 3.321e-29, 3.156e-29, 3.006e-29,
2211 2.868e-29, 2.745e-29, 2.638e-29, 2.545e-29, 2.469e-29, 2.405e-29, 2.369e-29,
2212 2.344e-29, 2.35e-29, 2.371e-29, 2.491e-29, 2.535e-29, 2.73e-29, 3.067e-29,
2213 3.322e-29, 3.63e-29, 4.045e-29, 4.524e-29, 4.981e-29, 5.613e-29, 6.051e-29,
2214 6.538e-29, 6.892e-29, 7.601e-29, 8.194e-29, 8.806e-29, 9.45e-29, 9.745e-29,
2215 1.009e-28, 1.017e-28, 1.039e-28, 1.061e-28, 1.076e-28, 1.086e-28, 1.111e-28,
2216 1.142e-28, 1.16e-28, 1.174e-28, 1.18e-28, 1.187e-28, 1.194e-28, 1.192e-28,
2217 1.224e-28, 1.245e-28, 1.246e-28, 1.318e-28, 1.377e-28, 1.471e-28, 1.582e-28,
2218 1.713e-28, 1.853e-28, 2.063e-28, 2.27e-28, 2.567e-28, 2.891e-28, 3.264e-28,
2219 3.744e-28, 4.286e-28, 4.915e-28, 5.623e-28, 6.336e-28, 7.293e-28, 8.309e-28,
2220 9.319e-28, 1.091e-27, 1.243e-27, 1.348e-27, 1.449e-27, 1.62e-27, 1.846e-27,
2221 1.937e-27, 2.04e-27, 2.179e-27, 2.298e-27, 2.433e-27, 2.439e-27, 2.464e-27,
2222 2.611e-27, 2.617e-27, 2.582e-27, 2.453e-27, 2.401e-27, 2.349e-27, 2.203e-27,
2223 2.066e-27, 1.939e-27, 1.78e-27, 1.558e-27, 1.391e-27, 1.203e-27, 1.048e-27,
2224 9.464e-28, 8.306e-28, 7.239e-28, 6.317e-28, 5.52e-28, 4.847e-28, 4.282e-28,
2225 3.796e-28, 3.377e-28, 2.996e-28, 2.678e-28, 2.4e-28, 2.134e-28, 1.904e-28,
2226 1.705e-28, 1.523e-28, 1.35e-28, 1.204e-28, 1.07e-28, 9.408e-29, 8.476e-29,
2227 7.47e-29, 6.679e-29, 5.929e-29, 5.267e-29, 4.711e-29, 4.172e-29, 3.761e-29,
2228 3.288e-29, 2.929e-29, 2.609e-29, 2.315e-29, 2.042e-29, 1.844e-29, 1.64e-29,
2229 1.47e-29, 1.31e-29, 1.176e-29, 1.049e-29, 9.377e-30, 8.462e-30, 7.616e-30,
2230 6.818e-30, 6.119e-30, 5.558e-30, 5.152e-30, 4.832e-30, 4.546e-30, 4.267e-30,
2231 4.009e-30, 3.77e-30, 3.546e-30, 3.34e-30, 3.149e-30, 2.971e-30, 2.805e-30,
2232 2.652e-30, 2.509e-30, 2.377e-30, 2.255e-30, 2.142e-30, 2.038e-30, 1.943e-30,
2233 1.855e-30, 1.776e-30, 1.703e-30, 1.64e-30, 1.586e-30, 1.536e-30, 1.494e-30,
2234 1.466e-30, 1.446e-30, 1.44e-30, 1.439e-30, 1.455e-30, 1.461e-30, 1.479e-30,
2235 1.514e-30, 1.538e-30, 1.59e-30, 1.652e-30, 1.75e-30, 1.811e-30, 1.88e-30,
2236 1.933e-30, 2.027e-30, 2.078e-30, 2.17e-30, 2.249e-30, 2.323e-30, 2.408e-30,
2237 2.461e-30, 2.536e-30, 2.581e-30, 2.615e-30, 2.721e-30, 2.782e-30, 2.866e-30,
2238 2.938e-30, 2.958e-30, 3.011e-30, 3.155e-30, 3.237e-30, 3.589e-30, 3.838e-30,
2239 4.083e-30, 4.354e-30, 4.745e-30, 5.148e-30, 5.648e-30, 6.194e-30, 6.748e-30,
2240 7.566e-30, 8.421e-30, 9.427e-30, 1.042e-29, 1.165e-29, 1.341e-29, 1.518e-29,
2241 1.686e-29, 2.036e-29, 2.362e-29, 2.811e-29, 3.296e-29, 4.07e-29, 4.695e-29,
2242 6.152e-29, 7.572e-29, 9.557e-29, 1.135e-28, 1.279e-28, 1.364e-28, 1.436e-28,
2243 1.54e-28, 1.672e-28, 1.793e-28, 1.906e-28, 2.036e-28, 2.144e-28, 2.292e-28,
2244 2.371e-28, 2.493e-28, 2.606e-28, 2.706e-28, 2.866e-28, 3.036e-28, 3.136e-28,
2245 3.405e-28, 3.665e-28, 3.837e-28, 4.229e-28, 4.748e-28, 5.32e-28, 5.763e-28,
2246 6.677e-28, 7.216e-28, 7.716e-28, 8.958e-28, 9.419e-28, 1.036e-27, 1.108e-27,
2247 1.189e-27, 1.246e-27, 1.348e-27, 1.31e-27, 1.361e-27, 1.364e-27, 1.363e-27,
2248 1.343e-27, 1.293e-27, 1.254e-27, 1.235e-27, 1.158e-27, 1.107e-27, 9.961e-28,
2249 9.011e-28, 7.91e-28, 6.916e-28, 6.338e-28, 5.564e-28, 4.827e-28, 4.198e-28,
2250 3.695e-28, 3.276e-28, 2.929e-28, 2.633e-28, 2.391e-28, 2.192e-28, 2.021e-28,
2251 1.89e-28, 1.772e-28, 1.667e-28, 1.603e-28, 1.547e-28, 1.537e-28, 1.492e-28,
2252 1.515e-28, 1.479e-28, 1.45e-28, 1.513e-28, 1.495e-28, 1.529e-28, 1.565e-28,
2253 1.564e-28, 1.553e-28, 1.569e-28, 1.584e-28, 1.57e-28, 1.538e-28, 1.531e-28,
2254 1.346e-28, 1.199e-28, 1.044e-28, 8.892e-29, 7.076e-29, 5.884e-29, 5.039e-29,
2255 4.129e-29, 3.663e-29, 2.993e-29, 2.622e-29, 2.232e-29, 1.884e-29, 1.569e-29,
2256 1.348e-29, 1.144e-29, 1.009e-29, 8.833e-30, 7.907e-30, 7.079e-30, 6.514e-30,
2257 5.823e-30, 5.312e-30, 4.883e-30, 4.458e-30, 4.094e-30, 3.734e-30, 3.458e-30,
2258 3.205e-30, 2.962e-30, 2.733e-30, 2.532e-30, 2.351e-30, 2.187e-30, 2.034e-30,
2259 1.889e-30, 1.764e-30, 1.648e-30, 1.541e-30, 1.443e-30, 1.355e-30, 1.274e-30,
2260 1.198e-30, 1.133e-30, 1.071e-30, 1.015e-30, 9.648e-31, 9.195e-31, 8.791e-31,
2261 8.435e-31, 8.125e-31, 7.859e-31, 7.621e-31, 7.481e-31, 7.351e-31, 7.228e-31,
2262 7.295e-31, 7.339e-31, 7.588e-31, 7.701e-31, 7.886e-31, 8.511e-31, 9.061e-31,
2263 9.926e-31, 1.083e-30, 1.241e-30, 1.469e-30, 1.736e-30, 1.966e-30, 2.132e-30,
2264 2.28e-30, 2.473e-30, 2.718e-30, 2.922e-30, 3.128e-30, 3.361e-30, 3.641e-30,
2265 3.91e-30, 4.196e-30, 4.501e-30, 4.932e-30, 5.258e-30, 5.755e-30, 6.253e-30,
2266 6.664e-30, 7.344e-30, 7.985e-30, 8.877e-30, 1.005e-29, 1.118e-29, 1.251e-29,
2267 1.428e-29, 1.61e-29, 1.888e-29, 2.077e-29, 2.331e-29, 2.751e-29, 3.061e-29,
2268 3.522e-29, 3.805e-29, 4.181e-29, 4.575e-29, 5.167e-29, 5.634e-29, 6.007e-29,
2269 6.501e-29, 6.829e-29, 7.211e-29, 7.262e-29, 7.696e-29, 7.832e-29, 7.799e-29,
2270 7.651e-29, 7.304e-29, 7.15e-29, 6.977e-29, 6.603e-29, 6.209e-29, 5.69e-29,
2271 5.432e-29, 4.764e-29, 4.189e-29, 3.64e-29, 3.203e-29, 2.848e-29, 2.51e-29,
2272 2.194e-29, 1.946e-29, 1.75e-29, 1.567e-29, 1.426e-29, 1.302e-29, 1.197e-29,
2273 1.109e-29, 1.035e-29, 9.719e-30, 9.207e-30, 8.957e-30, 8.578e-30, 8.262e-30,
2274 8.117e-30, 7.987e-30, 7.875e-30, 7.741e-30, 7.762e-30, 7.537e-30, 7.424e-30,
2275 7.474e-30, 7.294e-30, 7.216e-30, 7.233e-30, 7.14e-30, 7.085e-30, 6.434e-30,
2276 5.585e-30, 5.015e-30, 3.956e-30, 3.337e-30, 2.545e-30, 2.141e-30, 1.761e-30,
2277 1.685e-30, 1.507e-30, 1.241e-30, 1.081e-30, 9.675e-31, 7.964e-31, 6.93e-31,
2278 5.79e-31, 5.069e-31, 4.452e-31, 3.97e-31, 3.551e-31, 3.228e-31, 2.939e-31,
2279 2.682e-31, 2.471e-31, 2.278e-31, 2.106e-31, 1.95e-31, 1.811e-31, 1.682e-31,
2280 1.563e-31, 1.458e-31, 1.363e-31, 1.278e-31, 1.2e-31, 1.129e-31, 1.066e-31,
2281 1.007e-31, 9.545e-32, 9.075e-32, 8.656e-32, 8.285e-32, 7.958e-32, 7.674e-32,
2282 7.431e-32, 7.227e-32, 7.061e-32, 6.934e-32, 6.843e-32, 6.79e-32, 6.775e-32,
2283 6.798e-32, 6.859e-32, 6.96e-32, 7.102e-32, 7.287e-32, 7.517e-32, 7.795e-32,
2284 8.123e-32, 8.504e-32, 8.945e-32, 9.45e-32, 1.003e-31, 1.07e-31, 1.148e-31,
2285 1.232e-31, 1.327e-31, 1.441e-31, 1.535e-31, 1.655e-31, 1.814e-31, 2.02e-31,
2286 2.307e-31, 2.622e-31, 2.962e-31, 3.369e-31, 3.819e-31, 4.329e-31, 4.932e-31,
2287 5.589e-31, 6.364e-31, 7.284e-31, 8.236e-31, 9.447e-31, 1.078e-30, 1.229e-30,
2288 1.417e-30, 1.614e-30, 1.843e-30, 2.107e-30, 2.406e-30, 2.728e-30, 3.195e-30,
2289 3.595e-30, 4.153e-30, 4.736e-30, 5.41e-30, 6.088e-30, 6.769e-30, 7.691e-30,
2290 8.545e-30, 9.621e-30, 1.047e-29, 1.161e-29, 1.296e-29, 1.424e-29, 1.576e-29,
2291 1.739e-29, 1.893e-29, 2.08e-29, 2.336e-29, 2.604e-29, 2.76e-29, 3.001e-29,
2292 3.365e-29, 3.55e-29, 3.895e-29, 4.183e-29, 4.614e-29, 4.846e-29, 5.068e-29,
2293 5.427e-29, 5.541e-29, 5.864e-29, 5.997e-29, 5.997e-29, 6.061e-29, 5.944e-29,
2294 5.855e-29, 5.661e-29, 5.523e-29, 5.374e-29, 4.94e-29, 4.688e-29, 4.17e-29,
2295 3.913e-29, 3.423e-29, 2.997e-29, 2.598e-29, 2.253e-29, 1.946e-29, 1.71e-29,
2296 1.507e-29, 1.336e-29, 1.19e-29, 1.068e-29, 9.623e-30, 8.772e-30, 8.007e-30,
2297 7.42e-30, 6.884e-30, 6.483e-30, 6.162e-30, 5.922e-30, 5.688e-30, 5.654e-30,
2298 5.637e-30, 5.701e-30, 5.781e-30, 5.874e-30, 6.268e-30, 6.357e-30, 6.525e-30,
2299 7.137e-30, 7.441e-30, 8.024e-30, 8.485e-30, 9.143e-30, 9.536e-30, 9.717e-30,
2300 1.018e-29, 1.042e-29, 1.054e-29, 1.092e-29, 1.093e-29, 1.072e-29, 1.046e-29,
2301 9.283e-30, 8.053e-30, 6.68e-30, 5.63e-30, 4.933e-30, 3.488e-30, 3.324e-30,
2302 2.826e-30, 2.429e-30, 2.051e-30, 1.679e-30, 1.411e-30, 1.24e-30, 1.098e-30,
2303 9.668e-31, 8.529e-31, 7.848e-31, 7.098e-31, 6.117e-31, 5.246e-31, 4.521e-31,
2304 4.059e-31, 3.783e-31, 3.502e-31, 3.271e-31, 2.956e-31, 2.636e-31, 2.464e-31,
2305 2.19e-31, 1.986e-31, 1.791e-31, 1.638e-31, 1.491e-31, 1.383e-31, 1.271e-31,
2306 1.166e-31, 1.082e-31, 1.002e-31, 9.317e-32, 8.697e-32, 8.157e-32, 7.678e-32,
2307 7.252e-32, 6.874e-32, 6.539e-32, 6.243e-32, 5.985e-32, 5.763e-32, 5.575e-32,
2308 5.421e-32, 5.3e-32, 5.212e-32, 5.157e-32, 5.138e-32, 5.156e-32, 5.214e-32,
2309 5.313e-32, 5.457e-32, 5.686e-32, 5.953e-32, 6.284e-32, 6.856e-32, 7.351e-32,
2310 8.006e-32, 8.957e-32, 1.031e-31, 1.17e-31, 1.345e-31, 1.623e-31, 1.999e-31,
2311 2.507e-31, 3.004e-31, 3.378e-31, 3.688e-31, 4.118e-31, 4.569e-31, 5.025e-31,
2312 5.66e-31, 6.231e-31, 6.881e-31, 7.996e-31, 8.526e-31, 9.694e-31, 1.106e-30,
2313 1.222e-30, 1.355e-30, 1.525e-30, 1.775e-30, 1.924e-30, 2.181e-30, 2.379e-30,
2314 2.662e-30, 2.907e-30, 3.154e-30, 3.366e-30, 3.579e-30, 3.858e-30, 4.046e-30,
2315 4.196e-30, 4.166e-30, 4.457e-30, 4.466e-30, 4.404e-30, 4.337e-30, 4.15e-30,
2316 4.083e-30, 3.91e-30, 3.723e-30, 3.514e-30, 3.303e-30, 2.847e-30, 2.546e-30,
2317 2.23e-30, 1.994e-30, 1.733e-30, 1.488e-30, 1.297e-30, 1.144e-30, 1.004e-30,
2318 8.741e-31, 7.928e-31, 7.034e-31, 6.323e-31, 5.754e-31, 5.25e-31, 4.85e-31,
2319 4.502e-31, 4.286e-31, 4.028e-31, 3.899e-31, 3.824e-31, 3.761e-31, 3.804e-31,
2320 3.839e-31, 3.845e-31, 4.244e-31, 4.382e-31, 4.582e-31, 4.847e-31, 5.209e-31,
2321 5.384e-31, 5.887e-31, 6.371e-31, 6.737e-31, 7.168e-31, 7.415e-31, 7.827e-31,
2322 8.037e-31, 8.12e-31, 8.154e-31, 7.981e-31, 7.783e-31, 6.9e-31, 6.03e-31,
2323 4.9e-31, 3.878e-31, 3.068e-31, 2.533e-31, 2.255e-31, 2.056e-31, 1.569e-31,
2324 1.398e-31, 1.149e-31, 9.249e-32, 7.706e-32, 6.436e-32, 5.514e-32, 4.782e-32,
2325 4.202e-32, 3.721e-32, 3.336e-32, 3.015e-32, 2.744e-32, 2.512e-32, 2.312e-32,
2326 2.138e-32, 1.987e-32, 1.855e-32, 1.741e-32, 1.642e-32, 1.557e-32, 1.483e-32,
2327 1.422e-32, 1.37e-32, 1.329e-32, 1.297e-32, 1.274e-32, 1.259e-32, 1.253e-32,
2328 1.255e-32, 1.266e-32, 1.284e-32, 1.312e-32, 1.348e-32, 1.393e-32, 1.448e-32,
2329 1.512e-32, 1.587e-32, 1.672e-32, 1.77e-32, 1.88e-32, 1.99e-32, 2.11e-32,
2330 2.274e-32, 2.516e-32, 2.844e-32, 3.231e-32, 3.661e-32, 4.153e-32, 4.717e-32,
2331 5.36e-32, 6.094e-32, 6.93e-32, 7.882e-32, 8.966e-32, 1.02e-31, 1.162e-31,
2332 1.324e-31, 1.51e-31, 1.72e-31, 1.965e-31, 2.237e-31, 2.56e-31, 2.927e-31,
2333 3.371e-31, 3.842e-31, 4.429e-31, 5.139e-31, 5.798e-31, 6.697e-31, 7.626e-31,
2334 8.647e-31, 1.022e-30, 1.136e-30, 1.3e-30, 1.481e-30, 1.672e-30, 1.871e-30,
2335 2.126e-30, 2.357e-30, 2.583e-30, 2.997e-30, 3.289e-30, 3.702e-30, 4.012e-30,
2336 4.319e-30, 4.527e-30, 5.001e-30, 5.448e-30, 5.611e-30, 5.76e-30, 5.965e-30,
2337 6.079e-30, 6.207e-30, 6.276e-30, 6.222e-30, 6.137e-30, 6e-30, 5.814e-30,
2338 5.393e-30, 5.35e-30, 4.947e-30, 4.629e-30, 4.117e-30, 3.712e-30, 3.372e-30,
2339 2.923e-30, 2.55e-30, 2.232e-30, 1.929e-30, 1.679e-30, 1.46e-30, 1.289e-30,
2340 1.13e-30, 9.953e-31, 8.763e-31, 7.76e-31, 6.9e-31, 6.16e-31, 5.525e-31,
2341 4.958e-31, 4.489e-31, 4.072e-31, 3.728e-31, 3.438e-31, 3.205e-31, 3.006e-31,
2342 2.848e-31, 2.766e-31, 2.688e-31, 2.664e-31, 2.67e-31, 2.696e-31, 2.786e-31,
2343 2.861e-31, 3.009e-31, 3.178e-31, 3.389e-31, 3.587e-31, 3.819e-31, 4.054e-31,
2344 4.417e-31, 4.703e-31, 5.137e-31, 5.46e-31, 6.055e-31, 6.333e-31, 6.773e-31,
2345 7.219e-31, 7.717e-31, 8.131e-31, 8.491e-31, 8.574e-31, 9.01e-31, 9.017e-31,
2346 8.999e-31, 8.959e-31, 8.838e-31, 8.579e-31, 8.162e-31, 8.098e-31, 7.472e-31,
2347 7.108e-31, 6.559e-31, 5.994e-31, 5.172e-31, 4.424e-31, 3.951e-31, 3.34e-31,
2348 2.902e-31, 2.541e-31, 2.215e-31, 1.945e-31, 1.716e-31, 1.503e-31, 1.339e-31,
2349 1.185e-31, 1.05e-31, 9.336e-32, 8.307e-32, 7.312e-32, 6.55e-32, 5.836e-32,
2350 5.178e-32, 4.6e-32, 4.086e-32, 3.639e-32, 3.247e-32, 2.904e-32, 2.604e-32,
2351 2.341e-32, 2.112e-32, 1.914e-32, 1.744e-32, 1.598e-32, 1.476e-32, 1.374e-32,
2352 1.293e-32, 1.23e-32, 1.185e-32, 1.158e-32, 1.147e-32, 1.154e-32, 1.177e-32,
2353 1.219e-32, 1.28e-32, 1.36e-32, 1.463e-32, 1.591e-32, 1.75e-32, 1.94e-32,
2354 2.156e-32, 2.43e-32, 2.748e-32, 3.052e-32, 3.533e-32, 3.967e-32, 4.471e-32,
2355 5.041e-32, 5.86e-32, 6.664e-32, 7.522e-32, 8.342e-32, 9.412e-32, 1.072e-31,
2356 1.213e-31, 1.343e-31, 1.496e-31, 1.664e-31, 1.822e-31, 2.029e-31, 2.233e-31,
2357 2.457e-31, 2.709e-31, 2.928e-31, 3.115e-31, 3.356e-31, 3.592e-31, 3.818e-31,
2358 3.936e-31, 4.061e-31, 4.149e-31, 4.299e-31, 4.223e-31, 4.251e-31, 4.287e-31,
2359 4.177e-31, 4.094e-31, 3.942e-31, 3.772e-31, 3.614e-31, 3.394e-31, 3.222e-31,
2360 2.791e-31, 2.665e-31, 2.309e-31, 2.032e-31, 1.74e-31, 1.535e-31, 1.323e-31,
2361 1.151e-31, 9.803e-32, 8.65e-32, 7.54e-32, 6.619e-32, 5.832e-32, 5.113e-32,
2362 4.503e-32, 3.975e-32, 3.52e-32, 3.112e-32, 2.797e-32, 2.5e-32, 2.24e-32,
2363 2.013e-32, 1.819e-32, 1.653e-32, 1.513e-32, 1.395e-32, 1.299e-32, 1.225e-32,
2364 1.168e-32, 1.124e-32, 1.148e-32, 1.107e-32, 1.128e-32, 1.169e-32, 1.233e-32,
2365 1.307e-32, 1.359e-32, 1.543e-32, 1.686e-32, 1.794e-32, 2.028e-32, 2.21e-32,
2366 2.441e-32, 2.653e-32, 2.828e-32, 3.093e-32, 3.28e-32, 3.551e-32, 3.677e-32,
2367 3.803e-32, 3.844e-32, 4.068e-32, 4.093e-32, 4.002e-32, 3.904e-32, 3.624e-32,
2368 3.633e-32, 3.622e-32, 3.443e-32, 3.184e-32, 2.934e-32, 2.476e-32, 2.212e-32,
2369 1.867e-32, 1.594e-32, 1.37e-32, 1.192e-32, 1.045e-32, 9.211e-33, 8.17e-33,
2370 7.29e-33, 6.55e-33, 5.929e-33, 5.415e-33, 4.995e-33, 4.661e-33, 4.406e-33,
2371 4.225e-33, 4.116e-33, 4.075e-33, 4.102e-33, 4.198e-33, 4.365e-33, 4.606e-33,
2372 4.925e-33, 5.326e-33, 5.818e-33, 6.407e-33, 7.104e-33, 7.92e-33, 8.868e-33,
2373 9.964e-33, 1.123e-32, 1.268e-32, 1.434e-32, 1.626e-32, 1.848e-32, 2.107e-32,
2374 2.422e-32, 2.772e-32, 3.145e-32, 3.704e-32, 4.27e-32, 4.721e-32, 5.361e-32,
2375 6.083e-32, 7.095e-32, 7.968e-32, 9.228e-32, 1.048e-31, 1.187e-31, 1.336e-31,
2376 1.577e-31, 1.772e-31, 2.017e-31, 2.25e-31, 2.63e-31, 2.911e-31, 3.356e-31,
2377 3.82e-31, 4.173e-31, 4.811e-31, 5.254e-31, 5.839e-31, 6.187e-31, 6.805e-31,
2378 7.118e-31, 7.369e-31, 7.664e-31, 7.794e-31, 7.947e-31, 8.036e-31, 7.954e-31,
2379 7.849e-31, 7.518e-31, 7.462e-31, 6.926e-31, 6.531e-31, 6.197e-31, 5.421e-31,
2380 4.777e-31, 4.111e-31, 3.679e-31, 3.166e-31, 2.786e-31, 2.436e-31, 2.144e-31,
2381 1.859e-31, 1.628e-31, 1.414e-31, 1.237e-31, 1.093e-31, 9.558e-32
2384 static const double h2ofrn[2001] =
2385 { 8.563e-23, 8.828e-23, 9.182e-23, 9.796e-23, 1.14e-22, 1.376e-22, 1.545e-22,
2386 1.508e-22, 1.386e-22, 1.215e-22, 1.063e-22, 9.151e-23, 8.008e-23, 6.97e-23,
2387 6.055e-23, 5.243e-23, 4.559e-23, 3.763e-23, 3.055e-23, 2.563e-23, 2.197e-23,
2388 1.809e-23, 1.483e-23, 1.167e-23, 8.809e-24, 7.131e-24, 5.933e-24, 5.172e-24,
2389 4.22e-24, 3.427e-24, 2.648e-24, 2.123e-24, 1.825e-24, 1.476e-24, 1.101e-24,
2390 8.588e-25, 6.499e-25, 4.875e-25, 3.861e-25, 3.001e-25, 2.343e-25, 2.087e-25,
2391 1.771e-25, 1.588e-25, 1.408e-25, 1.181e-25, 1.024e-25, 9.223e-26, 7.916e-26,
2392 6.692e-26, 5.72e-26, 5.125e-26, 4.478e-26, 3.844e-26, 3.267e-26, 2.851e-26,
2393 2.473e-26, 2.124e-26, 1.768e-26, 1.481e-26, 1.267e-26, 1.075e-26, 9.212e-27,
2394 7.849e-27, 6.601e-27, 5.599e-27, 4.768e-27, 4.098e-27, 3.558e-27, 3.089e-27,
2395 2.678e-27, 2.339e-27, 2.038e-27, 1.755e-27, 1.497e-27, 1.294e-27, 1.129e-27,
2396 9.878e-28, 8.603e-28, 7.494e-28, 6.568e-28, 5.747e-28, 5.025e-28, 4.345e-28,
2397 3.758e-28, 3.272e-28, 2.862e-28, 2.508e-28, 2.198e-28, 1.918e-28, 1.68e-28,
2398 1.471e-28, 1.289e-28, 1.135e-28, 9.962e-29, 8.767e-29, 7.699e-29, 6.798e-29,
2399 6.007e-29, 5.336e-29, 4.75e-29, 4.232e-29, 3.807e-29, 3.476e-29, 3.237e-29,
2400 3.002e-29, 2.821e-29, 2.757e-29, 2.816e-29, 2.92e-29, 3.044e-29, 3.42e-29,
2401 3.745e-29, 4.197e-29, 4.816e-29, 5.987e-29, 7.098e-29, 8.082e-29, 9.622e-29,
2402 1.211e-28, 1.502e-28, 1.766e-28, 2.223e-28, 2.901e-28, 3.951e-28, 5.072e-28,
2403 6.232e-28, 7.904e-28, 1.034e-27, 1.438e-27, 1.89e-27, 2.59e-27, 3.592e-27,
2404 4.973e-27, 7.159e-27, 9.987e-27, 1.382e-26, 1.93e-26, 2.592e-26, 3.454e-26,
2405 4.572e-26, 5.932e-26, 7.554e-26, 9.559e-26, 1.183e-25, 1.425e-25, 1.681e-25,
2406 1.978e-25, 2.336e-25, 2.669e-25, 3.023e-25, 3.372e-25, 3.716e-25, 3.968e-25,
2407 4.061e-25, 4.011e-25, 3.81e-25, 3.491e-25, 3.155e-25, 2.848e-25, 2.678e-25,
2408 2.66e-25, 2.811e-25, 3.071e-25, 3.294e-25, 3.459e-25, 3.569e-25, 3.56e-25,
2409 3.434e-25, 3.186e-25, 2.916e-25, 2.622e-25, 2.275e-25, 1.918e-25, 1.62e-25,
2410 1.373e-25, 1.182e-25, 1.006e-25, 8.556e-26, 7.26e-26, 6.11e-26, 5.04e-26,
2411 4.23e-26, 3.456e-26, 2.903e-26, 2.486e-26, 2.039e-26, 1.672e-26, 1.285e-26,
2412 1.054e-26, 8.302e-27, 6.667e-27, 5.503e-27, 4.562e-27, 3.948e-27, 3.198e-27,
2413 2.586e-27, 2.225e-27, 1.807e-27, 1.53e-27, 1.294e-27, 1.126e-27, 9.604e-28,
2414 7.85e-28, 6.813e-28, 5.583e-28, 4.69e-28, 3.996e-28, 3.373e-28, 2.93e-28,
2415 2.417e-28, 2.061e-28, 1.743e-28, 1.475e-28, 1.273e-28, 1.084e-28, 9.368e-29,
2416 7.985e-29, 6.785e-29, 5.804e-29, 4.975e-29, 4.311e-29, 3.738e-29, 3.275e-29,
2417 2.847e-29, 2.469e-29, 2.149e-29, 1.884e-29, 1.631e-29, 1.393e-29, 1.201e-29,
2418 1.027e-29, 8.807e-30, 7.521e-30, 6.436e-30, 5.509e-30, 4.729e-30, 4.055e-30,
2419 3.49e-30, 3.006e-30, 2.599e-30, 2.246e-30, 1.942e-30, 1.685e-30, 1.464e-30,
2420 1.273e-30, 1.115e-30, 9.794e-31, 8.729e-31, 7.893e-31, 7.313e-31, 7.069e-31,
2421 7.19e-31, 7.828e-31, 9.295e-31, 1.174e-30, 1.578e-30, 2.184e-30, 3.053e-30,
2422 4.212e-30, 5.733e-30, 7.497e-30, 9.487e-30, 1.153e-29, 1.343e-29, 1.503e-29,
2423 1.623e-29, 1.696e-29, 1.746e-29, 1.789e-29, 1.852e-29, 1.862e-29, 1.886e-29,
2424 1.912e-29, 1.942e-29, 1.938e-29, 1.914e-29, 1.898e-29, 1.864e-29, 1.77e-29,
2425 1.635e-29, 1.464e-29, 1.279e-29, 1.099e-29, 9.528e-30, 8.433e-30, 7.794e-30,
2426 7.793e-30, 8.241e-30, 9.417e-30, 1.179e-29, 1.616e-29, 2.144e-29, 2.992e-29,
2427 4.344e-29, 6.415e-29, 9.242e-29, 1.31e-28, 1.847e-28, 2.567e-28, 3.39e-28,
2428 4.357e-28, 5.301e-28, 6.364e-28, 7.438e-28, 8.381e-28, 9.294e-28, 1.013e-27,
2429 1.103e-27, 1.17e-27, 1.2e-27, 1.19e-27, 1.133e-27, 1.04e-27, 9.475e-28,
2430 8.601e-28, 8.074e-28, 8.023e-28, 8.473e-28, 9.256e-28, 9.989e-28, 1.056e-27,
2431 1.079e-27, 1.079e-27, 1.049e-27, 1e-27, 9.35e-28, 8.662e-28, 7.88e-28,
2432 7.137e-28, 6.438e-28, 5.706e-28, 5.132e-28, 4.815e-28, 4.736e-28, 4.709e-28,
2433 4.918e-28, 5.227e-28, 5.603e-28, 6.023e-28, 6.567e-28, 7.403e-28, 8.695e-28,
2434 9.929e-28, 1.163e-27, 1.379e-27, 1.658e-27, 2.01e-27, 2.425e-27, 2.92e-27,
2435 3.562e-27, 4.274e-27, 5.173e-27, 6.285e-27, 7.787e-27, 9.563e-27, 1.194e-26,
2436 1.517e-26, 1.934e-26, 2.511e-26, 3.197e-26, 4.024e-26, 4.981e-26, 6.09e-26,
2437 7.229e-26, 8.439e-26, 9.367e-26, 1.016e-25, 1.057e-25, 1.088e-25, 1.108e-25,
2438 1.129e-25, 1.159e-25, 1.19e-25, 1.21e-25, 1.21e-25, 1.2e-25, 1.19e-25,
2439 1.18e-25, 1.19e-25, 1.23e-25, 1.28e-25, 1.3e-25, 1.29e-25, 1.21e-25,
2440 1.09e-25, 9.44e-26, 7.79e-26, 6.22e-26, 4.64e-26, 3.4e-26, 2.47e-26,
2441 1.78e-26, 1.29e-26, 9.26e-27, 7e-27, 5.36e-27, 4.26e-27, 3.41e-27,
2442 2.79e-27, 2.36e-27, 2.01e-27, 1.75e-27, 1.52e-27, 1.33e-27, 1.16e-27,
2443 1.01e-27, 8.83e-28, 7.71e-28, 6.77e-28, 6.01e-28, 5.34e-28, 4.72e-28,
2444 4.2e-28, 3.69e-28, 3.27e-28, 2.92e-28, 2.57e-28, 2.27e-28, 2e-28,
2445 1.77e-28, 1.56e-28, 1.37e-28, 1.2e-28, 1.05e-28, 9.18e-29, 8e-29,
2446 6.98e-29, 6.08e-29, 5.27e-29, 4.56e-29, 3.94e-29, 3.4e-29, 2.93e-29,
2447 2.51e-29, 2.15e-29, 1.84e-29, 1.57e-29, 1.34e-29, 1.14e-29, 9.66e-30,
2448 8.19e-30, 6.93e-30, 5.86e-30, 4.95e-30, 4.19e-30, 3.56e-30, 3.06e-30,
2449 2.67e-30, 2.41e-30, 2.26e-30, 2.25e-30, 2.36e-30, 2.57e-30, 2.84e-30,
2450 3.18e-30, 3.49e-30, 3.71e-30, 3.81e-30, 3.84e-30, 3.8e-30, 3.59e-30,
2451 3.37e-30, 3.08e-30, 2.77e-30, 2.47e-30, 2.2e-30, 2.05e-30, 1.99e-30,
2452 2.03e-30, 2.13e-30, 2.25e-30, 2.34e-30, 2.41e-30, 2.47e-30, 2.48e-30,
2453 2.5e-30, 2.52e-30, 2.58e-30, 2.64e-30, 2.69e-30, 2.79e-30, 2.95e-30,
2454 3.13e-30, 3.34e-30, 3.57e-30, 3.84e-30, 4.2e-30, 4.66e-30, 5.21e-30,
2455 5.96e-30, 6.89e-30, 8.01e-30, 9.32e-30, 1.08e-29, 1.24e-29, 1.45e-29,
2456 1.71e-29, 2.01e-29, 2.36e-29, 2.82e-29, 3.38e-29, 4.01e-29, 4.79e-29,
2457 5.74e-29, 6.92e-29, 8.338e-29, 1.015e-28, 1.246e-28, 1.512e-28, 1.851e-28,
2458 2.32e-28, 2.988e-28, 3.989e-28, 5.351e-28, 7.256e-28, 1.011e-27, 1.388e-27,
2459 1.914e-27, 2.512e-27, 3.257e-27, 4.075e-27, 4.991e-27, 5.914e-27, 6.638e-27,
2460 7.16e-27, 7.45e-27, 7.59e-27, 7.54e-27, 7.47e-27, 7.53e-27, 7.94e-27,
2461 8.46e-27, 8.95e-27, 9.36e-27, 9.84e-27, 1.02e-26, 1.05e-26, 1.06e-26,
2462 1.07e-26, 1.07e-26, 1.04e-26, 9.79e-27, 8.8e-27, 7.66e-27, 6.38e-27,
2463 5.142e-27, 3.982e-27, 2.94e-27, 2.177e-27, 1.612e-27, 1.185e-27, 8.966e-28,
2464 6.735e-28, 5.219e-28, 4.14e-28, 3.403e-28, 2.811e-28, 2.358e-28, 1.969e-28,
2465 1.684e-28, 1.462e-28, 1.285e-28, 1.134e-28, 9.916e-29, 8.65e-29, 7.55e-29,
2466 6.62e-29, 5.83e-29, 5.14e-29, 4.51e-29, 3.98e-29, 3.53e-29, 3.12e-29,
2467 2.78e-29, 2.48e-29, 2.18e-29, 1.93e-29, 1.7e-29, 1.5e-29, 1.33e-29,
2468 1.16e-29, 1.03e-29, 9.01e-30, 7.86e-30, 6.88e-30, 6.02e-30, 5.25e-30,
2469 4.57e-30, 3.96e-30, 3.44e-30, 2.98e-30, 2.57e-30, 2.21e-30, 1.9e-30,
2470 1.63e-30, 1.4e-30, 1.21e-30, 1.04e-30, 9.09e-31, 7.96e-31, 7.05e-31,
2471 6.3e-31, 5.67e-31, 5.09e-31, 4.55e-31, 4.04e-31, 3.55e-31, 3.09e-31,
2472 2.64e-31, 2.26e-31, 1.9e-31, 1.6e-31, 1.34e-31, 1.14e-31, 1.01e-31,
2473 9.17e-32, 8.69e-32, 8.47e-32, 8.33e-32, 8.2e-32, 8.04e-32, 7.95e-32,
2474 7.98e-32, 8.25e-32, 8.47e-32, 8.74e-32, 8.87e-32, 8.92e-32, 8.71e-32,
2475 8.3e-32, 7.89e-32, 7.59e-32, 7.5e-32, 7.63e-32, 8.06e-32, 8.89e-32,
2476 1e-31, 1.14e-31, 1.28e-31, 1.45e-31, 1.64e-31, 1.87e-31, 2.12e-31,
2477 2.44e-31, 2.85e-31, 3.31e-31, 3.83e-31, 4.46e-31, 5.23e-31, 6.15e-31,
2478 7.35e-31, 8.84e-31, 1.07e-30, 1.29e-30, 1.59e-30, 1.99e-30, 2.49e-30,
2479 3.12e-30, 3.91e-30, 4.98e-30, 6.28e-30, 7.86e-30, 9.66e-30, 1.16e-29,
2480 1.41e-29, 1.7e-29, 2.06e-29, 2.54e-29, 3.17e-29, 4.08e-29, 5.24e-29,
2481 6.8e-29, 8.92e-29, 1.13e-28, 1.4e-28, 1.7e-28, 2.05e-28, 2.37e-28,
2482 2.61e-28, 2.77e-28, 2.85e-28, 2.86e-28, 2.78e-28, 2.72e-28, 2.74e-28,
2483 2.83e-28, 3.01e-28, 3.22e-28, 3.52e-28, 3.78e-28, 4.03e-28, 4.21e-28,
2484 4.33e-28, 4.39e-28, 4.34e-28, 4.25e-28, 4.07e-28, 3.88e-28, 3.67e-28,
2485 3.56e-28, 3.52e-28, 3.67e-28, 4.02e-28, 4.64e-28, 5.63e-28, 6.89e-28,
2486 8.82e-28, 1.11e-27, 1.41e-27, 1.73e-27, 2.12e-27, 2.57e-27, 2.99e-27,
2487 3.45e-27, 3.79e-27, 4.09e-27, 4.23e-27, 4.3e-27, 4.33e-27, 4.35e-27,
2488 4.44e-27, 4.54e-27, 4.62e-27, 4.67e-27, 4.71e-27, 4.77e-27, 4.93e-27,
2489 5.19e-27, 5.54e-27, 5.9e-27, 6.12e-27, 6.15e-27, 5.81e-27, 5.21e-27,
2490 4.51e-27, 3.69e-27, 2.89e-27, 2.14e-27, 1.55e-27, 1.11e-27, 7.78e-28,
2491 5.46e-28, 3.93e-28, 2.93e-28, 2.26e-28, 1.82e-28, 1.52e-28, 1.31e-28,
2492 1.15e-28, 1.02e-28, 9.01e-29, 7.95e-29, 7.04e-29, 6.2e-29, 5.49e-29,
2493 4.86e-29, 4.34e-29, 3.88e-29, 3.46e-29, 3.07e-29, 2.71e-29, 2.38e-29,
2494 2.09e-29, 1.82e-29, 1.59e-29, 1.38e-29, 1.2e-29, 1.04e-29, 9.08e-30,
2495 7.88e-30, 6.85e-30, 5.96e-30, 5.2e-30, 4.53e-30, 3.94e-30, 3.43e-30,
2496 2.97e-30, 2.58e-30, 2.23e-30, 1.92e-30, 1.66e-30, 1.43e-30, 1.24e-30,
2497 1.06e-30, 9.1e-31, 7.79e-31, 6.65e-31, 5.68e-31, 4.84e-31, 4.11e-31,
2498 3.51e-31, 2.99e-31, 2.54e-31, 2.17e-31, 1.86e-31, 1.59e-31, 1.37e-31,
2499 1.18e-31, 1.04e-31, 9.24e-32, 8.39e-32, 7.86e-32, 7.7e-32, 7.85e-32,
2500 8.41e-32, 9.62e-32, 1.16e-31, 1.47e-31, 1.94e-31, 2.58e-31, 3.51e-31,
2501 4.73e-31, 6.26e-31, 7.98e-31, 9.95e-31, 1.21e-30, 1.4e-30, 1.58e-30,
2502 1.77e-30, 1.98e-30, 2.22e-30, 2.47e-30, 2.79e-30, 3.14e-30, 3.55e-30,
2503 4e-30, 4.51e-30, 5.15e-30, 5.73e-30, 6.25e-30, 6.65e-30, 6.91e-30,
2504 6.98e-30, 6.83e-30, 6.67e-30, 6.57e-30, 6.6e-30, 6.84e-30, 7.39e-30,
2505 8.04e-30, 8.73e-30, 9.44e-30, 9.95e-30, 1.03e-29, 1.01e-29, 9.8e-30,
2506 9.32e-30, 8.67e-30, 7.99e-30, 7.29e-30, 6.67e-30, 6.14e-30, 5.78e-30,
2507 5.65e-30, 5.65e-30, 5.88e-30, 6.43e-30, 7.5e-30, 9.16e-30, 1.16e-29,
2508 1.51e-29, 1.99e-29, 2.7e-29, 3.66e-29, 4.95e-29, 6.41e-29, 8.16e-29,
2509 1.02e-28, 1.24e-28, 1.46e-28, 1.64e-28, 1.79e-28, 1.87e-28, 1.93e-28,
2510 1.93e-28, 1.93e-28, 1.95e-28, 2.07e-28, 2.23e-28, 2.34e-28, 2.44e-28,
2511 2.55e-28, 2.67e-28, 2.76e-28, 2.81e-28, 2.9e-28, 2.94e-28, 2.91e-28,
2512 2.77e-28, 2.52e-28, 2.21e-28, 1.84e-28, 1.49e-28, 1.15e-28, 8.64e-29,
2513 6.44e-29, 4.79e-29, 3.64e-29, 2.75e-29, 2.14e-29, 1.75e-29, 1.48e-29,
2514 1.3e-29, 1.16e-29, 1.05e-29, 9.46e-30, 8.55e-30, 7.66e-30, 6.79e-30,
2515 6.01e-30, 5.3e-30, 4.67e-30, 4.13e-30, 3.67e-30, 3.29e-30, 2.92e-30,
2516 2.57e-30, 2.27e-30, 1.96e-30, 1.7e-30, 1.47e-30, 1.27e-30, 1.1e-30,
2517 9.19e-31, 7.79e-31, 6.59e-31, 5.61e-31, 4.81e-31, 4.07e-31, 3.54e-31,
2518 3.04e-31, 2.62e-31, 2.3e-31, 1.97e-31, 1.71e-31, 1.48e-31, 1.28e-31,
2519 1.1e-31, 9.44e-32, 8.08e-32, 6.94e-32, 5.93e-32, 5.06e-32, 4.31e-32,
2520 3.66e-32, 3.12e-32, 2.67e-32, 2.28e-32, 1.95e-32, 1.67e-32, 1.43e-32,
2521 1.22e-32, 1.05e-32, 9.06e-33, 7.86e-33, 6.87e-33, 6.09e-33, 5.5e-33,
2522 5.07e-33, 4.78e-33, 4.66e-33, 4.77e-33, 5.21e-33, 5.94e-33, 7.44e-33,
2523 9.71e-33, 1.35e-32, 1.87e-32, 2.63e-32, 3.67e-32, 4.95e-32, 6.39e-32,
2524 8e-32, 9.88e-32, 1.15e-31, 1.28e-31, 1.37e-31, 1.43e-31, 1.47e-31,
2525 1.45e-31, 1.42e-31, 1.4e-31, 1.41e-31, 1.43e-31, 1.51e-31, 1.65e-31,
2526 1.83e-31, 2.07e-31, 2.25e-31, 2.38e-31, 2.42e-31, 2.38e-31, 2.27e-31,
2527 2.1e-31, 1.98e-31, 1.89e-31, 1.79e-31, 1.72e-31, 1.62e-31, 1.54e-31,
2528 1.43e-31, 1.35e-31, 1.35e-31, 1.42e-31, 1.57e-31, 1.77e-31, 2.06e-31,
2529 2.42e-31, 2.85e-31, 3.43e-31, 4.16e-31, 5.24e-31, 6.82e-31, 8.92e-31,
2530 1.2e-30, 1.6e-30, 2.15e-30, 2.89e-30, 3.77e-30, 4.8e-30, 5.93e-30,
2531 7.25e-30, 8.53e-30, 9.6e-30, 1.04e-29, 1.08e-29, 1.1e-29, 1.09e-29,
2532 1.07e-29, 1.07e-29, 1.12e-29, 1.21e-29, 1.33e-29, 1.48e-29, 1.64e-29,
2533 1.79e-29, 1.94e-29, 2.05e-29, 2.17e-29, 2.28e-29, 2.4e-29, 2.53e-29,
2534 2.74e-29, 3.03e-29, 3.42e-29, 3.87e-29, 4.47e-29, 5.19e-29, 5.91e-29,
2535 6.77e-29, 7.5e-29, 8.28e-29, 8.83e-29, 9.36e-29, 9.91e-29, 1.03e-28,
2536 1.09e-28, 1.14e-28, 1.17e-28, 1.18e-28, 1.18e-28, 1.18e-28, 1.21e-28,
2537 1.26e-28, 1.35e-28, 1.43e-28, 1.49e-28, 1.49e-28, 1.4e-28, 1.25e-28,
2538 1.07e-28, 8.61e-29, 6.57e-29, 4.8e-29, 3.47e-29, 2.47e-29, 1.78e-29,
2539 1.33e-29, 1.05e-29, 8.72e-30, 7.51e-30, 6.76e-30, 6.27e-30, 6e-30,
2540 5.99e-30, 6.26e-30, 6.86e-30, 7.58e-30, 8.49e-30, 9.53e-30, 1.05e-29,
2541 1.14e-29, 1.2e-29, 1.25e-29, 1.28e-29, 1.3e-29, 1.31e-29, 1.32e-29,
2542 1.33e-29, 1.33e-29, 1.31e-29, 1.27e-29, 1.23e-29, 1.19e-29, 1.2e-29,
2543 1.25e-29, 1.33e-29, 1.42e-29, 1.48e-29, 1.49e-29, 1.41e-29, 1.26e-29,
2544 1.08e-29, 8.8e-30, 6.78e-30, 4.95e-30, 3.58e-30, 2.54e-30, 1.78e-30,
2545 1.26e-30, 9.28e-31, 7.13e-31, 5.56e-31, 4.5e-31, 3.75e-31, 3.21e-31,
2546 2.76e-31, 2.41e-31, 2.09e-31, 1.82e-31, 1.59e-31, 1.36e-31, 1.18e-31,
2547 1.03e-31, 9.01e-32, 7.94e-32, 6.9e-32, 6.02e-32, 5.26e-32, 4.62e-32,
2548 4.06e-32, 3.55e-32, 3.13e-32, 2.76e-32, 2.43e-32, 2.15e-32, 1.9e-32,
2549 1.68e-32, 1.49e-32, 1.32e-32, 1.17e-32, 1.04e-32, 9.35e-33, 8.47e-33,
2550 7.79e-33, 7.3e-33, 6.96e-33, 6.88e-33, 7.11e-33, 7.6e-33, 8.67e-33,
2551 1.04e-32, 1.31e-32, 1.71e-32, 2.2e-32, 2.93e-32, 3.8e-32, 4.97e-32,
2552 6.22e-32, 7.63e-32, 9.29e-32, 1.1e-31, 1.24e-31, 1.34e-31, 1.41e-31,
2553 1.44e-31, 1.44e-31, 1.39e-31, 1.38e-31, 1.41e-31, 1.49e-31, 1.64e-31,
2554 1.86e-31, 2.11e-31, 2.38e-31, 2.65e-31, 2.89e-31, 3.04e-31, 3.14e-31,
2555 3.29e-31, 3.43e-31, 3.6e-31, 3.91e-31, 4.44e-31, 5.21e-31, 6.43e-31,
2556 8.18e-31, 1.06e-30, 1.4e-30, 1.78e-30, 2.24e-30, 2.77e-30, 3.35e-30,
2557 3.95e-30, 4.47e-30, 4.92e-30, 5.2e-30, 5.39e-30, 5.46e-30, 5.53e-30,
2558 5.66e-30, 6.02e-30, 6.43e-30, 6.68e-30, 6.91e-30, 7.12e-30, 7.42e-30,
2559 7.55e-30, 7.75e-30, 8.09e-30, 8.3e-30, 8.35e-30, 7.95e-30, 7.22e-30,
2560 6.3e-30, 5.23e-30, 4.2e-30, 3.19e-30, 2.39e-30, 1.79e-30, 1.36e-30,
2561 1.05e-30, 8.32e-31, 6.89e-31, 5.89e-31, 5.14e-31, 4.6e-31, 4.19e-31,
2562 3.94e-31, 3.9e-31, 4.07e-31, 4.39e-31, 4.82e-31, 5.29e-31, 5.75e-31,
2563 6.09e-31, 6.28e-31, 6.31e-31, 6.19e-31, 6.04e-31, 5.85e-31, 5.71e-31,
2564 5.68e-31, 5.68e-31, 5.64e-31, 5.58e-31, 5.51e-31, 5.48e-31, 5.45e-31,
2565 5.57e-31, 5.77e-31, 5.96e-31, 6.05e-31, 5.89e-31, 5.43e-31, 4.77e-31,
2566 4.02e-31, 3.25e-31, 2.5e-31, 1.82e-31, 1.31e-31, 9.32e-32, 6.58e-32,
2567 4.64e-32, 3.35e-32, 2.53e-32, 1.96e-32, 1.58e-32, 1.31e-32, 1.11e-32,
2568 9.58e-33, 8.32e-33, 7.31e-33, 6.43e-33, 5.62e-33, 4.89e-33, 4.27e-33,
2569 3.73e-33, 3.25e-33, 2.84e-33, 2.5e-33, 2.21e-33, 1.95e-33, 1.72e-33,
2570 1.52e-33, 1.34e-33, 1.18e-33, 1.05e-33, 9.26e-34, 8.21e-34, 7.29e-34,
2571 6.48e-34, 5.77e-34, 5.15e-34, 4.62e-34, 4.17e-34, 3.79e-34, 3.49e-34,
2572 3.26e-34, 3.09e-34, 3e-34, 2.98e-34, 3.04e-34, 3.2e-34, 3.49e-34,
2573 3.96e-34, 4.68e-34, 5.78e-34, 7.42e-34, 9.8e-34, 1.32e-33, 1.79e-33,
2574 2.23e-33, 2.65e-33, 3.02e-33, 3.38e-33, 3.74e-33, 4.05e-33, 4.42e-33,
2575 4.94e-33, 5.48e-33, 6.11e-33, 6.77e-33, 7.56e-33, 8.49e-33, 9.59e-33,
2576 1.09e-32, 1.27e-32, 1.48e-32, 1.73e-32, 2.08e-32, 2.48e-32, 3.03e-32,
2577 3.88e-32, 4.86e-32, 6.25e-32, 8.05e-32, 1.04e-31, 1.37e-31, 1.75e-31,
2578 2.2e-31, 2.75e-31, 3.35e-31, 4.08e-31, 4.79e-31, 5.44e-31, 5.99e-31,
2579 6.46e-31, 6.82e-31, 7.13e-31, 7.62e-31, 8.36e-31, 9.59e-31, 1.15e-30,
2580 1.38e-30, 1.67e-30, 1.99e-30, 2.35e-30, 2.74e-30, 3.11e-30, 3.51e-30,
2581 3.89e-30, 4.21e-30, 4.49e-30, 4.66e-30, 4.86e-30, 4.96e-30, 5.08e-30,
2582 5.2e-30, 5.29e-30, 5.3e-30, 5.22e-30, 5.16e-30, 5.18e-30, 5.35e-30,
2583 5.68e-30, 6.07e-30, 6.42e-30, 6.6e-30, 6.39e-30, 5.83e-30, 5.03e-30,
2584 4.11e-30, 3.2e-30, 2.35e-30, 1.7e-30, 1.2e-30, 8.54e-31, 6.31e-31,
2585 4.92e-31, 4.01e-31, 3.38e-31, 2.97e-31, 2.71e-31, 2.55e-31, 2.45e-31,
2586 2.42e-31, 2.43e-31, 2.49e-31, 2.6e-31, 2.73e-31, 2.91e-31, 3.16e-31,
2587 3.45e-31, 3.81e-31, 4.14e-31, 4.54e-31, 5.02e-31, 5.48e-31, 6.11e-31,
2588 6.72e-31, 7.37e-31, 7.99e-31, 8.5e-31, 9.01e-31, 9.3e-31, 9.52e-31,
2589 9.64e-31, 9.59e-31, 9.39e-31, 9.14e-31, 8.95e-31, 8.97e-31, 9.3e-31,
2590 9.91e-31, 1.06e-30, 1.12e-30, 1.14e-30, 1.1e-30, 1e-30, 8.68e-31,
2591 7.14e-31, 5.61e-31, 4.17e-31, 3.05e-31, 2.18e-31, 1.55e-31, 1.11e-31,
2592 8.29e-32, 6.38e-32, 5.07e-32, 4.2e-32, 3.64e-32, 3.28e-32, 3.03e-32,
2593 2.9e-32, 2.78e-32, 2.67e-32, 2.52e-32, 2.34e-32, 2.15e-32, 1.95e-32,
2594 1.75e-32, 1.54e-32, 1.32e-32, 1.13e-32, 9.55e-33, 7.9e-33, 6.44e-33,
2595 5.18e-33, 4.14e-33, 3.32e-33, 2.67e-33, 2.18e-33, 1.83e-33, 1.56e-33,
2596 1.35e-33, 1.18e-33, 1.05e-33, 9.31e-34, 8.35e-34, 7.55e-34, 6.89e-34,
2597 6.36e-34, 5.96e-34, 5.69e-34, 5.56e-34, 5.6e-34, 5.86e-34, 6.42e-34,
2598 7.33e-34, 8.85e-34, 1.14e-33, 1.49e-33, 1.97e-33, 2.69e-33, 3.61e-33,
2599 4.79e-33, 6.04e-33, 7.51e-33, 9.2e-33, 1.09e-32, 1.26e-32, 1.39e-32,
2600 1.53e-32, 1.64e-32, 1.71e-32, 1.77e-32, 1.88e-32, 2.08e-32, 2.37e-32,
2601 2.82e-32, 3.42e-32, 4.18e-32, 5.18e-32, 6.47e-32, 7.98e-32, 9.97e-32,
2602 1.22e-31, 1.47e-31, 1.75e-31, 2.05e-31, 2.38e-31, 2.66e-31, 2.91e-31,
2603 3.09e-31, 3.21e-31, 3.29e-31, 3.31e-31, 3.37e-31, 3.49e-31, 3.69e-31,
2604 3.82e-31, 3.92e-31, 4.05e-31, 4.17e-31, 4.3e-31, 4.42e-31, 4.61e-31,
2605 4.78e-31, 4.83e-31, 4.69e-31, 4.31e-31, 3.81e-31, 3.21e-31, 2.61e-31,
2606 2.04e-31, 1.56e-31, 1.2e-31, 9.2e-32, 7.1e-32, 5.65e-32, 4.63e-32,
2607 3.86e-32, 3.27e-32, 2.83e-32, 2.48e-32, 2.22e-32, 2.03e-32, 1.91e-32,
2608 1.84e-32, 1.82e-32, 1.82e-32, 1.86e-32, 1.94e-32, 2.11e-32, 2.36e-32,
2609 2.6e-32, 2.94e-32, 3.31e-32, 3.73e-32, 4.17e-32, 4.57e-32, 4.98e-32,
2610 5.26e-32, 5.54e-32, 5.79e-32, 6.05e-32, 6.38e-32, 6.71e-32, 6.93e-32,
2611 7.03e-32, 7.05e-32, 7.05e-32, 7.16e-32, 7.37e-32, 7.79e-32, 8.3e-32,
2612 8.65e-32, 8.76e-32, 8.32e-32, 7.51e-32, 6.48e-32, 5.31e-32, 4.18e-32,
2613 3.07e-32, 2.22e-32, 1.57e-32, 1.09e-32, 7.39e-33, 5.11e-33, 3.66e-33,
2614 2.68e-33, 2e-33, 1.56e-33, 1.27e-33, 1.06e-33, 9.05e-34, 7.85e-34,
2615 6.9e-34, 6.1e-34, 5.42e-34, 4.84e-34, 4.32e-34, 3.87e-34, 3.47e-34,
2616 3.12e-34, 2.8e-34, 2.52e-34, 2.27e-34, 2.05e-34, 1.86e-34, 1.69e-34,
2617 1.55e-34, 1.43e-34, 1.33e-34, 1.25e-34, 1.2e-34, 1.16e-34, 1.15e-34,
2618 1.16e-34, 1.19e-34, 1.25e-34, 1.34e-34, 1.45e-34, 1.6e-34, 1.78e-34,
2619 2.01e-34, 2.27e-34, 2.59e-34, 2.96e-34, 3.4e-34, 3.92e-34, 4.53e-34,
2620 5.24e-34, 6.08e-34, 7.09e-34, 8.31e-34, 9.81e-34, 1.17e-33, 1.42e-33,
2621 1.78e-33, 2.25e-33, 2.79e-33, 3.5e-33, 4.4e-33, 5.53e-33, 6.92e-33,
2622 8.92e-33, 1.15e-32, 1.48e-32, 1.92e-32, 2.54e-32, 3.37e-32, 4.37e-32,
2623 5.71e-32, 7.26e-32, 8.98e-32, 1.1e-31, 1.34e-31, 1.59e-31, 1.86e-31,
2624 2.14e-31, 2.4e-31, 2.69e-31, 2.98e-31, 3.33e-31, 3.77e-31, 4.25e-31,
2625 4.75e-31, 5.11e-31, 5.37e-31, 5.56e-31, 5.61e-31, 5.67e-31, 5.68e-31,
2626 5.78e-31, 5.86e-31, 5.91e-31, 5.93e-31, 5.91e-31, 5.92e-31, 5.93e-31,
2627 5.94e-31, 5.87e-31, 5.65e-31, 5.21e-31, 4.54e-31, 3.82e-31, 3.07e-31,
2628 2.37e-31, 1.78e-31, 1.32e-31, 9.82e-32, 7.34e-32, 5.59e-32, 4.33e-32,
2629 3.42e-32, 2.74e-32, 2.23e-32, 1.86e-32, 1.56e-32, 1.35e-32, 1.17e-32,
2630 1.05e-32, 9.54e-33, 8.83e-33, 8.34e-33, 8.1e-33, 8.11e-33, 8.2e-33,
2631 8.46e-33, 8.83e-33, 9.33e-33, 9.92e-33, 1.07e-32, 1.19e-32, 1.35e-32,
2632 1.58e-32, 1.86e-32, 2.17e-32, 2.52e-32, 2.92e-32, 3.36e-32, 3.83e-32,
2633 4.3e-32, 4.83e-32, 5.37e-32, 5.81e-32, 6.23e-32, 6.48e-32, 6.77e-32,
2634 6.99e-32, 7.17e-32, 7.47e-32, 7.66e-32, 7.77e-32, 7.77e-32, 7.72e-32,
2635 7.77e-32, 7.97e-32, 8.4e-32, 8.9e-32, 9.42e-32, 9.71e-32, 9.55e-32,
2636 8.85e-32, 7.68e-32, 6.39e-32, 5.02e-32, 3.74e-32, 2.68e-32, 1.87e-32,
2637 1.33e-32, 9.48e-33, 7e-33, 5.37e-33, 4.17e-33, 3.33e-33, 2.76e-33,
2638 2.35e-33, 2.04e-33, 1.78e-33, 1.59e-33, 1.42e-33, 1.23e-33, 1.06e-33,
2639 8.95e-34, 7.45e-34, 6.06e-34, 5.02e-34, 4.22e-34, 3.61e-34, 3.13e-34,
2640 2.75e-34, 2.45e-34, 2.19e-34, 1.97e-34, 1.79e-34, 1.63e-34, 1.49e-34,
2641 1.38e-34, 1.29e-34, 1.22e-34, 1.17e-34, 1.14e-34, 1.14e-34, 1.18e-34,
2642 1.26e-34, 1.41e-34, 1.65e-34, 2.04e-34, 2.65e-34, 3.59e-34, 4.87e-34,
2643 6.41e-34, 8.47e-34, 1.07e-33, 1.32e-33, 1.66e-33, 2.07e-33, 2.62e-33,
2644 3.21e-33, 3.94e-33, 4.84e-33, 5.81e-33, 6.84e-33, 7.73e-33, 8.67e-33,
2645 9.62e-33, 1.06e-32, 1.19e-32, 1.35e-32, 1.56e-32, 1.85e-32, 2.21e-32,
2646 2.66e-32, 3.14e-32, 3.6e-32, 3.99e-32, 4.22e-32, 4.36e-32, 4.35e-32,
2647 4.25e-32, 4.1e-32, 3.99e-32, 3.95e-32, 3.87e-32, 3.83e-32, 3.82e-32,
2648 3.89e-32, 3.98e-32, 4.06e-32, 4.19e-32, 4.22e-32, 4.17e-32, 3.9e-32,
2649 3.5e-32, 3.03e-32, 2.49e-32, 1.99e-32, 1.51e-32, 1.15e-32, 8.68e-33,
2650 6.53e-33, 4.89e-33, 3.78e-33, 2.92e-33, 2.25e-33, 1.74e-33, 1.35e-33,
2651 1.07e-33, 8.54e-34, 7.02e-34, 5.95e-34, 5.13e-34, 4.48e-34, 3.89e-34,
2652 3.34e-34, 2.94e-34, 2.63e-34, 2.42e-34, 2.3e-34, 2.27e-34, 2.37e-34,
2653 2.56e-34, 2.78e-34, 3.16e-34, 3.8e-34, 4.86e-34, 6.25e-34, 8.15e-34,
2654 1.01e-33, 1.24e-33, 1.49e-33, 1.73e-33, 1.99e-33, 2.22e-33, 2.44e-33,
2655 2.61e-33, 2.72e-33, 2.85e-33, 2.94e-33, 3.1e-33, 3.29e-33, 3.5e-33,
2656 3.62e-33, 3.66e-33, 3.7e-33, 3.72e-33, 3.83e-33, 4.01e-33, 4.26e-33,
2657 4.51e-33, 4.64e-33, 4.49e-33, 4.05e-33, 3.45e-33, 2.79e-33, 2.12e-33,
2658 1.46e-33, 9.67e-34, 6.18e-34, 3.98e-34, 2.63e-34, 1.81e-34, 1.32e-34,
2659 1.03e-34, 8.42e-35, 7.22e-35, 6.39e-35, 5.78e-35, 5.33e-35, 5e-35,
2660 4.76e-35, 4.61e-35, 4.54e-35, 4.55e-35, 4.64e-35, 4.81e-35, 5.06e-35,
2661 5.41e-35, 5.87e-35, 6.44e-35, 7.15e-35, 8.02e-35, 9.1e-35, 1.05e-34,
2662 1.22e-34, 1.46e-34, 1.8e-34, 2.28e-34, 2.98e-34, 4.02e-34, 5.53e-34,
2663 7.81e-34, 1.04e-33, 1.31e-33, 1.58e-33, 1.89e-33, 2.2e-33, 2.54e-33,
2664 3.01e-33, 3.67e-33, 4.43e-33, 5.42e-33, 6.85e-33, 8.44e-33, 1.04e-32,
2665 1.31e-32, 1.61e-32, 1.95e-32, 2.38e-32, 2.88e-32, 3.42e-32, 4.03e-32,
2666 4.65e-32, 5.24e-32, 5.7e-32, 6.09e-32, 6.39e-32, 6.48e-32, 6.58e-32,
2667 6.66e-32, 6.7e-32, 6.66e-32, 6.65e-32, 6.8e-32, 7.09e-32, 7.54e-32,
2668 8.06e-32, 8.62e-32, 8.89e-32, 8.68e-32, 8.04e-32, 7e-32, 5.83e-32,
2669 4.58e-32, 3.49e-32, 2.71e-32, 2.1e-32, 1.65e-32, 1.31e-32, 1.06e-32,
2670 8.35e-33, 6.45e-33, 5.02e-33, 3.94e-33, 3.09e-33, 2.46e-33
2673 static const double tcoslf_table[2001] =
2674 { 6.413, 6.414, 6.275, 6.049, 5.789, 5.557, 5.33,
2675 5.107, 4.893, 4.685, 4.481, 4.282, 4.09, 3.905,
2676 3.72, 3.548, 3.379, 3.215, 3.056, 2.903, 2.756,
2677 2.614, 2.475, 2.344, 2.219, 2.1, 1.983, 1.873,
2678 1.768, 1.67, 1.575, 1.486, 1.45, 1.432, 1.429,
2679 1.431, 1.428, 1.458, 1.517, 1.57, 1.628, 1.689,
2680 1.753, 1.819, 1.886, 1.976, 2.032, 2.106, 2.19,
2681 2.259, 2.33, 2.397, 2.466, 2.537, 2.613, 2.675,
2682 2.746, 2.819, 2.893, 2.97, 3.058, 3.168, 3.319,
2683 3.456, 3.601, 3.752, 3.9, 4.04, 4.183, 4.327,
2684 4.47, 4.602, 4.753, 4.897, 5.039, 5.214, 5.409,
2685 5.608, 5.782, 5.917, 5.983, 5.998, 6.016, 6.016,
2686 6.037, 6.026, 6.018, 6.021, 6.006, 6.005, 5.988,
2687 5.978, 5.956, 5.947, 5.898, 5.91, 5.88, 5.842,
2688 5.819, 5.772, 5.775, 5.74, 5.712, 5.685, 5.659,
2689 5.631, 5.601, 5.574, 5.541, 5.509, 5.474, 5.437,
2690 5.399, 5.359, 5.314, 5.261, 5.205, 5.146, 5.075,
2691 4.997, 4.909, 4.818, 4.709, 4.575, 4.411, 4.245,
2692 4.075, 3.889, 3.672, 3.387, 3.173, 2.907, 2.708,
2693 2.536, 2.35, 2.273, 2.196, 2.178, 2.201, 2.238,
2694 2.309, 2.382, 2.462, 2.579, 2.679, 2.737, 2.81,
2695 2.887, 2.964, 2.98, 3.011, 3.098, 3.157, 3.211,
2696 3.274, 3.388, 3.475, 3.527, 3.618, 3.772, 3.864,
2697 3.884, 3.889, 3.894, 3.884, 3.821, 3.758, 3.703,
2698 3.657, 3.567, 3.49, 3.435, 3.377, 3.29, 3.204,
2699 3.178, 3.146, 3.103, 3.088, 3.108, 3.116, 3.07,
2700 3.046, 3.029, 3.017, 3.001, 3.007, 2.984, 2.98,
2701 2.936, 2.908, 2.896, 2.875, 2.893, 2.888, 2.948,
2702 3.028, 3.064, 3.182, 3.228, 3.26, 3.335, 3.412,
2703 3.468, 3.523, 3.616, 3.659, 3.704, 3.81, 3.833,
2704 3.966, 4.026, 4.088, 4.141, 4.2, 4.269, 4.377,
2705 4.459, 4.566, 4.638, 4.709, 4.802, 4.878, 4.974,
2706 5.047, 5.147, 5.211, 5.315, 5.391, 5.483, 5.566,
2707 5.603, 5.643, 5.767, 5.807, 5.843, 5.904, 5.924,
2708 5.983, 5.993, 6.059, 6.095, 6.13, 6.153, 6.174,
2709 6.18, 6.201, 6.202, 6.21, 6.206, 6.209, 6.187,
2710 6.172, 6.138, 6.129, 6.085, 6.066, 6.043, 6.001,
2711 5.951, 5.93, 5.869, 5.822, 5.809, 5.777, 5.739,
2712 5.7, 5.68, 5.659, 5.598, 5.558, 5.519, 5.465,
2713 5.399, 5.358, 5.294, 5.225, 5.158, 5.094, 5.023,
2714 4.94, 4.846, 4.759, 4.662, 4.557, 4.435, 4.304,
2715 4.188, 4.042, 3.954, 3.803, 3.695, 3.619, 3.51,
2716 3.414, 3.366, 3.284, 3.217, 3.152, 3.044, 2.983,
2717 2.898, 2.784, 2.68, 2.627, 2.634, 2.704, 2.637,
2718 2.756, 2.79, 2.941, 3.091, 3.203, 3.308, 3.431,
2719 3.49, 3.57, 3.652, 3.683, 3.708, 3.722, 3.687,
2720 3.631, 3.584, 3.566, 3.536, 3.459, 3.401, 3.326,
2721 3.216, 3.103, 2.944, 2.828, 2.652, 2.597, 2.559,
2722 2.522, 2.468, 2.466, 2.43, 2.412, 2.383, 2.357,
2723 2.338, 2.312, 2.287, 2.25, 2.221, 2.174, 2.174,
2724 2.135, 2.109, 2.107, 2.106, 2.062, 2.075, 2.08,
2725 2.136, 2.219, 2.291, 2.415, 2.52, 2.663, 2.797,
2726 2.936, 3.112, 3.244, 3.347, 3.437, 3.501, 3.513,
2727 3.511, 3.515, 3.553, 3.553, 3.568, 3.621, 3.713,
2728 3.836, 3.888, 3.897, 3.874, 3.825, 3.743, 3.626,
2729 3.503, 3.365, 3.225, 3.077, 2.914, 2.764, 2.623,
2730 2.508, 2.433, 2.42, 2.41, 2.445, 2.49, 2.623,
2731 2.753, 2.871, 2.981, 3.069, 3.176, 3.27, 3.339,
2732 3.394, 3.45, 3.511, 3.572, 3.623, 3.668, 3.742,
2733 3.807, 3.893, 3.961, 4.019, 4.106, 4.194, 4.286,
2734 4.364, 4.447, 4.532, 4.629, 4.719, 4.815, 4.9,
2735 4.989, 5.067, 5.16, 5.245, 5.326, 5.406, 5.479,
2736 5.558, 5.632, 5.702, 5.772, 5.831, 5.893, 5.953,
2737 6.009, 6.056, 6.103, 6.143, 6.183, 6.21, 6.239,
2738 6.258, 6.264, 6.263, 6.247, 6.229, 6.201, 6.176,
2739 6.141, 6.11, 6.096, 6.085, 6.071, 6.05, 6.053,
2740 6.042, 6.035, 6.018, 6.005, 5.99, 5.955, 5.931,
2741 5.884, 5.833, 5.782, 5.724, 5.664, 5.594, 5.542,
2742 5.484, 5.422, 5.351, 5.284, 5.222, 5.143, 5.063,
2743 4.978, 4.896, 4.81, 4.723, 4.625, 4.525, 4.431,
2744 4.334, 4.231, 4.123, 4.022, 3.918, 3.831, 3.726,
2745 3.624, 3.537, 3.454, 3.367, 3.279, 3.211, 3.137,
2746 3.056, 2.968, 2.876, 2.764, 2.638, 2.486, 2.392,
2747 2.28, 2.193, 2.08, 2.056, 2.097, 2.155, 2.239,
2748 2.327, 2.461, 2.617, 2.759, 2.925, 3.082, 3.253,
2749 3.366, 3.491, 3.58, 3.67, 3.733, 3.756, 3.735,
2750 3.663, 3.612, 3.604, 3.655, 3.671, 3.68, 3.721,
2751 3.769, 3.769, 3.71, 3.605, 3.493, 3.383, 3.231,
2752 3.109, 2.936, 2.781, 2.645, 2.514, 2.397, 2.304,
2753 2.236, 2.212, 2.195, 2.204, 2.248, 2.337, 2.464,
2754 2.575, 2.714, 2.815, 2.941, 3.072, 3.173, 3.263,
2755 3.331, 3.398, 3.471, 3.531, 3.597, 3.657, 3.737,
2756 3.8, 3.844, 3.932, 3.997, 4.062, 4.135, 4.214,
2757 4.303, 4.378, 4.46, 4.563, 4.642, 4.72, 4.808,
2758 4.885, 4.978, 5.063, 5.142, 5.234, 5.318, 5.395,
2759 5.482, 5.553, 5.624, 5.684, 5.737, 5.792, 5.84,
2760 5.886, 5.925, 5.969, 6.01, 6.043, 6.078, 6.109,
2761 6.142, 6.159, 6.184, 6.201, 6.207, 6.211, 6.207,
2762 6.204, 6.187, 6.17, 6.151, 6.126, 6.099, 6.067,
2763 6.033, 5.992, 5.956, 5.919, 5.885, 5.847, 5.813,
2764 5.787, 5.755, 5.725, 5.687, 5.651, 5.607, 5.557,
2765 5.51, 5.458, 5.406, 5.35, 5.29, 5.225, 5.163,
2766 5.094, 5.013, 4.933, 4.852, 4.756, 4.661, 4.554,
2767 4.44, 4.326, 4.198, 4.078, 3.961, 3.823, 3.714,
2768 3.606, 3.527, 3.43, 3.345, 3.28, 3.216, 3.151,
2769 3.057, 2.985, 2.902, 2.786, 2.694, 2.64, 2.634,
2770 2.655, 2.667, 2.741, 2.824, 2.955, 3.069, 3.196,
2771 3.298, 3.408, 3.501, 3.577, 3.642, 3.673, 3.712,
2772 3.712, 3.688, 3.632, 3.598, 3.567, 3.536, 3.461,
2773 3.398, 3.331, 3.211, 3.099, 2.947, 2.825, 2.651,
2774 2.467, 2.338, 2.184, 2.098, 2.061, 2.037, 2.101,
2775 2.154, 2.279, 2.397, 2.514, 2.669, 2.799, 2.946,
2776 3.099, 3.232, 3.331, 3.404, 3.471, 3.481, 3.516,
2777 3.537, 3.587, 3.613, 3.637, 3.702, 3.772, 3.874,
2778 3.898, 3.883, 3.84, 3.771, 3.692, 3.566, 3.436,
2779 3.29, 3.133, 3.002, 2.833, 2.686, 2.565, 2.498,
2780 2.489, 2.51, 2.575, 2.69, 2.836, 2.967, 3.067,
2781 3.15, 3.215, 3.275, 3.333, 3.369, 3.416, 3.478,
2782 3.526, 3.563, 3.603, 3.649, 3.678, 3.694, 3.716,
2783 3.74, 3.761, 3.8, 3.831, 3.874, 3.942, 4.005,
2784 4.099, 4.193, 4.29, 4.387, 4.497, 4.617, 4.715,
2785 4.805, 4.894, 4.991, 5.084, 5.161, 5.236, 5.3,
2786 5.368, 5.454, 5.529, 5.589, 5.654, 5.714, 5.786,
2787 5.838, 5.886, 5.947, 5.987, 6.032, 6.071, 6.099,
2788 6.122, 6.136, 6.147, 6.151, 6.144, 6.129, 6.104,
2789 6.063, 6.008, 5.936, 5.835, 5.713, 5.572, 5.404,
2790 5.225, 5.042, 4.88, 4.718, 4.576, 4.46, 4.355,
2791 4.234, 4.111, 3.975, 3.888, 3.766, 3.683, 3.633,
2792 3.637, 3.669, 3.702, 3.739, 3.804, 3.87, 3.916,
2793 3.948, 3.943, 3.971, 3.98, 3.982, 3.967, 3.95,
2794 3.947, 3.92, 3.888, 3.819, 3.756, 3.689, 3.618,
2795 3.523, 3.405, 3.303, 3.206, 3.098, 2.963, 2.816,
2796 2.667, 2.521, 2.39, 2.261, 2.135, 2.031, 1.988,
2797 1.995, 2.044, 2.105, 2.189, 2.315, 2.445, 2.592,
2798 2.745, 2.907, 3.07, 3.231, 3.34, 3.45, 3.547,
2799 3.617, 3.682, 3.683, 3.653, 3.577, 3.558, 3.572,
2800 3.597, 3.648, 3.693, 3.772, 3.801, 3.772, 3.703,
2801 3.597, 3.459, 3.335, 3.189, 3.054, 2.901, 2.756,
2802 2.629, 2.519, 2.415, 2.379, 2.391, 2.433, 2.485,
2803 2.612, 2.787, 2.913, 3.033, 3.11, 3.185, 3.21,
2804 3.254, 3.286, 3.316, 3.334, 3.376, 3.422, 3.443,
2805 3.471, 3.492, 3.496, 3.491, 3.491, 3.481, 3.46,
2806 3.475, 3.466, 3.471, 3.485, 3.482, 3.548, 3.566,
2807 3.643, 3.748, 3.8, 3.956, 4.068, 4.223, 4.357,
2808 4.506, 4.634, 4.752, 4.839, 4.89, 4.95, 5.034,
2809 5.113, 5.176, 5.228, 5.383, 5.523, 5.62, 5.705,
2810 5.775, 5.823, 5.885, 5.931, 5.96, 5.985, 6.006,
2811 6.019, 6.021, 6.015, 5.997, 5.954, 5.901, 5.817,
2812 5.716, 5.554, 5.389, 5.18, 4.951, 4.772, 4.646,
2813 4.551, 4.424, 4.389, 4.41, 4.457, 4.471, 4.473,
2814 4.545, 4.605, 4.644, 4.652, 4.669, 4.666, 4.639,
2815 4.603, 4.531, 4.493, 4.449, 4.411, 4.361, 4.304,
2816 4.269, 4.212, 4.17, 4.152, 4.133, 4.119, 4.1,
2817 4.105, 4.096, 4.042, 3.964, 3.876, 3.779, 3.652,
2818 3.513, 3.359, 3.201, 3.075, 2.935, 2.775, 2.682,
2819 2.601, 2.613, 2.64, 2.663, 2.73, 2.82, 2.936,
2820 3.052, 3.149, 3.243, 3.322, 3.394, 3.441, 3.479,
2821 3.449, 3.423, 3.388, 3.331, 3.253, 3.153, 3.109,
2822 3.05, 2.952, 2.864, 2.808, 2.708, 2.657, 2.594,
2823 2.554, 2.543, 2.549, 2.623, 2.708, 2.798, 2.909,
2824 3.039, 3.161, 3.244, 3.293, 3.358, 3.389, 3.424,
2825 3.489, 3.559, 3.601, 3.641, 3.707, 3.791, 3.879,
2826 3.902, 3.873, 3.811, 3.726, 3.637, 3.519, 3.357,
2827 3.205, 3.055, 2.898, 2.737, 2.612, 2.543, 2.531,
2828 2.589, 2.697, 2.819, 2.914, 2.991, 3.045, 3.067,
2829 3.06, 3.082, 3.087, 3.11, 3.145, 3.183, 3.249,
2830 3.296, 3.346, 3.399, 3.409, 3.449, 3.472, 3.497,
2831 3.55, 3.593, 3.638, 3.674, 3.731, 3.795, 3.863,
2832 3.874, 3.845, 3.808, 3.739, 3.661, 3.556, 3.411,
2833 3.273, 3.139, 3.009, 2.865, 2.736, 2.675, 2.674,
2834 2.73, 2.845, 2.969, 3.148, 3.3, 3.429, 3.55,
2835 3.642, 3.721, 3.797, 3.866, 3.918, 3.992, 4.054,
2836 4.117, 4.18, 4.237, 4.318, 4.4, 4.482, 4.567,
2837 4.648, 4.735, 4.813, 4.886, 4.958, 5.022, 5.083,
2838 5.137, 5.186, 5.231, 5.266, 5.295, 5.317, 5.324,
2839 5.311, 5.287, 5.248, 5.178, 5.076, 4.954, 4.793,
2840 4.605, 4.349, 4.099, 3.939, 3.72, 3.578, 3.462,
2841 3.431, 3.463, 3.48, 3.528, 3.564, 3.631, 3.705,
2842 3.747, 3.782, 3.802, 3.825, 3.821, 3.787, 3.737,
2843 3.698, 3.642, 3.563, 3.445, 3.32, 3.2, 3.072,
2844 2.931, 2.722, 2.582, 2.409, 2.311, 2.237, 2.194,
2845 2.209, 2.256, 2.352, 2.45, 2.584, 2.72, 2.87,
2846 3.018, 3.184, 3.316, 3.408, 3.506, 3.577, 3.623,
2847 3.604, 3.565, 3.555, 3.562, 3.585, 3.603, 3.681,
2848 3.774, 3.838, 3.83, 3.779, 3.711, 3.592, 3.455,
2849 3.326, 3.157, 3.007, 2.847, 2.702, 2.583, 2.503,
2850 2.479, 2.513, 2.588, 2.656, 2.78, 2.894, 2.967,
2851 3.026, 3.076, 3.122, 3.164, 3.212, 3.282, 3.335,
2852 3.405, 3.468, 3.508, 3.546, 3.57, 3.591, 3.575,
2853 3.576, 3.611, 3.619, 3.649, 3.675, 3.764, 3.854,
2854 3.88, 3.873, 3.83, 3.767, 3.673, 3.556, 3.44,
2855 3.309, 3.188, 3.07, 2.969, 2.906, 2.871, 2.904,
2856 3.003, 3.162, 3.317, 3.469, 3.647, 3.774, 3.884,
2857 3.98, 4.066, 4.143, 4.225, 4.323, 4.419, 4.515,
2858 4.603, 4.707, 4.809, 4.893, 4.984, 5.071, 5.156,
2859 5.251, 5.329, 5.407, 5.478, 5.543, 5.594, 5.641,
2860 5.684, 5.708, 5.73, 5.741, 5.745, 5.738, 5.727,
2861 5.701, 5.676, 5.633, 5.591, 5.547, 5.489, 5.431,
2862 5.368, 5.299, 5.224, 5.154, 5.069, 4.99, 4.903,
2863 4.812, 4.717, 4.615, 4.513, 4.404, 4.29, 4.162,
2864 4.023, 3.904, 3.796, 3.683, 3.552, 3.424, 3.295,
2865 3.189, 3.034, 2.878, 2.751, 2.577, 2.47, 2.358,
2866 2.215, 2.154, 2.105, 2.104, 2.117, 2.129, 2.184,
2867 2.237, 2.298, 2.374, 2.462, 2.52, 2.606, 2.6,
2868 2.596, 2.619, 2.618, 2.572, 2.536, 2.573, 2.618,
2869 2.634, 2.646, 2.714, 2.787, 2.875, 2.963, 3.065,
2870 3.179, 3.253, 3.316, 3.352, 3.393, 3.404, 3.445,
2871 3.496, 3.547, 3.597, 3.632, 3.712, 3.787, 3.846,
2872 3.85, 3.806, 3.747, 3.662, 3.573, 3.424, 3.274,
2873 3.142, 3.017, 2.87, 2.765, 2.73, 2.781, 2.864,
2874 2.937, 3.002, 3.032, 3.044, 3.027, 3.007, 2.979,
2875 2.934, 2.897, 2.887, 2.875, 2.853, 2.848, 2.859,
2876 2.903, 2.925, 2.953, 3.006, 3.061, 3.12, 3.184,
2877 3.277, 3.343, 3.374, 3.422, 3.481, 3.521, 3.588,
2878 3.641, 3.695, 3.742, 3.776, 3.85, 3.899, 3.919,
2879 3.891, 3.84, 3.761, 3.662, 3.562, 3.395, 3.261,
2880 3.131, 3.018, 2.887, 2.802, 2.796, 2.87, 2.986,
2881 3.102, 3.247, 3.332, 3.4, 3.455, 3.511, 3.567,
2882 3.624, 3.671, 3.702, 3.734, 3.782, 3.823, 3.835,
2883 3.851, 3.883, 3.919, 3.949, 3.975, 4.014, 4.061,
2884 4.13, 4.218, 4.317, 4.422, 4.559, 4.68, 4.776,
2885 4.862, 4.932, 4.991, 5.033, 5.078, 5.106, 5.117,
2886 5.119, 5.095, 5.053, 4.988, 4.896, 4.785, 4.648,
2887 4.498, 4.352, 4.161, 4.005, 3.841, 3.673, 3.543,
2888 3.398, 3.323, 3.23, 3.17, 3.118, 3.049, 3,
2889 2.932, 2.83, 2.744, 2.617, 2.49, 2.368, 2.261,
2890 2.172, 2.135, 2.165, 2.189, 2.229, 2.313, 2.407,
2891 2.503, 2.601, 2.723, 2.853, 2.968, 3.109, 3.253,
2892 3.342, 3.43, 3.521, 3.572, 3.613, 3.582, 3.603,
2893 3.622, 3.633, 3.662, 3.702, 3.806, 3.86, 3.85,
2894 3.796, 3.722, 3.618, 3.481, 3.347, 3.2, 3.082,
2895 2.952, 2.846, 2.798, 2.783, 2.848, 2.912, 2.97,
2896 3.023, 3.085, 3.107, 3.104, 3.067, 3.034, 2.996,
2897 2.941, 2.914, 2.897, 2.887, 2.903, 2.915, 2.92,
2898 2.969, 3.023, 3.104, 3.174, 3.268, 3.393, 3.481,
2899 3.557, 3.633, 3.662, 3.664, 3.665, 3.712, 3.729,
2900 3.739, 3.774, 3.844, 3.971, 4.023, 4.02, 3.983,
2901 3.913, 3.853, 3.703, 3.511, 3.351, 3.168, 3.014,
2902 2.897, 2.844, 2.918, 3.074, 3.295, 3.464, 3.614,
2903 3.74, 3.858, 3.972, 4.079, 4.188, 4.286, 4.385,
2904 4.486, 4.581, 4.678, 4.767, 4.855, 4.937, 5.008,
2905 5.079, 5.137, 5.187, 5.225, 5.255, 5.271, 5.273,
2906 5.264, 5.247, 5.216, 5.176, 5.131, 5.072, 5.007,
2907 4.941, 4.865, 4.785, 4.704, 4.617, 4.529, 4.439,
2908 4.348, 4.251, 4.153, 4.047, 3.942, 3.826, 3.697,
2909 3.562, 3.403, 3.239, 3.069, 2.915, 2.731, 2.531,
2910 2.341, 2.183, 2.069, 1.908, 1.781, 1.717, 1.691,
2911 1.629, 1.601, 1.635, 1.693, 1.756, 1.826, 1.951,
2912 2.048, 2.126, 2.238, 2.359, 2.474, 2.578, 2.696,
2913 2.803, 2.875, 2.968, 3.056, 3.12, 3.174, 3.258,
2914 3.342, 3.398, 3.466, 3.531, 3.623, 3.712, 3.772,
2915 3.806, 3.811, 3.796, 3.777, 3.757, 3.752, 3.707,
2916 3.672, 3.627, 3.572, 3.506, 3.398, 3.316, 3.227,
2917 3.12, 3.033, 3.028, 3.04, 3.092, 3.143, 3.177,
2918 3.227, 3.242, 3.265, 3.267, 3.243, 3.215, 3.21,
2919 3.215, 3.226, 3.236, 3.258, 3.289, 3.279, 3.268,
2920 3.242, 3.147, 3.11, 3.044, 2.985, 2.903, 2.832,
2921 2.808, 2.782, 2.797, 2.832, 2.903, 2.979, 3.061,
2922 3.163, 3.247, 3.331, 3.383, 3.419, 3.46, 3.496,
2923 3.518, 3.557, 3.623, 3.679, 3.725, 3.762, 3.821,
2924 3.864, 3.899, 3.892, 3.829, 3.752, 3.661, 3.565,
2925 3.44, 3.331, 3.231, 3.13, 3.018, 2.99, 3.044,
2926 3.098, 3.194, 3.294, 3.382, 3.44, 3.485, 3.522,
2927 3.55, 3.568, 3.623, 3.668, 3.715, 3.774, 3.841,
2928 3.903, 3.952, 3.981, 4.009, 4.044, 4.062, 4.099,
2929 4.142, 4.207, 4.286, 4.378, 4.483, 4.578, 4.679,
2930 4.771, 4.857, 4.934, 5.007, 5.086, 5.154, 5.224,
2931 5.295, 5.358, 5.427, 5.489, 5.55, 5.612, 5.671,
2932 5.729, 5.782, 5.836, 5.885, 5.933, 5.978, 6.023,
2933 6.065, 6.102, 6.136, 6.169, 6.197, 6.228, 6.253,
2934 6.275, 6.292, 6.309, 6.323, 6.334, 6.341, 6.349,
2935 6.356, 6.359, 6.359, 6.359, 6.359, 6.356, 6.352,
2936 6.349, 6.342, 6.335, 6.331, 6.324, 6.317, 6.309,
2937 6.306, 6.299, 6.295, 6.288, 6.284, 6.281, 6.281,
2938 6.278, 6.277, 6.278, 6.277, 6.282, 6.283, 6.289,
2939 6.297, 6.3, 6.305, 6.317, 6.325, 6.337, 6.345,
2940 6.36, 6.37, 6.384, 6.398, 6.416, 6.43, 6.448,
2941 6.465, 6.483, 6.502, 6.52, 6.541, 6.562, 6.583,
2942 6.605, 6.628, 6.649, 6.672, 6.697, 6.72, 6.743,
2943 6.768, 6.791, 6.818, 6.841, 6.867, 6.891, 6.916,
2944 6.943, 6.97, 6.996, 7.022, 7.052, 7.077, 7.103,
2945 7.132, 7.158, 7.185, 7.215, 7.241, 7.269, 7.298,
2946 7.326, 7.354, 7.382, 7.41, 7.438, 7.469, 7.497,
2947 7.528, 7.555, 7.585, 7.613, 7.643, 7.669, 7.698,
2948 7.729, 7.759, 7.787, 7.819, 7.849, 7.878, 7.909,
2949 7.936, 7.968, 7.998, 8.03, 8.055, 8.088, 8.115,
2950 8.146, 8.18, 8.205, 8.235, 8.269, 8.297, 8.328,
2951 8.36, 8.393, 8.421, 8.452, 8.484, 8.513, 8.547,
2952 8.576, 8.607, 8.64, 8.671, 8.699, 8.733, 8.762,
2953 8.794, 8.827, 8.855, 8.891, 8.922, 8.954, 8.984,
2954 9.015, 9.049, 9.08, 9.114, 9.143, 9.175, 9.209,
2955 9.241, 9.271, 9.306, 9.338, 9.369, 9.403, 9.435,
2956 9.466, 9.5, 9.532, 9.562, 9.594, 9.63, 9.661,
2957 9.695, 9.726, 9.761, 9.792, 9.825, 9.859, 9.891,
2958 9.924, 9.954, 9.987, 10.02, 10.06, 10.09, 10.12,
2959 10.16, 10.19, 10.22, 10.26, 10.29, 10.32
2963 const double xw = nu / 10 + 1;
2964 if (xw >= 1 && xw < 2001) {
2965 const int iw = (int) xw;
2966 const double dw = xw - iw;
2967 const double ew = 1 - dw;
2968 const double cwslf = ew * h2oslf[iw - 1] + dw * h2oslf[iw];
2969 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
2970 const double tcoslf = ew * tcoslf_table[iw - 1]
2971 + dw * tcoslf_table[iw];
2972 const double ctwslf = cwslf * pow(296 / t, tcoslf);
2973 const double a1 = nu * u * tanh(.7193876 / t * nu);
2974 const double a2 = 296 / t;
2975 const double a3 = p / 1013 * (q * ctwslf + (1 - q) * cwfrn);
2976 return a1 * a2 * a3;
2988 static const double ba[98] =
2989 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
2990 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
2991 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
2992 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
2993 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
2994 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
2995 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
2996 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
2997 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
2998 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
2999 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3000 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3001 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3002 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3005 static const double betaa[98] =
3006 { 802., 802., 761., 722., 679., 646., 609., 562.,
3007 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3008 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3009 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3010 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3011 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3012 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3013 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3014 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3015 372., 449., 514., 569., 609., 642., 673., 673.
3018 static const double nua[98] =
3019 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3020 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3021 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3022 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3023 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3024 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3025 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3026 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3027 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3028 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3029 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3032 const double t0 = 273.0, tr = 296.0;
3035 if (nu < nua[0] || nu > nua[97])
3041 1e6 *
LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3043 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3046 return 0.1 *
POW2(p /
P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3047 *
N2 * b * (
N2 + (1 -
N2) * (1.294 - 0.4545 * t / tr));
3057 static const double ba[90] =
3058 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3059 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3060 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3061 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3062 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3063 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3064 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3065 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3066 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3070 static const double betaa[90] =
3071 { 467., 467., 400., 315., 379., 368., 475., 521.,
3072 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3073 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3074 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3075 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3076 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3077 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3078 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3079 346., 322., 291., 290., 350., 371., 504., 504.
3082 static const double nua[90] =
3083 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3084 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3085 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3086 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3087 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3088 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3089 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3090 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3091 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3092 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3096 const double t0 = 273, tr = 296;
3099 if (nu < nua[0] || nu > nua[89])
3104 const double b =
LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3106 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3109 return 0.1 *
POW2(p /
P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) *
O2 * b;
3117 const atm_t *atm_src,
3121 const size_t s = (size_t) atm_src->
np *
sizeof(
double);
3124 atm_dest->
np = atm_src->
np;
3125 memcpy(atm_dest->
time, atm_src->
time, s);
3126 memcpy(atm_dest->
z, atm_src->
z, s);
3127 memcpy(atm_dest->
lon, atm_src->
lon, s);
3128 memcpy(atm_dest->
lat, atm_src->
lat, s);
3129 memcpy(atm_dest->
p, atm_src->
p, s);
3130 memcpy(atm_dest->
t, atm_src->
t, s);
3131 for (
int ig = 0; ig < ctl->
ng; ig++)
3132 memcpy(atm_dest->
q[ig], atm_src->
q[ig], s);
3133 for (
int iw = 0; iw < ctl->
nw; iw++)
3134 memcpy(atm_dest->
k[iw], atm_src->
k[iw], s);
3135 atm_dest->
clz = atm_src->
clz;
3137 for (
int icl = 0; icl < ctl->
ncl; icl++)
3138 atm_dest->
clk[icl] = atm_src->
clk[icl];
3139 atm_dest->
sft = atm_src->
sft;
3140 for (
int isf = 0; isf < ctl->
nsf; isf++)
3145 for (
int ip = 0; ip < atm_dest->
np; ip++) {
3146 atm_dest->
p[ip] = 0;
3147 atm_dest->
t[ip] = 0;
3148 for (
int ig = 0; ig < ctl->
ng; ig++)
3149 atm_dest->
q[ig][ip] = 0;
3150 for (
int iw = 0; iw < ctl->
nw; iw++)
3151 atm_dest->
k[iw][ip] = 0;
3154 for (
int icl = 0; icl < ctl->
ncl; icl++)
3155 atm_dest->
clk[icl] = 0;
3157 for (
int isf = 0; isf < ctl->
nsf; isf++)
3158 atm_dest->
sfeps[isf] = 1;
3167 const obs_t *obs_src,
3171 const size_t s = (size_t) obs_src->
nr *
sizeof(
double);
3174 obs_dest->
nr = obs_src->
nr;
3175 memcpy(obs_dest->
time, obs_src->
time, s);
3176 memcpy(obs_dest->
obsz, obs_src->
obsz, s);
3179 memcpy(obs_dest->
vpz, obs_src->
vpz, s);
3182 memcpy(obs_dest->
tpz, obs_src->
tpz, s);
3185 for (
int id = 0;
id < ctl->
nd;
id++)
3186 memcpy(obs_dest->
rad[
id], obs_src->
rad[
id], s);
3187 for (
int id = 0;
id < ctl->
nd;
id++)
3188 memcpy(obs_dest->
tau[
id], obs_src->
tau[
id], s);
3192 for (
int id = 0;
id < ctl->
nd;
id++)
3193 for (
int ir = 0; ir < obs_dest->
nr; ir++)
3194 if (isfinite(obs_dest->
rad[
id][ir])) {
3195 obs_dest->
rad[id][ir] = 0;
3196 obs_dest->
tau[id][ir] = 0;
3209 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3211 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3214 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
3215 *doy = d0l[mon - 1] + day - 1;
3217 *doy = d0[mon - 1] + day - 1;
3229 { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
3231 { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 };
3235 if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
3236 for (i = 11; i >= 0; i--)
3240 *day = doy - d0l[i] + 1;
3242 for (i = 11; i >= 0; i--)
3246 *day = doy - d0[i] + 1;
3254 const char *emitter) {
3256 for (
int ig = 0; ig < ctl->
ng; ig++)
3257 if (strcasecmp(ctl->
emitter[ig], emitter) == 0)
3271 obs_t *obs_scratch) {
3274 for (
int id = 0;
id < ctl->
nd;
id++)
3275 for (
int ir = 0; ir < obs->
nr; ir++)
3276 obs->
mask[
id][ir] = !isfinite(obs->
rad[
id][ir]);
3283 for (
int ir = 0; ir < obs->
nr; ir++) {
3284 const int status =
formod_pencil(ctl, tbl, atm, obs, ir, los_scratch);
3291 else if (ctl->
formod == 2)
3295 const int fov_status =
formod_fov(ctl, obs, obs_scratch);
3301 for (
int id = 0;
id < ctl->
nd;
id++)
3302 for (
int ir = 0; ir < obs->
nr; ir++)
3306 for (
int id = 0;
id < ctl->
nd;
id++)
3307 for (
int ir = 0; ir < obs->
nr; ir++)
3308 if (obs->
mask[
id][ir])
3309 obs->
rad[id][ir] = NAN;
3324 obs_t *obs_scratch) {
3329 if (los_scratch == NULL || obs_scratch == NULL)
3330 ERRMSG(
"formod_batch requires scratch arrays for los and obs_scratch!");
3335 for (
int ib = 0; ib < nbatch; ib++) {
3336 const int ib_status =
formod(ctl, tbl, &atm[ib], &obs[ib],
3337 &los_scratch[ib], &obs_scratch[ib]);
3339 status[ib] = ib_status;
3341 ERRMSG(
"Forward model failed with status code %d!", ib_status);
3347#pragma omp parallel for schedule(static) default(none) shared(ctl,tbl,atm,obs,nbatch,status,los_scratch,obs_scratch)
3348 for (
int ib = 0; ib < nbatch; ib++) {
3349 const int ib_status =
formod(ctl, tbl, &atm[ib], &obs[ib],
3350 &los_scratch[ib], &obs_scratch[ib]);
3352 status[ib] = ib_status;
3354 ERRMSG(
"Forward model failed with status code %d!", ib_status);
3367 for (
int id = 0;
id < ctl->
nd;
id++)
3368 beta[
id] = los->
k[ip][
id];
3372 for (
int id = 0;
id < ctl->
nd;
id++)
3373 beta[
id] +=
ctmco2(ctl->
nu[
id], los->
p[ip], los->
t[ip],
3378 for (
int id = 0;
id < ctl->
nd;
id++)
3379 beta[
id] +=
ctmh2o(ctl->
nu[
id], los->
p[ip], los->
t[ip],
3385 for (
int id = 0;
id < ctl->
nd;
id++)
3386 beta[
id] +=
ctmn2(ctl->
nu[
id], los->
p[ip], los->
t[ip]);
3390 for (
int id = 0;
id < ctl->
nd;
id++)
3391 beta[
id] +=
ctmo2(ctl->
nu[
id], los->
p[ip], los->
t[ip]);
3399 obs_t *obs_scratch) {
3401 int rays[2 *
NFOV + 1];
3402 double z[2 *
NFOV + 1];
3405 if (ctl->
fov[0] ==
'-')
3409 copy_obs(ctl, obs_scratch, obs, 0);
3412 for (
int ir = 0; ir < obs->
nr; ir++) {
3416 for (
int ir2 =
MAX(ir -
NFOV, 0);
3417 ir2 <
MIN(ir + 1 +
NFOV, obs->
nr); ir2++)
3418 if (obs->
time[ir2] == obs->
time[ir]) {
3420 z[nz] = obs_scratch->
vpz[ir2];
3428 for (
int id = 0;
id < ctl->
nd;
id++) {
3429 obs->
rad[id][ir] = 0;
3430 obs->
tau[id][ir] = 0;
3432 for (
int i = 0; i < ctl->
fov_n; i++) {
3433 const double zfov = obs->
vpz[ir] + ctl->
fov_dz[i];
3435 const int ir0 = rays[idx];
3436 const int ir1 = rays[idx + 1];
3437 for (
int id = 0;
id < ctl->
nd;
id++) {
3439 *
LIN(z[idx], obs_scratch->
rad[
id][ir0],
3440 z[idx + 1], obs_scratch->
rad[
id][ir1], zfov);
3442 *
LIN(z[idx], obs_scratch->
tau[
id][ir0],
3443 z[idx + 1], obs_scratch->
tau[
id][ir1], zfov);
3445 wsum += ctl->
fov_w[i];
3447 for (
int id = 0;
id < ctl->
nd;
id++) {
3448 obs->
rad[id][ir] /= wsum;
3449 obs->
tau[id][ir] /= wsum;
3466 double rad[
ND], tau[
ND], tau_path[
ND][
NG];
3469 memset(los, 0,
sizeof(*los));
3472 for (
int id = 0;
id < ctl->
nd;
id++) {
3475 for (
int ig = 0; ig < ctl->
ng; ig++)
3476 tau_path[
id][ig] = 1;
3481 const int status =
raytrace(ctl, atm, obs, los, ir);
3487 for (
int ip = 0; ip < los->
np; ip++) {
3497 double beta_ctm[
ND];
3504 for (
int id = 0;
id < ctl->
nd;
id++)
3505 if (tau_gas[
id] >= 0) {
3509 los->
eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[
id] * los->
ds[ip]);
3512 rad[id] += los->
src[ip][id] * los->
eps[ip][id] * tau[id];
3515 tau[id] *= (1 - los->
eps[ip][id]);
3525 for (
int id = 0;
id < ctl->
nd;
id++)
3526 rad[
id] += los->
sfeps[
id] * src_sf[
id] * tau[
id];
3531 for (
int id = 0;
id < ctl->
nd;
id++)
3532 if (los->
sfeps[
id] < 1) {
3541 double tau_refl[
ND];
3542 for (
int id = 0;
id < ctl->
nd;
id++)
3546 for (
int ip = los->
np - 1; ip >= 0; ip--)
3547 for (
int id = 0;
id < ctl->
nd;
id++) {
3548 rad[id] += los->
src[ip][id] * los->
eps[ip][id] * tau_refl[id]
3549 * tau[id] * (1 - los->
sfeps[id]);
3550 tau_refl[id] *= (1 - los->
eps[ip][id]);
3560 los->
lon[los->
np - 1], los->
lat[los->
np - 1]);
3565 if (cos_sza_val > 1e-6) {
3568 double x0[3], x1[3];
3570 los->
lat[los->
np - 1], x0);
3572 for (
int i = 0; i < 3; i++)
3574 const double cosa =
DOTP(x0, x1) /
NORM(x0) /
NORM(x1);
3577 const double rcos = cosa / cos_sza_val;
3580 for (
int id = 0;
id < ctl->
nd;
id++)
3581 rad[
id] += 6.764e-5 / (2. * M_PI) *
PLANCK(
TSUN, ctl->
nu[
id])
3582 * tau_refl[id] * (1 - los->
sfeps[id]) * tau[
id] * rcos;
3589 for (
int id = 0;
id < ctl->
nd;
id++) {
3590 obs->
rad[id][ir] = rad[id];
3591 obs->
tau[id][ir] = tau[id];
3599static double convolve_rfm(
3600 const double *nurfm,
3607 double fsum = 0, specsum = 0;
3610 for (
int ipts = 0; ipts < npts; ipts++)
3611 if (nurfm[ipts] >= nu[0] && nurfm[ipts] <= nu[n - 1]) {
3612 const int idx =
locate_irr(nu, n, nurfm[ipts]);
3614 LIN(nu[idx], f[idx], nu[idx + 1], f[idx + 1], nurfm[ipts]);
3616 specsum += filt * spec[ipts];
3619 return specsum / fsum;
3624static void find_rfm_file(
3626 const char *basename,
3631 sprintf(filename,
"%s_%05d.asc", basename, (
int) (z * 1000));
3632 if (!(in = fopen(filename,
"r"))) {
3633 sprintf(filename,
"%s_%05d.asc", basename, (
int) (z * 1000) + 1);
3634 if (!(in = fopen(filename,
"r")))
3635 ERRMSG(
"Cannot find RFM data file!");
3650 char cmd[2 *
LEN], filename[
LEN], rfmflg[
LEN] = {
"RAD TRA MIX LIN SFC" };
3652 double lower[
ND], upper[
ND], nu0, nu1, obsz = -999, *nurfm, *spec, tsurf,
3653 xd[3], xo[3], xv[3], z[
NR], zmin, zmax;
3655 int nadir = 0, npts, order[
ND], zenith = 0;
3663 for (
int ir = 1; ir < obs->
nr; ir++)
3667 ERRMSG(
"RFM interface requires identical observer positions!");
3670 for (
int iw = 0; iw < ctl->
nw; iw++)
3671 for (
int ip = 0; ip < atm->
np; ip++)
3672 if (atm->
k[iw][ip] != 0)
3673 ERRMSG(
"RFM interface cannot handle extinction data!");
3676 gsl_stats_minmax(&zmin, &zmax, atm->
z, 1, (
size_t) atm->
np);
3679 if (obs->
obsz[0] >= zmin && obs->
obsz[0] <= zmax) {
3680 obsz = obs->
obsz[0];
3681 strcat(rfmflg,
" OBS");
3685 for (
int ir = 0; ir < obs->
nr; ir++) {
3689 ERRMSG(
"Ray tracing failed!");
3692 if (obs->
tpz[ir] <= zmin) {
3697 for (
int i = 0; i < 3; i++)
3698 xd[i] = xo[i] - xv[i];
3702 }
else if (obs->
tpz[ir] >= zmax - 1e-3 && obs->
vpz[ir] > obs->
obsz[ir]) {
3707 for (
int i = 0; i < 3; i++)
3708 xd[i] = xv[i] - xo[i];
3714 z[ir] = obs->
tpz[ir];
3716 if ((nadir > 0 && nadir < obs->nr)
3717 || (zenith > 0 && zenith < obs->nr)
3718 || (nadir > 0 && zenith > 0))
3719 ERRMSG(
"Limb, nadir, and zenith not simultaneously possible!");
3723 strcat(rfmflg,
" NAD");
3725 strcat(rfmflg,
" ZEN");
3728 tsurf = atm->
t[gsl_stats_min_index(atm->
z, 1, (
size_t) atm->
np)];
3731 if (!nadir && !zenith && !ctl->
refrac)
3732 strcat(rfmflg,
" GEO");
3736 strcat(rfmflg,
" CTM");
3742 for (
int id = 0;
id < ctl->
nd;
id++) {
3743 const int n = tbl->
filt_n[id];
3745 ERRMSG(
"Missing or invalid filter function in lookup table!");
3746 for (
int i = 1; i < n; i++)
3748 ERRMSG(
"Filter wavenumbers must be strictly increasing!");
3749 lower[id] = tbl->
filt_nu[id][0];
3750 upper[id] = tbl->
filt_nu[id][n - 1];
3755 for (
int i = 1; i < ctl->
nd; i++) {
3756 const int id = order[i];
3758 while (j > 0 && lower[order[j - 1]] > lower[
id]) {
3759 order[j] = order[j - 1];
3766 for (
int ib = 0; ib < ctl->
nd;) {
3768 nu0 = lower[order[ib]];
3769 nu1 = upper[order[ib]];
3770 while (ie < ctl->nd && lower[order[ie]] <= nu1) {
3771 nu1 =
MAX(nu1, upper[order[ie]]);
3777 if (!(out = fopen(
"rfm.drv",
"w")))
3778 ERRMSG(
"Cannot create file!");
3779 fprintf(out,
"*HDR\nRFM call by JURASSIC.\n");
3780 fprintf(out,
"*FLG\n%s\n", rfmflg);
3781 fprintf(out,
"*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3782 fprintf(out,
"*GAS\n");
3783 for (
int ig = 0; ig < ctl->
ng; ig++)
3784 fprintf(out,
"%s\n", ctl->
emitter[ig]);
3785 fprintf(out,
"*ATM\nrfm.atm\n");
3786 fprintf(out,
"*TAN\n");
3787 for (
int ir = 0; ir < obs->
nr; ir++)
3788 fprintf(out,
"%g\n", z[ir]);
3789 fprintf(out,
"*SFC\n%g 1.0\n", tsurf);
3791 fprintf(out,
"*OBS\n%g\n", obsz);
3792 fprintf(out,
"*HIT\n%s\n", ctl->
rfmhit);
3793 fprintf(out,
"*XSC\n");
3794 for (
int ig = 0; ig < ctl->
ng; ig++)
3795 if (ctl->
rfmxsc[ig][0] !=
'-')
3796 fprintf(out,
"%s\n", ctl->
rfmxsc[ig]);
3797 fprintf(out,
"*END\n");
3801 if (system(
"rm -f rfm.runlog rad_*.asc tra_*.asc"))
3802 ERRMSG(
"Cannot remove temporary files!");
3805 sprintf(cmd,
"echo | %s", ctl->
rfmbin);
3807 ERRMSG(
"Error while calling RFM!");
3810 for (
int ir = 0; ir < obs->
nr; ir++) {
3811 find_rfm_file(filename,
"rad", z[ir]);
3813 for (
int i = ib; i < ie; i++) {
3814 const int id = order[i];
3815 obs->
rad[id][ir] = convolve_rfm(nurfm, spec, npts,
3819 find_rfm_file(filename,
"tra", z[ir]);
3821 for (
int i = ib; i < ie; i++) {
3822 const int id = order[i];
3823 obs->
tau[id][ir] = convolve_rfm(nurfm, spec, npts,
3831 if (system(
"rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3832 ERRMSG(
"Error while removing temporary files!");
3852 for (
int id = 0;
id < ctl->
nd;
id++)
3853 src[
id] =
LIN(tbl->
st[it], tbl->
sr[it][
id],
3854 tbl->
st[it + 1], tbl->
sr[it + 1][
id], t);
3865 const double radius = z +
RE;
3866 const double latrad = lat / 180. * M_PI;
3867 const double lonrad = lon / 180. * M_PI;
3868 const double coslat = cos(latrad);
3870 x[0] = radius * coslat * cos(lonrad);
3871 x[1] = radius * coslat * sin(lonrad);
3872 x[2] = radius * sin(latrad);
3881 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3883 const int ipts = 20;
3885 double dzmin = 1e99, e = 0;
3894 for (
int ip = 0; ip < atm->
np; ip++)
3895 if (fabs(atm->
z[ip] - ctl->
hydz) < dzmin) {
3896 dzmin = fabs(atm->
z[ip] - ctl->
hydz);
3901 for (
int ip = ipref + 1; ip < atm->
np; ip++) {
3903 for (
int i = 0; i < ipts; i++) {
3906 ipts - 1.0, atm->
q[ctl->
ig_h2o][ip], (
double) i);
3907 mean += (e * mmh2o + (1 - e) * mmair)
3909 /
LIN(0.0, atm->
t[ip - 1], ipts - 1.0, atm->
t[ip], (
double) i) / ipts;
3914 exp(log(atm->
p[ip - 1]) - mean * 1000 * (atm->
z[ip] - atm->
z[ip - 1]));
3918 for (
int ip = ipref - 1; ip >= 0; ip--) {
3920 for (
int i = 0; i < ipts; i++) {
3923 ipts - 1.0, atm->
q[ctl->
ig_h2o][ip], (
double) i);
3924 mean += (e * mmh2o + (1 - e) * mmair)
3926 /
LIN(0.0, atm->
t[ip + 1], ipts - 1.0, atm->
t[ip], (
double) i) / ipts;
3931 exp(log(atm->
p[ip + 1]) - mean * 1000 * (atm->
z[ip] - atm->
z[ip + 1]));
3943 sprintf(quantity,
"PRESSURE");
3946 sprintf(quantity,
"TEMPERATURE");
3948 for (
int ig = 0; ig < ctl->
ng; ig++)
3949 if (idx ==
IDXQ(ig))
3950 sprintf(quantity,
"%s", ctl->
emitter[ig]);
3952 for (
int iw = 0; iw < ctl->
nw; iw++)
3953 if (idx ==
IDXK(iw))
3954 sprintf(quantity,
"EXTINCT_WINDOW_%d", iw);
3957 sprintf(quantity,
"CLOUD_HEIGHT");
3960 sprintf(quantity,
"CLOUD_DEPTH");
3962 for (
int icl = 0; icl < ctl->
ncl; icl++)
3964 sprintf(quantity,
"CLOUD_EXTINCT_%.4f", ctl->
clnu[icl]);
3967 sprintf(quantity,
"SURFACE_TEMPERATURE");
3969 for (
int isf = 0; isf < ctl->
nsf; isf++)
3971 sprintf(quantity,
"SURFACE_EMISSIVITY_%.4f", ctl->
sfnu[isf]);
3981 LOG(1,
"Initialize source function table...");
3982 LOG(2,
"Number of data points: %d",
TBLNS);
3985 for (
int id = 0;
id < ctl->
nd;
id++) {
3989 for (
int i = 1; i < tbl->
filt_n[id]; i++)
3993#pragma omp parallel for default(none) shared(ctl,tbl,id,dnu)
3994 for (
int it = 0; it <
TBLNS; it++) {
4000 double fsum = tbl->
sr[it][id] = 0;
4001 for (
double fnu = tbl->
filt_nu[
id][0];
4002 fnu <= tbl->filt_nu[
id][tbl->
filt_n[
id] - 1]; fnu += dnu) {
4008 tbl->
sr[it][id] += ff *
PLANCK(tbl->
st[it], fnu);
4010 tbl->
sr[it][id] /= fsum;
4015 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
4016 ctl->
nu[
id], tbl->
st[0], tbl->
st[
TBLNS - 1], tbl->
sr[0][
id],
4036 *p =
LOGY(atm->
z[ip], atm->
p[ip], atm->
z[ip + 1], atm->
p[ip + 1], z);
4037 *t =
LIN(atm->
z[ip], atm->
t[ip], atm->
z[ip + 1], atm->
t[ip + 1], z);
4038 for (
int ig = 0; ig < ctl->
ng; ig++)
4040 LIN(atm->
z[ip], atm->
q[ig][ip], atm->
z[ip + 1], atm->
q[ig][ip + 1], z);
4041 for (
int iw = 0; iw < ctl->
nw; iw++)
4043 LIN(atm->
z[ip], atm->
k[iw][ip], atm->
z[ip + 1], atm->
k[iw][ip + 1], z);
4053 double tau_path[
ND][
NG],
4054 double tau_seg[
ND]) {
4056 double eps, lnp[
NG];
4059 for (
int ig = 0; ig < ctl->
ng; ig++)
4060 lnp[ig] = log(los->
cgp[ip][ig]);
4063 for (
int id = 0;
id < ctl->
nd;
id++) {
4069 for (
int ig = 0; ig < ctl->
ng; ig++) {
4072 if (tbl->
np[
id][ig] < 30 || los->
cgu[ip][ig] <= 0)
4076 else if (tau_path[
id][ig] < 1e-9)
4085 const int it0 =
locate_reg(tbl->
t[
id][ig][ipr], tbl->
nt[
id][ig][ipr],
4088 locate_reg(tbl->
t[
id][ig][ipr + 1], tbl->
nt[
id][ig][ipr + 1],
4092 if (tbl->
nt[
id][ig][ipr] < 2 || tbl->
nt[
id][ig][ipr + 1] < 2
4093 || tbl->
nu[
id][ig][ipr][it0] < 2
4094 || tbl->
nu[
id][ig][ipr][it0 + 1] < 2
4095 || tbl->
nu[
id][ig][ipr + 1][it1] < 2
4096 || tbl->
nu[
id][ig][ipr + 1][it1 + 1] < 2)
4102 const double logu = log(los->
cgu[ip][ig]);
4106 double eps11 =
intpol_tbl_eps(tbl, ig,
id, ipr + 1, it1 + 1, logu);
4109 eps00 =
LIN(tbl->
t[
id][ig][ipr][it0], eps00,
4110 tbl->
t[
id][ig][ipr][it0 + 1], eps01, los->
cgt[ip][ig]);
4111 eps11 =
LIN(tbl->
t[
id][ig][ipr + 1][it1], eps10,
4112 tbl->
t[
id][ig][ipr + 1][it1 + 1],
4113 eps11, los->
cgt[ip][ig]);
4116 eps00 =
LIN(tbl->
lnp[
id][ig][ipr], eps00,
4117 tbl->
lnp[
id][ig][ipr + 1], eps11, lnp[ig]);
4120 eps00 =
CLAMP(eps00, 0, 1);
4123 eps = 1 - (1 - eps00) / tau_path[
id][ig];
4126 eps =
CLAMP(eps, 0, 1);
4131 tau_path[id][ig] *= (1 - eps);
4134 tau_seg[id] *= (1 - eps);
4146 double tau_path[
ND][
NG],
4147 double tau_seg[
ND]) {
4149 const double lnp = log(los->
p[ip]);
4154 for (
int id = 0;
id < ctl->
nd;
id++) {
4160 for (
int ig = 0; ig < ctl->
ng; ig++) {
4163 if (tbl->
np[
id][ig] < 30 || los->
cgu[ip][ig] <= 0)
4167 else if (tau_path[
id][ig] < 1e-9)
4177 locate_reg(tbl->
t[
id][ig][ipr], tbl->
nt[
id][ig][ipr], los->
t[ip]);
4179 locate_reg(tbl->
t[
id][ig][ipr + 1], tbl->
nt[
id][ig][ipr + 1],
4183 if (tbl->
nt[
id][ig][ipr] < 2 || tbl->
nt[
id][ig][ipr + 1] < 2
4184 || tbl->
nu[
id][ig][ipr][it0] < 2
4185 || tbl->
nu[
id][ig][ipr][it0 + 1] < 2
4186 || tbl->
nu[
id][ig][ipr + 1][it1] < 2
4187 || tbl->
nu[
id][ig][ipr + 1][it1 + 1] < 2)
4193 const double logeps = log(1.0 - tau_path[
id][ig]);
4201 log(u + los->
u[ip][ig]));
4205 log(u + los->
u[ip][ig]));
4207 u =
intpol_tbl_u(tbl, ig,
id, ipr + 1, it1 + 1, logeps);
4209 log(u + los->
u[ip][ig]));
4212 eps00 =
LIN(tbl->
t[
id][ig][ipr][it0], eps00,
4213 tbl->
t[
id][ig][ipr][it0 + 1], eps01, los->
t[ip]);
4214 eps11 =
LIN(tbl->
t[
id][ig][ipr + 1][it1], eps10,
4215 tbl->
t[
id][ig][ipr + 1][it1 + 1], eps11, los->
t[ip]);
4218 eps00 =
LIN(tbl->
lnp[
id][ig][ipr], eps00,
4219 tbl->
lnp[
id][ig][ipr + 1], eps11, lnp);
4222 eps00 =
CLAMP(eps00, 0, 1);
4225 eps = 1 - (1 - eps00) / tau_path[
id][ig];
4228 eps =
CLAMP(eps, 0, 1);
4233 tau_path[id][ig] *= (1 - eps);
4236 tau_seg[id] *= (1 - eps);
4249 const double logu) {
4251 const int nu = tbl->
nu[id][ig][ip][it];
4252 const float *logu_arr = tbl->
logu[id][ig][ip][it];
4253 const float *logeps_arr = tbl->
logeps[id][ig][ip][it];
4256 const double logu_min = (double) logu_arr[0];
4257 const double logu_max = (double) logu_arr[nu - 1];
4261 if (logu < logu_min) {
4262 const double logeps_min = (double) logeps_arr[0];
4263 return exp(logeps_min + logu - logu_min);
4273 if (logu > logu_max) {
4274 const double eps_max = exp((
double) logeps_arr[nu - 1]);
4275 const double l1m_eps_max = log1p(-eps_max);
4276 const double r = exp(logu - logu_max);
4277 return -expm1(l1m_eps_max * r);
4281 const int idx =
locate_tbl(logu_arr, nu, logu);
4282 return exp(
LIN(logu_arr[idx], logeps_arr[idx],
4283 logu_arr[idx + 1], logeps_arr[idx + 1], logu));
4294 const double logeps) {
4296 const int nu = tbl->
nu[id][ig][ip][it];
4297 const float *logeps_arr = tbl->
logeps[id][ig][ip][it];
4298 const float *logu_arr = tbl->
logu[id][ig][ip][it];
4301 const double logeps_min = (double) logeps_arr[0];
4302 const double logeps_max = (double) logeps_arr[nu - 1];
4306 if (logeps < logeps_min) {
4307 const double logu_min = (double) logu_arr[0];
4308 return exp(logu_min + logeps - logeps_min);
4319 if (logeps > logeps_max) {
4320 const double u_max = exp((
double) logu_arr[nu - 1]);
4321 const double l1m_eps_max = log1p(-exp(logeps_max));
4322 const double logtau = log1p(-exp(logeps));
4323 return u_max * (logtau / l1m_eps_max);
4327 const int idx =
locate_tbl(logeps_arr, nu, logeps);
4328 return exp(
LIN(logeps_arr[idx], logu_arr[idx],
4329 logeps_arr[idx + 1], logu_arr[idx + 1], logeps));
4353 const time_t jsec0 = (time_t) jsec + timegm(&t0);
4354 t1 = gmtime(&jsec0);
4356 *year = t1->tm_year + 1900;
4357 *mon = t1->tm_mon + 1;
4359 *hour = t1->tm_hour;
4362 *remain = jsec - floor(jsec);
4375 const size_t m = k->size1;
4376 const size_t n = k->size2;
4377 const size_t batch_size =
MIN(n, (
size_t)
MAX(1, omp_get_max_threads()));
4380 gsl_vector *x0 = gsl_vector_alloc(n);
4381 gsl_vector *yy0 = gsl_vector_alloc(m);
4382 gsl_vector *x1 = gsl_vector_alloc(n);
4383 gsl_vector *yy1 = gsl_vector_alloc(m);
4389 ALLOC(h_batch,
double,
4395 obs_t *obs_scratch0, *obs1, *obs_scratch1;
4405 ERRMSG(
"Forward model failed!");
4410 atm2x(ctl, atm, x0, iqa, NULL);
4411 obs2y(ctl, obs, yy0, NULL, NULL);
4414 gsl_matrix_set_zero(k);
4417 for (
size_t j0 = 0; j0 < n; j0 += batch_size) {
4418 const size_t nbatch =
MIN(batch_size, n - j0);
4421 for (
size_t jb = 0; jb < nbatch; jb++) {
4422 const size_t j = j0 + jb;
4427 h =
MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4428 else if (iqa[j] ==
IDXT)
4430 else if (iqa[j] >=
IDXQ(0) && iqa[j] <
IDXQ(ctl->
ng))
4431 h =
MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4432 else if (iqa[j] >=
IDXK(0) && iqa[j] <
IDXK(ctl->
nw))
4438 else if (iqa[j] ==
IDXSFT)
4443 ERRMSG(
"Cannot set perturbation size!");
4446 gsl_vector_memcpy(x1, x0);
4447 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4450 x2atm(ctl, x1, &atm1[jb]);
4455 formod_batch(ctl, tbl, atm1, obs1, (
int) nbatch, status, los1,
4459 for (
size_t jb = 0; jb < nbatch; jb++) {
4460 const size_t j = j0 + jb;
4462 ERRMSG(
"Forward model failed!");
4463 obs2y(ctl, &obs1[jb], yy1, NULL, NULL);
4466 for (
size_t i = 0; i < m; i++)
4467 gsl_matrix_set(k, i, j,
4468 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i))
4474 gsl_vector_free(x0);
4475 gsl_vector_free(yy0);
4476 gsl_vector_free(x1);
4477 gsl_vector_free(yy1);
4496 int i = (ihi + ilo) >> 1;
4498 if (xx[i] < xx[i + 1])
4499 while (ihi > ilo + 1) {
4500 i = (ihi + ilo) >> 1;
4506 while (ihi > ilo + 1) {
4507 i = (ihi + ilo) >> 1;
4525 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4545 int i = (ihi + ilo) >> 1;
4547 while (ihi > ilo + 1) {
4548 i = (ihi + ilo) >> 1;
4566 const size_t n = a->size1;
4569 for (
size_t i = 0; i < n && diag; i++)
4570 for (
size_t j = i + 1; j < n; j++)
4571 if (gsl_matrix_get(a, i, j) != 0) {
4578 for (
size_t i = 0; i < n; i++)
4579 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4583 gsl_linalg_cholesky_decomp(a);
4584 gsl_linalg_cholesky_invert(a);
4591 const gsl_matrix *a,
4592 const gsl_vector *b,
4593 const int transpose,
4597 const size_t m = a->size1;
4598 const size_t n = a->size2;
4601 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4604 if (transpose == 1) {
4607 for (
size_t i = 0; i < m; i++)
4608 for (
size_t j = 0; j < n; j++)
4609 gsl_matrix_set(aux, i, j,
4610 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4613 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4617 else if (transpose == 2) {
4620 for (
size_t i = 0; i < m; i++)
4621 for (
size_t j = 0; j < n; j++)
4622 gsl_matrix_set(aux, i, j,
4623 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4626 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4630 gsl_matrix_free(aux);
4645 for (
int ir = 0; ir < obs->
nr; ir++)
4646 for (
int id = 0;
id < ctl->
nd;
id++)
4647 if (isfinite(obs->
rad[
id][ir])) {
4649 gsl_vector_set(y, m, obs->
rad[
id][ir]);
4672 double disq = 0, lmpar = 0.001;
4686 const size_t m =
obs2y(ctl, obs_meas, NULL, NULL, NULL);
4687 const size_t n =
atm2x(ctl, atm_apr, NULL, iqa, ipa);
4688 if (m == 0 || n == 0) {
4689 WARN(
"Check problem definition (m = 0 or n = 0)!");
4695 gsl_matrix *a = gsl_matrix_alloc(n, n);
4696 gsl_matrix *cov = gsl_matrix_alloc(n, n);
4697 gsl_matrix *k_i = gsl_matrix_alloc(m, n);
4698 gsl_matrix *s_a_inv = gsl_matrix_alloc(n, n);
4700 gsl_vector *b = gsl_vector_alloc(n);
4701 gsl_vector *dx = gsl_vector_alloc(n);
4702 gsl_vector *dy = gsl_vector_alloc(m);
4703 gsl_vector *sig_eps_inv = gsl_vector_alloc(m);
4704 gsl_vector *sig_formod = gsl_vector_alloc(m);
4705 gsl_vector *sig_noise = gsl_vector_alloc(m);
4706 gsl_vector *x_a = gsl_vector_alloc(n);
4707 gsl_vector *x_i = gsl_vector_alloc(n);
4708 gsl_vector *x_step = gsl_vector_alloc(n);
4709 gsl_vector *y_aux = gsl_vector_alloc(m);
4710 gsl_vector *y_i = gsl_vector_alloc(m);
4711 gsl_vector *y_m = gsl_vector_alloc(m);
4724 if (
formod(ctl, tbl, atm_i, obs_i, los_scratch, obs_scratch)
4726 ERRMSG(
"Forward model failed!");
4729 atm2x(ctl, atm_apr, x_a, NULL, NULL);
4730 atm2x(ctl, atm_i, x_i, NULL, NULL);
4731 obs2y(ctl, obs_meas, y_m, NULL, NULL);
4732 obs2y(ctl, obs_i, y_i, NULL, NULL);
4735 set_cov_apr(ret, ctl, atm_apr, iqa, ipa, s_a_inv);
4737 const char *dirname;
4739 const char *filename =
4741 "matrix_cov_apr.tab", &dirname, &profile);
4743 atm_i, obs_i,
"x",
"x",
"r", profile);
4748 set_cov_meas(ret, ctl, obs_meas, sig_noise, sig_formod, sig_eps_inv);
4751 gsl_vector_memcpy(dx, x_i);
4752 gsl_vector_sub(dx, x_a);
4753 gsl_vector_memcpy(dy, y_m);
4754 gsl_vector_sub(dy, y_i);
4760 LOG(2,
"it= %d / chi^2/m= %g", 0, *chisq);
4764 kernel(ctl, tbl, atm_i, obs_i, k_i);
4773 for (
int it = 1; it <= ret->
conv_itmax; it++) {
4776 double chisq_old = *chisq;
4780 kernel(ctl, tbl, atm_i, obs_i, k_i);
4787 for (
size_t i = 0; i < m; i++)
4788 gsl_vector_set(y_aux, i, gsl_vector_get(dy, i)
4789 *
POW2(gsl_vector_get(sig_eps_inv, i)));
4790 gsl_blas_dgemv(CblasTrans, 1.0, k_i, y_aux, 0.0, b);
4791 gsl_blas_dgemv(CblasNoTrans, -1.0, s_a_inv, dx, 1.0, b);
4794 for (
int it2 = 0; it2 < 20; it2++) {
4797 gsl_matrix_memcpy(a, s_a_inv);
4798 gsl_matrix_scale(a, 1 + lmpar);
4799 gsl_matrix_add(a, cov);
4802 gsl_linalg_cholesky_decomp(a);
4803 gsl_linalg_cholesky_solve(a, b, x_step);
4806 gsl_vector_add(x_i, x_step);
4809 x2atm(ctl, x_i, atm_i);
4812 for (
int ip = 0; ip < atm_i->
np; ip++) {
4813 atm_i->
p[ip] =
CLAMP(atm_i->
p[ip], 5e-7, 5e4);
4814 atm_i->
t[ip] =
CLAMP(atm_i->
t[ip], 100, 400);
4815 for (
int ig = 0; ig < ctl->
ng; ig++)
4816 atm_i->
q[ig][ip] =
CLAMP(atm_i->
q[ig][ip], 0, 1);
4817 for (
int iw = 0; iw < ctl->
nw; iw++)
4818 atm_i->
k[iw][ip] =
MAX(atm_i->
k[iw][ip], 0);
4822 for (
int icl = 0; icl < ctl->
ncl; icl++)
4823 atm_i->
clk[icl] =
MAX(atm_i->
clk[icl], 0);
4825 for (
int isf = 0; isf < ctl->
nsf; isf++)
4829 if (
formod(ctl, tbl, atm_i, obs_i, los_scratch, obs_scratch)
4831 ERRMSG(
"Forward model failed!");
4832 obs2y(ctl, obs_i, y_i, NULL, NULL);
4835 gsl_vector_memcpy(dx, x_i);
4836 gsl_vector_sub(dx, x_a);
4837 gsl_vector_memcpy(dy, y_m);
4838 gsl_vector_sub(dy, y_i);
4844 if (*chisq > chisq_old) {
4846 gsl_vector_sub(x_i, x_step);
4854 LOG(2,
"it= %d / chi^2/m= %g", it, *chisq);
4857 gsl_blas_ddot(x_step, b, &disq);
4877 "atm_final.tab", &dirname, &profile);
4878 write_atm(dirname, filename, ctl, atm_i, profile);
4880 "obs_final.tab", &dirname, &profile);
4881 write_obs(dirname, filename, ctl, obs_i, profile);
4884 "matrix_kernel.tab", &dirname, &profile);
4886 atm_i, obs_i,
"y",
"x",
"r", profile);
4889 gsl_matrix *auxnm = gsl_matrix_alloc(n, m);
4890 gsl_matrix *corr = gsl_matrix_alloc(n, n);
4891 gsl_matrix *gain = gsl_matrix_alloc(n, m);
4896 gsl_matrix_add(cov, s_a_inv);
4902 "matrix_cov_ret.tab", &dirname, &profile);
4904 atm_i, obs_i,
"x",
"x",
"r", profile);
4908 for (
size_t i = 0; i < n; i++)
4909 for (
size_t j = 0; j < n; j++)
4910 gsl_matrix_set(corr, i, j, gsl_matrix_get(cov, i, j)
4911 / sqrt(gsl_matrix_get(cov, i, i))
4912 / sqrt(gsl_matrix_get(cov, j, j)));
4914 "matrix_corr.tab", &dirname, &profile);
4916 atm_i, obs_i,
"x",
"x",
"r", profile);
4920 for (
size_t i = 0; i < n; i++)
4921 for (
size_t j = 0; j < m; j++)
4922 gsl_matrix_set(auxnm, i, j, gsl_matrix_get(k_i, j, i)
4923 *
POW2(gsl_vector_get(sig_eps_inv, j)));
4924 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, cov, auxnm, 0.0, gain);
4926 "matrix_gain.tab", &dirname, &profile);
4928 atm_i, obs_i,
"x",
"y",
"c", profile);
4940 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, gain, k_i, 0.0, a);
4942 "matrix_avk.tab", &dirname, &profile);
4944 atm_i, obs_i,
"x",
"x",
"r", profile);
4951 gsl_matrix_free(auxnm);
4952 gsl_matrix_free(corr);
4953 gsl_matrix_free(gain);
4961 gsl_matrix_free(cov);
4962 gsl_matrix_free(k_i);
4963 gsl_matrix_free(s_a_inv);
4966 gsl_vector_free(dx);
4967 gsl_vector_free(dy);
4968 gsl_vector_free(sig_eps_inv);
4969 gsl_vector_free(sig_formod);
4970 gsl_vector_free(sig_noise);
4971 gsl_vector_free(x_a);
4972 gsl_vector_free(x_i);
4973 gsl_vector_free(x_step);
4974 gsl_vector_free(y_aux);
4975 gsl_vector_free(y_i);
4976 gsl_vector_free(y_m);
4993 const double h = 0.02, zrefrac = 60;
4995 double ex0[3], ex1[3], k[
NW], lat, lon, n, ng[3], norm, p, q[
NG], t,
4996 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
5003 obs->
tpz[ir] = obs->
vpz[ir];
5008 gsl_stats_minmax(&zmin, &zmax, atm->
z, 1, (
size_t) atm->
np);
5011 if (obs->
obsz[ir] < zmin)
5019 for (
int i = 0; i < 3; i++)
5020 ex0[i] = xvp[i] - xobs[i];
5022 for (
int i = 0; i < 3; i++)
5026 for (
int i = 0; i < 3; i++)
5030 if (obs->
obsz[ir] > zmax) {
5031 double dmax = norm, dmin = 0;
5032 while (fabs(dmin - dmax) > 0.001) {
5033 const double d = (dmax + dmin) / 2;
5034 for (
int i = 0; i < 3; i++)
5035 x[i] = xobs[i] + d * ex0[i];
5037 if (z <= zmax && z > zmax - 0.001)
5039 if (z < zmax - 0.0005)
5050 double ds = ctl->
rayds;
5051 if (ctl->
raydz > 0) {
5053 for (
int i = 0; i < 3; i++)
5054 xh[i] = x[i] / norm;
5055 const double cosa = fabs(
DOTP(ex0, xh));
5064 if (z < zmin || z > zmax) {
5065 stop = (z < zmin ? 2 : 1);
5068 zmin ? zmin : zmax) - los->
z[los->
np - 1]) / (z - los->
z[los->
np -
5071 los->
lat[los->
np - 1], xh);
5072 for (
int i = 0; i < 3; i++)
5073 x[i] = xh[i] + frac * (x[i] - xh[i]);
5075 los->
ds[los->
np - 1] = ds * frac;
5087 los->
lon[los->
np] = lon;
5088 los->
lat[los->
np] = lat;
5089 los->
z[los->
np] = z;
5090 los->
p[los->
np] = p;
5091 los->
t[los->
np] = t;
5092 for (
int ig = 0; ig < ctl->
ng; ig++)
5093 los->
q[los->
np][ig] = q[ig];
5094 for (
int id = 0;
id < ctl->
nd;
id++)
5095 los->
k[los->
np][
id] = k[ctl->
window[
id]];
5096 los->
ds[los->
np] = ds;
5099 if (ctl->
ncl > 0 && atm->
cldz > 0) {
5100 const double aux = exp(-0.5 *
POW2((z - atm->
clz) / atm->
cldz));
5101 for (
int id = 0;
id < ctl->
nd;
id++) {
5105 ctl->
clnu[icl + 1], atm->
clk[icl + 1], ctl->
nu[
id]);
5116 if (ctl->
nsf > 0 && atm->
sft > 0)
5118 los->
sft = (stop == 2 ? t : -999);
5121 for (
int id = 0;
id < ctl->
nd;
id++) {
5122 los->
sfeps[id] = 1.0;
5126 ctl->
sfnu[isf + 1], atm->
sfeps[isf + 1],
5136 if (ctl->
refrac && z <= zrefrac)
5142 for (
int i = 0; i < 3; i++)
5143 ex1[i] = ex0[i] * n;
5146 if (ctl->
refrac && z <= zrefrac) {
5147 for (
int i = 0; i < 3; i++)
5148 xh[i] = x[i] + 0.5 * ds * ex0[i];
5152 for (
int i = 0; i < 3; i++) {
5160 for (
int i = 0; i < 3; i++)
5164 for (
int i = 0; i < 3; i++)
5165 ex1[i] += ds * ng[i];
5169 for (
int i = 0; i < 3; i++)
5173 for (
int i = 0; i < 3; i++)
5174 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
5177 for (
int i = 0; i < 3; i++)
5185 for (
int ip = los->
np - 1; ip >= 1; ip--)
5186 los->
ds[ip] = 0.5 * (los->
ds[ip - 1] + los->
ds[ip]);
5190 for (
int ip = 0; ip < los->
np; ip++)
5191 for (
int ig = 0; ig < ctl->
ng; ig++)
5192 los->
u[ip][ig] = 10 * los->
q[ip][ig] * los->
p[ip]
5193 / (
KB * los->
t[ip]) * los->
ds[ip];
5196 for (
int ig = 0; ig < ctl->
ng; ig++) {
5197 los->
cgu[0][ig] = los->
u[0][ig];
5198 los->
cgp[0][ig] = los->
u[0][ig] * los->
p[0];
5199 los->
cgt[0][ig] = los->
u[0][ig] * los->
t[0];
5201 for (
int ip = 1; ip < los->
np; ip++)
5202 for (
int ig = 0; ig < ctl->
ng; ig++) {
5203 los->
cgu[ip][ig] = los->
cgu[ip - 1][ig] + los->
u[ip][ig];
5204 los->
cgp[ip][ig] = los->
cgp[ip - 1][ig] + los->
u[ip][ig] * los->
p[ip];
5205 los->
cgt[ip][ig] = los->
cgt[ip - 1][ig] + los->
u[ip][ig] * los->
t[ip];
5207 for (
int ip = 0; ip < los->
np; ip++)
5208 for (
int ig = 0; ig < ctl->
ng; ig++)
5209 if (los->
cgu[ip][ig] != 0) {
5210 los->
cgp[ip][ig] /= los->
cgu[ip][ig];
5211 los->
cgt[ip][ig] /= los->
cgu[ip][ig];
5220 const char *dirname,
5221 const char *filename,
5231 if (dirname != NULL)
5232 sprintf(file,
"%s/%s", dirname, filename);
5234 sprintf(file,
"%s", filename);
5237 LOG(1,
"Read atmospheric data: %s", file);
5244 else if (ctl->
atmfmt == 2)
5248 else if (ctl->
atmfmt == 3)
5253 ERRMSG(
"Could not read any data!");
5257 LOG(2,
"Number of data points: %d", atm->
np);
5258 gsl_stats_minmax(&mini, &maxi, atm->
time, 1, (
size_t) atm->
np);
5259 LOG(2,
"Time range: %.2f ... %.2f s", mini, maxi);
5260 gsl_stats_minmax(&mini, &maxi, atm->
z, 1, (
size_t) atm->
np);
5261 LOG(2,
"Altitude range: %g ... %g km", mini, maxi);
5262 gsl_stats_minmax(&mini, &maxi, atm->
lon, 1, (
size_t) atm->
np);
5263 LOG(2,
"Longitude range: %g ... %g deg", mini, maxi);
5264 gsl_stats_minmax(&mini, &maxi, atm->
lat, 1, (
size_t) atm->
np);
5265 LOG(2,
"Latitude range: %g ... %g deg", mini, maxi);
5266 gsl_stats_minmax(&mini, &maxi, atm->
p, 1, (
size_t) atm->
np);
5267 LOG(2,
"Pressure range: %g ... %g hPa", maxi, mini);
5268 gsl_stats_minmax(&mini, &maxi, atm->
t, 1, (
size_t) atm->
np);
5269 LOG(2,
"Temperature range: %g ... %g K", mini, maxi);
5270 for (
int ig = 0; ig < ctl->
ng; ig++) {
5271 gsl_stats_minmax(&mini, &maxi, atm->
q[ig], 1, (
size_t) atm->
np);
5272 LOG(2,
"Emitter %s range: %g ... %g ppv", ctl->
emitter[ig], mini, maxi);
5274 for (
int iw = 0; iw < ctl->
nw; iw++) {
5275 gsl_stats_minmax(&mini, &maxi, atm->
k[iw], 1, (
size_t) atm->
np);
5276 LOG(2,
"Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5279 LOG(2,
"Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5282 LOG(2,
"Cloud layer: none");
5285 "Surface: T_s = %g K | eps= %g ... %g",
5288 LOG(2,
"Surface: none");
5294 const char *filename,
5303 if (!(in = fopen(filename,
"r")))
5304 ERRMSG(
"Cannot open file!");
5307 char line[
LEN], *tok;
5308 while (fgets(line,
LEN, in)) {
5311 TOK(line, tok,
"%lg", atm->
time[atm->
np]);
5312 TOK(NULL, tok,
"%lg", atm->
z[atm->
np]);
5313 TOK(NULL, tok,
"%lg", atm->
lon[atm->
np]);
5314 TOK(NULL, tok,
"%lg", atm->
lat[atm->
np]);
5315 TOK(NULL, tok,
"%lg", atm->
p[atm->
np]);
5316 TOK(NULL, tok,
"%lg", atm->
t[atm->
np]);
5317 for (
int ig = 0; ig < ctl->
ng; ig++)
5318 TOK(NULL, tok,
"%lg", atm->
q[ig][atm->
np]);
5319 for (
int iw = 0; iw < ctl->
nw; iw++)
5320 TOK(NULL, tok,
"%lg", atm->
k[iw][atm->
np]);
5321 if (ctl->
ncl > 0 && atm->
np == 0) {
5322 TOK(NULL, tok,
"%lg", atm->
clz);
5323 TOK(NULL, tok,
"%lg", atm->
cldz);
5324 for (
int icl = 0; icl < ctl->
ncl; icl++)
5325 TOK(NULL, tok,
"%lg", atm->
clk[icl]);
5327 if (ctl->
nsf > 0 && atm->
np == 0) {
5328 TOK(NULL, tok,
"%lg", atm->
sft);
5329 for (
int isf = 0; isf < ctl->
nsf; isf++)
5330 TOK(NULL, tok,
"%lg", atm->
sfeps[isf]);
5334 if ((++atm->
np) >
NP)
5335 ERRMSG(
"Too many data points!");
5345 const char *filename,
5351 if (!(in = fopen(filename,
"r")))
5352 ERRMSG(
"Cannot open file!");
5359 if (memcmp(magic,
"ATM1", 4) != 0)
5360 ERRMSG(
"Invalid magic string!");
5362 int ng, nw, ncl, nsf;
5375 if (ng != ctl->
ng || nw != ctl->
nw || ncl != ctl->
ncl || nsf != ctl->
nsf)
5376 ERRMSG(
"Error reading file header!");
5385 ERRMSG(
"Too many data points!");
5404 for (
int ig = 0; ig < ctl->
ng; ig++)
5405 FREAD(atm->
q[ig],
double,
5408 for (
int iw = 0; iw < ctl->
nw; iw++)
5409 FREAD(atm->
k[iw],
double,
5439 const char *filename,
5444 int ncid, var_time, var_z, var_lon, var_lat, var_p, var_t, var_q[
NG],
5445 var_k[
NW], var_cz = -1, var_cdz = -1, var_ck[
NCL], var_sft =
5446 -1, var_sfe[
NSF], var_nlev = -1;
5451 NC(nc_open(filename, NC_NOWRITE, &ncid));
5454 size_t start[2] = { (size_t) profile, 0 };
5455 size_t count[2] = { 1, 0 };
5458 NC(nc_inq_varid(ncid,
"nlev", &var_nlev));
5459 NC(nc_get_vara_int(ncid, var_nlev, start, count, &atm->
np));
5460 if (atm->
np < 1 || atm->
np >
NP)
5461 ERRMSG(
"Number of level out of range!");
5464 count[1] = (size_t) atm->
np;
5467 NC(nc_inq_varid(ncid,
"time", &var_time));
5468 NC(nc_inq_varid(ncid,
"z", &var_z));
5469 NC(nc_inq_varid(ncid,
"lon", &var_lon));
5470 NC(nc_inq_varid(ncid,
"lat", &var_lat));
5471 NC(nc_inq_varid(ncid,
"p", &var_p));
5472 NC(nc_inq_varid(ncid,
"t", &var_t));
5475 for (
int ig = 0; ig < ctl->
ng; ig++)
5476 NC(nc_inq_varid(ncid, ctl->
emitter[ig], &var_q[ig]));
5479 for (
int iw = 0; iw < ctl->
nw; iw++) {
5480 sprintf(varname,
"ext_win_%d", iw);
5481 NC(nc_inq_varid(ncid, varname, &var_k[iw]));
5486 NC(nc_inq_varid(ncid,
"cld_z", &var_cz));
5487 NC(nc_inq_varid(ncid,
"cld_dz", &var_cdz));
5488 for (
int icl = 0; icl < ctl->
ncl; icl++) {
5489 sprintf(varname,
"cld_k_%.4f", ctl->
clnu[icl]);
5490 NC(nc_inq_varid(ncid, varname, &var_ck[icl]));
5496 NC(nc_inq_varid(ncid,
"srf_t", &var_sft));
5497 for (
int isf = 0; isf < ctl->
nsf; isf++) {
5498 sprintf(varname,
"srf_eps_%.4f", ctl->
sfnu[isf]);
5499 NC(nc_inq_varid(ncid, varname, &var_sfe[isf]));
5504 NC(nc_get_vara_double(ncid, var_time, start, count, atm->
time));
5505 NC(nc_get_vara_double(ncid, var_z, start, count, atm->
z));
5506 NC(nc_get_vara_double(ncid, var_lon, start, count, atm->
lon));
5507 NC(nc_get_vara_double(ncid, var_lat, start, count, atm->
lat));
5508 NC(nc_get_vara_double(ncid, var_p, start, count, atm->
p));
5509 NC(nc_get_vara_double(ncid, var_t, start, count, atm->
t));
5512 for (
int ig = 0; ig < ctl->
ng; ig++)
5513 NC(nc_get_vara_double(ncid, var_q[ig], start, count, atm->
q[ig]));
5516 for (
int iw = 0; iw < ctl->
nw; iw++)
5517 NC(nc_get_vara_double(ncid, var_k[iw], start, count, atm->
k[iw]));
5521 NC(nc_get_vara_double(ncid, var_cz, start, count, &atm->
clz));
5522 NC(nc_get_vara_double(ncid, var_cdz, start, count, &atm->
cldz));
5523 for (
int icl = 0; icl < ctl->
ncl; icl++)
5524 NC(nc_get_vara_double(ncid, var_ck[icl], start, count, &atm->
clk[icl]));
5529 NC(nc_get_vara_double(ncid, var_sft, start, count, &atm->
sft));
5531 for (
int isf = 0; isf < ctl->
nsf; isf++)
5532 NC(nc_get_vara_double
5533 (ncid, var_sfe[isf], start, count, &atm->
sfeps[isf]));
5548 LOG(1,
"\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
5549 "(executable: %s | version: %s | compiled: %s, %s)\n",
5550 argv[0], VERSION, __DATE__, __TIME__);
5553 ctl->
ng = (int)
scan_ctl(argc, argv,
"NG", -1,
"0", NULL);
5554 if (ctl->
ng < 0 || ctl->
ng >
NG)
5555 ERRMSG(
"Set 0 <= NG <= MAX!");
5556 for (
int ig = 0; ig < ctl->
ng; ig++)
5564 ctl->
nd = (int)
scan_ctl(argc, argv,
"ND", -1,
"0", NULL);
5565 if (ctl->
nd < 0 || ctl->
nd >
ND)
5566 ERRMSG(
"Set 0 <= ND <= MAX!");
5567 for (
int id = 0;
id < ctl->
nd;
id++)
5568 ctl->
nu[
id] =
scan_ctl(argc, argv,
"NU",
id,
"", NULL);
5571 ctl->
nw = (int)
scan_ctl(argc, argv,
"NW", -1,
"1", NULL);
5572 if (ctl->
nw < 0 || ctl->
nw >
NW)
5573 ERRMSG(
"Set 0 <= NW <= MAX!");
5574 for (
int id = 0;
id < ctl->
nd;
id++)
5575 ctl->
window[
id] = (
int)
scan_ctl(argc, argv,
"WINDOW",
id,
"0", NULL);
5578 ctl->
ncl = (int)
scan_ctl(argc, argv,
"NCL", -1,
"0", NULL);
5580 ERRMSG(
"Set 0 <= NCL <= MAX!");
5583 for (
int icl = 0; icl < ctl->
ncl; icl++)
5584 ctl->
clnu[icl] =
scan_ctl(argc, argv,
"CLNU", icl,
"", NULL);
5587 ctl->
nsf = (int)
scan_ctl(argc, argv,
"NSF", -1,
"0", NULL);
5589 ERRMSG(
"Set 0 <= NSF <= MAX!");
5592 for (
int isf = 0; isf < ctl->
nsf; isf++)
5593 ctl->
sfnu[isf] =
scan_ctl(argc, argv,
"SFNU", isf,
"", NULL);
5594 ctl->
sftype = (int)
scan_ctl(argc, argv,
"SFTYPE", -1,
"2", NULL);
5596 ERRMSG(
"Set 0 <= SFTYPE <= 3!");
5597 ctl->
sfsza =
scan_ctl(argc, argv,
"SFSZA", -1,
"-999", NULL);
5601 ctl->
tblfmt = (int)
scan_ctl(argc, argv,
"TBLFMT", -1,
"1", NULL);
5603 ERRMSG(
"Unknown look-up table file format, set TBLFMT to 1, 2, or 3!");
5606 ctl->
atmfmt = (int)
scan_ctl(argc, argv,
"ATMFMT", -1,
"1", NULL);
5608 ERRMSG(
"Unknown atmospheric file format, set ATMFMT to 1, 2, or 3!");
5609 ctl->
obsfmt = (int)
scan_ctl(argc, argv,
"OBSFMT", -1,
"1", NULL);
5611 ERRMSG(
"Unknown observation file format, set OBSFMT to 1, 2, or 3!");
5614 ERRMSG(
"Unknown matrix file format, set MATRIXFMT to 1, 2, or 3!");
5617 ctl->
hydz =
scan_ctl(argc, argv,
"HYDZ", -1,
"-999", NULL);
5622 ctl->
ctm_n2 = (int)
scan_ctl(argc, argv,
"CTM_N2", -1,
"1", NULL);
5623 ctl->
ctm_o2 = (int)
scan_ctl(argc, argv,
"CTM_O2", -1,
"1", NULL);
5626 ctl->
refrac = (int)
scan_ctl(argc, argv,
"REFRAC", -1,
"1", NULL);
5628 ctl->
raydz =
scan_ctl(argc, argv,
"RAYDZ", -1,
"0.1", NULL);
5632 if (ctl->
fov[0] !=
'-')
5640 for (
int ig = 0; ig < ctl->
ng; ig++) {
5644 for (
int iw = 0; iw < ctl->
nw; iw++) {
5657 (int)
scan_ctl(argc, argv,
"WRITE_MATRIX", -1,
"0", NULL);
5660 ctl->
formod = (int)
scan_ctl(argc, argv,
"FORMOD", -1,
"1", NULL);
5663 for (
int ig = 0; ig < ctl->
ng; ig++)
5670 const char *dirname,
5671 const char *filename,
5690 ERRMSG(
"Unknown matrix file format, check MATRIXFMT!");
5696 const char *dirname,
5697 const char *filename,
5698 gsl_matrix *matrix) {
5707 if (dirname != NULL)
5708 sprintf(file,
"%s/%s", dirname, filename);
5710 sprintf(file,
"%s", filename);
5713 LOG(1,
"Read matrix: %s", file);
5717 if (!(in = fopen(file,
"r")))
5718 ERRMSG(
"Cannot open file!");
5721 gsl_matrix_set_zero(matrix);
5722 while (fgets(line,
LEN, in))
5723 if (sscanf(line,
"%d %s %s %s %s %s %d %s %s %s %s %s %lg",
5724 &i, dum, dum, dum, dum, dum,
5725 &j, dum, dum, dum, dum, dum, &value) == 13)
5726 gsl_matrix_set(matrix, (
size_t) i, (
size_t) j, value);
5735 const char *dirname,
5736 const char *filename,
5737 gsl_matrix *matrix) {
5739 char file[
LEN], magic[4];
5743 if (dirname != NULL)
5744 sprintf(file,
"%s/%s", dirname, filename);
5746 sprintf(file,
"%s", filename);
5749 LOG(1,
"Read matrix: %s", file);
5753 if (!(in = fopen(file,
"r")))
5754 ERRMSG(
"Cannot open file!");
5760 if (memcmp(magic,
"MAT1", 4) != 0)
5761 ERRMSG(
"Invalid magic string!");
5768 if (nr != matrix->size1 || nc != matrix->size2)
5769 ERRMSG(
"Error reading file header!");
5772 for (
size_t i = 0; i < nr; i++)
5773 for (
size_t j = 0; j < nc; j++) {
5775 FREAD(&value,
double,
5778 gsl_matrix_set(matrix, i, j, value);
5788 const char *dirname,
5789 const char *filename,
5795 int ncid, dimid_row, dimid_col, varid;
5800 if (dirname != NULL)
5801 sprintf(file,
"%s/%s", dirname, filename);
5803 sprintf(file,
"%s", filename);
5806 LOG(1,
"Read matrix: %s", file);
5809 NC(nc_open(file, NC_NOWRITE, &ncid));
5812 NC(nc_inq_dimid(ncid,
"row", &dimid_row));
5813 NC(nc_inq_dimid(ncid,
"col", &dimid_col));
5814 NC(nc_inq_dimlen(ncid, dimid_row, &nr));
5815 NC(nc_inq_dimlen(ncid, dimid_col, &nc));
5816 if (nr != matrix->size1 || nc != matrix->size2)
5817 ERRMSG(
"Error reading file header!");
5820 NC(nc_inq_varid(ncid,
"matrix", &varid));
5821 for (
size_t i = 0; i < nr; i++)
5822 for (
size_t j = 0; j < nc; j++) {
5824 size_t start[3] = { (size_t) dataset, i, j };
5825 size_t count[3] = { 1, 1, 1 };
5826 NC(nc_get_vara_double(ncid, varid, start, count, &value));
5827 gsl_matrix_set(matrix, i, j, value);
5837 const char *dirname,
5838 const char *filename,
5845 if (dirname != NULL)
5846 sprintf(file,
"%s/%s", dirname, filename);
5848 sprintf(file,
"%s", filename);
5851 LOG(1,
"Read observation data: %s", file);
5858 else if (ctl->
obsfmt == 2)
5862 else if (ctl->
obsfmt == 3)
5867 ERRMSG(
"Could not read any data!");
5871 LOG(2,
"Number of ray paths: %d", obs->
nr);
5872 gsl_stats_minmax(&mini, &maxi, obs->
time, 1, (
size_t) obs->
nr);
5873 LOG(2,
"Time range: %.2f ... %.2f s", mini, maxi);
5874 gsl_stats_minmax(&mini, &maxi, obs->
obsz, 1, (
size_t) obs->
nr);
5875 LOG(2,
"Observer altitude range: %g ... %g km", mini, maxi);
5876 gsl_stats_minmax(&mini, &maxi, obs->
obslon, 1, (
size_t) obs->
nr);
5877 LOG(2,
"Observer longitude range: %g ... %g deg", mini, maxi);
5878 gsl_stats_minmax(&mini, &maxi, obs->
obslat, 1, (
size_t) obs->
nr);
5879 LOG(2,
"Observer latitude range: %g ... %g deg", mini, maxi);
5880 gsl_stats_minmax(&mini, &maxi, obs->
vpz, 1, (
size_t) obs->
nr);
5881 LOG(2,
"View point altitude range: %g ... %g km", mini, maxi);
5882 gsl_stats_minmax(&mini, &maxi, obs->
vplon, 1, (
size_t) obs->
nr);
5883 LOG(2,
"View point longitude range: %g ... %g deg", mini, maxi);
5884 gsl_stats_minmax(&mini, &maxi, obs->
vplat, 1, (
size_t) obs->
nr);
5885 LOG(2,
"View point latitude range: %g ... %g deg", mini, maxi);
5886 gsl_stats_minmax(&mini, &maxi, obs->
tpz, 1, (
size_t) obs->
nr);
5887 LOG(2,
"Tangent point altitude range: %g ... %g km", mini, maxi);
5888 gsl_stats_minmax(&mini, &maxi, obs->
tplon, 1, (
size_t) obs->
nr);
5889 LOG(2,
"Tangent point longitude range: %g ... %g deg", mini, maxi);
5890 gsl_stats_minmax(&mini, &maxi, obs->
tplat, 1, (
size_t) obs->
nr);
5891 LOG(2,
"Tangent point latitude range: %g ... %g deg", mini, maxi);
5892 for (
int id = 0;
id < ctl->
nd;
id++) {
5893 gsl_stats_minmax(&mini, &maxi, obs->
rad[
id], 1, (
size_t) obs->
nr);
5895 LOG(2,
"Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5896 ctl->
nu[
id], mini, maxi);
5898 LOG(2,
"Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5899 ctl->
nu[
id], mini, maxi);
5902 for (
int id = 0;
id < ctl->
nd;
id++) {
5903 gsl_stats_minmax(&mini, &maxi, obs->
tau[
id], 1, (
size_t) obs->
nr);
5904 LOG(2,
"Transmittance (%.4f cm^-1) range: %g ... %g",
5905 ctl->
nu[
id], mini, maxi);
5912 const char *filename,
5921 if (!(in = fopen(filename,
"r")))
5922 ERRMSG(
"Cannot open file!");
5925 char line[
LEN], *tok;
5926 while (fgets(line,
LEN, in)) {
5929 TOK(line, tok,
"%lg", obs->
time[obs->
nr]);
5930 TOK(NULL, tok,
"%lg", obs->
obsz[obs->
nr]);
5933 TOK(NULL, tok,
"%lg", obs->
vpz[obs->
nr]);
5936 TOK(NULL, tok,
"%lg", obs->
tpz[obs->
nr]);
5939 for (
int id = 0;
id < ctl->
nd;
id++)
5940 TOK(NULL, tok,
"%lg", obs->
rad[
id][obs->
nr]);
5941 for (
int id = 0;
id < ctl->
nd;
id++)
5942 TOK(NULL, tok,
"%lg", obs->
tau[
id][obs->
nr]);
5945 if ((++obs->
nr) >
NR)
5946 ERRMSG(
"Too many rays!");
5956 const char *filename,
5962 if (!(in = fopen(filename,
"r")))
5963 ERRMSG(
"Cannot open file!");
5970 if (memcmp(magic,
"OBS1", 4) != 0)
5971 ERRMSG(
"Invalid magic string!");
5978 ERRMSG(
"Error reading file header!");
5987 ERRMSG(
"Too many ray paths!");
6018 for (
int id = 0;
id < ctl->
nd;
id++)
6022 for (
int id = 0;
id < ctl->
nd;
id++)
6034 const char *filename,
6037 const int profile) {
6039 int ncid, var_nray = -1, var_time = -1, var_obsz = -1, var_obslon =
6040 -1, var_obslat = -1, var_vpz = -1, var_vplon = -1, var_vplat =
6041 -1, var_tpz = -1, var_tplon = -1, var_tplat =
6042 -1, var_rad[
ND], var_tau[
ND];
6043 const char *spec_prefix = ctl->
write_bbt ?
"bt" :
"rad";
6046 NC(nc_open(filename, NC_NOWRITE, &ncid));
6049 size_t start[2] = { (size_t) profile, 0 };
6050 size_t count[2] = { 1, 0 };
6053 NC(nc_inq_varid(ncid,
"nray", &var_nray));
6054 NC(nc_get_vara_int(ncid, var_nray, start, count, &obs->
nr));
6055 if (obs->
nr < 1 || obs->
nr >
NR)
6056 ERRMSG(
"Number of ray paths out of range!");
6059 count[1] = (size_t) obs->
nr;
6062 NC(nc_inq_varid(ncid,
"time", &var_time));
6063 NC(nc_inq_varid(ncid,
"obs_z", &var_obsz));
6064 NC(nc_inq_varid(ncid,
"obs_lon", &var_obslon));
6065 NC(nc_inq_varid(ncid,
"obs_lat", &var_obslat));
6067 NC(nc_inq_varid(ncid,
"vp_z", &var_vpz));
6068 NC(nc_inq_varid(ncid,
"vp_lon", &var_vplon));
6069 NC(nc_inq_varid(ncid,
"vp_lat", &var_vplat));
6071 NC(nc_inq_varid(ncid,
"tp_z", &var_tpz));
6072 NC(nc_inq_varid(ncid,
"tp_lon", &var_tplon));
6073 NC(nc_inq_varid(ncid,
"tp_lat", &var_tplat));
6076 for (
int id = 0;
id < ctl->
nd;
id++) {
6079 sprintf(varname,
"%s_%.4f", spec_prefix, ctl->
nu[
id]);
6080 NC(nc_inq_varid(ncid, varname, &var_rad[
id]));
6082 sprintf(varname,
"tau_%.4f", ctl->
nu[
id]);
6083 NC(nc_inq_varid(ncid, varname, &var_tau[
id]));
6087 NC(nc_get_vara_double(ncid, var_time, start, count, obs->
time));
6088 NC(nc_get_vara_double(ncid, var_obsz, start, count, obs->
obsz));
6089 NC(nc_get_vara_double(ncid, var_obslon, start, count, obs->
obslon));
6090 NC(nc_get_vara_double(ncid, var_obslat, start, count, obs->
obslat));
6092 NC(nc_get_vara_double(ncid, var_vpz, start, count, obs->
vpz));
6093 NC(nc_get_vara_double(ncid, var_vplon, start, count, obs->
vplon));
6094 NC(nc_get_vara_double(ncid, var_vplat, start, count, obs->
vplat));
6096 NC(nc_get_vara_double(ncid, var_tpz, start, count, obs->
tpz));
6097 NC(nc_get_vara_double(ncid, var_tplon, start, count, obs->
tplon));
6098 NC(nc_get_vara_double(ncid, var_tplat, start, count, obs->
tplat));
6101 for (
int id = 0;
id < ctl->
nd;
id++) {
6102 NC(nc_get_vara_double(ncid, var_rad[
id], start, count, obs->
rad[
id]));
6103 NC(nc_get_vara_double(ncid, var_tau[
id], start, count, obs->
tau[
id]));
6113 const char *basename,
6119 double *nurfm, *spec;
6129 find_rfm_file(filename, basename, z);
6133 const double result = convolve_rfm(nurfm, spec, npts, nu, f, n);
6152 (int)
scan_ctl(argc, argv,
"KERNEL_RECOMP", -1,
"3", NULL);
6159 for (
int id = 0;
id < ctl->
nd;
id++)
6162 for (
int id = 0;
id < ctl->
nd;
id++)
6173 for (
int ig = 0; ig < ctl->
ng; ig++) {
6174 ret->
err_q[ig] =
scan_ctl(argc, argv,
"ERR_Q", ig,
"0", NULL);
6179 for (
int iw = 0; iw < ctl->
nw; iw++) {
6180 ret->
err_k[iw] =
scan_ctl(argc, argv,
"ERR_K", iw,
"0", NULL);
6187 for (
int icl = 0; icl < ctl->
ncl; icl++)
6191 for (
int isf = 0; isf < ctl->
nsf; isf++)
6196 scan_ctl(argc, argv,
"SHARED_IO_PROFLIST", -1,
"-",
6198 scan_ctl(argc, argv,
"SHARED_IO_ATM_APR_FILE", -1,
"-",
6200 scan_ctl(argc, argv,
"SHARED_IO_OBS_MEAS_FILE", -1,
"-",
6202 scan_ctl(argc, argv,
"SHARED_IO_ATM_FINAL_FILE", -1,
"-",
6204 scan_ctl(argc, argv,
"SHARED_IO_OBS_FINAL_FILE", -1,
"-",
6206 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_COV_APR_FILE", -1,
"-",
6208 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_KERNEL_FILE", -1,
"-",
6210 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_COV_RET_FILE", -1,
"-",
6212 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_CORR_FILE", -1,
"-",
6214 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_GAIN_FILE", -1,
"-",
6216 scan_ctl(argc, argv,
"SHARED_IO_MATRIX_AVK_FILE", -1,
"-",
6218 scan_ctl(argc, argv,
"SHARED_IO_ATM_ERR_TOTAL_FILE", -1,
"-",
6220 scan_ctl(argc, argv,
"SHARED_IO_ATM_ERR_NOISE_FILE", -1,
"-",
6222 scan_ctl(argc, argv,
"SHARED_IO_ATM_ERR_FORMOD_FILE", -1,
"-",
6224 scan_ctl(argc, argv,
"SHARED_IO_ATM_CONT_FILE", -1,
"-",
6226 scan_ctl(argc, argv,
"SHARED_IO_ATM_RES_FILE", -1,
"-",
6233 const char *filename,
6238 char *line = NULL, *tok;
6240 size_t line_buf_size = 0;
6242 double dnu, nu0, nu1;
6247 LOG(1,
"Read RFM data: %s", filename);
6251 if (!(in = fopen(filename,
"r")))
6252 ERRMSG(
"Cannot open file!");
6255 for (
int i = 0; i < 4; i++)
6256 if (getline(&line, &line_buf_size, in) == -1)
6257 ERRMSG(
"Error while reading file header!");
6258 if (sscanf(line,
"%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
6259 ERRMSG(
"Invalid spectrum header format!");
6263 ERRMSG(
"Too many spectral grid points!");
6266 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
6267 tok = strtok(line,
" \t\n");
6268 while (tok != NULL && ipts < *npts) {
6269 if (sscanf(tok,
"%lg", &rad[ipts]) == 1)
6271 tok = strtok(NULL,
" \t\n");
6277 ERRMSG(
"Error while reading RFM data!");
6280 for (ipts = 0; ipts < *npts; ipts++)
6281 nu[ipts] =
LIN(0.0, nu0, (
double) (*npts - 1), nu1, (
double) ipts);
6293 const char *filename,
6301 LOG(1,
"Read shape function: %s", filename);
6305 if (!(in = fopen(filename,
"r")))
6306 ERRMSG(
"Cannot open file!");
6310 while (fgets(line,
LEN, in))
6311 if (sscanf(line,
"%lg %lg", &x[*n], &y[*n]) == 2)
6313 ERRMSG(
"Too many data points!");
6320 ERRMSG(
"Could not read any data!");
6324 LOG(2,
"Number of data points: %d", *n);
6325 gsl_stats_minmax(&mini, &maxi, x, 1, (
size_t) *n);
6326 LOG(2,
"Range of x values: %.4f ... %.4f", mini, maxi);
6327 gsl_stats_minmax(&mini, &maxi, y, 1, (
size_t) *n);
6328 LOG(2,
"Range of y values: %g ... %g", mini, maxi);
6341 for (
int id = 0;
id < ctl->
nd;
id++)
6345 for (
int ig = 0; ig < ctl->
ng; ig++) {
6349 for (
int id = 0;
id < ctl->
nd;
id++) {
6355 else if (ctl->
tblfmt == 2)
6356 for (
int id = 0;
id < ctl->
nd;
id++) {
6362 else if (ctl->
tblfmt == 3) {
6366 char filename[2 *
LEN];
6368 if (nc_open(filename, NC_NOWRITE, &ncid) != NC_NOERR) {
6369 WARN(
"Missing emissivity table: %s", filename);
6372 LOG(1,
"Read emissivity table: %s", filename);
6375 for (
int id = 0;
id < ctl->
nd;
id++) {
6386 for (
int id = 0;
id < ctl->
nd;
id++)
6387 for (
int ig = 0; ig < ctl->
ng; ig++)
6388 for (
int ip = 0; ip < tbl->
np[id][ig]; ip++)
6389 tbl->
lnp[
id][ig][ip] = log(tbl->
p[
id][ig][ip]);
6393 for (
int id = 0;
id < ctl->
nd;
id++) {
6394 char filename[2 *
LEN];
6395 sprintf(filename,
"%s_%.4f.filt", ctl->
tblbase, ctl->
nu[
id]);
6416 double eps, eps_old = -999, press, press_old = -999, temp,
6417 temp_old = -999, u, u_old = -999;
6421 char filename[2 *
LEN];
6422 sprintf(filename,
"%s_%.4f_%s.tab", ctl->
tblbase,
6427 if (!(in = fopen(filename,
"r"))) {
6428 WARN(
"Missing emissivity table: %s", filename);
6431 LOG(1,
"Read emissivity table: %s", filename);
6434 tbl->
np[id][ig] = -1;
6438 while (fgets(line,
LEN, in)) {
6441 if (sscanf(line,
"%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
6445 if (u < UMIN || u >
UMAX || eps < EPSMIN || eps >
EPSMAX) {
6451 if (press != press_old) {
6453 if ((++tbl->
np[
id][ig]) >=
TBLNP)
6454 ERRMSG(
"Too many pressure levels!");
6455 tbl->
nt[id][ig][tbl->
np[id][ig]] = -1;
6459 if (temp != temp_old) {
6461 if ((++tbl->
nt[
id][ig][tbl->
np[
id][ig]]) >=
TBLNT)
6462 ERRMSG(
"Too many temperatures!");
6463 tbl->
nu[id][ig][tbl->
np[id][ig]]
6464 [tbl->
nt[id][ig][tbl->
np[id][ig]]] = -1;
6467 tbl->
logu[id][ig][tbl->
np[id][ig]]
6468 [tbl->
nt[id][ig][tbl->
np[id][ig]]] = NULL;
6469 tbl->
logeps[id][ig][tbl->
np[id][ig]]
6470 [tbl->
nt[id][ig][tbl->
np[id][ig]]] = NULL;
6474 if ((eps > eps_old && u > u_old) || tbl->
nu[
id][ig][tbl->
np[
id][ig]]
6475 [tbl->
nt[
id][ig][tbl->
np[
id][ig]]] < 0) {
6478 if ((++tbl->
nu[
id][ig][tbl->
np[
id][ig]]
6479 [tbl->
nt[
id][ig][tbl->
np[
id][ig]]]) >=
TBLNU)
6480 ERRMSG(
"Too many column densities!");
6483 const int ip = tbl->
np[id][ig];
6484 const int it = tbl->
nt[id][ig][ip];
6485 const int iu = tbl->
nu[id][ig][ip][it];
6486 const size_t nnew = (size_t) (iu + 1);
6488 float *tmp = (
float *) realloc(tbl->
logu[
id][ig][ip][it],
6489 nnew *
sizeof(
float));
6491 ERRMSG(
"Out of memory!");
6492 tbl->
logu[id][ig][ip][it] = tmp;
6495 (
float *) realloc(tbl->
logeps[
id][ig][ip][it], nnew *
sizeof(
float));
6497 ERRMSG(
"Out of memory!");
6498 tbl->
logeps[id][ig][ip][it] = tmp;
6502 tbl->
p[id][ig][tbl->
np[id][ig]] = press;
6503 tbl->
t[id][ig][tbl->
np[id][ig]][tbl->
nt[id][ig][tbl->
np[id][ig]]]
6505 tbl->
logu[id][ig][tbl->
np[id][ig]][tbl->
nt[id][ig][tbl->
np[id][ig]]]
6506 [tbl->
nu[id][ig][tbl->
np[id][ig]]
6507 [tbl->
nt[id][ig][tbl->
np[id][ig]]]] = (float) log(u);
6508 tbl->
logeps[id][ig][tbl->
np[id][ig]][tbl->
nt[id][ig][tbl->
np[id][ig]]]
6509 [tbl->
nu[id][ig][tbl->
np[id][ig]]
6510 [tbl->
nt[id][ig][tbl->
np[id][ig]]]] = (float) log(eps);
6515 for (
int ip = 0; ip < tbl->
np[id][ig]; ip++) {
6516 tbl->
nt[id][ig][ip]++;
6517 for (
int it = 0; it < tbl->
nt[id][ig][ip]; it++)
6518 tbl->
nu[
id][ig][ip][it]++;
6523 WARN(
"Column density or emissivity out of range (%d data points)!",
6539 char filename[2 *
LEN];
6540 sprintf(filename,
"%s_%.4f_%s.bin",
6544 FILE *in = fopen(filename,
"rb");
6546 WARN(
"Missing emissivity table: %s", filename);
6549 LOG(1,
"Read emissivity table: %s", filename);
6553 FREAD(&nbytes,
size_t,
6557 ERRMSG(
"Invalid packed table size!");
6560 uint8_t *work = NULL;
6561 ALLOC(work, uint8_t, nbytes);
6562 FREAD(work, uint8_t, nbytes, in);
6590 sprintf(varname,
"tbl_%.4f", ctl->
nu[
id]);
6591 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
6592 WARN(
"Missing emissivity table: %s", varname);
6595 LOG(1,
"Read emissivity table: %s", varname);
6596 NC(nc_inq_vardimid(ncid, varid, &dimid));
6597 NC(nc_inq_dimlen(ncid, dimid, &nbytes));
6600 uint8_t *work = NULL;
6601 ALLOC(work, uint8_t, nbytes);
6602 NC(nc_get_var_uchar(ncid, varid, (
unsigned char *) work));
6616 const char *varname,
6618 const char *defvalue,
6621 char dummy[
LEN], fullname1[
LEN], fullname2[
LEN], line[
LEN],
6622 rvarname[
LEN], rval[
LEN];
6628 if (argv[1][0] !=
'-')
6629 if (!(in = fopen(argv[1],
"r")))
6630 ERRMSG(
"Cannot open file!");
6634 sprintf(fullname1,
"%s[%d]", varname, arridx);
6635 sprintf(fullname2,
"%s[*]", varname);
6637 sprintf(fullname1,
"%s", varname);
6638 sprintf(fullname2,
"%s", varname);
6643 while (fgets(line,
LEN, in))
6644 if (sscanf(line,
"%s %s %s", rvarname, dummy, rval) == 3)
6645 if (strcasecmp(rvarname, fullname1) == 0 ||
6646 strcasecmp(rvarname, fullname2) == 0) {
6650 for (
int i = 1; i < argc - 1; i++)
6651 if (strcasecmp(argv[i], fullname1) == 0 ||
6652 strcasecmp(argv[i], fullname2) == 0) {
6653 sprintf(rval,
"%s", argv[i + 1]);
6664 if (strlen(defvalue) > 0)
6665 sprintf(rval,
"%s", defvalue);
6667 ERRMSG(
"Missing variable %s!\n", fullname1);
6671 LOG(1,
"%s = %s", fullname1, rval);
6675 sprintf(value,
"%s", rval);
6690 const size_t n = s_a->size1;
6693 gsl_vector *x_a = gsl_vector_alloc(n);
6696 atm2x(ctl, atm, x_a, NULL, NULL);
6697 for (
size_t i = 0; i < n; i++) {
6699 gsl_vector_set(x_a, i, ret->
err_press / 100 * gsl_vector_get(x_a, i));
6701 gsl_vector_set(x_a, i, ret->
err_temp);
6702 for (
int ig = 0; ig < ctl->
ng; ig++)
6703 if (iqa[i] ==
IDXQ(ig))
6704 gsl_vector_set(x_a, i, ret->
err_q[ig] / 100 * gsl_vector_get(x_a, i));
6705 for (
int iw = 0; iw < ctl->
nw; iw++)
6706 if (iqa[i] ==
IDXK(iw))
6707 gsl_vector_set(x_a, i, ret->
err_k[iw]);
6709 gsl_vector_set(x_a, i, ret->
err_clz);
6711 gsl_vector_set(x_a, i, ret->
err_cldz);
6712 for (
int icl = 0; icl < ctl->
ncl; icl++)
6713 if (iqa[i] ==
IDXCLK(icl))
6714 gsl_vector_set(x_a, i, ret->
err_clk[icl]);
6716 gsl_vector_set(x_a, i, ret->
err_sft);
6717 for (
int isf = 0; isf < ctl->
nsf; isf++)
6719 gsl_vector_set(x_a, i, ret->
err_sfeps[isf]);
6723 for (
size_t i = 0; i < n; i++)
6724 if (
POW2(gsl_vector_get(x_a, i)) <= 0)
6725 ERRMSG(
"Check a priori data (zero standard deviation)!");
6728 gsl_matrix_set_zero(s_a);
6729 for (
size_t i = 0; i < n; i++)
6730 gsl_matrix_set(s_a, i, i,
POW2(gsl_vector_get(x_a, i)));
6733 for (
size_t i = 0; i < n; i++)
6734 for (
size_t j = 0; j < n; j++)
6735 if (i != j && iqa[i] == iqa[j]) {
6742 if (iqa[i] ==
IDXP) {
6748 if (iqa[i] ==
IDXT) {
6754 for (
int ig = 0; ig < ctl->
ng; ig++)
6755 if (iqa[i] ==
IDXQ(ig)) {
6761 for (
int iw = 0; iw < ctl->
nw; iw++)
6762 if (iqa[i] ==
IDXK(iw)) {
6768 if (cz > 0 && ch > 0) {
6771 double x0[3], x1[3];
6777 exp(-
DIST(x0, x1) / ch -
6778 fabs(atm->
z[ipa[i]] - atm->
z[ipa[j]]) / cz);
6781 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
6782 * gsl_vector_get(x_a, j) * rho);
6787 gsl_vector_free(x_a);
6796 gsl_vector *sig_noise,
6797 gsl_vector *sig_formod,
6798 gsl_vector *sig_eps_inv) {
6805 const size_t m = sig_eps_inv->size;
6809 for (
int ir = 0; ir < obs_err->
nr; ir++)
6810 for (
int id = 0;
id < ctl->
nd;
id++)
6811 obs_err->
rad[
id][ir]
6812 = (isfinite(obs->
rad[
id][ir]) ? ret->
err_noise[
id] : NAN);
6813 obs2y(ctl, obs_err, sig_noise, NULL, NULL);
6817 for (
int ir = 0; ir < obs_err->
nr; ir++)
6818 for (
int id = 0;
id < ctl->
nd;
id++)
6819 obs_err->
rad[
id][ir]
6821 obs2y(ctl, obs_err, sig_formod, NULL, NULL);
6824 for (
size_t i = 0; i < m; i++)
6825 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(
POW2(gsl_vector_get(sig_noise, i))
6831 for (
size_t i = 0; i < m; i++)
6832 if (gsl_vector_get(sig_eps_inv, i) <= 0)
6833 ERRMSG(
"Check measurement errors (zero standard deviation)!");
6843 const char *shared_file,
6844 const char *legacy_file,
6845 const char **dirname,
6848 if (shared_file[0] !=
'-') {
6854 *dirname = ret->
dir;
6863 const char *shared_file,
6864 const char *legacy_file,
6865 const char **dirname,
6868 if (shared_file[0] !=
'-') {
6874 *dirname = ret->
dir;
6889 if (snprintf(lockfile,
LEN,
"%s.lock", base) >=
LEN)
6890 ERRMSG(
"Lock file name too long!");
6891 int fd = open(lockfile, O_CREAT | O_RDWR, 0666);
6893 ERRMSG(
"Cannot open lock file!");
6896 fl.l_type = F_WRLCK;
6897 fl.l_whence = SEEK_SET;
6900 if (fcntl(fd, F_SETLKW, &fl) < 0)
6901 ERRMSG(
"Cannot lock shared output file!");
6915 fl.l_type = F_UNLCK;
6916 fl.l_whence = SEEK_SET;
6919 if (fcntl(fd, F_SETLK, &fl) < 0)
6920 ERRMSG(
"Cannot unlock shared output file!");
6967 const size_t ip = gsl_stats_min_index(los->
z, 1, (
size_t) los->
np);
6970 if (ip <= 0 || ip >= (
size_t) los->
np - 1) {
6971 *tpz = los->
z[los->
np - 1];
6972 *tplon = los->
lon[los->
np - 1];
6973 *tplat = los->
lat[los->
np - 1];
6980 const double yy0 = los->
z[ip - 1];
6981 const double yy1 = los->
z[ip];
6982 const double yy2 = los->
z[ip + 1];
6983 const double x1 = sqrt(
POW2(los->
ds[ip]) -
POW2(yy1 - yy0));
6984 const double x2 = x1 + sqrt(
POW2(los->
ds[ip + 1]) -
POW2(yy2 - yy1));
6985 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
6986 const double b = -(yy0 - yy1) / x1 - a * x1;
6987 const double c = yy0;
6990 double dummy, v[3], v0[3], v2[3];
6991 const double x = -b / (2 * a);
6992 *tpz = a * x * x + b * x + c;
6995 for (
int i = 0; i < 3; i++)
6996 v[i] =
LIN(0.0, v0[i], x2, v2[i], x);
7012 for (
int id = 0;
id < ctl->
nd;
id++)
7013 for (
int ig = 0; ig < ctl->
ng; ig++) {
7016 const int np = tbl->
np[id][ig];
7021 for (
int ip = 0; ip < np; ip++) {
7024 const int nt = tbl->
nt[id][ig][ip];
7025 for (
int it = 0; it < nt; it++) {
7028 free(tbl->
logu[
id][ig][ip][it]);
7029 free(tbl->
logeps[
id][ig][ip][it]);
7030 tbl->
logu[id][ig][ip][it] = NULL;
7031 tbl->
logeps[id][ig][ip][it] = NULL;
7047 size_t *bytes_used) {
7052 int np = tbl->
np[id][ig];
7053 memcpy(cur, &np,
sizeof(np));
7056 memcpy(cur, tbl->
p[
id][ig], (
size_t) np *
sizeof(
double));
7057 cur += ((size_t) np *
sizeof(
double));
7059 for (
int ip = 0; ip < np; ip++) {
7060 int nt = tbl->
nt[id][ig][ip];
7061 memcpy(cur, &nt,
sizeof(nt));
7064 memcpy(cur, tbl->
t[
id][ig][ip], (
size_t) nt *
sizeof(
double));
7065 cur += ((size_t) nt *
sizeof(
double));
7067 for (
int it = 0; it < nt; it++) {
7068 int nu = tbl->
nu[id][ig][ip][it];
7069 memcpy(cur, &nu,
sizeof(nu));
7072 memcpy(cur, tbl->
logu[
id][ig][ip][it], (
size_t) nu *
sizeof(
float));
7073 cur += ((size_t) nu *
sizeof(
float));
7075 memcpy(cur, tbl->
logeps[
id][ig][ip][it], (
size_t) nu *
sizeof(
float));
7076 cur += ((size_t) nu *
sizeof(
float));
7081 const int n = tbl->
filt_n[id];
7082 memcpy(cur, &n,
sizeof(n));
7085 memcpy(cur, tbl->
filt_nu[
id], (
size_t) n *
sizeof(
double));
7086 cur += ((size_t) n *
sizeof(
double));
7088 memcpy(cur, tbl->
filt_f[
id], (
size_t) n *
sizeof(
double));
7089 cur += ((size_t) n *
sizeof(
double));
7091 *bytes_used = (size_t) (cur - buf);
7104 const int np = tbl->
np[id][ig];
7105 bytes +=
sizeof(int);
7106 bytes += ((size_t) np *
sizeof(
double));
7108 for (
int ip = 0; ip < np; ip++) {
7109 const int nt = tbl->
nt[id][ig][ip];
7110 bytes +=
sizeof(int);
7111 bytes += ((size_t) nt *
sizeof(
double));
7113 for (
int it = 0; it < nt; it++) {
7114 const int nu = tbl->
nu[id][ig][ip][it];
7115 bytes +=
sizeof(int);
7116 bytes += (2 * (size_t) nu *
sizeof(
float));
7121 const int n = tbl->
filt_n[id];
7122 bytes +=
sizeof(int);
7123 bytes += (2 * (size_t) n *
sizeof(
double));
7134 const uint8_t *buf) {
7136 const uint8_t *cur = buf;
7140 memcpy(&np, cur,
sizeof(np));
7143 if (np < 0 || np >
TBLNP)
7144 ERRMSG(
"np out of range!");
7145 tbl->
np[id][ig] = np;
7147 memcpy(tbl->
p[
id][ig], cur, (
size_t) np *
sizeof(
double));
7148 cur += ((size_t) np *
sizeof(
double));
7150 for (
int ip = 0; ip < np; ip++) {
7153 memcpy(&nt, cur,
sizeof(nt));
7156 if (nt < 0 || nt >
TBLNT)
7157 ERRMSG(
"nt out of range!");
7158 tbl->
nt[id][ig][ip] = nt;
7160 memcpy(tbl->
t[
id][ig][ip], cur, (
size_t) nt *
sizeof(
double));
7161 cur += ((size_t) nt *
sizeof(
double));
7163 for (
int it = 0; it < nt; it++) {
7166 memcpy(&nu, cur,
sizeof(nu));
7169 if (nu < 0 || nu >
TBLNU)
7170 ERRMSG(
"nu out of range!");
7171 tbl->
nu[id][ig][ip][it] = nu;
7178 memcpy(tbl->
logu[
id][ig][ip][it], cur, (
size_t) nu *
sizeof(
float));
7179 cur += ((size_t) nu *
sizeof(
float));
7181 memcpy(tbl->
logeps[
id][ig][ip][it], cur, (
size_t) nu *
sizeof(
float));
7182 cur += ((size_t) nu *
sizeof(
float));
7188 memcpy(&n, cur,
sizeof(n));
7192 ERRMSG(
"Missing or invalid filter function (filt_n) in packed table!");
7195 memcpy(tbl->
filt_nu[
id], cur, (
size_t) n *
sizeof(
double));
7196 cur += ((size_t) n *
sizeof(
double));
7198 memcpy(tbl->
filt_f[
id], cur, (
size_t) n *
sizeof(
double));
7199 cur += ((size_t) n *
sizeof(
double));
7201 return (
size_t) (cur - buf);
7213 const double remain,
7225 t1.tm_year = year - 1900;
7226 t1.tm_mon = mon - 1;
7232 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
7245 static int ct_name[
NTIMER], iname = -1, igroup = -1, nname, ngroup;
7248 t1 = omp_get_wtime();
7249 const double dt = t1 - t0;
7253 rt_name[iname] += dt;
7254 rt_sq[iname] +=
POW2(dt);
7255 rt_min[iname] = (ct_name[iname] <= 0 ? dt :
MIN(rt_min[iname], dt));
7256 rt_max[iname] = (ct_name[iname] <= 0 ? dt :
MAX(rt_max[iname], dt));
7260 rt_group[igroup] += dt;
7264 for (
int i = 0; i < nname; i++) {
7265 const double mean = rt_name[i] / ct_name[i];
7266 const double variance =
MAX(0.0, rt_sq[i] / ct_name[i] -
POW2(mean));
7268 "TIMER_%s = %.3f s (min= %g s, mean= %g s, stddev= %g s, max= %g s, n= %d)",
7269 names[i], rt_name[i], rt_min[i], mean, sqrt(variance), rt_max[i],
7272 for (
int i = 0; i < ngroup; i++)
7273 LOG(1,
"TIMER_GROUP_%s = %.3f s", groups[i], rt_group[i]);
7275 for (
int i = 0; i < nname; i++)
7276 total += rt_name[i];
7277 LOG(1,
"TIMER_TOTAL = %.3f s", total);
7281 for (iname = 0; iname < nname; iname++)
7282 if (strcasecmp(name, names[iname]) == 0)
7284 for (igroup = 0; igroup < ngroup; igroup++)
7285 if (strcasecmp(group, groups[igroup]) == 0)
7289 if (iname >= nname) {
7290 sprintf(names[iname],
"%s", name);
7292 ERRMSG(
"Too many timers!");
7296 if (igroup >= ngroup) {
7297 sprintf(groups[igroup],
"%s", group);
7298 if ((++ngroup) >=
NTIMER)
7299 ERRMSG(
"Too many groups!");
7309 const char *dirname,
7310 const char *filename,
7317 if (dirname != NULL)
7318 sprintf(file,
"%s/%s", dirname, filename);
7320 sprintf(file,
"%s", filename);
7323 LOG(1,
"Write atmospheric data: %s", file);
7330 else if (ctl->
atmfmt == 2)
7334 else if (ctl->
atmfmt == 3)
7339 ERRMSG(
"Unknown file format, check ATMFMT!");
7343 LOG(2,
"Number of data points: %d", atm->
np);
7344 gsl_stats_minmax(&mini, &maxi, atm->
time, 1, (
size_t) atm->
np);
7345 LOG(2,
"Time range: %.2f ... %.2f s", mini, maxi);
7346 gsl_stats_minmax(&mini, &maxi, atm->
z, 1, (
size_t) atm->
np);
7347 LOG(2,
"Altitude range: %g ... %g km", mini, maxi);
7348 gsl_stats_minmax(&mini, &maxi, atm->
lon, 1, (
size_t) atm->
np);
7349 LOG(2,
"Longitude range: %g ... %g deg", mini, maxi);
7350 gsl_stats_minmax(&mini, &maxi, atm->
lat, 1, (
size_t) atm->
np);
7351 LOG(2,
"Latitude range: %g ... %g deg", mini, maxi);
7352 gsl_stats_minmax(&mini, &maxi, atm->
p, 1, (
size_t) atm->
np);
7353 LOG(2,
"Pressure range: %g ... %g hPa", maxi, mini);
7354 gsl_stats_minmax(&mini, &maxi, atm->
t, 1, (
size_t) atm->
np);
7355 LOG(2,
"Temperature range: %g ... %g K", mini, maxi);
7356 for (
int ig = 0; ig < ctl->
ng; ig++) {
7357 gsl_stats_minmax(&mini, &maxi, atm->
q[ig], 1, (
size_t) atm->
np);
7358 LOG(2,
"Emitter %s range: %g ... %g ppv", ctl->
emitter[ig], mini, maxi);
7360 for (
int iw = 0; iw < ctl->
nw; iw++) {
7361 gsl_stats_minmax(&mini, &maxi, atm->
k[iw], 1, (
size_t) atm->
np);
7362 LOG(2,
"Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
7365 LOG(2,
"Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
7368 LOG(2,
"Cloud layer: none");
7371 "Surface: T_s = %g K | eps= %g ... %g",
7374 LOG(2,
"Surface: none");
7380 const char *filename,
7388 if (!(out = fopen(filename,
"w")))
7389 ERRMSG(
"Cannot create file!");
7393 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
7394 "# $2 = altitude [km]\n"
7395 "# $3 = longitude [deg]\n"
7396 "# $4 = latitude [deg]\n"
7397 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
7398 for (
int ig = 0; ig < ctl->
ng; ig++)
7399 fprintf(out,
"# $%d = %s volume mixing ratio [ppv]\n",
7401 for (
int iw = 0; iw < ctl->
nw; iw++)
7402 fprintf(out,
"# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
7404 fprintf(out,
"# $%d = cloud layer height [km]\n", ++n);
7405 fprintf(out,
"# $%d = cloud layer depth [km]\n", ++n);
7406 for (
int icl = 0; icl < ctl->
ncl; icl++)
7407 fprintf(out,
"# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
7408 ++n, ctl->
clnu[icl]);
7411 fprintf(out,
"# $%d = surface temperature [K]\n", ++n);
7412 for (
int isf = 0; isf < ctl->
nsf; isf++)
7413 fprintf(out,
"# $%d = surface emissivity (%.4f cm^-1)\n",
7414 ++n, ctl->
sfnu[isf]);
7418 for (
int ip = 0; ip < atm->
np; ip++) {
7419 if (ip == 0 || atm->
time[ip] != atm->
time[ip - 1])
7421 fprintf(out,
"%.2f %g %g %g %g %g", atm->
time[ip], atm->
z[ip],
7422 atm->
lon[ip], atm->
lat[ip], atm->
p[ip], atm->
t[ip]);
7423 for (
int ig = 0; ig < ctl->
ng; ig++)
7424 fprintf(out,
" %g", atm->
q[ig][ip]);
7425 for (
int iw = 0; iw < ctl->
nw; iw++)
7426 fprintf(out,
" %g", atm->
k[iw][ip]);
7428 fprintf(out,
" %g %g", atm->
clz, atm->
cldz);
7429 for (
int icl = 0; icl < ctl->
ncl; icl++)
7430 fprintf(out,
" %g", atm->
clk[icl]);
7433 fprintf(out,
" %g", atm->
sft);
7434 for (
int isf = 0; isf < ctl->
nsf; isf++)
7435 fprintf(out,
" %g", atm->
sfeps[isf]);
7447 const char *filename,
7453 if (!(out = fopen(filename,
"w")))
7454 ERRMSG(
"Cannot create file!");
7474 size_t np = (size_t) atm->
np;
7496 for (
int ig = 0; ig < ctl->
ng; ig++)
7500 for (
int iw = 0; iw < ctl->
nw; iw++)
7531 const char *filename,
7536 char longname[
LEN], varname[
LEN];
7538 int ncid, varid, dim_profile, dim_level;
7543 if (atm->
np < 1 || atm->
np >
NP)
7544 ERRMSG(
"Number of levels out of range!");
7547 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
7548 NC(nc_create(filename, NC_NETCDF4, &ncid));
7551 int r = nc_redef(ncid);
7552 if (r != NC_NOERR && r != NC_EINDEFINE)
7556 if (nc_inq_dimid(ncid,
"profile", &dim_profile) != NC_NOERR)
7557 NC(nc_def_dim(ncid,
"profile", NC_UNLIMITED, &dim_profile));
7560 if (nc_inq_dimid(ncid,
"level", &dim_level) == NC_NOERR) {
7561 NC(nc_inq_dimlen(ncid, dim_level, &level_max));
7562 if (level_max < 1 || level_max > (
size_t)
NP)
7563 ERRMSG(
"netCDF dimension level is out of range!");
7564 if ((
size_t) atm->
np > level_max)
7565 ERRMSG(
"profile has too many levels!");
7567 level_max = (size_t) atm->
np;
7568 NC(nc_def_dim(ncid,
"level", level_max, &dim_level));
7572 int dimids[2] = { dim_profile, dim_level };
7575 const int deflate_level = 0;
7576 const int quant_digits = 0;
7579 if (nc_inq_varid(ncid,
"nlev", &varid) != NC_NOERR)
7581 "number of vertical levels",
"1", 0, 0);
7584 if (nc_inq_varid(ncid,
"time", &varid) != NC_NOERR)
7586 "time in seconds since 2000-01-01, 00:00 UTC",
"s",
7589 if (nc_inq_varid(ncid,
"z", &varid) != NC_NOERR)
7590 NC_DEF_VAR(
"z", NC_DOUBLE, 2, dimids,
"altitude",
"km", deflate_level, 0);
7592 if (nc_inq_varid(ncid,
"lon", &varid) != NC_NOERR)
7594 "longitude",
"degrees_east", deflate_level, 0);
7596 if (nc_inq_varid(ncid,
"lat", &varid) != NC_NOERR)
7598 "latitude",
"degrees_north", deflate_level, 0);
7600 if (nc_inq_varid(ncid,
"p", &varid) != NC_NOERR)
7602 "pressure",
"hPa", deflate_level, quant_digits);
7604 if (nc_inq_varid(ncid,
"t", &varid) != NC_NOERR)
7606 "temperature",
"K", deflate_level, quant_digits);
7609 for (
int ig = 0; ig < ctl->
ng; ig++)
7610 if (nc_inq_varid(ncid, ctl->
emitter[ig], &varid) != NC_NOERR) {
7611 sprintf(longname,
"%s volume mixing ratio", ctl->
emitter[ig]);
7613 longname,
"ppv", deflate_level, quant_digits);
7617 for (
int iw = 0; iw < ctl->
nw; iw++) {
7618 sprintf(varname,
"ext_win_%d", iw);
7619 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7620 sprintf(longname,
"extinction (window %d)", iw);
7622 longname,
"km**-1", deflate_level, quant_digits);
7628 if (nc_inq_varid(ncid,
"cld_z", &varid) != NC_NOERR)
7630 "cloud layer height",
"km", deflate_level, quant_digits);
7632 if (nc_inq_varid(ncid,
"cld_dz", &varid) != NC_NOERR)
7634 "cloud layer depth",
"km", deflate_level, quant_digits);
7636 for (
int icl = 0; icl < ctl->
ncl; icl++) {
7637 sprintf(varname,
"cld_k_%.4f", ctl->
clnu[icl]);
7638 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7639 sprintf(longname,
"cloud layer extinction (%.4f cm^-1)",
7641 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname,
"km**-1",
7642 deflate_level, quant_digits);
7649 if (nc_inq_varid(ncid,
"srf_t", &varid) != NC_NOERR)
7651 "surface temperature",
"K", deflate_level, quant_digits);
7653 for (
int isf = 0; isf < ctl->
nsf; isf++) {
7654 sprintf(varname,
"srf_eps_%.4f", ctl->
sfnu[isf]);
7655 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
7656 sprintf(longname,
"surface emissivity (%.4f cm^-1)", ctl->
sfnu[isf]);
7657 NC_DEF_VAR(varname, NC_DOUBLE, 1, dimids, longname,
"1",
7658 deflate_level, quant_digits);
7664 NC(nc_enddef(ncid));
7667 size_t start[2] = { (size_t) profile, 0 };
7668 size_t count[2] = { 1, (size_t) atm->
np };
7682 for (
int ig = 0; ig < ctl->
ng; ig++)
7686 for (
int iw = 0; iw < ctl->
nw; iw++) {
7687 sprintf(varname,
"ext_win_%d", iw);
7695 for (
int icl = 0; icl < ctl->
ncl; icl++) {
7696 sprintf(varname,
"cld_k_%.4f", ctl->
clnu[icl]);
7704 for (
int isf = 0; isf < ctl->
nsf; isf++) {
7705 sprintf(varname,
"srf_eps_%.4f", ctl->
sfnu[isf]);
7718 const char *filename,
7723 LOG(1,
"Write RFM data: %s", filename);
7727 if (!(out = fopen(filename,
"w")))
7728 ERRMSG(
"Cannot create file!");
7731 fprintf(out,
"%d\n", atm->
np);
7732 fprintf(out,
"*HGT [km]\n");
7733 for (
int ip = 0; ip < atm->
np; ip++)
7734 fprintf(out,
"%g\n", atm->
z[ip]);
7735 fprintf(out,
"*PRE [mb]\n");
7736 for (
int ip = 0; ip < atm->
np; ip++)
7737 fprintf(out,
"%g\n", atm->
p[ip]);
7738 fprintf(out,
"*TEM [K]\n");
7739 for (
int ip = 0; ip < atm->
np; ip++)
7740 fprintf(out,
"%g\n", atm->
t[ip]);
7741 for (
int ig = 0; ig < ctl->
ng; ig++) {
7742 fprintf(out,
"*%s [ppmv]\n", ctl->
emitter[ig]);
7743 for (
int ip = 0; ip < atm->
np; ip++)
7744 fprintf(out,
"%g\n", atm->
q[ig][ip] * 1e6);
7746 fprintf(out,
"*END\n");
7755 const char *dirname,
7756 const char *filename,
7758 const gsl_matrix *matrix,
7761 const char *rowspace,
7762 const char *colspace,
7773 rowspace, colspace, sort);
7782 rowspace, colspace, sort, dataset);
7786 ERRMSG(
"Unknown matrix file format, check MATRIXFMT!");
7792 const char *dirname,
7793 const char *filename,
7795 const gsl_matrix *matrix,
7798 const char *rowspace,
7799 const char *colspace,
7802 char file[
LEN], quantity[
LEN];
7804 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
7806 size_t i, j, nc, nr;
7827 if (dirname != NULL)
7828 sprintf(file,
"%s/%s", dirname, filename);
7830 sprintf(file,
"%s", filename);
7833 LOG(1,
"Write matrix: %s", file);
7837 if (!(out = fopen(file,
"w")))
7838 ERRMSG(
"Cannot create file!");
7841 if (rowspace[0] ==
'y') {
7844 "# $1 = Row: index (measurement space)\n"
7845 "# $2 = Row: channel wavenumber [cm^-1]\n"
7846 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7847 "# $4 = Row: view point altitude [km]\n"
7848 "# $5 = Row: view point longitude [deg]\n"
7849 "# $6 = Row: view point latitude [deg]\n");
7852 nr =
obs2y(ctl, obs, NULL, rida, rira);
7857 "# $1 = Row: index (state space)\n"
7858 "# $2 = Row: name of quantity\n"
7859 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
7860 "# $4 = Row: altitude [km]\n"
7861 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
7864 nr =
atm2x(ctl, atm, NULL, riqa, ripa);
7868 if (colspace[0] ==
'y') {
7871 "# $7 = Col: index (measurement space)\n"
7872 "# $8 = Col: channel wavenumber [cm^-1]\n"
7873 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7874 "# $10 = Col: view point altitude [km]\n"
7875 "# $11 = Col: view point longitude [deg]\n"
7876 "# $12 = Col: view point latitude [deg]\n");
7879 nc =
obs2y(ctl, obs, NULL, cida, cira);
7884 "# $7 = Col: index (state space)\n"
7885 "# $8 = Col: name of quantity\n"
7886 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
7887 "# $10 = Col: altitude [km]\n"
7888 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
7891 nc =
atm2x(ctl, atm, NULL, ciqa, cipa);
7895 fprintf(out,
"# $13 = Matrix element\n\n");
7899 while (i < nr && j < nc) {
7902 if (rowspace[0] ==
'y')
7903 fprintf(out,
"%d %.4f %.2f %g %g %g",
7904 (
int) i, ctl->
nu[rida[i]],
7905 obs->
time[rira[i]], obs->
vpz[rira[i]],
7909 fprintf(out,
"%d %s %.2f %g %g %g", (
int) i, quantity,
7910 atm->
time[ripa[i]], atm->
z[ripa[i]],
7911 atm->
lon[ripa[i]], atm->
lat[ripa[i]]);
7915 if (colspace[0] ==
'y')
7916 fprintf(out,
" %d %.4f %.2f %g %g %g",
7917 (
int) j, ctl->
nu[cida[j]],
7918 obs->
time[cira[j]], obs->
vpz[cira[j]],
7922 fprintf(out,
" %d %s %.2f %g %g %g", (
int) j, quantity,
7923 atm->
time[cipa[j]], atm->
z[cipa[j]],
7924 atm->
lon[cipa[j]], atm->
lat[cipa[j]]);
7928 fprintf(out,
" %g\n", gsl_matrix_get(matrix, i, j));
7931 if (sort[0] ==
'r') {
7965 const char *dirname,
7966 const char *filename,
7967 const gsl_matrix *matrix) {
7970 const size_t nr = matrix->size1;
7971 const size_t nc = matrix->size2;
7974 if (dirname != NULL)
7975 sprintf(file,
"%s/%s", dirname, filename);
7977 sprintf(file,
"%s", filename);
7980 LOG(1,
"Write matrix: %s", file);
7984 if (!(out = fopen(file,
"w")))
7985 ERRMSG(
"Cannot create file!");
7999 for (
size_t i = 0; i < nr; i++)
8000 for (
size_t j = 0; j < nc; j++) {
8001 double value = gsl_matrix_get(matrix, i, j);
8014 const char *dirname,
8015 const char *filename,
8017 const gsl_matrix *matrix,
8020 const char *rowspace,
8021 const char *colspace,
8027 const size_t name_strlen = 100;
8029 int ncid, dimid_dataset, dimid_row, dimid_col, dimid_name, varid;
8030 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
8032 size_t nr = matrix->size1, nc = matrix->size2, naux;
8053 if (dirname != NULL)
8054 sprintf(file,
"%s/%s", dirname, filename);
8056 sprintf(file,
"%s", filename);
8059 LOG(1,
"Write matrix: %s", file);
8062 if (nc_open(file, NC_WRITE, &ncid) != NC_NOERR)
8063 NC(nc_create(file, NC_NETCDF4, &ncid));
8066 int r = nc_redef(ncid);
8067 if (r != NC_NOERR && r != NC_EINDEFINE)
8071 if (nc_inq_dimid(ncid,
"dataset", &dimid_dataset) != NC_NOERR)
8072 NC(nc_def_dim(ncid,
"dataset", NC_UNLIMITED, &dimid_dataset));
8075 if (nc_inq_dimid(ncid,
"row", &dimid_row) == NC_NOERR) {
8076 NC(nc_inq_dimlen(ncid, dimid_row, &naux));
8078 ERRMSG(
"matrix row dimension is incompatible!");
8080 NC(nc_def_dim(ncid,
"row", nr, &dimid_row));
8083 if (nc_inq_dimid(ncid,
"col", &dimid_col) == NC_NOERR) {
8084 NC(nc_inq_dimlen(ncid, dimid_col, &naux));
8086 ERRMSG(
"matrix col dimension is incompatible!");
8088 NC(nc_def_dim(ncid,
"col", nc, &dimid_col));
8091 if (nc_inq_dimid(ncid,
"name_strlen", &dimid_name) == NC_NOERR) {
8092 NC(nc_inq_dimlen(ncid, dimid_name, &naux));
8093 if (naux != name_strlen)
8094 ERRMSG(
"matrix name_strlen dimension is incompatible!");
8096 NC(nc_def_dim(ncid,
"name_strlen", name_strlen, &dimid_name));
8099 int dimids3[3] = { dimid_dataset, dimid_row, dimid_col };
8100 int dimids1[1] = { dimid_dataset };
8101 int dimids2_row[2] = { dimid_dataset, dimid_row };
8102 int dimids2_col[2] = { dimid_dataset, dimid_col };
8103 int dimids3_rowname[3] = { dimid_dataset, dimid_row, dimid_name };
8104 int dimids3_colname[3] = { dimid_dataset, dimid_col, dimid_name };
8105 if (nc_inq_varid(ncid,
"matrix", &varid) != NC_NOERR) {
8106 NC(nc_def_var(ncid,
"matrix", NC_DOUBLE, 3, dimids3, &varid));
8107 NC(nc_put_att_text(ncid, varid,
"long_name", 14,
"matrix element"));
8108 NC(nc_put_att_text(ncid, varid,
"units", 1,
"1"));
8110 if (nc_inq_varid(ncid,
"rowspace", &varid) != NC_NOERR)
8112 "row space selector",
"1", 0, 0);
8113 if (nc_inq_varid(ncid,
"colspace", &varid) != NC_NOERR)
8115 "column space selector",
"1", 0, 0);
8116 if (nc_inq_varid(ncid,
"sort", &varid) != NC_NOERR)
8118 "matrix sort selector",
"1", 0, 0);
8119 if (nc_inq_varid(ncid,
"row_nu", &varid) != NC_NOERR)
8120 NC_DEF_VAR(
"row_nu", NC_DOUBLE, 2, dimids2_row,
8121 "row channel wavenumber",
"cm^-1", 0, 0);
8122 if (nc_inq_varid(ncid,
"row_time", &varid) != NC_NOERR)
8123 NC_DEF_VAR(
"row_time", NC_DOUBLE, 2, dimids2_row,
8124 "row time since 2000-01-01T00:00Z",
"s", 0, 0);
8125 if (nc_inq_varid(ncid,
"row_z", &varid) != NC_NOERR)
8126 NC_DEF_VAR(
"row_z", NC_DOUBLE, 2, dimids2_row,
8127 "row altitude",
"km", 0, 0);
8128 if (nc_inq_varid(ncid,
"row_lon", &varid) != NC_NOERR)
8129 NC_DEF_VAR(
"row_lon", NC_DOUBLE, 2, dimids2_row,
8130 "row longitude",
"degrees_east", 0, 0);
8131 if (nc_inq_varid(ncid,
"row_lat", &varid) != NC_NOERR)
8132 NC_DEF_VAR(
"row_lat", NC_DOUBLE, 2, dimids2_row,
8133 "row latitude",
"degrees_north", 0, 0);
8134 if (nc_inq_varid(ncid,
"row_quantity", &varid) != NC_NOERR)
8135 NC_DEF_VAR(
"row_quantity", NC_CHAR, 3, dimids3_rowname,
8136 "row state quantity name",
"1", 0, 0);
8137 if (nc_inq_varid(ncid,
"col_nu", &varid) != NC_NOERR)
8138 NC_DEF_VAR(
"col_nu", NC_DOUBLE, 2, dimids2_col,
8139 "column channel wavenumber",
"cm^-1", 0, 0);
8140 if (nc_inq_varid(ncid,
"col_time", &varid) != NC_NOERR)
8141 NC_DEF_VAR(
"col_time", NC_DOUBLE, 2, dimids2_col,
8142 "column time since 2000-01-01T00:00Z",
"s", 0, 0);
8143 if (nc_inq_varid(ncid,
"col_z", &varid) != NC_NOERR)
8144 NC_DEF_VAR(
"col_z", NC_DOUBLE, 2, dimids2_col,
8145 "column altitude",
"km", 0, 0);
8146 if (nc_inq_varid(ncid,
"col_lon", &varid) != NC_NOERR)
8147 NC_DEF_VAR(
"col_lon", NC_DOUBLE, 2, dimids2_col,
8148 "column longitude",
"degrees_east", 0, 0);
8149 if (nc_inq_varid(ncid,
"col_lat", &varid) != NC_NOERR)
8150 NC_DEF_VAR(
"col_lat", NC_DOUBLE, 2, dimids2_col,
8151 "column latitude",
"degrees_north", 0, 0);
8152 if (nc_inq_varid(ncid,
"col_quantity", &varid) != NC_NOERR)
8153 NC_DEF_VAR(
"col_quantity", NC_CHAR, 3, dimids3_colname,
8154 "column state quantity name",
"1", 0, 0);
8157 NC(nc_enddef(ncid));
8160 size_t start1[1] = { (size_t) dataset };
8161 size_t count1[1] = { 1 };
8162 NC(nc_inq_varid(ncid,
"rowspace", &varid));
8163 NC(nc_put_vara_text(ncid, varid, start1, count1, rowspace));
8164 NC(nc_inq_varid(ncid,
"colspace", &varid));
8165 NC(nc_put_vara_text(ncid, varid, start1, count1, colspace));
8166 NC(nc_inq_varid(ncid,
"sort", &varid));
8167 NC(nc_put_vara_text(ncid, varid, start1, count1, sort));
8170 if (rowspace[0] ==
'y')
8171 nr =
obs2y(ctl, obs, NULL, rida, rira);
8173 nr =
atm2x(ctl, atm, NULL, riqa, ripa);
8174 if (colspace[0] ==
'y')
8175 nc =
obs2y(ctl, obs, NULL, cida, cira);
8177 nc =
atm2x(ctl, atm, NULL, ciqa, cipa);
8180 for (
size_t i = 0; i < nr; i++) {
8181 const double nu = rowspace[0] ==
'y' ? ctl->
nu[rida[i]] : GSL_NAN;
8183 rowspace[0] ==
'y' ? obs->
time[rira[i]] : atm->
time[ripa[i]];
8184 const double z = rowspace[0] ==
'y' ? obs->
vpz[rira[i]] : atm->
z[ripa[i]];
8186 rowspace[0] ==
'y' ? obs->
vplon[rira[i]] : atm->
lon[ripa[i]];
8188 rowspace[0] ==
'y' ? obs->
vplat[rira[i]] : atm->
lat[ripa[i]];
8189 char qbuf[
LEN] = { 0 };
8190 size_t start2[2] = { (size_t) dataset, i };
8191 size_t count2[2] = { 1, 1 };
8192 size_t start3n[3] = { (size_t) dataset, i, 0 };
8193 size_t count3n[3] = { 1, 1, name_strlen };
8195 if (rowspace[0] !=
'y') {
8197 snprintf(qbuf,
LEN,
"%s", quantity);
8200 NC(nc_inq_varid(ncid,
"row_nu", &varid));
8201 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8202 NC(nc_inq_varid(ncid,
"row_time", &varid));
8203 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8204 NC(nc_inq_varid(ncid,
"row_z", &varid));
8205 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8206 NC(nc_inq_varid(ncid,
"row_lon", &varid));
8207 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8208 NC(nc_inq_varid(ncid,
"row_lat", &varid));
8209 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8210 NC(nc_inq_varid(ncid,
"row_quantity", &varid));
8211 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8215 for (
size_t j = 0; j < nc; j++) {
8216 const double nu = colspace[0] ==
'y' ? ctl->
nu[cida[j]] : GSL_NAN;
8218 colspace[0] ==
'y' ? obs->
time[cira[j]] : atm->
time[cipa[j]];
8219 const double z = colspace[0] ==
'y' ? obs->
vpz[cira[j]] : atm->
z[cipa[j]];
8221 colspace[0] ==
'y' ? obs->
vplon[cira[j]] : atm->
lon[cipa[j]];
8223 colspace[0] ==
'y' ? obs->
vplat[cira[j]] : atm->
lat[cipa[j]];
8224 char qbuf[
LEN] = { 0 };
8225 size_t start2[2] = { (size_t) dataset, j };
8226 size_t count2[2] = { 1, 1 };
8227 size_t start3n[3] = { (size_t) dataset, j, 0 };
8228 size_t count3n[3] = { 1, 1, name_strlen };
8230 if (colspace[0] !=
'y') {
8232 snprintf(qbuf,
LEN,
"%s", quantity);
8235 NC(nc_inq_varid(ncid,
"col_nu", &varid));
8236 NC(nc_put_vara_double(ncid, varid, start2, count2, &nu));
8237 NC(nc_inq_varid(ncid,
"col_time", &varid));
8238 NC(nc_put_vara_double(ncid, varid, start2, count2, &time));
8239 NC(nc_inq_varid(ncid,
"col_z", &varid));
8240 NC(nc_put_vara_double(ncid, varid, start2, count2, &z));
8241 NC(nc_inq_varid(ncid,
"col_lon", &varid));
8242 NC(nc_put_vara_double(ncid, varid, start2, count2, &lon));
8243 NC(nc_inq_varid(ncid,
"col_lat", &varid));
8244 NC(nc_put_vara_double(ncid, varid, start2, count2, &lat));
8245 NC(nc_inq_varid(ncid,
"col_quantity", &varid));
8246 NC(nc_put_vara_text(ncid, varid, start3n, count3n, qbuf));
8250 NC(nc_inq_varid(ncid,
"matrix", &varid));
8251 for (
size_t i = 0; i < nr; i++)
8252 for (
size_t j = 0; j < nc; j++) {
8253 const double value = gsl_matrix_get(matrix, i, j);
8254 size_t start3[3] = { (size_t) dataset, i, j };
8255 size_t count3[3] = { 1, 1, 1 };
8256 NC(nc_put_vara_double(ncid, varid, start3, count3, &value));
8277 const char *dirname,
8278 const char *filename,
8285 if (dirname != NULL)
8286 sprintf(file,
"%s/%s", dirname, filename);
8288 sprintf(file,
"%s", filename);
8291 LOG(1,
"Write observation data: %s", file);
8298 else if (ctl->
obsfmt == 2)
8302 else if (ctl->
obsfmt == 3)
8307 LOG(2,
"Number of ray paths: %d", obs->
nr);
8308 gsl_stats_minmax(&mini, &maxi, obs->
time, 1, (
size_t) obs->
nr);
8309 LOG(2,
"Time range: %.2f ... %.2f s", mini, maxi);
8310 gsl_stats_minmax(&mini, &maxi, obs->
obsz, 1, (
size_t) obs->
nr);
8311 LOG(2,
"Observer altitude range: %g ... %g km", mini, maxi);
8312 gsl_stats_minmax(&mini, &maxi, obs->
obslon, 1, (
size_t) obs->
nr);
8313 LOG(2,
"Observer longitude range: %g ... %g deg", mini, maxi);
8314 gsl_stats_minmax(&mini, &maxi, obs->
obslat, 1, (
size_t) obs->
nr);
8315 LOG(2,
"Observer latitude range: %g ... %g deg", mini, maxi);
8316 gsl_stats_minmax(&mini, &maxi, obs->
vpz, 1, (
size_t) obs->
nr);
8317 LOG(2,
"View point altitude range: %g ... %g km", mini, maxi);
8318 gsl_stats_minmax(&mini, &maxi, obs->
vplon, 1, (
size_t) obs->
nr);
8319 LOG(2,
"View point longitude range: %g ... %g deg", mini, maxi);
8320 gsl_stats_minmax(&mini, &maxi, obs->
vplat, 1, (
size_t) obs->
nr);
8321 LOG(2,
"View point latitude range: %g ... %g deg", mini, maxi);
8322 gsl_stats_minmax(&mini, &maxi, obs->
tpz, 1, (
size_t) obs->
nr);
8323 LOG(2,
"Tangent point altitude range: %g ... %g km", mini, maxi);
8324 gsl_stats_minmax(&mini, &maxi, obs->
tplon, 1, (
size_t) obs->
nr);
8325 LOG(2,
"Tangent point longitude range: %g ... %g deg", mini, maxi);
8326 gsl_stats_minmax(&mini, &maxi, obs->
tplat, 1, (
size_t) obs->
nr);
8327 LOG(2,
"Tangent point latitude range: %g ... %g deg", mini, maxi);
8328 for (
int id = 0;
id < ctl->
nd;
id++) {
8329 gsl_stats_minmax(&mini, &maxi, obs->
rad[
id], 1, (
size_t) obs->
nr);
8331 LOG(2,
"Brightness temperature (%.4f cm^-1) range: %g ... %g K",
8332 ctl->
nu[
id], mini, maxi);
8334 LOG(2,
"Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
8335 ctl->
nu[
id], mini, maxi);
8338 for (
int id = 0;
id < ctl->
nd;
id++) {
8339 gsl_stats_minmax(&mini, &maxi, obs->
tau[
id], 1, (
size_t) obs->
nr);
8340 LOG(2,
"Transmittance (%.4f cm^-1) range: %g ... %g",
8341 ctl->
nu[
id], mini, maxi);
8348 const char *filename,
8356 if (!(out = fopen(filename,
"w")))
8357 ERRMSG(
"Cannot create file!");
8361 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
8362 "# $2 = observer altitude [km]\n"
8363 "# $3 = observer longitude [deg]\n"
8364 "# $4 = observer latitude [deg]\n"
8365 "# $5 = view point altitude [km]\n"
8366 "# $6 = view point longitude [deg]\n"
8367 "# $7 = view point latitude [deg]\n"
8368 "# $8 = tangent point altitude [km]\n"
8369 "# $9 = tangent point longitude [deg]\n"
8370 "# $10 = tangent point latitude [deg]\n");
8371 for (
int id = 0;
id < ctl->
nd;
id++)
8373 fprintf(out,
"# $%d = brightness temperature (%.4f cm^-1) [K]\n",
8376 fprintf(out,
"# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
8378 for (
int id = 0;
id < ctl->
nd;
id++)
8379 fprintf(out,
"# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
8383 for (
int ir = 0; ir < obs->
nr; ir++) {
8384 if (ir == 0 || obs->
time[ir] != obs->
time[ir - 1])
8386 fprintf(out,
"%.2f %g %g %g %g %g %g %g %g %g", obs->
time[ir],
8390 for (
int id = 0;
id < ctl->
nd;
id++)
8391 fprintf(out,
" %g", obs->
rad[
id][ir]);
8392 for (
int id = 0;
id < ctl->
nd;
id++)
8393 fprintf(out,
" %g", obs->
tau[
id][ir]);
8404 const char *filename,
8410 if (!(out = fopen(filename,
"w")))
8411 ERRMSG(
"Cannot create file!");
8422 size_t nr = (size_t) obs->
nr;
8456 for (
int id = 0;
id < ctl->
nd;
id++)
8460 for (
int id = 0;
id < ctl->
nd;
id++)
8472 const char *filename,
8475 const int profile) {
8477 char longname[
LEN], varname[
LEN];
8478 const char *spec_prefix = ctl->
write_bbt ?
"bt" :
"rad";
8480 int ncid, varid, dim_profile, dim_ray;
8485 if (obs->
nr < 1 || obs->
nr >
NR)
8486 ERRMSG(
"Number of ray paths out of range!");
8489 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR)
8490 NC(nc_create(filename, NC_NETCDF4, &ncid));
8493 int r = nc_redef(ncid);
8494 if (r != NC_NOERR && r != NC_EINDEFINE)
8498 if (nc_inq_dimid(ncid,
"profile", &dim_profile) != NC_NOERR)
8499 NC(nc_def_dim(ncid,
"profile", NC_UNLIMITED, &dim_profile));
8502 if (nc_inq_dimid(ncid,
"ray", &dim_ray) == NC_NOERR) {
8503 NC(nc_inq_dimlen(ncid, dim_ray, &ray_max));
8504 if (ray_max < 1 || ray_max > (
size_t)
NR)
8505 ERRMSG(
"netCDF dimension ray is out of range!");
8506 if ((
size_t) obs->
nr > ray_max)
8507 ERRMSG(
"profile has too many rays!");
8509 ray_max = (size_t) obs->
nr;
8510 NC(nc_def_dim(ncid,
"ray", ray_max, &dim_ray));
8514 int dimids[2] = { dim_profile, dim_ray };
8517 const int deflate_level = 0;
8518 const int quant_digits = 0;
8521 if (nc_inq_varid(ncid,
"nray", &varid) != NC_NOERR)
8522 NC_DEF_VAR(
"nray", NC_INT, 1, dimids,
"number of ray paths",
"1", 0, 0);
8525 if (nc_inq_varid(ncid,
"time", &varid) != NC_NOERR)
8527 "time in seconds since 2000-01-01, 00:00 UTC",
"s",
8530 if (nc_inq_varid(ncid,
"obs_z", &varid) != NC_NOERR)
8532 "observer altitude",
"km", deflate_level, 0);
8534 if (nc_inq_varid(ncid,
"obs_lon", &varid) != NC_NOERR)
8536 "observer longitude",
"degrees_east", deflate_level, 0);
8538 if (nc_inq_varid(ncid,
"obs_lat", &varid) != NC_NOERR)
8540 "observer latitude",
"degrees_north", deflate_level, 0);
8542 if (nc_inq_varid(ncid,
"vp_z", &varid) != NC_NOERR)
8544 "view point altitude",
"km", deflate_level, 0);
8546 if (nc_inq_varid(ncid,
"vp_lon", &varid) != NC_NOERR)
8548 "view point longitude",
"degrees_east", deflate_level, 0);
8550 if (nc_inq_varid(ncid,
"vp_lat", &varid) != NC_NOERR)
8552 "view point latitude",
"degrees_north", deflate_level, 0);
8554 if (nc_inq_varid(ncid,
"tp_z", &varid) != NC_NOERR)
8556 "tangent point altitude",
"km", deflate_level, 0);
8558 if (nc_inq_varid(ncid,
"tp_lon", &varid) != NC_NOERR)
8560 "tangent point longitude",
"degrees_east", deflate_level, 0);
8562 if (nc_inq_varid(ncid,
"tp_lat", &varid) != NC_NOERR)
8564 "tangent point latitude",
"degrees_north", deflate_level, 0);
8567 for (
int id = 0;
id < ctl->
nd;
id++) {
8569 sprintf(varname,
"%s_%.4f", spec_prefix, ctl->
nu[
id]);
8570 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8572 sprintf(longname,
"brightness temperature (%.4f cm^-1)", ctl->
nu[
id]);
8573 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
"K",
8574 deflate_level, quant_digits);
8576 sprintf(longname,
"radiance (%.4f cm^-1)", ctl->
nu[
id]);
8577 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
8578 "W/(m^2 sr cm^-1)", deflate_level, quant_digits);
8582 sprintf(varname,
"tau_%.4f", ctl->
nu[
id]);
8583 if (nc_inq_varid(ncid, varname, &varid) != NC_NOERR) {
8584 sprintf(longname,
"transmittance (%.4f cm^-1)", ctl->
nu[
id]);
8585 NC_DEF_VAR(varname, NC_DOUBLE, 2, dimids, longname,
"1",
8586 deflate_level, quant_digits);
8591 NC(nc_enddef(ncid));
8594 size_t start[2] = { (size_t) profile, 0 };
8595 size_t count[2] = { 1, (size_t) obs->
nr };
8599 NC(nc_inq_varid(ncid,
"nray", &varid));
8600 NC(nc_put_vara_int(ncid, varid, start, count, &nr));
8603 NC(nc_inq_varid(ncid,
"time", &varid));
8604 NC(nc_put_vara_double(ncid, varid, start, count, obs->
time));
8606 NC(nc_inq_varid(ncid,
"obs_z", &varid));
8607 NC(nc_put_vara_double(ncid, varid, start, count, obs->
obsz));
8609 NC(nc_inq_varid(ncid,
"obs_lon", &varid));
8610 NC(nc_put_vara_double(ncid, varid, start, count, obs->
obslon));
8612 NC(nc_inq_varid(ncid,
"obs_lat", &varid));
8613 NC(nc_put_vara_double(ncid, varid, start, count, obs->
obslat));
8615 NC(nc_inq_varid(ncid,
"vp_z", &varid));
8616 NC(nc_put_vara_double(ncid, varid, start, count, obs->
vpz));
8618 NC(nc_inq_varid(ncid,
"vp_lon", &varid));
8619 NC(nc_put_vara_double(ncid, varid, start, count, obs->
vplon));
8621 NC(nc_inq_varid(ncid,
"vp_lat", &varid));
8622 NC(nc_put_vara_double(ncid, varid, start, count, obs->
vplat));
8624 NC(nc_inq_varid(ncid,
"tp_z", &varid));
8625 NC(nc_put_vara_double(ncid, varid, start, count, obs->
tpz));
8627 NC(nc_inq_varid(ncid,
"tp_lon", &varid));
8628 NC(nc_put_vara_double(ncid, varid, start, count, obs->
tplon));
8630 NC(nc_inq_varid(ncid,
"tp_lat", &varid));
8631 NC(nc_put_vara_double(ncid, varid, start, count, obs->
tplat));
8634 for (
int id = 0;
id < ctl->
nd;
id++) {
8635 sprintf(varname,
"%s_%.4f", spec_prefix, ctl->
nu[
id]);
8636 NC(nc_inq_varid(ncid, varname, &varid));
8637 NC(nc_put_vara_double(ncid, varid, start, count, obs->
rad[
id]));
8639 sprintf(varname,
"tau_%.4f", ctl->
nu[
id]);
8640 NC(nc_inq_varid(ncid, varname, &varid));
8641 NC(nc_put_vara_double(ncid, varid, start, count, obs->
tau[
id]));
8652 const char *filename,
8658 LOG(1,
"Write shape function: %s", filename);
8662 if (!(out = fopen(filename,
"w")))
8663 ERRMSG(
"Cannot create file!");
8667 "# $1 = shape function x-value [-]\n"
8668 "# $2 = shape function y-value [-]\n\n");
8671 for (
int i = 0; i < n; i++)
8672 fprintf(out,
"%.10g %.10g\n", x[i], y[i]);
8681 const char *quantity,
8685 const gsl_matrix *s) {
8688 const size_t n = s->size1;
8693 gsl_vector *x_aux = gsl_vector_alloc(n);
8696 for (
size_t i = 0; i < n; i++)
8697 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
8701 const char *dirname;
8703 const char *shared_file =
"-";
8705 x2atm(ctl, x_aux, atm_aux);
8706 if (strcmp(quantity,
"total") == 0)
8708 else if (strcmp(quantity,
"noise") == 0)
8710 else if (strcmp(quantity,
"formod") == 0)
8712 sprintf(filename,
"atm_err_%s.tab", quantity);
8713 const char *target =
8715 write_atm(dirname, target, ctl, atm_aux, profile);
8718 gsl_vector_free(x_aux);
8728 for (
int ig = 0; ig < ctl->
ng; ig++)
8729 for (
int id = 0;
id < ctl->
nd;
id++) {
8732 if (tbl->
np[
id][ig] <= 0) {
8733 WARN(
"Skip writing empty emissivity table: emitter=%s, nu=%.4f",
8743 else if (ctl->
tblfmt == 2)
8747 else if (ctl->
tblfmt == 3)
8756 for (
int id = 0;
id < ctl->
nd;
id++) {
8757 char filename[2 *
LEN];
8758 sprintf(filename,
"%s_%.4f.filt", ctl->
tblbase, ctl->
nu[
id]);
8773 char filename[2 *
LEN];
8774 sprintf(filename,
"%s_%.4f_%s.tab", ctl->
tblbase,
8779 if (!(out = fopen(filename,
"w"))) {
8780 ERRMSG(
"Cannot create emissivity table: %s", filename);
8782 LOG(1,
"Write emissivity table: %s", filename);
8786 "# $1 = pressure [hPa]\n"
8787 "# $2 = temperature [K]\n"
8788 "# $3 = column density [molecules/cm^2]\n"
8789 "# $4 = emissivity [-]\n");
8792 for (
int ip = 0; ip < tbl->
np[id][ig]; ip++)
8793 for (
int it = 0; it < tbl->
nt[id][ig][ip]; it++) {
8795 for (
int iu = 0; iu < tbl->
nu[id][ig][ip][it]; iu++)
8796 fprintf(out,
"%g %g %e %e\n",
8797 tbl->
p[
id][ig][ip], tbl->
t[
id][ig][ip][it],
8798 exp(tbl->
logu[
id][ig][ip][it][iu]),
8799 exp(tbl->
logeps[
id][ig][ip][it][iu]));
8815 char filename[2 *
LEN];
8816 sprintf(filename,
"%s_%.4f_%s.bin",
8821 if (!(out = fopen(filename,
"w"))) {
8822 ERRMSG(
"Cannot create emissivity table: %s", filename);
8824 LOG(1,
"Write emissivity table: %s", filename);
8829 uint8_t *work = NULL;
8830 ALLOC(work, uint8_t, need);
8831 tbl_pack(tbl,
id, ig, work, &used);
8833 ERRMSG(
"Internal error: packed size mismatch!");
8839 FWRITE(work, uint8_t, used, out);
8857 char filename[2 *
LEN];
8862 if (nc_open(filename, NC_WRITE, &ncid) != NC_NOERR) {
8863 if (nc_create(filename, NC_NETCDF4 | NC_CLOBBER, &ncid) != NC_NOERR)
8864 ERRMSG(
"Cannot open or create emissivity table: %s", filename);
8867 NC(nc_enddef(ncid));
8871 char varname[
LEN], dimname[
LEN];
8872 sprintf(varname,
"tbl_%.4f", ctl->
nu[
id]);
8873 sprintf(dimname,
"len_%.4f", ctl->
nu[
id]);
8876 LOG(1,
"Write emissivity table: %s in %s", varname, filename);
8881 uint8_t *work = NULL;
8882 ALLOC(work, uint8_t, need);
8885 tbl_pack(tbl,
id, ig, work, &used);
8887 ERRMSG(
"Internal error: packed size mismatch!");
8891 if (nc_inq_varid(ncid, varname, &tmp) == NC_NOERR)
8892 ERRMSG(
"Table already present!");
8897 NC(nc_def_dim(ncid, dimname, used, &dimid));
8898 int dimids[1] = { dimid };
8900 "Packed lookup table blob",
"1", 0, 0);
8901 NC(nc_enddef(ncid));
8904 NC(nc_put_var_uchar(ncid, varid, (
const unsigned char *) work));
8917 const gsl_vector *x,
8923 for (
int ip = 0; ip < atm->
np; ip++)
8928 for (
int ip = 0; ip < atm->
np; ip++)
8933 for (
int ig = 0; ig < ctl->
ng; ig++)
8934 for (
int ip = 0; ip < atm->
np; ip++)
8940 for (
int iw = 0; iw < ctl->
nw; iw++)
8941 for (
int ip = 0; ip < atm->
np; ip++)
8952 for (
int icl = 0; icl < ctl->
ncl; icl++)
8959 for (
int isf = 0; isf < ctl->
nsf; isf++)
8967 const gsl_vector *x,
8971 *value = gsl_vector_get(x, *n);
8979 const gsl_vector *y,
8985 for (
int ir = 0; ir < obs->
nr; ir++)
8986 for (
int id = 0;
id < ctl->
nd;
id++)
8987 if (isfinite(obs->
rad[
id][ir])) {
8988 obs->
rad[id][ir] = gsl_vector_get(y, m);
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.
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.
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.
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.
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.
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.
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
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.
void read_matrix_nc(const char *dirname, const char *filename, gsl_matrix *matrix, int dataset)
Read a numerical matrix from a netCDF file.
double cos_sza(const double sec, const double lon, const double lat)
Calculates the cosine of the solar zenith angle.
int 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.
void read_atm_bin(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in binary format.
void write_obs_asc(const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data to an ASCII text file.
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).
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
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).
double ctmo2(const double nu, const double p, const double t)
Compute Oâ‚‚ collision-induced absorption coefficient.
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.
void tbl_free(const ctl_t *ctl, tbl_t *tbl)
Free lookup table and all internally allocated memory.
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.
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.
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
void formod_continua(const ctl_t *ctl, const los_t *los, const int ip, double *beta)
Compute total extinction including gaseous continua.
void read_obs_bin(const char *filename, const ctl_t *ctl, obs_t *obs)
Read binary-formatted observation data from a file.
int shared_io_lock(const ret_t *ret)
Acquire an exclusive lock for shared retrieval output files.
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.
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 .
int formod_pencil(const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs, const int ir, los_t *los)
Compute line-of-sight radiances using the pencil-beam forward model.
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
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.
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.
void day2doy(int year, int mon, int day, int *doy)
Convert a calendar date to day-of-year.
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.
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.
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.
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Map retrieval state vector back to atmospheric structure.
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.
double ctmh2o(const double nu, const double p, const double t, const double q, const double u)
Compute the MT_CKD 4.1 water vapor continuum (optical depth).
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.
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).
void shared_io_unlock(int fd)
Release a shared retrieval output lock.
void write_atm_rfm(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric profile in RFM-compatible format.
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.
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.
void write_tbl(const ctl_t *ctl, const tbl_t *tbl)
Write emissivity lookup tables to disk.
size_t tbl_unpack(tbl_t *tbl, int id, int ig, const uint8_t *buf)
Unpack a lookup table from a contiguous binary buffer.
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.
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.
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
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.
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.
void timer_group(const char *name, const char *group, int output)
Aggregate wall-clock timings for named code phases.
void tangent_point(const los_t *los, double *tpz, double *tplon, double *tplat)
Determine the tangent point along a line of sight (LOS).
double ctmco2(const double nu, const double p, const double t, const double u)
Compute carbon dioxide continuum optical depth.
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.
int formod_fov(const ctl_t *ctl, obs_t *obs, obs_t *obs_scratch)
Apply field-of-view (FOV) convolution to modeled radiances.
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.
void write_atm_asc(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data to an ASCII file.
void write_matrix_bin(const char *dirname, const char *filename, const gsl_matrix *matrix)
Write a numerical matrix to a binary file.
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.
void formod_batch(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs, const int nbatch, int *status, los_t *los_scratch, obs_t *obs_scratch)
Execute the forward model for a batch of independent cases.
void write_obs_bin(const char *filename, const ctl_t *ctl, const obs_t *obs)
Write observation data in binary format to a file.
void x2atm_help(double *value, const gsl_vector *x, size_t *n)
Helper function to extract a single value from the retrieval state vector.
void cart2geo(const double *x, double *z, double *lon, double *lat)
Converts Cartesian coordinates to geographic coordinates.
void doy2day(int year, int doy, int *mon, int *day)
Convert a day-of-year value to a calendar date.
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.
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.
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize source function lookup tables from emissivity data.
void matrix_invert(gsl_matrix *a)
Invert a square matrix, optimized for diagonal or symmetric positive-definite matrices.
void read_ret(int argc, char *argv[], const ctl_t *ctl, ret_t *ret)
Read retrieval configuration and error parameters.
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.
void write_shape(const char *filename, const double *x, const double *y, const int n)
Write tabulated shape function data to a text file.
void read_atm_asc(const char *filename, const ctl_t *ctl, atm_t *atm)
Read atmospheric data in ASCII format.
void read_tbl_asc(const ctl_t *ctl, tbl_t *tbl, const int id, const int ig)
Read a single ASCII emissivity lookup table.
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.
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.
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.
void read_matrix_asc(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from an ASCII file.
tbl_t * read_tbl(const ctl_t *ctl)
Read emissivity lookup tables from disk.
void read_matrix_bin(const char *dirname, const char *filename, gsl_matrix *matrix)
Read a numerical matrix from a binary file.
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.
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.
void read_atm_nc(const char *filename, const ctl_t *ctl, atm_t *atm, int profile)
Read one atmospheric profile from a netCDF file.
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.
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.
void y2obs(const ctl_t *ctl, const gsl_vector *y, obs_t *obs)
Copy elements from the measurement vector y into the observation structure.
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
void read_shape(const char *filename, double *x, double *y, int *n)
Read a two-column shape function from an ASCII file.
double ctmn2(const double nu, const double p, const double t)
Compute Nâ‚‚ collision-induced absorption coefficient.
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.
void climatology(const ctl_t *ctl, atm_t *atm)
Initializes atmospheric climatology profiles.
void geo2cart(const double z, const double lon, const double lat, double *x)
Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates.
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.
const char * shared_io_output_file(const ret_t *ret)
Return the primary shared retrieval output file configured for locking.
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.
int formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs, los_t *los_scratch, obs_t *obs_scratch)
Execute one complete forward-model calculation.
size_t tbl_packed_size(const tbl_t *tbl, int id, int ig)
Compute required buffer size (in bytes) for tbl_pack().
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
void write_atm_bin(const char *filename, const ctl_t *ctl, const atm_t *atm)
Write atmospheric data to a binary file.
void read_obs_asc(const char *filename, const ctl_t *ctl, obs_t *obs)
Read ASCII-formatted observation data from a file.
JURASSIC library declarations.
#define N
Maximum size of state vector.
#define IDXCLZ
Index for cloud layer height.
#define LEN
Maximum length of ASCII data lines.
#define RE
Mean radius of Earth [km].
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
@ FORMOD_STATUS_TOO_MANY_LOS_POINTS
@ FORMOD_STATUS_FOV_DATA_MISSING
@ FORMOD_STATUS_OBSERVER_BELOW_SURFACE
#define P0
Standard pressure [hPa].
#define KB
Boltzmann constant [kg m^2/(K s^2)].
#define POW2(x)
Compute the square of a value.
#define NFOV
Number of ray paths used for FOV calculations.
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
#define NC_PUT_ATT_GLOBAL(attname, text)
Add a global text attribute to a NetCDF file.
#define NC(cmd)
Execute a NetCDF command and check for errors.
#define TBL_LOG(tbl, id, ig)
Log detailed statistics of an emissivity look-up table.
#define SELECT_TIMER(id, group)
Switch to a named aggregated timer.
#define DOTP(a, b)
Compute dot product of two 3D vectors.
#define O2
Oxygen concentration.
#define UMAX
Maximum column density [molecules/cm^2].
#define MIN(a, b)
Determine the minimum of two values.
#define IDXCLDZ
Index for cloud layer depth.
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
#define NC_PUT_INT(varname, ptr, hyperslab)
Write integer data to a NetCDF variable.
#define CLAMP(v, lo, hi)
Clamp a value to a specified range.
#define RFMNPTS
Maximum number of RFM spectral grid points.
#define IDXK(iw)
Indices for extinction.
#define M
Maximum size of measurement vector.
#define CO2_FIT(TIME)
Climatological CO2 volume mixing ratio as a quadratic function of time.
#define G0
Standard gravity [m/s^2].
#define NQ
Maximum number of quantities.
#define ND
Maximum number of radiance channels.
#define NA
Avogadro's number.
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
#define NSHAPE
Maximum number of shape function grid points.
#define IDXSFT
Index for surface layer temperature.
#define RI
Ideal gas constant [J/(mol K)].
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
#define IDXCLK(icl)
Indices for cloud layer extinction.
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
#define WARN(...)
Print a warning message with contextual information.
#define TBLNU
Maximum number of column densities per emissivity curve.
#define IDXP
Index for pressure.
#define ALLOC(ptr, type, n)
Allocate memory for an array.
#define DEG2RAD(deg)
Convert degrees to radians.
#define TSUN
Effective temperature of the sun [K].
#define RAD2DEG(rad)
Convert radians to degrees.
#define TBLNT
Maximum number of temperatures in emissivity tables.
#define NP
Maximum number of atmospheric data points.
#define NTIMER
Maximum number of aggregated timers.
#define PLANCK(T, nu)
Compute spectral radiance using Planck’s law.
#define REFRAC_EDLEN(p, T)
Compute dry-air refractivity (n - 1) with an Edlen-type relation.
#define NG
Maximum number of emitters.
#define EPSMAX
Maximum emissivity.
#define LOG(level,...)
Print a log message with a specified logging level.
#define TBLNS
Maximum number of source function temperature levels.
#define NC_DEF_VAR(varname, type, ndims, dims, long_name, units, level, quant)
Define a NetCDF variable with attributes.
#define N2
Nitrogen concentration.
#define TBLNP
Maximum number of pressure levels in emissivity tables.
#define NSF
Maximum number of surface layer spectral grid points.
#define NCL
Maximum number of cloud layer spectral grid points.
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
#define NC_PUT_DOUBLE(varname, ptr, hyperslab)
Write double precision data to a NetCDF variable.
#define FREAD(ptr, type, size, out)
Read binary data from a file.
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
#define NLOS
Maximum number of LOS points.
#define NR
Maximum number of ray paths.
#define IDXQ(ig)
Indices for volume mixing ratios.
#define TMAX
Maximum temperature for source function [K].
#define TMIN
Minimum temperature for source function [K].
#define NW
Maximum number of spectral windows.
#define MAX(a, b)
Determine the maximum of two values.
#define IDXT
Index for temperature.
Atmospheric profile data.
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
double sfeps[NSF]
Surface emissivity.
double k[NW][NP]
Extinction [km^-1].
double lat[NP]
Latitude [deg].
double lon[NP]
Longitude [deg].
double t[NP]
Temperature [K].
double clz
Cloud layer height [km].
int np
Number of data points.
double cldz
Cloud layer depth [km].
double sft
Surface temperature [K].
double z[NP]
Altitude [km].
double clk[NCL]
Cloud layer extinction [km^-1].
double q[NG][NP]
Volume mixing ratio [ppv].
double p[NP]
Pressure [hPa].
int write_matrix
Write matrix file (0=no, 1=yes).
int nw
Number of spectral windows.
int atmfmt
Atmospheric data file format (1=ASCII, 2=binary, 3=netCDF).
double retp_zmin
Minimum altitude for pressure retrieval [km].
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
int ig_co2
Emitter index of CO2.
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
char rfmhit[LEN]
HITRAN file for RFM.
char tblbase[LEN]
Basename for table files and filter function files.
char rfmbin[LEN]
Path to RFM binary.
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
double rett_zmax
Maximum altitude for temperature retrieval [km].
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
char fov[LEN]
Field-of-view data file.
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
int window[ND]
Window index of each channel.
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
int ng
Number of emitters.
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
int refrac
Take into account refractivity (0=no, 1=yes).
int ig_o2
Emitter index of O2.
double rett_zmin
Minimum altitude for temperature retrieval [km].
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
int nd
Number of radiance channels.
int fov_n
Field-of-view number of data points.
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
int matrixfmt
Matrix data file format (1=ASCII, 2=binary, 3=netCDF).
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
int ncl
Number of cloud layer spectral grid points.
int ig_n2
Emitter index of N2.
int obsfmt
Observation data file format (1=ASCII, 2=binary, 3=netCDF).
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
char emitter[NG][LEN]
Name of each emitter.
int nsf
Number of surface layer spectral grid points.
double rayds
Maximum step length for raytracing [km].
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
int ig_h2o
Emitter index of H2O.
int tblfmt
Look-up table file format (1=ASCII, 2=binary, 3=netCDF).
double raydz
Vertical step length for raytracing [km].
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
double fov_w[NSHAPE]
Field-of-view weighting factor.
double retp_zmax
Maximum altitude for pressure retrieval [km].
double z[NLOS]
Altitude [km].
double eps[NLOS][ND]
Segment emissivity.
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
double q[NLOS][NG]
Volume mixing ratio [ppv].
double sft
Surface temperature [K].
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
double lon[NLOS]
Longitude [deg].
double ds[NLOS]
Segment length [km].
int np
Number of LOS points.
double u[NLOS][NG]
Column density [molecules/cm^2].
double lat[NLOS]
Latitude [deg].
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
double k[NLOS][ND]
Extinction [km^-1].
double sfeps[ND]
Surface emissivity.
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
double t[NLOS]
Temperature [K].
double p[NLOS]
Pressure [hPa].
Observation geometry and radiance data.
double tau[ND][NR]
Transmittance of ray path.
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
double tplon[NR]
Tangent point longitude [deg].
double vpz[NR]
View point altitude [km].
double vplat[NR]
View point latitude [deg].
double obslon[NR]
Observer longitude [deg].
double obslat[NR]
Observer latitude [deg].
double obsz[NR]
Observer altitude [km].
double tplat[NR]
Tangent point latitude [deg].
double vplon[NR]
View point longitude [deg].
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
double tpz[NR]
Tangent point altitude [km].
int nr
Number of ray paths.
int mask[ND][NR]
Internal observation mask used by the forward model.
Retrieval control parameters.
char shared_io_atm_final_file[LEN]
Optional shared retrieved-atmosphere output file.
double err_press_cz
Vertical correlation length for pressure error [km].
double err_press
Pressure error [%].
char shared_io_atm_res_file[LEN]
Optional shared averaging-kernel resolution output file.
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
int err_ana
Carry out error analysis (0=no, 1=yes).
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
double err_temp_cz
Vertical correlation length for temperature error [km].
double err_formod[ND]
Forward model error [%].
char shared_io_matrix_cov_apr_file[LEN]
Optional shared a priori covariance output file.
double conv_dmin
Minimum normalized step size in state space.
double err_temp
Temperature error [K].
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
char shared_io_proflist[LEN]
Optional file containing retrieval profile indices.
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
double err_clz
Cloud height error [km].
double err_sft
Surface temperature error [K].
double err_clk[NCL]
Cloud extinction error [km^-1].
char shared_io_matrix_gain_file[LEN]
Optional shared gain matrix output file.
char shared_io_obs_meas_file[LEN]
Optional shared measured-observation input file.
char shared_io_matrix_cov_ret_file[LEN]
Optional shared retrieval covariance output file.
char shared_io_matrix_kernel_file[LEN]
Optional shared kernel matrix output file.
char shared_io_atm_apr_file[LEN]
Optional shared atmospheric a priori input file.
char shared_io_matrix_avk_file[LEN]
Optional shared averaging-kernel matrix output file.
double err_temp_ch
Horizontal correlation length for temperature error [km].
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
int conv_itmax
Maximum number of iterations.
char shared_io_atm_err_formod_file[LEN]
Optional shared forward-model retrieval-error output file.
double err_cldz
Cloud depth error [km].
double err_press_ch
Horizontal correlation length for pressure error [km].
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
char shared_io_matrix_corr_file[LEN]
Optional shared correlation matrix output file.
char shared_io_atm_err_total_file[LEN]
Optional shared total retrieval-error output file.
double err_q[NG]
Volume mixing ratio error [%].
char dir[LEN]
Working directory.
char shared_io_atm_err_noise_file[LEN]
Optional shared noise retrieval-error output file.
char shared_io_obs_final_file[LEN]
Optional shared retrieved-observation output file.
double err_sfeps[NSF]
Surface emissivity error.
char shared_io_atm_cont_file[LEN]
Optional shared averaging-kernel contribution output file.
int shared_io_profile
Profile index used for shared netCDF retrieval inputs and outputs.
double err_k[NW]
Extinction error [km^-1].
Emissivity look-up tables.
float * logu[ND][NG][TBLNP][TBLNT]
Logarithm of column density [molecules/cm^2].
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
double p[ND][NG][TBLNP]
Pressure [hPa].
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
int filt_n[ND]
Filter function number of spectral grid points.
int nt[ND][NG][TBLNP]
Number of temperatures.
float * logeps[ND][NG][TBLNP][TBLNT]
Logarithm of emissivity.
double filt_f[ND][NSHAPE]
Filter function values.
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
double lnp[ND][NG][TBLNP]
Log-pressure [hPa].
double st[TBLNS]
Source function temperature [K].
double filt_nu[ND][NSHAPE]
Filter function spectral grid points [cm^-1].
int np[ND][NG]
Number of pressure levels.