00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00034 #include <cmath>
00035 #include "arts.h"
00036 #include "matpackI.h"
00037 #include "array.h"
00038 #include "absorption.h"
00039
00040
00060 void lineshape_no_shape( Vector& ls _U_,
00061 Vector& X _U_,
00062 Numeric f0 _U_,
00063 Numeric gamma _U_,
00064 Numeric sigma _U_,
00065 VectorView f_grid _U_,
00066 const Index nf _U_)
00067 {
00068
00069 throw runtime_error("The no_shape lineshape is only a placeholder, but you tried\n"
00070 "to use it like a real lineshape.");
00071 }
00072
00073
00086 void lineshape_lorentz(Vector& ls,
00087 Vector& X _U_,
00088 Numeric f0,
00089 Numeric gamma,
00090 Numeric sigma _U_,
00091 VectorView f_grid,
00092 const Index nf)
00093 {
00094
00095
00096
00097 assert( nf==f_grid.nelem() );
00098
00099
00100 extern const Numeric PI;
00101
00102
00103
00104 Numeric gamma2 = gamma * gamma;
00105 Numeric fac = gamma/PI;
00106
00107 for ( Index i=0; i<nf; ++i )
00108 {
00109 ls[i] = fac / ( (f_grid[i]-f0) * (f_grid[i]-f0) + gamma2 );
00110 }
00111 }
00112
00125 void lineshape_doppler(Vector& ls,
00126 Vector& x _U_,
00127 Numeric f0,
00128 Numeric gamma _U_,
00129 Numeric sigma,
00130 VectorView f_grid,
00131 const Index nf)
00132 {
00133
00134
00135
00136 assert( nf==f_grid.nelem() );
00137
00138
00139 extern const Numeric PI;
00140 const Numeric sqrtPI = sqrt(PI);
00141
00142
00143
00144 Numeric sigma2 = sigma * sigma;
00145 Numeric fac = 1.0 / (sqrtPI * sigma);
00146
00147 for ( Index i=0; i<nf ; ++i )
00148 {
00149 ls[i] = fac * exp( - pow( f_grid[i]-f0, 2) / sigma2 );
00150 }
00151 }
00152
00153
00154
00155
00156
00157
00158 long bfun6_(Numeric y, Numeric x)
00159 {
00160
00161 long int ret_val;
00162
00163
00164 Numeric s = 0;
00165
00166
00167 s = fabs(x) + y;
00168 if (s >= 15.f) {
00169 ret_val = 1;
00170 } else if (s >= 5.5f) {
00171 ret_val = 2;
00172 } else if (y >= fabs(x) * .195f - .176f) {
00173 ret_val = 3;
00174 } else {
00175 ret_val = 4;
00176 }
00177 return ret_val;
00178 }
00179
00180
00181
00242 void lineshape_voigt_kuntz6(Vector& ls,
00243 Vector& x,
00244 Numeric f0,
00245 Numeric gamma,
00246 Numeric sigma,
00247 VectorView f_grid,
00248 const Index nf)
00249
00250 {
00251
00252
00253
00254 assert( nf==f_grid.nelem() );
00255
00256
00257
00258
00259
00260
00261 extern const Numeric PI;
00262
00263
00264 const Numeric sqrt_invPI = sqrt(1/PI);
00265
00266
00267 Numeric fac = 1.0 / sigma * sqrt_invPI;
00268
00269
00270
00271
00272 Numeric yps1 = -1.0;
00273 Numeric yps2 = -1.0;
00274 Numeric yps3 = -1.0;
00275 Numeric yps4 = -1.0;
00276
00277
00278 long int i__1, i__2;
00279 Numeric r__1;
00280
00281
00282 long int bmin = 0, lauf[16] = {0} , bmax;
00283 long int imin = 0, imax = 0, stack[80] = {0} ;
00284 Numeric a1, a2, a3, a4, a5, a6, a8, b8, c8, d8, e8, f8, g8, h8, a7,
00285 b7, c7, d7, e7, f7, o8, p8, q8, r8, s8, t8, g7, h7, o7, p7, q7,
00286 r7, s7, t7, b6, c6, d6, e6, b5, c5, d5, e5, b4, c4, d4, b3, c3,
00287 d3, b1, y2;
00288 a1 = a2 = a3 = a4 = a5 = a6 = a8 = b8 = c8 = d8 = e8 = f8 = g8 = h8 = a7
00289 = b7 = c7 = d7 = e7 = f7 = o8 = p8 = q8 = r8 = s8 = t8 = g7 = h7 = o7 = p7
00290 = q7 = r7 = s7 = t7 = b6 = c6 = d6 = e6 = b5 = c5 = d5 = e5 = b4 = c4 = d4
00291 = b3 = c3 = d3 = b1 = y2 = 0;
00292 long int i2 = 0, i1 = 0;
00293 Numeric x2 = 0, b2 = 0, c1 = 0;
00294 long int stackp = 0, imitte = 0;
00295 Numeric ym2 = 0;
00296
00297
00298
00299
00300
00301 Numeric y = gamma / sigma;
00302
00303
00304 for (i1=0; i1< (int) nf; i1++)
00305 {
00306 x[i1] = (f_grid[i1] - f0) / sigma;
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316 y2 = y * y;
00317 if (y >= 15.0 || x[0] >= 15.0 || x[nf-1] <= -15.0) {
00318 lauf[0] = 1;
00319 lauf[4] = nf;
00320 lauf[8] = nf;
00321 lauf[12] = 0;
00322 goto L7;
00323 }
00324 for (i2 = 1; i2 <= 4; ++i2) {
00325 for (i1 = 1; i1 <= 4; ++i1) {
00326 lauf[i1 + (i2 << 2) - 5] = i2 % 2 * (nf + 1);
00327
00328 }
00329 }
00330 stackp = 1;
00331 stack[stackp - 1] = 1;
00332 stack[stackp + 19] = nf;
00333 stack[stackp + 39] = bfun6_(y, x[0]);
00334 stack[stackp + 59] = bfun6_(y, x[nf-1]);
00335 L2:
00336 imin = stack[stackp - 1];
00337 imax = stack[stackp + 19];
00338 bmin = stack[stackp + 39];
00339 bmax = stack[stackp + 59];
00340 if (bmin == bmax) {
00341 if (x[imax-1] < 0.f) {
00342
00343 i__1 = imin, i__2 = lauf[bmin - 1];
00344 lauf[bmin - 1] = min(i__1,i__2);
00345
00346 i__1 = imax, i__2 = lauf[bmax + 3];
00347 lauf[bmax + 3] = max(i__1,i__2);
00348 --stackp;
00349 goto L3;
00350 } else if (x[imin-1] >= 0.f) {
00351
00352 i__1 = imin, i__2 = lauf[bmin + 7];
00353 lauf[bmin + 7] = min(i__1,i__2);
00354
00355 i__1 = imax, i__2 = lauf[bmax + 11];
00356 lauf[bmax + 11] = max(i__1,i__2);
00357 --stackp;
00358 goto L3;
00359 }
00360 }
00361 imitte = (imax + imin) / 2;
00362 stack[stackp - 1] = imitte + 1;
00363 stack[stackp + 19] = imax;
00364 stack[stackp + 39] = bfun6_(y, x[imitte]);
00365 stack[stackp + 59] = bmax;
00366 ++stackp;
00367 stack[stackp - 1] = imin;
00368 stack[stackp + 19] = imitte;
00369 stack[stackp + 39] = bmin;
00370 stack[stackp + 59] = bfun6_(y, x[imitte-1]);
00371 L3:
00372 if (stackp > 0) {
00373 goto L2;
00374 }
00375
00376
00377 if (lauf[7] >= lauf[3] || lauf[15] >= lauf[11]) {
00378 if ((r__1 = y - yps4, fabs(r__1)) > 1e-8f) {
00379 yps4 = y;
00380 a7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00381 y2 * (y2 * (y2 * (2.35944f - y2 * .56419f) - 72.9359f) +
00382 571.687f) - 5860.68f) + 40649.2f) - 320772.f) + 1684100.f)
00383 - 9694630.f) + 40816800.f) - 1.53575e8f) + 4.56662e8f) -
00384 9.86604e8f) + 1.16028e9f);
00385 b7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00386 y2 * (y2 * (23.0312f - y2 * 7.33447f) - 234.143f) -
00387 2269.19f) + 45251.3f) - 234417.f) + 3599150.f) -
00388 7723590.f) + 86482900.f) - 2.91876e8f) + 8.06985e8f) -
00389 9.85386e8f) - 5.60505e8f);
00390 c7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00391 y2 * (97.6203f - y2 * 44.0068f) + 1097.77f) - 25338.3f) +
00392 98079.1f) + 576054.f) - 2.3818e7f) + 22930200.f) -
00393 2.04467e8f) + 2.94262e8f) + 2.47157e8f) - 6.51523e8f);
00394 d7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00395 228.563f - y2 * 161.358f) + 8381.97f) - 66431.2f) -
00396 303569.f) + 2240400.f) + 38311200.f) - 41501300.f) -
00397 99622400.f) + 2.70167e8f) - 2.63894e8f);
00398 e7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00399 296.38f - y2 * 403.396f) + 23507.6f) - 66212.1f) -
00400 1.003e6f) + 468142.f) + 24620100.f) + 5569650.f) +
00401 1.40677e8f) - 63177100.f);
00402 f7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (125.591f -
00403 y2 * 726.113f) + 37544.8f) + 8820.94f) - 934717.f) -
00404 1931140.f) - 33289600.f) + 4073820.f) - 16984600.f);
00405 g7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (-260.198f - y2 *
00406 968.15f) + 37371.9f) + 79902.5f) - 186682.f) - 900010.f)
00407 + 7528830.f) - 1231650.f);
00408 h7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (-571.645f - y2 * 968.15f)
00409 + 23137.1f) + 72520.9f) + 153468.f) + 86407.6f) -
00410 610622.f);
00411 o7 = y * (y2 * (y2 * (y2 * (y2 * (-575.164f - y2 * 726.113f) +
00412 8073.15f) + 26538.5f) + 49883.8f) - 23586.5f);
00413 p7 = y * (y2 * (y2 * (y2 * (-352.467f - y2 * 403.396f) +
00414 953.655f) + 2198.86f) - 8009.1f);
00415 q7 = y * (y2 * (y2 * (-134.792f - y2 * 161.358f) - 271.202f) -
00416 622.056f);
00417 r7 = y * (y2 * (-29.7896f - y2 * 44.0068f) - 77.0535f);
00418 s7 = y * (-2.92264f - y2 * 7.33447f);
00419 t7 = y * -.56419f;
00420 a8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00421 y2 * (y2 * (y2 * (y2 - 3.68288f) + 126.532f) - 955.194f)
00422 + 9504.65f) - 70946.1f) + 483737.f) - 2857210.f) +
00423 14464700.f) - 61114800.f) + 2.11107e8f) - 5.79099e8f) +
00424 1.17022e9f) - 1.5599e9f) + 1.02827e9f;
00425 b8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00426 y2 * (y2 * (y2 * 14.f - 40.5117f) + 533.254f) + 3058.26f)
00427 - 55600.f) + 498334.f) - 2849540.f) + 13946500.f) -
00428 70135800.f) + 2.89676e8f) - 7.53828e8f) + 1.66421e9f) -
00429 2.28855e9f) + 1.5599e9f;
00430 c8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00431 y2 * (y2 * 91 - 198.876f) - 1500.17f) + 48153.3f) -
00432 217801.f) - 1063520.f) + 1.4841e7f) - 46039600.f) +
00433 63349600.f) - 6.60078e8f) + 1.06002e9f) - 1.66421e9f) +
00434 1.17022e9f;
00435 d8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
00436 y2 * 364 - 567.164f) - 16493.7f) + 161461.f) + 280428.f)
00437 - 6890020.f) - 6876560.f) + 1.99846e8f) + 54036700.f) +
00438 6.60078e8f) - 7.53828e8f) + 5.79099e8f;
00439 e8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 *
00440 1001 - 1012.79f) - 55582.f) + 240373.f) + 1954700.f) -
00441 5257220.f) - 50101700.f) - 1.99846e8f) + 63349600.f) -
00442 2.89676e8f) + 2.11107e8f;
00443 f8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 2002 -
00444 1093.82f) - 106663.f) + 123052.f) + 3043160.f) +
00445 5257220.f) - 6876560.f) + 46039600.f) - 70135800.f) +
00446 61114800.f;
00447 g8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3003 -
00448 486.14f) - 131337.f) - 123052.f) + 1954700.f) + 6890020.f)
00449 + 1.4841e7f) - 13946500.f) + 14464700.f;
00450 h8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3432 + 486.14f) -
00451 106663.f) - 240373.f) + 280428.f) + 1063520.f) -
00452 2849540.f) + 2857210.f;
00453 o8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3003 + 1093.82f) -
00454 55582.f) - 161461.f) - 217801.f) - 498334.f) + 483737.f;
00455 p8 = y2 * (y2 * (y2 * (y2 * (y2 * 2002 + 1012.79f) - 16493.7f) -
00456 48153.3f) - 55600.f) + 70946.1f;
00457 q8 = y2 * (y2 * (y2 * (y2 * 1001.f + 567.164f) - 1500.17f) -
00458 3058.26f) + 9504.65f;
00459 r8 = y2 * (y2 * (y2 * 364 + 198.876f) + 533.254f) + 955.194f;
00460 s8 = y2 * (y2 * 91.f + 40.5117f) + 126.532f;
00461 t8 = y2 * 14.f + 3.68288f;
00462 }
00463 ym2 = y * 2;
00464 for (i2 = 1; i2 <= 3; i2 += 2) {
00465 i__1 = lauf[((i2 + 1) << 2) - 1];
00466 for (i1 = lauf[(i2 << 2) - 1]; i1 <= i__1; ++i1) {
00467 x2 = x[i1-1] * x[i1-1];
00468 ls[i1-1] = fac * (exp(y2 - x2) * cos(x[i1-1] * ym2) - (a7 + x2 *
00469 (b7 + x2 * (c7 + x2 * (d7 + x2 * (e7 + x2 * (f7 + x2
00470 * (g7 + x2 * (h7 + x2 * (o7 + x2 * (p7 + x2 * (q7 +
00471 x2 * (r7 + x2 * (s7 + x2 * t7))))))))))))) / (a8 + x2
00472 * (b8 + x2 * (c8 + x2 * (d8 + x2 * (e8 + x2 * (f8 +
00473 x2 * (g8 + x2 * (h8 + x2 * (o8 + x2 * (p8 + x2 * (q8
00474 + x2 * (r8 + x2 * (s8 + x2 * (t8 + x2)))))))))))))));
00475
00476 }
00477 }
00478 }
00479
00480
00481 if (lauf[6] >= lauf[2] || lauf[14] >= lauf[10]) {
00482 if ((r__1 = y - yps3, fabs(r__1)) > 1e-8f) {
00483 yps3 = y;
00484 a5 = y * (y * (y * (y * (y * (y * (y * (y * (y *
00485 .564224f + 7.55895f) + 49.5213f) + 204.501f) + 581.746f)
00486 + 1174.8f) + 1678.33f) + 1629.76f) + 973.778f) + 272.102f;
00487 b5 = y * (y * (y * (y * (y * (y * (y * 2.25689f + 22.6778f)
00488 + 100.705f) + 247.198f) + 336.364f) + 220.843f) -
00489 2.34403f) - 60.5644f;
00490 c5 = y * (y * (y * (y * (y * 3.38534f + 22.6798f) + 52.8454f)
00491 + 42.5683f) + 18.546f) + 4.58029f;
00492 d5 = y * (y * (y * 2.25689f + 7.56186f) + 1.66203f) - .128922f;
00493 e5 = y * .564224f + 9.71457e-4f;
00494 a6 = y * (y * (y * (y * (y * (y * (y * (y * (y * (y +
00495 13.3988f) + 88.2674f) + 369.199f) + 1074.41f) + 2256.98f)
00496 + 3447.63f) + 3764.97f) + 2802.87f) + 1280.83f) +
00497 272.102f;
00498 b6 = y * (y * (y * (y * (y * (y * (y * (y * 5.f +
00499 53.5952f) + 266.299f) + 793.427f) + 1549.68f) + 2037.31f)
00500 + 1758.34f) + 902.306f) + 211.678f;
00501 c6 = y * (y * (y * (y * (y * (y * 10.f + 80.3928f) +
00502 269.292f) + 479.258f) + 497.302f) + 308.186f) + 78.866f;
00503 d6 = y * (y * (y * (y * 10.f + 53.5952f) + 92.7568f) +
00504 55.0293f) + 22.0353f;
00505 e6 = y * (y * 5.f + 13.3988f) + 1.49645f;
00506 }
00507 for (i2 = 1; i2 <= 3; i2 += 2) {
00508 i__1 = lauf[((i2 + 1) << 2) - 2];
00509 for (i1 = lauf[(i2 << 2) - 2]; i1 <= i__1; ++i1) {
00510 x2 = x[i1-1] * x[i1-1];
00511 ls[i1-1] = fac * (a5 + x2 * (b5 + x2 * (c5 + x2 * (d5 + x2 *
00512 e5)))) / (a6 + x2 * (b6 + x2 * (c6 + x2 * (d6 + x2 * (
00513 e6 + x2)))));
00514
00515 }
00516 }
00517 }
00518
00519
00520 if (lauf[5] >= lauf[1] || lauf[13] >= lauf[9]) {
00521 if ((r__1 = y - yps2, fabs(r__1)) > 1e-8f) {
00522 yps2 = y;
00523 a3 = y * (y2 * (y2 * (y2 * .56419f + 3.10304f) + 4.65456f) +
00524 1.05786f);
00525 b3 = y * (y2 * (y2 * 1.69257f + .56419f) + 2.962f);
00526 c3 = y * (y2 * 1.69257f - 2.53885f);
00527 d3 = y * .56419f;
00528 a4 = y2 * (y2 * (y2 * (y2 + 6.f) + 10.5f) + 4.5f) + .5625f;
00529 b4 = y2 * (y2 * (y2 * 4.f + 6.f) + 9.f) - 4.5f;
00530 c4 = y2 * (y2 * 6.f - 6.f) + 10.5f;
00531 d4 = y2 * 4.f - 6.f;
00532 }
00533 for (i2 = 1; i2 <= 3; i2 += 2) {
00534 i__1 = lauf[((i2 + 1) << 2) - 3];
00535 for (i1 = lauf[(i2 << 2) - 3]; i1 <= i__1; ++i1) {
00536 x2 = x[i1-1] * x[i1-1];
00537 ls[i1-1] = fac * (a3 + x2 * (b3 + x2 * (c3 + x2 * d3))) / (a4
00538 + x2 * (b4 + x2 * (c4 + x2 * (d4 + x2))));
00539
00540 }
00541 }
00542 }
00543
00544
00545 L7:
00546 if (lauf[4] >= lauf[0] || lauf[12] >= lauf[8]) {
00547 if ((r__1 = y - yps1, fabs(r__1)) > 1e-8f) {
00548 yps1 = y;
00549 a1 = y * .5641896f;
00550 b1 = y2 + .5f;
00551 a2 = y2 * 4;
00552 }
00553
00554 c1 = fac * a1;
00555 for (i2 = 1; i2 <= 3; i2 += 2) {
00556 i__1 = lauf[((i2 + 1) << 2) - 4];
00557 for (i1 = lauf[(i2 << 2) - 4]; i1 <= i__1; ++i1) {
00558 x2 = x[i1-1] * x[i1-1];
00559 b2 = b1 - x2;
00560 ls[i1-1] = c1 * (b1 + x2) / (b2 * b2 + a2 * x2);
00561
00562 }
00563 }
00564 }
00565 }
00566
00567
00568
00569
00570
00571 long int bfun3_(Numeric y, Numeric x)
00572 {
00573
00574 long int ret_val;
00575
00576
00577 Numeric x2 = 0, y2 = 0;
00578
00579
00580 x2 = x * x;
00581 y2 = y * y;
00582 if (x2 * .4081676f + y2 > 21.159543f) {
00583 if (x2 * .7019639f + y2 > 1123.14221f) {
00584 ret_val = 0;
00585 } else {
00586 ret_val = 1;
00587 }
00588 } else {
00589 if (x2 * .20753051f + y2 > 4.20249292f) {
00590 ret_val = 2;
00591 } else if (y >= fabs(x) * .08f - .12f) {
00592 ret_val = 3;
00593 } else {
00594 ret_val = 4;
00595 }
00596 }
00597 return ret_val;
00598 }
00599
00600
00601
00662 void lineshape_voigt_kuntz3(Vector& ls,
00663 Vector& x,
00664 Numeric f0,
00665 Numeric gamma,
00666 Numeric sigma,
00667 VectorView f_grid,
00668 const Index nf)
00669
00670 {
00671
00672
00673
00674 assert( nf==f_grid.nelem() );
00675
00676
00677
00678
00679
00680 extern const Numeric PI;
00681
00682
00683 const Numeric sqrt_invPI = sqrt(1/PI);
00684
00685
00686 Numeric fac = 1.0 / sigma * sqrt_invPI;
00687
00688
00689
00690 Numeric yps0 = -1.0;
00691 Numeric yps1 = -1.0;
00692 Numeric yps2 = -1.0;
00693 Numeric yps3 = -1.0;
00694 Numeric yps4 = -1.0;
00695
00696
00697 long i__1, i__2;
00698 Numeric r__1;
00699
00700
00701 long bmin = 0, lauf[20] = {0} , bmax, imin, imax;
00702 long stack[80] = {0} ;
00703 Numeric a0, a1, a2, a3, a4, a5, a6, a7, a8, b8, c8, d8, e8, f8, g8,
00704 h8, b7, c7, d7, e7, f7, g7, o8, p8, q8, r8, s8, t8, h7, o7, p7,
00705 q7, r7, s7, t7, b6, c6, d6, e6, b5, c5, d5, e5, b4, c4, d4, b3,
00706 c3, d3, b1, y2;
00707 a0 = a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = b8 = c8 = d8 = e8 = f8 = g8
00708 = h8 = b7 = c7 = d7 = e7 = f7 = g7 = o8 = p8 = q8 = r8 = s8 = t8 = h7 = o7
00709 = p7 = q7 = r7 = s7 = t7 = b6 = c6 = d6 = e6 = b5 = c5 = d5 = e5 = b4 = c4
00710 = d4 = b3 = c3 = d3 = b1 = y2 = 0;
00711 long i2 = 0, i1 = 0;
00712 Numeric x2 = 0, b2 = 0, b0 = 0, c1 = 0;
00713 long stackp = 0, imitte = 0;
00714 Numeric ym2 = 0;
00715
00716
00717
00718
00719 Numeric y = gamma / sigma;
00720
00721
00722 for (i1=0; i1< (int) nf; i1++)
00723 {
00724 x[i1] = (f_grid[i1] - f0) / sigma;
00725 }
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735 y2 = y * y;
00736 if (y >= 23.0 || x[0] >= 39.0 || x[nf-1] <= -39.0) {
00737 lauf[0] = 1;
00738 lauf[5] = nf;
00739 lauf[10] = nf;
00740 lauf[15] = 0;
00741 goto L8;
00742 }
00743 for (i2 = 1; i2 <= 4; ++i2) {
00744 for (i1 = 0; i1 <= 4; ++i1) {
00745 lauf[i1 + i2 * 5 - 5] = i2 % 2 * (nf + 1);
00746
00747 }
00748 }
00749 stackp = 1;
00750 stack[stackp - 1] = 1;
00751 stack[stackp + 19] = nf;
00752 stack[stackp + 39] = bfun3_(y, x[0]);
00753 stack[stackp + 59] = bfun3_(y, x[nf-1]);
00754 L2:
00755 imin = stack[stackp - 1];
00756 imax = stack[stackp + 19];
00757 bmin = stack[stackp + 39];
00758 bmax = stack[stackp + 59];
00759 if (bmin == bmax) {
00760 if (x[imax-1] < 0.f) {
00761
00762 i__1 = imin, i__2 = lauf[bmin];
00763 lauf[bmin] = min(i__1,i__2);
00764
00765 i__1 = imax, i__2 = lauf[bmax + 5];
00766 lauf[bmax + 5] = max(i__1,i__2);
00767 --stackp;
00768 goto L3;
00769 } else if (x[imin-1] >= 0.f) {
00770
00771 i__1 = imin, i__2 = lauf[bmin + 10];
00772 lauf[bmin + 10] = min(i__1,i__2);
00773
00774 i__1 = imax, i__2 = lauf[bmax + 15];
00775 lauf[bmax + 15] = max(i__1,i__2);
00776 --stackp;
00777 goto L3;
00778 }
00779 }
00780 imitte = (imax + imin) / 2;
00781 stack[stackp - 1] = imitte + 1;
00782 stack[stackp + 19] = imax;
00783 stack[stackp + 39] = bfun3_(y, x[imitte]);
00784 stack[stackp + 59] = bmax;
00785 ++stackp;
00786 stack[stackp - 1] = imin;
00787 stack[stackp + 19] = imitte;
00788 stack[stackp + 39] = bmin;
00789 stack[stackp + 59] = bfun3_(y, x[imitte-1]);
00790 L3:
00791 if (stackp > 0) {
00792 goto L2;
00793 }
00794
00795
00796 if (lauf[9] >= lauf[4] || lauf[19] >= lauf[14]) {
00797 if ((r__1 = y - yps4, fabs(r__1)) > 1e-8f) {
00798 yps4 = y;
00799 a7 = y * (y2 * (y2 * 4.56662e8f - 9.86604e8f) + 1.16028e9f);
00800 b7 = y * (y2 * (y2 * 8.06985e8f - 9.85386e8f) - 5.60505e8f);
00801 c7 = y * (y2 * (y2 * 2.94262e8f + 2.47157e8f) - 6.51523e8f);
00802 d7 = y * (y2 * (2.70167e8f - y2 * 99622400.f) - 2.63894e8f);
00803 e7 = y * (y2 * (y2 * 5569650.f + 1.40677e8f) - 63177100.f);
00804 f7 = y * (y2 * (4073820.f - y2 * 33289600.f) - 16984600.f);
00805 g7 = y * (y2 * (7528830.f - y2 * 900010) - 1231650.f);
00806 h7 = y * (y2 * (y2 * 153468 + 86407.6f) - 610622.f);
00807 o7 = y * (y2 * (y2 * 26538.5f + 49883.8f) - 23586.5f);
00808 p7 = y * (y2 * (y2 * 953.655f + 2198.86f) - 8009.1f);
00809 q7 = y * (y2 * (-271.202f - y2 * 134.792f) - 622.056f);
00810 r7 = y * (y2 * (-29.7896f - y2 * 44.0068f) - 77.0535f);
00811 s7 = y * (-2.92264f - y2 * 7.33447f);
00812 t7 = y * -.56419f;
00813 a8 = y2 * (y2 * 1.17022e9f - 1.5599e9f) + 1.02827e9f;
00814 b8 = y2 * (y2 * 1.66421e9f - 2.28855e9f) + 1.5599e9f;
00815 c8 = y2 * (y2 * 1.06002e9f - 1.66421e9f) + 1.17022e9f;
00816 d8 = y2 * (y2 * 6.60078e8f - 7.53828e8f) + 5.79099e8f;
00817 e8 = y2 * (y2 * 63349600.f - 2.89676e8f) + 2.11107e8f;
00818 f8 = y2 * (y2 * 46039600.f - 70135800.f) + 61114800.f;
00819 g8 = y2 * (y2 * 1.4841e7f - 13946500.f) + 14464700.f;
00820 h8 = y2 * (y2 * 1063520.f - 2849540.f) + 2857210.f;
00821 o8 = y2 * (-498334.f - y2 * 217801.f) + 483737.f;
00822 p8 = y2 * (-55600.f - y2 * 48153.3f) + 70946.1f;
00823 q8 = y2 * (-3058.26f - y2 * 1500.17f) + 9504.65f;
00824 r8 = y2 * (y2 * 198.876f + 533.254f) + 955.194f;
00825 s8 = y2 * (y2 * 91.f + 40.5117f) + 126.532f;
00826 t8 = y2 * 14.f + 3.68288f;
00827 }
00828 ym2 = y * 2;
00829 for (i2 = 1; i2 <= 3; i2 += 2) {
00830 i__1 = lauf[(i2 + 1) * 5 - 1];
00831 for (i1 = lauf[i2 * 5 - 1]; i1 <= i__1; ++i1) {
00832 x2 = x[i1-1] * x[i1-1];
00833 ls[i1-1] = fac * (exp(y2 - x2) * cos(x[i1-1] * ym2) - (a7 + x2 *
00834 (b7 + x2 * (c7 + x2 * (d7 + x2 * (e7 + x2 * (f7 + x2
00835 * (g7 + x2 * (h7 + x2 * (o7 + x2 * (p7 + x2 * (q7 +
00836 x2 * (r7 + x2 * (s7 + x2 * t7))))))))))))) / (a8 + x2
00837 * (b8 + x2 * (c8 + x2 * (d8 + x2 * (e8 + x2 * (f8 +
00838 x2 * (g8 + x2 * (h8 + x2 * (o8 + x2 * (p8 + x2 * (q8
00839 + x2 * (r8 + x2 * (s8 + x2 * (t8 + x2)))))))))))))));
00840
00841 }
00842 }
00843 }
00844
00845
00846 if (lauf[8] >= lauf[3] || lauf[18] >= lauf[13]) {
00847 if ((r__1 = y - yps3, fabs(r__1)) > 1e-8f) {
00848 yps3 = y;
00849 a5 = y * (y * (y * (y * (y * (y * (y * (y * (y *
00850 .564224f + 7.55895f) + 49.5213f) + 204.501f) + 581.746f)
00851 + 1174.8f) + 1678.33f) + 1629.76f) + 973.778f) + 272.102f;
00852 b5 = y * (y * (y * (y * (y * (y * (y * 2.25689f + 22.6778f)
00853 + 100.705f) + 247.198f) + 336.364f) + 220.843f) -
00854 2.34403f) - 60.5644f;
00855 c5 = y * (y * (y * (y * (y * 3.38534f + 22.6798f) + 52.8454f)
00856 + 42.5683f) + 18.546f) + 4.58029f;
00857 d5 = y * (y * (y * 2.25689f + 7.56186f) + 1.66203f) - .128922f;
00858 e5 = y * .564224f + 9.71457e-4f;
00859 a6 = y * (y * (y * (y * (y * (y * (y * (y * (y * (y +
00860 13.3988f) + 88.2674f) + 369.199f) + 1074.41f) + 2256.98f)
00861 + 3447.63f) + 3764.97f) + 2802.87f) + 1280.83f) +
00862 272.102f;
00863 b6 = y * (y * (y * (y * (y * (y * (y * (y * 5.f +
00864 53.5952f) + 266.299f) + 793.427f) + 1549.68f) + 2037.31f)
00865 + 1758.34f) + 902.306f) + 211.678f;
00866 c6 = y * (y * (y * (y * (y * (y * 10.f + 80.3928f) +
00867 269.292f) + 479.258f) + 497.302f) + 308.186f) + 78.866f;
00868 d6 = y * (y * (y * (y * 10.f + 53.5952f) + 92.7568f) +
00869 55.0293f) + 22.0353f;
00870 e6 = y * (y * 5.f + 13.3988f) + 1.49645f;
00871 }
00872 for (i2 = 1; i2 <= 3; i2 += 2) {
00873 i__1 = lauf[(i2 + 1) * 5 - 2];
00874 for (i1 = lauf[i2 * 5 - 2]; i1 <= i__1; ++i1) {
00875 x2 = x[i1-1] * x[i1-1];
00876 ls[i1-1] = fac * (a5 + x2 * (b5 + x2 * (c5 + x2 * (d5 + x2 *
00877 e5)))) / (a6 + x2 * (b6 + x2 * (c6 + x2 * (d6 + x2 * (
00878 e6 + x2)))));
00879
00880 }
00881 }
00882 }
00883
00884
00885 if (lauf[7] >= lauf[2] || lauf[17] >= lauf[12]) {
00886 if ((r__1 = y - yps2, fabs(r__1)) > 1e-8f) {
00887 yps2 = y;
00888 a3 = y * (y2 * (y2 * (y2 * .56419f + 3.10304f) + 4.65456f) +
00889 1.05786f);
00890 b3 = y * (y2 * (y2 * 1.69257f + .56419f) + 2.962f);
00891 c3 = y * (y2 * 1.69257f - 2.53885f);
00892 d3 = y * .56419f;
00893 a4 = y2 * (y2 * (y2 * (y2 + 6.f) + 10.5f) + 4.5f) + .5625f;
00894 b4 = y2 * (y2 * (y2 * 4.f + 6.f) + 9.f) - 4.5f;
00895 c4 = y2 * (y2 * 6.f - 6.f) + 10.5f;
00896 d4 = y2 * 4.f - 6.f;
00897 }
00898 for (i2 = 1; i2 <= 3; i2 += 2) {
00899 i__1 = lauf[(i2 + 1) * 5 - 3];
00900 for (i1 = lauf[i2 * 5 - 3]; i1 <= i__1; ++i1) {
00901 x2 = x[i1-1] * x[i1-1];
00902 ls[i1-1] = fac * (a3 + x2 * (b3 + x2 * (c3 + x2 * d3))) / (a4
00903 + x2 * (b4 + x2 * (c4 + x2 * (d4 + x2))));
00904
00905 }
00906 }
00907 }
00908
00909
00910 if (lauf[6] >= lauf[1] || lauf[16] >= lauf[11]) {
00911 if ((r__1 = y - yps1, fabs(r__1)) > 1e-8f) {
00912 yps1 = y;
00913 a1 = y * .5641896f;
00914 b1 = y2 + .5f;
00915 a2 = y2 * 4;
00916 }
00917
00918 c1 = a1 * fac;
00919 for (i2 = 1; i2 <= 3; i2 += 2) {
00920 i__1 = lauf[(i2 + 1) * 5 - 4];
00921 for (i1 = lauf[i2 * 5 - 4]; i1 <= i__1; ++i1) {
00922 x2 = x[i1-1] * x[i1-1];
00923 b2 = b1 - x2;
00924 ls[i1-1] = c1 * (b1 + x2) / (b2 * b2 + a2 * x2);
00925
00926 }
00927 }
00928 }
00929
00930
00931 L8:
00932 if (lauf[5] >= lauf[0] || lauf[15] >= lauf[10]) {
00933 if ((r__1 = y - yps0, fabs(r__1)) > 1e-8f) {
00934 yps0 = y;
00935 a0 = y * .5641896f;
00936 }
00937
00938 b0 = a0 * fac;
00939 for (i2 = 1; i2 <= 3; i2 += 2) {
00940 i__1 = lauf[(i2 + 1) * 5 - 5];
00941 for (i1 = lauf[i2 * 5 - 5]; i1 <= i__1; ++i1) {
00942 ls[i1-1] = b0 / (x[i1-1] * x[i1-1] + y2);
00943
00944 }
00945 }
00946 }
00947 }
00948
00949
00950
00951
00952
00953 long bfun4_(Numeric y, Numeric x)
00954 {
00955
00956 long ret_val;
00957
00958
00959 Numeric x2 = 0, y2 = 0;
00960
00961 x2 = x * x;
00962 y2 = y * y;
00963 if (x2 * .0062f + y2 * .01417f > 1.f) {
00964 if (x2 * 6.2e-5f + y2 * 1.98373e-4f > 1.f) {
00965 ret_val = 0;
00966 } else {
00967 ret_val = 1;
00968 }
00969 } else {
00970 if (x2 * .041649f + y2 * .111111111f > 1.f) {
00971 ret_val = 2;
00972 } else if (y >= fabs(x) * .19487f - .1753846f) {
00973 ret_val = 3;
00974 } else {
00975 ret_val = 4;
00976 }
00977 }
00978 return ret_val;
00979 }
00980
01040 void lineshape_voigt_kuntz4(Vector& ls,
01041 Vector& x,
01042 Numeric f0,
01043 Numeric gamma,
01044 Numeric sigma,
01045 VectorView f_grid,
01046 const Index nf)
01047 {
01048
01049
01050
01051 assert( nf==f_grid.nelem() );
01052
01053
01054
01055
01056
01057 extern const Numeric PI;
01058
01059
01060 const Numeric sqrt_invPI = sqrt(1/PI);
01061
01062
01063 Numeric fac = 1.0 / sigma * sqrt_invPI;
01064
01065
01066
01067
01068 float yps0 = -1.f;
01069 float yps1 = -1.f;
01070 float yps2 = -1.f;
01071 float yps3 = -1.f;
01072 float yps4 = -1.f;
01073
01074
01075 long i__1, i__2;
01076 float r__1;
01077
01078
01079 long bmin = 0, lauf[20] = {0} , bmax, imin, imax;
01080 long stack[80] = {0} ;
01081 Numeric a0, a1, a2, a3, a4, a5, a6, a7, a8, b8, c8, d8, e8, f8, g8,
01082 h8, b7, c7, d7, e7, f7, g7, o8, p8, q8, r8, s8, t8, h7, o7, p7,
01083 q7, r7, s7, t7, b6, c6, d6, e6, b5, c5, d5, e5, b4, c4, d4, b3,
01084 c3, d3, b1, y2;
01085 a0 = a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = b8 = c8 = d8 = e8 = f8 = g8
01086 = h8 = b7 = c7 = d7 = e7 = f7 = g7 = o8 = p8 = q8 = r8 = s8 = t8 = h7
01087 = o7 = p7 = q7 = r7 = s7 = t7 = b6 = c6 = d6 = e6 = b5 = c5 = d5 = e5
01088 = b4 = c4 = d4 = b3 = c3 = d3 = b1 = y2 = 0;
01089 long i2 = 0, i1 = 0;
01090 Numeric x2 = 0, b2 = 0, b0 = 0, c1 = 0;
01091 long stackp = 0, imitte = 0;
01092 Numeric ym2 = 0;
01093
01094
01095
01096
01097 Numeric y = gamma / sigma;
01098
01099
01100 for (i1=0; i1< (int) nf; i1++)
01101 {
01102 x[i1] = (f_grid[i1] - f0) / sigma;
01103 }
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113 y2 = y * y;
01114 if (y >= 71.f || x[0] >= 123.f || x[nf-1] <= -123.f) {
01115 lauf[0] = 1;
01116 lauf[5] = nf;
01117 lauf[10] = nf;
01118 lauf[15] = 0;
01119 goto L8;
01120 }
01121 for (i2 = 1; i2 <= 4; ++i2) {
01122 for (i1 = 0; i1 <= 4; ++i1) {
01123 lauf[i1 + i2 * 5 - 5] = i2 % 2 * (nf + 1);
01124
01125 }
01126 }
01127 stackp = 1;
01128 stack[stackp - 1] = 1;
01129 stack[stackp + 19] = nf;
01130 stack[stackp + 39] = bfun4_(y, x[0]);
01131 stack[stackp + 59] = bfun4_(y, x[nf-1]);
01132 L2:
01133 imin = stack[stackp - 1];
01134 imax = stack[stackp + 19];
01135 bmin = stack[stackp + 39];
01136 bmax = stack[stackp + 59];
01137 if (bmin == bmax) {
01138 if (x[imax-1] < 0.f) {
01139
01140 i__1 = imin, i__2 = lauf[bmin];
01141 lauf[bmin] = min(i__1,i__2);
01142
01143 i__1 = imax, i__2 = lauf[bmax + 5];
01144 lauf[bmax + 5] = max(i__1,i__2);
01145 --stackp;
01146 goto L3;
01147 } else if (x[imin-1] >= 0.f) {
01148
01149 i__1 = imin, i__2 = lauf[bmin + 10];
01150 lauf[bmin + 10] = min(i__1,i__2);
01151
01152 i__1 = imax, i__2 = lauf[bmax + 15];
01153 lauf[bmax + 15] = max(i__1,i__2);
01154 --stackp;
01155 goto L3;
01156 }
01157 }
01158 imitte = (imax + imin) / 2;
01159 stack[stackp - 1] = imitte + 1;
01160 stack[stackp + 19] = imax;
01161 stack[stackp + 39] = bfun4_(y, x[imitte]);
01162 stack[stackp + 59] = bmax;
01163 ++stackp;
01164 stack[stackp - 1] = imin;
01165 stack[stackp + 19] = imitte;
01166 stack[stackp + 39] = bmin;
01167 stack[stackp + 59] = bfun4_(y, x[imitte-1]);
01168 L3:
01169 if (stackp > 0) {
01170 goto L2;
01171 }
01172
01173
01174 if (lauf[9] >= lauf[4] || lauf[19] >= lauf[14]) {
01175 if ((r__1 = (float)(y - yps4), fabs(r__1)) > 1e-8f) {
01176 yps4 = (float)y;
01177 a7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01178 y2 * (y2 * (y2 * (2.35944f - y2 * .56419f) - 72.9359f) +
01179 571.687f) - 5860.68f) + 40649.2f) - 320772.f) + 1684100.f)
01180 - 9694630.f) + 40816800.f) - 1.53575e8f) + 4.56662e8f) -
01181 9.86604e8f) + 1.16028e9f);
01182 b7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01183 y2 * (y2 * (23.0312f - y2 * 7.33447f) - 234.143f) -
01184 2269.19f) + 45251.3f) - 234417.f) + 3599150.f) -
01185 7723590.f) + 86482900.f) - 2.91876e8f) + 8.06985e8f) -
01186 9.85386e8f) - 5.60505e8f);
01187 c7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01188 y2 * (97.6203f - y2 * 44.0068f) + 1097.77f) - 25338.3f) +
01189 98079.1f) + 576054.f) - 2.3818e7f) + 22930200.f) -
01190 2.04467e8f) + 2.94262e8f) + 2.47157e8f) - 6.51523e8f);
01191 d7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01192 228.563f - y2 * 161.358f) + 8381.97f) - 66431.2f) -
01193 303569.f) + 2240400.f) + 38311200.f) - 41501300.f) -
01194 99622400.f) + 2.70167e8f) - 2.63894e8f);
01195 e7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01196 296.38f - y2 * 403.396f) + 23507.6f) - 66212.1f) -
01197 1.003e6f) + 468142.f) + 24620100.f) + 5569650.f) +
01198 1.40677e8f) - 63177100.f);
01199 f7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (125.591f -
01200 y2 * 726.113f) + 37544.8f) + 8820.94f) - 934717.f) -
01201 1931140.f) - 33289600.f) + 4073820.f) - 16984600.f);
01202 g7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (-260.198f - y2 *
01203 968.15f) + 37371.9f) + 79902.5f) - 186682.f) - 900010.f)
01204 + 7528830.f) - 1231650.f);
01205 h7 = y * (y2 * (y2 * (y2 * (y2 * (y2 * (-571.645f - y2 * 968.15f)
01206 + 23137.1f) + 72520.9f) + 153468.f) + 86407.6f) -
01207 610622.f);
01208 o7 = y * (y2 * (y2 * (y2 * (y2 * (-575.164f - y2 * 726.113f) +
01209 8073.15f) + 26538.5f) + 49883.8f) - 23586.5f);
01210 p7 = y * (y2 * (y2 * (y2 * (-352.467f - y2 * 403.396f) +
01211 953.655f) + 2198.86f) - 8009.1f);
01212 q7 = y * (y2 * (y2 * (-134.792f - y2 * 161.358f) - 271.202f) -
01213 622.056f);
01214 r7 = y * (y2 * (-29.7896f - y2 * 44.0068f) - 77.0535f);
01215 s7 = y * (-2.92264f - y2 * 7.33447f);
01216 t7 = y * -.56419f;
01217 a8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01218 y2 * (y2 * (y2 * (y2 - 3.68288f) + 126.532f) - 955.194f)
01219 + 9504.65f) - 70946.1f) + 483737.f) - 2857210.f) +
01220 14464700.f) - 61114800.f) + 2.11107e8f) - 5.79099e8f) +
01221 1.17022e9f) - 1.5599e9f) + 1.02827e9f;
01222 b8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01223 y2 * (y2 * (y2 * 14.f - 40.5117f) + 533.254f) + 3058.26f)
01224 - 55600.f) + 498334.f) - 2849540.f) + 13946500.f) -
01225 70135800.f) + 2.89676e8f) - 7.53828e8f) + 1.66421e9f) -
01226 2.28855e9f) + 1.5599e9f;
01227 c8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01228 y2 * (y2 * 91 - 198.876f) - 1500.17f) + 48153.3f) -
01229 217801.f) - 1063520.f) + 1.4841e7f) - 46039600.f) +
01230 63349600.f) - 6.60078e8f) + 1.06002e9f) - 1.66421e9f) +
01231 1.17022e9f;
01232 d8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (
01233 y2 * 364 - 567.164f) - 16493.7f) + 161461.f) + 280428.f)
01234 - 6890020.f) - 6876560.f) + 1.99846e8f) + 54036700.f) +
01235 6.60078e8f) - 7.53828e8f) + 5.79099e8f;
01236 e8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 *
01237 1001 - 1012.79f) - 55582.f) + 240373.f) + 1954700.f) -
01238 5257220.f) - 50101700.f) - 1.99846e8f) + 63349600.f) -
01239 2.89676e8f) + 2.11107e8f;
01240 f8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 2002 -
01241 1093.82f) - 106663.f) + 123052.f) + 3043160.f) +
01242 5257220.f) - 6876560.f) + 46039600.f) - 70135800.f) +
01243 61114800.f;
01244 g8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3003 -
01245 486.14f) - 131337.f) - 123052.f) + 1954700.f) + 6890020.f)
01246 + 1.4841e7f) - 13946500.f) + 14464700.f;
01247 h8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3432 + 486.14f) -
01248 106663.f) - 240373.f) + 280428.f) + 1063520.f) -
01249 2849540.f) + 2857210.f;
01250 o8 = y2 * (y2 * (y2 * (y2 * (y2 * (y2 * 3003 + 1093.82f) -
01251 55582.f) - 161461.f) - 217801.f) - 498334.f) + 483737.f;
01252 p8 = y2 * (y2 * (y2 * (y2 * (y2 * 2002 + 1012.79f) - 16493.7f) -
01253 48153.3f) - 55600.f) + 70946.1f;
01254 q8 = y2 * (y2 * (y2 * (y2 * 1001.f + 567.164f) - 1500.17f) -
01255 3058.26f) + 9504.65f;
01256 r8 = y2 * (y2 * (y2 * 364 + 198.876f) + 533.254f) + 955.194f;
01257 s8 = y2 * (y2 * 91.f + 40.5117f) + 126.532f;
01258 t8 = y2 * 14.f + 3.68288f;
01259 }
01260 ym2 = y * 2;
01261 for (i2 = 1; i2 <= 3; i2 += 2) {
01262 i__1 = lauf[(i2 + 1) * 5 - 1];
01263 for (i1 = lauf[i2 * 5 - 1]; i1 <= i__1; ++i1) {
01264 x2 = x[i1-1] * x[i1-1];
01265 ls[i1-1] = fac * (exp(y2 - x2) * cos(x[i1-1] * ym2) - (a7 + x2 *
01266 (b7 + x2 * (c7 + x2 * (d7 + x2 * (e7 + x2 * (f7 + x2
01267 * (g7 + x2 * (h7 + x2 * (o7 + x2 * (p7 + x2 * (q7 +
01268 x2 * (r7 + x2 * (s7 + x2 * t7))))))))))))) / (a8 + x2
01269 * (b8 + x2 * (c8 + x2 * (d8 + x2 * (e8 + x2 * (f8 +
01270 x2 * (g8 + x2 * (h8 + x2 * (o8 + x2 * (p8 + x2 * (q8
01271 + x2 * (r8 + x2 * (s8 + x2 * (t8 + x2)))))))))))))));
01272
01273 }
01274 }
01275 }
01276
01277
01278 if (lauf[8] >= lauf[3] || lauf[18] >= lauf[13]) {
01279 if ((r__1 = (float)(y - yps3), fabs(r__1)) > 1e-8f) {
01280 yps3 = (float)y;
01281 a5 = y * (y * (y * (y * (y * (y * (y * (y * (y *
01282 .564224f + 7.55895f) + 49.5213f) + 204.501f) + 581.746f)
01283 + 1174.8f) + 1678.33f) + 1629.76f) + 973.778f) + 272.102f;
01284 b5 = y * (y * (y * (y * (y * (y * (y * 2.25689f + 22.6778f)
01285 + 100.705f) + 247.198f) + 336.364f) + 220.843f) -
01286 2.34403f) - 60.5644f;
01287 c5 = y * (y * (y * (y * (y * 3.38534f + 22.6798f) + 52.8454f)
01288 + 42.5683f) + 18.546f) + 4.58029f;
01289 d5 = y * (y * (y * 2.25689f + 7.56186f) + 1.66203f) - .128922f;
01290 e5 = y * .564224f + 9.71457e-4f;
01291 a6 = y * (y * (y * (y * (y * (y * (y * (y * (y * (y +
01292 13.3988f) + 88.2674f) + 369.199f) + 1074.41f) + 2256.98f)
01293 + 3447.63f) + 3764.97f) + 2802.87f) + 1280.83f) +
01294 272.102f;
01295 b6 = y * (y * (y * (y * (y * (y * (y * (y * 5.f +
01296 53.5952f) + 266.299f) + 793.427f) + 1549.68f) + 2037.31f)
01297 + 1758.34f) + 902.306f) + 211.678f;
01298 c6 = y * (y * (y * (y * (y * (y * 10.f + 80.3928f) +
01299 269.292f) + 479.258f) + 497.302f) + 308.186f) + 78.866f;
01300 d6 = y * (y * (y * (y * 10.f + 53.5952f) + 92.7568f) +
01301 55.0293f) + 22.0353f;
01302 e6 = y * (y * 5.f + 13.3988f) + 1.49645f;
01303 }
01304 for (i2 = 1; i2 <= 3; i2 += 2) {
01305 i__1 = lauf[(i2 + 1) * 5 - 2];
01306 for (i1 = lauf[i2 * 5 - 2]; i1 <= i__1; ++i1) {
01307 x2 = x[i1-1] * x[i1-1];
01308 ls[i1-1] = fac * (a5 + x2 * (b5 + x2 * (c5 + x2 * (d5 + x2 *
01309 e5)))) / (a6 + x2 * (b6 + x2 * (c6 + x2 * (d6 + x2 * (
01310 e6 + x2)))));
01311
01312 }
01313 }
01314 }
01315
01316
01317 if (lauf[7] >= lauf[2] || lauf[17] >= lauf[12]) {
01318 if ((r__1 = (float)(y - yps2), fabs(r__1)) > 1e-8f) {
01319 yps2 = (float)y;
01320 a3 = y * (y2 * (y2 * (y2 * .56419f + 3.10304f) + 4.65456f) +
01321 1.05786f);
01322 b3 = y * (y2 * (y2 * 1.69257f + .56419f) + 2.962f);
01323 c3 = y * (y2 * 1.69257f - 2.53885f);
01324 d3 = y * .56419f;
01325 a4 = y2 * (y2 * (y2 * (y2 + 6.f) + 10.5f) + 4.5f) + .5625f;
01326 b4 = y2 * (y2 * (y2 * 4.f + 6.f) + 9.f) - 4.5f;
01327 c4 = y2 * (y2 * 6.f - 6.f) + 10.5f;
01328 d4 = y2 * 4.f - 6.f;
01329 }
01330 for (i2 = 1; i2 <= 3; i2 += 2) {
01331 i__1 = lauf[(i2 + 1) * 5 - 3];
01332 for (i1 = lauf[i2 * 5 - 3]; i1 <= i__1; ++i1) {
01333 x2 = x[i1-1] * x[i1-1];
01334 ls[i1-1] = fac * (a3 + x2 * (b3 + x2 * (c3 + x2 * d3))) / (a4
01335 + x2 * (b4 + x2 * (c4 + x2 * (d4 + x2))));
01336
01337 }
01338 }
01339 }
01340
01341
01342 if (lauf[6] >= lauf[1] || lauf[16] >= lauf[11]) {
01343 if ((r__1 = (float)(y - yps1), fabs(r__1)) > 1e-8f) {
01344 yps1 = (float)y;
01345 a1 = y * .5641896f;
01346 b1 = y2 + .5f;
01347 a2 = y2 * 4;
01348 }
01349
01350 c1 = a1 * fac;
01351 for (i2 = 1; i2 <= 3; i2 += 2) {
01352 i__1 = lauf[(i2 + 1) * 5 - 4];
01353 for (i1 = lauf[i2 * 5 - 4]; i1 <= i__1; ++i1) {
01354 x2 = x[i1-1] * x[i1-1];
01355 b2 = b1 - x2;
01356 ls[i1-1] = c1 * (b1 + x2) / (b2 * b2 + a2 * x2);
01357
01358 }
01359 }
01360 }
01361
01362
01363 L8:
01364 if (lauf[5] >= lauf[0] || lauf[15] >= lauf[10]) {
01365 if ((r__1 = (float)(y - yps0), fabs(r__1)) > 1e-8f) {
01366 yps0 = (float)y;
01367 a0 = y * .5641896f;
01368 }
01369
01370 b0 = a0 * fac;
01371 for (i2 = 1; i2 <= 3; i2 += 2) {
01372 i__1 = lauf[(i2 + 1) * 5 - 5];
01373 for (i1 = lauf[i2 * 5 - 5]; i1 <= i__1; ++i1) {
01374 ls[i1-1] = b0 / (x[i1-1] * x[i1-1] + y2);
01375
01376 }
01377 }
01378 }
01379 }
01380
01381
01382
01427
01428
01429 void lineshape_voigt_drayson(Vector& ls,
01430 Vector& x,
01431 Numeric f0,
01432 Numeric gamma,
01433 Numeric sigma,
01434 VectorView f_grid,
01435 const Index nf)
01436
01437 {
01438
01439
01440
01441 assert( nf==f_grid.nelem() );
01442
01443
01444
01445
01446
01447 extern const Numeric PI;
01448
01449
01450 const Numeric sqrt_invPI = sqrt(1/PI);
01451
01452
01453 Numeric fac = 1.0 / sigma * sqrt_invPI;
01454
01455 Numeric B[22+1] = {0.,0.,.7093602e-7};
01456 Numeric RI[15+1] = {0};
01457 const Numeric XN[15+1] = {0.,10.,9.,8.,8.,7.,6.,5.,4.,3.,3.,3.,3.,3.,3.,3.};
01458 const Numeric YN[15+1] = {0.,.6,.6,.6,.5,.4,.4,.3,.3,.3,.3,1.,.9,.8,.7,.7};
01459 Numeric D0[25+1] = {0}, D1[25+1] = {0}, D2[25+1] = {0}, D3[25+1] = {0}, D4[25+1] = {0};
01460 Numeric HN[25+1] = {0};
01461 Numeric H = .201;
01462 const Numeric XX[3+1] = {0.,.5246476,1.65068,.7071068};
01463 const Numeric HH[3+1] = {0.,.2562121,.2588268e-1,.2820948};
01464 const Numeric NBY2[19+1] = {0.,9.5,9.,8.5,8.,7.5,7.,6.5
01465 ,6.,5.5,5.,4.5,4.,3.5,3.,2.5,2.,1.5,1.,.5};
01466 const Numeric C[21+1] = {0.,.7093602e-7,-.2518434e-6,.856687e-6,
01467 -.2787638e-5,.866074e-5,-.2565551e-4,.7228775e-4,
01468 -.1933631e-3,.4899520e-3,-.1173267e-2,.2648762e-2,
01469 -.5623190e-2,.1119601e-1,-.2084976e-1,.3621573e-1,
01470 -.5851412e-1,.8770816e-1,-.121664,.15584,-.184,.2};
01471 Numeric CO = 0;
01472 Numeric U, V, UU, VV, Y2, DX;
01473 int I, J, K, MAX, MIN, N, i1;
01474 int TRU = 0;
01475
01476
01477
01478
01479
01480 Numeric Y = gamma / sigma;
01481
01482
01483
01484 for (i1=0; i1< (int) nf; i1++)
01485 {
01486 x[i1] = fabs( (f_grid[i1] - f0) )/ sigma;
01487 }
01488
01489
01490 if (TRU) goto L104;
01491
01492 TRU = 1;
01493 for (I=1; I<=15; I++)
01494 RI[I] = -I/2.;
01495 for (I=1; I<=25; I++)
01496 {
01497 HN[I] = H*(I-.5);
01498 CO = 4.*HN[I]*HN[I]/25.-2.;
01499 for (J=2; J<=21; J++)
01500 B[J+1] = CO*B[J]-B[J-1]+C[J];
01501 D0[I] = HN[I]*(B[22]-B[21])/5.;
01502 D1[I] = 1.-2.*HN[I]*D0[I];
01503 D2[I] = (HN[I]*D1[I]+D0[I])/RI[2];
01504 D3[I] = (HN[I]*D2[I]+D1[I])/RI[3];
01505 D4[I] = (HN[I]*D3[I]+D2[I])/RI[4];
01506 }
01507 L104: for (K=0; K<(int) nf; K++)
01508 {
01509 if ((x[K]-5.) < 0.) goto L105; else goto L112;
01510 L105: if ((Y-1.) <= 0.) goto L110; else goto L106;
01511 L106: if (x[K] > 1.85*(3.6-Y)) goto L112;
01512
01513 if (Y < 1.45) goto L107;
01514 I = (int) (Y+Y);
01515 goto L108;
01516 L107: I = (int) (11.*Y);
01517 L108: J = (int) (x[K]+x[K]+1.85);
01518 MAX = (int) (XN[J]*YN[I]+.46);
01519 MIN = (int) ( (16 < 21-2*MAX) ? 16 : 21-2*MAX );
01520
01521 UU = Y;
01522 VV = x[K];
01523 for (J=MIN; J <= 19; J++)
01524 {
01525 U = NBY2[J]/(UU*UU+VV*VV);
01526 UU = Y+U*UU;
01527 VV = x[K]-U*VV;
01528 }
01529 ls[K] = UU/(UU*UU+VV*VV)/1.772454*fac;
01530 continue;
01531 L110: Y2 = Y*Y;
01532 if (x[K]+Y >= 5.) goto L113;
01533
01534 N = (int) (x[K]/H);
01535 DX = x[K]-HN[N+1];
01536 U = (((D4[N+1]*DX+D3[N+1])*DX+D2[N+1])*DX+D1[N+1])*DX+D0[N+1];
01537 V = 1.-2.*x[K]*U;
01538
01539 VV = exp(Y2-x[K]*x[K])*cos(2.*x[K]*Y)/1.128379-Y*V;
01540 UU = -Y;
01541 MAX = (int) (5.+(12.5-x[K])*.8*Y);
01542 for (I=2; I<=MAX; I+=2)
01543 {
01544 U = (x[K]*V+U)/RI[I];
01545 V = (x[K]*U+V)/RI[I+1];
01546 UU = -UU*Y2;
01547 VV = VV+V*UU;
01548 }
01549 ls[K] = 1.128379*VV*fac;
01550 continue;
01551 L112: Y2 = Y*Y;
01552 if (Y < 11.-.6875*x[K]) goto L113;
01553
01554 U = x[K]-XX[3];
01555 V = x[K]+XX[3];
01556 ls[K] = Y*(HH[3]/(Y2+U*U)+HH[3]/(Y2+V*V))*fac;
01557 continue;
01558
01559 L113: U = x[K]-XX[1];
01560 V = x[K]+XX[1];
01561 UU = x[K]-XX[2];
01562 VV = x[K]+XX[2];
01563 ls[K] = Y*(HH[1]/(Y2+U*U)+HH[1]/(Y2+V*V)+HH[2]/(Y2+UU*UU)+HH[2]/(Y2+
01564 VV*VV))*fac;
01565 continue;
01566 }
01567 }
01568
01569
01570
01595 void lineshape_rosenkranz_voigt_kuntz6(Vector& ls,
01596 Vector& x,
01597 Numeric f0,
01598 Numeric gamma,
01599 Numeric sigma,
01600 VectorView f_grid,
01601 const Index nf)
01602 {
01603
01604
01605
01606 assert( nf==f_grid.nelem() );
01607
01608
01609
01610
01611 extern const Numeric PI;
01612
01613
01614
01615
01616 if (x[4] < -.99)
01617 {
01618 ostringstream os;
01619 os << "You have to set abs_h2o if you want to use this lineshape.";
01620 throw runtime_error( os.str() );
01621 }
01622
01623
01624
01625 Numeric overlap;
01626 Numeric gamma_o2;
01627 Numeric gamma_o2_2;
01628 {
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644 gamma *= ( 1.0 - x[4] ) / ( 1 - x[3] );
01645
01646
01647
01648
01649
01650
01651
01652 overlap = (x[7] + x[8] * ( x[0] - 1.0)) *
01653 x[2] * x[1];
01654
01655
01656
01657 gamma_o2 = gamma + 1.1 * x[5] * x[2] * x[4] * x[0];
01658 gamma_o2_2 = gamma_o2 * gamma_o2;
01659 }
01660
01661
01662
01663 if ( (gamma_o2/sigma - 40) <= 0.0 )
01664 {
01665
01666 lineshape_voigt_kuntz6(ls,
01667 x,
01668 f0,
01669 gamma_o2,
01670 sigma,
01671 f_grid,
01672 nf);
01673 }
01674 else
01675 {
01676 Numeric FD, FS, SF1, SF2;
01677 for (Index J=0; J<(Index) nf; J++)
01678 {
01679 FD = f_grid[J] - f0;
01680 FS = f_grid[J] + f0;
01681 SF1 = (gamma_o2 + FD*overlap) / (FD*FD + gamma_o2_2);
01682 SF2 = (gamma_o2 - FS*overlap) / (FS*FS + gamma_o2_2);
01683 ls[J] = (SF1 + SF2) / PI;
01684 }
01685 }
01686 }
01687
01688
01713 void lineshape_rosenkranz_voigt_drayson(Vector& ls,
01714 Vector& x,
01715 Numeric f0,
01716 Numeric gamma,
01717 Numeric sigma,
01718 VectorView f_grid,
01719 const Index nf)
01720 {
01721
01722
01723
01724 assert( nf==f_grid.nelem() );
01725
01726
01727
01728
01729 extern const Numeric PI;
01730
01731
01732
01733 Numeric overlap;
01734 Numeric gamma_o2;
01735 Numeric gamma_o2_2;
01736 {
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752 gamma *= ( 1.0 - x[4] ) / ( 1 - x[3] );
01753
01754
01755
01756
01757
01758
01759 overlap = (x[7] + x[8] * ( x[0] - 1.0)) *
01760 x[2] * x[1];
01761
01762
01763
01764 gamma_o2 = gamma + 1.1 * x[5] * x[2] * x[4] * x[0];
01765 gamma_o2_2 = gamma_o2 * gamma_o2;
01766 }
01767
01768
01769
01770 if ( (gamma_o2/sigma - 40) <= 0.0 )
01771 {
01772
01773 lineshape_voigt_drayson(ls,
01774 x,
01775 f0,
01776 gamma_o2,
01777 sigma,
01778 f_grid,
01779 nf);
01780
01781
01782
01783
01784
01785
01786
01787
01788 Numeric f0_2 = f0 * f0;
01789 for (Index J=0; J<(Index) nf; J++)
01790 {
01791 ls[J] *= f0_2 / (f_grid[J] * f_grid[J]);
01792 }
01793 }
01794 else
01795 {
01796 Numeric FD, FS, SF1, SF2;
01797 for (Index J=0; J<(Index) nf; J++)
01798 {
01799 FD = f_grid[J] - f0;
01800 FS = f_grid[J] + f0;
01801 SF1 = (gamma_o2 + FD*overlap) / (FD*FD + gamma_o2_2);
01802 SF2 = (gamma_o2 - FS*overlap) / (FS*FS + gamma_o2_2);
01803 ls[J] = (SF1 + SF2) / PI;
01804 }
01805 }
01806 }
01807
01808
01809
01821 void chi_cousin(
01822 Numeric& chi,
01823 const Numeric& df )
01824 {
01825
01826 extern const Numeric HZ2CM;
01827
01828 const Numeric n2 = 0.79;
01829 const Numeric o2 = 0.21;
01830
01831 const Numeric df_cm = df * HZ2CM;
01832 const Numeric df_cm_abs = fabs( df_cm );
01833
01834 chi = 0;
01835
01836
01837 if( df_cm_abs <= 5 )
01838 { chi += n2; }
01839 else if( df_cm_abs <= 22 )
01840 { chi += n2 * 1.968 * exp( -0.1354 * df_cm_abs ); }
01841 else if( df_cm_abs <= 50 )
01842 { chi += n2 * 0.160 * exp( -0.0214 * df_cm_abs ); }
01843 else
01844 { chi += n2 * 0.162 * exp( -0.0216 * df_cm_abs ); }
01845
01846
01847 if( df_cm_abs <= 5 )
01848 { chi += o2; }
01849 else if( df_cm_abs <= 22 )
01850 { chi += o2 * 1.968 * exp( -0.1354 * df_cm_abs ); }
01851 else if( df_cm_abs <= 50 )
01852 { chi += o2 * 0.160 * exp( -0.0214 * df_cm_abs ); }
01853 else
01854 { chi += o2 * 0.162 * exp( -0.0216 * df_cm_abs ); }
01855 }
01856
01857
01858
01871 void lineshape_CO2_lorentz(
01872 Vector& ls,
01873 Vector& X _U_,
01874 Numeric f0,
01875 Numeric gamma,
01876 Numeric sigma _U_,
01877 VectorView f_grid,
01878 const Index nf )
01879 {
01880 assert( f_grid.nelem() == nf );
01881
01882
01883 extern const Numeric PI;
01884
01885
01886 const Numeric gamma2 = gamma * gamma;
01887 const Numeric fac = gamma/PI;
01888
01889 for ( Index i=0; i<nf; ++i )
01890 {
01891
01892 const Numeric df = f_grid[i] - f0;
01893
01894
01895 Numeric chi;
01896 chi_cousin( chi, df );
01897
01898
01899 ls[i] = chi * fac / ( df * df + gamma2 );
01900 }
01901 }
01902
01903
01904
01917 void lineshape_CO2_drayson(
01918 Vector& ls,
01919 Vector& X,
01920 Numeric f0,
01921 Numeric gamma,
01922 Numeric sigma,
01923 VectorView f_grid,
01924 const Index nf )
01925 {
01926 lineshape_voigt_drayson( ls, X, f0, gamma, sigma, f_grid, nf );
01927
01928 for ( Index i=0; i<nf; ++i )
01929 {
01930
01931 const Numeric df = f_grid[i] - f0;
01932
01933
01934 Numeric chi;
01935 chi_cousin( chi, df );
01936
01937
01938 ls[i] *= chi;
01939 }
01940 }
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01961 void lineshape_norm_no_norm(Vector& fac,
01962 Numeric f0 _U_,
01963 VectorView f_grid,
01964 const Numeric T _U_,
01965 const Index nf)
01966 {
01967
01968
01969
01970 if (f_grid.nelem()>-1)
01971 {
01972 assert( nf==f_grid.nelem() );
01973 }
01974
01975 for ( Index i=0; i<nf; ++i )
01976 {
01977 fac[i] = 1.0;
01978 }
01979 }
01980
01981
01982
01992 void lineshape_norm_linear(Vector& fac,
01993 Numeric f0,
01994 VectorView f_grid,
01995 const Numeric T _U_,
01996 const Index nf)
01997 {
01998
01999
02000
02001 assert( nf==f_grid.nelem() );
02002
02003 for ( Index i=0; i<nf; ++i )
02004 {
02005 fac[i] = f_grid[i] / f0;
02006 }
02007 }
02008
02019 void lineshape_norm_quadratic(Vector& fac,
02020 Numeric f0,
02021 VectorView f_grid,
02022 const Numeric T _U_,
02023 const Index nf)
02024 {
02025
02026
02027
02028 assert( nf==f_grid.nelem() );
02029
02030
02031 Numeric f0_2 = f0 * f0;
02032
02033 for ( Index i=0; i<nf; ++i )
02034 {
02035 fac[i] = (f_grid[i] * f_grid[i]) / f0_2;
02036 }
02037 }
02038
02055 void lineshape_norm_VVH(Vector& fac,
02056 Numeric f0,
02057 VectorView f_grid,
02058 const Numeric T,
02059 const Index nf)
02060 {
02061 extern const Numeric PLANCK_CONST;
02062 extern const Numeric BOLTZMAN_CONST;
02063
02064
02065
02066
02067 assert( nf==f_grid.nelem() );
02068
02069
02070 Numeric kT = 2.0 * BOLTZMAN_CONST * T;
02071
02072
02073 Numeric denom = f0 * tanh( PLANCK_CONST * f0 / kT );
02074
02075 for ( Index i=0; i<nf; ++i )
02076 {
02077 fac[i] = f_grid[i] * tanh( PLANCK_CONST * f_grid[i] / kT ) /
02078 denom;
02079 }
02080 }
02081
02082
02083
02084
02085
02086
02087
02088
02090 Array<LineshapeRecord> lineshape_data;
02091
02092 void define_lineshape_data()
02093 {
02094
02095 lineshape_data.resize(0);
02096
02097 lineshape_data.push_back
02098 (LineshapeRecord
02099 ("no_shape",
02100 "This lineshape does nothing. It only exists, because formally\n"
02101 "you have to specify a lineshape also for continuum tags.",
02102 lineshape_no_shape));
02103
02104 lineshape_data.push_back
02105 (LineshapeRecord
02106 ("Lorentz",
02107 "The Lorentz line shape.",
02108 lineshape_lorentz));
02109
02110 lineshape_data.push_back
02111 (LineshapeRecord
02112 ("Doppler",
02113 "The Doppler line shape.",
02114 lineshape_doppler));
02115
02116 lineshape_data.push_back
02117 (LineshapeRecord
02118 ("Voigt_Kuntz6",
02119 "The Voigt line shape. Approximation by Kuntz: Accuracy 2*10-6",
02120 lineshape_voigt_kuntz6));
02121
02122 lineshape_data.push_back
02123 (LineshapeRecord
02124 ("Voigt_Kuntz3",
02125 "The Voigt line shape. Approximation by Kuntz: Accuracy 2*10-3",
02126 lineshape_voigt_kuntz3));
02127
02128 lineshape_data.push_back
02129 (LineshapeRecord
02130 ("Voigt_Kuntz4",
02131 "The Voigt line shape. Approximation by Kuntz: Accuracy 2*10-4",
02132 lineshape_voigt_kuntz4));
02133
02134 lineshape_data.push_back
02135 (LineshapeRecord
02136 ("Voigt_Drayson",
02137 "The Voigt line shape. Approximation by Drayson.",
02138 lineshape_voigt_drayson));
02139
02140 lineshape_data.push_back
02141 (LineshapeRecord
02142 ("Rosenkranz_Voigt_Kuntz6",
02143 "Rosenkranz lineshape for oxygen with overlap correction, "
02144 "at high altitudes Voigt_Kuntz6.",
02145 lineshape_rosenkranz_voigt_kuntz6));
02146
02147 lineshape_data.push_back
02148 (LineshapeRecord
02149 ("Rosenkranz_Voigt_Drayson",
02150 "Rosenkranz lineshape for oxygen with overlap correction, "
02151 "at high altitudes Drayson.",
02152 lineshape_rosenkranz_voigt_drayson));
02153
02154 lineshape_data.push_back
02155 (LineshapeRecord
02156 ("CO2_Lorentz",
02157 "Special line shape for CO2 in the infrared, neglecting Doppler\n"
02158 "broadening and details of line mixing. The line shape can be\n"
02159 "expressed as\n"
02160 " chi(f,f0) * Lorentz(f,f0) \n"
02161 "\n"
02162 "The chi-factor follows Cousin et al. 1985. Broadening by N2 and O2\n"
02163 "is considered, while self-broadening (CO2-CO2) is neglected."
02164 "\n"
02165 "NOTE: Temperature dependency is not yet included. The chi factor is\n"
02166 "valid for 238 K.",
02167 lineshape_CO2_lorentz));
02168
02169 lineshape_data.push_back
02170 (LineshapeRecord
02171 ("CO2_Drayson",
02172 "Special line shape for CO2 in the infrared, neglecting details of\n"
02173 "line mixing. The line shape can be expressed as\n"
02174 " chi(f,f0) * Drayson(f,f0) \n"
02175 "\n"
02176 "The chi-factor follows Cousin et al. 1985. Broadening by N2 and O2\n"
02177 "is considered, while self-broadening (CO2-CO2) is neglected.\n"
02178 "\n"
02179 "NOTE: Temperature dependency is not yet included. The chi factor is\n"
02180 "valid for 238 K.",
02181 lineshape_CO2_drayson));
02182
02183 }
02184
02187 Array<LineshapeNormRecord> lineshape_norm_data;
02188
02189 void define_lineshape_norm_data()
02190 {
02191
02192 lineshape_norm_data.resize(0);
02193
02194 lineshape_norm_data.push_back
02195 (LineshapeNormRecord
02196 ("no_norm",
02197 "No normalization of the lineshape.",
02198 lineshape_norm_no_norm));
02199
02200 lineshape_norm_data.push_back
02201 (LineshapeNormRecord
02202 ("linear",
02203 "Linear normalization of the lineshape with f/f0.",
02204 lineshape_norm_linear));
02205
02206 lineshape_norm_data.push_back
02207 (LineshapeNormRecord
02208 ("quadratic",
02209 "Quadratic normalization of the lineshape with (f/f0)^2.",
02210 lineshape_norm_quadratic));
02211
02212 lineshape_norm_data.push_back
02213 (LineshapeNormRecord
02214 ("VVH",
02215 "Van Vleck Huber normalization of the lineshape with\n"
02216 " (f*tanh(h*f/(2*k*T))) / (f0*tanh(h*f0/(2*k*T))).\n"
02217 " The denominator is a result of catalogue intensities.",
02218 lineshape_norm_VVH));
02219 }