00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00347 #include <cmath>
00348 #include "arts.h"
00349 #include "matpackI.h"
00350 #include "array.h"
00351 #include "absorption.h"
00352 #include "messages.h"
00353 #include "continua.h"
00354
00355
00356
00357
00358
00359 extern const Numeric EULER_NUMBER;
00360 extern const Numeric LOG10_EULER_NUMBER;
00361 extern const Numeric NAT_LOG_TEN;
00362 extern const Numeric PI;
00363 extern const Numeric SPEED_OF_LIGHT;
00364
00365
00366
00367
00368
00369
00370
00371
00372 const Numeric GHz_to_Hz = 1.000000e9;
00373
00374 const Numeric Hz_to_GHz = 1.000000e-9;
00375
00376 const Numeric kPa_to_Pa = 1.000000e3;
00377
00378 const Numeric Pa_to_kPa = 1.000000e-3;
00379
00380 const Numeric hPa_to_Pa = 1.000000e2;
00381
00382 const Numeric Pa_to_hPa = 1.000000e-2;
00383
00384
00385 const Numeric dB_m_Hz = 0.1820427855916028e-06;
00386 const Numeric dB_km_GHz = 0.1820427855916028e+06;
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396 const Numeric dB_km_to_1_m = (1.00000e-3 / (10.0 * LOG10_EULER_NUMBER));
00397
00398
00399
00400
00401 const Numeric VMRCalcLimit = 1.000e-25;
00402
00403
00404
00405
00407
00441 void MPM87H2OAbsModel( MatrixView pxsec,
00442 const Numeric CCin,
00443 const Numeric CLin,
00444 const Numeric CWin,
00445 const String& model,
00446 ConstVectorView f_grid,
00447 ConstVectorView abs_p,
00448 ConstVectorView abs_t,
00449 ConstVectorView vmr )
00450 {
00451
00452
00453
00454
00455
00456 const Numeric mpm87[30][4] = {
00457 { 22.235080, 0.1090, 2.143, 27.84e-3},
00458 { 67.813960, 0.0011, 8.730, 27.60e-3},
00459 { 119.995940, 0.0007, 8.347, 27.00e-3},
00460 { 183.310117, 2.3000, 0.653, 31.64e-3},
00461 { 321.225644, 0.0464, 6.156, 21.40e-3},
00462 { 325.152919, 1.5400, 1.515, 29.70e-3},
00463 { 336.187000, 0.0010, 9.802, 26.50e-3},
00464 { 380.197372, 11.9000, 1.018, 30.36e-3},
00465 { 390.134508, 0.0044, 7.318, 19.00e-3},
00466 { 437.346667, 0.0637, 5.015, 13.70e-3},
00467 { 439.150812, 0.9210, 3.561, 16.40e-3},
00468 { 443.018295, 0.1940, 5.015, 14.40e-3},
00469 { 448.001075, 10.6000, 1.370, 23.80e-3},
00470 { 470.888947, 0.3300, 3.561, 18.20e-3},
00471 { 474.689127, 1.2800, 2.342, 19.80e-3},
00472 { 488.491133, 0.2530, 2.814, 24.90e-3},
00473 { 503.568532, 0.0374, 6.693, 11.50e-3},
00474 { 504.482692, 0.0125, 6.693, 11.90e-3},
00475 { 556.936002, 510.0000, 0.114, 30.00e-3},
00476 { 620.700807, 5.0900, 2.150, 22.30e-3},
00477 { 658.006500, 0.2740, 7.767, 30.00e-3},
00478 { 752.033227, 250.0000, 0.336, 28.60e-3},
00479 { 841.073593, 0.0130, 8.113, 14.10e-3},
00480 { 859.865000, 0.1330, 7.989, 28.60e-3},
00481 { 899.407000, 0.0550, 7.845, 28.60e-3},
00482 { 902.555000, 0.0380, 8.360, 26.40e-3},
00483 { 906.205524, 0.1830, 5.039, 23.40e-3},
00484 { 916.171582, 8.5600, 1.369, 25.30e-3},
00485 { 970.315022, 9.1600, 1.842, 24.00e-3},
00486 { 987.926764, 138.0000, 0.178, 28.60e-3}};
00487
00488
00489
00490 const Numeric CC_MPM87 = 1.00000;
00491 const Numeric CL_MPM87 = 1.00000;
00492 const Numeric CW_MPM87 = 1.00000;
00493
00494
00495
00496
00497 Numeric CC, CL, CW;
00498 if ( model == "MPM87" )
00499 {
00500 CC = CC_MPM87;
00501 CL = CL_MPM87;
00502 CW = CW_MPM87;
00503 }
00504 else if ( model == "MPM87Lines" )
00505 {
00506 CC = 0.000;
00507 CL = CL_MPM87;
00508 CW = CW_MPM87;
00509 }
00510 else if ( model == "MPM87Continuum" )
00511 {
00512 CC = CC_MPM87;
00513 CL = 0.000;
00514 CW = 0.000;
00515 }
00516 else if ( model == "user" )
00517 {
00518 CC = CCin;
00519 CL = CLin;
00520 CW = CWin;
00521 }
00522 else
00523 {
00524 ostringstream os;
00525 os << "H2O-MPM87: ERROR! Wrong model values given.\n"
00526 << "Valid models are: 'MPM87', 'MPM87Lines', 'MPM87Continuum', and 'user'" << '\n';
00527 throw runtime_error(os.str());
00528 }
00529 out3 << "H2O-MPM87: (model=" << model << ") parameter values in use:\n"
00530 << " CC = " << CC << "\n"
00531 << " CL = " << CL << "\n"
00532 << " CW = " << CW << "\n";
00533
00534
00535
00536 const Index i_first = 0;
00537 const Index i_last = 29;
00538
00539 const Index n_p = abs_p.nelem();
00540 const Index n_f = f_grid.nelem();
00541
00542
00543 assert ( n_p==abs_t.nelem() );
00544 assert ( n_p==vmr.nelem() );
00545
00546
00547
00548 assert ( n_f==pxsec.nrows() );
00549 assert ( n_p==pxsec.ncols() );
00550
00551
00552 for ( Index i=0; i<n_p; ++i )
00553 {
00554
00555
00556 Numeric pwv_dummy = Pa_to_kPa * abs_p[i];
00557
00558 Numeric theta = (300.0 / abs_t[i]);
00559
00560 Numeric pwv = Pa_to_kPa * abs_p[i] * vmr[i];
00561
00562 Numeric pda = (Pa_to_kPa * abs_p[i]) - pwv;
00563
00564 Numeric Nppc = CC * pwv_dummy * pow(theta, (Numeric)3.0) * 1.000e-5
00565 * ( (0.113 * pda) + (3.57 * pwv * pow(theta, (Numeric)7.8)) );
00566
00567
00568 for ( Index s=0; s<n_f; ++s )
00569 {
00570
00571 Numeric ff = f_grid[s] * Hz_to_GHz;
00572
00573 Numeric Nppl = 0.000;
00574
00575
00576 for ( Index l = i_first; l <= i_last; ++l )
00577 {
00578
00579 Numeric strength = CL * pwv_dummy * mpm87[l][1]
00580 * pow(theta,(Numeric)3.5) * exp(mpm87[l][2]*(1.000-theta));
00581
00582 Numeric gam = CW * mpm87[l][3] *
00583 ( (4.80 * pwv * pow(theta, (Numeric)1.1)) +
00584 ( pda * pow(theta, (Numeric)0.6)) );
00585
00586
00587
00588 Nppl += strength * MPMLineShapeFunction(gam, mpm87[l][0], ff);
00589 }
00590
00591 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * ( Nppl + (Nppc * ff) );
00592 }
00593 }
00594 return;
00595 }
00596
00597
00599
00624 void MPM89H2OAbsModel( MatrixView pxsec,
00625 const Numeric CCin,
00626 const Numeric CLin,
00627 const Numeric CWin,
00628 const String& model,
00629 ConstVectorView f_grid,
00630 ConstVectorView abs_p,
00631 ConstVectorView abs_t,
00632 ConstVectorView vmr )
00633 {
00634
00635
00636
00637
00638
00639 const Numeric mpm89[30][7] = {
00640 { 22.235080, 0.1090, 2.143, 28.11, 0.69, 4.80, 1.00},
00641 { 67.813960, 0.0011, 8.735, 28.58, 0.69, 4.93, 0.82},
00642 { 119.995940, 0.0007, 8.356, 29.48, 0.70, 4.78, 0.79},
00643 { 183.310074, 2.3000, 0.668, 28.13, 0.64, 5.30, 0.85},
00644 { 321.225644, 0.0464, 6.181, 23.03, 0.67, 4.69, 0.54},
00645 { 325.152919, 1.5400, 1.540, 27.83, 0.68, 4.85, 0.74},
00646 { 336.187000, 0.0010, 9.829, 26.93, 0.69, 4.74, 0.61},
00647 { 380.197372, 11.9000, 1.048, 28.73, 0.69, 5.38, 0.84},
00648 { 390.134508, 0.0044, 7.350, 21.52, 0.63, 4.81, 0.55},
00649 { 437.346667, 0.0637, 5.050, 18.45, 0.60, 4.23, 0.48},
00650 { 439.150812, 0.9210, 3.596, 21.00, 0.63, 4.29, 0.52},
00651 { 443.018295, 0.1940, 5.050, 18.60, 0.60, 4.23, 0.50},
00652 { 448.001075, 10.6000, 1.405, 26.32, 0.66, 4.84, 0.67},
00653 { 470.888947, 0.3300, 3.599, 21.52, 0.66, 4.57, 0.65},
00654 { 474.689127, 1.2800, 2.381, 23.55, 0.65, 4.65, 0.64},
00655 { 488.491133, 0.2530, 2.853, 26.02, 0.69, 5.04, 0.72},
00656 { 503.568532, 0.0374, 6.733, 16.12, 0.61, 3.98, 0.43},
00657 { 504.482692, 0.0125, 6.733, 16.12, 0.61, 4.01, 0.45},
00658 { 556.936002, 510.0000, 0.159, 32.10, 0.69, 4.11, 1.00},
00659 { 620.700807, 5.0900, 2.200, 24.38, 0.71, 4.68, 0.68},
00660 { 658.006500, 0.2740, 7.820, 32.10, 0.69, 4.14, 1.00},
00661 { 752.033227, 250.0000, 0.396, 30.60, 0.68, 4.09, 0.84},
00662 { 841.073593, 0.0130, 8.180, 15.90, 0.33, 5.76, 0.45},
00663 { 859.865000, 0.1330, 7.989, 30.60, 0.68, 4.09, 0.84},
00664 { 899.407000, 0.0550, 7.917, 29.85, 0.68, 4.53, 0.90},
00665 { 902.555000, 0.0380, 8.432, 28.65, 0.70, 5.10, 0.95},
00666 { 906.205524, 0.1830, 5.111, 24.08, 0.70, 4.70, 0.53},
00667 { 916.171582, 8.5600, 1.442, 26.70, 0.70, 4.78, 0.78},
00668 { 970.315022, 9.1600, 1.920, 25.50, 0.64, 4.94, 0.67},
00669 { 987.926764, 138.0000, 0.258, 29.85, 0.68, 4.55, 0.90}};
00670
00671
00672
00673
00674 const Numeric CC_MPM89 = 1.00000;
00675 const Numeric CL_MPM89 = 1.00000;
00676 const Numeric CW_MPM89 = 1.00000;
00677
00678
00679
00680
00681 Numeric CC, CL, CW;
00682 if ( model == "MPM89" )
00683 {
00684 CC = CC_MPM89;
00685 CL = CL_MPM89;
00686 CW = CW_MPM89;
00687 }
00688 else if ( model == "MPM89Lines" )
00689 {
00690 CC = 0.000;
00691 CL = CL_MPM89;
00692 CW = CW_MPM89;
00693 }
00694 else if ( model == "MPM89Continuum" )
00695 {
00696 CC = CC_MPM89;
00697 CL = 0.000;
00698 CW = 0.000;
00699 }
00700 else if ( model == "user" )
00701 {
00702 CC = CCin;
00703 CL = CLin;
00704 CW = CWin;
00705 }
00706 else
00707 {
00708 ostringstream os;
00709 os << "H2O-MPM89: ERROR! Wrong model values given.\n"
00710 << "Valid models are: 'MPM89', 'MPM89Lines', 'MPM89Continuum', and 'user'" << '\n';
00711 throw runtime_error(os.str());
00712 }
00713 out3 << "H2O-MPM89: (model=" << model << ") parameter values in use:\n"
00714 << " CC = " << CC << "\n"
00715 << " CL = " << CL << "\n"
00716 << " CW = " << CW << "\n";
00717
00718
00719
00720 const Index i_first = 0;
00721 const Index i_last = 29;
00722
00723 const Index n_p = abs_p.nelem();
00724 const Index n_f = f_grid.nelem();
00725
00726
00727 assert ( n_p==abs_t.nelem() );
00728 assert ( n_p==vmr.nelem() );
00729
00730
00731
00732 assert ( n_f==pxsec.nrows() );
00733 assert ( n_p==pxsec.ncols() );
00734
00735
00736 for ( Index i=0; i<n_p; ++i )
00737 {
00738
00739
00740 Numeric pwv_dummy = Pa_to_kPa * abs_p[i];
00741
00742 Numeric theta = (300.0 / abs_t[i]);
00743
00744 Numeric pwv = Pa_to_kPa * abs_p[i] * vmr[i];
00745
00746 Numeric pda = (Pa_to_kPa * abs_p[i]) - pwv;
00747
00748 Numeric Nppc = CC * pwv_dummy * pow(theta, (Numeric)3.0) * 1.000e-5
00749 * ( (0.113 * pda) + (3.57 * pwv * pow(theta, (Numeric)7.5)) );
00750
00751
00752 for ( Index s=0; s<n_f; ++s )
00753 {
00754
00755 Numeric ff = f_grid[s] * Hz_to_GHz;
00756
00757 Numeric Nppl = 0.000;
00758
00759
00760 for ( Index l = i_first; l <= i_last; ++l )
00761 {
00762
00763 Numeric strength = CL * pwv_dummy * mpm89[l][1]
00764 * pow(theta, (Numeric)3.5) * exp(mpm89[l][2]*(1.000-theta));
00765
00766 Numeric gam = CW * mpm89[l][3] * 0.001
00767 * ( mpm89[l][5] * pwv * pow(theta, mpm89[l][6]) +
00768 pda * pow(theta, mpm89[l][4]) );
00769
00770
00771
00772
00773
00774 Nppl += strength * MPMLineShapeFunction(gam, mpm89[l][0], ff);
00775 }
00776
00777 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * ( Nppl + (Nppc * ff) );
00778 }
00779 }
00780 return;
00781 }
00782
00783
00785
00825 void MPM02H2OAbsModel( MatrixView pxsec,
00826 const Numeric CCin,
00827 const Numeric CLin,
00828 const Numeric CWin,
00829 const String& model,
00830 ConstVectorView f_grid,
00831 ConstVectorView abs_p,
00832 ConstVectorView abs_t,
00833 ConstVectorView vmr )
00834 {
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862 const Numeric mpm02[35][7] = {
00863 { 22235.0800, 0.10947, 2.1678, 2.811, 4.80, 0.69, 0.61},
00864 { 67803.9600, 0.00111, 8.7518, 2.858, 4.93, 0.69, 0.82},
00865 { 119995.9400, 0.00072, 8.3688, 2.948, 4.78, 0.70, 0.79},
00866 { 183310.1170, 2.30351, 0.6794, 3.050, 5.30, 0.76, 0.85},
00867 { 321225.6400, 0.04646, 6.1792, 2.303, 4.69, 0.67, 0.54},
00868 { 325152.9190, 1.53869, 1.5408, 2.783, 4.85, 0.68, 0.74},
00869 { 336227.6200, 0.00099, 9.8233, 2.693, 4.74, 0.64, 0.61},
00870 { 380197.3720, 11.9079, 1.0439, 2.873, 5.38, 0.72, 0.89},
00871 { 390134.5080, 0.00437, 7.3408, 2.152, 4.81, 0.63, 0.55},
00872 { 437346.6670, 0.06378, 5.0384, 1.845, 4.23, 0.60, 0.48},
00873 { 439150.8120, 0.92144, 3.5853, 2.100, 4.29, 0.63, 0.62},
00874 { 443018.2950, 0.19384, 5.0384, 1.860, 4.23, 0.60, 0.50},
00875 { 448001.0750, 10.6190, 1.3952, 2.632, 4.84, 0.66, 0.67},
00876 { 470888.9470, 0.33005, 3.5853, 2.152, 4.57, 0.66, 0.65},
00877 { 474689.1270, 1.27660, 2.3674, 2.355, 4.65, 0.65, 0.64},
00878 { 488491.1330, 0.25312, 2.8391, 2.602, 5.04, 0.69, 0.72},
00879 { 503568.5320, 0.03746, 6.7158, 1.612, 3.98, 0.61, 0.43},
00880 { 504482.6920, 0.01250, 6.7158, 1.612, 4.01, 0.61, 0.45},
00881 { 547676.4400, 1.01467, 0.1427, 2.600, 4.50, 0.69, 1.00},
00882 { 552020.9600, 0.18668, 0.1452, 2.600, 4.50, 0.69, 1.00},
00883 { 556936.0020, 510.51086, 0.1405, 3.210, 4.11, 0.69, 1.00},
00884 { 620700.8070, 5.10539, 2.3673, 2.438, 4.68, 0.71, 0.68},
00885 { 645905.6200, 0.00667, 8.6065, 1.800, 4.00, 0.60, 0.43},
00886 { 658006.5500, 0.27451, 7.7889, 3.210, 4.14, 0.69, 1.00},
00887 { 752033.2270, 249.68466, 0.3625, 3.060, 4.09, 0.68, 0.84},
00888 { 841051.1620, 0.01308, 8.1347, 1.590, 5.76, 0.33, 0.45},
00889 { 859965.6490, 0.13326, 8.0114, 3.060, 4.09, 0.68, 0.84},
00890 { 899302.1710, 0.05492, 7.8676, 2.985, 4.53, 0.68, 0.90},
00891 { 902609.4360, 0.03854, 8.3823, 2.865, 5.10, 0.70, 0.95},
00892 { 906206.1180, 0.18323, 5.0628, 2.408, 4.70, 0.70, 0.53},
00893 { 916171.5820, 8.56444, 1.3943, 2.670, 4.78, 0.70, 0.78},
00894 { 923113.1900, 0.00784, 10.2441, 2.900, 5.00, 0.66, 0.67},
00895 { 970315.0220, 9.16280, 1.8673, 2.550, 4.94, 0.64, 0.67},
00896 { 987926.7640, 138.28461, 0.2045, 2.985, 4.55, 0.68, 0.90},
00897
00898 { 1780.000000, 2230.00000, 0.952, 17.620, 30.50, 2.00, 5.00}};
00899
00900
00901
00902
00903
00904
00905
00906 const Numeric CC_MPM02 = 1.00000;
00907 const Numeric CL_MPM02 = 1.00000;
00908 const Numeric CW_MPM02 = 1.00000;
00909
00910
00911
00912
00913 Numeric CC, CL, CW;
00914
00915 Index i_first = 0;
00916 Index i_last = 34;
00917 if ( model == "MPM02" )
00918 {
00919 CC = CC_MPM02;
00920 CL = CL_MPM02;
00921 CW = CW_MPM02;
00922 i_first = 0;
00923 i_last = 34;
00924 }
00925 else if ( model == "MPM02Lines" )
00926 {
00927 CC = 0.000;
00928 CL = CL_MPM02;
00929 CW = CW_MPM02;
00930 i_first = 0;
00931 i_last = 33;
00932 }
00933 else if ( model == "MPM02Continuum" )
00934 {
00935 CC = CC_MPM02;
00936 CL = 0.000;
00937 CW = 0.000;
00938 i_first = 34;
00939 i_last = 34;
00940 }
00941 else if ( model == "user" )
00942 {
00943 CC = CCin;
00944 CL = CLin;
00945 CW = CWin;
00946 i_first = 0;
00947 i_last = 34;
00948
00949 }
00950 else
00951 {
00952 ostringstream os;
00953 os << "H2O-MPM02: ERROR! Wrong model values given.\n"
00954 << "Valid models are: 'MPM02', 'MPM02Lines', 'MPM02Continuum', and 'user'" << '\n';
00955 throw runtime_error(os.str());
00956 }
00957 out3 << "H2O-MPM02: (model=" << model << ") parameter values in use:\n"
00958 << " CC = " << CC << "\n"
00959 << " CL = " << CL << "\n"
00960 << " CW = " << CW << "\n";
00961
00962
00963 const Index n_p = abs_p.nelem();
00964 const Index n_f = f_grid.nelem();
00965
00966
00967 assert ( n_p==abs_t.nelem() );
00968 assert ( n_p==vmr.nelem() );
00969
00970
00971
00972 assert ( n_f==pxsec.nrows() );
00973 assert ( n_p==pxsec.ncols() );
00974
00975
00976 for ( Index i=0; i<n_p; ++i )
00977 {
00978
00979
00980 Numeric pwv_dummy = Pa_to_hPa * abs_p[i];
00981
00982 Numeric theta = (300.0 / abs_t[i]);
00983
00984 Numeric pwv = Pa_to_hPa * abs_p[i] * vmr[i];
00985
00986 Numeric pda = (Pa_to_hPa * abs_p[i]) - pwv;
00987
00988
00989
00990 for ( Index s=0; s<n_f; ++s )
00991 {
00992
00993 Numeric ff = f_grid[s] * Hz_to_GHz;
00994
00995 for ( Index l = i_first; l <= i_last; ++l )
00996 {
00997
00998
00999 Numeric strength = 0.00;
01000 Numeric gam = 0.00;
01001 if ( (l >= 0) && (l <= 33) )
01002 {
01003 strength = CL * pwv_dummy * mpm02[l][1] *
01004 pow(theta, (Numeric)3.5) * exp(mpm02[l][2]*(1.0-theta));
01005
01006 gam = CW * mpm02[l][3] * 0.001 *
01007 ( (mpm02[l][4] * pwv * pow(theta, mpm02[l][6])) +
01008 ( pda * pow(theta, mpm02[l][5])) );
01009 }
01010 else if ( l == 34 )
01011 {
01012 strength = CC * pwv_dummy * mpm02[l][1] *
01013 pow(theta, (Numeric)3.5) * exp(mpm02[l][2]*(1.0-theta));
01014
01015 gam = mpm02[l][3] * 0.001 *
01016 ( (mpm02[l][4] * pwv * pow(theta, mpm02[l][6])) +
01017 ( pda * pow(theta, mpm02[l][5])) );
01018 }
01019 else
01020 {
01021 ostringstream os;
01022 os << "H2O-MPM02: wrong line number detected l=" << l << " (0-34)\n";
01023 throw runtime_error(os.str());
01024 return;
01025 }
01026
01027
01028
01029
01030
01031 Numeric Npp = strength * MPMLineShapeFunction(gam, mpm02[l][0], ff);
01032
01033 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * Npp;
01034 }
01035 }
01036 }
01037 return;
01038 }
01039
01040
01041
01043
01082 void MPM93H2OAbsModel( MatrixView pxsec,
01083 const Numeric CCin,
01084 const Numeric CLin,
01085 const Numeric CWin,
01086 const String& model,
01087 ConstVectorView f_grid,
01088 ConstVectorView abs_p,
01089 ConstVectorView abs_t,
01090 ConstVectorView vmr )
01091 {
01092
01093
01094
01095
01096
01097 const Numeric mpm93[35][7] = {
01098 { 22.235080, 0.01130, 2.143, 2.811, 4.80, 0.69, 1.00},
01099 { 67.803960, 0.00012, 8.735, 2.858, 4.93, 0.69, 0.82},
01100 { 119.995940, 0.00008, 8.356, 2.948, 4.78, 0.70, 0.79},
01101 { 183.310091, 0.24200, 0.668, 3.050, 5.30, 0.64, 0.85},
01102 { 321.225644, 0.00483, 6.181, 2.303, 4.69, 0.67, 0.54},
01103 { 325.152919, 0.14990, 1.540, 2.783, 4.85, 0.68, 0.74},
01104 { 336.222601, 0.00011, 9.829, 2.693, 4.74, 0.69, 0.61},
01105 { 380.197372, 1.15200, 1.048, 2.873, 5.38, 0.54, 0.89},
01106 { 390.134508, 0.00046, 7.350, 2.152, 4.81, 0.63, 0.55},
01107 { 437.346667, 0.00650, 5.050, 1.845, 4.23, 0.60, 0.48},
01108 { 439.150812, 0.09218, 3.596, 2.100, 4.29, 0.63, 0.52},
01109 { 443.018295, 0.01976, 5.050, 1.860, 4.23, 0.60, 0.50},
01110 { 448.001075, 1.03200, 1.405, 2.632, 4.84, 0.66, 0.67},
01111 { 470.888947, 0.03297, 3.599, 2.152, 4.57, 0.66, 0.65},
01112 { 474.689127, 0.12620, 2.381, 2.355, 4.65, 0.65, 0.64},
01113 { 488.491133, 0.02520, 2.853, 2.602, 5.04, 0.69, 0.72},
01114 { 503.568532, 0.00390, 6.733, 1.612, 3.98, 0.61, 0.43},
01115 { 504.482692, 0.00130, 6.733, 1.612, 4.01, 0.61, 0.45},
01116
01117
01118 { 547.676440, 0.97010*0.00199983, 0.114, 2.600, 4.50, 0.70, 1.00},
01119 { 552.020960, 1.47700*0.00037200, 0.114, 2.600, 4.50, 0.70, 1.00},
01120 { 556.936002, 48.74000, 0.159, 3.210, 4.11, 0.69, 1.00},
01121 { 620.700807, 0.50120, 2.200, 2.438, 4.68, 0.71, 0.68},
01122 { 645.866155, 0.00713, 8.580, 1.800, 4.00, 0.60, 0.50},
01123 { 658.005280, 0.03022, 7.820, 3.210, 4.14, 0.69, 1.00},
01124 { 752.033227, 23.96000, 0.396, 3.060, 4.09, 0.68, 0.84},
01125 { 841.053973, 0.00140, 8.180, 1.590, 5.76, 0.33, 0.45},
01126 { 859.962313, 0.01472, 7.989, 3.060, 4.09, 0.68, 0.84},
01127 { 899.306675, 0.00605, 7.917, 2.985, 4.53, 0.68, 0.90},
01128 { 902.616173, 0.00426, 8.432, 2.865, 5.10, 0.70, 0.95},
01129 { 906.207325, 0.01876, 5.111, 2.408, 4.70, 0.70, 0.53},
01130 { 916.171582, 0.83400, 1.442, 2.670, 4.78, 0.70, 0.78},
01131 { 923.118427, 0.00869, 10.220, 2.900, 5.00, 0.70, 0.80},
01132 { 970.315022, 0.89720, 1.920, 2.550, 4.94, 0.64, 0.67},
01133 { 987.926764, 13.21000, 0.258, 2.985, 4.55, 0.68, 0.90},
01134
01135 { 1780.000000, 2230.00000, 0.952, 17.620, 30.50, 2.00, 5.00}};
01136
01137
01138
01139
01140
01141
01142
01143 const Numeric CC_MPM93 = 1.00000;
01144 const Numeric CL_MPM93 = 1.00000;
01145 const Numeric CW_MPM93 = 1.00000;
01146
01147
01148
01149
01150 Numeric CC, CL, CW;
01151
01152 Index i_first = 0;
01153 Index i_last = 34;
01154 if ( model == "MPM93" )
01155 {
01156 CC = CC_MPM93;
01157 CL = CL_MPM93;
01158 CW = CW_MPM93;
01159 i_first = 0;
01160 i_last = 34;
01161 }
01162 else if ( model == "MPM93Lines" )
01163 {
01164 CC = 0.000;
01165 CL = CL_MPM93;
01166 CW = CW_MPM93;
01167 i_first = 0;
01168 i_last = 33;
01169 }
01170 else if ( model == "MPM93Continuum" )
01171 {
01172 CC = CC_MPM93;
01173 CL = 0.000;
01174 CW = 0.000;
01175 i_first = 34;
01176 i_last = 34;
01177 }
01178 else if ( model == "user" )
01179 {
01180 CC = CCin;
01181 CL = CLin;
01182 CW = CWin;
01183 i_first = 0;
01184 i_last = 34;
01185
01186 }
01187 else
01188 {
01189 ostringstream os;
01190 os << "H2O-MPM93: ERROR! Wrong model values given.\n"
01191 << "Valid models are: 'MPM93', 'MPM93Lines', 'MPM93Continuum', and 'user'" << '\n';
01192 throw runtime_error(os.str());
01193 }
01194 out3 << "H2O-MPM93: (model=" << model << ") parameter values in use:\n"
01195 << " CC = " << CC << "\n"
01196 << " CL = " << CL << "\n"
01197 << " CW = " << CW << "\n";
01198
01199
01200 const Index n_p = abs_p.nelem();
01201 const Index n_f = f_grid.nelem();
01202
01203
01204 assert ( n_p==abs_t.nelem() );
01205 assert ( n_p==vmr.nelem() );
01206
01207
01208
01209 assert ( n_f==pxsec.nrows() );
01210 assert ( n_p==pxsec.ncols() );
01211
01212
01213 for ( Index i=0; i<n_p; ++i )
01214 {
01215
01216
01217 Numeric pwv_dummy = Pa_to_hPa * abs_p[i];
01218
01219 Numeric theta = (300.0 / abs_t[i]);
01220
01221 Numeric pwv = Pa_to_hPa * abs_p[i] * vmr[i];
01222
01223 Numeric pda = (Pa_to_hPa * abs_p[i]) - pwv;
01224
01225
01226
01227 for ( Index s=0; s<n_f; ++s )
01228 {
01229
01230 Numeric ff = f_grid[s] * Hz_to_GHz;
01231
01232 for ( Index l = i_first; l <= i_last; ++l )
01233 {
01234
01235
01236 Numeric strength = 0.00;
01237 Numeric gam = 0.00;
01238 if ( (l >= 0) && (l <= 33) )
01239 {
01240 strength = CL * pwv_dummy * mpm93[l][1]
01241 * pow(theta, (Numeric)3.5) * exp(mpm93[l][2]*(1.0-theta));
01242
01243 gam = CW * mpm93[l][3] * 0.001 *
01244 ( (mpm93[l][4] * pwv * pow(theta, mpm93[l][6])) +
01245 ( pda * pow(theta, mpm93[l][5])) );
01246 }
01247 else if ( l == 34 )
01248 {
01249 strength = CC * pwv_dummy * mpm93[l][1]
01250 * pow(theta, (Numeric)3.5) * exp(mpm93[l][2]*(1.0-theta));
01251
01252 gam = mpm93[l][3] * 0.001 *
01253 ( (mpm93[l][4] * pwv * pow(theta, mpm93[l][6])) +
01254 ( pda * pow(theta, mpm93[l][5])) );
01255 }
01256 else
01257 {
01258 ostringstream os;
01259 os << "H2O-MPM93: wrong line number detected l=" << l << " (0-34)\n";
01260 throw runtime_error(os.str());
01261 return;
01262 }
01263
01264
01265
01266
01267
01268 Numeric Npp = strength * MPMLineShapeFunction(gam, mpm93[l][0], ff);
01269
01270 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * Npp;
01271 }
01272 }
01273 }
01274 return;
01275 }
01276
01277
01279
01305 void PWR98H2OAbsModel( MatrixView pxsec,
01306 const Numeric CCin,
01307 const Numeric CLin,
01308 const Numeric CWin,
01309 const String& model,
01310 ConstVectorView f_grid,
01311 ConstVectorView abs_p,
01312 ConstVectorView abs_t,
01313 ConstVectorView vmr )
01314 {
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332 const Numeric PWRfl[15] = { 22.2350800, 183.3101170, 321.2256400, 325.1529190, 380.1973720,
01333 439.1508120, 443.0182950, 448.0010750, 470.8889470, 474.6891270,
01334 488.4911330, 556.9360020, 620.7008070, 752.0332270, 916.1715820 };
01335
01336 const Numeric PWRs1[15] = { 1.31e-14, 2.273e-12, 8.036e-14, 2.694e-12, 2.438e-11,
01337 2.179e-12, 4.624e-13, 2.562e-11, 8.369e-13, 3.263e-12,
01338 6.659e-13, 1.531e-9, 1.707e-11, 1.011e-9, 4.227e-11 };
01339
01340 const Numeric PWRb2[15] = { 2.144, 0.668, 6.179, 1.541, 1.048,
01341 3.595, 5.048, 1.405, 3.597, 2.379,
01342 2.852, 0.159, 2.391, 0.396, 1.441 };
01343
01344 const Numeric PWRw3[15] = { 0.00281, 0.00281, 0.00230, 0.00278, 0.00287,
01345 0.00210, 0.00186, 0.00263, 0.00215, 0.00236,
01346 0.00260, 0.00321, 0.00244, 0.00306, 0.00267 };
01347
01348 const Numeric PWRx[15] = { 0.69, 0.64, 0.67, 0.68, 0.54,
01349 0.63, 0.60, 0.66, 0.66, 0.65,
01350 0.69, 0.69, 0.71, 0.68, 0.70 };
01351
01352 const Numeric PWRws[15] = { 0.01349, 0.01491, 0.01080, 0.01350, 0.01541,
01353 0.00900, 0.00788, 0.01275, 0.00983, 0.01095,
01354 0.01313, 0.01320, 0.01140, 0.01253, 0.01275 };
01355
01356
01357 const Numeric PWRxs[15] = { 0.61, 0.85, 0.54, 0.74, 0.89,
01358 0.52, 0.50, 0.67, 0.65, 0.64,
01359 0.72, 1.00, 0.68, 0.84, 0.78 };
01360
01361
01362
01363 const Numeric CC_PWR98 = 1.00000;
01364 const Numeric CL_PWR98 = 1.00000;
01365 const Numeric CW_PWR98 = 1.00000;
01366
01367
01368
01369
01370 Numeric CC, CL, CW;
01371 if ( model == "Rosenkranz" )
01372 {
01373 CC = CC_PWR98;
01374 CL = CL_PWR98;
01375 CW = CW_PWR98;
01376 }
01377 else if ( model == "RosenkranzLines" )
01378 {
01379 CC = 0.000;
01380 CL = CL_PWR98;
01381 CW = CW_PWR98;
01382 }
01383 else if ( model == "RosenkranzContinuum" )
01384 {
01385 CC = CC_PWR98;
01386 CL = 0.000;
01387 CW = 0.000;
01388 }
01389 else if ( model == "user" )
01390 {
01391 CC = CCin;
01392 CL = CLin;
01393 CW = CWin;
01394 }
01395 else
01396 {
01397 ostringstream os;
01398 os << "H2O-PWR98: ERROR! Wrong model values given.\n"
01399 << "Valid models are: 'Rosenkranz', 'RosenkranzLines', 'RosenkranzContinuum', and 'user'" << '\n';
01400 throw runtime_error(os.str());
01401 }
01402 out3 << "H2O-PWR98: (model=" << model << ") parameter values in use:\n"
01403 << " CC = " << CC << "\n"
01404 << " CL = " << CL << "\n"
01405 << " CW = " << CW << "\n";
01406
01407
01408 const Index n_p = abs_p.nelem();
01409 const Index n_f = f_grid.nelem();
01410
01411
01412 assert ( n_p==abs_t.nelem() );
01413 assert ( n_p==vmr.nelem() );
01414
01415
01416
01417 assert ( n_f==pxsec.nrows() );
01418 assert ( n_p==pxsec.ncols() );
01419
01420
01421 for ( Index i=0; i<n_p; ++i )
01422 {
01423
01424
01425 Numeric pvap_dummy = Pa_to_hPa * abs_p[i];
01426
01427 Numeric pvap = Pa_to_hPa * abs_p[i] * vmr[i];
01428
01429 Numeric pda = (Pa_to_hPa * abs_p[i]) - pvap;
01430
01431
01432
01433
01434
01435
01436 Numeric den_dummy = 3.335e16 * (2.1667 * abs_p[i] / abs_t[i]);
01437
01438 Numeric ti = (300.0 / abs_t[i]);
01439 Numeric ti2 = pow(ti, (Numeric)2.5);
01440
01441
01442 Numeric con = CC * pvap_dummy * pow(ti, (Numeric)3.0) * 1.000e-9
01443 * ( (0.543 * pda) + (17.96 * pvap * pow(ti, (Numeric)4.5)) );
01444
01445
01446 for ( Index s=0; s<n_f; ++s )
01447 {
01448
01449 Numeric ff = f_grid[s] * Hz_to_GHz;
01450
01451 Numeric sum = 0.000;
01452
01453
01454 for (Index l = 0; l < 15; l++)
01455 {
01456 Numeric width = ( CW * PWRw3[l] * pda * pow(ti, PWRx[l]) ) +
01457 ( PWRws[l] * pvap * pow(ti, PWRxs[l]));
01458
01459
01460 Numeric wsq = width * width;
01461 Numeric strength = CL * PWRs1[l] * ti2 * exp(PWRb2[l]*(1.0 - ti));
01462
01463 Numeric df0 = ff - PWRfl[l];
01464 Numeric df1 = ff + PWRfl[l];
01465
01466 Numeric base = width / (wsq + 562500.000);
01467
01468 Numeric res = 0.000;
01469 if (fabs(df0) < 750.0) res += width / (df0*df0 + wsq) - base;
01470 if (fabs(df1) < 750.0) res += width / (df1*df1 + wsq) - base;
01471 sum += strength * res * pow( (ff/PWRfl[l]),
01472 (Numeric)2.0 );
01473 }
01474
01475 Numeric absl = 0.3183e-4 * den_dummy * sum;
01476
01477
01478 pxsec(s,i) += 1.000e-3 * ( absl + (con * ff * ff) );
01479 }
01480 }
01481 return;
01482 }
01483
01484
01485
01487
01512 void CP98H2OAbsModel( MatrixView pxsec,
01513 const Numeric CCin,
01514 const Numeric CLin,
01515 const Numeric CWin,
01516 const String& model,
01517 ConstVectorView f_grid,
01518 ConstVectorView abs_p,
01519 ConstVectorView abs_t,
01520 ConstVectorView vmr )
01521 {
01522
01523
01524
01525 const Numeric CC_CP98 = 1.2369;
01526 const Numeric CL_CP98 = 1.0639;
01527 const Numeric CW_CP98 = 1.0658;
01528
01529
01530
01531 Numeric CC, CL, CW;
01532 if ( model == "CruzPol" )
01533 {
01534 CC = CC_CP98;
01535 CL = CL_CP98;
01536 CW = CW_CP98;
01537 }
01538 else if ( model == "CruzPolLine" )
01539 {
01540 CC = 0.000;
01541 CL = CL_CP98;
01542 CW = CW_CP98;
01543 }
01544 else if ( model == "CruzPolContinuum" )
01545 {
01546 CC = CC_CP98;
01547 CL = 0.000;
01548 CW = 0.000;
01549 }
01550 else if ( model == "user" )
01551 {
01552 CC = CCin;
01553 CL = CLin;
01554 CW = CWin;
01555 }
01556 else
01557 {
01558 ostringstream os;
01559 os << "H2O-CP98: ERROR! Wrong model values given.\n"
01560 << "Valid models are: 'CruzPol', 'CruzPolLine', 'CruzPolContinuum', and 'user'" << "\n";
01561 throw runtime_error(os.str());
01562 }
01563 out3 << "H2O-CP98: (model=" << model << ") parameter values in use:\n"
01564 << " CC = " << CC << "\n"
01565 << " CL = " << CL << "\n"
01566 << " CW = " << CW << "\n";
01567
01568 const Index n_p = abs_p.nelem();
01569 const Index n_f = f_grid.nelem();
01570
01571
01572 assert ( n_p==abs_t.nelem() );
01573 assert ( n_p==vmr.nelem() );
01574
01575
01576
01577 assert ( n_f==pxsec.nrows() );
01578 assert ( n_p==pxsec.ncols() );
01579
01580
01581 for ( Index i=0; i<n_p; ++i )
01582 {
01583
01584 if (vmr[i] > VMRCalcLimit)
01585 {
01586
01587 Numeric theta = (300.0 / abs_t[i]);
01588
01589 Numeric pwv = Pa_to_hPa * abs_p[i] * vmr[i];
01590
01591 Numeric pda = (Pa_to_hPa * abs_p[i]) - pwv;
01592
01593 Numeric TL = CL * 0.0109 * pwv * pow(theta,(Numeric)3.5)
01594 * exp(2.143*(1.0-theta));
01595
01596 Numeric gam = CW * 0.002784 *
01597 ( (pda * pow(theta,(Numeric)0.6))
01598 + (4.80 * pwv * pow(theta,(Numeric)1.1)) );
01599
01600 Numeric TC = CC * pwv * pow(theta, (Numeric)3.0) * 1.000e-7
01601 * ( (0.113 * pda) + (3.57 * pwv * pow(theta,(Numeric)7.5)) );
01602
01603
01604 for ( Index s=0; s<n_f; ++s )
01605 {
01606
01607 Numeric ff = f_grid[s] * Hz_to_GHz;
01608 Numeric TSf = MPMLineShapeFunction(gam, 22.235080, ff);
01609
01610 pxsec(s,i) += 4.1907e-5 * ff * ( (TL * TSf) + (ff * TC) ) / vmr[i];
01611 }
01612 }
01613 }
01614 return;
01615 }
01616
01617
01619
01642 void Standard_H2O_self_continuum( MatrixView pxsec,
01643 const Numeric Cin,
01644 const Numeric xin,
01645 const String& model,
01646 ConstVectorView f_grid,
01647 ConstVectorView abs_p,
01648 ConstVectorView abs_t,
01649 ConstVectorView vmr )
01650 {
01651
01652
01653
01654 const Numeric Cs_PWR = 1.796e-33;
01655 const Numeric xs_PWR = 4.5;
01656
01657 const Numeric Cs_CP = 1.851e-33;
01658 const Numeric xs_CP = 7.5;
01659
01660 const Numeric Cs_MPM89 = 1.500e-33;
01661 const Numeric xs_MPM89 = 7.5;
01662
01663 const Numeric Cs_MPM87 = 1.500e-33;
01664 const Numeric xs_MPM87 = 7.5;
01665
01666
01667
01668 Numeric C, x;
01669 if ( model == "Rosenkranz" )
01670 {
01671 C = Cs_PWR;
01672 x = xs_PWR;
01673 }
01674 else if ( model == "CruzPol" )
01675 {
01676 C = Cs_CP;
01677 x = xs_CP;
01678 }
01679 else if ( model == "MPM89" )
01680 {
01681 C = Cs_MPM89;
01682 x = xs_MPM89;
01683 }
01684 else if ( model == "MPM87" )
01685 {
01686 C = Cs_MPM87;
01687 x = xs_MPM87;
01688 }
01689 else if ( model == "user" )
01690 {
01691 C = Cin;
01692 x = xin;
01693 }
01694 else
01695 {
01696 ostringstream os;
01697 os << "H2O-SelfContStandardType: ERROR! Wrong model values given.\n"
01698 << "allowed models are: 'Rosenkranz', 'CruzPol', 'MPM89', 'MPM87', 'user'" << '\n';
01699 throw runtime_error(os.str());
01700 }
01701 out3 << "H2O-SelfContStandardType: (model=" << model << ") parameter values in use:\n"
01702 << " C_s = " << C << "\n"
01703 << " x_s = " << x << "\n";
01704
01705
01706
01707 const Index n_p = abs_p.nelem();
01708 const Index n_f = f_grid.nelem();
01709
01710
01711 assert ( n_p==abs_t.nelem() );
01712 assert ( n_p==vmr.nelem() );
01713
01714
01715
01716 assert ( n_f==pxsec.nrows() );
01717 assert ( n_p==pxsec.ncols() );
01718
01719
01720 for ( Index i=0; i<n_p; ++i )
01721 {
01722
01723
01724
01725 Numeric dummy =
01726 C * pow( (Numeric)300./abs_t[i], x+(Numeric)3. )
01727 * pow( abs_p[i], (Numeric)2. ) * vmr[i];
01728
01729
01730 for ( Index s=0; s<n_f; ++s )
01731 {
01732 pxsec(s,i) += dummy * pow( f_grid[s], (Numeric)2. );
01733
01734 }
01735 }
01736 }
01737
01738
01740
01764 void Standard_H2O_foreign_continuum( MatrixView pxsec,
01765 const Numeric Cin,
01766 const Numeric xin,
01767 const String& model,
01768 ConstVectorView f_grid,
01769 ConstVectorView abs_p,
01770 ConstVectorView abs_t,
01771 ConstVectorView vmr )
01772 {
01773
01774
01775
01776 const Numeric Cf_PWR = 5.43e-35 ;
01777 const Numeric xf_PWR = 0.0;
01778
01779 const Numeric Cf_CP = 5.85e-35;
01780 const Numeric xf_CP = 0.0;
01781
01782 const Numeric Cf_MPM89 = 4.74e-35;
01783 const Numeric xf_MPM89 = 0.0;
01784
01785 const Numeric Cf_MPM87 = 4.74e-35;
01786 const Numeric xf_MPM87 = 0.0;
01787
01788
01789
01790
01791 Numeric C, x;
01792 if ( model == "Rosenkranz" )
01793 {
01794 C = Cf_PWR;
01795 x = xf_PWR;
01796 }
01797 else if ( model == "CruzPol" )
01798 {
01799 C = Cf_CP;
01800 x = xf_CP;
01801 }
01802 else if ( model == "MPM89" )
01803 {
01804 C = Cf_MPM89;
01805 x = xf_MPM89;
01806 }
01807 else if ( model == "MPM87" )
01808 {
01809 C = Cf_MPM87;
01810 x = xf_MPM87;
01811 }
01812 else if ( model == "user" )
01813 {
01814 C = Cin;
01815 x = xin;
01816 }
01817 else
01818 {
01819 ostringstream os;
01820 os << "H2O-ForeignContStandardType: ERROR! Wrong model values given.\n"
01821 << "allowed models are: 'Rosenkranz', 'CruzPol', 'MPM89', 'MPM87', 'user'" << '\n';
01822 throw runtime_error(os.str());
01823 }
01824 out3 << "H2O-ForeignContStandardType: (model=" << model << ") parameter values in use:\n"
01825 << " C_s = " << C << "\n"
01826 << " x_s = " << x << "\n";
01827
01828 const Index n_p = abs_p.nelem();
01829 const Index n_f = f_grid.nelem();
01830
01831
01832 assert ( n_p==abs_t.nelem() );
01833 assert ( n_p==vmr.nelem() );
01834
01835
01836
01837 assert ( n_f==pxsec.nrows() );
01838 assert ( n_p==pxsec.ncols() );
01839
01840
01841 for ( Index i=0; i<n_p; ++i )
01842 {
01843
01844 Numeric pdry = abs_p[i] * (1.000e0-vmr[i]);
01845
01846
01847
01848 Numeric dummy = C * pow( (Numeric)300./abs_t[i], x+(Numeric)3. )
01849 * abs_p[i] * pdry;
01850
01851
01852 for ( Index s=0; s<n_f; ++s )
01853 {
01854 pxsec(s,i) += dummy * pow( f_grid[s], (Numeric)2. );
01855
01856 }
01857 }
01858 }
01859
01860
01861
01863
01886 void MaTipping_H2O_foreign_continuum( MatrixView pxsec,
01887 const Numeric Cin,
01888 const Numeric xin,
01889 const String& model,
01890 ConstVectorView f_grid,
01891 ConstVectorView abs_p,
01892 ConstVectorView abs_t,
01893 ConstVectorView vmr )
01894 {
01895
01896
01897
01898
01899
01900
01901 const Numeric Cf_MaTipping = 1.8590e-35;
01902 const Numeric xf_MaTipping = 4.6019;
01903
01904
01905
01906
01907 Numeric C, x;
01908 if ( model == "MaTipping" )
01909 {
01910 C = Cf_MaTipping;
01911 x = xf_MaTipping;
01912 }
01913 else if ( model == "user" )
01914 {
01915 C = Cin;
01916 x = xin;
01917 }
01918 else
01919 {
01920 ostringstream os;
01921 os << "H2O-MaTipping_H2O_foreign_continuum: ERROR! Wrong model values given.\n"
01922 << "allowed models are: 'MaTipping', 'user'" << '\n';
01923 throw runtime_error(os.str());
01924 }
01925 out3 << "H2O-MaTipping_H2O_foreign_continuum: (model=" << model << ") parameter values in use:\n"
01926 << " C_s = " << C << "\n"
01927 << " x_s = " << x << "\n";
01928
01929 const Index n_p = abs_p.nelem();
01930 const Index n_f = f_grid.nelem();
01931
01932
01933 assert ( n_p==abs_t.nelem() );
01934 assert ( n_p==vmr.nelem() );
01935
01936
01937
01938 assert ( n_f==pxsec.nrows() );
01939 assert ( n_p==pxsec.ncols() );
01940
01941
01942 for ( Index i=0; i<n_p; ++i )
01943 {
01944
01945 Numeric pdry = abs_p[i] * (1.000e0-vmr[i]);
01946
01947
01948
01949 Numeric dummy = C * pow( (Numeric)300./abs_t[i], x )
01950 * abs_p[i] * pdry;
01951
01952
01953 for ( Index s=0; s<n_f; ++s )
01954 {
01955 pxsec(s,i) += dummy * pow( f_grid[s], (Numeric)2.0389 );
01956
01957 }
01958 }
01959 }
01960
01961
01962
01963
01964
01965
01966
01967
01968 Numeric XINT_FUN( const Numeric V1A,
01969 const Numeric ,
01970 const Numeric DVA,
01971 const Numeric A[],
01972 const Numeric VI)
01973 {
01974
01975
01976
01977
01978
01979
01980 const Numeric ONEPL = 1.001;
01981
01982
01983
01984
01985 Numeric RECDVA = 1.00e0/DVA;
01986
01987 int J = (int) ((VI-V1A)*RECDVA + ONEPL) ;
01988 Numeric VJ = V1A + DVA * (Numeric)(J-1);
01989 Numeric P = RECDVA * (VI-VJ);
01990 Numeric C = (3.00e0-2.00e0*P) * P * P;
01991 Numeric B = 0.500e0 * P * (1.00e0-P);
01992 Numeric B1 = B * (1.00e0-P);
01993 Numeric B2 = B * P;
01994
01995 Numeric xint = -A[J-1] * B1 +
01996 A[J] * (1.00e0-C+B2) +
01997 A[J+1] * (C+B1) -
01998 A[J+2] * B2;
01999
02000
02001
02002
02003
02004
02005
02006 return xint;
02007 }
02008
02009
02010
02011 Numeric RADFN_FUN (const Numeric VI,
02012 const Numeric XKT)
02013 {
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041 Numeric XVI = VI;
02042 Numeric RADFN = 0.00e0;
02043
02044 if (XKT > 0.0)
02045 {
02046 Numeric XVIOKT = XVI/XKT;
02047
02048 if (XVIOKT <= 0.01e0)
02049 {
02050 RADFN = 0.500e0 * XVIOKT * XVI;
02051 }
02052 else if (XVIOKT <= 10.0e0)
02053 {
02054 Numeric EXPVKT = exp(-XVIOKT);
02055 RADFN = XVI * (1.00e0-EXPVKT) / (1.00e0+EXPVKT);
02056 }
02057 else
02058 {
02059 RADFN = XVI;
02060 }
02061 }
02062 else
02063 {
02064 RADFN = XVI;
02065 }
02066
02067 return RADFN;
02068 }
02069
02070
02071
02073
02098 void CKD_222_self_h2o( MatrixView pxsec,
02099 const Numeric Cin,
02100 const String& model,
02101 ConstVectorView f_grid,
02102 ConstVectorView abs_p,
02103 ConstVectorView abs_t,
02104 ConstVectorView vmr,
02105 ConstVectorView abs_n2 _U_ )
02106 {
02107
02108
02109
02110 if ((model != "user") && (model != "CKD222"))
02111 {
02112 ostringstream os;
02113 os << "!!ERROR!!\n"
02114 << "CKDv2.2.2 H2O self continuum:\n"
02115 << "INPUT model name is: " << model << ".\n"
02116 << "VALID model names are user and CKD222\n";
02117 throw runtime_error(os.str());
02118 }
02119
02120
02121
02122 Numeric ScalingFac = 1.0000e0;
02123 if ( model == "user" )
02124 {
02125 ScalingFac = Cin;
02126 }
02127
02128
02129 const Index n_p = abs_p.nelem();
02130 const Index n_f = f_grid.nelem();
02131
02132
02133
02134 assert ( n_p==abs_t.nelem() );
02135 assert ( n_p==vmr.nelem() );
02136
02137
02138
02139 assert ( n_f==pxsec.nrows() );
02140 assert ( n_p==pxsec.ncols() );
02141
02142
02143
02144
02145 const Numeric xLosmt = 2.686763e19;
02146
02147 const Numeric TO = 296.0e0;
02148 const Numeric PO = 1013.0e0;
02149
02150
02151 const Numeric ALPHA2 = 200.000 * 200.000;
02152 const Numeric ALPHS2 = 120.000 * 120.000;
02153 const Numeric BETAS = 5.000e-06;
02154 const Numeric V0S = 1310.000;
02155 const Numeric FACTRS = 0.150;
02156
02157
02158 const Numeric XFAC[51] = {
02159 1.00000,1.01792,1.03767,1.05749,1.07730,1.09708,
02160 1.10489,1.11268,1.12047,1.12822,1.13597,1.14367,
02161 1.15135,1.15904,1.16669,1.17431,1.18786,1.20134,
02162 1.21479,1.22821,1.24158,1.26580,1.28991,1.28295,
02163 1.27600,1.26896,1.25550,1.24213,1.22879,1.21560,
02164 1.20230,1.18162,1.16112,1.14063,1.12016,1.10195,
02165 1.09207,1.08622,1.08105,1.07765,1.07398,1.06620,
02166 1.05791,1.04905,1.03976,1.02981,1.00985,1.00000,
02167 1.00000,1.00000,1.00000};
02168
02169
02170 const Numeric VABS_min = SL260_ckd_0_v1;
02171 const Numeric VABS_max = SL260_ckd_0_v2;
02172
02173
02174
02175
02176
02177 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
02178 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02179 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02180 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02181 {
02182 out3 << "WARNING:\n"
02183 << " CKD2.2.2 H2O self continuum:\n"
02184 << " input frequency vector exceeds range of model validity\n"
02185 << " " << SL296_ckd_0_v1 << "<->" << SL296_ckd_0_v2 << "cm^-1\n";
02186 }
02187
02188
02189
02190
02191 if (SL296_ckd_0_v1 != SL260_ckd_0_v1)
02192 {
02193 ostringstream os;
02194 os << "!!ERROR!!\n"
02195 << "CKD2.2.2 H2O self continuum:\n"
02196 << "parameter V1 not the same for different ref. temperatures.\n";
02197 throw runtime_error(os.str());
02198 }
02199 if (SL296_ckd_0_v2 != SL260_ckd_0_v2)
02200 {
02201 ostringstream os;
02202 os << "!!ERROR!!\n"
02203 << "CKD2.2.2 H2O self continuum:\n"
02204 << "parameter V2 not the same for different ref. temperatures.\n";
02205 throw runtime_error(os.str());
02206 }
02207 if (SL296_ckd_0_dv != SL260_ckd_0_dv)
02208 {
02209 ostringstream os;
02210 os << "!!ERROR!!\n"
02211 << "CKD2.2.2 H2O self continuum:\n"
02212 << "parameter DV not the same for different ref. temperatures.\n";
02213 throw runtime_error(os.str());
02214 }
02215 if (SL296_ckd_0_npt != SL260_ckd_0_npt)
02216 {
02217 ostringstream os;
02218 os << "!!ERROR!!\n"
02219 << "CKD2.2.2 H2O self continuum:\n"
02220 << "parameter NPT not the same for different ref. temperatures.\n";
02221 throw runtime_error(os.str());
02222 }
02223
02224
02225
02226 Numeric DVC = SL296_ckd_0_dv;
02227 Numeric V1C = V1ABS - DVC;
02228 Numeric V2C = V2ABS + DVC;
02229
02230 int I1 = (int) ((V1C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02231 if (V1C < SL296_ckd_0_v1) I1 = -1;
02232 V1C = SL296_ckd_0_v1 + (SL296_ckd_0_dv * (Numeric)I1);
02233
02234 int I2 = (int) ((V2C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02235
02236 int NPTC = I2-I1+3;
02237 if (NPTC > SL296_ckd_0_npt) NPTC = SL296_ckd_0_npt+1;
02238
02239 V2C = V1C + SL296_ckd_0_dv * (Numeric)(NPTC-1);
02240
02241 if (NPTC < 1)
02242 {
02243 ostringstream os;
02244 out3 << "WARNING:\n"
02245 << " CKD2.2.2 H2O self continuum:\n"
02246 << " no elements of internal continuum coefficients could be found for the\n"
02247 << " input frequency range.\n"
02248 << " Leave the function without calculating the absorption.";
02249 return;
02250 }
02251
02252 Numeric SH2OT0[NPTC+addF77fields];
02253 Numeric SH2OT1[NPTC+addF77fields];
02254
02255 for (Index J = 1 ; J <= NPTC ; ++J)
02256 {
02257 Index I = I1+J;
02258 if ( (I < 1) || (I > SL296_ckd_0_npt) )
02259 {
02260 SH2OT0[J] = 0.0e0;
02261 SH2OT1[J] = 0.0e0;
02262 }
02263 else
02264 {
02265 SH2OT0[J] = SL296_ckd_0[I];
02266 SH2OT1[J] = SL260_ckd_0[I];
02267 }
02268 }
02269
02270
02271
02272 Numeric SFAC = 1.00e0;
02273 Numeric VS2 = 0.00e0;
02274
02275
02276
02277 for ( Index i = 0 ; i < n_p ; ++i )
02278 {
02279
02280
02281 Numeric Tave = abs_t[i];
02282 Numeric Pave = (abs_p[i]*1.000e-2);
02283 Numeric Patm = Pave/PO;
02284 Numeric vmrh2o = vmr[i];
02285
02286
02287 Numeric Rh2o = Patm * (TO/Tave);
02288 Numeric Tfac = (Tave-TO)/(260.0-TO);
02289 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
02290 Numeric W1 = vmrh2o * WTOT;
02291 Numeric XKT = Tave / 1.4387752e0;
02292
02293
02294
02295
02296 Numeric k[NPTC+addF77fields];
02297 k[0] = 0.00e0;
02298 for (Index J = 1 ; J <= NPTC ; ++J)
02299 {
02300 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02301 Numeric SH2O = 0.0e0;
02302 if (SH2OT0[J] > 0.0e0)
02303 {
02304 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
02305 SFAC = 1.00e0;
02306
02307 if ( (VJ >= 700.0e0) && (VJ <= 1200.0e0) )
02308 {
02309 int JFAC = (int)((VJ - 700.0e0)/10.0e0 + 0.00001e0);
02310 if ( (JFAC >= 0) && (JFAC <= 50) )
02311 SFAC = XFAC[JFAC];
02312 }
02313
02314
02315
02316
02317
02318 VS2 = (VJ-V0S) * (VJ-V0S);
02319
02320 SFAC = SFAC *
02321 ( 1.000e0 + 0.3000e0 * (1.000e4 / ((VJ*VJ) + 1.000e4)) ) *
02322 ( 1.000e0 - 0.2333e0 * (ALPHA2 / ((VJ-1050.000e0)*(VJ-1050.000e0) + ALPHA2)) ) *
02323 ( 1.000e0 - FACTRS * (ALPHS2 / (VS2+(BETAS*VS2*VS2)+ALPHS2)) );
02324
02325 SH2O = SFAC * SH2O;
02326 }
02327
02328
02329
02330
02331 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02332
02333 }
02334
02335
02336
02337
02338 for ( Index s = 0 ; s < n_f ; ++s )
02339 {
02340
02341 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
02342 if ( (V >= 0.000e0) && (V < SL296_ckd_0_v2) )
02343 {
02344
02345
02346
02347
02348 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02349 }
02350 }
02351 }
02352
02353 }
02354
02355
02356
02357
02358
02360
02385 void CKD_222_foreign_h2o( MatrixView pxsec,
02386 const Numeric Cin,
02387 const String& model,
02388 ConstVectorView f_grid,
02389 ConstVectorView abs_p,
02390 ConstVectorView abs_t,
02391 ConstVectorView vmr,
02392 ConstVectorView abs_n2 _U_ )
02393 {
02394
02395
02396 if ((model != "user") && (model != "CKD222"))
02397 {
02398 ostringstream os;
02399 os << "!!ERROR!!\n"
02400 << "CKDv2.2.2 H2O foreign continuum:\n"
02401 << "INPUT model name is: " << model << ".\n"
02402 << "VALID model names are user and CKD222\n";
02403 throw runtime_error(os.str());
02404 }
02405
02406
02407
02408 Numeric ScalingFac = 1.0000e0;
02409 if ( model == "user" )
02410 {
02411 ScalingFac = Cin;
02412 }
02413
02414
02415 const Index n_p = abs_p.nelem();
02416 const Index n_f = f_grid.nelem();
02417
02418
02419
02420 assert ( n_p==abs_t.nelem() );
02421 assert ( n_p==vmr.nelem() );
02422
02423
02424
02425 assert ( n_f==pxsec.nrows() );
02426 assert ( n_p==pxsec.ncols() );
02427
02428
02429
02430
02431 const Numeric xLosmt = 2.686763e19;
02432 const Numeric T1 = 273.000e0;
02433 const Numeric TO = 296.000e0;
02434 const Numeric PO = 1013.000e0;
02435
02436
02437 const Numeric HWSQF = 330.000e0 * 330.000e0;
02438 const Numeric BETAF = 8.000e-11;
02439 const Numeric V0F = 1130.000e0;
02440 const Numeric FACTRF = 0.970e0;
02441
02442 const Numeric V0F2 = 1900.000e0;
02443 const Numeric HWSQF2 = 150.000e0 * 150.000e0;
02444 const Numeric BETA2 = 3.000e-6;
02445
02446
02447 const Numeric VABS_min = FH2O_ckd_0_v1;
02448 const Numeric VABS_max = FH2O_ckd_0_v2;
02449
02450
02451
02452
02453
02454 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
02455 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02456 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02457 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02458 {
02459 out3 << "WARNING:\n"
02460 << " CKD2.2.2 H2O foreign continuum:\n"
02461 << " input frequency vector exceeds range of model validity\n"
02462 << " " << FH2O_ckd_0_v1 << "<->" << FH2O_ckd_0_v2 << "cm^-1\n";
02463 }
02464
02465
02466
02467
02468
02469
02470 Numeric DVC = FH2O_ckd_0_dv;
02471 Numeric V1C = V1ABS - DVC;
02472 Numeric V2C = V2ABS + DVC;
02473
02474 int I1 = (int) ((V1C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
02475 if (V1C < FH2O_ckd_0_v1) I1 = -1;
02476 V1C = FH2O_ckd_0_v1 + (FH2O_ckd_0_dv * (Numeric)I1);
02477
02478 int I2 = (int) ((V2C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
02479
02480 int NPTC = I2-I1+3;
02481 if (NPTC > FH2O_ckd_0_npt) NPTC = FH2O_ckd_0_npt+1;
02482
02483 V2C = V1C + FH2O_ckd_0_dv * (Numeric)(NPTC-1);
02484
02485 if (NPTC < 1)
02486 {
02487 out3 << "WARNING:\n"
02488 << " CKD2.2.2 H2O foreign continuum:\n"
02489 << " no elements of internal continuum coefficients could be found for the\n"
02490 << " input frequency range.\n"
02491 << " Leave the function without calculating the absorption.";
02492 return;
02493 }
02494
02495 Numeric FH2OT0[NPTC+addF77fields];
02496
02497 for (Index J = 1 ; J <= NPTC ; ++J)
02498 {
02499 Index I = I1+J;
02500 if ( (I < 1) || (I > FH2O_ckd_0_npt) )
02501 {
02502 FH2OT0[J] = 0.0e0;
02503 }
02504 else
02505 {
02506 FH2OT0[J] = FH2O_ckd_0[I];
02507 }
02508 }
02509
02510
02511
02512 Numeric VF2 = 0.000e0;
02513 Numeric VF4 = 0.000e0;
02514 Numeric VF6 = 0.000e0;
02515 Numeric FSCAL = 0.000e0;
02516 Numeric FH2O = 0.000e0;
02517
02518
02519 for ( Index i = 0 ; i < n_p ; ++i )
02520 {
02521
02522
02523 Numeric Tave = abs_t[i];
02524 Numeric Pave = (abs_p[i]*1.000e-2);
02525 Numeric vmrh2o = vmr[i];
02526
02527 Numeric PFRGN = (Pave/PO) * (1.00000e0 - vmrh2o);
02528 Numeric RFRGN = PFRGN * (TO/Tave);
02529 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
02530
02531 Numeric XKT = Tave / 1.4387752;
02532
02533
02534
02535
02536 Numeric k[NPTC+addF77fields];
02537 k[0] = 0.00e0;
02538 for (Index J = 1 ; J <= NPTC ; ++J)
02539 {
02540 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02541
02542
02543 VF2 = (VJ-V0F) * (VJ-V0F);
02544 VF6 = VF2 * VF2 * VF2;
02545 FSCAL = (1.000e0 - FACTRF*(HWSQF/(VF2+(BETAF*VF6)+HWSQF)));
02546
02547 VF2 = (VJ-V0F2) * (VJ-V0F2);
02548 VF4 = VF2 * VF2;
02549 FSCAL = FSCAL * (1.000e0 - 0.600e0*(HWSQF2/(VF2 + BETA2*VF4 + HWSQF2)));
02550
02551 FH2O = FH2OT0[J] * FSCAL;
02552
02553
02554
02555
02556 k[J] = WTOT * RFRGN * (FH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02557
02558 }
02559
02560
02561
02562
02563 for ( Index s = 0 ; s < n_f ; ++s )
02564 {
02565
02566 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
02567 if ( (V > 0.000e0) && (V < VABS_max) )
02568 {
02569
02570
02571
02572
02573 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02574 }
02575 }
02576 }
02577
02578 }
02579
02580
02581
02582
02584
02609 void CKD_242_self_h2o( MatrixView pxsec,
02610 const Numeric Cin,
02611 const String& model,
02612 ConstVectorView f_grid,
02613 ConstVectorView abs_p,
02614 ConstVectorView abs_t,
02615 ConstVectorView vmr,
02616 ConstVectorView abs_n2 _U_ )
02617 {
02618
02619
02620
02621 if ((model != "user") && (model != "CKD242"))
02622 {
02623 ostringstream os;
02624 os << "!!ERROR!!\n"
02625 << "CKDv2.4.2 H2O self continuum:\n"
02626 << "INPUT model name is: " << model << ".\n"
02627 << "VALID model names are user and CKD242\n";
02628 throw runtime_error(os.str());
02629 }
02630
02631
02632
02633 Numeric ScalingFac = 1.0000e0;
02634 if ( model == "user" )
02635 {
02636 ScalingFac = Cin;
02637 }
02638
02639
02640 const Index n_p = abs_p.nelem();
02641 const Index n_f = f_grid.nelem();
02642
02643
02644
02645 assert ( n_p==abs_t.nelem() );
02646 assert ( n_p==vmr.nelem() );
02647
02648
02649
02650 assert ( n_f==pxsec.nrows() );
02651 assert ( n_p==pxsec.ncols() );
02652
02653
02654
02655
02656 const Numeric xLosmt = 2.686763e19;
02657
02658 const Numeric TO = 296.0e0;
02659 const Numeric PO = 1013.0e0;
02660
02661
02662 const Numeric V0S1 = 0.000e+00;
02663 const Numeric HWSQ1 = (1.000e+02 * 1.000e+02);
02664 const Numeric BETAS1 = 1.000e-04;
02665 const Numeric FACTRS1 = 0.688e+00;
02666
02667 const Numeric V0S2 = 1.050e+03;
02668 const Numeric HWSQ2 = (2.000e+02 * 2.000e+02);
02669 const Numeric FACTRS2 = -0.2333e+00;
02670
02671 const Numeric V0S3 = 1.310e+03;
02672 const Numeric HWSQ3 = (1.200e+02 * 1.200e+02);
02673 const Numeric BETAS3 = 5.000e-06;
02674 const Numeric FACTRS3 = -0.150e+00;
02675
02676 const Numeric XFAC[51] = {
02677 1.00000,1.01792,1.03767,1.05749,1.07730,1.09708,
02678 1.10489,1.11268,1.12047,1.12822,1.13597,1.14367,
02679 1.15135,1.15904,1.16669,1.17431,1.18786,1.20134,
02680 1.21479,1.22821,1.24158,1.26580,1.28991,1.28295,
02681 1.27600,1.26896,1.25550,1.24213,1.22879,1.21560,
02682 1.20230,1.18162,1.16112,1.14063,1.12016,1.10195,
02683 1.09207,1.08622,1.08105,1.07765,1.07398,1.06620,
02684 1.05791,1.04905,1.03976,1.02981,1.00985,1.00000,
02685 1.00000,1.00000,1.00000};
02686
02687
02688 const Numeric VABS_min = SL260_ckd_0_v1;
02689 const Numeric VABS_max = SL260_ckd_0_v2;
02690
02691
02692
02693
02694
02695 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
02696 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02697 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02698 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02699 {
02700 out3 << "WARNING:\n"
02701 << " CKD2.4.2 H2O self continuum:\n"
02702 << " input frequency vector exceeds range of model validity\n"
02703 << " " << SL296_ckd_0_v1 << "<->" << SL296_ckd_0_v2 << "cm^-1\n";
02704 }
02705
02706
02707
02708
02709 if (SL296_ckd_0_v1 != SL260_ckd_0_v1)
02710 {
02711 ostringstream os;
02712 os << "!!ERROR!!\n"
02713 << "CKD2.4.2 H2O self continuum:\n"
02714 << "parameter V1 not the same for different ref. temperatures.\n";
02715 throw runtime_error(os.str());
02716 }
02717 if (SL296_ckd_0_v2 != SL260_ckd_0_v2)
02718 {
02719 ostringstream os;
02720 os << "!!ERROR!!\n"
02721 << "CKD2.4.2 H2O self continuum:\n"
02722 << "parameter V2 not the same for different ref. temperatures.\n";
02723 throw runtime_error(os.str());
02724 }
02725 if (SL296_ckd_0_dv != SL260_ckd_0_dv)
02726 {
02727 ostringstream os;
02728 os << "!!ERROR!!\n"
02729 << "CKD2.4.2 H2O self continuum:\n"
02730 << "parameter DV not the same for different ref. temperatures.\n";
02731 throw runtime_error(os.str());
02732 }
02733 if (SL296_ckd_0_npt != SL260_ckd_0_npt)
02734 {
02735 ostringstream os;
02736 os << "!!ERROR!!\n"
02737 << "CKD2.4.2 H2O self continuum:\n"
02738 << "parameter NPT not the same for different ref. temperatures.\n";
02739 throw runtime_error(os.str());
02740 }
02741
02742
02743
02744 Numeric DVC = SL296_ckd_0_dv;
02745 Numeric V1C = V1ABS - DVC;
02746 Numeric V2C = V2ABS + DVC;
02747
02748 int I1 = (int) ((V1C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02749 if (V1C < SL296_ckd_0_v1) I1 = -1;
02750 V1C = SL296_ckd_0_v1 + (SL296_ckd_0_dv * (Numeric)I1);
02751
02752 int I2 = (int) ((V2C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02753
02754 int NPTC = I2-I1+3;
02755 if (NPTC > SL296_ckd_0_npt) NPTC = SL296_ckd_0_npt+1;
02756
02757 V2C = V1C + SL296_ckd_0_dv * (Numeric)(NPTC-1);
02758
02759 if (NPTC < 1)
02760 {
02761 ostringstream os;
02762 out3 << "WARNING:\n"
02763 << " CKDv2.4.2 H2O self continuum:\n"
02764 << " no elements of internal continuum coefficients could be found for the\n"
02765 << " input frequency range.\n"
02766 << " Leave the function without calculating the absorption.";
02767 return;
02768 }
02769
02770 Numeric SH2OT0[NPTC+addF77fields];
02771 Numeric SH2OT1[NPTC+addF77fields];
02772
02773 for (Index J = 1 ; J <= NPTC ; ++J)
02774 {
02775 Index I = I1+J;
02776 if ( (I < 1) || (I > SL296_ckd_0_npt) )
02777 {
02778 SH2OT0[J] = 0.0e0;
02779 SH2OT1[J] = 0.0e0;
02780 }
02781 else
02782 {
02783 SH2OT0[J] = SL296_ckd_0[I];
02784 SH2OT1[J] = SL260_ckd_0[I];
02785 }
02786 }
02787
02788
02789
02790 Numeric SFAC = 1.00e0;
02791 Numeric VS2 = 0.00e0;
02792 Numeric VS4 = 0.00e0;
02793
02794
02795 for ( Index i = 0 ; i < n_p ; ++i )
02796 {
02797
02798
02799 Numeric Tave = abs_t[i];
02800 Numeric Pave = (abs_p[i]*1.000e-2);
02801 Numeric Patm = Pave/PO;
02802 Numeric vmrh2o = vmr[i];
02803
02804
02805 Numeric Rh2o = Patm * (TO/Tave);
02806 Numeric Tfac = (Tave-TO)/(260.0-TO);
02807 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
02808 Numeric W1 = vmrh2o * WTOT;
02809 Numeric XKT = Tave / 1.4387752e0;
02810
02811
02812
02813
02814 Numeric k[NPTC+addF77fields];
02815 k[0] = 0.00e0;
02816 for (Index J = 1 ; J <= NPTC ; ++J)
02817 {
02818 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02819 Numeric SH2O = 0.0e0;
02820 if (SH2OT0[J] > 0.0e0)
02821 {
02822 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
02823 SFAC = 1.00e0;
02824
02825 if ( (VJ >= 700.0e0) && (VJ <= 1200.0e0) )
02826 {
02827 int JFAC = (int)((VJ - 700.0e0)/10.0e0 + 0.00001e0);
02828 if ( (JFAC >= 0) && (JFAC <= 50) )
02829 SFAC = XFAC[JFAC];
02830 }
02831
02832
02833
02834
02835
02836 VS2 = (VJ-V0S1) * (VJ-V0S1);
02837 VS4 = VS2*VS2;
02838 SFAC = SFAC *
02839 (1.000e0 + FACTRS1*(HWSQ1/((VJ*VJ)+(BETAS1*VS4)+HWSQ1)));
02840
02841 VS2 = (VJ-V0S2) * (VJ-V0S2);
02842 SFAC = SFAC *
02843 (1.000e0 + FACTRS2*(HWSQ2/(VS2+HWSQ2)));
02844
02845 VS2 = (VJ-V0S3) * (VJ-V0S3);
02846 VS4 = VS2*VS2;
02847 SFAC = SFAC *
02848 (1.000e0 + FACTRS3*(HWSQ3/(VS2+(BETAS3*VS4)+HWSQ3)));
02849
02850 SH2O = SFAC * SH2O;
02851 }
02852
02853
02854
02855
02856 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02857
02858 }
02859
02860
02861
02862
02863 for ( Index s = 0 ; s < n_f ; ++s )
02864 {
02865
02866 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
02867 if ( (V >= 0.000e0) && (V < SL296_ckd_0_v2) )
02868 {
02869
02870
02871
02872
02873 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02874 }
02875 }
02876 }
02877
02878 }
02879
02880
02881
02882
02884
02909 void CKD_242_foreign_h2o( MatrixView pxsec,
02910 const Numeric Cin,
02911 const String& model,
02912 ConstVectorView f_grid,
02913 ConstVectorView abs_p,
02914 ConstVectorView abs_t,
02915 ConstVectorView vmr,
02916 ConstVectorView abs_n2 _U_ )
02917 {
02918
02919
02920
02921 if ((model != "user") && (model != "CKD242"))
02922 {
02923 ostringstream os;
02924 os << "!!ERROR!!\n"
02925 << "CKDv2.4.2 H2O foreign continuum:\n"
02926 << "INPUT model name is: " << model << ".\n"
02927 << "VALID model names are user and CKD242\n";
02928 throw runtime_error(os.str());
02929 }
02930
02931
02932
02933 Numeric ScalingFac = 1.0000e0;
02934 if ( model == "user" )
02935 {
02936 ScalingFac = Cin;
02937 }
02938
02939
02940 const Index n_p = abs_p.nelem();
02941 const Index n_f = f_grid.nelem();
02942
02943
02944 assert ( n_p==abs_t.nelem() );
02945 assert ( n_p==vmr.nelem() );
02946
02947
02948
02949 assert ( n_f==pxsec.nrows() );
02950 assert ( n_p==pxsec.ncols() );
02951
02952
02953
02954
02955 const Numeric xLosmt = 2.686763e19;
02956 const Numeric T1 = 273.0e0;
02957 const Numeric TO = 296.0e0;
02958 const Numeric PO = 1013.0e0;
02959
02960
02961 const Numeric V0F1 = 350.000e0;
02962 const Numeric HWSQF1 = 200.000e0 * 200.000e0;
02963 const Numeric BETAF1 = 5.000e-9 ;
02964 const Numeric FACTRF1 = -0.700e0;
02965
02966 const Numeric V0F1a = 630.000e0;
02967 const Numeric HWSQF1a = 65.000e0*65.000e0;
02968 const Numeric BETAF1a = 2.000e-08 ;
02969 const Numeric FACTRF1a = 0.750e0;
02970
02971 const Numeric V0F2 = 1130.000e0;
02972 const Numeric HWSQF2 = 330.000e0 * 330.000e0;
02973 const Numeric BETAF2 = 8.000e-11;
02974 const Numeric FACTRF2 = -0.970e0;
02975
02976 const Numeric V0F3 = 1975.000e0;
02977 const Numeric HWSQF3 = 250.000e0 * 250.000e0;
02978 const Numeric BETAF3 = 5.000e-06;
02979 const Numeric FACTRF3 = -0.650e0;
02980
02981
02982 const Numeric VABS_min = FH2O_ckd_0_v1;
02983 const Numeric VABS_max = FH2O_ckd_0_v2;
02984
02985
02986
02987
02988
02989 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
02990 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02991 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02992 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02993 {
02994 out3 << "WARNING:\n"
02995 << " CKDv2.4.2 H2O foreign continuum:\n"
02996 << " input frequency vector exceeds range of model validity\n"
02997 << " " << FH2O_ckd_0_v1 << "<->" << FH2O_ckd_0_v2 << "cm^-1\n";
02998 }
02999
03000
03001
03002
03003
03004
03005 Numeric DVC = FH2O_ckd_0_dv;
03006 Numeric V1C = V1ABS - DVC;
03007 Numeric V2C = V2ABS + DVC;
03008
03009 int I1 = (int) ((V1C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
03010 if (V1C < FH2O_ckd_0_v1) I1 = -1;
03011 V1C = FH2O_ckd_0_v1 + (FH2O_ckd_0_dv * (Numeric)I1);
03012
03013 int I2 = (int) ((V2C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
03014
03015 int NPTC = I2-I1+3;
03016 if (NPTC > FH2O_ckd_0_npt) NPTC = FH2O_ckd_0_npt+1;
03017
03018 V2C = V1C + FH2O_ckd_0_dv * (Numeric)(NPTC-1);
03019
03020 if (NPTC < 1)
03021 {
03022 out3 << "WARNING:\n"
03023 << " CKDv2.4.2 H2O foreign continuum:\n"
03024 << " no elements of internal continuum coefficients could be found for the\n"
03025 << " input frequency range.\n"
03026 << " Leave the function without calculating the absorption.";
03027 return;
03028 }
03029
03030 Numeric FH2OT0[NPTC+addF77fields];
03031
03032 for (Index J = 1 ; J <= NPTC ; ++J)
03033 {
03034 Index I = I1+J;
03035 if ( (I < 1) || (I > FH2O_ckd_0_npt) )
03036 {
03037 FH2OT0[J] = 0.0e0;
03038 }
03039 else
03040 {
03041 FH2OT0[J] = FH2O_ckd_0[I];
03042 }
03043 }
03044
03045
03046
03047 Numeric VF2 = 0.000e0;
03048 Numeric VF4 = 0.000e0;
03049 Numeric VF6 = 0.000e0;
03050 Numeric FSCAL = 0.000e0;
03051 Numeric FH2O = 0.000e0;
03052
03053
03054 for ( Index i = 0 ; i < n_p ; ++i )
03055 {
03056
03057
03058 Numeric Tave = abs_t[i];
03059 Numeric Pave = (abs_p[i]*1.000e-2);
03060 Numeric vmrh2o = vmr[i];
03061
03062 Numeric PFRGN = (Pave/PO) * (1.00000e0 - vmrh2o);
03063 Numeric RFRGN = PFRGN * (TO/Tave);
03064 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03065
03066 Numeric XKT = Tave / 1.4387752;
03067
03068
03069
03070
03071 Numeric k[NPTC+addF77fields];
03072 k[0] = 0.00e0;
03073 for (Index J = 1 ; J <= NPTC ; ++J)
03074 {
03075 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03076
03077
03078 VF2 = (VJ-V0F1) * (VJ-V0F1);
03079 VF6 = VF2 * VF2 * VF2;
03080 FSCAL = (1.000e0 + FACTRF1*(HWSQF1/(VF2+(BETAF1*VF6)+HWSQF1)));
03081
03082 VF2 = (VJ-V0F1a) * (VJ-V0F1a);
03083 VF6 = VF2 * VF2 * VF2;
03084 FSCAL = FSCAL *
03085 (1.000e0 + FACTRF1a*(HWSQF1a/(VF2+(BETAF1a*VF6)+HWSQF1a)));
03086
03087 VF2 = (VJ-V0F2) * (VJ-V0F2);
03088 VF6 = VF2 * VF2 * VF2;
03089 FSCAL = FSCAL *
03090 (1.000e0 + FACTRF2*(HWSQF2/(VF2+(BETAF2*VF6)+HWSQF2)));
03091
03092 VF2 = (VJ-V0F3) * (VJ-V0F3);
03093 VF4 = VF2 * VF2;
03094 FSCAL = FSCAL *
03095 (1.000e0 + FACTRF3*(HWSQF3/(VF2+BETAF3*VF4+HWSQF3)));
03096
03097 FH2O = FH2OT0[J] * FSCAL;
03098
03099
03100
03101
03102 k[J] = WTOT * RFRGN * (FH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
03103
03104 }
03105
03106
03107
03108
03109 for ( Index s = 0 ; s < n_f ; ++s )
03110 {
03111
03112 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
03113 if ( (V >= 0.000e0) && (V < VABS_max) )
03114 {
03115
03116
03117 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03118 }
03119 }
03120 }
03121
03122 }
03123
03124
03125
03126
03128
03153 void CKD_mt_100_self_h2o( MatrixView pxsec,
03154 const Numeric Cin,
03155 const String& model,
03156 ConstVectorView f_grid,
03157 ConstVectorView abs_p,
03158 ConstVectorView abs_t,
03159 ConstVectorView vmr,
03160 ConstVectorView abs_n2 _U_ )
03161 {
03162
03163
03164 if ((model != "user") && (model != "CKDMT100"))
03165 {
03166 ostringstream os;
03167 os << "!!ERROR!!\n"
03168 << "CKD_MT1.00 H2O self continuum:\n"
03169 << "INPUT model name is: " << model << ".\n"
03170 << "VALID model names are user and CKDMT100\n";
03171 throw runtime_error(os.str());
03172 }
03173
03174
03175
03176 Numeric ScalingFac = 1.0000e0;
03177 if ( model == "user" )
03178 {
03179 ScalingFac = Cin;
03180 }
03181
03182
03183 const Index n_p = abs_p.nelem();
03184 const Index n_f = f_grid.nelem();
03185
03186
03187
03188 assert ( n_p==abs_t.nelem() );
03189 assert ( n_p==vmr.nelem() );
03190
03191
03192
03193 assert ( n_f==pxsec.nrows() );
03194 assert ( n_p==pxsec.ncols() );
03195
03196
03197
03198
03199 const Numeric xLosmt = 2.68675e19;
03200
03201 const Numeric TO = 296.000e0;
03202 const Numeric PO = 1013.000e0;
03203
03204 const Numeric XFACREV[15] =
03205 {1.003, 1.009, 1.015, 1.023, 1.029,1.033,
03206 1.037, 1.039, 1.040, 1.046, 1.036,1.027,
03207 1.01, 1.002, 1.00};
03208
03209
03210 const Numeric VABS_min = -2.000e1;
03211 const Numeric VABS_max = 2.000e4;
03212
03213
03214
03215
03216
03217 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
03218 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03219 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03220 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03221 {
03222 out3 << "WARNING:\n"
03223 << " CKD_MT 1.00 H2O self continuum:\n"
03224 << " input frequency vector exceeds range of model validity\n"
03225 << " " << SL296_ckd_mt_100_v1 << "<->" << SL296_ckd_mt_100_v2 << "cm^-1\n";
03226 }
03227
03228
03229
03230
03231 if (SL296_ckd_mt_100_v1 != SL260_ckd_mt_100_v1)
03232 {
03233 ostringstream os;
03234 os << "!!ERROR!!\n"
03235 << "CKD_MT 1.00 H2O self continuum:\n"
03236 << "parameter V1 not the same for different ref. temperatures.\n";
03237 throw runtime_error(os.str());
03238 }
03239 if (SL296_ckd_mt_100_v2 != SL260_ckd_mt_100_v2)
03240 {
03241 ostringstream os;
03242 os << "!!ERROR!!\n"
03243 << "CKD_MT 1.00 H2O self continuum:\n"
03244 << "parameter V2 not the same for different ref. temperatures.\n";
03245 throw runtime_error(os.str());
03246 }
03247 if (SL296_ckd_mt_100_dv != SL260_ckd_mt_100_dv)
03248 {
03249 ostringstream os;
03250 os << "!!ERROR!!\n"
03251 << "CKD_MT 1.00 H2O self continuum:\n"
03252 << "parameter DV not the same for different ref. temperatures.\n";
03253 throw runtime_error(os.str());
03254 }
03255 if (SL296_ckd_mt_100_npt != SL260_ckd_mt_100_npt)
03256 {
03257 ostringstream os;
03258 os << "!!ERROR!!\n"
03259 << "CKD_MT 1.00 H2O self continuum:\n"
03260 << "parameter NPT not the same for different ref. temperatures.\n";
03261 throw runtime_error(os.str());
03262 }
03263
03264
03265
03266 Numeric DVC = SL296_ckd_mt_100_dv;
03267 Numeric V1C = V1ABS - DVC;
03268 Numeric V2C = V2ABS + DVC;
03269
03270 int I1 = (int) ((V1C-SL296_ckd_mt_100_v1) / SL296_ckd_mt_100_dv);
03271 if (V1C < SL296_ckd_mt_100_v1) I1 = -1;
03272 V1C = SL296_ckd_mt_100_v1 + (SL296_ckd_mt_100_dv * (Numeric)I1);
03273
03274 int I2 = (int) ((V2C-SL296_ckd_mt_100_v1) / SL296_ckd_mt_100_dv);
03275
03276 int NPTC = I2-I1+3;
03277 if (NPTC > SL296_ckd_mt_100_npt) NPTC = SL296_ckd_mt_100_npt+1;
03278
03279 V2C = V1C + SL296_ckd_mt_100_dv * (Numeric)(NPTC-1);
03280
03281 if (NPTC < 1)
03282 {
03283 ostringstream os;
03284 out3 << "WARNING:\n"
03285 << " CKD_MT 1.00 H2O self continuum:\n"
03286 << " no elements of internal continuum coefficients could be found for the\n"
03287 << " input frequency range.\n"
03288 << " Leave the function without calculating the absorption.";
03289 return;
03290 }
03291
03292 Numeric SH2OT0[NPTC+addF77fields];
03293 Numeric SH2OT1[NPTC+addF77fields];
03294
03295 for (Index J = 1 ; J <= NPTC ; ++J)
03296 {
03297 Index I = I1+J;
03298 if ( (I < 1) || (I > SL296_ckd_mt_100_npt) )
03299 {
03300 SH2OT0[J] = 0.0e0;
03301 SH2OT1[J] = 0.0e0;
03302 }
03303 else
03304 {
03305 SH2OT0[J] = SL296_ckd_mt_100[I];
03306 SH2OT1[J] = SL260_ckd_mt_100[I];
03307 }
03308 }
03309
03310
03311
03312 Numeric SFAC = 1.00e0;
03313
03314
03315 for ( Index i = 0 ; i < n_p ; ++i )
03316 {
03317
03318
03319 Numeric Tave = abs_t[i];
03320 Numeric Pave = (abs_p[i]*1.000e-2);
03321 Numeric Patm = Pave/PO;
03322 Numeric vmrh2o = vmr[i];
03323
03324
03325 Numeric Rh2o = Patm * (TO/Tave);
03326 Numeric Tfac = (Tave-TO)/(260.0-TO);
03327 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
03328 Numeric W1 = vmrh2o * WTOT;
03329 Numeric XKT = Tave / 1.4387752e0;
03330
03331
03332
03333
03334 Numeric k[NPTC+addF77fields];
03335 k[0] = 0.00e0;
03336 for (Index J = 1 ; J <= NPTC ; ++J)
03337 {
03338 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03339 Numeric SH2O = 0.0e0;
03340 if (SH2OT0[J] > 0.0e0)
03341 {
03342 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
03343 SFAC = 1.00e0;
03344
03345 if ( (VJ >= 820.0e0) && (VJ <= 960.0e0) )
03346 {
03347 int JFAC = (int)((VJ - 820.0e0)/10.0e0 + 0.00001e0);
03348 if ( (JFAC >= 0) && (JFAC <=14) )
03349 SFAC = XFACREV[JFAC];
03350 }
03351
03352 SH2O = SFAC * SH2O;
03353 }
03354
03355
03356
03357
03358 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
03359
03360 }
03361
03362
03363
03364
03365 for ( Index s = 0 ; s < n_f ; ++s )
03366 {
03367
03368 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
03369 if ( (V > 0.000e0) && (V < SL296_ckd_mt_100_v2) )
03370 {
03371
03372
03373
03374
03375 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03376 }
03377 }
03378 }
03379
03380 }
03381
03382
03383
03385
03410 void CKD_mt_100_foreign_h2o( MatrixView pxsec,
03411 const Numeric Cin,
03412 const String& model,
03413 ConstVectorView f_grid,
03414 ConstVectorView abs_p,
03415 ConstVectorView abs_t,
03416 ConstVectorView vmr,
03417 ConstVectorView abs_n2 _U_ )
03418 {
03419
03420
03421
03422 if ((model != "user") && (model != "CKDMT100"))
03423 {
03424 ostringstream os;
03425 os << "!!ERROR!!\n"
03426 << "CKD_MT1.00 H2O foreign continuum:\n"
03427 << "INPUT model name is: " << model << ".\n"
03428 << "VALID model names are user and CKDMT100\n";
03429 throw runtime_error(os.str());
03430 }
03431
03432
03433
03434 Numeric ScalingFac = 1.0000e0;
03435 if ( model == "user" )
03436 {
03437 ScalingFac = Cin;
03438 }
03439
03440
03441 const Index n_p = abs_p.nelem();
03442 const Index n_f = f_grid.nelem();
03443
03444
03445
03446 assert ( n_p==abs_t.nelem() );
03447 assert ( n_p==vmr.nelem() );
03448
03449
03450
03451 assert ( n_f==pxsec.nrows() );
03452 assert ( n_p==pxsec.ncols() );
03453
03454
03455
03456
03457 const Numeric xLosmt = 2.68675e19;
03458 const Numeric T1 = 273.000e0;
03459 const Numeric TO = 296.000e0;
03460 const Numeric PO = 1013.000e0;
03461
03462
03463 const Numeric VABS_min = -2.000e1;
03464 const Numeric VABS_max = 2.000e4;
03465
03466
03467
03468
03469
03470 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
03471 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03472 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03473 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03474 {
03475 out3 << "WARNING:\n"
03476 << " CKD_MT 1.00 H2O foreign continuum:\n"
03477 << " input frequency vector exceeds range of model validity\n"
03478 << " " << FH2O_ckd_mt_100_v1 << "<->" << FH2O_ckd_mt_100_v2 << "cm^-1\n";
03479 }
03480
03481
03482
03483
03484
03485
03486 Numeric DVC = FH2O_ckd_mt_100_dv;
03487 Numeric V1C = V1ABS - DVC;
03488 Numeric V2C = V2ABS + DVC;
03489
03490 int I1 = (int) ((V1C-FH2O_ckd_mt_100_v1) / FH2O_ckd_mt_100_dv);
03491 if (V1C < FH2O_ckd_mt_100_v1) I1 = -1;
03492 V1C = FH2O_ckd_mt_100_v1 + (FH2O_ckd_mt_100_dv * (Numeric)I1);
03493
03494 int I2 = (int) ((V2C-FH2O_ckd_mt_100_v1) / FH2O_ckd_mt_100_dv);
03495
03496 int NPTC = I2-I1+3;
03497 if (NPTC > FH2O_ckd_mt_100_npt) NPTC = FH2O_ckd_mt_100_npt+1;
03498
03499 V2C = V1C + FH2O_ckd_mt_100_dv * (Numeric)(NPTC-1);
03500
03501 if (NPTC < 1)
03502 {
03503 out3 << "WARNING:\n"
03504 << " CKD_MT 1.00 H2O foreign continuum:\n"
03505 << " no elements of internal continuum coefficients could be found for the\n"
03506 << " input frequency range.\n"
03507 << " Leave the function without calculating the absorption.";
03508 return;
03509 }
03510
03511 Numeric FH2OT0[NPTC+addF77fields];
03512
03513 for (Index J = 1 ; J <= NPTC ; ++J)
03514 {
03515 Index I = I1+J;
03516 if ( (I < 1) || (I > FH2O_ckd_mt_100_npt) )
03517 {
03518 FH2OT0[J] = 0.0e0;
03519 }
03520 else
03521 {
03522 FH2OT0[J] = FH2O_ckd_mt_100[I];
03523 }
03524 }
03525
03526
03527
03528
03529
03530
03531
03532 for ( Index i = 0 ; i < n_p ; ++i )
03533 {
03534
03535 Numeric Tave = abs_t[i];
03536 Numeric Pave = (abs_p[i]*1.000e-2);
03537 Numeric vmrh2o = vmr[i];
03538
03539 Numeric PFRGN = (Pave/PO) * (1.00000e0 - vmrh2o);
03540 Numeric RFRGN = PFRGN * (TO/Tave);
03541 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03542
03543 Numeric XKT = Tave / 1.4387752;
03544
03545
03546
03547
03548 Numeric k[NPTC+addF77fields];
03549 k[0] = 0.00e0;
03550 for (Index J = 1 ; J <= NPTC ; ++J)
03551 {
03552 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03553 Numeric FH2O = FH2OT0[J];
03554
03555
03556
03557
03558 k[J] = WTOT * RFRGN * (FH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
03559
03560 }
03561
03562
03563
03564 for ( Index s = 0 ; s < n_f ; ++s )
03565 {
03566
03567 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
03568 if ( (V >= 0.000e0) && (V < VABS_max) )
03569 {
03570
03571
03572
03573
03574 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03575 }
03576 }
03577 }
03578
03579 }
03580
03581
03582
03583
03584
03586
03610 void CKD_241_co2( MatrixView pxsec,
03611 const Numeric Cin,
03612 const String& model,
03613 ConstVectorView f_grid,
03614 ConstVectorView abs_p,
03615 ConstVectorView abs_t _U_,
03616 ConstVectorView vmr _U_)
03617 {
03618
03619
03620 if ((model != "user") && (model != "CKD241"))
03621 {
03622 ostringstream os;
03623 os << "!!ERROR!!\n"
03624 << "CKDv2.4.1 CO2 continuum:\n"
03625 << "INPUT model name is: " << model << ".\n"
03626 << "VALID model names are user and CKD241\n";
03627 throw runtime_error(os.str());
03628 }
03629
03630
03631
03632 Numeric ScalingFac = 0.0000e0;
03633 if ( model == "user" )
03634 {
03635 ScalingFac = Cin;
03636 }
03637 else
03638 {
03639 ScalingFac = 1.0000e0;
03640 }
03641
03642 const Index n_p = abs_p.nelem();
03643 const Index n_f = f_grid.nelem();
03644
03645
03646
03647 assert ( n_p==abs_t.nelem() );
03648 assert ( n_p==vmr.nelem() );
03649
03650
03651
03652 assert ( n_f==pxsec.nrows() );
03653 assert ( n_p==pxsec.ncols() );
03654
03655
03656
03657
03658 const Numeric xLosmt = 2.686763e19;
03659 const Numeric T1 = 273.0e0;
03660 const Numeric TO = 296.0e0;
03661 const Numeric PO = 1013.0e0;
03662
03663
03664 const Numeric VABS_min = -2.000e1;
03665 const Numeric VABS_max = 1.000e4;
03666
03667
03668
03669
03670
03671 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
03672 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03673 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03674 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03675 {
03676 out3 << "WARNING:\n"
03677 << " CKDv2.4.1 CO2 continuum:\n"
03678 << " input frequency vector exceeds range of model validity\n"
03679 << " " << FCO2_ckd_mt_100_v1 << "<->" << FCO2_ckd_mt_100_v2 << "cm^-1\n";
03680 }
03681
03682
03683
03684
03685
03686
03687 Numeric DVC = FCO2_ckd_mt_100_dv;
03688 Numeric V1C = V1ABS - DVC;
03689 Numeric V2C = V2ABS + DVC;
03690
03691 int I1 = (int) ((V1C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03692 if (V1C < FCO2_ckd_mt_100_v1) I1 = -1;
03693 V1C = FCO2_ckd_mt_100_v1 + (FCO2_ckd_mt_100_dv * (Numeric)I1);
03694
03695 int I2 = (int) ((V2C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03696
03697 int NPTC = I2-I1+3;
03698 if (NPTC > FCO2_ckd_mt_100_npt) NPTC = FCO2_ckd_mt_100_npt+1;
03699
03700 V2C = V1C + FCO2_ckd_mt_100_dv * (Numeric)(NPTC-1);
03701
03702 if (NPTC < 1)
03703 {
03704 out3 << "WARNING:\n"
03705 << " CKDv2.4.1 CO2 continuum:\n"
03706 << " no elements of internal continuum coefficients could be found for the\n"
03707 << " input frequency range.\n"
03708 << " Leave the function without calculating the absorption.";
03709 return;
03710 }
03711
03712 Numeric FCO2T0[NPTC+addF77fields];
03713
03714 for (Index J = 1 ; J <= NPTC ; ++J)
03715 {
03716 Index I = I1+J;
03717 if ( (I < 1) || (I > FCO2_ckd_mt_100_npt) )
03718 {
03719 FCO2T0[J] = 0.0e0;
03720 }
03721 else
03722 {
03723 FCO2T0[J] = FCO2_ckd_mt_100[I];
03724 }
03725 }
03726
03727
03728
03729
03730
03731
03732
03733 for ( Index i = 0 ; i < n_p ; ++i )
03734 {
03735 Numeric Tave = abs_t[i];
03736 Numeric Pave = (abs_p[i]*1.000e-2);
03737
03738 Numeric Rhoave = (Pave/PO) * (TO/Tave);
03739 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03740 Numeric XKT = Tave / 1.4387752;
03741
03742
03743
03744
03745
03746 Numeric k[NPTC+addF77fields];
03747 k[0] = 0.00e0;
03748 for (Index J = 1 ; J <= NPTC ; ++J)
03749 {
03750 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03751 Numeric FCO2 = FCO2T0[J];
03752
03753
03754
03755 k[J] = ((WTOT * Rhoave) * (FCO2*1.000e-20) * RADFN_FUN(VJ,XKT));
03756
03757 }
03758
03759
03760
03761
03762 for ( Index s = 0 ; s < n_f ; ++s )
03763 {
03764
03765 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
03766 if ( (V > 0.000e0) && (V < FCO2_ckd_mt_100_v2) )
03767 {
03768
03769
03770 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03771 }
03772 }
03773 }
03774
03775 }
03776
03777
03778
03779
03780
03782
03806 void CKD_mt_co2( MatrixView pxsec,
03807 const Numeric Cin,
03808 const String& model,
03809 ConstVectorView f_grid,
03810 ConstVectorView abs_p,
03811 ConstVectorView abs_t,
03812 ConstVectorView vmr _U_)
03813 {
03814
03815
03816
03817 if ((model != "user") && (model != "CKDMT100"))
03818 {
03819 ostringstream os;
03820 os << "!!ERROR!!\n"
03821 << "CKD_MT.1.00 CO2 continuum:\n"
03822 << "INPUT model name is: " << model << ".\n"
03823 << "VALID model names are user and CKDMT100\n";
03824 throw runtime_error(os.str());
03825 }
03826
03827
03828
03829 Numeric ScalingFac = 0.0000e0;
03830 if ( model == "user" )
03831 {
03832 ScalingFac = Cin;
03833 }
03834 else
03835 {
03836 ScalingFac = 1.0000e0;
03837 }
03838
03839 const Index n_p = abs_p.nelem();
03840 const Index n_f = f_grid.nelem();
03841
03842
03843
03844 assert ( n_p==abs_t.nelem() );
03845 assert ( n_p==vmr.nelem() );
03846
03847
03848
03849 assert ( n_f==pxsec.nrows() );
03850 assert ( n_p==pxsec.ncols() );
03851
03852
03853
03854
03855 const Numeric xLosmt = 2.686763e19;
03856 const Numeric T1 = 273.0e0;
03857 const Numeric TO = 296.0e0;
03858 const Numeric PO = 1013.0e0;
03859
03860
03861 const Numeric VABS_min = FCO2_ckd_mt_100_v1;
03862 const Numeric VABS_max = FCO2_ckd_mt_100_v2;
03863
03864
03865
03866
03867
03868 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
03869 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03870 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03871 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03872 {
03873 out3 << "WARNING:\n"
03874 << " CKD_MT 1.00 CO2 continuum:\n"
03875 << " input frequency vector exceeds range of model validity\n"
03876 << " " << FCO2_ckd_mt_100_v1 << "<->" << FCO2_ckd_mt_100_v2 << "cm^-1\n";
03877 }
03878
03879
03880
03881
03882
03883
03884 Numeric DVC = FCO2_ckd_mt_100_dv;
03885 Numeric V1C = V1ABS - DVC;
03886 Numeric V2C = V2ABS + DVC;
03887
03888 int I1 = (int) ((V1C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03889 if (V1C < FCO2_ckd_mt_100_v1) I1 = -1;
03890 V1C = FCO2_ckd_mt_100_v1 + (FCO2_ckd_mt_100_dv * (Numeric)I1);
03891
03892 int I2 = (int) ((V2C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03893
03894 int NPTC = I2-I1+3;
03895 if (NPTC > FCO2_ckd_mt_100_npt) NPTC = FCO2_ckd_mt_100_npt+1;
03896
03897 V2C = V1C + FCO2_ckd_mt_100_dv * (Numeric)(NPTC-1);
03898
03899 if (NPTC < 1)
03900 {
03901 out3 << "WARNING:\n"
03902 << " CKD_MT 1.00 CO2 continuum:\n"
03903 << " no elements of internal continuum coefficients could be found for the\n"
03904 << " input frequency range.\n"
03905 << " Leave the function without calculating the absorption.";
03906 return;
03907 }
03908
03909 Numeric FCO2T0[NPTC+addF77fields];
03910
03911 for (Index J = 1 ; J <= NPTC ; ++J)
03912 {
03913 Index I = I1+J;
03914 if ( (I < 1) || (I > FCO2_ckd_mt_100_npt) )
03915 {
03916 FCO2T0[J] = 0.0e0;
03917 }
03918 else
03919 {
03920 FCO2T0[J] = FCO2_ckd_mt_100[I];
03921 }
03922 }
03923
03924
03925
03926
03927
03928
03929
03930 for ( Index i = 0 ; i < n_p ; ++i )
03931 {
03932 Numeric Tave = abs_t[i];
03933 Numeric Pave = (abs_p[i]*1.000e-2);
03934
03935 Numeric Rhoave = (Pave/PO) * (TO/Tave);
03936 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03937 Numeric XKT = Tave / 1.4387752;
03938
03939
03940
03941
03942
03943 Numeric k[NPTC+addF77fields];
03944 k[0] = 0.00e0;
03945 for (Index J = 1 ; J <= NPTC ; ++J)
03946 {
03947 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03948 Numeric FCO2 = FCO2T0[J];
03949
03950
03951 if ( (VJ > 500.0e0) && (VJ < 900.0e0) )
03952 {
03953 FCO2 = 7.000e0 * FCO2;
03954 }
03955
03956
03957
03958 k[J] = ((WTOT * Rhoave) * (FCO2*1.000e-20) * RADFN_FUN(VJ,XKT));
03959
03960 }
03961
03962
03963
03964
03965 for ( Index s = 0 ; s < n_f ; ++s )
03966 {
03967
03968 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
03969 if ( (V > 0.000e0) && (V < FCO2_ckd_mt_100_v2) )
03970 {
03971
03972
03973 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03974 }
03975 }
03976 }
03977
03978 }
03979
03980
03981
03983
04018 void CKD_mt_CIArot_n2( MatrixView pxsec,
04019 const Numeric Cin,
04020 const String& model,
04021 ConstVectorView f_grid,
04022 ConstVectorView abs_p,
04023 ConstVectorView abs_t,
04024 ConstVectorView vmr )
04025 {
04026
04027
04028 if ((model != "user") && (model != "CKDMT100"))
04029 {
04030 ostringstream os;
04031 os << "!!ERROR!!\n"
04032 << "CKD_MT1.00 N2 CIA rotational band:\n"
04033 << "INPUT model name is: " << model << ".\n"
04034 << "VALID model names are user and CKDMT100\n";
04035 throw runtime_error(os.str());
04036 }
04037
04038
04039
04040 Numeric ScalingFac = 0.0000e0;
04041 if ( model == "user" )
04042 {
04043 ScalingFac = Cin;
04044 }
04045 else
04046 {
04047 ScalingFac = 1.0000e0;
04048 }
04049
04050 const Index n_p = abs_p.nelem();
04051 const Index n_f = f_grid.nelem();
04052
04053
04054
04055 assert ( n_p==abs_t.nelem() );
04056 assert ( n_p==vmr.nelem() );
04057
04058
04059
04060 assert ( n_f==pxsec.nrows() );
04061 assert ( n_p==pxsec.ncols() );
04062
04063
04064
04065
04066
04067 const Numeric T1 = 273.0e0;
04068 const Numeric TO = 296.0e0;
04069 const Numeric PO = 1013.0e0;
04070
04071
04072
04073 const Numeric VABS_min = -1.000e1;
04074 const Numeric VABS_max = 3.500e2;
04075
04076
04077
04078
04079
04080 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
04081 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04082 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
04083 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
04084 {
04085 out3 << "WARNING:\n"
04086 << " CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04087 << " input frequency vector exceeds range of model validity\n"
04088 << " " << N2N2_CT296_ckd_mt_100_v1 << "<->" << N2N2_CT220_ckd_mt_100_v2 << "cm^-1\n";
04089 }
04090
04091
04092
04093
04094 if (N2N2_CT296_ckd_mt_100_v1 != N2N2_CT220_ckd_mt_100_v1)
04095 {
04096 ostringstream os;
04097 os << "!!ERROR!!\n"
04098 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04099 << "parameter V1 not the same for different ref. temperatures.\n";
04100 throw runtime_error(os.str());
04101 }
04102 if (N2N2_CT296_ckd_mt_100_v2 != N2N2_CT220_ckd_mt_100_v2)
04103 {
04104 ostringstream os;
04105 os << "!!ERROR!!\n"
04106 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04107 << "parameter V2 not the same for different ref. temperatures.\n";
04108 throw runtime_error(os.str());
04109 }
04110 if (N2N2_CT296_ckd_mt_100_dv != N2N2_CT220_ckd_mt_100_dv)
04111 {
04112 ostringstream os;
04113 os << "!!ERROR!!\n"
04114 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04115 << "parameter DV not the same for different ref. temperatures.\n";
04116 throw runtime_error(os.str());
04117 }
04118 if (N2N2_CT296_ckd_mt_100_npt != N2N2_CT220_ckd_mt_100_npt)
04119 {
04120 ostringstream os;
04121 os << "!!ERROR!!\n"
04122 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04123 << "parameter NPT not the same for different ref. temperatures.\n";
04124 throw runtime_error(os.str());
04125 }
04126
04127
04128
04129 Numeric DVC = N2N2_CT296_ckd_mt_100_dv;
04130 Numeric V1C = V1ABS - DVC;
04131 Numeric V2C = V2ABS + DVC;
04132
04133 int I1 = (int) ((V1C-N2N2_CT296_ckd_mt_100_v1) / N2N2_CT296_ckd_mt_100_dv);
04134 if (V1C < N2N2_CT296_ckd_mt_100_v1) I1 = -1;
04135 V1C = N2N2_CT296_ckd_mt_100_v1 + (N2N2_CT296_ckd_mt_100_dv * (Numeric)I1);
04136
04137 int I2 = (int) ((V2C-N2N2_CT296_ckd_mt_100_v1) / N2N2_CT296_ckd_mt_100_dv);
04138
04139 int NPTC = I2-I1+3;
04140 if (NPTC > N2N2_CT296_ckd_mt_100_npt) NPTC = N2N2_CT296_ckd_mt_100_npt+1;
04141
04142 V2C = V1C + N2N2_CT296_ckd_mt_100_dv * (Numeric)(NPTC-1);
04143
04144 if (NPTC < 1)
04145 {
04146 out3 << "WARNING:\n"
04147 << " CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04148 << " no elements of internal continuum coefficients could be found for the\n"
04149 << " input frequency range.\n"
04150 << " Leave the function without calculating the absorption.\n";
04151 return;
04152 }
04153
04154 Numeric C0[NPTC+addF77fields];
04155 Numeric C1[NPTC+addF77fields];
04156
04157 for (Index J = 1 ; J <= NPTC ; ++J)
04158 {
04159 Index I = I1+J;
04160 if ( (I < 1) || (I > N2N2_CT296_ckd_mt_100_npt) )
04161 {
04162 C0[J] = 0.0e0;
04163 C1[J] = 0.0e0;
04164 }
04165 else
04166 {
04167 C0[J] = N2N2_CT296_ckd_mt_100[I];
04168 C1[J] = N2N2_CT220_ckd_mt_100[I];
04169 }
04170 }
04171
04172
04173
04174
04175
04176
04177
04178 for ( Index i = 0 ; i < n_p ; ++i )
04179 {
04180 Numeric Tave = abs_t[i];
04181 Numeric Pave = (abs_p[i]*1.000e-2);
04182 Numeric vmrn2 = vmr[i];
04183 Numeric facfac = vmrn2 * (Pave/PO) * (Pave/PO) *
04184 (T1/Tave) * (T1/Tave);
04185
04186 Numeric XKT = Tave / 1.4387752;
04187 Numeric Tfac = (Tave - TO) / (220.0e0 - TO);
04188
04189
04190
04191
04192 Numeric k[NPTC+addF77fields];
04193 k[0] = 0.00e0;
04194 for (Index J = 1 ; J <= NPTC ; ++J)
04195 {
04196 k[J] = 0.000e0;
04197 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04198 Numeric SN2 = 0.000e0;
04199 if ( (C0[J] > 0.000e0) && (C1[J] > 0.000e0) )
04200 {
04201 SN2 = facfac* C0[J] * pow( (C1[J]/C0[J]), Tfac );
04202 }
04203
04204
04205 k[J] = SN2 * RADFN_FUN(VJ,XKT);
04206 }
04207
04208
04209
04210
04211 for ( Index s = 0 ; s < n_f ; ++s )
04212 {
04213
04214 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
04215 if ( (V > 0.000e0) && (V < N2N2_CT220_ckd_mt_100_v2) )
04216 {
04217
04218
04219 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04220 }
04221 }
04222 }
04223
04224 }
04225
04226
04227
04229
04269 void CKD_mt_CIAfun_n2( MatrixView pxsec,
04270 const Numeric Cin,
04271 const String& model,
04272 ConstVectorView f_grid,
04273 ConstVectorView abs_p,
04274 ConstVectorView abs_t,
04275 ConstVectorView vmr )
04276 {
04277
04278
04279 if ((model != "user") && (model != "CKDMT100"))
04280 {
04281 ostringstream os;
04282 os << "!!ERROR!!\n"
04283 << "CKD_MT1.00 N2 CIA fundamental band:\n"
04284 << "INPUT model name is: " << model << ".\n"
04285 << "VALID model names are user and CKDMT100\n";
04286 throw runtime_error(os.str());
04287 }
04288
04289
04290
04291 Numeric ScalingFac = 1.0000e0;
04292 if ( model == "user" )
04293 {
04294 ScalingFac = Cin;
04295 }
04296
04297
04298 const Index n_p = abs_p.nelem();
04299 const Index n_f = f_grid.nelem();
04300
04301
04302
04303 assert ( n_p==abs_t.nelem() );
04304 assert ( n_p==vmr.nelem() );
04305
04306
04307
04308 assert ( n_f==pxsec.nrows() );
04309 assert ( n_p==pxsec.ncols() );
04310
04311
04312
04313
04314 const Numeric xLosmt = 2.686763e19;
04315 const Numeric T1 = 273.0e0;
04316 const Numeric TO = 296.0e0;
04317 const Numeric PO = 1013.0e0;
04318 const Numeric a1 = 0.8387e0;
04319 const Numeric a2 = 0.0754e0;
04320
04321
04322
04323
04324
04325 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
04326 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04327 if ( (V1ABS < N2N2_N2F_ckd_mt_100_v1) || (V1ABS > N2N2_N2F_ckd_mt_100_v2) ||
04328 (V2ABS < N2N2_N2F_ckd_mt_100_v1) || (V2ABS > N2N2_N2F_ckd_mt_100_v2) )
04329 {
04330 out3 << "WARNING:\n"
04331 << " CKD_MT 1.00 N2-N2 CIA fundamental band:\n"
04332 << " input frequency vector exceeds range of model validity\n"
04333 << " " << N2N2_N2F_ckd_mt_100_v1 << "<->" << N2N2_N2F_ckd_mt_100_v2 << "cm^-1\n";
04334 }
04335
04336
04337
04338
04339
04340
04341 Numeric DVC = N2N2_N2F_ckd_mt_100_dv;
04342 Numeric V1C = V1ABS - DVC;
04343 Numeric V2C = V2ABS + DVC;
04344
04345 int I1 = (int) ((V1C-N2N2_N2F_ckd_mt_100_v1) / N2N2_N2F_ckd_mt_100_dv);
04346 if (V1C < N2N2_N2F_ckd_mt_100_v1) I1 = -1;
04347 V1C = N2N2_N2F_ckd_mt_100_v1 + (N2N2_N2F_ckd_mt_100_dv * (Numeric)I1);
04348
04349 int I2 = (int) ((V2C-N2N2_N2F_ckd_mt_100_v1) / N2N2_N2F_ckd_mt_100_dv);
04350
04351 int NPTC = I2-I1+3;
04352 if (NPTC > N2N2_N2F_ckd_mt_100_npt) NPTC = N2N2_N2F_ckd_mt_100_npt+1;
04353
04354 V2C = V1C + N2N2_N2F_ckd_mt_100_dv * (Numeric)(NPTC-1);
04355
04356 if (NPTC < 1)
04357 {
04358 out3 << "WARNING:\n"
04359 << " CKD_MT 1.00 N2-N2 CIA fundamental band:\n"
04360 << " no elements of internal continuum coefficients could be found for the\n"
04361 << " input frequency range.\n";
04362 return;
04363 }
04364
04365 Numeric xn2[NPTC+addF77fields];
04366 Numeric xn2t[NPTC+addF77fields];
04367
04368 for (Index J = 1 ; J <= NPTC ; ++J)
04369 {
04370 xn2[J] = 0.000e0;
04371 xn2t[J] = 0.000e0;
04372 Index I = I1+J;
04373 if ( (I > 0) && (I <= N2N2_N2F_ckd_mt_100_npt) )
04374 {
04375 xn2[J] = N2N2_N2F_ckd_mt_100[I];
04376 xn2t[J] = N2N2_N2Ft_ckd_mt_100[I];
04377 }
04378 }
04379
04380
04381
04382
04383
04384
04385
04386 for ( Index i = 0 ; i < n_p ; ++i )
04387 {
04388 Numeric Tave = abs_t[i];
04389 Numeric Pave = (abs_p[i]*1.000e-2);
04390 Numeric vmrn2 = vmr[i];
04391 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
04392 Numeric tau_fac= WTOT * (Pave/PO) * (T1/Tave);
04393
04394 Numeric XKT = Tave / 1.4387752e0;
04395
04396
04397 Numeric xktfac = (1.000e0/TO) - (1.000e0/Tave);
04398 Numeric factor = 0.000e0;
04399 if (vmrn2 > VMRCalcLimit)
04400 {
04401 factor = (1.000e0 / xLosmt) * (1.000e0/vmrn2) * (a1 - a2*(Tave/TO));
04402 }
04403
04404
04405
04406
04407 Numeric k[NPTC+addF77fields];
04408 k[0] = 0.000e0;
04409 for (Index J = 1 ; J <= NPTC ; ++J)
04410 {
04411 k[J] = 0.000e0;
04412 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04413 Numeric SN2 = 0.000e0;
04414 if (xn2[J] > 0.000e0)
04415 {
04416 Numeric C0 = factor * xn2[J] * exp(xn2t[J]*xktfac) / VJ;
04417 SN2 = tau_fac * C0;
04418 }
04419
04420
04421 k[J] = SN2 * RADFN_FUN(VJ,XKT);
04422 }
04423
04424
04425
04426
04427 for ( Index s = 0 ; s < n_f ; ++s )
04428 {
04429
04430 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
04431 if ( (V > N2N2_N2F_ckd_mt_100_v1) && (V < N2N2_N2F_ckd_mt_100_v2) )
04432 {
04433
04434
04435 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04436 }
04437 }
04438 }
04439
04440 }
04441
04442
04443
04445
04482 void CKD_mt_CIAfun_o2( MatrixView pxsec,
04483 const Numeric Cin,
04484 const String& model,
04485 ConstVectorView f_grid,
04486 ConstVectorView abs_p,
04487 ConstVectorView abs_t,
04488 ConstVectorView vmr _U_ )
04489 {
04490
04491
04492 if ((model != "user") && (model != "CKDMT100"))
04493 {
04494 ostringstream os;
04495 os << "!!ERROR!!\n"
04496 << "CKD_MT1.00 O2 CIA fundamental band:\n"
04497 << "INPUT model name is: " << model << ".\n"
04498 << "VALID model names are user and CKDMT100\n";
04499 throw runtime_error(os.str());
04500 }
04501
04502
04503
04504 Numeric ScalingFac = 1.0000e0;
04505 if ( model == "user" )
04506 {
04507 ScalingFac = Cin;
04508 }
04509
04510
04511 const Index n_p = abs_p.nelem();
04512 const Index n_f = f_grid.nelem();
04513
04514
04515
04516 assert ( n_p==abs_t.nelem() );
04517 assert ( n_p==vmr.nelem() );
04518
04519
04520
04521 assert ( n_f==pxsec.nrows() );
04522 assert ( n_p==pxsec.ncols() );
04523
04524
04525
04526
04527 const Numeric xLosmt = 2.686763e19;
04528 const Numeric T1 = 273.0e0;
04529 const Numeric TO = 296.0e0;
04530 const Numeric PO = 1013.0e0;
04531
04532
04533
04534
04535
04536 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
04537 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04538 if ( (V1ABS < O2O2_O2F_ckd_mt_100_v1) || (V1ABS > O2O2_O2F_ckd_mt_100_v2) ||
04539 (V2ABS < O2O2_O2F_ckd_mt_100_v1) || (V2ABS > O2O2_O2F_ckd_mt_100_v2) )
04540 {
04541 out3 << "WARNING:\n"
04542 << " CKD_MT 1.00 O2-O2 CIA fundamental band:\n"
04543 << " input frequency vector exceeds range of model validity\n"
04544 << " " << O2O2_O2F_ckd_mt_100_v1 << "<->" << O2O2_O2F_ckd_mt_100_v2 << "cm^-1\n";
04545 }
04546
04547
04548
04549
04550
04551 Numeric DVC = O2O2_O2F_ckd_mt_100_dv;
04552 Numeric V1C = V1ABS - DVC;
04553 Numeric V2C = V2ABS + DVC;
04554
04555 int I1 = (int) ((V1C-O2O2_O2F_ckd_mt_100_v1) / O2O2_O2F_ckd_mt_100_dv);
04556 if (V1C < O2O2_O2F_ckd_mt_100_v1) I1 = -1;
04557 V1C = O2O2_O2F_ckd_mt_100_v1 + (O2O2_O2F_ckd_mt_100_dv * (Numeric)I1);
04558
04559 int I2 = (int) ((V2C-O2O2_O2F_ckd_mt_100_v1) / O2O2_O2F_ckd_mt_100_dv);
04560
04561 int NPTC = I2-I1+3;
04562 if (NPTC > O2O2_O2F_ckd_mt_100_npt) NPTC = O2O2_O2F_ckd_mt_100_npt+1;
04563
04564 V2C = V1C + O2O2_O2F_ckd_mt_100_dv * (Numeric)(NPTC-1);
04565
04566 if (NPTC < 1)
04567 {
04568 out3 << "WARNING:\n"
04569 << " CKD_MT 1.00 O2 CIA fundamental band:\n"
04570 << " no elements of internal continuum coefficients could be found for the\n"
04571 << " input frequency range.\n"
04572 << " Leave the function without calculating the absorption.\n";
04573 return;
04574 }
04575
04576 Numeric xo2[NPTC+addF77fields];
04577 Numeric xo2t[NPTC+addF77fields];
04578
04579 for (Index J = 1 ; J <= NPTC ; ++J)
04580 {
04581 xo2[J] = 0.000e0;
04582 xo2t[J] = 0.000e0;
04583 Index I = I1+J;
04584 if ( (I > 0) && (I <= O2O2_O2F_ckd_mt_100_npt) )
04585 {
04586 xo2[J] = O2O2_O2Fo_ckd_mt_100[I];
04587 xo2t[J] = O2O2_O2Ft_ckd_mt_100[I];
04588 }
04589 }
04590
04591
04592
04593
04594
04595
04596
04597 for ( Index i = 0 ; i < n_p ; ++i )
04598 {
04599 Numeric Tave = abs_t[i];
04600 Numeric Pave = (abs_p[i]*1.000e-2);
04601
04602 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
04603 Numeric tau_fac= WTOT * (Pave/PO) * (T1/Tave);
04604
04605 Numeric XKT = Tave / 1.4387752;
04606
04607 Numeric xktfac = (1.000e0/TO) - (1.000e0/Tave);
04608 Numeric factor = (1.000e0 / xLosmt);
04609
04610
04611
04612
04613 Numeric k[NPTC+addF77fields];
04614 k[0] = 0.00e0;
04615 for (Index J = 1 ; J <= NPTC ; ++J)
04616 {
04617 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04618 Numeric SO2 = 0.0e0;
04619 if (xo2[J] > 0.0e0)
04620 {
04621 Numeric C0 = factor * xo2[J] * exp(xo2t[J]*xktfac) / VJ;
04622 SO2 = tau_fac * C0;
04623 }
04624
04625
04626 k[J] = SO2 * RADFN_FUN(VJ,XKT);
04627 }
04628
04629
04630
04631
04632 for ( Index s = 0 ; s < n_f ; ++s )
04633 {
04634
04635 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
04636 if ( (V > O2O2_O2F_ckd_mt_100_v1) && (V < O2O2_O2F_ckd_mt_100_v2) )
04637 {
04638
04639
04640 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04641 }
04642 }
04643 }
04644
04645 }
04646
04647
04648
04650
04703 void CKD_mt_v0v0_o2( MatrixView pxsec,
04704 const Numeric Cin,
04705 const String& model,
04706 ConstVectorView f_grid,
04707 ConstVectorView abs_p,
04708 ConstVectorView abs_t,
04709 ConstVectorView vmr,
04710 ConstVectorView abs_n2)
04711 {
04712
04713
04714
04715 if ((model != "user") && (model != "CKDMT100"))
04716 {
04717 ostringstream os;
04718 os << "!!ERROR!!\n"
04719 << "CKD_MT1.00 O2 band at 1.27 micrometer:\n"
04720 << "INPUT model name is: " << model << ".\n"
04721 << "VALID model names are user and CKDMT100\n";
04722 throw runtime_error(os.str());
04723 }
04724
04725
04726
04727 Numeric ScalingFac = 1.0000e0;
04728 if ( model == "user" )
04729 {
04730 ScalingFac = Cin;
04731 };
04732
04733 const Index n_p = abs_p.nelem();
04734 const Index n_f = f_grid.nelem();
04735
04736
04737
04738 assert ( n_p==abs_t.nelem() );
04739 assert ( n_p==vmr.nelem() );
04740
04741
04742
04743 assert ( n_f==pxsec.nrows() );
04744 assert ( n_p==pxsec.ncols() );
04745
04746
04747
04748
04749
04750 const Numeric T1 = 273.0e0;
04751
04752 const Numeric PO = 1013.0e0;
04753
04754
04755
04756
04757 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
04758 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04759 if ( (V1ABS < O2_00_ckd_mt_100_v1) || (V1ABS > O2_00_ckd_mt_100_v2) ||
04760 (V2ABS < O2_00_ckd_mt_100_v1) || (V2ABS > O2_00_ckd_mt_100_v2) )
04761 {
04762 out3 << "WARNING:\n"
04763 << " CKD_MT 1.00 O2 v0<-v0 band:\n"
04764 << " input frequency vector exceeds range of model validity\n"
04765 << " " << O2_00_ckd_mt_100_v1 << "<->" << O2_00_ckd_mt_100_v2 << "cm^-1\n";
04766 }
04767
04768
04769
04770
04771
04772 Numeric DVC = O2_00_ckd_mt_100_dv;
04773 Numeric V1C = V1ABS - DVC;
04774 Numeric V2C = V2ABS + DVC;
04775
04776 int I1 = (int) ((V1C-O2_00_ckd_mt_100_v1) / O2_00_ckd_mt_100_dv);
04777 if (V1C < O2_00_ckd_mt_100_v1) I1 = I1-1;
04778 V1C = O2_00_ckd_mt_100_v1 + (O2_00_ckd_mt_100_dv * (Numeric)I1);
04779
04780 int I2 = (int) ((V2C-O2_00_ckd_mt_100_v1) / O2_00_ckd_mt_100_dv);
04781
04782 int NPTC = I2-I1+3;
04783
04784 V2C = V1C + O2_00_ckd_mt_100_dv * (Numeric)(NPTC-1);
04785
04786 if (NPTC < 1)
04787 {
04788 out3 << "WARNING:\n"
04789 << " CKD_MT 1.00 O2 v0<-v0 band:\n"
04790 << " no elements of internal continuum coefficients could be found for the\n"
04791 << " input frequency range.\n"
04792 << " Leave the function without calculating the absorption.\n";
04793 return;
04794 }
04795
04796 Numeric CO[(int)(NPTC+addF77fields)];
04797
04798
04799 for (Index J = 1 ; J <= NPTC ; ++J)
04800 {
04801 CO[J] = 0.000e0;
04802 Index I = I1+J;
04803 if ( (I > 0) && (I <= O2_00_ckd_mt_100_npt) )
04804 {
04805 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04806 CO[J] = O2_00_ckd_mt_100[I] / VJ;
04807 }
04808 }
04809
04810
04811
04812
04813
04814
04815
04816 for ( Index i = 0 ; i < n_p ; ++i )
04817 {
04818 Numeric Tave = abs_t[i];
04819 Numeric Pave = (abs_p[i]*1.000e-2);
04820 Numeric vmro2 = vmr[i];
04821 Numeric vmrn2 = abs_n2[i];
04822 Numeric ADJWO2 = (vmro2 + 0.300e0*vmrn2) / 0.446e0 *
04823 (Pave/PO) * (Pave/PO) * (T1/Tave) * (T1/Tave);
04824 Numeric XKT = Tave / 1.4387752e0;
04825
04826
04827
04828
04829
04830 Numeric k[NPTC+addF77fields];
04831 k[0] = 0.00e0;
04832 for (Index J = 1 ; J <= NPTC ; ++J)
04833 {
04834 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04835 Numeric SO2 = 0.0e0;
04836 if (CO[J] > 0.0e0)
04837 {
04838 SO2 = ADJWO2 * CO[J];
04839 }
04840
04841
04842 k[J] = SO2 * RADFN_FUN(VJ,XKT);
04843 }
04844
04845
04846
04847
04848 for ( Index s = 0 ; s < n_f ; ++s )
04849 {
04850
04851 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
04852 if ( (V > O2_00_ckd_mt_100_v1) && (V < O2_00_ckd_mt_100_v2) )
04853 {
04854
04855
04856 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04857 }
04858 }
04859 }
04860
04861 }
04862
04863
04864
04866
04908 void CKD_mt_v1v0_o2( MatrixView pxsec,
04909 const Numeric Cin,
04910 const String& model,
04911 ConstVectorView f_grid,
04912 ConstVectorView abs_p,
04913 ConstVectorView abs_t,
04914 ConstVectorView vmr )
04915 {
04916
04917
04918 if ((model != "user") && (model != "CKDMT100"))
04919 {
04920 ostringstream os;
04921 os << "!!ERROR!!\n"
04922 << "CKD_MT1.00 O2 band at 1.06 micrometer:\n"
04923 << "INPUT model name is: " << model << ".\n"
04924 << "VALID model names are user and CKDMT100\n";
04925 throw runtime_error(os.str());
04926 }
04927
04928
04929
04930 Numeric ScalingFac = 1.0000e0;
04931 if ( model == "user" )
04932 {
04933 ScalingFac = Cin;
04934 };
04935
04936 const Index n_p = abs_p.nelem();
04937 const Index n_f = f_grid.nelem();
04938
04939
04940
04941 assert ( n_p==abs_t.nelem() );
04942 assert ( n_p==vmr.nelem() );
04943
04944
04945
04946 assert ( n_f==pxsec.nrows() );
04947 assert ( n_p==pxsec.ncols() );
04948
04949
04950
04951
04952 const Numeric xLosmt = 2.686763e19;
04953 const Numeric T1 = 273.0e0;
04954 const Numeric TO = 296.0e0;
04955 const Numeric PO = 1013.0e0;
04956
04957
04958
04959
04960
04961
04962
04963 const Numeric V1S = O2_10_ckd_mt_100_v1;
04964 const Numeric V2S = O2_10_ckd_mt_100_v2;
04965 const Numeric DVS = O2_10_ckd_mt_100_dv;
04966 const Numeric V1_osc = 9375.000e0;
04967 const Numeric HW1 = 58.960e0;
04968 const Numeric V2_osc = 9439.000e0;
04969 const Numeric HW2 = 45.040e0;
04970 const Numeric S1 = 1.166e-4;
04971 const Numeric S2 = 3.086e-5;
04972
04973
04974
04975
04976
04977 Numeric V1ABS = f_grid[0] / (SPEED_OF_LIGHT * 1.00e2);
04978 Numeric V2ABS = f_grid[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04979 if ( (V1ABS < O2_10_ckd_mt_100_v1) || (V1ABS > O2_10_ckd_mt_100_v2) ||
04980 (V2ABS < O2_10_ckd_mt_100_v1) || (V2ABS > O2_10_ckd_mt_100_v2) )
04981 {
04982 out3 << "WARNING:\n"
04983 << " CKD_MT 1.00 O2 v1<-v0 band:\n"
04984 << " input frequency vector exceeds range of model validity\n"
04985 << " " << O2_10_ckd_mt_100_v1 << "<->" << O2_10_ckd_mt_100_v2 << "cm^-1\n";
04986 }
04987
04988
04989
04990
04991
04992 Numeric DVC = DVS;
04993 Numeric V1C = V1ABS - DVC;
04994 Numeric V2C = V2ABS + DVC;
04995
04996 int NPTC = (int)( ((V2C-V1C)/DVC) + 3 );
04997
04998 V2C = V1C + ( DVC * (Numeric)(NPTC-1) );
04999
05000 if (NPTC < 1)
05001 {
05002 out3 << "WARNING:\n"
05003 << " CKD_MT 1.00 O2 v1<-v0 band:\n"
05004 << " no elements of internal continuum coefficients could be found for the\n"
05005 << " input frequency range.\n"
05006 << " Leave the function without calculating the absorption.\n";
05007 return;
05008 }
05009
05010 Numeric C[NPTC+addF77fields];
05011 C[0] = 0.000e0;
05012
05013 for (Index J = 1 ; J <= NPTC ; ++J)
05014 {
05015 C[J] = 0.000e0;
05016 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
05017
05018 if ( (VJ > V1S) && (VJ < V2S) )
05019 {
05020 Numeric DV1 = VJ - V1_osc;
05021 Numeric DV2 = VJ - V2_osc;
05022
05023 Numeric DAMP1 = 1.00e0;
05024 Numeric DAMP2 = 1.00e0;
05025
05026 if ( DV1 < 0.00e0 )
05027 {
05028 DAMP1 = exp(DV1 / 176.100e0);
05029 }
05030
05031 if ( DV2 < 0.00e0 )
05032 {
05033 DAMP2 = exp(DV2 / 176.100e0);
05034 }
05035
05036 Numeric O2INF = 0.31831e0 *
05037 ( ((S1 * DAMP1 / HW1)/(1.000e0 + pow((DV1/HW1),(Numeric)2.0e0) )) +
05038 ((S2 * DAMP2 / HW2)/(1.000e0 + pow((DV2/HW2),(Numeric)2.0e0) )) ) * 1.054e0;
05039 C[J] = O2INF / VJ;
05040 }
05041 }
05042
05043
05044
05045
05046
05047
05048 for ( Index i = 0 ; i < n_p ; ++i )
05049 {
05050 Numeric Tave = abs_t[i];
05051 Numeric Pave = (abs_p[i]*1.000e-2);
05052 Numeric vmro2 = vmr[i];
05053 Numeric WTOT = 1.000e-20 * xLosmt * (Pave/PO) * (T1/Tave);
05054 Numeric ADJWO2 = (vmro2 / 0.209e0) * WTOT * (Pave/PO) * (TO/Tave);
05055 Numeric XKT = Tave / 1.4387752;
05056
05057
05058
05059
05060 Numeric k[NPTC+addF77fields];
05061 k[0] = 0.00e0;
05062 for (Index J = 1 ; J <= NPTC ; ++J)
05063 {
05064 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
05065 Numeric SO2 = 0.0e0;
05066 if (C[J] > 0.0e0)
05067 {
05068 SO2 = ADJWO2 * C[J];
05069 }
05070
05071
05072 k[J] = SO2 * RADFN_FUN(VJ,XKT);
05073 }
05074
05075
05076
05077
05078 for ( Index s = 0 ; s < n_f ; ++s )
05079 {
05080
05081 Numeric V = f_grid[s] / (SPEED_OF_LIGHT * 1.00e2);
05082 if ( (V > V1S) && (V < V2S) )
05083 {
05084
05085
05086 pxsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
05087 }
05088 }
05089 }
05090
05091 }
05092
05093
05094
05096
05128 void CKD24_H20( MatrixView pxsec,
05129 int isf,
05130 const Numeric Cin,
05131 const String& model,
05132 ConstVectorView f_grid,
05133 ConstVectorView abs_p,
05134 ConstVectorView abs_t,
05135 ConstVectorView vmr,
05136 ConstVectorView abs_n2 )
05137 {
05138
05139
05140
05141
05142
05143
05144
05145
05146
05147
05148 extern double artsckd_(double p, double t,
05149 double vmrh2o, double vmrn2, double vmro2,
05150 double freq, int ivc);
05151
05152
05153 Numeric XFAC = 1.0000;
05154
05155
05156
05157
05158 if ((model != "user") && (model != "CKD24"))
05159 {
05160 ostringstream os;
05161 os << "!!ERROR!!\n"
05162 << "CKDv2.4.2 H2O self/foreign continuum:\n"
05163 << "INPUT model name is: " << model << ".\n"
05164 << "VALID model names are user and CKD24\n";
05165 throw runtime_error(os.str());
05166 }
05167
05168
05169
05170 if ( model == "CKD24" )
05171 {
05172 XFAC = 1.0000;
05173 }
05174 else if ( model == "user" )
05175 {
05176 XFAC = Cin;
05177 }
05178 else
05179 {
05180 if (isf == 0) {
05181 ostringstream os;
05182 os << "H2O-SelfContCKD24: ERROR! Wrong model values given.\n"
05183 << "allowed models are: 'CKD24', 'user'" << '\n';
05184 throw runtime_error(os.str());
05185 }
05186 if (isf == 1) {
05187 ostringstream os;
05188 os << "H2O-ForeignContCKD: ERROR! Wrong model values given.\n"
05189 << "allowed models are: 'CKD24', 'user'" << '\n';
05190 throw runtime_error(os.str());
05191 }
05192 }
05193
05194 if (isf == 0) {
05195 out3 << "H2O-SelfContCKD24: (model=" << model << ") parameter values in use:\n"
05196 << " XFAC = " << XFAC << "\n";
05197 }
05198 if (isf == 1) {
05199 out3 << "H2O-ForeignContCKD: (model=" << model << ") parameter values in use:\n"
05200 << " XFAC = " << XFAC << "\n";
05201 }
05202
05203
05204 const Index n_p = abs_p.nelem();
05205 const Index n_f = f_grid.nelem();
05206
05207
05208
05209 assert ( n_p==abs_t.nelem() );
05210 assert ( n_p==vmr.nelem() );
05211
05212
05213
05214 assert ( n_f==pxsec.nrows() );
05215 assert ( n_p==pxsec.ncols() );
05216
05217
05218
05219
05220
05221
05222 int ivc = 55;
05223 if (isf == 0) {
05224 ivc = 21;
05225
05226 }
05227 if (isf == 1) {
05228 ivc = 22;
05229
05230 }
05231 if ((ivc != 1) && (ivc != 21) && (ivc != 22) && (ivc != 31) && (ivc != 32)) {
05232 ostringstream os;
05233 os << "!!ERROR: CKD24 H2O model: wrong input parameter isf (=0,1) given!\n"
05234 << "retrun without calculation!" << "\n"
05235 << "actual value of isf is " << isf << "\n";
05236 throw runtime_error(os.str());
05237 return;
05238 }
05239
05240
05241
05242 for ( Index i=0; i<n_p; ++i )
05243 {
05244 double T = (double) abs_t[i];
05245 double p = (double) (abs_p[i]*1.000e-2);
05246 double vmrh2o = (double) vmr[i];
05247 double vmrn2 = (double) abs_n2[i];
05248 double vmro2 = 0.0e0;
05249
05250
05251
05252
05253
05254
05255
05256
05257
05258 for ( Index s=0; s<n_f; ++s )
05259 {
05260
05261
05262 double f = (double) f_grid[s];
05263 if (ivc == 1) {
05264 if (abs_n2[i] > 0.0e0) {
05265
05266 double cont = artsckd_(p, T, vmrh2o, vmrn2, vmro2, f, ivc);
05267 pxsec(s,i) += (Numeric) (cont / vmr[i]);
05268
05269 }
05270 } else {
05271 if (vmr[i] > 0.0e0) {
05272
05273 double cont = artsckd_(p, T, vmrh2o, vmrn2, vmro2, f, ivc);
05274 pxsec(s,i) += (Numeric) (cont / vmr[i]);
05275
05276 }
05277 }
05278 }
05279 }
05280 return;
05281 }
05282
05283
05285
05309 void Pardo_ATM_H2O_ForeignContinuum( MatrixView pxsec,
05310 const Numeric Cin,
05311 const String& model,
05312 ConstVectorView f_grid,
05313 ConstVectorView abs_p,
05314 ConstVectorView abs_t,
05315 ConstVectorView vmr)
05316 {
05317
05318
05319
05320 const Numeric C_ATM = 0.0315;
05321
05322
05323
05324 Numeric C;
05325 if ( model == "ATM" )
05326 {
05327 C = C_ATM;
05328 }
05329 else if ( model == "user" )
05330 {
05331 C = Cin;
05332 }
05333 else
05334 {
05335 ostringstream os;
05336 os << "H2O-ForeignContATM01: ERROR! Wrong model values given.\n"
05337 << "allowed models are: 'ATM', 'user'" << '\n';
05338 throw runtime_error(os.str());
05339 }
05340 out3 << "H2O-ForeignContATM01: (model=" << model << ") parameter values in use:\n"
05341 << " C_f = " << C << "\n";
05342
05343 const Index n_p = abs_p.nelem();
05344 const Index n_f = f_grid.nelem();
05345
05346
05347 assert ( n_p==abs_t.nelem() );
05348 assert ( n_p==vmr.nelem() );
05349
05350
05351
05352 assert ( n_f==pxsec.nrows() );
05353 assert ( n_p==pxsec.ncols() );
05354
05355
05356 for ( Index i=0; i<n_p; ++i )
05357 {
05358
05359
05360
05361
05362 Numeric pd = abs_p[i] * ( 1.00000e0 - vmr[i] );
05363
05364 Numeric pwdummy = abs_p[i] ;
05365
05366 for ( Index s=0; s<n_f; ++s )
05367 {
05368
05369
05370
05371
05372 pxsec(s,i) += C *
05373 pow( (f_grid[s]/(Numeric)2.25e11), (Numeric)2. ) *
05374 pow( ((Numeric)300.0/abs_t[i]), (Numeric)3. ) *
05375 (pd/1.01300e5) *
05376 (pwdummy/1.01300e5);
05377 }
05378 }
05379 }
05380
05381
05382
05384
05422 void MPM93_H2O_continuum( MatrixView pxsec,
05423 const Numeric fcenter,
05424 const Numeric b1,
05425 const Numeric b2,
05426 const Numeric b3,
05427 const Numeric b4,
05428 const Numeric b5,
05429 const Numeric b6,
05430 const String& model,
05431 ConstVectorView f_grid,
05432 ConstVectorView abs_p,
05433 ConstVectorView abs_t,
05434 ConstVectorView vmr )
05435 {
05436
05437
05438
05439
05440
05441 const Numeric MPM93fo_orig = 1780.000e9;
05442 const Numeric MPM93b1_orig = 22300.000;
05443 const Numeric MPM93b2_orig = 0.952;
05444 const Numeric MPM93b3_orig = 17.600e4;
05445 const Numeric MPM93b4_orig = 30.500;
05446 const Numeric MPM93b5_orig = 2.000;
05447 const Numeric MPM93b6_orig = 5.000;
05448
05449
05450
05451
05452 Numeric MPM93fopcl, MPM93b1pcl, MPM93b2pcl,
05453 MPM93b3pcl, MPM93b4pcl, MPM93b5pcl,
05454 MPM93b6pcl;
05455 if ( model == "MPM93" )
05456 {
05457 MPM93fopcl = MPM93fo_orig;
05458 MPM93b1pcl = MPM93b1_orig;
05459 MPM93b2pcl = MPM93b2_orig;
05460 MPM93b3pcl = MPM93b3_orig;
05461 MPM93b4pcl = MPM93b4_orig;
05462 MPM93b5pcl = MPM93b5_orig;
05463 MPM93b6pcl = MPM93b6_orig;
05464 }
05465 else if ( model == "user" )
05466 {
05467 MPM93fopcl = fcenter;
05468 MPM93b1pcl = b1;
05469 MPM93b2pcl = b2;
05470 MPM93b3pcl = b3;
05471 MPM93b4pcl = b4;
05472 MPM93b5pcl = b5;
05473 MPM93b6pcl = b6;
05474 }
05475 else
05476 {
05477 ostringstream os;
05478 os << "H2O-ContMPM93: ERROR! Wrong model values given.\n"
05479 << "allowed models are: 'MPM93', 'user'" << '\n';
05480 throw runtime_error(os.str());
05481 }
05482 out3 << "H2O-ContMPM93: (model=" << model << ") parameter values in use:\n"
05483 << " fo = " << MPM93fopcl << "\n"
05484 << " b1 = " << MPM93b1pcl << "\n"
05485 << " b2 = " << MPM93b2pcl << "\n"
05486 << " b3 = " << MPM93b3pcl << "\n"
05487 << " b4 = " << MPM93b4pcl << "\n"
05488 << " b5 = " << MPM93b5pcl << "\n"
05489 << " b6 = " << MPM93b6pcl << "\n";
05490
05491 const Index n_p = abs_p.nelem();
05492 const Index n_f = f_grid.nelem();
05493
05494
05495 assert ( n_p==abs_t.nelem() );
05496 assert ( n_p==vmr.nelem() );
05497
05498
05499
05500 assert ( n_f==pxsec.nrows() );
05501 assert ( n_p==pxsec.ncols() );
05502
05503
05504
05505 for ( Index i=0; i<n_p; ++i )
05506 {
05507 Numeric th = 300.0 / abs_t[i];
05508
05509
05510 Numeric strength = MPM93b1pcl * abs_p[i] * pow( th, (Numeric)3.5 )
05511 * exp(MPM93b2pcl * (1 - th));
05512 Numeric gam = MPM93b3pcl * 0.001 *
05513 ( MPM93b4pcl * abs_p[i] * vmr[i] * pow( th, MPM93b6pcl ) +
05514 abs_p[i]*(1.000-vmr[i]) * pow( th, MPM93b5pcl ) );
05515
05516 for ( Index s=0; s<n_f; ++s )
05517 {
05518
05519 pxsec(s,i) += dB_km_to_1_m * 0.1820 *
05520 f_grid[s] * strength *
05521 MPMLineShapeFunction(gam, MPM93fopcl, f_grid[s]);
05522 }
05523 }
05524 return;
05525 }
05526
05527
05528
05529
05531
05559 void MPM85O2AbsModel( MatrixView pxsec,
05560 const Numeric CCin,
05561 const Numeric CLin,
05562 const Numeric CWin,
05563 const Numeric COin,
05564 const String& model,
05565 ConstVectorView f_grid,
05566 ConstVectorView abs_p,
05567 ConstVectorView abs_t,
05568 ConstVectorView abs_h2o,
05569 ConstVectorView vmr )
05570 {
05571
05572
05573
05574
05575
05576 const Numeric mpm85[48][7] = {
05577 { 49.452379 , 0.12 , 11.830 , 8.40 , 0.0 , 5.600 , 1.700 },
05578 { 49.962257 , 0.34 , 10.720 , 8.50 , 0.0 , 5.600 , 1.700 },
05579 { 50.474238 , 0.94 , 9.690 , 8.60 , 0.0 , 5.600 , 1.700 },
05580 { 50.987748 , 2.46 , 8.690 , 8.70 , 0.0 , 5.500 , 1.700 },
05581 { 51.503350 , 6.08 , 7.740 , 8.90 , 0.0 , 5.600 , 1.800 },
05582 { 52.021409 , 14.14 , 6.840 , 9.20 , 0.0 , 5.500 , 1.800 },
05583 { 52.542393 , 31.02 , 6.000 , 9.40 , 0.0 , 5.700 , 1.800 },
05584 { 53.066906 , 64.10 , 5.220 , 9.70 , 0.0 , 5.300 , 1.900 },
05585 { 53.595748 , 124.70 , 4.480 , 10.00 , 0.0 , 5.400 , 1.800 },
05586 { 54.129999 , 228.00 , 3.810 , 10.20 , 0.0 , 4.800 , 2.000 },
05587 { 54.671157 , 391.80 , 3.190 , 10.50 , 0.0 , 4.800 , 1.900 },
05588 { 55.221365 , 631.60 , 2.620 , 10.79 , 0.0 , 4.170 , 2.100 },
05589 { 55.783800 , 953.50 , 2.115 , 11.10 , 0.0 , 3.750 , 2.100 },
05590 { 56.264777 , 548.90 , 0.010 , 16.46 , 0.0 , 7.740 , 0.900 },
05591 { 56.363387 , 1344.00 , 1.655 , 11.44 , 0.0 , 2.970 , 2.300 },
05592 { 56.968180 , 1763.00 , 1.255 , 11.81 , 0.0 , 2.120 , 2.500 },
05593 { 57.612481 , 2141.00 , 0.910 , 12.21 , 0.0 , 0.940 , 3.700 },
05594 { 58.323874 , 2386.00 , 0.621 , 12.66 , 0.0 , -0.550 , -3.100 },
05595 { 58.446589 , 1457.00 , 0.079 , 14.49 , 0.0 , 5.970 , 0.800 },
05596 { 59.164204 , 2404.00 , 0.386 , 13.19 , 0.0 , -2.440 , 0.100 },
05597 { 59.590982 , 2112.00 , 0.207 , 13.60 , 0.0 , 3.440 , 0.500 },
05598 { 60.306057 , 2124.00 , 0.207 , 13.82 , 0.0 , -4.130 , 0.700 },
05599 { 60.434775 , 2461.00 , 0.386 , 12.97 , 0.0 , 1.320 , -1.000 },
05600 { 61.150558 , 2504.00 , 0.621 , 12.48 , 0.0 , -0.360 , 5.800 },
05601 { 61.800152 , 2298.00 , 0.910 , 12.07 , 0.0 , -1.590 , 2.900 },
05602 { 62.411212 , 1933.00 , 1.255 , 11.71 , 0.0 , -2.660 , 2.300 },
05603 { 62.486253 , 1517.00 , 0.078 , 14.68 , 0.0 , -4.770 , 0.900 },
05604 { 62.997974 , 1503.00 , 1.660 , 11.39 , 0.0 , -3.340 , 2.200 },
05605 { 63.568515 , 1087.00 , 2.110 , 11.08 , 0.0 , -4.170 , 2.000 },
05606 { 64.127764 , 733.50 , 2.620 , 10.78 , 0.0 , -4.480 , 2.000 },
05607 { 64.678900 , 463.50 , 3.190 , 10.50 , 0.0 , -5.100 , 1.800 },
05608 { 65.224067 , 274.80 , 3.810 , 10.20 , 0.0 , -5.100 , 1.900 },
05609 { 65.764769 , 153.00 , 4.480 , 10.00 , 0.0 , -5.700 , 1.800 },
05610 { 66.302088 , 80.09 , 5.220 , 9.70 , 0.0 , -5.500 , 1.800 },
05611 { 66.836827 , 39.46 , 6.000 , 9.40 , 0.0 , -5.900 , 1.700 },
05612 { 67.369595 , 18.32 , 6.840 , 9.20 , 0.0 , -5.600 , 1.800 },
05613 { 67.900862 , 8.01 , 7.740 , 8.90 , 0.0 , -5.800 , 1.700 },
05614 { 68.431001 , 3.30 , 8.690 , 8.70 , 0.0 , -5.700 , 1.700 },
05615 { 68.960306 , 1.28 , 9.690 , 8.60 , 0.0 , -5.600 , 1.700 },
05616 { 69.489021 , 0.47 , 10.720 , 8.50 , 0.0 , -5.600 , 1.700 },
05617 { 70.017342 , 0.16 , 11.830 , 8.40 , 0.0 , -5.600 , 1.700 },
05618 { 118.750341 , 945.00 , 0.000 , 15.92 , 0.0 , -0.440 , 0.900 },
05619 { 368.498350 , 67.90 , 0.020 , 19.20 , 0.6 , 0.000 , 0.000 },
05620 { 424.763120 , 638.00 , 0.011 , 19.16 , 0.6 , 0.000 , 0.000 },
05621 { 487.249370 , 235.00 , 0.011 , 19.20 , 0.6 , 0.000 , 0.000 },
05622 { 715.393150 , 99.60 , 0.089 , 18.10 , 0.6 , 0.000 , 0.000 },
05623 { 773.838730 , 671.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000 },
05624 { 834.145330 , 180.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000 },
05625 };
05626
05627
05628 const Index i_first = 0;
05629 const Index i_last = 47;
05630
05631
05632
05633
05634
05635 const Numeric CC_MPM85 = 1.00000;
05636 const Numeric CL_MPM85 = 1.00000;
05637 const Numeric CW_MPM85 = 1.00000;
05638 const Numeric CO_MPM85 = 1.00000;
05639 int AppCutoff = 0;
05640
05641
05642
05643
05644 Numeric CC, CL, CW, CO;
05645 if ( model == "MPM85" )
05646 {
05647 CC = CC_MPM85;
05648 CL = CL_MPM85;
05649 CW = CW_MPM85;
05650 CO = CO_MPM85;
05651 }
05652 else if ( model == "MPM85Lines" )
05653 {
05654 CC = 0.000;
05655 CL = CL_MPM85;
05656 CW = CW_MPM85;
05657 CO = CO_MPM85;
05658 }
05659 else if ( model == "MPM85Continuum" )
05660 {
05661 CC = CC_MPM85;
05662 CL = 0.000;
05663 CW = 0.000;
05664 CO = 0.000;
05665 }
05666 else if ( model == "MPM85NoCoupling" )
05667 {
05668 CC = CC_MPM85;
05669 CL = CL_MPM85;
05670 CW = CW_MPM85;
05671 CO = 0.000;
05672 }
05673 else if ( model == "MPM85NoCutoff" )
05674 {
05675 CC = CC_MPM85;
05676 CL = CL_MPM85;
05677 CW = CW_MPM85;
05678 CO = CO_MPM85;
05679 AppCutoff = 1;
05680 }
05681 else if ( model == "user" )
05682 {
05683 CC = CCin;
05684 CL = CLin;
05685 CW = CWin;
05686 CO = COin;
05687 }
05688 else
05689 {
05690 ostringstream os;
05691 os << "O2-MPM85: ERROR! Wrong model values given.\n"
05692 << "Valid models are: 'MPM85' 'MPM85Lines' 'MPM85Continuum' 'MPM85NoCoupling' 'MPM85NoCutoff'"
05693 << "and 'user'" << '\n';
05694 throw runtime_error(os.str());
05695 }
05696 out3 << "O2-MPM85: (model=" << model << ") parameter values in use:\n"
05697 << " CC = " << CC << "\n"
05698 << " CL = " << CL << "\n"
05699 << " CW = " << CW << "\n"
05700 << " CO = " << CO << "\n";
05701
05702
05703
05704 const Numeric S0 = 6.140e-4;
05705 const Numeric G0 = 5.600e-3;
05706 const Numeric X0 = 0.800;
05707
05708 const Index n_p = abs_p.nelem();
05709 const Index n_f = f_grid.nelem();
05710
05711
05712
05713
05714
05715 const Numeric VMRISO = 0.2085;
05716
05717
05718 assert ( n_p==abs_t.nelem() );
05719 assert ( n_p==vmr.nelem() );
05720
05721
05722
05723 assert ( n_f==pxsec.nrows() );
05724 assert ( n_p==pxsec.ncols() );
05725
05726
05727 for ( Index i=0; i<n_p; ++i )
05728 {
05729
05730 if (vmr[i] < VMRCalcLimit)
05731 {
05732 ostringstream os;
05733 os << "ERROR: MPM87 O2 full absorption model has detected a O2 volume mixing ratio of "
05734 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
05735 << "Therefore no calculation is performed.\n";
05736 throw runtime_error(os.str());
05737 return;
05738 }
05739
05740
05741 Numeric theta = (300.0 / abs_t[i]);
05742
05743 Numeric pwv = Pa_to_kPa * abs_p[i] * abs_h2o[i];
05744
05745 Numeric pda = (Pa_to_kPa * abs_p[i]) - pwv;
05746
05747
05748 Numeric pda_dummy = pda;
05749
05750 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
05751
05752 Numeric gam_cont = G0 * ( pda + 1.10*pwv ) * pow( theta, X0 );
05753
05754
05755 for ( Index s=0; s<n_f; ++s )
05756 {
05757
05758 Numeric ff = f_grid[s] * Hz_to_GHz;
05759
05760
05761
05762
05763
05764
05765 Numeric FAC = 1.000 ;
05766 Numeric Nppc = CC * strength_cont * FAC * ff * gam_cont /
05767 ( pow( ff, (Numeric)2.)
05768 + pow( gam_cont, (Numeric)2.) );
05769
05770
05771 Numeric Nppl = 0.0;
05772 for ( Index l = i_first; l <= i_last; ++l )
05773 {
05774
05775 Numeric strength = CL * mpm85[l][1] * 1.000e-6 * pda_dummy *
05776 pow(theta, (Numeric)3.) * exp(mpm85[l][2]*(1.000-theta)) /
05777 mpm85[l][0];
05778
05779 Numeric gam = CW * ( mpm85[l][3] * 1.000e-3 *
05780 ( ( pda * pow(theta, ((Numeric)0.80-mpm85[l][4]))) +
05781 (1.10 * pwv * theta) ) );
05782
05783 Numeric delta = CO * mpm85[l][5] * 1.000e-3 *
05784 pda * pow(theta, mpm85[l][6]);
05785
05786 Nppl += strength * MPMLineShapeO2Function(gam, mpm85[l][0], ff, delta);
05787 }
05788
05789
05790
05791
05792
05793 if (AppCutoff == 0)
05794 {
05795 if (Nppl < 0.000) Nppl = 0.0000;
05796 }
05797
05798
05799
05800
05801 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
05802 }
05803 }
05804 return;
05805 }
05806
05807
05809
05841 void MPM87O2AbsModel( MatrixView pxsec,
05842 const Numeric CCin,
05843 const Numeric CLin,
05844 const Numeric CWin,
05845 const Numeric COin,
05846 const String& model,
05847 ConstVectorView f_grid,
05848 ConstVectorView abs_p,
05849 ConstVectorView abs_t,
05850 ConstVectorView abs_h2o,
05851 ConstVectorView vmr )
05852 {
05853
05854
05855
05856
05857
05858 const Numeric mpm87[48][7] = {
05859 { 49.452379 , 0.12 , 11.830 , 8.40 , 0.0 , 6.600 , 1.700},
05860 { 49.962257 , 0.34 , 10.720 , 8.50 , 0.0 , 6.600 , 1.700},
05861 { 50.474238 , 0.94 , 9.690 , 8.60 , 0.0 , 6.600 , 1.700},
05862 { 50.987748 , 2.46 , 8.690 , 8.70 , 0.0 , 6.500 , 1.700},
05863 { 51.503350 , 6.08 , 7.740 , 8.90 , 0.0 , 6.627 , 1.800},
05864 { 52.021409 , 14.14 , 6.840 , 9.20 , 0.0 , 6.347 , 1.800},
05865 { 52.542393 , 31.02 , 6.000 , 9.40 , 0.0 , 6.046 , 1.800},
05866 { 53.066906 , 64.10 , 5.220 , 9.70 , 0.0 , 5.719 , 1.900},
05867 { 53.595748 , 124.70 , 4.480 , 10.00 , 0.0 , 5.400 , 1.800},
05868 { 54.129999 , 228.00 , 3.810 , 10.20 , 0.0 , 5.157 , 2.000},
05869 { 54.671157 , 391.80 , 3.190 , 10.50 , 0.0 , 4.783 , 1.900},
05870 { 55.221365 , 631.60 , 2.620 , 10.79 , 0.0 , 4.339 , 2.100},
05871 { 55.783800 , 953.50 , 2.115 , 11.10 , 0.0 , 4.011 , 2.100},
05872 { 56.264777 , 548.90 , 0.010 , 16.46 , 0.0 , 2.772 , 0.900},
05873 { 56.363387 , 1344.00 , 1.655 , 11.44 , 0.0 , 3.922 , 2.300},
05874 { 56.968180 , 1763.00 , 1.255 , 11.81 , 0.0 , 3.398 , 2.500},
05875 { 57.612481 , 2141.00 , 0.910 , 12.21 , 0.0 , 1.145 , 3.200},
05876 { 58.323874 , 2386.00 , 0.621 , 12.66 , 0.0 , -0.317 , -2.500},
05877 { 58.446589 , 1457.00 , 0.079 , 14.49 , 0.0 , 6.270 , 0.800},
05878 { 59.164204 , 2404.00 , 0.386 , 13.19 , 0.0 , -4.119 , 0.100},
05879 { 59.590982 , 2112.00 , 0.207 , 13.60 , 0.0 , 6.766 , 0.500},
05880 { 60.306057 , 2124.00 , 0.207 , 13.82 , 0.0 , -6.183 , 0.700},
05881 { 60.434775 , 2461.00 , 0.386 , 12.97 , 0.0 , 3.290 , -0.400},
05882 { 61.150558 , 2504.00 , 0.621 , 12.48 , 0.0 , -1.591 , 3.500},
05883 { 61.800152 , 2298.00 , 0.910 , 12.07 , 0.0 , -2.068 , 2.900},
05884 { 62.411212 , 1933.00 , 1.255 , 11.71 , 0.0 , -4.158 , 2.300},
05885 { 62.486253 , 1517.00 , 0.078 , 14.68 , 0.0 , -4.068 , 0.900},
05886 { 62.997974 , 1503.00 , 1.660 , 11.39 , 0.0 , -4.482 , 2.200},
05887 { 63.568515 , 1087.00 , 2.110 , 11.08 , 0.0 , -4.442 , 2.000},
05888 { 64.127764 , 733.50 , 2.620 , 10.78 , 0.0 , -4.687 , 2.000},
05889 { 64.678900 , 463.50 , 3.190 , 10.50 , 0.0 , -5.074 , 1.800},
05890 { 65.224067 , 274.80 , 3.810 , 10.20 , 0.0 , -5.403 , 1.900},
05891 { 65.764769 , 153.00 , 4.480 , 10.00 , 0.0 , -5.610 , 1.800},
05892 { 66.302088 , 80.09 , 5.220 , 9.70 , 0.0 , -5.896 , 1.800},
05893 { 66.836827 , 39.46 , 6.000 , 9.40 , 0.0 , -6.194 , 1.700},
05894 { 67.369595 , 18.32 , 6.840 , 9.20 , 0.0 , -6.468 , 1.800},
05895 { 67.900862 , 8.01 , 7.740 , 8.90 , 0.0 , -6.718 , 1.700},
05896 { 68.431001 , 3.30 , 8.690 , 8.70 , 0.0 , -6.700 , 1.700},
05897 { 68.960306 , 1.28 , 9.690 , 8.60 , 0.0 , -6.600 , 1.700},
05898 { 69.489021 , 0.47 , 10.720 , 8.50 , 0.0 , -6.600 , 1.700},
05899 { 70.017342 , 0.16 , 11.830 , 8.40 , 0.0 , -6.600 , 1.700},
05900 { 118.750341 , 945.00 , 0.000 , 16.30 , 0.0 , -0.134 , 0.800},
05901 { 368.498350 , 67.90 , 0.020 , 19.20 , 0.6 , 0.000 , 0.000},
05902 { 424.763120 , 638.00 , 0.011 , 19.16 , 0.6 , 0.000 , 0.000},
05903 { 487.249370 , 235.00 , 0.011 , 19.20 , 0.6 , 0.000 , 0.000},
05904 { 715.393150 , 99.60 , 0.089 , 18.10 , 0.6 , 0.000 , 0.000},
05905 { 773.838730 , 671.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000},
05906 { 834.145330 , 180.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000}
05907 };
05908
05909
05910 const Index i_first = 0;
05911 const Index i_last = 47;
05912
05913
05914
05915
05916
05917 const Numeric CC_MPM87 = 1.00000;
05918 const Numeric CL_MPM87 = 1.00000;
05919 const Numeric CW_MPM87 = 1.00000;
05920 const Numeric CO_MPM87 = 1.00000;
05921 int AppCutoff = 0;
05922
05923
05924
05925
05926 Numeric CC, CL, CW, CO;
05927 if ( model == "MPM87" )
05928 {
05929 CC = CC_MPM87;
05930 CL = CL_MPM87;
05931 CW = CW_MPM87;
05932 CO = CO_MPM87;
05933 }
05934 else if ( model == "MPM87Lines" )
05935 {
05936 CC = 0.000;
05937 CL = CL_MPM87;
05938 CW = CW_MPM87;
05939 CO = CO_MPM87;
05940 }
05941 else if ( model == "MPM87Continuum" )
05942 {
05943 CC = CC_MPM87;
05944 CL = 0.000;
05945 CW = 0.000;
05946 CO = 0.000;
05947 }
05948 else if ( model == "MPM87NoCoupling" )
05949 {
05950 CC = CC_MPM87;
05951 CL = CL_MPM87;
05952 CW = CW_MPM87;
05953 CO = 0.000;
05954 }
05955 else if ( model == "MPM87NoCutoff" )
05956 {
05957
05958
05959
05960 CC = CC_MPM87;
05961 CL = CL_MPM87;
05962 CW = CW_MPM87;
05963 CO = CO_MPM87;
05964 AppCutoff = 1;
05965 }
05966 else if ( model == "user" )
05967 {
05968 CC = CCin;
05969 CL = CLin;
05970 CW = CWin;
05971 CO = COin;
05972 }
05973 else
05974 {
05975 ostringstream os;
05976 os << "O2-MPM87: ERROR! Wrong model values given.\n"
05977 << "Valid models are: 'MPM87' 'MPM87Lines' 'MPM87Continuum' 'MPM87NoCoupling' 'MPM87NoCutoff'"
05978 << "and 'user'" << '\n';
05979 throw runtime_error(os.str());
05980 }
05981 out3 << "O2-MPM87: (model=" << model << ") parameter values in use:\n"
05982 << " CC = " << CC << "\n"
05983 << " CL = " << CL << "\n"
05984 << " CW = " << CW << "\n"
05985 << " CO = " << CO << "\n";
05986
05987
05988
05989 const Numeric S0 = 6.140e-4;
05990 const Numeric G0 = 4.800e-3;
05991 const Numeric X0 = 0.800;
05992
05993 const Index n_p = abs_p.nelem();
05994 const Index n_f = f_grid.nelem();
05995
05996
05997
05998
05999
06000 const Numeric VMRISO = 0.2085;
06001
06002
06003 assert ( n_p==abs_t.nelem() );
06004 assert ( n_p==vmr.nelem() );
06005
06006
06007
06008 assert ( n_f==pxsec.nrows() );
06009 assert ( n_p==pxsec.ncols() );
06010
06011
06012 for ( Index i=0; i<n_p; ++i )
06013 {
06014
06015 if (vmr[i] < VMRCalcLimit)
06016 {
06017 ostringstream os;
06018 os << "ERROR: MPM87 O2 full absorption model has detected a O2 volume mixing ratio of "
06019 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06020 << "Therefore no calculation is performed.\n";
06021 throw runtime_error(os.str());
06022 return;
06023 }
06024
06025
06026 Numeric theta = (300.0 / abs_t[i]);
06027
06028 Numeric pwv = Pa_to_kPa * abs_p[i] * abs_h2o[i];
06029
06030 Numeric pda = (Pa_to_kPa * abs_p[i]) - pwv;
06031
06032
06033 Numeric pda_dummy = pda;
06034
06035 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06036
06037 Numeric gam_cont = G0 * ( pda + 1.10*pwv ) * pow( theta, X0 );
06038
06039
06040 for ( Index s=0; s<n_f; ++s )
06041 {
06042
06043 Numeric ff = f_grid[s] * Hz_to_GHz;
06044
06045
06046
06047 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06048 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06049
06050
06051 Numeric Nppl = 0.0;
06052 for ( Index l = i_first; l <= i_last; ++l )
06053 {
06054
06055 Numeric strength = CL * mpm87[l][1] * 1.000e-6 * pda_dummy *
06056 pow(theta, (Numeric)3.) * exp(mpm87[l][2]*(1.000-theta)) /
06057 mpm87[l][0];
06058
06059 Numeric gam = CW * ( mpm87[l][3] * 1.000e-3 *
06060 ( ( pda * pow(theta, ((Numeric)0.80-mpm87[l][4]))) +
06061 (1.10 * pwv * theta) ) );
06062
06063 Numeric delta = CO * mpm87[l][5] * 1.000e-3 *
06064 pda * pow(theta, mpm87[l][6]);
06065
06066 Nppl += strength * MPMLineShapeO2Function(gam, mpm87[l][0], ff, delta);
06067 }
06068
06069
06070 if (AppCutoff == 0)
06071 {
06072 if (Nppl < 0.000) Nppl = 0.0000;
06073 }
06074
06075
06076
06077
06078 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06079 }
06080 }
06081 return;
06082 }
06083
06084
06086
06115 void MPM89O2AbsModel( MatrixView pxsec,
06116 const Numeric CCin,
06117 const Numeric CLin,
06118 const Numeric CWin,
06119 const Numeric COin,
06120 const String& model,
06121 ConstVectorView f_grid,
06122 ConstVectorView abs_p,
06123 ConstVectorView abs_t,
06124 ConstVectorView abs_h2o,
06125 ConstVectorView vmr )
06126 {
06127
06128
06129
06130
06131
06132 const Numeric mpm89[44][7] = {
06133 { 50.474238, 0.94 , 9.694 , 8.60 , 0.0 , 1.600 , 5.520 },
06134 { 50.987749, 2.46 , 8.694 , 8.70 , 0.0 , 1.400 , 5.520 },
06135 { 51.503350, 6.08 , 7.744 , 8.90 , 0.0 , 1.165 , 5.520 },
06136 { 52.021410, 14.14 , 6.844 , 9.20 , 0.0 , 0.883 , 5.520 },
06137 { 52.542394, 31.02 , 6.004 , 9.40 , 0.0 , 0.579 , 5.520 },
06138 { 53.066907, 64.10 , 5.224 , 9.70 , 0.0 , 0.252 , 5.520 },
06139 { 53.595749, 124.70 , 4.484 , 10.00 , 0.0 , -0.066 , 5.520 },
06140 { 54.130000, 228.00 , 3.814 , 10.20 , 0.0 , -0.314 , 5.520 },
06141 { 54.671159, 391.80 , 3.194 , 10.50 , 0.0 , -0.706 , 5.520 },
06142 { 55.221367, 631.60 , 2.624 , 10.79 , 0.0 , -1.151 , 5.514 },
06143 { 55.783802, 953.50 , 2.119 , 11.10 , 0.0 , -0.920 , 5.025 },
06144 { 56.264775, 548.90 , 0.015 , 16.46 , 0.0 , 2.881 , -0.069 },
06145 { 56.363389, 1344.00 , 1.660 , 11.44 , 0.0 , -0.596 , 4.750 },
06146 { 56.968206, 1763.00 , 1.260 , 11.81 , 0.0 , -0.556 , 4.104 },
06147 { 57.612484, 2141.00 , 0.915 , 12.21 , 0.0 , -2.414 , 3.536 },
06148 { 58.323877, 2386.00 , 0.626 , 12.66 , 0.0 , -2.635 , 2.686 },
06149 { 58.446590, 1457.00 , 0.084 , 14.49 , 0.0 , 6.848 , -0.647 },
06150 { 59.164207, 2404.00 , 0.391 , 13.19 , 0.0 , -6.032 , 1.858 },
06151 { 59.590983, 2112.00 , 0.212 , 13.60 , 0.0 , 8.266 , -1.413 },
06152 { 60.306061, 2124.00 , 0.212 , 13.82 , 0.0 , -7.170 , 0.916 },
06153 { 60.434776, 2461.00 , 0.391 , 12.97 , 0.0 , 5.664 , -2.323 },
06154 { 61.150560, 2504.00 , 0.626 , 12.48 , 0.0 , 1.731 , -3.039 },
06155 { 61.800154, 2298.00 , 0.915 , 12.07 , 0.0 , 1.738 , -3.797 },
06156 { 62.411215, 1933.00 , 1.260 , 11.71 , 0.0 , -0.048 , -4.277 },
06157 { 62.486260, 1517.00 , 0.083 , 14.68 , 0.0 , -4.290 , 0.238 },
06158 { 62.997977, 1503.00 , 1.665 , 11.39 , 0.0 , 0.134 , -4.860 },
06159 { 63.568518, 1087.00 , 2.115 , 11.08 , 0.0 , 0.541 , -5.079 },
06160 { 64.127767, 733.50 , 2.620 , 10.78 , 0.0 , 0.814 , -5.525 },
06161 { 64.678903, 463.50 , 3.195 , 10.50 , 0.0 , 0.415 , -5.520 },
06162 { 65.224071, 274.80 , 3.815 , 10.20 , 0.0 , 0.069 , -5.520 },
06163 { 65.764772, 153.00 , 4.485 , 10.00 , 0.0 , -0.143 , -5.520 },
06164 { 66.302091, 80.09 , 5.225 , 9.70 , 0.0 , -0.428 , -5.520 },
06165 { 66.836830, 39.46 , 6.005 , 9.40 , 0.0 , -0.726 , -5.520 },
06166 { 67.369598, 18.32 , 6.845 , 9.20 , 0.0 , -1.002 , -5.520 },
06167 { 67.900867, 8.01 , 7.745 , 8.90 , 0.0 , -1.255 , -5.520 },
06168 { 68.431005, 3.30 , 8.695 , 8.70 , 0.0 , -1.500 , -5.520 },
06169 { 68.960311, 1.28 , 9.695 , 8.60 , 0.0 , -1.700 , -5.520 },
06170 { 118.750343, 945.00 , 0.009 , 16.30 , 0.0 , -0.247 , 0.003 },
06171 { 368.498350, 67.90 , 0.049 , 19.20 , 0.6 , 0.000 , 0.000 },
06172 { 424.763124, 638.00 , 0.044 , 19.16 , 0.6 , 0.000 , 0.000 },
06173 { 487.249370, 235.00 , 0.049 , 19.20 , 0.6 , 0.000 , 0.000 },
06174 { 715.393150, 99.60 , 0.145 , 18.10 , 0.6 , 0.000 , 0.000 },
06175 { 773.839675, 671.00 , 0.130 , 18.10 , 0.6 , 0.000 , 0.000 },
06176 { 834.145330, 180.00 , 0.147 , 18.10 , 0.6 , 0.000 , 0.000 }
06177 };
06178
06179
06180 const Index i_first = 0;
06181 const Index i_last = 43;
06182
06183
06184
06185
06186
06187 const Numeric CC_MPM89 = 1.00000;
06188 const Numeric CL_MPM89 = 1.00000;
06189 const Numeric CW_MPM89 = 1.00000;
06190 const Numeric CO_MPM89 = 1.00000;
06191 int AppCutoff = 0;
06192
06193
06194
06195
06196 Numeric CC, CL, CW, CO;
06197 if ( model == "MPM89" )
06198 {
06199 CC = CC_MPM89;
06200 CL = CL_MPM89;
06201 CW = CW_MPM89;
06202 CO = CO_MPM89;
06203 }
06204 else if ( model == "MPM89Lines" )
06205 {
06206 CC = 0.000;
06207 CL = CL_MPM89;
06208 CW = CW_MPM89;
06209 CO = CO_MPM89;
06210 }
06211 else if ( model == "MPM89Continuum" )
06212 {
06213 CC = CC_MPM89;
06214 CL = 0.000;
06215 CW = 0.000;
06216 CO = 0.000;
06217 }
06218 else if ( model == "MPM89NoCoupling" )
06219 {
06220 CC = CC_MPM89;
06221 CL = CL_MPM89;
06222 CW = CW_MPM89;
06223 CO = 0.000;
06224 }
06225 else if ( model == "MPM89NoCutoff" )
06226 {
06227 CC = CC_MPM89;
06228 CL = CL_MPM89;
06229 CW = CW_MPM89;
06230 CO = CO_MPM89;
06231 AppCutoff = 1;
06232 }
06233 else if ( model == "user" )
06234 {
06235 CC = CCin;
06236 CL = CLin;
06237 CW = CWin;
06238 CO = COin;
06239 }
06240 else
06241 {
06242 ostringstream os;
06243 os << "O2-MPM89: ERROR! Wrong model values given.\n"
06244 << "Valid models are: 'MPM89' 'MPM89Lines' 'MPM89Continuum' 'MPM89NoCoupling' 'MPM89NoCutoff'"
06245 << "and 'user'" << '\n';
06246 throw runtime_error(os.str());
06247 }
06248 out3 << "O2-MPM89: (model=" << model << ") parameter values in use:\n"
06249 << " CC = " << CC << "\n"
06250 << " CL = " << CL << "\n"
06251 << " CW = " << CW << "\n"
06252 << " CO = " << CO << "\n";
06253
06254
06255
06256 const Numeric S0 = 6.140e-4;
06257 const Numeric G0 = 5.60e-3;
06258 const Numeric X0 = 0.800;
06259
06260 const Index n_p = abs_p.nelem();
06261 const Index n_f = f_grid.nelem();
06262
06263
06264
06265
06266
06267 const Numeric VMRISO = 0.2085;
06268
06269
06270 assert ( n_p==abs_t.nelem() );
06271 assert ( n_p==vmr.nelem() );
06272
06273
06274
06275 assert ( n_f==pxsec.nrows() );
06276 assert ( n_p==pxsec.ncols() );
06277
06278
06279 for ( Index i=0; i<n_p; ++i )
06280 {
06281
06282 if (vmr[i] < VMRCalcLimit)
06283 {
06284 ostringstream os;
06285 os << "ERROR: MPM89 O2 full absorption model has detected a O2 volume mixing ratio of "
06286 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06287 << "Therefore no calculation is performed.\n";
06288 throw runtime_error(os.str());
06289 return;
06290 }
06291
06292
06293 Numeric theta = (300.0 / abs_t[i]);
06294
06295 Numeric pwv = Pa_to_kPa * abs_p[i] * abs_h2o[i];
06296
06297 Numeric pda = (Pa_to_kPa * abs_p[i]) - pwv;
06298
06299
06300 Numeric pda_dummy = pda;
06301
06302 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06303
06304 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06305
06306
06307 for ( Index s=0; s<n_f; ++s )
06308 {
06309
06310 Numeric ff = f_grid[s] * Hz_to_GHz;
06311
06312
06313
06314 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06315 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06316
06317
06318 Numeric Nppl = 0.0;
06319 for ( Index l = i_first; l <= i_last; ++l )
06320 {
06321
06322 Numeric strength = CL * mpm89[l][1] * 1.000e-6 * pda_dummy *
06323 pow(theta, (Numeric)3.) * exp(mpm89[l][2]*(1.000-theta)) /
06324 mpm89[l][0];
06325
06326 Numeric gam = CW * ( mpm89[l][3] * 1.000e-3 *
06327 ( ( pda * pow(theta, ((Numeric)0.80-mpm89[l][4]))) +
06328 (1.10 * pwv * theta) ) );
06329
06330 Numeric delta = CO * ( (mpm89[l][5] + mpm89[l][6] * theta) * 1.000e-3 *
06331 pda * pow(theta, (Numeric)0.8) );
06332
06333 Nppl += strength * MPMLineShapeO2Function(gam, mpm89[l][0], ff, delta);
06334 }
06335
06336
06337 if (AppCutoff == 0)
06338 {
06339 if (Nppl < 0.000) Nppl = 0.0000;
06340 }
06341
06342
06343
06344
06345 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06346 }
06347 }
06348 return;
06349 }
06350
06351
06352
06354
06384 void MPM92O2AbsModel( MatrixView pxsec,
06385 const Numeric CCin,
06386 const Numeric CLin,
06387 const Numeric CWin,
06388 const Numeric COin,
06389 const String& model,
06390 ConstVectorView f_grid,
06391 ConstVectorView abs_p,
06392 ConstVectorView abs_t,
06393 ConstVectorView abs_h2o,
06394 ConstVectorView vmr )
06395 {
06396
06397
06398
06399
06400
06401 const Numeric mpm92[44][7] = {
06402 { 50.474238, 0.094, 9.694, 0.850, 0.0, 0.210, 0.685},
06403 { 50.987749, 0.246, 8.694, 0.870, 0.0, 0.190, 0.680},
06404 { 51.503350, 0.608, 7.744, 0.890, 0.0, 0.171, 0.673},
06405 { 52.021410, 1.414, 6.844, 0.920, 0.0, 0.144, 0.664},
06406 { 52.542394, 3.102, 6.004, 0.940, 0.0, 0.118, 0.653},
06407 { 53.066907, 6.410, 5.224, 0.970, 0.0, 0.114, 0.621},
06408 { 53.595749, 12.470, 4.484, 1.000, 0.0, 0.200, 0.508},
06409 { 54.130000, 22.800, 3.814, 1.020, 0.0, 0.291, 0.375},
06410 { 54.671159, 39.180, 3.194, 1.050, 0.0, 0.325, 0.265},
06411 { 55.221367, 63.160, 2.624, 1.080, 0.0, 0.224, 0.295},
06412 { 55.783802, 95.350, 2.119, 1.110, 0.0, -0.144, 0.613},
06413 { 56.264775, 54.890, 0.015, 1.646, 0.0, 0.339, -0.098},
06414 { 56.363389, 134.400, 1.660, 1.144, 0.0, -0.258, 0.655},
06415 { 56.968206, 176.300, 1.260, 1.181, 0.0, -0.362, 0.645},
06416 { 57.612484, 214.100, 0.915, 1.221, 0.0, -0.533, 0.606},
06417 { 58.323877, 238.600, 0.626, 1.266, 0.0, -0.178, 0.044},
06418 { 58.446590, 145.700, 0.084, 1.449, 0.0, 0.650, -0.127},
06419 { 59.164207, 240.400, 0.391, 1.319, 0.0, -0.628, 0.231},
06420 { 59.590983, 211.200, 0.212, 1.360, 0.0, 0.665, -0.078},
06421 { 60.306061, 212.400, 0.212, 1.382, 0.0, -0.613, 0.070},
06422 { 60.434776, 246.100, 0.391, 1.297, 0.0, 0.606, -0.282},
06423 { 61.150560, 250.400, 0.626, 1.248, 0.0, 0.090, -0.058},
06424 { 61.800154, 229.800, 0.915, 1.207, 0.0, 0.496, -0.662},
06425 { 62.411215, 193.300, 1.260, 1.171, 0.0, 0.313, -0.676},
06426 { 62.486260, 151.700, 0.083, 1.468, 0.0, -0.433, 0.084},
06427 { 62.997977, 150.300, 1.665, 1.139, 0.0, 0.208, -0.668},
06428 { 63.568518, 108.700, 2.115, 1.110, 0.0, 0.094, -0.614},
06429 { 64.127767, 73.350, 2.620, 1.080, 0.0, -0.270, -0.289},
06430 { 64.678903, 46.350, 3.195, 1.050, 0.0, -0.366, -0.259},
06431 { 65.224071, 27.480, 3.815, 1.020, 0.0, -0.326, -0.368},
06432 { 65.764772, 15.300, 4.485, 1.000, 0.0, -0.232, -0.500},
06433 { 66.302091, 8.009, 5.225, 0.970, 0.0, -0.146, -0.609},
06434 { 66.836830, 3.946, 6.005, 0.940, 0.0, -0.147, -0.639},
06435 { 67.369598, 1.832, 6.845, 0.920, 0.0, -0.174, -0.647},
06436 { 67.900867, 0.801, 7.745, 0.890, 0.0, -0.198, -0.655},
06437 { 68.431005, 0.330, 8.695, 0.870, 0.0, -0.210, -0.660},
06438 { 68.960311, 0.128, 9.695, 0.850, 0.0, -0.220, -0.665},
06439 { 118.750343, 94.500, 0.009, 1.630, 0.0, -0.031, 0.008},
06440 { 368.498350, 6.790, 0.049, 1.920, 0.6, 0.000, 0.000},
06441 { 424.763124, 63.800, 0.044, 1.926, 0.6, 0.000, 0.000},
06442 { 487.249370, 23.500, 0.049, 1.920, 0.6, 0.000, 0.000},
06443 { 715.393150, 9.960, 0.145, 1.810, 0.6, 0.000, 0.000},
06444 { 773.839675, 67.100, 0.130, 1.810, 0.6, 0.000, 0.000},
06445 { 834.145330, 18.000, 0.147, 1.810, 0.6, 0.000, 0.000}};
06446
06447
06448 const Index i_first = 0;
06449 const Index i_last = 43;
06450
06451
06452
06453
06454
06455 const Numeric CC_MPM92 = 1.00000;
06456 const Numeric CL_MPM92 = 1.00000;
06457 const Numeric CW_MPM92 = 1.00000;
06458 const Numeric CO_MPM92 = 1.00000;
06459 int AppCutoff = 0;
06460
06461
06462
06463
06464 Numeric CC, CL, CW, CO;
06465 if ( model == "MPM92" )
06466 {
06467 CC = CC_MPM92;
06468 CL = CL_MPM92;
06469 CW = CW_MPM92;
06470 CO = CO_MPM92;
06471 }
06472 else if ( model == "MPM92Lines" )
06473 {
06474 CC = 0.000;
06475 CL = CL_MPM92;
06476 CW = CW_MPM92;
06477 CO = CO_MPM92;
06478 }
06479 else if ( model == "MPM92Continuum" )
06480 {
06481 CC = CC_MPM92;
06482 CL = 0.000;
06483 CW = 0.000;
06484 CO = 0.000;
06485 }
06486 else if ( model == "MPM92NoCoupling" )
06487 {
06488 CC = CC_MPM92;
06489 CL = CL_MPM92;
06490 CW = CW_MPM92;
06491 CO = 0.000;
06492 }
06493 else if ( model == "MPM92NoCutoff" )
06494 {
06495 CC = CC_MPM92;
06496 CL = CL_MPM92;
06497 CW = CW_MPM92;
06498 CO = CO_MPM92;
06499 AppCutoff = 1;
06500 }
06501 else if ( model == "user" )
06502 {
06503 CC = CCin;
06504 CL = CLin;
06505 CW = CWin;
06506 CO = COin;
06507 }
06508 else
06509 {
06510 ostringstream os;
06511 os << "O2-MPM92: ERROR! Wrong model values given.\n"
06512 << "Valid models are: 'MPM92' 'MPM92Lines' 'MPM92Continuum' 'MPM92NoCoupling' 'MPM92NoCutoff'"
06513 << "and 'user'" << '\n';
06514 throw runtime_error(os.str());
06515 }
06516 out3 << "O2-MPM92: (model=" << model << ") parameter values in use:\n"
06517 << " CC = " << CC << "\n"
06518 << " CL = " << CL << "\n"
06519 << " CW = " << CW << "\n"
06520 << " CO = " << CO << "\n";
06521
06522
06523
06524
06525
06526
06527 const Numeric VMRISO = 0.2085;
06528
06529
06530 const Numeric S0 = 6.140e-5;
06531 const Numeric G0 = 0.560e-3;
06532 const Numeric X0 = 0.800;
06533
06534 const Index n_p = abs_p.nelem();
06535 const Index n_f = f_grid.nelem();
06536
06537
06538 assert ( n_p==abs_t.nelem() );
06539 assert ( n_p==vmr.nelem() );
06540
06541
06542
06543 assert ( n_f==pxsec.nrows() );
06544 assert ( n_p==pxsec.ncols() );
06545
06546
06547 for ( Index i=0; i<n_p; ++i )
06548 {
06549
06550 if (vmr[i] < VMRCalcLimit)
06551 {
06552 ostringstream os;
06553 os << "ERROR: MPM92 O2 full absorption model has detected a O2 volume mixing ratio of "
06554 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06555 << "Therefore no calculation is performed.\n";
06556 throw runtime_error(os.str());
06557 return;
06558 }
06559
06560
06561 Numeric theta = (300.0 / abs_t[i]);
06562
06563 Numeric pwv = Pa_to_hPa * abs_p[i] * abs_h2o[i];
06564
06565 Numeric pda = (Pa_to_hPa * abs_p[i]) - pwv;
06566
06567
06568 Numeric pda_dummy = pda;
06569
06570 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06571
06572 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06573
06574
06575 for ( Index s=0; s<n_f; ++s )
06576 {
06577
06578 Numeric ff = f_grid[s] * Hz_to_GHz;
06579
06580
06581
06582 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06583 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06584
06585
06586 Numeric Nppl = 0.0;
06587 for ( Index l = i_first; l <= i_last; ++l )
06588 {
06589
06590 Numeric strength = CL * 1.000e-6 * pda_dummy * mpm92[l][1] / mpm92[l][0] *
06591 pow(theta, (Numeric)3.) * exp(mpm92[l][2]*(1.0-theta));
06592
06593 Numeric gam = CW * ( mpm92[l][3] * 0.001 *
06594 ( ( pda * pow(theta, ((Numeric)0.8-mpm92[l][4]))) +
06595 (1.10 * pwv * theta) ) );
06596
06597
06598 Numeric delta = CO * ( (mpm92[l][5] + mpm92[l][6] * theta) *
06599 (pda+pwv) * 0.001 * pow(theta, (Numeric)0.8) );
06600
06601 Nppl += strength * MPMLineShapeO2Function(gam, mpm92[l][0], ff, delta);
06602 }
06603
06604
06605 if (AppCutoff == 0)
06606 {
06607 if (Nppl < 0.000) Nppl = 0.0000;
06608 }
06609
06610
06611
06612
06613 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06614 }
06615 }
06616 return;
06617 }
06618
06619
06621
06652 void MPM93O2AbsModel( MatrixView pxsec,
06653 const Numeric CCin,
06654 const Numeric CLin,
06655 const Numeric CWin,
06656 const Numeric COin,
06657 const String& model,
06658 ConstVectorView f_grid,
06659 ConstVectorView abs_p,
06660 ConstVectorView abs_t,
06661 ConstVectorView abs_h2o,
06662 ConstVectorView vmr )
06663 {
06664
06665
06666
06667
06668
06669 const Numeric mpm93[44][7] = {
06670 { 50.474238, 0.094, 9.694, 0.890, 0.0, 0.240, 0.790},
06671 { 50.987749, 0.246, 8.694, 0.910, 0.0, 0.220, 0.780},
06672 { 51.503350, 0.608, 7.744, 0.940, 0.0, 0.197, 0.774},
06673 { 52.021410, 1.414, 6.844, 0.970, 0.0, 0.166, 0.764},
06674 { 52.542394, 3.102, 6.004, 0.990, 0.0, 0.136, 0.751},
06675 { 53.066907, 6.410, 5.224, 1.020, 0.0, 0.131, 0.714},
06676 { 53.595749, 12.470, 4.484, 1.050, 0.0, 0.230, 0.584},
06677 { 54.130000, 22.800, 3.814, 1.070, 0.0, 0.335, 0.431},
06678 { 54.671159, 39.180, 3.194, 1.100, 0.0, 0.374, 0.305},
06679 { 55.221367, 63.160, 2.624, 1.130, 0.0, 0.258, 0.339},
06680 { 55.783802, 95.350, 2.119, 1.170, 0.0, -0.166, 0.705},
06681 { 56.264775, 54.890, 0.015, 1.730, 0.0, 0.390, -0.113},
06682 { 56.363389, 134.400, 1.660, 1.200, 0.0, -0.297, 0.753},
06683 { 56.968206, 176.300, 1.260, 1.240, 0.0, -0.416, 0.742},
06684 { 57.612484, 214.100, 0.915, 1.280, 0.0, -0.613, 0.697},
06685 { 58.323877, 238.600, 0.626, 1.330, 0.0, -0.205, 0.051},
06686 { 58.446590, 145.700, 0.084, 1.520, 0.0, 0.748, -0.146},
06687 { 59.164207, 240.400, 0.391, 1.390, 0.0, -0.722, 0.266},
06688 { 59.590983, 211.200, 0.212, 1.430, 0.0, 0.765, -0.090},
06689 { 60.306061, 212.400, 0.212, 1.450, 0.0, -0.705, 0.081},
06690 { 60.434776, 246.100, 0.391, 1.360, 0.0, 0.697, -0.324},
06691 { 61.150560, 250.400, 0.626, 1.310, 0.0, 0.104, -0.067},
06692 { 61.800154, 229.800, 0.915, 1.270, 0.0, 0.570, -0.761},
06693 { 62.411215, 193.300, 1.260, 1.230, 0.0, 0.360, -0.777},
06694 { 62.486260, 151.700, 0.083, 1.540, 0.0, -0.498, 0.097},
06695 { 62.997977, 150.300, 1.665, 1.200, 0.0, 0.239, -0.768},
06696 { 63.568518, 108.700, 2.115, 1.170, 0.0, 0.108, -0.706},
06697 { 64.127767, 73.350, 2.620, 1.130, 0.0, -0.311, -0.332},
06698 { 64.678903, 46.350, 3.195, 1.100, 0.0, -0.421, -0.298},
06699 { 65.224071, 27.480, 3.815, 1.070, 0.0, -0.375, -0.423},
06700 { 65.764772, 15.300, 4.485, 1.050, 0.0, -0.267, -0.575},
06701 { 66.302091, 8.009, 5.225, 1.020, 0.0, -0.168, -0.700},
06702 { 66.836830, 3.946, 6.005, 0.990, 0.0, -0.169, -0.735},
06703 { 67.369598, 1.832, 6.845, 0.970, 0.0, -0.200, -0.744},
06704 { 67.900867, 0.801, 7.745, 0.940, 0.0, -0.228, -0.753},
06705 { 68.431005, 0.330, 8.695, 0.920, 0.0, -0.240, -0.760},
06706 { 68.960311, 0.128, 9.695, 0.900, 0.0, -0.250, -0.765},
06707 { 118.750343, 94.500, 0.009, 1.630, 0.0, -0.036, 0.009},
06708 { 368.498350, 6.790, 0.049, 1.920, 0.6, 0.000, 0.000},
06709 { 424.763124, 63.800, 0.044, 1.930, 0.6, 0.000, 0.000},
06710 { 487.249370, 23.500, 0.049, 1.920, 0.6, 0.000, 0.000},
06711 { 715.393150, 9.960, 0.145, 1.810, 0.6, 0.000, 0.000},
06712 { 773.839675, 67.100, 0.130, 1.820, 0.6, 0.000, 0.000},
06713 { 834.145330, 18.000, 0.147, 1.810 , 0.6, 0.000, 0.000}};
06714
06715 const Index i_first = 0;
06716 const Index i_last = 43;
06717
06718
06719
06720
06721
06722 const Numeric CC_MPM93 = 1.00000;
06723 const Numeric CL_MPM93 = 1.00000;
06724 const Numeric CW_MPM93 = 1.00000;
06725 const Numeric CO_MPM93 = 1.00000;
06726 int AppCutoff = 0;
06727
06728
06729
06730
06731 Numeric CC, CL, CW, CO;
06732 if ( model == "MPM93" )
06733 {
06734 CC = CC_MPM93;
06735 CL = CL_MPM93;
06736 CW = CW_MPM93;
06737 CO = CO_MPM93;
06738 }
06739 else if ( model == "MPM93Lines" )
06740 {
06741 CC = 0.000;
06742 CL = CL_MPM93;
06743 CW = CW_MPM93;
06744 CO = CO_MPM93;
06745 }
06746 else if ( model == "MPM93Continuum" )
06747 {
06748 CC = CC_MPM93;
06749 CL = 0.000;
06750 CW = 0.000;
06751 CO = 0.000;
06752 }
06753 else if ( model == "MPM93NoCoupling" )
06754 {
06755 CC = CC_MPM93;
06756 CL = CL_MPM93;
06757 CW = CW_MPM93;
06758 CO = 0.000;
06759 }
06760 else if ( model == "MPM93NoCutoff" )
06761 {
06762
06763
06764
06765 CC = CC_MPM93;
06766 CL = CL_MPM93;
06767 CW = CW_MPM93;
06768 CO = CO_MPM93;
06769 AppCutoff = 1;
06770 }
06771 else if ( model == "user" )
06772 {
06773 CC = CCin;
06774 CL = CLin;
06775 CW = CWin;
06776 CO = COin;
06777 }
06778 else
06779 {
06780 ostringstream os;
06781 os << "O2-MPM93: ERROR! Wrong model values given.\n"
06782 << "Valid models are: 'MPM93' 'MPM93Lines' 'MPM93Continuum' 'MPM93NoCoupling' 'MPM93NoCutoff'"
06783 << "and 'user'" << '\n';
06784 throw runtime_error(os.str());
06785 }
06786 out3 << "O2-MPM93: (model=" << model << ") parameter values in use:\n"
06787 << " CC = " << CC << "\n"
06788 << " CL = " << CL << "\n"
06789 << " CW = " << CW << "\n"
06790 << " CO = " << CO << "\n";
06791
06792
06793
06794
06795
06796
06797 const Numeric VMRISO = 0.2085;
06798
06799
06800 const Numeric S0 = 6.140e-5;
06801 const Numeric G0 = 0.560e-3;
06802 const Numeric X0 = 0.800;
06803
06804 const Index n_p = abs_p.nelem();
06805 const Index n_f = f_grid.nelem();
06806
06807
06808 assert ( n_p==abs_t.nelem() );
06809 assert ( n_p==vmr.nelem() );
06810
06811
06812
06813 assert ( n_f==pxsec.nrows() );
06814 assert ( n_p==pxsec.ncols() );
06815
06816
06817 for ( Index i=0; i<n_p; ++i )
06818 {
06819
06820 if (vmr[i] < VMRCalcLimit)
06821 {
06822 ostringstream os;
06823 os << "ERROR: MPM93 O2 full absorption model has detected a O2 volume mixing ratio of "
06824 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06825 << "Therefore no calculation is performed.\n";
06826 throw runtime_error(os.str());
06827 return;
06828 }
06829
06830
06831 Numeric theta = (300.0 / abs_t[i]);
06832
06833 Numeric pwv = Pa_to_hPa * abs_p[i] * abs_h2o[i];
06834
06835 Numeric pda = (Pa_to_hPa * abs_p[i]) - pwv;
06836
06837
06838
06839 Numeric pda_dummy = pda;
06840
06841 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06842
06843 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06844
06845
06846 for ( Index s=0; s<n_f; ++s )
06847 {
06848
06849 Numeric ff = f_grid[s] * Hz_to_GHz;
06850
06851
06852
06853 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06854 ( pow( ff, (Numeric)2.)
06855 + pow( gam_cont, (Numeric)2.) );
06856
06857
06858 Numeric Nppl = 0.0;
06859 for ( Index l = i_first; l <= i_last; ++l )
06860 {
06861
06862 Numeric strength = CL * 1.000e-6 * pda_dummy *
06863 mpm93[l][1] / mpm93[l][0] *
06864 pow(theta, (Numeric)3.) * exp(mpm93[l][2]*(1.0-theta));
06865
06866 Numeric gam = CW * ( mpm93[l][3] * 0.001 *
06867 ( ( pda * pow(theta, ((Numeric)0.8-mpm93[l][4]))) +
06868 (1.10 * pwv * theta) ) );
06869
06870
06871 Numeric delta = CO * ( (mpm93[l][5] + mpm93[l][6] * theta) *
06872 (pda+pwv) * pow(theta, (Numeric)0.8)
06873 * (Numeric)0.001 );
06874
06875 Nppl += strength * MPMLineShapeO2Function(gam, mpm93[l][0], ff, delta);
06876 }
06877
06878
06879 if (AppCutoff == 0)
06880 {
06881 if (Nppl < 0.000) Nppl = 0.0000;
06882 }
06883
06884
06885
06886
06887 pxsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06888 }
06889 }
06890 return;
06891 }
06892
06893
06894
06896
06947 void PWR93O2AbsModel( MatrixView pxsec,
06948 const Numeric CCin,
06949 const Numeric CLin,
06950 const Numeric CWin,
06951 const Numeric COin,
06952 const String& model,
06953 const String& version,
06954 ConstVectorView f_grid,
06955 ConstVectorView abs_p,
06956 ConstVectorView abs_t,
06957 ConstVectorView vmrh2o,
06958 ConstVectorView vmr )
06959 {
06960 const Index n_lines = 40;
06961
06962
06963
06964 const Numeric F93[n_lines] = { 118.7503, 56.2648, 62.4863, 58.4466,
06965 60.3061, 59.5910, 59.1642, 60.4348,
06966 58.3239, 61.1506, 57.6125, 61.8002,
06967 56.9682, 62.4112, 56.3634, 62.9980,
06968 55.7838, 63.5685, 55.2214, 64.1278,
06969 54.6712, 64.6789, 54.1300, 65.2241,
06970 53.5957, 65.7648, 53.0669, 66.3021,
06971 52.5424, 66.8368, 52.0214, 67.3696,
06972 51.5034, 67.9009, 368.4984, 424.7631,
06973 487.2494, 715.3932, 773.8397, 834.1453};
06974
06975
06976 const Numeric F98[n_lines] = { 118.7503, 56.2648, 62.4863, 58.4466, 60.3061, 59.5910,
06977 59.1642, 60.4348, 58.3239, 61.1506, 57.6125, 61.8002,
06978 56.9682, 62.4112, 56.3634, 62.9980, 55.7838, 63.5685,
06979 55.2214, 64.1278, 54.6712, 64.6789, 54.1300, 65.2241,
06980 53.5957, 65.7648, 53.0669, 66.3021, 52.5424, 66.8368,
06981 52.0214, 67.3696, 51.5034, 67.9009, 368.4984, 424.7632,
06982 487.2494, 715.3931, 773.8397, 834.1458};
06983
06984
06985
06986 const Numeric S93[n_lines] = { 0.2936E-14, 0.8079E-15, 0.2480E-14, 0.2228E-14,
06987 0.3351E-14, 0.3292E-14, 0.3721E-14, 0.3891E-14,
06988 0.3640E-14, 0.4005E-14, 0.3227E-14, 0.3715E-14,
06989 0.2627E-14, 0.3156E-14, 0.1982E-14, 0.2477E-14,
06990 0.1391E-14, 0.1808E-14, 0.9124E-15, 0.1230E-14,
06991 0.5603E-15, 0.7842E-15, 0.3228E-15, 0.4689E-15,
06992 0.1748E-15, 0.2632E-15, 0.8898E-16, 0.1389E-15,
06993 0.4264E-16, 0.6899E-16, 0.1924E-16, 0.3229E-16,
06994 0.8191E-17, 0.1423E-16, 0.6460E-15, 0.7047E-14,
06995 0.3011E-14, 0.1826E-14, 0.1152E-13, 0.3971E-14};
06996
06997
06998 const Numeric S98[n_lines] = { 0.2936E-14, 0.8079E-15, 0.2480E-14, 0.2228E-14,
06999 0.3351E-14, 0.3292E-14, 0.3721E-14, 0.3891E-14,
07000 0.3640E-14, 0.4005E-14, 0.3227E-14, 0.3715E-14,
07001 0.2627E-14, 0.3156E-14, 0.1982E-14, 0.2477E-14,
07002 0.1391E-14, 0.1808E-14, 0.9124E-15, 0.1230E-14,
07003 0.5603E-15, 0.7842E-15, 0.3228E-15, 0.4689E-15,
07004 0.1748E-15, 0.2632E-15, 0.8898E-16, 0.1389E-15,
07005 0.4264E-16, 0.6899E-16, 0.1924E-16, 0.3229E-16,
07006 0.8191E-17, 0.1423E-16, 0.6494E-15, 0.7083E-14,
07007 0.3025E-14, 0.1835E-14, 0.1158E-13, 0.3993E-14};
07008
07009
07010 const Numeric BE[n_lines] = { 0.009, 0.015, 0.083, 0.084,
07011 0.212, 0.212, 0.391, 0.391,
07012 0.626, 0.626, 0.915, 0.915,
07013 1.260, 1.260, 1.660, 1.665,
07014 2.119, 2.115, 2.624, 2.625,
07015 3.194, 3.194, 3.814, 3.814,
07016 4.484, 4.484, 5.224, 5.224,
07017 6.004, 6.004, 6.844, 6.844,
07018 7.744, 7.744, 0.048, 0.044,
07019 0.049, 0.145, 0.141, 0.145};
07020
07021
07022 const Numeric WB300 = 0.56;
07023 const Numeric X = 0.80;
07024
07025
07026 const Numeric W300[n_lines] = { 1.630, 1.646, 1.468, 1.449,
07027 1.382, 1.360, 1.319, 1.297,
07028 1.266, 1.248, 1.221, 1.207,
07029 1.181, 1.171, 1.144, 1.139,
07030 1.110, 1.108, 1.079, 1.078,
07031 1.050, 1.050, 1.020, 1.020,
07032 1.000, 1.000, 0.970, 0.970,
07033 0.940, 0.940, 0.920, 0.920,
07034 0.890, 0.890, 1.920, 1.920,
07035 1.920, 1.810, 1.810, 1.810};
07036
07037
07038 const Numeric Y93[n_lines] = { -0.0233, 0.2408, -0.3486, 0.5227,
07039 -0.5430, 0.5877, -0.3970, 0.3237,
07040 -0.1348, 0.0311, 0.0725, -0.1663,
07041 0.2832, -0.3629, 0.3970, -0.4599,
07042 0.4695, -0.5199, 0.5187, -0.5597,
07043 0.5903, -0.6246, 0.6656, -0.6942,
07044 0.7086, -0.7325, 0.7348, -0.7546,
07045 0.7702, -0.7864, 0.8083, -0.8210,
07046 0.8439, -0.8529, 0.0000, 0.0000,
07047 0.0000, 0.0000, 0.0000, 0.0000};
07048
07049
07050
07051
07052 const Numeric Y88[n_lines] = { -0.0244, 0.2772, -0.4068, 0.6270,
07053 -0.6183, 0.6766, -0.4119, 0.3290,
07054 0.0317, -0.1591, 0.1145, -0.2068,
07055 0.3398, -0.4158, 0.3922, -0.4482,
07056 0.4011, -0.4442, 0.4339, -0.4687,
07057 0.4783, -0.5074, 0.5157, -0.5403,
07058 0.5400, -0.5610, 0.5719, -0.5896,
07059 0.6046, -0.6194, 0.6347, -0.6468,
07060 0.6627, -0.6718, 0.0000, 0.0000,
07061 0.0000, 0.0000, 0.0000, 0.0000};
07062
07063
07064 const Numeric V[n_lines] ={ 0.0079, -0.0978, 0.0844, -0.1273,
07065 0.0699, -0.0776, 0.2309, -0.2825,
07066 0.0436, -0.0584, 0.6056, -0.6619,
07067 0.6451, -0.6759, 0.6547, -0.6675,
07068 0.6135, -0.6139, 0.2952, -0.2895,
07069 0.2654, -0.2590, 0.3750, -0.3680,
07070 0.5085, -0.5002, 0.6206, -0.6091,
07071 0.6526, -0.6393, 0.6640, -0.6475,
07072 0.6729, -0.6545, 0.0000, 0.0000,
07073 0.0000, 0.0000, 0.0000, 0.0000};
07074
07075 const Index first_line = 0;
07076 const Index last_line = 39;
07077
07078
07079
07080
07081
07082 const Numeric CC_PWR93 = 1.00000;
07083 const Numeric CL_PWR93 = 1.00000;
07084 const Numeric CW_PWR93 = 1.00000;
07085 const Numeric CO_PWR93 = 1.00000;
07086
07087
07088
07089
07090 Numeric CC, CL, CW, CO, Y300[n_lines], S300[n_lines], F[n_lines];
07091
07092
07093 if ( model == "Rosenkranz" )
07094 {
07095 CC = CC_PWR93;
07096 CL = CL_PWR93;
07097 CW = CW_PWR93;
07098 CO = CO_PWR93;
07099 }
07100 else if ( model == "RosenkranzLines" )
07101 {
07102 CC = 0.000;
07103 CL = CL_PWR93;
07104 CW = CW_PWR93;
07105 CO = CO_PWR93;
07106 }
07107 else if ( model == "RosenkranzContinuum" )
07108 {
07109 CC = CC_PWR93;
07110 CL = 0.000;
07111 CW = 0.000;
07112 CO = 0.000;
07113 }
07114 else if ( model == "RosenkranzNoCoupling" )
07115 {
07116 CC = CC_PWR93;
07117 CL = CL_PWR93;
07118 CW = CW_PWR93;
07119 CO = 0.000;
07120 }
07121 else if ( model == "user" )
07122 {
07123 CC = CCin;
07124 CL = CLin;
07125 CW = CWin;
07126 CO = COin;
07127 }
07128 else
07129 {
07130 ostringstream os;
07131 os << "O2-PWR93: ERROR! Wrong model values given.\n"
07132 << "Valid models are: 'Rosenkranz', 'RosenkranzLines', RosenkranzContinuum, "
07133 << "'RosenkranzNoCoupling', and 'user'" << '\n';
07134 throw runtime_error(os.str());
07135 }
07136 out3 << "O2-PWR93: (model=" << model << ") parameter values in use:\n"
07137 << " CC = " << CC << "\n"
07138 << " CL = " << CL << "\n"
07139 << " CW = " << CW << "\n"
07140 << " CO = " << CO << "\n";
07141
07142
07143
07144 if ( (version != "PWR98") && (version != "PWR93") && (version != "PWR88") )
07145 {
07146 ostringstream os;
07147 os << "O2-PWR93/PWR88: ERROR! Wrong version is selected.\n"
07148 << "Valid versions are:\n"
07149 << " 'PWR98' updates of F and S to HISTRAN96 and M.J.Schwartz, MIT, 1997\n"
07150 << " suggestions implemented.\n"
07151 << " 'PWR93' for the oxygen absorption model described in \n"
07152 << " P. W. Rosenkranz, Chapter 2, in M. A. Janssen,\n"
07153 << " Atmospheric Remote Sensing by Microwave Radiometry,\n"
07154 << " John Wiley & Sons, Inc., 1993.\n"
07155 << " 'PWR88' for the oxygen absorption model described in \n"
07156 << " P. W. Rosenkranz, Interference coefficients for the \n"
07157 << " overlapping oxygen lines in air, \n"
07158 << " JQSRT, 1988, Volume 39, 287-297.\n";
07159 throw runtime_error(os.str());
07160 }
07161
07162
07163
07164 if ( version == "PWR88" ) {
07165 for ( Index i=0; i<n_lines; ++i )
07166 {
07167 F[i] = F93[i];
07168 S300[i] = S93[i];
07169 Y300[i] = Y88[i];
07170 };
07171 }
07172 if ( version == "PWR93" ) {
07173 for ( Index i=0; i<n_lines; ++i )
07174 {
07175 F[i] = F93[i];
07176 S300[i] = S93[i];
07177 Y300[i] = Y93[i];
07178 };
07179 }
07180 if ( version == "PWR98" ) {
07181 for ( Index i=0; i<n_lines; ++i )
07182 {
07183 F[i] = F98[i];
07184 S300[i] = S98[i];
07185 Y300[i] = Y93[i];
07186 };
07187 }
07188
07189 const Index n_p = abs_p.nelem();
07190 const Index n_f = f_grid.nelem();
07191
07192
07193 assert ( n_p==abs_t.nelem() );
07194 assert ( n_p==vmr.nelem() );
07195
07196
07197
07198 assert ( n_f==pxsec.nrows() );
07199 assert ( n_p==pxsec.ncols() );
07200
07201
07202 for ( Index i=0; i<n_p; ++i )
07203 {
07204
07205 if (vmr[i] < VMRCalcLimit)
07206 {
07207 ostringstream os;
07208 os << "ERROR: PWR93 O2 full absorption model has detected a O2 volume mixing ratio of "
07209 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
07210 << "Therefore no calculation is performed.\n";
07211 throw runtime_error(os.str());
07212 return;
07213 }
07214
07215 Numeric TH = 3.0000e2 / abs_t[i];
07216 Numeric TH1 = (TH-1.000e0);
07217 Numeric B = pow(TH, X);
07218
07219 Numeric PRESWV = Pa_to_hPa * (abs_p[i] * vmrh2o[i]);
07220 Numeric PRESDA = Pa_to_hPa * (abs_p[i] * (1.000e0 - vmrh2o[i]));
07221 Numeric DEN = 0.001*(PRESDA*B + 1.1*PRESWV*TH);
07222 Numeric DENS = 0.001*(PRESDA + 1.1*PRESWV)*TH;
07223 Numeric DFNR = WB300*DEN;
07224
07225
07226 Numeric CCONT = CC * 1.23e-10 * pow( TH, (Numeric)2. ) * abs_p[i];
07227
07228
07229 for ( Index s=0; s<n_f; ++s )
07230 {
07231
07232
07233
07234
07235 Numeric ff = Hz_to_GHz * f_grid[s];
07236
07237
07238 Numeric CONT = CCONT * (ff * ff * DFNR / (ff*ff + DFNR*DFNR));
07239
07240
07241 Numeric SUM = 0.000e0;
07242 for ( Index l=first_line; l<=last_line; ++l )
07243 {
07244 Numeric DF = CW * W300[l] * DEN;
07245
07246 if ( (version == "PWR98") && (fabs((F[l]-118.75)) < 0.10) )
07247 {
07248 DF = CW * W300[l] * DENS;
07249 }
07250 Numeric Y = CO * 0.001 * 0.01 * abs_p[i] * B * ( Y300[l] + V[l]*TH1 );
07251 Numeric STR = CL * S300[l] * exp(-BE[l] * TH1);
07252 Numeric SF1 = ( DF + (ff-F[l])*Y ) / ( (ff-F[l])*(ff-F[l]) + DF*DF );
07253 Numeric SF2 = ( DF - (ff+F[l])*Y ) / ( (ff+F[l])*(ff+F[l]) + DF*DF );
07254 SUM += STR * (SF1+SF2) * (ff/F[l]) * (ff/F[l]);
07255 }
07256
07257
07258
07259
07260
07261
07262
07263
07264
07265
07266
07267
07268 pxsec(s,i) += CONT + (2.414322e7 * SUM * abs_p[i] * pow(TH, (Numeric)3.) / PI);
07269 }
07270 }
07271 return;
07272 }
07273
07274
07275
07277
07313 void MPM93_O2_continuum( MatrixView pxsec,
07314 const Numeric S0in,
07315 const Numeric G0in,
07316 const Numeric XS0in,
07317 const Numeric XG0in,
07318 const String& model,
07319 ConstVectorView f_grid,
07320 ConstVectorView abs_p,
07321 ConstVectorView abs_t,
07322 ConstVectorView abs_h2o,
07323 ConstVectorView vmr )
07324 {
07325
07326
07327
07328
07329
07330
07331
07332
07333 const Numeric S0_MPM93 = 6.140e-13;
07334 const Numeric G0_MPM93 = 0.560e4;
07335 const Numeric XS0_MPM93 = 2.000;
07336 const Numeric XG0_MPM93 = 0.800;
07337
07338
07339
07340
07341 Numeric S0, G0, XS0, XG0;
07342 if ( model == "MPM93" )
07343 {
07344 S0 = S0_MPM93;
07345 G0 = G0_MPM93;
07346 XS0 = XS0_MPM93;
07347 XG0 = XG0_MPM93;
07348 }
07349 else if ( model == "user" )
07350 {
07351 S0 = S0in;
07352 G0 = G0in;
07353 XS0 = XS0in;
07354 XG0 = XG0in;
07355 }
07356 else
07357 {
07358 ostringstream os;
07359 os << "O2-SelfContMPM93: ERROR! Wrong model values given.\n"
07360 << "Valid models are: 'MPM93' and 'user'" << '\n';
07361 throw runtime_error(os.str());
07362 }
07363 out3 << "O2-SelfContMPM93: (model=" << model << ") parameter values in use:\n"
07364 << " S0 = " << S0 << "\n"
07365 << " G0 = " << G0 << "\n"
07366 << " XS0 = " << XS0 << "\n"
07367 << " XG0 = " << XG0 << "\n";
07368
07369
07370 const Index n_p = abs_p.nelem();
07371 const Index n_f = f_grid.nelem();
07372
07373
07374 assert ( n_p==abs_t.nelem() );
07375 assert ( n_p==vmr.nelem() );
07376
07377
07378
07379 assert ( n_f==pxsec.nrows() );
07380 assert ( n_p==pxsec.ncols() );
07381
07382
07383
07384
07385
07386 const Numeric VMRISO = 0.2085;
07387
07388
07389
07390 for ( Index i=0; i<n_p; ++i )
07391 {
07392 if (vmr[i] < VMRCalcLimit)
07393 {
07394 ostringstream os;
07395 os << "ERROR: MPM93 O2 continuum absorption model has detected a O2 volume mixing ratio of "
07396 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
07397 << "Therefore no calculation is performed.\n";
07398 throw runtime_error(os.str());
07399 return;
07400 }
07401 Numeric th = 300.0 / abs_t[i];
07402
07403 Numeric strength = S0 * abs_p[i] * (1.0000 - abs_h2o[i]) * pow( th, XS0 );
07404
07405 Numeric gamma = G0 * abs_p[i] * pow( th, XG0 );
07406
07407
07408 for ( Index s=0; s<n_f; ++s )
07409 {
07410
07411
07412 pxsec(s,i) += (4.0 * PI / SPEED_OF_LIGHT) *
07413 (strength / VMRISO) *
07414 ( pow( f_grid[s], (Numeric)2.) * gamma /
07415 ( pow( f_grid[s], (Numeric)2.) + pow( gamma, (Numeric)2.) ) );
07416 }
07417 }
07418 return;
07419 }
07420
07421
07422
07424
07459 void Rosenkranz_O2_continuum( MatrixView pxsec,
07460 const Numeric S0in,
07461 const Numeric G0in,
07462 const Numeric XS0in,
07463 const Numeric XG0in,
07464 const String& model,
07465 ConstVectorView f_grid,
07466 ConstVectorView abs_p,
07467 ConstVectorView abs_t,
07468 ConstVectorView abs_h2o,
07469 ConstVectorView vmr _U_ )
07470 {
07471
07472
07473
07474
07475
07476 const Numeric S0_PWR93 = 1.11e-14;
07477 const Numeric G0_PWR93 = 5600.000;
07478 const Numeric XS0_PWR93 = 2.000;
07479 const Numeric XG0_PWR93 = 0.800;
07480
07481
07482
07483 Numeric S0, G0, XS0, XG0;
07484 if ( model == "Rosenkranz" )
07485 {
07486 S0 = S0_PWR93;
07487 G0 = G0_PWR93;
07488 XS0 = XS0_PWR93;
07489 XG0 = XG0_PWR93;
07490 }
07491 else if ( model == "user" )
07492 {
07493 S0 = S0in;
07494 G0 = G0in;
07495 XS0 = XS0in;
07496 XG0 = XG0in;
07497 }
07498 else
07499 {
07500 ostringstream os;
07501 os << "O2-SelfContPWR93: ERROR! Wrong model values given.\n"
07502 << "Valid models are: 'Rosenkranz' and 'user'" << '\n';
07503 throw runtime_error(os.str());
07504 }
07505 out3 << "O2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
07506 << " S0 = " << S0 << "\n"
07507 << " G0 = " << G0 << "\n"
07508 << " XS0 = " << XS0 << "\n"
07509 << " XG0 = " << XG0 << "\n";
07510
07511
07512 const Index n_p = abs_p.nelem();
07513 const Index n_f = f_grid.nelem();
07514
07515
07516 assert ( n_p==abs_t.nelem() );
07517 assert ( n_p==vmr.nelem() );
07518
07519
07520
07521 assert ( n_f==pxsec.nrows() );
07522 assert ( n_p==pxsec.ncols() );
07523
07524
07525 for ( Index i=0; i<n_p; ++i )
07526 {
07527 Numeric TH = 300.00 / abs_t[i];
07528
07529 Numeric ph2o = abs_p[i] * abs_h2o[i];
07530 Numeric pdry = abs_p[i] - ph2o;
07531
07532
07533
07534 Numeric gamma = G0 * (pdry * pow( TH, XG0 ) + 1.100 * ph2o * TH);
07535
07536
07537 for ( Index s=0; s<n_f; ++s )
07538 {
07539
07540
07541 pxsec(s,i) += S0 * abs_p[i] / pow( abs_t[i], XS0 ) *
07542 ( pow( f_grid[s], (Numeric)2. )
07543 * gamma / ( pow( f_grid[s], 2 )
07544 + pow( gamma, (Numeric)2. ) ) ) ;
07545 }
07546 }
07547 }
07548
07549
07550
07552
07589 void Standard_O2_continuum( MatrixView pxsec,
07590 const Numeric Cin,
07591 const Numeric G0in,
07592 const Numeric G0Ain,
07593 const Numeric G0Bin,
07594 const Numeric XG0din,
07595 const Numeric XG0win,
07596 const String& model,
07597 ConstVectorView f_grid,
07598 ConstVectorView abs_p,
07599 ConstVectorView abs_t,
07600 ConstVectorView abs_h2o,
07601 ConstVectorView vmr _U_ )
07602 {
07603
07604
07605
07606
07607
07608 const Numeric C_PWR93 = (1.108e-14/pow((Numeric)3.0e2,(Numeric)2.));
07609 const Numeric G0_PWR93 = 5600.000;
07610 const Numeric G0A_PWR93 = 1.000;
07611 const Numeric G0B_PWR93 = 1.100;
07612 const Numeric XG0d_PWR93 = 0.800;
07613 const Numeric XG0w_PWR93 = 1.000;
07614
07615
07616
07617
07618
07619
07620
07621 const Numeric C_MPM93 = 6.14e-13*(4.0*PI/SPEED_OF_LIGHT)/0.2085;
07622
07623 const Numeric G0_MPM93 = 5600.000;
07624 const Numeric G0A_MPM93 = 1.000;
07625 const Numeric G0B_MPM93 = 1.000;
07626 const Numeric XG0d_MPM93 = 0.800;
07627 const Numeric XG0w_MPM93 = 0.800;
07628
07629
07630
07631 Numeric C, G0, G0A, G0B, XG0d, XG0w;
07632 if ( model == "Rosenkranz" )
07633 {
07634 C = C_PWR93;
07635 G0 = G0_PWR93;
07636 G0A = G0A_PWR93;
07637 G0B = G0B_PWR93;
07638 XG0d = XG0d_PWR93;
07639 XG0w = XG0w_PWR93;
07640 }
07641 else if ( model == "MPM93" )
07642 {
07643 C = C_MPM93;
07644 G0 = G0_MPM93;
07645 G0A = G0A_MPM93;
07646 G0B = G0B_MPM93;
07647 XG0d = XG0d_MPM93;
07648 XG0w = XG0w_MPM93;
07649 }
07650 else if ( model == "user" )
07651 {
07652 C = Cin;
07653 G0 = G0in;
07654 G0A = G0Ain;
07655 G0B = G0Bin;
07656 XG0d = XG0din;
07657 XG0w = XG0win;
07658 }
07659 else
07660 {
07661 ostringstream os;
07662 os << "O2-GenerealCont: ERROR! Wrong model values given.\n"
07663 << "Valid models are: 'Rosenkranz', 'MPM93' and 'user'" << '\n';
07664 throw runtime_error(os.str());
07665 }
07666 out3 << "O2-GeneralCont: (model=" << model << ") parameter values in use:\n"
07667 << " C = " << C << "\n"
07668 << " G0 = " << G0 << "\n"
07669 << " G0A = " << G0A << "\n"
07670 << " G0B = " << G0B << "\n"
07671 << " XG0d = " << XG0d << "\n"
07672 << " XG0w = " << XG0w << "\n";
07673
07674
07675 const Index n_p = abs_p.nelem();
07676 const Index n_f = f_grid.nelem();
07677
07678
07679 assert ( n_p==abs_t.nelem() );
07680 assert ( n_p==vmr.nelem() );
07681
07682
07683
07684 assert ( n_f==pxsec.nrows() );
07685 assert ( n_p==pxsec.ncols() );
07686
07687
07688
07689
07690
07691
07692
07693
07694 for ( Index i=0; i<n_p; ++i )
07695 {
07696 Numeric TH = 3.0e2 / abs_t[i];
07697
07698 Numeric ph2o = abs_p[i] * abs_h2o[i];
07699 Numeric pdry = abs_p[i] - ph2o;
07700
07701
07702
07703 Numeric gamma = G0 * (G0A * pdry * pow( TH, XG0d ) + G0B * ph2o * pow( TH, XG0w ));
07704
07705
07706 for ( Index s=0; s<n_f; ++s )
07707 {
07708
07709
07710 pxsec(s,i) += C * abs_p[i] * pow( TH, (Numeric)2. ) *
07711 ( gamma * pow( f_grid[s], (Numeric)2. ) /
07712 ( pow( f_grid[s], 2 ) + pow( gamma, (Numeric)2. ) ) );
07713 }
07714 }
07715 }
07716
07717
07718
07719
07720
07722
07752 void BF86_CIA_N2( MatrixView pxsec,
07753 const Numeric Cin,
07754 const String& model,
07755 ConstVectorView f_grid,
07756 ConstVectorView abs_p,
07757 ConstVectorView abs_t,
07758 ConstVectorView vmr )
07759 {
07760
07761
07762
07763 extern Numeric n2n2tks_(double t, double f);
07764
07765
07766
07767
07768
07769 Numeric XFAC = 1.0000;
07770
07771
07772
07773 if ( model == "BF86" )
07774 {
07775 XFAC = 1.0000;
07776 }
07777 else if ( model == "user" )
07778 {
07779 XFAC = Cin;
07780 }
07781 else
07782 {
07783 ostringstream os;
07784 os << "N2-SelfContBorysow: ERROR! Wrong model values given.\n"
07785 << "allowed models are: 'BF86', 'user'" << '\n';
07786 throw runtime_error(os.str());
07787 }
07788
07789 out3 << "N2-SelfContBorysow: (model=" << model << ") parameter values in use:\n"
07790 << " XFAC = " << XFAC << "\n";
07791
07792 const Index n_p = abs_p.nelem();
07793 const Index n_f = f_grid.nelem();
07794
07795
07796 const Numeric AMAG2DEN = 44.53807;
07797 const Numeric RIDGAS = 8.314510;
07798
07799
07800 assert ( n_p==abs_t.nelem() );
07801 assert ( n_p==vmr.nelem() );
07802
07803
07804
07805 assert ( n_f==pxsec.nrows() );
07806 assert ( n_p==pxsec.ncols() );
07807
07808
07809 for ( Index i=0; i<n_p; ++i )
07810 {
07811
07812 double T = (double) abs_t[i];
07813
07814
07815
07816 Numeric XAMA = (abs_p[i]) / ( AMAG2DEN * RIDGAS * abs_t[i] );
07817 Numeric XAMA2 = pow(XAMA,(Numeric)2.);
07818
07819
07820
07821 for ( Index s=0; s<n_f; ++s )
07822 {
07823
07824
07825 double f = (double) f_grid[s];
07826
07827 double cont = n2n2tks_(T, f);
07828 pxsec(s,i) += (Numeric) (cont * 1.000e2 * vmr[i] * XAMA2);
07829
07830
07831 }
07832 }
07833 return;
07834 }
07835
07836
07837
07839
07875 void MPM93_N2_continuum( MatrixView pxsec,
07876 const Numeric Cin,
07877 const Numeric Gin,
07878 const Numeric xTin,
07879 const Numeric xfin,
07880 const String& model,
07881 ConstVectorView f_grid,
07882 ConstVectorView abs_p,
07883 ConstVectorView abs_t,
07884 ConstVectorView abs_h2o,
07885 ConstVectorView vmr )
07886 {
07887
07888
07889
07890
07891
07892 const Numeric xT_MPM93 = 3.500;
07893 const Numeric xf_MPM93 = 1.500;
07894 const Numeric gxf_MPM93 = 9.000*xf_MPM93;
07895 const Numeric S_MPM93 = 2.296e-31;
07896 const Numeric G_MPM93 = 1.930e-5*pow((Numeric)10.000, -gxf_MPM93);
07897
07898
07899
07900 Numeric S0, G0, xf, xT, gxf;
07901 if ( model == "MPM93" )
07902 {
07903 S0 = S_MPM93;
07904 G0 = G_MPM93;
07905 xT = xT_MPM93;
07906 xf = xf_MPM93;
07907 gxf = gxf_MPM93;
07908 }
07909 else if ( model == "MPM93Scale" )
07910 {
07911 S0 = Cin * S_MPM93;
07912 G0 = G_MPM93;
07913 xT = xT_MPM93;
07914 xf = xf_MPM93;
07915 gxf = gxf_MPM93;
07916 }
07917 else if ( model == "user" )
07918 {
07919 S0 = Cin;
07920 G0 = Gin;
07921 xT = xTin;
07922 xf = xfin;
07923 gxf = 9.000*xf;
07924 }
07925 else
07926 {
07927 ostringstream os;
07928 os << "N2-SelfContMPM93 : ERROR! Wrong model values given.\n"
07929 << "allowed models are: 'MPM93', 'MPM93Scale' or 'user'" << '\n';
07930 throw runtime_error(os.str());
07931 }
07932
07933 out3 << "N2-SelfContMPM93: (model=" << model << ") parameter values in use:\n"
07934 << " S0 = " << S0 << "\n"
07935 << " G0 = " << G0 << "\n"
07936 << " xT = " << xT << "\n"
07937 << " xf = " << xf << "\n";
07938
07939
07940
07941
07942
07943 const Index n_p = abs_p.nelem();
07944 const Index n_f = f_grid.nelem();
07945
07946
07947 assert ( n_p==abs_t.nelem() );
07948 assert ( n_p==vmr.nelem() );
07949
07950
07951
07952 assert ( n_f==pxsec.nrows() );
07953 assert ( n_p==pxsec.ncols() );
07954
07955 Numeric fac = 4.0 * PI / SPEED_OF_LIGHT;
07956
07957 for ( Index i=0; i<n_p; ++i )
07958 {
07959 Numeric th = 300.0 / abs_t[i];
07960 Numeric strength = S0 *
07961 pow( (abs_p[i] * ((Numeric)1.0000 - abs_h2o[i])),
07962 (Numeric)2. )
07963 * pow( th, xT );
07964
07965
07966 for ( Index s=0; s<n_f; ++s )
07967 {
07968
07969
07970
07971 pxsec(s,i) += fac * strength *
07972 pow(f_grid[s], (Numeric)2.) /
07973 ( 1.000 + G0 * pow( f_grid[s], xf) ) *
07974 vmr[i];
07975 }
07976 }
07977 return;
07978 }
07979
07980
07982
08007 void Pardo_ATM_N2_dry_continuum( MatrixView pxsec,
08008 const Numeric Cin,
08009 const String& model,
08010 ConstVectorView f_grid,
08011 ConstVectorView abs_p,
08012 ConstVectorView abs_t,
08013 ConstVectorView vmr,
08014 ConstVectorView h2ovmr )
08015 {
08016
08017
08018
08019 const Numeric C_ATM = 2.612e-6;
08020
08021
08022
08023 Numeric C;
08024 if ( model == "ATM" )
08025 {
08026 C = C_ATM;
08027 }
08028 else if ( model == "user" )
08029 {
08030 C = Cin;
08031 }
08032 else
08033 {
08034 ostringstream os;
08035 os << "N2-DryContATM01: ERROR! Wrong model values given.\n"
08036 << "allowed models are: 'ATM', 'user'" << '\n';
08037 throw runtime_error(os.str());
08038 }
08039 out3 << "N2-DryContATM01: (model=" << model << ") parameter values in use:\n"
08040 << " C_s = " << C << "\n";
08041
08042 const Index n_p = abs_p.nelem();
08043 const Index n_f = f_grid.nelem();
08044
08045
08046 assert ( n_p==abs_t.nelem() );
08047 assert ( n_p==vmr.nelem() );
08048
08049
08050
08051 assert ( n_f==pxsec.nrows() );
08052 assert ( n_p==pxsec.ncols() );
08053
08054
08055 for ( Index i=0; i<n_p; ++i )
08056 {
08057
08058
08059
08060
08061 Numeric pd = abs_p[i] * ( 1.00000e0 - h2ovmr[i] );
08062
08063 if (vmr[i] > VMRCalcLimit )
08064 {
08065 for ( Index s=0; s<n_f; ++s )
08066 {
08067
08068
08069
08070
08071 pxsec(s,i) += C *
08072 pow( (f_grid[s]/(Numeric)2.25e11), (Numeric)2. ) *
08073 pow( ((Numeric)300.0/abs_t[i]), (Numeric)3.5 ) *
08074 pow( (pd/(Numeric)1.01300e5), (Numeric)2. ) /
08075 vmr[i];
08076 }
08077 }
08078 }
08079 }
08080
08081
08083
08109 void Rosenkranz_N2_self_continuum( MatrixView pxsec,
08110 const Numeric Cin,
08111 const Numeric xin,
08112 const String& model,
08113 ConstVectorView f_grid,
08114 ConstVectorView abs_p,
08115 ConstVectorView abs_t,
08116 ConstVectorView vmr )
08117 {
08118
08119
08120
08121 const Numeric C_PWR = 1.05e-38;
08122 const Numeric x_PWR = 3.55;
08123
08124
08125
08126 Numeric C, x;
08127 if ( model == "Rosenkranz" )
08128 {
08129 C = C_PWR;
08130 x = x_PWR;
08131 }
08132 else if ( model == "user" )
08133 {
08134 C = Cin;
08135 x = xin;
08136 }
08137 else
08138 {
08139 ostringstream os;
08140 os << "N2-SelfContPWR93: ERROR! Wrong model values given.\n"
08141 << "allowed models are: 'Rosenkranz', 'user'" << '\n';
08142 throw runtime_error(os.str());
08143 }
08144 out3 << "N2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
08145 << " C_s = " << C << "\n"
08146 << " x_s = " << x << "\n";
08147
08148 const Index n_p = abs_p.nelem();
08149 const Index n_f = f_grid.nelem();
08150
08151
08152 assert ( n_p==abs_t.nelem() );
08153 assert ( n_p==vmr.nelem() );
08154
08155
08156
08157 assert ( n_f==pxsec.nrows() );
08158 assert ( n_p==pxsec.ncols() );
08159
08160
08161 for ( Index i=0; i<n_p; ++i )
08162 {
08163
08164 for ( Index s=0; s<n_f; ++s )
08165 {
08166
08167
08168 pxsec(s,i) += C *
08169 pow( f_grid[s], (Numeric)2. ) *
08170 pow( (Numeric)300.0/abs_t[i], x ) *
08171 pow( abs_p[i], (Numeric)2. ) *
08172 vmr[i];
08173
08174 }
08175 }
08176 }
08177
08178
08179
08181
08212 void Standard_N2_self_continuum( MatrixView pxsec,
08213 const Numeric Cin,
08214 const Numeric xfin,
08215 const Numeric xtin,
08216 const Numeric xpin,
08217 const String& model,
08218 ConstVectorView f_grid,
08219 ConstVectorView abs_p,
08220 ConstVectorView abs_t,
08221 ConstVectorView vmr )
08222 {
08223
08224
08225
08226
08227 const Numeric C_GM = 1.05e-38;
08228 const Numeric xf_GM = 2.00;
08229 const Numeric xt_GM = 3.55;
08230 const Numeric xp_GM = 2.00;
08231
08232
08233
08234 Numeric C, xt, xf, xp;
08235 if ( model == "Rosenkranz" )
08236 {
08237 C = C_GM;
08238 xt = xt_GM;
08239 xf = xf_GM;
08240 xp = xp_GM;
08241 }
08242 else if ( model == "user" )
08243 {
08244 C = Cin;
08245 xt = xtin;
08246 xf = xfin;
08247 xp = xpin;
08248 }
08249 else
08250 {
08251 ostringstream os;
08252 os << "N2-SelfContStandardType: ERROR! Wrong model values given.\n"
08253 << "allowed models are: 'Rosenkranz', 'user'" << '\n';
08254 throw runtime_error(os.str());
08255 }
08256 out3 << "N2-SelfContStandardType: (model=" << model << ") parameter values in use:\n"
08257 << " C = " << C << "\n"
08258 << " xt = " << xt << "\n"
08259 << " xf = " << xf << "\n"
08260 << " xp = " << xp << "\n";
08261
08262
08263 const Index n_p = abs_p.nelem();
08264 const Index n_f = f_grid.nelem();
08265
08266
08267 assert ( n_p==abs_t.nelem() );
08268 assert ( n_p==vmr.nelem() );
08269
08270
08271
08272 assert ( n_f==pxsec.nrows() );
08273 assert ( n_p==pxsec.ncols() );
08274
08275
08276 for ( Index i=0; i<n_p; ++i )
08277 {
08278
08279
08280 for ( Index s=0; s<n_f; ++s )
08281 {
08282
08283
08284 pxsec(s,i) += C *
08285 pow( ((Numeric)300.00/abs_t[i]), xt ) *
08286 pow( f_grid[s], xf ) *
08287 pow( abs_p[i], xp ) *
08288 pow( vmr[i], (xp-(Numeric)1.) );
08289
08290 }
08291 }
08292 }
08293
08294
08295
08296
08298
08324 void Rosenkranz_CO2_self_continuum( MatrixView pxsec,
08325 const Numeric Cin,
08326 const Numeric xin,
08327 const String& model,
08328 ConstVectorView f_grid,
08329 ConstVectorView abs_p,
08330 ConstVectorView abs_t,
08331 ConstVectorView vmr )
08332 {
08333
08334
08335
08336 const Numeric C_PWR = 7.43e-37;
08337 const Numeric x_PWR = 5.08;
08338
08339
08340
08341 Numeric C, x;
08342 if ( model == "Rosenkranz" )
08343 {
08344 C = C_PWR;
08345 x = x_PWR;
08346 }
08347 else if ( model == "user" )
08348 {
08349 C = Cin;
08350 x = xin;
08351 }
08352 else
08353 {
08354 ostringstream os;
08355 os << "CO2-SelfContPWR93 : ERROR! Wrong model values given.\n"
08356 << "allowed models are: 'Rosenkranz', 'user'" << "\n";
08357 throw runtime_error(os.str());
08358 }
08359
08360 out3 << "CO2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
08361 << " C = " << C << "\n"
08362 << " x = " << x << "\n";
08363
08364 const Index n_p = abs_p.nelem();
08365 const Index n_f = f_grid.nelem();
08366
08367
08368 assert ( n_p==abs_t.nelem() );
08369 assert ( n_p==vmr.nelem() );
08370
08371
08372
08373 assert ( n_f==pxsec.nrows() );
08374 assert ( n_p==pxsec.ncols() );
08375
08376
08377 for ( Index i=0; i<n_p; ++i )
08378 {
08379
08380
08381
08382 Numeric dummy =
08383 C * pow( (Numeric)300./abs_t[i], x ) * pow( abs_p[i], (Numeric)2. ) * vmr[i];
08384
08385
08386 for ( Index s=0; s<n_f; ++s )
08387 {
08388 pxsec(s,i) += dummy * pow( f_grid[s], (Numeric)2. );
08389 }
08390 }
08391 }
08392
08393
08395
08422 void Rosenkranz_CO2_foreign_continuum( MatrixView pxsec,
08423 const Numeric Cin,
08424 const Numeric xin,
08425 const String& model,
08426 ConstVectorView f_grid,
08427 ConstVectorView abs_p,
08428 ConstVectorView abs_t,
08429 ConstVectorView abs_n2,
08430 ConstVectorView vmr _U_ )
08431 {
08432
08433
08434
08435 const Numeric C_PWR = 2.71e-37;
08436 const Numeric x_PWR = 4.7;
08437
08438
08439
08440 Numeric C, x;
08441 if ( model == "Rosenkranz" )
08442 {
08443 C = C_PWR;
08444 x = x_PWR;
08445 }
08446 else if ( model == "user" )
08447 {
08448 C = Cin;
08449 x = xin;
08450 }
08451 else
08452 {
08453 ostringstream os;
08454 os << "CO2-ForeignContPWR93: ERROR! Wrong model values given.\n"
08455 << "allowed models are: 'Rosenkranz', 'user'" << "\n";
08456 throw runtime_error(os.str());
08457 }
08458
08459 out3 << "CO2-ForeignContPWR93: (model=" << model << ") parameter values in use:\n"
08460 << " C = " << C << "\n"
08461 << " x = " << x << "\n";
08462
08463 const Index n_p = abs_p.nelem();
08464 const Index n_f = f_grid.nelem();
08465
08466
08467 assert ( n_p==abs_t.nelem() );
08468 assert ( n_p==vmr.nelem() );
08469
08470
08471
08472 assert ( n_f==pxsec.nrows() );
08473 assert ( n_p==pxsec.ncols() );
08474
08475
08476 for ( Index i=0; i<n_p; ++i )
08477 {
08478
08479
08480
08481 Numeric dummy = C * pow( (Numeric)300./abs_t[i], x ) * abs_p[i] * abs_p[i] * abs_n2[i];
08482
08483
08484 for ( Index s=0; s<n_f; ++s )
08485 {
08486 pxsec(s,i) += dummy * pow( f_grid[s], (Numeric)2. );
08487 }
08488 }
08489 }
08490
08491
08492
08493
08495
08526 void MPM93WaterDropletAbs( MatrixView pxsec,
08527 const Numeric CCin,
08528 const Numeric CGin,
08529 const Numeric CEin,
08530 const String& model,
08531 ConstVectorView f_grid,
08532 ConstVectorView abs_p,
08533 ConstVectorView abs_t,
08534 ConstVectorView vmr)
08535 {
08536
08537
08538
08539
08540
08541
08542
08543 const Numeric CC_MPM93 = 1.00000;
08544 const Numeric CG_MPM93 = 1.00000;
08545 const Numeric CE_MPM93 = 1.00000;
08546
08547
08548
08549
08550 Numeric CC, CG, CE;
08551 if ( model == "MPM93" )
08552 {
08553 CC = CC_MPM93;
08554 CG = CG_MPM93;
08555 CE = CE_MPM93;
08556 }
08557 else if ( model == "user" )
08558 {
08559 CC = CCin;
08560 CG = CGin;
08561 CE = CEin;
08562 }
08563 else
08564 {
08565 ostringstream os;
08566 os << "liquidcloud-MPM93: ERROR! Wrong model values given.\n"
08567 << "Valid models are: 'MPM93' and 'user'" << '\n';
08568 throw runtime_error(os.str());
08569 }
08570 out3 << "liquidcloud-MPM93: (model=" << model << ") parameter values in use:\n"
08571 << " CC = " << CC << "\n"
08572 << " CG = " << CG << "\n"
08573 << " CE = " << CE << "\n";
08574
08575
08576 const Numeric m = 1.00e3;
08577 const Numeric low_lim_den = 0.000;
08578 const Numeric high_lim_den = 10.00e-3;
08579
08580 const Index n_p = abs_p.nelem();
08581 const Index n_f = f_grid.nelem();
08582
08583
08584 assert ( n_p==abs_t.nelem() );
08585 assert ( n_p==vmr.nelem() );
08586
08587
08588
08589 assert ( n_f==pxsec.nrows() );
08590 assert ( n_p==pxsec.ncols() );
08591
08592
08593 for ( Index i=0; i<n_p; ++i )
08594 {
08595
08596
08597
08598
08599
08600
08601
08602
08603 if ( (vmr[i] > low_lim_den) && (vmr[i] < high_lim_den) )
08604 {
08605
08606 Numeric theta = 300.000 / abs_t[i];
08607
08608 Numeric gamma1 = CG * 20.20 - 146.40*(theta-1.000) + 316.00*(theta-1.000)*(theta-1.000);
08609
08610 Numeric gamma2 = 39.80 * gamma1;
08611
08612 Numeric epsilon0 = CE * 103.30 * (theta-1.000) + 77.66;
08613 Numeric epsilon1 = 0.0671 * epsilon0;
08614 Numeric epsilon2 = 3.52;
08615
08616
08617 for ( Index s=0; s<n_f; ++s )
08618 {
08619
08620 Numeric Reepsilon = epsilon0 -
08621 pow((f_grid[s]*Hz_to_GHz),(Numeric)2.) *
08622 ( ((epsilon0-epsilon1)/
08623 (pow((f_grid[s]*Hz_to_GHz),(Numeric)2.)
08624 + pow(gamma1,(Numeric)2.))) +
08625 ((epsilon1-epsilon2)/
08626 (pow((f_grid[s]*Hz_to_GHz),(Numeric)2.)
08627 + pow(gamma2,(Numeric)2.))) );
08628
08629 Numeric Imepsilon = (f_grid[s]*Hz_to_GHz) *
08630 ( (gamma1*(epsilon0-epsilon1)/
08631 (pow((f_grid[s]*Hz_to_GHz),(Numeric)2.)
08632 + pow(gamma1,(Numeric)2.))) +
08633 (gamma2*(epsilon1-epsilon2)/
08634 (pow((f_grid[s]*Hz_to_GHz),(Numeric)2.)
08635 + pow(gamma2,(Numeric)2.))) );
08636
08637
08638
08639
08640
08641
08642
08643 Numeric ImNw = 1.500 / m *
08644 ( 3.000 * Imepsilon
08645 / ( pow((Reepsilon+(Numeric)2.000),(Numeric)2.)
08646 + pow(Imepsilon,(Numeric)2.) ) );
08647
08648
08649
08650
08651 pxsec(s,i) += CC * 1.000e6 * dB_km_to_1_m * 0.1820 * (f_grid[s]*Hz_to_GHz) * ImNw;
08652 }
08653 } else
08654 {
08655 if ( (vmr[i] < low_lim_den) || (vmr[i] > high_lim_den) )
08656 {
08657 ostringstream os;
08658 os << "ERROR in MPM93WaterDropletAbs:\n"
08659 << " suspended water droplet density (valid range 0.00-10.00e-3 kg/m3):" << vmr[i] << "\n"
08660 << " ==> no calculation performed!\n";
08661 throw runtime_error(os.str());
08662 }
08663 }
08664 }
08665
08666 }
08667
08668
08670
08701 void MPM93IceCrystalAbs( MatrixView pxsec,
08702 const Numeric CCin,
08703 const Numeric CAin,
08704 const Numeric CBin,
08705 const String& model,
08706 ConstVectorView f_grid,
08707 ConstVectorView abs_p,
08708 ConstVectorView abs_t,
08709 ConstVectorView vmr )
08710
08711 {
08712
08713
08714
08715
08716
08717
08718
08719 const Numeric CC_MPM93 = 1.00000;
08720 const Numeric CA_MPM93 = 1.00000;
08721 const Numeric CB_MPM93 = 1.00000;
08722
08723
08724
08725
08726 Numeric CC, CA, CB;
08727 if ( model == "MPM93" )
08728 {
08729 CC = CC_MPM93;
08730 CA = CA_MPM93;
08731 CB = CB_MPM93;
08732 }
08733 else if ( model == "user" )
08734 {
08735 CC = CCin;
08736 CA = CAin;
08737 CB = CBin;
08738 }
08739 else
08740 {
08741 ostringstream os;
08742 os << "icecloud-MPM93: ERROR! Wrong model values given.\n"
08743 << "Valid models are: 'MPM93' and 'user'" << '\n';
08744 throw runtime_error(os.str());
08745 }
08746 out3 << "icecloud-MPM93: (model=" << model << ") parameter values in use:\n"
08747 << " CC = " << CC << "\n"
08748 << " CA = " << CA << "\n"
08749 << " CB = " << CB << "\n";
08750
08751
08752 const Numeric m = 0.916e3;
08753 const Numeric low_lim_den = 0.000;
08754 const Numeric high_lim_den = 10.00e-3;
08755
08756 const Index n_p = abs_p.nelem();
08757 const Index n_f = f_grid.nelem();
08758
08759
08760 assert ( n_p==abs_t.nelem() );
08761 assert ( n_p==vmr.nelem() );
08762
08763
08764
08765 assert ( n_f==pxsec.nrows() );
08766 assert ( n_p==pxsec.ncols() );
08767
08768
08769
08770
08771 for ( Index i=0; i<n_p; ++i )
08772 {
08773
08774
08775
08776
08777
08778
08779
08780
08781 if ( (vmr[i] > low_lim_den) && (vmr[i] < high_lim_den) )
08782 {
08783
08784 Numeric theta = 300.000 / abs_t[i];
08785
08786 Numeric ai = CA * (62.000 * theta - 11.600) * exp(-22.100 * (theta-1.000)) * 1.000e-4;
08787
08788 Numeric bi = CB * 0.542e-6 *
08789 ( -24.17 + (116.79/theta)
08790 + pow((theta/(theta-(Numeric)0.9927)),(Numeric)2.) );
08791
08792
08793 for ( Index s=0; s<n_f; ++s )
08794 {
08795
08796 Numeric Reepsilon = 3.15;
08797
08798 Numeric Imepsilon = ( ( ai/(f_grid[s]*Hz_to_GHz) ) +
08799 ( bi*(f_grid[s]*Hz_to_GHz) ) );
08800
08801
08802
08803
08804
08805
08806
08807 Numeric ImNw = 1.500 / m *
08808 ( 3.000 * Imepsilon
08809 / ( pow((Reepsilon+(Numeric)2.000),(Numeric)2.)
08810 + pow(Imepsilon,(Numeric)2.) ) );
08811
08812
08813
08814
08815 pxsec(s,i) += CC * 1.000e6 * dB_km_to_1_m * 0.1820 * (f_grid[s]*Hz_to_GHz) * ImNw;
08816 }
08817 } else
08818 {
08819 if ( (vmr[i] < low_lim_den) || (vmr[i] > high_lim_den) )
08820 {
08821 ostringstream os;
08822 os << "ERROR in MPM93IceCrystalAbs:\n"
08823 << " suspended ice particle density (valid range: 0-10.0e-3 kg/m3):" << vmr[i] << "\n"
08824 << " ==> no calculation performed!\n";
08825 throw runtime_error(os.str());
08826 }
08827 }
08828 }
08829 return;
08830 }
08831
08832
08834
08862 void MPM93RainExt( MatrixView pxsec,
08863 const Numeric CEin,
08864 const Numeric CAin,
08865 const Numeric CBin,
08866 const String& model,
08867 ConstVectorView f_grid,
08868 ConstVectorView abs_p,
08869 ConstVectorView abs_t _U_,
08870 ConstVectorView vmr)
08871 {
08872
08873
08874
08875
08876
08877
08878 const Numeric CE_MPM93 = 1.00000;
08879 const Numeric CA_MPM93 = 1.00000;
08880 const Numeric CB_MPM93 = 1.00000;
08881
08882
08883
08884
08885 Numeric CE, CA, CB;
08886 if ( model == "MPM93" )
08887 {
08888 CE = CE_MPM93;
08889 CA = CA_MPM93;
08890 CB = CB_MPM93;
08891 }
08892 else if ( model == "user" )
08893 {
08894 CE = CEin;
08895 CA = CAin;
08896 CB = CBin;
08897 }
08898 else
08899 {
08900 ostringstream os;
08901 os << "rain-MPM93: ERROR! Wrong model values given.\n"
08902 << "Valid models are: 'MPM93' and 'user'" << '\n';
08903 throw runtime_error(os.str());
08904 }
08905 out3 << "rain-MPM93: (model=" << model << ") parameter values in use:\n"
08906 << " CE = " << CE << "\n"
08907 << " CA = " << CA << "\n"
08908 << " CB = " << CB << "\n";
08909
08910
08911 const Numeric low_lim_rr = 0.000;
08912 const Numeric high_lim_rr = 150.000;
08913
08914 const Index n_p = abs_p.nelem();
08915 const Index n_f = f_grid.nelem();
08916
08917
08918 assert ( n_p==abs_t.nelem() );
08919 assert ( n_p==vmr.nelem() );
08920
08921
08922
08923 assert ( n_f==pxsec.nrows() );
08924 assert ( n_p==pxsec.ncols() );
08925
08926
08927 for ( Index i=0; i<n_p; ++i )
08928 {
08929
08930
08931
08932
08933
08934 Numeric Ga = 0.;
08935 Numeric Ea = 0.;
08936 Numeric Gb = 0.;
08937 Numeric Eb = 0.;
08938
08939
08940
08941
08942
08943 if ( (vmr[i] >= low_lim_rr) && (vmr[i] < high_lim_rr) )
08944 {
08945
08946 for ( Index s=0; s<n_f; ++s )
08947 {
08948
08949
08950
08951
08952 if ( vmr[i] <= 25 )
08953 {
08954
08955 if ( f_grid[s] <= 2.9e9 )
08956 {
08957 Ga = 6.39e-5;
08958 Ea = 2.03;
08959 }
08960 else if ( f_grid[s] <= 54.0e9 )
08961 {
08962 Ga = 4.21e-5;
08963 Ea = 2.42;
08964 }
08965 else if ( f_grid[s] <= 180e9 )
08966 {
08967 Ga = 4.09e-2;
08968 Ea = 0.699;
08969 }
08970 else if ( f_grid[s] <= 1000e9 )
08971 {
08972 Ga = 3.38;
08973 Ea = -0.151;
08974 }
08975 else
08976 {
08977 ostringstream os;
08978 os << "ERROR in MPM93RainExt:\n"
08979 << " frequency (valid range 0-1000 GHz):" << f_grid[s]*Hz_to_GHz << "\n"
08980 << " ==> no calculation performed!\n";
08981 throw runtime_error(os.str());
08982 }
08983
08984 if ( f_grid[s] <= 8.5e9 )
08985 {
08986 Gb = 0.851;
08987 Eb = 0.158;
08988 }
08989 else if ( f_grid[s] <= 25.0e9 )
08990 {
08991 Gb = 1.41;
08992 Eb = -0.0779;
08993 }
08994 else if ( f_grid[s] <= 164.0e9 )
08995 {
08996 Gb = 2.63;
08997 Eb = -0.272;
08998 }
08999 else if ( f_grid[s] <= 1000e9 )
09000 {
09001 Gb = 0.616;
09002 Eb = 0.0126;
09003 }
09004 else
09005 {
09006 ostringstream os;
09007 os << "ERROR in MPM93RainExt:\n"
09008 << " frequency (valid range 0-1000 GHz):" << f_grid[s]*Hz_to_GHz << "\n"
09009 << " ==> no calculation performed!\n";
09010 throw runtime_error(os.str());
09011 }
09012
09013 }
09014 else if (vmr[i] > 25)
09015 {
09016
09017 if ( f_grid[s] <= 4.9e9 )
09018 {
09019 Ga = 5.30e-5;
09020 Ea = 1.87;
09021 }
09022 else if ( f_grid[s] <= 10.7e9 )
09023 {
09024 Ga = 5.03e-6;
09025 Ea = 3.35;
09026 }
09027 else if ( f_grid[s] <= 40.1e9 )
09028 {
09029 Ga = 2.53e-5;
09030 Ea = 2.67;
09031 }
09032 else if ( f_grid[s] <= 59.1e9 )
09033 {
09034 Ga = 3.58e-3;
09035 Ea = 1.33;
09036 }
09037 else if ( f_grid[s] <= 100e9 )
09038 {
09039 Ga = 0.143;
09040 Ea = 0.422;
09041 }
09042 else
09043 {
09044 ostringstream os;
09045 os << "ERROR in MPM93RainExt:\n"
09046 << " frequency (valid range for rain rate > 25mm/h: 0-100 GHz):" << f_grid[s]*Hz_to_GHz << "\n"
09047 << " ==> no calculation performed!\n";
09048 throw runtime_error(os.str());
09049 }
09050
09051 if ( f_grid[s] <= 6.2e9 )
09052 {
09053 Gb = 0.911;
09054 Eb = 0.190;
09055 }
09056 else if ( f_grid[s] <= 23.8e9 )
09057 {
09058 Gb = 1.71;
09059 Eb = -0.156;
09060 }
09061 else if ( f_grid[s] <= 48.4e9 )
09062 {
09063 Gb = 3.08;
09064 Eb = -0.342;
09065 }
09066 else if ( f_grid[s] <= 68.2e9 )
09067 {
09068 Gb = 1.28;
09069 Eb = -0.116;
09070 }
09071 else if ( f_grid[s] <= 100e9 )
09072 {
09073 Gb = 0.932;
09074 Eb = -0.0408;
09075 }
09076 else
09077 {
09078 ostringstream os;
09079 os << "ERROR in MPM93RainExt:\n"
09080 << " frequency (valid range for rain rate > 25mm/h: 0-100 GHz):" << f_grid[s]*Hz_to_GHz << "\n"
09081 << " ==> no calculation performed!\n";
09082 throw runtime_error(os.str());
09083 }
09084 }
09085
09086 Numeric a_rain = Ga * pow((f_grid[s]*Hz_to_GHz),Ea);
09087
09088 Numeric b_rain = Gb * pow((f_grid[s]*Hz_to_GHz),Eb);
09089
09090
09091 Numeric ext_rain = CA * a_rain * pow(vmr[i],(CB*b_rain));
09092
09093
09094
09095
09096 pxsec(s,i) += CE * dB_km_to_1_m * ext_rain / vmr[i];
09097 }
09098 } else
09099 {
09100 if ( (vmr[i] < low_lim_rr) || (vmr[i] > high_lim_rr) )
09101 {
09102 ostringstream os;
09103 os << "ERROR in MPM93RainExt:\n"
09104 << " rain rate (valid range 0.00-150.00 mm/h):" << vmr[i] << "\n"
09105 << " ==> no calculation performed!\n";
09106 throw runtime_error(os.str());
09107 }
09108 }
09109 }
09110
09111 }
09112
09113
09114
09115
09116
09137 Numeric MPMLineShapeFunction( const Numeric gamma,
09138 const Numeric fl,
09139 const Numeric f)
09140 {
09141
09142
09143
09144
09145
09146
09147
09148
09149
09150
09151
09152
09153
09154
09155
09156 double f_minus, f_plus ;
09157 double value;
09158
09159
09160 f_minus = 1.000 / ((f-fl)*(f-fl) + gamma*gamma);
09161
09162
09163 f_plus = 1.000 / ((f+fl)*(f+fl) + gamma*gamma);
09164
09165
09166 value = fabs(f/fl) * gamma * (f_minus + f_plus);
09167
09168 return value;
09169 }
09170
09171
09172
09194 Numeric MPMLineShapeO2Function( const Numeric gamma,
09195 const Numeric fl,
09196 const Numeric f,
09197 const Numeric delta)
09198 {
09199
09200
09201
09202
09203
09204
09205
09206
09207
09208
09209
09210
09211
09212
09213
09214
09215 double f_minus, f_plus ;
09216 double value;
09217
09218
09219 f_minus = (gamma - delta * (fl-f)) / ((fl-f)*(fl-f) + gamma*gamma);
09220
09221
09222 f_plus = (gamma - delta * (fl+f)) / ((fl+f)*(fl+f) + gamma*gamma);
09223
09224
09225 value = f * (f_minus + f_plus);
09226
09227 return value;
09228 }
09229
09230
09231
09254 Numeric WVSatPressureLiquidWater(const Numeric t)
09255 {
09256
09257
09258 if (t < 0.000)
09259 {
09260 ostringstream os;
09261 os << "In WVSatPressureLiquidWater:\n"
09262 << "temperature negative: T=" << t <<"K \n";
09263 throw runtime_error(os.str());
09264 }
09265
09266
09267
09268
09269
09270
09271
09272
09273
09274
09275
09276
09277 Numeric theta = 373.16 / t;
09278 Numeric exponent = ( -7.90298 * (theta-1.000) +
09279 5.02808 * log10(theta) -
09280 1.3816e-7 * ( pow( (Numeric)10.00,
09281 ((Numeric)11.344*
09282 ((Numeric)1.00-((Numeric)1.00
09283 /theta))) )
09284 - (Numeric)1.000 ) +
09285 8.1328e-3 * ( pow( (Numeric)10.00,
09286 ((Numeric)-3.49149
09287 *(theta-(Numeric)1.00)))
09288 - 1.000) +
09289 log10(1013.246) );
09290 Numeric es_MPM93 = 100.000 * pow((Numeric)10.00,exponent);
09291
09292 return es_MPM93;
09293 }
09294
09295
09296
09319 Numeric WVSatPressureIce(const Numeric t)
09320 {
09321
09322
09323 if (t < 0.000)
09324 {
09325 ostringstream os;
09326 os << "In WVSatPressureIce:\n"
09327 << "temperature negative: T=" << t <<"K \n";
09328 throw runtime_error(os.str());
09329 }
09330
09331
09332 Numeric theta = 273.16 / t;
09333 Numeric exponent = (-9.09718 * (theta-1.000) -
09334 3.56654 * log10(theta) +
09335 0.876793 * (1.000-(1.000/theta)) +
09336 log10(6.1071) );
09337
09338 Numeric es_MPM93 = 100.000 * pow((Numeric)10.00,exponent);
09339
09340 return es_MPM93;
09341 }
09342
09343
09344
09345
09346
09347
09385 void xsec_continuum_tag( MatrixView xsec,
09386 const String& name,
09387 ConstVectorView parameters,
09388 const String& model,
09389 ConstVectorView f_grid,
09390 ConstVectorView abs_p,
09391 ConstVectorView abs_t,
09392 ConstVectorView abs_n2,
09393 ConstVectorView abs_h2o,
09394 ConstVectorView vmr )
09395 {
09396
09397
09398
09399
09400
09401
09402
09403
09404
09405
09406
09407
09408
09409
09410
09411
09412
09413
09414
09415
09416
09417
09418
09419
09420
09421
09422
09423
09424
09425
09426
09427
09428
09429
09430
09431
09432
09433
09434
09435
09436
09437
09438
09439
09440
09441
09442
09443
09444 Matrix pxsec(xsec.nrows(),xsec.ncols(),0.0);
09445
09446
09447 if ( "H2O-SelfContStandardType"==name )
09448 {
09449
09450
09451
09452
09453
09454
09455
09456
09457
09458
09459
09460
09461 const int Nparam = 2;
09462 if ( (model == "user") && (parameters.nelem() == Nparam) )
09463 {
09464 out3 << "Continuum model " << name << " is running with \n"
09465 << "user defined parameters according to model " << model << ".\n";
09466 Standard_H2O_self_continuum( pxsec,
09467 parameters[0],
09468 parameters[1],
09469 model,
09470 f_grid,
09471 abs_p,
09472 abs_t,
09473 vmr );
09474 }
09475 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09476 {
09477 ostringstream os;
09478 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09479 << "parameters for the model " << model << ",\n"
09480 << "but you specified " << parameters.nelem() << " parameters.\n";
09481 throw runtime_error(os.str());
09482 }
09483 else if ( (model != "user") && (parameters.nelem() == 0) )
09484 {
09485 out3 << "Continuum model " << name << " running with \n"
09486 << "the parameters for model " << model << ".\n";
09487 Standard_H2O_self_continuum( pxsec,
09488 0.00,
09489 0.00,
09490 model,
09491 f_grid,
09492 abs_p,
09493 abs_t,
09494 vmr );
09495 }
09496 else if ( (model != "user") && (parameters.nelem() != 0) )
09497 {
09498 ostringstream os;
09499 os << "ERROR: Continuum model " << name << " requires NO input\n"
09500 << "parameters for the model " << model << ",\n"
09501 << "but you specified " << parameters.nelem() << " parameters.\n"
09502 << "This ambiguity can not be solved by arts.\n"
09503 << "Please see the arts user guide chapter 3.\n";
09504 throw runtime_error(os.str());
09505 }
09506 }
09507
09508 else if ( "H2O-ForeignContStandardType"==name )
09509 {
09510
09511
09512
09513
09514
09515
09516
09517
09518
09519
09520
09521
09522 const int Nparam = 2;
09523 if ( (model == "user") && (parameters.nelem() == Nparam) )
09524 {
09525 out3 << "Continuum model " << name << " is running with \n"
09526 << "user defined parameters according to model " << model << ".\n";
09527 Standard_H2O_foreign_continuum( pxsec,
09528 parameters[0],
09529 parameters[1],
09530 model,
09531 f_grid,
09532 abs_p,
09533 abs_t,
09534 vmr );
09535 }
09536 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09537 {
09538 ostringstream os;
09539 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09540 << "parameters for the model " << model << ",\n"
09541 << "but you specified " << parameters.nelem() << " parameters.\n";
09542 throw runtime_error(os.str());
09543 }
09544 else if ( (model != "user") && (parameters.nelem() == 0) )
09545 {
09546 out3 << "Continuum model " << name << " running with \n"
09547 << "the parameters for model " << model << ".\n";
09548 Standard_H2O_foreign_continuum( pxsec,
09549 0.00,
09550 0.00,
09551 model,
09552 f_grid,
09553 abs_p,
09554 abs_t,
09555 vmr );
09556 }
09557 else if ( (model != "user") && (parameters.nelem() != 0) )
09558 {
09559 ostringstream os;
09560 os << "ERROR: Continuum model " << name << " requires NO input\n"
09561 << "parameters for the model " << model << ",\n"
09562 << "but you specified " << parameters.nelem() << " parameters.\n"
09563 << "This ambiguity can not be solved by arts.\n"
09564 << "Please see the arts user guide chapter 3.\n";
09565 }
09566 }
09567
09568 else if ( "H2O-ForeignContMaTippingType"==name )
09569 {
09570
09571
09572
09573
09574
09575
09576
09577
09578
09579
09580
09581
09582 const int Nparam = 2;
09583 if ( (model == "user") && (parameters.nelem() == Nparam) )
09584 {
09585 out3 << "Continuum model " << name << " is running with \n"
09586 << "user defined parameters according to model " << model << ".\n";
09587 MaTipping_H2O_foreign_continuum( pxsec,
09588 parameters[0],
09589 parameters[1],
09590 model,
09591 f_grid,
09592 abs_p,
09593 abs_t,
09594 vmr );
09595 }
09596 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09597 {
09598 ostringstream os;
09599 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09600 << "parameters for the model " << model << ",\n"
09601 << "but you specified " << parameters.nelem() << " parameters.\n";
09602 throw runtime_error(os.str());
09603 }
09604 else if ( (model != "user") && (parameters.nelem() == 0) )
09605 {
09606 out3 << "Continuum model " << name << " running with \n"
09607 << "the parameters for model " << model << ".\n";
09608 MaTipping_H2O_foreign_continuum( pxsec,
09609 0.00,
09610 0.00,
09611 model,
09612 f_grid,
09613 abs_p,
09614 abs_t,
09615 vmr );
09616 }
09617 else if ( (model != "user") && (parameters.nelem() != 0) )
09618 {
09619 ostringstream os;
09620 os << "ERROR: Continuum model " << name << " requires NO input\n"
09621 << "parameters for the model " << model << ",\n"
09622 << "but you specified " << parameters.nelem() << " parameters.\n"
09623 << "This ambiguity can not be solved by arts.\n"
09624 << "Please see the arts user guide chapter 3.\n";
09625 }
09626 }
09627
09628 else if ( "H2O-ContMPM93"==name )
09629 {
09630
09631
09632
09633
09634
09635
09636
09637
09638
09639
09640
09641
09642
09643
09644
09645
09646
09647
09648
09649
09650 const int Nparam = 7;
09651 if ( (model == "user") && (parameters.nelem() == Nparam) )
09652 {
09653 out3 << "Continuum model " << name << " is running with \n"
09654 << "user defined parameters according to model " << model << ".\n";
09655 MPM93_H2O_continuum( pxsec,
09656 parameters[0],
09657 parameters[1],
09658 parameters[2],
09659 parameters[3],
09660 parameters[4],
09661 parameters[5],
09662 parameters[6],
09663 model,
09664 f_grid,
09665 abs_p,
09666 abs_t,
09667 vmr );
09668 }
09669 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09670 {
09671 ostringstream os;
09672 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09673 << "parameters for the model " << model << ",\n"
09674 << "but you specified " << parameters.nelem() << " parameters.\n";
09675 throw runtime_error(os.str());
09676 }
09677 else if ( (model != "user") && (parameters.nelem() == 0) )
09678 {
09679 out3 << "Continuum model " << name << " running with \n"
09680 << "the parameters for model " << model << ".\n";
09681 MPM93_H2O_continuum( pxsec,
09682 0.00,
09683 0.00,
09684 0.00,
09685 0.00,
09686 0.00,
09687 0.00,
09688 0.00,
09689 model,
09690 f_grid,
09691 abs_p,
09692 abs_t,
09693 vmr );
09694 }
09695 else if ( (model != "user") && (parameters.nelem() != 0) )
09696 {
09697 ostringstream os;
09698 os << "ERROR: Continuum model " << name << " requires NO input\n"
09699 << "parameters for the model " << model << ",\n"
09700 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
09701 << "This ambiguity can not be solved by arts.\n"
09702 << "Please see the arts user guide chapter 3.\n";
09703 throw runtime_error(os.str());
09704 }
09705 }
09706
09707 else if ( "H2O-ForeignContATM01"==name )
09708 {
09709
09710
09711
09712
09713
09714
09715
09716
09717
09718
09719
09720
09721
09722
09723
09724 const int Nparam = 1;
09725 if ( (model == "user") && (parameters.nelem() == Nparam) )
09726 {
09727 out3 << "Continuum model " << name << " is running with \n"
09728 << "user defined parameters according to model " << model << ".\n";
09729 Pardo_ATM_H2O_ForeignContinuum( pxsec,
09730 parameters[0],
09731 model,
09732 f_grid,
09733 abs_p,
09734 abs_t,
09735 vmr );
09736 }
09737 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09738 {
09739 ostringstream os;
09740 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09741 << "parameters for the model " << model << ",\n"
09742 << "but you specified " << parameters.nelem() << " parameters.\n";
09743 throw runtime_error(os.str());
09744 }
09745 else if ( (model != "user") && (parameters.nelem() == 0) )
09746 {
09747 out3 << "Continuum model " << name << " running with \n"
09748 << "the parameters for model " << model << ".\n";
09749 Pardo_ATM_H2O_ForeignContinuum( pxsec,
09750 0.000,
09751 model,
09752 f_grid,
09753 abs_p,
09754 abs_t,
09755 vmr );
09756 }
09757 else if ( (model != "user") && (parameters.nelem() != 0) )
09758 {
09759 ostringstream os;
09760 os << "ERROR: Continuum model " << name << " requires NO input\n"
09761 << "parameters for the model " << model << ",\n"
09762 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
09763 << "This ambiguity can not be solved by arts.\n"
09764 << "Please see the arts user guide chapter 3.\n";
09765 throw runtime_error(os.str());
09766 }
09767 }
09768
09769 else if ( "H2O-SelfContCKD222"==name )
09770 {
09771
09772
09773
09774
09775
09776
09777
09778
09779
09780
09781
09782
09783
09784
09785
09786 const int Nparam = 1;
09787 if ( (model == "user") && (parameters.nelem() == Nparam) )
09788 {
09789 out3 << "Continuum model " << name << " is running with \n"
09790 << "user defined parameters according to model " << model << ".\n";
09791 CKD_222_self_h2o( pxsec,
09792 parameters[0],
09793 model,
09794 f_grid,
09795 abs_p,
09796 abs_t,
09797 vmr,
09798 abs_n2 );
09799 }
09800 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09801 {
09802 ostringstream os;
09803 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09804 << "parameters for the model " << model << ",\n"
09805 << "but you specified " << parameters.nelem() << " parameters.\n";
09806 throw runtime_error(os.str());
09807 }
09808 else if ( (model != "user") && (parameters.nelem() == 0) )
09809 {
09810 out3 << "Continuum model " << name << " running with \n"
09811 << "the parameters for model " << model << ".\n";
09812 CKD_222_self_h2o( pxsec,
09813 0.000,
09814 model,
09815 f_grid,
09816 abs_p,
09817 abs_t,
09818 vmr,
09819 abs_n2 );
09820 }
09821 else if ( (model != "user") && (parameters.nelem() != 0) )
09822 {
09823 ostringstream os;
09824 os << "ERROR: continuum model " << name << " requires NO input\n"
09825 << "parameters for the model " << model << ",\n"
09826 << "but you specified " << parameters.nelem() << " parameters.\n"
09827 << "This ambiguity can not be solved by arts.\n"
09828 << "Please see the arts user guide chapter 3.\n";
09829 throw runtime_error(os.str());
09830 }
09831 }
09832
09833 else if ( "H2O-ForeignContCKD222"==name )
09834 {
09835
09836
09837
09838
09839
09840
09841
09842
09843
09844
09845
09846
09847
09848
09849
09850 const int Nparam = 1;
09851 if ( (model == "user") && (parameters.nelem() == Nparam) )
09852 {
09853 out3 << "Continuum model " << name << " is running with \n"
09854 << "user defined parameters according to model " << model << ".\n";
09855 CKD_222_foreign_h2o( pxsec,
09856 parameters[0],
09857 model,
09858 f_grid,
09859 abs_p,
09860 abs_t,
09861 vmr,
09862 abs_n2 );
09863 }
09864 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09865 {
09866 ostringstream os;
09867 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09868 << "parameters for the model " << model << ",\n"
09869 << "but you specified " << parameters.nelem() << " parameters.\n";
09870 throw runtime_error(os.str());
09871 }
09872 else if ( (model != "user") && (parameters.nelem() == 0) )
09873 {
09874 out3 << "Continuum model " << name << " running with \n"
09875 << "the parameters for model " << model << ".\n";
09876 CKD_222_foreign_h2o( pxsec,
09877 0.000,
09878 model,
09879 f_grid,
09880 abs_p,
09881 abs_t,
09882 vmr,
09883 abs_n2 );
09884 }
09885 else if ( (model != "user") && (parameters.nelem() != 0) )
09886 {
09887 ostringstream os;
09888 os << "ERROR: continuum model " << name << " requires NO input\n"
09889 << "parameters for the model " << model << ",\n"
09890 << "but you specified " << parameters.nelem() << " parameters.\n"
09891 << "This ambiguity can not be solved by arts.\n"
09892 << "Please see the arts user guide chapter 3.\n";
09893 throw runtime_error(os.str());
09894 }
09895 }
09896
09897 else if ( "H2O-SelfContCKD242"==name )
09898 {
09899
09900
09901
09902
09903
09904
09905
09906
09907
09908
09909
09910
09911
09912
09913
09914 const int Nparam = 1;
09915 if ( (model == "user") && (parameters.nelem() == Nparam) )
09916 {
09917 out3 << "Continuum model " << name << " is running with \n"
09918 << "user defined parameters according to model " << model << ".\n";
09919 CKD_242_self_h2o( pxsec,
09920 parameters[0],
09921 model,
09922 f_grid,
09923 abs_p,
09924 abs_t,
09925 vmr,
09926 abs_n2 );
09927 }
09928 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09929 {
09930 ostringstream os;
09931 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09932 << "parameters for the model " << model << ",\n"
09933 << "but you specified " << parameters.nelem() << " parameters.\n";
09934 throw runtime_error(os.str());
09935 }
09936 else if ( (model != "user") && (parameters.nelem() == 0) )
09937 {
09938 out3 << "Continuum model " << name << " running with \n"
09939 << "the parameters for model " << model << ".\n";
09940 CKD_242_self_h2o( pxsec,
09941 0.000,
09942 model,
09943 f_grid,
09944 abs_p,
09945 abs_t,
09946 vmr,
09947 abs_n2 );
09948 }
09949 else if ( (model != "user") && (parameters.nelem() != 0) )
09950 {
09951 ostringstream os;
09952 os << "ERROR: continuum model " << name << " requires NO input\n"
09953 << "parameters for the model " << model << ",\n"
09954 << "but you specified " << parameters.nelem() << " parameters.\n"
09955 << "This ambiguity can not be solved by arts.\n"
09956 << "Please see the arts user guide chapter 3.\n";
09957 throw runtime_error(os.str());
09958 }
09959 }
09960
09961 else if ( "H2O-ForeignContCKD242"==name )
09962 {
09963
09964
09965
09966
09967
09968
09969
09970
09971
09972
09973
09974
09975
09976
09977
09978 const int Nparam = 1;
09979 if ( (model == "user") && (parameters.nelem() == Nparam) )
09980 {
09981 out3 << "Continuum model " << name << " is running with \n"
09982 << "user defined parameters according to model " << model << ".\n";
09983 CKD_242_foreign_h2o( pxsec,
09984 parameters[0],
09985 model,
09986 f_grid,
09987 abs_p,
09988 abs_t,
09989 vmr,
09990 abs_n2 );
09991 }
09992 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09993 {
09994 ostringstream os;
09995 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09996 << "parameters for the model " << model << ",\n"
09997 << "but you specified " << parameters.nelem() << " parameters.\n";
09998 throw runtime_error(os.str());
09999 }
10000 else if ( (model != "user") && (parameters.nelem() == 0) )
10001 {
10002 out3 << "Continuum model " << name << " running with \n"
10003 << "the parameters for model " << model << ".\n";
10004 CKD_242_foreign_h2o( pxsec,
10005 0.000,
10006 model,
10007 f_grid,
10008 abs_p,
10009 abs_t,
10010 vmr,
10011 abs_n2 );
10012 }
10013 else if ( (model != "user") && (parameters.nelem() != 0) )
10014 {
10015 ostringstream os;
10016 os << "ERROR: continuum model " << name << " requires NO input\n"
10017 << "parameters for the model " << model << ",\n"
10018 << "but you specified " << parameters.nelem() << " parameters.\n"
10019 << "This ambiguity can not be solved by arts.\n"
10020 << "Please see the arts user guide chapter 3.\n";
10021 throw runtime_error(os.str());
10022 }
10023 }
10024
10025 else if ( "H2O-SelfContCKDMT100"==name )
10026 {
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042 const int Nparam = 1;
10043 if ( (model == "user") && (parameters.nelem() == Nparam) )
10044 {
10045 out3 << "Continuum model " << name << " is running with \n"
10046 << "user defined parameters according to model " << model << ".\n";
10047 CKD_mt_100_self_h2o( pxsec,
10048 parameters[0],
10049 model,
10050 f_grid,
10051 abs_p,
10052 abs_t,
10053 vmr,
10054 abs_n2 );
10055 }
10056 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10057 {
10058 ostringstream os;
10059 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10060 << "parameters for the model " << model << ",\n"
10061 << "but you specified " << parameters.nelem() << " parameters.\n";
10062 throw runtime_error(os.str());
10063 }
10064 else if ( (model != "user") && (parameters.nelem() == 0) )
10065 {
10066 out3 << "Continuum model " << name << " running with \n"
10067 << "the parameters for model " << model << ".\n";
10068 CKD_mt_100_self_h2o( pxsec,
10069 0.000,
10070 model,
10071 f_grid,
10072 abs_p,
10073 abs_t,
10074 vmr,
10075 abs_n2 );
10076 }
10077 else if ( (model != "user") && (parameters.nelem() != 0) )
10078 {
10079 ostringstream os;
10080 os << "ERROR: continuum model " << name << " requires NO input\n"
10081 << "parameters for the model " << model << ",\n"
10082 << "but you specified " << parameters.nelem() << " parameters.\n"
10083 << "This ambiguity can not be solved by arts.\n"
10084 << "Please see the arts user guide chapter 3.\n";
10085 throw runtime_error(os.str());
10086 }
10087 }
10088
10089 else if ( "H2O-ForeignContCKDMT100"==name )
10090 {
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106 const int Nparam = 1;
10107 if ( (model == "user") && (parameters.nelem() == Nparam) )
10108 {
10109 out3 << "Continuum model " << name << " is running with \n"
10110 << "user defined parameters according to model " << model << ".\n";
10111 CKD_mt_100_foreign_h2o( pxsec,
10112 parameters[0],
10113 model,
10114 f_grid,
10115 abs_p,
10116 abs_t,
10117 vmr,
10118 abs_n2 );
10119 }
10120 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10121 {
10122 ostringstream os;
10123 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10124 << "parameters for the model " << model << ",\n"
10125 << "but you specified " << parameters.nelem() << " parameters.\n";
10126 throw runtime_error(os.str());
10127 }
10128 else if ( (model != "user") && (parameters.nelem() == 0) )
10129 {
10130 out3 << "Continuum model " << name << " running with \n"
10131 << "the parameters for model " << model << ".\n";
10132 CKD_mt_100_foreign_h2o( pxsec,
10133 0.000,
10134 model,
10135 f_grid,
10136 abs_p,
10137 abs_t,
10138 vmr,
10139 abs_n2 );
10140 }
10141 else if ( (model != "user") && (parameters.nelem() != 0) )
10142 {
10143 ostringstream os;
10144 os << "ERROR: continuum model " << name << " requires NO input\n"
10145 << "parameters for the model " << model << ",\n"
10146 << "but you specified " << parameters.nelem() << " parameters.\n"
10147 << "This ambiguity can not be solved by arts.\n"
10148 << "Please see the arts user guide chapter 3.\n";
10149 throw runtime_error(os.str());
10150 }
10151 }
10152
10153 else if ( "H2O-SelfContCKD24"==name )
10154 {
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170 const int Nparam = 1;
10171 if ( (model == "user") && (parameters.nelem() == Nparam) )
10172 {
10173 out3 << "Continuum model " << name << " is running with \n"
10174 << "user defined parameters according to model " << model << ".\n";
10175 CKD24_H20( pxsec,
10176 0,
10177 parameters[0],
10178 model,
10179 f_grid,
10180 abs_p,
10181 abs_t,
10182 vmr,
10183 abs_n2 );
10184 }
10185 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10186 {
10187 ostringstream os;
10188 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10189 << "parameters for the model " << model << ",\n"
10190 << "but you specified " << parameters.nelem() << " parameters.\n";
10191 throw runtime_error(os.str());
10192 }
10193 else if ( (model != "user") && (parameters.nelem() == 0) )
10194 {
10195 out3 << "Continuum model " << name << " running with \n"
10196 << "the parameters for model " << model << ".\n";
10197 CKD24_H20( pxsec,
10198 0,
10199 0.000,
10200 model,
10201 f_grid,
10202 abs_p,
10203 abs_t,
10204 vmr,
10205 abs_n2 );
10206 }
10207 else if ( (model != "user") && (parameters.nelem() != 0) )
10208 {
10209 ostringstream os;
10210 os << "ERROR: continuum model " << name << " requires NO input\n"
10211 << "parameters for the model " << model << ",\n"
10212 << "but you specified " << parameters.nelem() << " parameters.\n"
10213 << "This ambiguity can not be solved by arts.\n"
10214 << "Please see the arts user guide chapter 3.\n";
10215 throw runtime_error(os.str());
10216 }
10217 }
10218
10219 else if ( "H2O-ForeignContCKD24"==name )
10220 {
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236 const int Nparam = 1;
10237 if ( (model == "user") && (parameters.nelem() == Nparam) )
10238 {
10239 out3 << "Continuum model " << name << " is running with \n"
10240 << "user defined parameters according to model " << model << ".\n";
10241 CKD24_H20( pxsec,
10242 1,
10243 parameters[0],
10244 model,
10245 f_grid,
10246 abs_p,
10247 abs_t,
10248 vmr,
10249 abs_n2 );
10250 }
10251 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10252 {
10253 ostringstream os;
10254 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10255 << "parameters for the model " << model << ",\n"
10256 << "but you specified " << parameters.nelem() << " parameters.\n";
10257 throw runtime_error(os.str());
10258 }
10259 else if ( (model != "user") && (parameters.nelem() == 0) )
10260 {
10261 out3 << "Continuum model " << name << " running with \n"
10262 << "the parameters for model " << model << ".\n";
10263 CKD24_H20( pxsec,
10264 1,
10265 0,
10266 model,
10267 f_grid,
10268 abs_p,
10269 abs_t,
10270 vmr,
10271 abs_n2 );
10272 }
10273 else if ( (model != "user") && (parameters.nelem() != 0) )
10274 {
10275 ostringstream os;
10276 os << "ERROR: continuum model " << name << " requires NO input\n"
10277 << "parameters for the model " << model << ",\n"
10278 << "but you specified " << parameters.nelem() << " parameters.\n"
10279 << "This ambiguity can not be solved by arts.\n"
10280 << "Please see the arts user guide chapter 3.\n";
10281 throw runtime_error(os.str());
10282 }
10283 }
10284
10285 else if ( "H2O-CP98"==name )
10286 {
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300 const int Nparam = 3;
10301 if ( (model == "user") && (parameters.nelem() == Nparam) )
10302 {
10303 out3 << "Full model " << name << " is running with \n"
10304 << "user defined parameters according to model " << model << ".\n";
10305 CP98H2OAbsModel( pxsec,
10306 parameters[0],
10307 parameters[1],
10308 parameters[2],
10309 model,
10310 f_grid,
10311 abs_p,
10312 abs_t,
10313 vmr );
10314 }
10315 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10316 {
10317 ostringstream os;
10318 os << "Full model " << name << " requires " << Nparam << " input\n"
10319 << "parameters for the model " << model << ",\n"
10320 << "but you specified " << parameters.nelem() << " parameters.\n";
10321 throw runtime_error(os.str());
10322 }
10323 else if ( (model != "user") && (parameters.nelem() == 0) )
10324 {
10325 out3 << "Full model " << name << " running with \n"
10326 << "the parameters for model " << model << ".\n";
10327 CP98H2OAbsModel( pxsec,
10328 0.00,
10329 0.00,
10330 0.00,
10331 model,
10332 f_grid,
10333 abs_p,
10334 abs_t,
10335 vmr );
10336 }
10337 else if ( (model != "user") && (parameters.nelem() != 0) )
10338 {
10339 ostringstream os;
10340 os << "ERROR: Full model " << name << " requires NO input\n"
10341 << "parameters for the model " << model << ",\n"
10342 << "but you specified " << parameters.nelem() << " parameters.\n"
10343 << "This ambiguity can not be solved by arts.\n"
10344 << "Please see the arts user guide chapter 3.\n";
10345 throw runtime_error(os.str());
10346 }
10347 }
10348
10349 else if ( "H2O-MPM87"==name )
10350 {
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364 const int Nparam = 3;
10365 if ( (model == "user") && (parameters.nelem() == Nparam) )
10366 {
10367 out3 << "Full model " << name << " is running with \n"
10368 << "user defined parameters according to model " << model << ".\n";
10369 MPM87H2OAbsModel( pxsec,
10370 parameters[0],
10371 parameters[1],
10372 parameters[2],
10373 model,
10374 f_grid,
10375 abs_p,
10376 abs_t,
10377 vmr );
10378 }
10379 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10380 {
10381 ostringstream os;
10382 os << "Full model " << name << " requires " << Nparam << " input\n"
10383 << "parameters for the model " << model << ",\n"
10384 << "but you specified " << parameters.nelem() << " parameters.\n";
10385 throw runtime_error(os.str());
10386 }
10387 else if ( (model != "user") && (parameters.nelem() == 0) )
10388 {
10389 out3 << "Full model " << name << " running with \n"
10390 << "the parameters for model " << model << ".\n";
10391 MPM87H2OAbsModel( pxsec,
10392 0.00,
10393 0.00,
10394 0.00,
10395 model,
10396 f_grid,
10397 abs_p,
10398 abs_t,
10399 vmr );
10400 }
10401 else if ( (model != "user") && (parameters.nelem() != 0) )
10402 {
10403 ostringstream os;
10404 os << "ERROR: Full model " << name << " requires NO input\n"
10405 << "parameters for the model " << model << ",\n"
10406 << "but you specified " << parameters.nelem() << " parameters.\n"
10407 << "This ambiguity can not be solved by arts.\n"
10408 << "Please see the arts user guide chapter 3.\n";
10409 throw runtime_error(os.str());
10410 }
10411 }
10412
10413 else if ( "H2O-MPM89"==name )
10414 {
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428 const int Nparam = 3;
10429 if ( (model == "user") && (parameters.nelem() == Nparam) )
10430 {
10431 out3 << "Full model " << name << " is running with \n"
10432 << "user defined parameters according to model " << model << ".\n";
10433 MPM89H2OAbsModel( pxsec,
10434 parameters[0],
10435 parameters[1],
10436 parameters[2],
10437 model,
10438 f_grid,
10439 abs_p,
10440 abs_t,
10441 vmr );
10442 }
10443 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10444 {
10445 ostringstream os;
10446 os << "Full model " << name << " requires " << Nparam << " input\n"
10447 << "parameters for the model " << model << ",\n"
10448 << "but you specified " << parameters.nelem() << " parameters.\n";
10449 throw runtime_error(os.str());
10450 }
10451 else if ( (model != "user") && (parameters.nelem() == 0) )
10452 {
10453 out3 << "Full model " << name << " running with \n"
10454 << "the parameters for model " << model << ".\n";
10455 MPM89H2OAbsModel( pxsec,
10456 0.00,
10457 0.00,
10458 0.00,
10459 model,
10460 f_grid,
10461 abs_p,
10462 abs_t,
10463 vmr );
10464 }
10465 else if ( (model != "user") && (parameters.nelem() != 0) )
10466 {
10467 ostringstream os;
10468 os << "ERROR: Full model " << name << " requires NO input\n"
10469 << "parameters for the model " << model << ",\n"
10470 << "but you specified " << parameters.nelem() << " parameters.\n"
10471 << "This ambiguity can not be solved by arts.\n"
10472 << "Please see the arts user guide chapter 3.\n";
10473 throw runtime_error(os.str());
10474 }
10475 }
10476
10477 else if ( "H2O-MPM93"==name )
10478 {
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492 const int Nparam = 3;
10493 if ( (model == "user") && (parameters.nelem() == Nparam) )
10494 {
10495 out3 << "Full model " << name << " is running with \n"
10496 << "user defined parameters according to model " << model << ".\n";
10497 MPM93H2OAbsModel( pxsec,
10498 parameters[0],
10499 parameters[1],
10500 parameters[2],
10501 model,
10502 f_grid,
10503 abs_p,
10504 abs_t,
10505 vmr );
10506 }
10507 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10508 {
10509 ostringstream os;
10510 os << "Full model " << name << " requires " << Nparam << " input\n"
10511 << "parameters for the model " << model << ",\n"
10512 << "but you specified " << parameters.nelem() << " parameters.\n";
10513 throw runtime_error(os.str());
10514 }
10515 else if ( (model != "user") && (parameters.nelem() == 0) )
10516 {
10517 out3 << "Full model " << name << " running with \n"
10518 << "the parameters for model " << model << ".\n";
10519 MPM93H2OAbsModel( pxsec,
10520 0.00,
10521 0.00,
10522 0.00,
10523 model,
10524 f_grid,
10525 abs_p,
10526 abs_t,
10527 vmr );
10528 }
10529 else if ( (model != "user") && (parameters.nelem() != 0) )
10530 {
10531 ostringstream os;
10532 os << "ERROR: Full model " << name << " requires NO input\n"
10533 << "parameters for the model " << model << ",\n"
10534 << "but you specified " << parameters.nelem() << " parameters.\n"
10535 << "This ambiguity can not be solved by arts.\n"
10536 << "Please see the arts user guide chapter 3.\n";
10537 throw runtime_error(os.str());
10538 }
10539 }
10540
10541 else if ( "H2O-PWR98"==name )
10542 {
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555 const int Nparam = 3;
10556 if ( (model == "user") && (parameters.nelem() == Nparam) )
10557 {
10558 out3 << "Full model " << name << " is running with \n"
10559 << "user defined parameters according to model " << model << ".\n";
10560 PWR98H2OAbsModel( pxsec,
10561 parameters[0],
10562 parameters[1],
10563 parameters[2],
10564 model,
10565 f_grid,
10566 abs_p,
10567 abs_t,
10568 vmr );
10569 }
10570 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10571 {
10572 ostringstream os;
10573 os << "Full model " << name << " requires " << Nparam << " input\n"
10574 << "parameters for the model " << model << ",\n"
10575 << "but you specified " << parameters.nelem() << " parameters.\n";
10576 throw runtime_error(os.str());
10577 }
10578 else if ( (model != "user") && (parameters.nelem() == 0) )
10579 {
10580 out3 << "Full model " << name << " running with \n"
10581 << "the parameters for model " << model << ".\n";
10582 PWR98H2OAbsModel( pxsec,
10583 0.00,
10584 0.00,
10585 0.00,
10586 model,
10587 f_grid,
10588 abs_p,
10589 abs_t,
10590 vmr );
10591 }
10592 else if ( (model != "user") && (parameters.nelem() != 0) )
10593 {
10594 ostringstream os;
10595 os << "ERROR: Full model " << name << " requires NO input\n"
10596 << "parameters for the model " << model << ",\n"
10597 << "but you specified " << parameters.nelem() << " parameters.\n"
10598 << "This ambiguity can not be solved by arts.\n"
10599 << "Please see the arts user guide chapter 3.\n";
10600 throw runtime_error(os.str());
10601 }
10602 }
10603
10604 else if ( "O2-CIAfunCKDMT100"==name )
10605 {
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625 const int Nparam = 1;
10626 if ( (model == "user") && (parameters.nelem() == Nparam) )
10627 {
10628 out3 << "Continuum model " << name << " is running with \n"
10629 << "user defined parameters according to model " << model << ".\n";
10630 CKD_mt_CIAfun_o2( pxsec,
10631 parameters[0],
10632 model,
10633 f_grid,
10634 abs_p,
10635 abs_t,
10636 vmr );
10637 }
10638 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10639 {
10640 ostringstream os;
10641 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10642 << "parameters for the model " << model << ",\n"
10643 << "but you specified " << parameters.nelem() << " parameters.\n";
10644 throw runtime_error(os.str());
10645 }
10646 else if ( (model != "user") && (parameters.nelem() == 0) )
10647 {
10648 out3 << "Continuum model " << name << " running with \n"
10649 << "the parameters for model " << model << ".\n";
10650 CKD_mt_CIAfun_o2( pxsec,
10651 0.00e0,
10652 model,
10653 f_grid,
10654 abs_p,
10655 abs_t,
10656 vmr );
10657 }
10658 else if ( (model != "user") && (parameters.nelem() != 0) )
10659 {
10660 ostringstream os;
10661 os << "ERROR: Continuum model " << name << " requires NO input\n"
10662 << "parameters for the model " << model << ",\n"
10663 << "but you specified " << parameters.nelem() << " parameters.\n"
10664 << "This ambiguity can not be solved by arts.\n"
10665 << "Please see the arts user guide chapter 3.\n";
10666 throw runtime_error(os.str());
10667 }
10668 }
10669
10670 else if ( "O2-v0v0CKDMT100"==name )
10671 {
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691 const int Nparam = 1;
10692 if ( (model == "user") && (parameters.nelem() == Nparam) )
10693 {
10694 out3 << "Continuum model " << name << " is running with \n"
10695 << "user defined parameters according to model " << model << ".\n";
10696 CKD_mt_v0v0_o2( pxsec,
10697 parameters[0],
10698 model,
10699 f_grid,
10700 abs_p,
10701 abs_t,
10702 vmr,
10703 abs_n2 );
10704 }
10705 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10706 {
10707 ostringstream os;
10708 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10709 << "parameters for the model " << model << ",\n"
10710 << "but you specified " << parameters.nelem() << " parameters.\n";
10711 throw runtime_error(os.str());
10712 }
10713 else if ( (model != "user") && (parameters.nelem() == 0) )
10714 {
10715 out3 << "Continuum model " << name << " running with \n"
10716 << "the parameters for model " << model << ".\n";
10717 CKD_mt_v0v0_o2( pxsec,
10718 0.0e0,
10719 model,
10720 f_grid,
10721 abs_p,
10722 abs_t,
10723 vmr,
10724 abs_n2 );
10725 }
10726 else if ( (model != "user") && (parameters.nelem() != 0) )
10727 {
10728 ostringstream os;
10729 os << "ERROR: Continuum model " << name << " requires NO input\n"
10730 << "parameters for the model " << model << ",\n"
10731 << "but you specified " << parameters.nelem() << " parameters.\n"
10732 << "This ambiguity can not be solved by arts.\n"
10733 << "Please see the arts user guide chapter 3.\n";
10734 throw runtime_error(os.str());
10735 }
10736 }
10737
10738 else if ( "O2-v1v0CKDMT100"==name )
10739 {
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758 const int Nparam = 1;
10759 if ( (model == "user") && (parameters.nelem() == Nparam) )
10760 {
10761 out3 << "Continuum model " << name << " is running with \n"
10762 << "user defined parameters according to model " << model << ".\n";
10763 CKD_mt_v1v0_o2( pxsec,
10764 parameters[0],
10765 model,
10766 f_grid,
10767 abs_p,
10768 abs_t,
10769 vmr );
10770 }
10771 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10772 {
10773 ostringstream os;
10774 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10775 << "parameters for the model " << model << ",\n"
10776 << "but you specified " << parameters.nelem() << " parameters.\n";
10777 throw runtime_error(os.str());
10778 }
10779 else if ( (model != "user") && (parameters.nelem() == 0) )
10780 {
10781 out3 << "Continuum model " << name << " running with \n"
10782 << "the parameters for model " << model << ".\n";
10783 CKD_mt_v1v0_o2( pxsec,
10784 0.0e0,
10785 model,
10786 f_grid,
10787 abs_p,
10788 abs_t,
10789 vmr );
10790 }
10791 else if ( (model != "user") && (parameters.nelem() != 0) )
10792 {
10793 ostringstream os;
10794 os << "ERROR: Continuum model " << name << " requires NO input\n"
10795 << "parameters for the model " << model << ",\n"
10796 << "but you specified " << parameters.nelem() << " parameters.\n"
10797 << "This ambiguity can not be solved by arts.\n"
10798 << "Please see the arts user guide chapter 3.\n";
10799 throw runtime_error(os.str());
10800 }
10801 }
10802
10803 else if ( "O2-SelfContStandardType"==name )
10804 {
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834 const int Nparam = 6;
10835 if ( (model == "user") && (parameters.nelem() == Nparam) )
10836 {
10837 out3 << "Continuum model " << name << " is running with \n"
10838 << "user defined parameters according to model " << model << ".\n";
10839 Standard_O2_continuum( pxsec,
10840 parameters[0],
10841 parameters[1],
10842 parameters[2],
10843 parameters[3],
10844 parameters[4],
10845 parameters[5],
10846 model,
10847 f_grid,
10848 abs_p,
10849 abs_t,
10850 abs_h2o,
10851 vmr );
10852 }
10853 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10854 {
10855 ostringstream os;
10856 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10857 << "parameters for the model " << model << ",\n"
10858 << "but you specified " << parameters.nelem() << " parameters.\n";
10859 throw runtime_error(os.str());
10860 }
10861 else if ( (model != "user") && (parameters.nelem() == 0) )
10862 {
10863 out3 << "Continuum model " << name << " running with \n"
10864 << "the parameters for model " << model << ".\n";
10865 Standard_O2_continuum( pxsec,
10866 0.00,
10867 0.00,
10868 0.00,
10869 0.00,
10870 0.00,
10871 0.00,
10872 model,
10873 f_grid,
10874 abs_p,
10875 abs_t,
10876 abs_h2o,
10877 vmr );
10878 }
10879 else if ( (model != "user") && (parameters.nelem() != 0) )
10880 {
10881 ostringstream os;
10882 os << "ERROR: Continuum model " << name << " requires NO input\n"
10883 << "parameters for the model " << model << ",\n"
10884 << "but you specified " << parameters.nelem() << " parameters.\n"
10885 << "This ambiguity can not be solved by arts.\n"
10886 << "Please see the arts user guide chapter 3.\n";
10887 throw runtime_error(os.str());
10888 }
10889 }
10890
10891 else if ( "O2-SelfContMPM93"==name )
10892 {
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912 const int Nparam = 4;
10913 if ( (model == "user") && (parameters.nelem() == Nparam) )
10914 {
10915 out3 << "Continuum model " << name << " is running with \n"
10916 << "user defined parameters according to model " << model << ".\n";
10917 MPM93_O2_continuum( pxsec,
10918 parameters[0],
10919 parameters[1],
10920 parameters[2],
10921 parameters[3],
10922 model,
10923 f_grid,
10924 abs_p,
10925 abs_t,
10926 abs_h2o,
10927 vmr );
10928 }
10929 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10930 {
10931 ostringstream os;
10932 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10933 << "parameters for the model " << model << ",\n"
10934 << "but you specified " << parameters.nelem() << " parameters.\n";
10935 throw runtime_error(os.str());
10936 }
10937 else if ( (model != "user") && (parameters.nelem() == 0) )
10938 {
10939 out3 << "Continuum model " << name << " running with \n"
10940 << "the parameters for model " << model << ".\n";
10941 MPM93_O2_continuum( pxsec,
10942 0.00,
10943 0.00,
10944 0.00,
10945 0.00,
10946 model,
10947 f_grid,
10948 abs_p,
10949 abs_t,
10950 abs_h2o,
10951 vmr );
10952 }
10953 else if ( (model != "user") && (parameters.nelem() != 0) )
10954 {
10955 ostringstream os;
10956 os << "ERROR: Continuum model " << name << " requires NO input\n"
10957 << "parameters for the model " << model << ",\n"
10958 << "but you specified " << parameters.nelem() << " parameters.\n"
10959 << "This ambiguity can not be solved by arts.\n"
10960 << "Please see the arts user guide chapter 3.\n";
10961 throw runtime_error(os.str());
10962 }
10963 }
10964
10965 else if ( "O2-SelfContPWR93"==name )
10966 {
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984 const int Nparam = 4;
10985 if ( (model == "user") && (parameters.nelem() == Nparam) )
10986 {
10987 out3 << "Continuum model " << name << " is running with \n"
10988 << "user defined parameters according to model " << model << ".\n";
10989 Rosenkranz_O2_continuum( pxsec,
10990 parameters[0],
10991 parameters[1],
10992 parameters[2],
10993 parameters[3],
10994 model,
10995 f_grid,
10996 abs_p,
10997 abs_t,
10998 abs_h2o,
10999 vmr );
11000 }
11001 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11002 {
11003 ostringstream os;
11004 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11005 << "parameters for the model " << model << ",\n"
11006 << "but you specified " << parameters.nelem() << " parameters.\n";
11007 throw runtime_error(os.str());
11008 }
11009 else if ( (model != "user") && (parameters.nelem() == 0) )
11010 {
11011 out3 << "Continuum model " << name << " running with \n"
11012 << "the parameters for model " << model << ".\n";
11013 Rosenkranz_O2_continuum( pxsec,
11014 0.00,
11015 0.00,
11016 0.00,
11017 0.00,
11018 model,
11019 f_grid,
11020 abs_p,
11021 abs_t,
11022 abs_h2o,
11023 vmr );
11024 }
11025 else if ( (model != "user") && (parameters.nelem() != 0) )
11026 {
11027 ostringstream os;
11028 os << "ERROR: Continuum model " << name << " requires NO input\n"
11029 << "parameters for the model " << model << ",\n"
11030 << "but you specified " << parameters.nelem() << " parameters.\n"
11031 << "This ambiguity can not be solved by arts.\n"
11032 << "Please see the arts user guide chapter 3.\n";
11033 throw runtime_error(os.str());
11034 }
11035 }
11036
11037 else if ( "O2-PWR88"==name )
11038 {
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11059
11060
11061
11062
11063
11064
11065
11066 const int Nparam = 4;
11067 const char *version="PWR88";
11068 if ( (model == "user") && (parameters.nelem() == Nparam) )
11069 {
11070 out3 << "Full model " << name << " is running with \n"
11071 << "user defined parameters according to model " << model << ".\n";
11072 PWR93O2AbsModel( pxsec,
11073 parameters[0],
11074 parameters[1],
11075 parameters[2],
11076 parameters[3],
11077 model,
11078 version,
11079 f_grid,
11080 abs_p,
11081 abs_t,
11082 abs_h2o,
11083 vmr );
11084 }
11085 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11086 {
11087 ostringstream os;
11088 os << "Full model " << name << " requires " << Nparam << " input\n"
11089 << "parameters for the model " << model << ",\n"
11090 << "but you specified " << parameters.nelem() << " parameters.\n";
11091 throw runtime_error(os.str());
11092 }
11093 else if ( (model != "user") && (parameters.nelem() == 0) )
11094 {
11095 out3 << "Full model " << name << " running with \n"
11096 << "the parameters for model " << model << ".\n";
11097 PWR93O2AbsModel( pxsec,
11098 0.00,
11099 0.00,
11100 0.00,
11101 0.00,
11102 model,
11103 version,
11104 f_grid,
11105 abs_p,
11106 abs_t,
11107 abs_h2o,
11108 vmr );
11109 }
11110 else if ( (model != "user") && (parameters.nelem() != 0) )
11111 {
11112 ostringstream os;
11113 os << "ERROR: Full model " << name << " requires NO input\n"
11114 << "parameters for the model " << model << ",\n"
11115 << "but you specified " << parameters.nelem() << " parameters.\n"
11116 << "This ambiguity can not be solved by arts.\n"
11117 << "Please see the arts user guide chapter 3.\n";
11118 throw runtime_error(os.str());
11119 }
11120 }
11121
11122 else if ( "O2-PWR93"==name )
11123 {
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11144 const int Nparam = 4;
11145 const char *version="PWR93";
11146 if ( (model == "user") && (parameters.nelem() == Nparam) )
11147 {
11148 out3 << "Full model " << name << " is running with \n"
11149 << "user defined parameters according to model " << model << ".\n";
11150 PWR93O2AbsModel( pxsec,
11151 parameters[0],
11152 parameters[1],
11153 parameters[2],
11154 parameters[3],
11155 model,
11156 version,
11157 f_grid,
11158 abs_p,
11159 abs_t,
11160 abs_h2o,
11161 vmr );
11162 }
11163 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11164 {
11165 ostringstream os;
11166 os << "Full model " << name << " requires " << Nparam << " input\n"
11167 << "parameters for the model " << model << ",\n"
11168 << "but you specified " << parameters.nelem() << " parameters.\n";
11169 throw runtime_error(os.str());
11170 }
11171 else if ( (model != "user") && (parameters.nelem() == 0) )
11172 {
11173 out3 << "Full model " << name << " running with \n"
11174 << "the parameters for model " << model << ".\n";
11175 PWR93O2AbsModel( pxsec,
11176 0.00,
11177 0.00,
11178 0.00,
11179 0.00,
11180 model,
11181 version,
11182 f_grid,
11183 abs_p,
11184 abs_t,
11185 abs_h2o,
11186 vmr );
11187 }
11188 else if ( (model != "user") && (parameters.nelem() != 0) )
11189 {
11190 ostringstream os;
11191 os << "ERROR: Full model " << name << " requires NO input\n"
11192 << "parameters for the model " << model << ",\n"
11193 << "but you specified " << parameters.nelem() << " parameters.\n"
11194 << "This ambiguity can not be solved by arts.\n"
11195 << "Please see the arts user guide chapter 3.\n";
11196 throw runtime_error(os.str());
11197 }
11198 }
11199
11200 else if ( "O2-PWR98"==name )
11201 {
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228 const int Nparam = 4;
11229 const char *version="PWR98";
11230 if ( (model == "user") && (parameters.nelem() == Nparam) )
11231 {
11232 out3 << "Full model " << name << " is running with \n"
11233 << "user defined parameters according to model " << model << ".\n";
11234 PWR93O2AbsModel( pxsec,
11235 parameters[0],
11236 parameters[1],
11237 parameters[2],
11238 parameters[3],
11239 model,
11240 version,
11241 f_grid,
11242 abs_p,
11243 abs_t,
11244 abs_h2o,
11245 vmr );
11246 }
11247 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11248 {
11249 ostringstream os;
11250 os << "Full model " << name << " requires " << Nparam << " input\n"
11251 << "parameters for the model " << model << ",\n"
11252 << "but you specified " << parameters.nelem() << " parameters.\n";
11253 throw runtime_error(os.str());
11254 }
11255 else if ( (model != "user") && (parameters.nelem() == 0) )
11256 {
11257 out3 << "Full model " << name << " running with \n"
11258 << "the parameters for model " << model << ".\n";
11259 PWR93O2AbsModel( pxsec,
11260 0.00,
11261 0.00,
11262 0.00,
11263 0.00,
11264 model,
11265 version,
11266 f_grid,
11267 abs_p,
11268 abs_t,
11269 abs_h2o,
11270 vmr );
11271 }
11272 else if ( (model != "user") && (parameters.nelem() != 0) )
11273 {
11274 ostringstream os;
11275 os << "ERROR: Full model " << name << " requires NO input\n"
11276 << "parameters for the model " << model << ",\n"
11277 << "but you specified " << parameters.nelem() << " parameters.\n"
11278 << "This ambiguity can not be solved by arts.\n"
11279 << "Please see the arts user guide chapter 3.\n";
11280 throw runtime_error(os.str());
11281 }
11282 }
11283
11284 else if ( "O2-MPM93"==name )
11285 {
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
11302
11303
11304
11305
11306 const int Nparam = 4;
11307 if ( (model == "user") && (parameters.nelem() == Nparam) )
11308 {
11309 out3 << "Full model " << name << " is running with \n"
11310 << "user defined parameters according to model " << model << ".\n";
11311 MPM93O2AbsModel( pxsec,
11312 parameters[0],
11313 parameters[1],
11314 parameters[2],
11315 parameters[3],
11316 model,
11317 f_grid,
11318 abs_p,
11319 abs_t,
11320 abs_h2o,
11321 vmr );
11322 }
11323 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11324 {
11325 ostringstream os;
11326 os << "Full model " << name << " requires " << Nparam << " input\n"
11327 << "parameters for the model " << model << ",\n"
11328 << "but you specified " << parameters.nelem() << " parameters.\n";
11329 throw runtime_error(os.str());
11330 }
11331 else if ( (model != "user") && (parameters.nelem() == 0) )
11332 {
11333 out3 << "Full model " << name << " running with \n"
11334 << "the parameters for model " << model << ".\n";
11335 MPM93O2AbsModel( pxsec,
11336 0.00,
11337 0.00,
11338 0.00,
11339 0.00,
11340 model,
11341 f_grid,
11342 abs_p,
11343 abs_t,
11344 abs_h2o,
11345 vmr );
11346 }
11347 else if ( (model != "user") && (parameters.nelem() != 0) )
11348 {
11349 ostringstream os;
11350 os << "ERROR: Full model " << name << " requires NO input\n"
11351 << "parameters for the model " << model << ",\n"
11352 << "but you specified " << parameters.nelem() << " parameters.\n"
11353 << "This ambiguity can not be solved by arts.\n"
11354 << "Please see the arts user guide chapter 3.\n";
11355 throw runtime_error(os.str());
11356 }
11357 }
11358
11359 else if ( "O2-MPM92"==name )
11360 {
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380 const int Nparam = 4;
11381 if ( (model == "user") && (parameters.nelem() == Nparam) )
11382 {
11383 out3 << "Full model " << name << " is running with \n"
11384 << "user defined parameters according to model " << model << ".\n";
11385 MPM92O2AbsModel( pxsec,
11386 parameters[0],
11387 parameters[1],
11388 parameters[2],
11389 parameters[3],
11390 model,
11391 f_grid,
11392 abs_p,
11393 abs_t,
11394 abs_h2o,
11395 vmr );
11396 }
11397 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11398 {
11399 ostringstream os;
11400 os << "Full model " << name << " requires " << Nparam << " input\n"
11401 << "parameters for the model " << model << ",\n"
11402 << "but you specified " << parameters.nelem() << " parameters.\n";
11403 throw runtime_error(os.str());
11404 }
11405 else if ( (model != "user") && (parameters.nelem() == 0) )
11406 {
11407 out3 << "Full model " << name << " running with \n"
11408 << "the parameters for model " << model << ".\n";
11409 MPM92O2AbsModel( pxsec,
11410 0.00,
11411 0.00,
11412 0.00,
11413 0.00,
11414 model,
11415 f_grid,
11416 abs_p,
11417 abs_t,
11418 abs_h2o,
11419 vmr );
11420 }
11421 else if ( (model != "user") && (parameters.nelem() != 0) )
11422 {
11423 ostringstream os;
11424 os << "ERROR: Full model " << name << " requires NO input\n"
11425 << "parameters for the model " << model << ",\n"
11426 << "but you specified " << parameters.nelem() << " parameters.\n"
11427 << "This ambiguity can not be solved by arts.\n"
11428 << "Please see the arts user guide chapter 3.\n";
11429 throw runtime_error(os.str());
11430 }
11431 }
11432
11433 else if ( "O2-MPM89"==name )
11434 {
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453 const int Nparam = 4;
11454 if ( (model == "user") && (parameters.nelem() == Nparam) )
11455 {
11456 out3 << "Full model " << name << " is running with \n"
11457 << "user defined parameters according to model " << model << ".\n";
11458 MPM89O2AbsModel( pxsec,
11459 parameters[0],
11460 parameters[1],
11461 parameters[2],
11462 parameters[3],
11463 model,
11464 f_grid,
11465 abs_p,
11466 abs_t,
11467 abs_h2o,
11468 vmr );
11469 }
11470 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11471 {
11472 ostringstream os;
11473 os << "Full model " << name << " requires " << Nparam << " input\n"
11474 << "parameters for the model " << model << ",\n"
11475 << "but you specified " << parameters.nelem() << " parameters.\n";
11476 throw runtime_error(os.str());
11477 }
11478 else if ( (model != "user") && (parameters.nelem() == 0) )
11479 {
11480 out3 << "Full model " << name << " running with \n"
11481 << "the parameters for model " << model << ".\n";
11482 MPM89O2AbsModel( pxsec,
11483 0.00,
11484 0.00,
11485 0.00,
11486 0.00,
11487 model,
11488 f_grid,
11489 abs_p,
11490 abs_t,
11491 abs_h2o,
11492 vmr );
11493 }
11494 else if ( (model != "user") && (parameters.nelem() != 0) )
11495 {
11496 ostringstream os;
11497 os << "ERROR: Full model " << name << " requires NO input\n"
11498 << "parameters for the model " << model << ",\n"
11499 << "but you specified " << parameters.nelem() << " parameters.\n"
11500 << "This ambiguity can not be solved by arts.\n"
11501 << "Please see the arts user guide chapter 3.\n";
11502 throw runtime_error(os.str());
11503 }
11504 }
11505
11506 else if ( "O2-MPM87"==name )
11507 {
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
11529
11530 const int Nparam = 4;
11531 if ( (model == "user") && (parameters.nelem() == Nparam) )
11532 {
11533 out3 << "Full model " << name << " is running with \n"
11534 << "user defined parameters according to model " << model << ".\n";
11535 MPM87O2AbsModel( pxsec,
11536 parameters[0],
11537 parameters[1],
11538 parameters[2],
11539 parameters[3],
11540 model,
11541 f_grid,
11542 abs_p,
11543 abs_t,
11544 abs_h2o,
11545 vmr );
11546 }
11547 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11548 {
11549 ostringstream os;
11550 os << "Full model " << name << " requires " << Nparam << " input\n"
11551 << "parameters for the model " << model << ",\n"
11552 << "but you specified " << parameters.nelem() << " parameters.\n";
11553 throw runtime_error(os.str());
11554 }
11555 else if ( (model != "user") && (parameters.nelem() == 0) )
11556 {
11557 out3 << "Full model " << name << " running with \n"
11558 << "the parameters for model " << model << ".\n";
11559 MPM87O2AbsModel( pxsec,
11560 0.00,
11561 0.00,
11562 0.00,
11563 0.00,
11564 model,
11565 f_grid,
11566 abs_p,
11567 abs_t,
11568 abs_h2o,
11569 vmr );
11570 }
11571 else if ( (model != "user") && (parameters.nelem() != 0) )
11572 {
11573 ostringstream os;
11574 os << "ERROR: Full model " << name << " requires NO input\n"
11575 << "parameters for the model " << model << ",\n"
11576 << "but you specified " << parameters.nelem() << " parameters.\n"
11577 << "This ambiguity can not be solved by arts.\n"
11578 << "Please see the arts user guide chapter 3.\n";
11579 throw runtime_error(os.str());
11580 }
11581 }
11582
11583 else if ( "O2-MPM85"==name )
11584 {
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603 const int Nparam = 4;
11604 if ( (model == "user") && (parameters.nelem() == Nparam) )
11605 {
11606 out3 << "Full model " << name << " is running with \n"
11607 << "user defined parameters according to model " << model << ".\n";
11608 MPM85O2AbsModel( pxsec,
11609 parameters[0],
11610 parameters[1],
11611 parameters[2],
11612 parameters[3],
11613 model,
11614 f_grid,
11615 abs_p,
11616 abs_t,
11617 abs_h2o,
11618 vmr );
11619 }
11620 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11621 {
11622 ostringstream os;
11623 os << "Full model " << name << " requires " << Nparam << " input\n"
11624 << "parameters for the model " << model << ",\n"
11625 << "but you specified " << parameters.nelem() << " parameters.\n";
11626 throw runtime_error(os.str());
11627 }
11628 else if ( (model != "user") && (parameters.nelem() == 0) )
11629 {
11630 out3 << "Full model " << name << " running with \n"
11631 << "the parameters for model " << model << ".\n";
11632 MPM85O2AbsModel( pxsec,
11633 0.00,
11634 0.00,
11635 0.00,
11636 0.00,
11637 model,
11638 f_grid,
11639 abs_p,
11640 abs_t,
11641 abs_h2o,
11642 vmr );
11643 }
11644 else if ( (model != "user") && (parameters.nelem() != 0) )
11645 {
11646 ostringstream os;
11647 os << "ERROR: Full model " << name << " requires NO input\n"
11648 << "parameters for the model " << model << ",\n"
11649 << "but you specified " << parameters.nelem() << " parameters.\n"
11650 << "This ambiguity can not be solved by arts.\n"
11651 << "Please see the arts user guide chapter 3.\n";
11652 throw runtime_error(os.str());
11653 }
11654 }
11655
11656 else if ( "N2-SelfContMPM93"==name )
11657 {
11658
11659
11660
11661
11662
11663
11664
11665
11666
11667
11668
11669
11670
11671
11672
11673
11674
11675
11676
11677
11678 const int Nparam = 4;
11679 if ( (model == "user") && (parameters.nelem() == Nparam) )
11680 {
11681 out3 << "Continuum model " << name << " is running with \n"
11682 << "user defined parameters according to model " << model << ".\n";
11683 MPM93_N2_continuum( pxsec,
11684 parameters[0],
11685 parameters[1],
11686 parameters[2],
11687 parameters[3],
11688 model,
11689 f_grid,
11690 abs_p,
11691 abs_t,
11692 abs_h2o,
11693 vmr );
11694 }
11695 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11696 {
11697 ostringstream os;
11698 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11699 << "parameters for the model " << model << ",\n"
11700 << "but you specified " << parameters.nelem() << " parameters.\n";
11701 throw runtime_error(os.str());
11702 }
11703 else if ( (model == "MPM93Scale") && (parameters.nelem() == 1) )
11704 {
11705 out3 << "Continuum model " << name << " running with \n"
11706 << "the parameters for model " << model << ".\n";
11707 MPM93_N2_continuum( pxsec,
11708 parameters[0],
11709 0.00,
11710 0.00,
11711 0.00,
11712 model,
11713 f_grid,
11714 abs_p,
11715 abs_t,
11716 abs_h2o,
11717 vmr );
11718 }
11719 else if ( (model == "MPM93Scale") && (parameters.nelem() != 1) )
11720 {
11721 ostringstream os;
11722 os << "Continuum model " << name << " requires 1 scaling input\n"
11723 << "parameters for the model " << model << ",\n"
11724 << "but you specified " << parameters.nelem() << " parameters.\n";
11725 throw runtime_error(os.str());
11726 }
11727 else if ( (model != "user") && (model != "MPM93Scale") && (parameters.nelem() == 0) )
11728 {
11729 out3 << "Continuum model " << name << " running with \n"
11730 << "the parameters for model " << model << ".\n";
11731 MPM93_N2_continuum( pxsec,
11732 0.00,
11733 0.00,
11734 0.00,
11735 0.00,
11736 model,
11737 f_grid,
11738 abs_p,
11739 abs_t,
11740 abs_h2o,
11741 vmr );
11742 }
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755 }
11756
11757 else if ( "N2-DryContATM01"==name )
11758 {
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774 const int Nparam = 1;
11775 if ( (model == "user") && (parameters.nelem() == Nparam) )
11776 {
11777 out3 << "Continuum model " << name << " is running with \n"
11778 << "user defined parameters according to model " << model << ".\n";
11779 Pardo_ATM_N2_dry_continuum( pxsec,
11780 parameters[0],
11781 model,
11782 f_grid,
11783 abs_p,
11784 abs_t,
11785 vmr,
11786 abs_h2o );
11787 }
11788 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11789 {
11790 ostringstream os;
11791 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11792 << "parameters for the model " << model << ",\n"
11793 << "but you specified " << parameters.nelem() << " parameters.\n";
11794 throw runtime_error(os.str());
11795 }
11796 else if ( (model != "user") && (parameters.nelem() == 0) )
11797 {
11798 out3 << "Continuum model " << name << " running with \n"
11799 << "the parameters for model " << model << ".\n";
11800 Pardo_ATM_N2_dry_continuum( pxsec,
11801 0.000,
11802 model,
11803 f_grid,
11804 abs_p,
11805 abs_t,
11806 vmr,
11807 abs_h2o );
11808 }
11809 else if ( (model != "user") && (parameters.nelem() != 0) )
11810 {
11811 ostringstream os;
11812 os << "ERROR: Continuum model " << name << " requires NO input\n"
11813 << "parameters for the model " << model << ",\n"
11814 << "but you specified " << parameters.nelem() << " parameters.\n"
11815 << "This ambiguity can not be solved by arts.\n"
11816 << "Please see the arts user guide chapter 3.\n";
11817 throw runtime_error(os.str());
11818 }
11819 }
11820
11821 else if ( "N2-SelfContPWR93"==name )
11822 {
11823
11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11838
11839 const int Nparam = 2;
11840 if ( (model == "user") && (parameters.nelem() == Nparam) )
11841 {
11842 out3 << "Continuum model " << name << " is running with \n"
11843 << "user defined parameters according to model " << model << ".\n";
11844 Rosenkranz_N2_self_continuum( pxsec,
11845 parameters[0],
11846 parameters[1],
11847 model,
11848 f_grid,
11849 abs_p,
11850 abs_t,
11851 vmr );
11852 }
11853 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11854 {
11855 ostringstream os;
11856 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11857 << "parameters for the model " << model << ",\n"
11858 << "but you specified " << parameters.nelem() << " parameters.\n";
11859 throw runtime_error(os.str());
11860 }
11861 else if ( (model != "user") && (parameters.nelem() == 0) )
11862 {
11863 out3 << "Continuum model " << name << " running with \n"
11864 << "the parameters for model " << model << ".\n";
11865 Rosenkranz_N2_self_continuum( pxsec,
11866 0.00,
11867 0.00,
11868 model,
11869 f_grid,
11870 abs_p,
11871 abs_t,
11872 vmr );
11873 }
11874 else if ( (model != "user") && (parameters.nelem() != 0) )
11875 {
11876 ostringstream os;
11877 os << "ERROR: Continuum model " << name << " requires NO input\n"
11878 << "parameters for the model " << model << ",\n"
11879 << "but you specified " << parameters.nelem() << " parameters.\n"
11880 << "This ambiguity can not be solved by arts.\n"
11881 << "Please see the arts user guide chapter 3.\n";
11882 throw runtime_error(os.str());
11883 }
11884 }
11885
11886 else if ( "N2-SelfContStandardType"==name )
11887 {
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903 const int Nparam = 4;
11904 if ( (model == "user") && (parameters.nelem() == Nparam) )
11905 {
11906 out3 << "Continuum model " << name << " is running with \n"
11907 << "user defined parameters according to model " << model << ".\n";
11908 Standard_N2_self_continuum( pxsec,
11909 parameters[0],
11910 parameters[1],
11911 parameters[2],
11912 parameters[3],
11913 model,
11914 f_grid,
11915 abs_p,
11916 abs_t,
11917 vmr );
11918 }
11919 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11920 {
11921 ostringstream os;
11922 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11923 << "parameters for the model " << model << ",\n"
11924 << "but you specified " << parameters.nelem() << " parameters.\n";
11925 throw runtime_error(os.str());
11926 }
11927 else if ( (model != "user") && (parameters.nelem() == 0) )
11928 {
11929 out3 << "Continuum model " << name << " running with \n"
11930 << "the parameters for model " << model << ".\n";
11931 Standard_N2_self_continuum( pxsec,
11932 0.000,
11933 0.000,
11934 0.000,
11935 0.000,
11936 model,
11937 f_grid,
11938 abs_p,
11939 abs_t,
11940 vmr );
11941 }
11942 else if ( (model != "user") && (parameters.nelem() != 0) )
11943 {
11944 ostringstream os;
11945 os << "ERROR: Continuum model " << name << " requires NO input\n"
11946 << "parameters for the model " << model << ",\n"
11947 << "but you specified " << parameters.nelem() << " parameters.\n"
11948 << "This ambiguity can not be solved by arts.\n"
11949 << "Please see the arts user guide chapter 3.\n";
11950 throw runtime_error(os.str());
11951 }
11952 }
11953
11954 else if ( "N2-SelfContBorysow"==name )
11955 {
11956
11957
11958
11959 const int Nparam = 1;
11960 if ( (model == "user") && (parameters.nelem() == Nparam) )
11961 {
11962 out3 << "Continuum model " << name << " is running with \n"
11963 << "user defined parameters according to model " << model << ".\n";
11964 BF86_CIA_N2( pxsec,
11965 parameters[0],
11966 model,
11967 f_grid,
11968 abs_p,
11969 abs_t,
11970 vmr );
11971 }
11972 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11973 {
11974 ostringstream os;
11975 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11976 << "parameters for the model " << model << ",\n"
11977 << "but you specified " << parameters.nelem() << " parameters.\n";
11978 throw runtime_error(os.str());
11979 }
11980 else if ( (model != "user") && (parameters.nelem() == 0) )
11981 {
11982 out3 << "Continuum model " << name << " running with \n"
11983 << "the parameters for model " << model << ".\n";
11984 BF86_CIA_N2( pxsec,
11985 0.0,
11986 model,
11987 f_grid,
11988 abs_p,
11989 abs_t,
11990 vmr );
11991 }
11992 else if ( (model != "user") && (parameters.nelem() != 0) )
11993 {
11994 ostringstream os;
11995 os << "ERROR: Continuum model " << name << " requires NO input\n"
11996 << "parameters for the model " << model << ",\n"
11997 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
11998 << "This ambiguity can not be solved by arts.\n"
11999 << "Please see the arts user guide chapter 3.\n";
12000 throw runtime_error(os.str());
12001 }
12002 }
12003
12004 else if ( "N2-CIArotCKDMT100"==name )
12005 {
12006
12007
12008
12009 const int Nparam = 1;
12010 if ( (model == "user") && (parameters.nelem() == Nparam) )
12011 {
12012 out3 << "Continuum model " << name << " is running with \n"
12013 << "user defined parameters according to model " << model << ".\n";
12014 CKD_mt_CIArot_n2( pxsec,
12015 parameters[0],
12016 model,
12017 f_grid,
12018 abs_p,
12019 abs_t,
12020 vmr );
12021 }
12022 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12023 {
12024 ostringstream os;
12025 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12026 << "parameters for the model " << model << ",\n"
12027 << "but you specified " << parameters.nelem() << " parameters.\n";
12028 throw runtime_error(os.str());
12029 }
12030 else if ( (model != "user") && (parameters.nelem() == 0) )
12031 {
12032 out3 << "Continuum model " << name << " running with \n"
12033 << "the parameters for model " << model << ".\n";
12034 CKD_mt_CIArot_n2( pxsec,
12035 0.0,
12036 model,
12037 f_grid,
12038 abs_p,
12039 abs_t,
12040 vmr );
12041 }
12042 else if ( (model != "user") && (parameters.nelem() != 0) )
12043 {
12044 ostringstream os;
12045 os << "ERROR: Continuum model " << name << " requires NO input\n"
12046 << "parameters for the model " << model << ",\n"
12047 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12048 << "This ambiguity can not be solved by arts.\n"
12049 << "Please see the arts user guide chapter 3.\n";
12050 throw runtime_error(os.str());
12051 }
12052 }
12053
12054 else if ( "N2-CIAfunCKDMT100"==name )
12055 {
12056
12057
12058
12059
12060
12061
12062
12063 const int Nparam = 1;
12064 if ( (model == "user") && (parameters.nelem() == Nparam) )
12065 {
12066 out3 << "Continuum model " << name << " is running with \n"
12067 << "user defined parameters according to model " << model << ".\n";
12068 CKD_mt_CIAfun_n2( pxsec,
12069 parameters[0],
12070 model,
12071 f_grid,
12072 abs_p,
12073 abs_t,
12074 vmr );
12075 }
12076 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12077 {
12078 ostringstream os;
12079 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12080 << "parameters for the model " << model << ",\n"
12081 << "but you specified " << parameters.nelem() << " parameters.\n";
12082 throw runtime_error(os.str());
12083 }
12084 else if ( (model != "user") && (parameters.nelem() == 0) )
12085 {
12086 out3 << "Continuum model " << name << " running with \n"
12087 << "the parameters for model " << model << ".\n";
12088 CKD_mt_CIAfun_n2( pxsec,
12089 0.0,
12090 model,
12091 f_grid,
12092 abs_p,
12093 abs_t,
12094 vmr );
12095 }
12096 else if ( (model != "user") && (parameters.nelem() != 0) )
12097 {
12098 ostringstream os;
12099 os << "ERROR: Continuum model " << name << " requires NO input\n"
12100 << "parameters for the model " << model << ",\n"
12101 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12102 << "This ambiguity can not be solved by arts.\n"
12103 << "Please see the arts user guide chapter 3.\n";
12104 throw runtime_error(os.str());
12105 }
12106 }
12107
12108 else if ( "CO2-CKD241"==name )
12109 {
12110
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127 const int Nparam = 1;
12128 if ( (model == "user") && (parameters.nelem() == Nparam) )
12129 {
12130 out3 << "Continuum model " << name << " is running with \n"
12131 << "user defined parameters according to model " << model << ".\n";
12132 CKD_241_co2( pxsec,
12133 parameters[0],
12134 model,
12135 f_grid,
12136 abs_p,
12137 abs_t,
12138 vmr );
12139 }
12140 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12141 {
12142 ostringstream os;
12143 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12144 << "parameters for the model " << model << ",\n"
12145 << "but you specified " << parameters.nelem() << " parameters.\n";
12146 throw runtime_error(os.str());
12147 }
12148 else if ( (model != "user") && (parameters.nelem() == 0) )
12149 {
12150 out3 << "Continuum model " << name << " running with \n"
12151 << "the parameters for model " << model << ".\n";
12152 CKD_241_co2( pxsec,
12153 0.00,
12154 model,
12155 f_grid,
12156 abs_p,
12157 abs_t,
12158 vmr );
12159 }
12160 else if ( (model != "user") && (parameters.nelem() != 0) )
12161 {
12162 ostringstream os;
12163 os << "ERROR: Continuum model " << name << " requires NO input\n"
12164 << "parameters for the model " << model << ",\n"
12165 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12166 << "This ambiguity can not be solved by arts.\n"
12167 << "Please see the arts user guide chapter 3.\n";
12168 throw runtime_error(os.str());
12169 }
12170 }
12171
12172 else if ( "CO2-CKDMT100"==name )
12173 {
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191 const int Nparam = 1;
12192 if ( (model == "user") && (parameters.nelem() == Nparam) )
12193 {
12194 out3 << "Continuum model " << name << " is running with \n"
12195 << "user defined parameters according to model " << model << ".\n";
12196 CKD_mt_co2( pxsec,
12197 parameters[0],
12198 model,
12199 f_grid,
12200 abs_p,
12201 abs_t,
12202 vmr );
12203 }
12204 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12205 {
12206 ostringstream os;
12207 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12208 << "parameters for the model " << model << ",\n"
12209 << "but you specified " << parameters.nelem() << " parameters.\n";
12210 throw runtime_error(os.str());
12211 }
12212 else if ( (model != "user") && (parameters.nelem() == 0) )
12213 {
12214 out3 << "Continuum model " << name << " running with \n"
12215 << "the parameters for model " << model << ".\n";
12216 CKD_mt_co2( pxsec,
12217 0.00,
12218 model,
12219 f_grid,
12220 abs_p,
12221 abs_t,
12222 vmr );
12223 }
12224 else if ( (model != "user") && (parameters.nelem() != 0) )
12225 {
12226 ostringstream os;
12227 os << "ERROR: Continuum model " << name << " requires NO input\n"
12228 << "parameters for the model " << model << ",\n"
12229 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12230 << "This ambiguity can not be solved by arts.\n"
12231 << "Please see the arts user guide chapter 3.\n";
12232 throw runtime_error(os.str());
12233 }
12234 }
12235
12236 else if ( "CO2-SelfContPWR93"==name )
12237 {
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254 const int Nparam = 2;
12255 if ( (model == "user") && (parameters.nelem() == Nparam) )
12256 {
12257 out3 << "Continuum model " << name << " is running with \n"
12258 << "user defined parameters according to model " << model << ".\n";
12259 Rosenkranz_CO2_self_continuum( pxsec,
12260 parameters[0],
12261 parameters[1],
12262 model,
12263 f_grid,
12264 abs_p,
12265 abs_t,
12266 vmr );
12267 }
12268 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12269 {
12270 ostringstream os;
12271 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12272 << "parameters for the model " << model << ",\n"
12273 << "but you specified " << parameters.nelem() << " parameters.\n";
12274 throw runtime_error(os.str());
12275 }
12276 else if ( (model != "user") && (parameters.nelem() == 0) )
12277 {
12278 out3 << "Continuum model " << name << " running with \n"
12279 << "the parameters for model " << model << ".\n";
12280 Rosenkranz_CO2_self_continuum( pxsec,
12281 0.00,
12282 0.00,
12283 model,
12284 f_grid,
12285 abs_p,
12286 abs_t,
12287 vmr );
12288 }
12289 else if ( (model != "user") && (parameters.nelem() != 0) )
12290 {
12291 ostringstream os;
12292 os << "ERROR: Continuum model " << name << " requires NO input\n"
12293 << "parameters for the model " << model << ",\n"
12294 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12295 << "This ambiguity can not be solved by arts.\n"
12296 << "Please see the arts user guide chapter 3.\n";
12297 throw runtime_error(os.str());
12298 }
12299 }
12300
12301 else if ( "CO2-ForeignContPWR93"==name )
12302 {
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320 const int Nparam = 2;
12321 if ( (model == "user") && (parameters.nelem() == Nparam) )
12322 {
12323 out3 << "Continuum model " << name << " is running with \n"
12324 << "user defined parameters according to model " << model << ".\n";
12325 Rosenkranz_CO2_foreign_continuum( pxsec,
12326 parameters[0],
12327 parameters[1],
12328 model,
12329 f_grid,
12330 abs_p,
12331 abs_t,
12332 abs_n2,
12333 vmr );
12334 }
12335 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12336 {
12337 ostringstream os;
12338 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12339 << "parameters for the model " << model << ",\n"
12340 << "but you specified " << parameters.nelem() << " parameters.\n";
12341 throw runtime_error(os.str());
12342 }
12343 else if ( (model != "user") && (parameters.nelem() == 0) )
12344 {
12345 out3 << "Continuum model " << name << " running with \n"
12346 << "the parameters for model " << model << ".\n";
12347 Rosenkranz_CO2_foreign_continuum( pxsec,
12348 0.00,
12349 0.00,
12350 model,
12351 f_grid,
12352 abs_p,
12353 abs_t,
12354 abs_n2,
12355 vmr );
12356 }
12357 else if ( (model != "user") && (parameters.nelem() != 0) )
12358 {
12359 ostringstream os;
12360 os << "ERROR: Continuum model " << name << " requires NO input\n"
12361 << "parameters for the model " << model << ",\n"
12362 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12363 << "This ambiguity can not be solved by arts.\n"
12364 << "Please see the arts user guide chapter 3.\n";
12365 throw runtime_error(os.str());
12366 }
12367 }
12368
12369 else if ( "liquidcloud-MPM93"==name )
12370 {
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399 const int Nparam = 3;
12400 if ( (model == "user") && (parameters.nelem() == Nparam) )
12401 {
12402 out3 << "MPM93 liquid water cloud absorption model " << name << " is running with \n"
12403 << "user defined parameters according to model " << model << ".\n";
12404 MPM93WaterDropletAbs(pxsec,
12405 parameters[0],
12406 parameters[1],
12407 parameters[2],
12408 model,
12409 f_grid,
12410 abs_p,
12411 abs_t,
12412 vmr );
12413 }
12414 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12415 {
12416 ostringstream os;
12417 os << "MPM93 liquid water cloud absorption model " << name << " requires\n"
12418 << Nparam << " input parameter for the model " << model << ",\n"
12419 << "but you specified " << parameters.nelem() << " parameters.\n";
12420 throw runtime_error(os.str());
12421 }
12422 else if ( (model != "user") && (parameters.nelem() == 0) )
12423 {
12424 out3 << "MPM93 liquid water cloud absorption model " << name << " running with \n"
12425 << "the parameter for model " << model << ".\n";
12426 MPM93WaterDropletAbs(pxsec,
12427 0.000,
12428 0.000,
12429 0.000,
12430 model,
12431 f_grid,
12432 abs_p,
12433 abs_t,
12434 vmr );
12435 }
12436 else if ( (model != "user") && (parameters.nelem() != 0) )
12437 {
12438 ostringstream os;
12439 os << "ERROR: MPM93 liquid water cloud absorption model " << name << " requires NO input\n"
12440 << "parameters for the model " << model << ",\n"
12441 << "but you specified " << parameters.nelem() << " parameters.\n"
12442 << "This ambiguity can not be solved by arts.\n"
12443 << "Please see the arts user guide chapter 4.\n";
12444 throw runtime_error(os.str());
12445 }
12446 }
12447
12448 else if ( "icecloud-MPM93"==name )
12449 {
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478 const int Nparam = 3;
12479 if ( (model == "user") && (parameters.nelem() == Nparam) )
12480 {
12481 out3 << "MPM93 ice water cloud absorption model " << name << " is running with \n"
12482 << "user defined parameters according to model " << model << ".\n";
12483 MPM93IceCrystalAbs(pxsec,
12484 parameters[0],
12485 parameters[1],
12486 parameters[2],
12487 model,
12488 f_grid,
12489 abs_p,
12490 abs_t,
12491 vmr );
12492 }
12493 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12494 {
12495 ostringstream os;
12496 os << "MPM93 ice water cloud absorption model " << name << " requires \n"
12497 << Nparam << " input parameter for the model " << model << ",\n"
12498 << "but you specified " << parameters.nelem() << " parameters.\n";
12499 throw runtime_error(os.str());
12500 }
12501 else if ( (model != "user") && (parameters.nelem() == 0) )
12502 {
12503 out3 << "MPM93 ice water cloud absorption model " << name << " running with \n"
12504 << "the parameter for model " << model << ".\n";
12505 MPM93IceCrystalAbs(pxsec,
12506 0.000,
12507 0.000,
12508 0.000,
12509 model,
12510 f_grid,
12511 abs_p,
12512 abs_t,
12513 vmr );
12514 }
12515 else if ( (model != "user") && (parameters.nelem() != 0) )
12516 {
12517 ostringstream os;
12518 os << "ERROR: MPM93 ice water cloud absorption model " << name << " requires NO input\n"
12519 << "parameters for the model " << model << ",\n"
12520 << "but you specified " << parameters.nelem() << " parameters.\n"
12521 << "This ambiguity can not be solved by arts.\n"
12522 << "Please see the arts user guide chapter 4.\n";
12523 throw runtime_error(os.str());
12524 }
12525 }
12526
12527 else if ( "rain-MPM93"==name )
12528 {
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558 const int Nparam = 3;
12559 if ( (model == "user") && (parameters.nelem() == Nparam) )
12560 {
12561 out3 << "MPM93 rain extinction model " << name << " is running with \n"
12562 << "user defined parameters according to model " << model << ".\n";
12563 MPM93RainExt(pxsec,
12564 parameters[0],
12565 parameters[1],
12566 parameters[2],
12567 model,
12568 f_grid,
12569 abs_p,
12570 abs_t,
12571 vmr );
12572 }
12573 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12574 {
12575 ostringstream os;
12576 os << "MPM93 rain extinction model " << name << " requires \n"
12577 << Nparam << " input parameter for the model " << model << ",\n"
12578 << "but you specified " << parameters.nelem() << " parameters.\n";
12579 throw runtime_error(os.str());
12580 }
12581 else if ( (model != "user") && (parameters.nelem() == 0) )
12582 {
12583 out3 << "MPM93 rain extinction model " << name << " running with \n"
12584 << "the parameter for model " << model << ".\n";
12585 MPM93RainExt(pxsec,
12586 0.000,
12587 0.000,
12588 0.000,
12589 model,
12590 f_grid,
12591 abs_p,
12592 abs_t,
12593 vmr );
12594 }
12595 else if ( (model != "user") && (parameters.nelem() != 0) )
12596 {
12597 ostringstream os;
12598 os << "ERROR: MPM93 rain extinction model " << name << " requires NO input\n"
12599 << "parameters for the model " << model << ",\n"
12600 << "but you specified " << parameters.nelem() << " parameters.\n"
12601 << "This ambiguity can not be solved by arts.\n"
12602 << "Please see the arts user guide chapter 4.\n";
12603 throw runtime_error(os.str());
12604 }
12605 }
12606 else
12607 {
12608
12609 ostringstream os;
12610 os << "ERROR: Continuum/ full model tag `" << name << "' not yet implemented in arts!";
12611 throw runtime_error(os.str());
12612 }
12613
12614
12615
12616
12617
12618
12619 extern const Numeric BOLTZMAN_CONST;
12620
12621
12622 for ( Index i=0; i<abs_p.nelem(); ++i )
12623 {
12624 const Numeric p_i = abs_p[i];
12625 const Numeric t_i = abs_t[i];
12626
12627
12628
12629 const Numeric n = p_i / BOLTZMAN_CONST / t_i;
12630
12631
12632
12633 pxsec(joker,i) /= n;
12634 xsec(joker,i) += pxsec(joker,i);
12635 }
12636 }
12637
12638
12639
12663 void check_continuum_model(const String& name)
12664 {
12665
12666 extern const Array<SpeciesRecord> species_data;
12667
12668
12669 ArrayOfString valid_models;
12670
12671 bool found = false;
12672
12673
12674 for ( Array<SpeciesRecord>::const_iterator i=species_data.begin();
12675 i<species_data.end();
12676 ++i )
12677 {
12678 String specnam = i->Name();
12679
12680
12681 for ( Array<IsotopeRecord>::const_iterator j=i->Isotope().begin();
12682 j<i->Isotope().end();
12683 ++j )
12684 {
12685 String isonam = j->Name();
12686
12687
12688
12689
12690
12691
12692 String fullnam = specnam + "-" + isonam;
12693
12694
12695
12696
12697 if ( 0 > j->Abundance() )
12698 {
12699 valid_models.push_back(fullnam);
12700 }
12701
12702 if ( name == fullnam )
12703 {
12704 found = true;
12705 }
12706 }
12707 }
12708
12709
12710
12711 if (!found)
12712 {
12713 ostringstream os;
12714 os << "The String `" << name << "' matches none of the known\n"
12715 << "continuum models. Known continuum models are:";
12716 for ( ArrayOfString::const_iterator i=valid_models.begin();
12717 i<valid_models.end();
12718 ++i )
12719 {
12720 os << "\n" << *i;
12721 }
12722 throw runtime_error(os.str());
12723 }
12724 }
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735 #ifndef F2C_INCLUDE
12736 #define F2C_INCLUDE
12737
12738 typedef long int integer;
12739 typedef unsigned long int uinteger;
12740 typedef char *address;
12741 typedef short int shortint;
12742 typedef float real;
12743 typedef double doublereal;
12744 typedef struct { real r, i; } complex;
12745 typedef struct { doublereal r, i; } doublecomplex;
12746 typedef long int logical;
12747 typedef short int shortlogical;
12748 typedef char logical1;
12749 typedef char integer1;
12750 #ifdef INTEGER_STAR_8
12751 typedef long long longint;
12752 typedef unsigned long long ulongint;
12753 #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b)))
12754 #define qbit_set(a,b) ((a) | ((ulongint)1 << (b)))
12755 #endif
12756
12757 #define TRUE_ (1)
12758 #define FALSE_ (0)
12759
12760
12761 #ifndef Extern
12762 #define Extern extern
12763 #endif
12764
12765
12766
12767 #ifdef f2c_i2
12768
12769 typedef short flag;
12770 typedef short ftnlen;
12771 typedef short ftnint;
12772 #else
12773 typedef long int flag;
12774 typedef long int ftnlen;
12775 typedef long int ftnint;
12776 #endif
12777
12778
12779 typedef struct
12780 { flag cierr;
12781 ftnint ciunit;
12782 flag ciend;
12783 char *cifmt;
12784 ftnint cirec;
12785 } cilist;
12786
12787
12788 typedef struct
12789 { flag icierr;
12790 char *iciunit;
12791 flag iciend;
12792 char *icifmt;
12793 ftnint icirlen;
12794 ftnint icirnum;
12795 } icilist;
12796
12797
12798 typedef struct
12799 { flag oerr;
12800 ftnint ounit;
12801 char *ofnm;
12802 ftnlen ofnmlen;
12803 char *osta;
12804 char *oacc;
12805 char *ofm;
12806 ftnint orl;
12807 char *oblnk;
12808 } olist;
12809
12810
12811 typedef struct
12812 { flag cerr;
12813 ftnint cunit;
12814 char *csta;
12815 } cllist;
12816
12817
12818 typedef struct
12819 { flag aerr;
12820 ftnint aunit;
12821 } alist;
12822
12823
12824 typedef struct
12825 { flag inerr;
12826 ftnint inunit;
12827 char *infile;
12828 ftnlen infilen;
12829 ftnint *inex;
12830 ftnint *inopen;
12831 ftnint *innum;
12832 ftnint *innamed;
12833 char *inname;
12834 ftnlen innamlen;
12835 char *inacc;
12836 ftnlen inacclen;
12837 char *inseq;
12838 ftnlen inseqlen;
12839 char *indir;
12840 ftnlen indirlen;
12841 char *infmt;
12842 ftnlen infmtlen;
12843 char *inform;
12844 ftnint informlen;
12845 char *inunf;
12846 ftnlen inunflen;
12847 ftnint *inrecl;
12848 ftnint *innrec;
12849 char *inblank;
12850 ftnlen inblanklen;
12851 } inlist;
12852
12853 #define VOID void
12854
12855 union Multitype {
12856 integer1 g;
12857 shortint h;
12858 integer i;
12859
12860 real r;
12861 doublereal d;
12862 complex c;
12863 doublecomplex z;
12864 };
12865
12866 typedef union Multitype Multitype;
12867
12868
12869
12870 struct Vardesc {
12871 char *name;
12872 char *addr;
12873 ftnlen *dims;
12874 int type;
12875 };
12876 typedef struct Vardesc Vardesc;
12877
12878 struct Namelist {
12879 char *name;
12880 Vardesc **vars;
12881 int nvars;
12882 };
12883 typedef struct Namelist Namelist;
12884
12885 #define abs(x) ((x) >= 0 ? (x) : -(x))
12886 #define dabs(x) (doublereal)abs(x)
12887 #define min(a,b) ((a) <= (b) ? (a) : (b))
12888 #define max(a,b) ((a) >= (b) ? (a) : (b))
12889 #define dmin(a,b) (doublereal)min(a,b)
12890 #define dmax(a,b) (doublereal)max(a,b)
12891 #define bit_test(a,b) ((a) >> (b) & 1)
12892 #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b)))
12893 #define bit_set(a,b) ((a) | ((uinteger)1 << (b)))
12894
12895
12896
12897 #define F2C_proc_par_types 1
12898 #ifdef __cplusplus
12899 typedef int (*U_fp)(...);
12900 typedef shortint (*J_fp)(...);
12901 typedef integer (*I_fp)(...);
12902 typedef real (*R_fp)(...);
12903 typedef doublereal (*D_fp)(...), (*E_fp)(...);
12904 typedef VOID (*C_fp)(...);
12905 typedef VOID (*Z_fp)(...);
12906 typedef logical (*L_fp)(...);
12907 typedef shortlogical (*K_fp)(...);
12908 typedef VOID (*H_fp)(...);
12909 typedef int (*S_fp)(...);
12910 #else
12911 typedef int (*U_fp)();
12912 typedef shortint (*J_fp)();
12913 typedef integer (*I_fp)();
12914 typedef real (*R_fp)();
12915 typedef doublereal (*D_fp)(), (*E_fp)();
12916 typedef VOID (*C_fp)();
12917 typedef VOID (*Z_fp)();
12918 typedef logical (*L_fp)();
12919 typedef shortlogical (*K_fp)();
12920 typedef VOID (*H_fp)();
12921 typedef int (*S_fp)();
12922 #endif
12923
12924 typedef VOID C_f;
12925 typedef VOID H_f;
12926 typedef VOID Z_f;
12927 typedef doublereal E_f;
12928
12929
12930
12931 #ifndef Skip_f2c_Undefs
12932 #undef cray
12933 #undef gcos
12934 #undef mc68010
12935 #undef mc68020
12936 #undef mips
12937 #undef pdp11
12938 #undef sgi
12939 #undef sparc
12940 #undef sun
12941 #undef sun2
12942 #undef sun3
12943 #undef sun4
12944 #undef u370
12945 #undef u3b
12946 #undef u3b2
12947 #undef u3b5
12948 #undef unix
12949 #undef vax
12950 #endif
12951 #endif
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966 struct s_blockin_ {
12967 double temp, fnumin, fnumax, dnu;
12968 } blockin_;
12969
12970 #define blockin_1 blockin_
12971
12972 struct s_app3a_ {
12973 double slit, dx, wnrmax3;
12974 } app3a_;
12975
12976 #define app3a_1 app3a_
12977
12978 struct s_app3b_ {
12979 int nsri, ns, nsriup;
12980 } app3b_;
12981
12982 #define app3b_1 app3b_
12983
12984 struct s_rsilo_ {
12985 double rsilo[201];
12986 } rsilo_;
12987
12988 #define rsilo_1 rsilo_
12989
12990 struct s_bou43_ {
12991 int initb;
12992 } bou43_;
12993
12994 #define bou43_1 bou43_
12995
12996 union u_bba_ {
12997 struct s_m_1 {
12998 double omeg[201], rsi[201], rsigg[201], alfa;
12999 } m_1;
13000 struct s_m_2 {
13001 double omeg[201], rsi[201], rsigg[201], beta;
13002 } m_2;
13003 } bba_;
13004
13005 #define bba_1 (bba_.m_1)
13006 #define bba_2 (bba_.m_2)
13007
13008 struct s_bbc_ {
13009 int nsol;
13010 } bbc_;
13011
13012 #define bbc_1 bbc_
13013
13014 struct s_bf_ {
13015 double g0bf, delbf, om0;
13016 } bf_;
13017
13018 #define bf_1 bf_
13019
13020 struct like_1_ {
13021 int like;
13022 char lgas[5];
13023 };
13024
13025 #define like_1 (*(struct like_1_ *) &like_)
13026
13027 struct s_k1k0_ {
13028 int ik1k0;
13029 } k1k0_;
13030
13031 #define k1k0_1 k1k0_
13032
13033 struct s_bbb_ {
13034 int ibound;
13035 } bbb_;
13036
13037 #define bbb_1 bbb_
13038
13039 struct energ_1_ {
13040 double eb[246] ;
13041 int niv[6];
13042 };
13043
13044 #define energ_1 (*(struct energ_1_ *) &energ_)
13045
13046 struct s_dimer_ {
13047 int nlines;
13048 } dimer_;
13049
13050 #define dimer_1 dimer_
13051
13052 struct n2part_1_ {
13053 double q1, wn2[2], b01, d01;
13054 int jrange2;
13055 };
13056 struct n2part_2_ {
13057 double q, wn2[2], b0, d0;
13058 int jrange1;
13059 };
13060
13061 #define n2part_1 (*(struct n2part_1_ *) &n2part_)
13062 #define n2part_2 (*(struct n2part_2_ *) &n2part_)
13063
13064 union u_bl3_ {
13065 struct s_m_1 {
13066 double rsi[401];
13067 } m_1;
13068 struct s_m_2 {
13069 double rsibb[401];
13070 } m_2;
13071 } bl3_;
13072
13073 #define bl3_1 (bl3_.m_1)
13074 #define bl3_2 (bl3_.m_2)
13075
13076 union u_bbbb_ {
13077 struct s_m_1 {
13078 int idelv, iv, ivp, idell, il, ilp;
13079 } m_1;
13080 struct s_m_2 {
13081 int ldelvi, ivi, ivip, ldelel, ll, llp;
13082 } m_2;
13083 } bbbb_;
13084
13085 #define bbbb_1 (bbbb_.m_1)
13086 #define bbbb_2 (bbbb_.m_2)
13087
13088
13089
13090 struct s_energe_ {
13091 double e_1[246];
13092 int e_2[6];
13093 } energ_ = { {-54.99996, -54.86228, -54.58697, -54.17413, -53.62391,
13094 -52.93648, -52.11211, -51.15108, -50.05374, -48.82049, -47.45179,
13095 -45.94815, -44.31014, -42.53841, -40.63365, -38.59665, -36.42824,
13096 -34.12937, -31.70105, -29.14439, -26.46061, -23.65103, -20.71709,
13097 -17.66041, -14.48271, -11.18593, -7.77221, -4.24393, -.60374,
13098 3.14531, 6.99978, 10.95566, 15.00818, 19.15136, 23.37787,
13099 27.67681, 32.03237, 36.42278, 40.83668, 45.29436, 49.79246,
13100 -31.89437, -31.77215, -31.52779, -31.16143, -30.67334, -30.06382,
13101 -29.33328, -28.48222, -27.51123, -26.42099, -25.21229, -23.88603,
13102 -22.44322, -20.88502, -19.21272, -17.42777, -15.53182, -13.52669,
13103 -11.41446, -9.1975, -6.87848, -4.46049, -1.94714, .65736, 3.34788,
13104 6.11816, 8.95978, 11.8613, 14.80383, 17.75924, 20.71774,
13105 23.71589, 0., 0., 0., 0., 0., 0., 0., 0., 0., -16.05019, -15.9464,
13106 -15.73896, -15.42815, -15.0144, -14.4983, -13.88057, -13.16213,
13107 -12.34407, -11.42771, -10.41455, -9.30639, -8.10531, -6.81376,
13108 -5.43459, -3.97121, -2.42768, -.80899, .87859, 2.62689, 4.42334,
13109 6.24733, 8.06983, 9.90464, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13110 0., 0., 0., 0., 0., 0., 0., -6.49343, -6.41131, -6.24732,
13111 -6.00202, -5.67623, -5.27111, -4.78813, -4.22919, -3.59665,
13112 -2.89345, -2.12325, -1.29074, -.40202, .5345, 1.50455, 2.48212,
13113 3.46665, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13114 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.76583, -1.70887,
13115 -1.59552, -1.427, -1.20523, -.93302, -.61434, -.25504, .13641, 0.,
13116 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13117 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13118 -.17133, -.14341, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13119 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13120 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, {41, 32, 24, 17, 9, 2} }
13121 ;
13122
13123 struct s_n2part_ {
13124 double fill_1[1];
13125 double e_2[4];
13126 int fill_3[1];
13127 } n2part_ = { {0}, {2., 1., 1.98957, 5.8e-6}, {0} };
13128
13129 struct s_like_ {
13130 int fill_1[1];
13131 char e_2[5];
13132 } like_ = { {0}, "N2N2" };
13133
13134
13135
13136
13137
13138
13139
13140 static int cs__1 = 1;
13141 static int cs__0 = 0;
13142 static double c_b24 = 2.9723;
13143 static double c_b25 = -.99569;
13144 static double c_b26 = .09464;
13145 static double c_b27 = 1.2962e-12;
13146 static double c_b28 = -.13048;
13147 static double c_b29 = -.03128;
13148 static double c_b30 = 3.7969e-14;
13149 static double c_b31 = 1.03681;
13150 static double c_b32 = -.14336;
13151 static int cs__2 = 2;
13152 static int cs__3 = 3;
13153 static double c_b43 = .180926;
13154 static double c_b44 = -1.69153;
13155 static double c_b45 = .18605;
13156 static double c_b46 = .3;
13157 static double c_b47 = 0.;
13158 static double c_b49 = 6.6017e-16;
13159 static double c_b50 = 2.59982;
13160 static double c_b51 = -.31831;
13161 static double c_b52 = 1.2481e-12;
13162 static double c_b53 = -.57028;
13163 static double c_b54 = .05983;
13164 static double c_b55 = 5.2681e-13;
13165 static double c_b56 = -.24719;
13166 static double c_b57 = .00519;
13167 static double c_b58 = 2.7518e15;
13168 static double c_b59 = -25.38969;
13169 static double c_b60 = 2.46542;
13170 static int cs__4 = 4;
13171 static int cs__5 = 5;
13172
13173 static double c_b78 = .0825299;
13174 static double c_b79 = -1.25562;
13175 static double c_b80 = .12981;
13176 static double c_b84 = 3.6611e-15;
13177 static double c_b85 = 1.47688;
13178 static double c_b86 = -.16537;
13179 static double c_b87 = 6.1264e-10;
13180 static double c_b88 = -2.25011;
13181 static double c_b89 = .15289;
13182 static double c_b90 = 7.982e-10;
13183 static double c_b91 = -2.76152;
13184 static double c_b92 = .21847;
13185 static double c_b93 = 5.2868e-22;
13186 static double c_b94 = 7.66253;
13187 static double c_b95 = -.77527;
13188 static double c_b112 = 119.261;
13189 static double c_b113 = -3.78587;
13190 static double c_b114 = .34024;
13191 static double c_b115 = 9.3777e-12;
13192 static double c_b116 = -.66548;
13193 static double c_b117 = .0033;
13194 static double c_b118 = 3.0395e-13;
13195 static double c_b119 = .24728;
13196 static double c_b120 = -.06607;
13197 static double c_b183 = 1e-6;
13198 static double c_b186 = 1.5;
13199
13200 #define temp (blockin_1.temp)
13201 #define fnumin (blockin_1.fnumin)
13202 #define fnumax (blockin_1.fnumax)
13203 #define dnu (blockin_1.dnu)
13204 #define slit (app3a_1.slit)
13205 #define dx (app3a_1.dx)
13206 #define rsilo (rsilo_1.rsilo)
13207 #define omeg (bba_1.omeg)
13208 #define rsi (bba_1.rsi)
13209 #define rsigg (bba_1.rsigg)
13210 #define nsol (bbc_1.nsol)
13211 #define like (like_1.like)
13212 #define ik1k0 (k1k0_1.ik1k0)
13213 #define ibound (bbb_1.ibound)
13214
13215
13216 Numeric n2n2tks_(double t, double f)
13217 {
13218
13219 int s__1;
13220 double ret_val;
13221
13222
13223 double hexa[10], quad[10], freq[10], e;
13224 int i__;
13225 double s, x, t1, t2, t3, t4;
13226 int ij, nf, jj;
13227 double rslow1, si;
13228 int nr;
13229 double ss[1], tt[2];
13230 extern int bound32_(double *, double *, int
13231 *), bound54_(double *, double *, int *);
13232 double tksabs[5];
13233 extern int spline_(int *, int *, int *,
13234 double *, double *, double *, double *,
13235 double *, double *, int *, double *);
13236 double dtrans[10], abscoef[10];
13237 extern int addspec_(double *, double *,
13238 double *, double *, double *, double *,
13239 double *, int *, double *, double *, int *,
13240 int *, int *, int *, int *, int *);
13241 double eps, alfatot[10];
13242 extern int partsum_(double *);
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285 ret_val = 0.;
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314 if (t < 50. || t > 300.) {
13315 ostringstream os;
13316 os << "out of T range ( 50<T<300)! return without calc.!" <<"\n";
13317 throw runtime_error(os.str());
13318 goto L999;
13319 }
13320 temp = t;
13321
13322
13323
13324 fnumin = f / 29979245800.;
13325
13326 fnumax = fnumin;
13327
13328 nf = 1;
13329
13330 dnu = 10.;
13331
13332 like = 1;
13333
13334
13335
13336
13337 slit = 4.3;
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347 partsum_(&temp);
13348
13349
13350
13351
13352
13353 x = log(temp);
13354 s__1 = nf;
13355 for (i__ = 1; i__ <= s__1; ++i__) {
13356
13357 freq[i__ - 1] = fnumin;
13358 alfatot[i__ - 1] = 0.;
13359
13360 abscoef[i__ - 1] = 0.;
13361 }
13362
13363
13364
13365
13366
13367 jj = 1;
13368 L442:
13369
13370 ++jj;
13371 if (jj == 42) {
13372 goto L444;
13373 }
13374 goto L442;
13375
13376 L444:
13377
13378
13379
13380
13381
13382
13383
13384
13385 eps = 1e-5;
13386 tt[0] = 10.;
13387 bound32_(&temp, rsi, &nsol);
13388 ij = 0;
13389 rslow1 = 0.;
13390 s__1 = nsol;
13391 for (i__ = 1; i__ <= s__1; ++i__) {
13392 ++ij;
13393
13394 if (ij % 3 == 0) {
13395 rslow1 = 1.5e-60;
13396 }
13397 if (ij % 3 == 1) {
13398 rslow1 = 1.7e-60;
13399 }
13400 if (ij % 3 == 2) {
13401 rslow1 = 1.6e-60;
13402 }
13403 if (rsi[i__ - 1] < 1e-60) {
13404 rsi[i__ - 1] = rslow1;
13405 }
13406
13407 rsilo[i__ - 1] = log(rsi[i__ - 1]) + log(10.) * 80.;
13408 omeg[i__ - 1] = (double) (i__ - 1) * dx;
13409
13410 }
13411
13412
13413
13414 spline_(&nsol, &cs__1, &cs__0, &eps, omeg, rsilo, tt, ss, &si, &nr, rsigg)
13415 ;
13416
13417 ik1k0 = 1;
13418 ibound = 1;
13419
13420
13421
13422
13423 s = c_b24 * exp((c_b26 * x + c_b25) * x);
13424 t1 = c_b27 * exp((c_b29 * x + c_b28) * x);
13425 t2 = c_b30 * exp((c_b32 * x + c_b31) * x);
13426 e = 0.;
13427 t3 = 0.;
13428 t4 = 0.;
13429
13430 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13431 like, &cs__2, &cs__0, &cs__2, &cs__3);
13432 s__1 = nf;
13433 for (i__ = 1; i__ <= s__1; ++i__) {
13434 quad[i__ - 1] = abscoef[i__ - 1];
13435
13436 alfatot[i__ - 1] = abscoef[i__ - 1] + alfatot[i__ - 1];
13437 }
13438
13439
13440
13441
13442
13443
13444
13445
13446 bound54_(&temp, rsi, &nsol);
13447 ij = 0;
13448 s__1 = nsol;
13449 for (i__ = 1; i__ <= s__1; ++i__) {
13450 ++ij;
13451
13452 if (ij % 3 == 0) {
13453 rslow1 = 1.5e-60;
13454 }
13455 if (ij % 3 == 1) {
13456 rslow1 = 1.7e-60;
13457 }
13458 if (ij % 3 == 2) {
13459 rslow1 = 1.6e-60;
13460 }
13461 if (rsi[i__ - 1] < 1e-60) {
13462 rsi[i__ - 1] = rslow1;
13463 }
13464
13465 rsilo[i__ - 1] = log(rsi[i__ - 1]) + log(10.) * 80.;
13466
13467 omeg[i__ - 1] = (double) (i__ - 1) * dx;
13468 }
13469 spline_(&nsol, &cs__1, &cs__0, &eps, omeg, rsilo, tt, ss, &si, &nr, rsigg)
13470 ;
13471
13472
13473
13474
13475
13476 if (temp >= 140.) {
13477 goto L333;
13478 }
13479
13480 s = c_b43 * exp((c_b45 * x + c_b44) * x);
13481 e = c_b46 * exp((c_b47 * x + c_b47) * x);
13482 t1 = c_b49 * exp((c_b51 * x + c_b50) * x);
13483 t2 = c_b52 * exp((c_b54 * x + c_b53) * x);
13484 t3 = c_b55 * exp((c_b57 * x + c_b56) * x);
13485 t4 = c_b58 * exp((c_b60 * x + c_b59) * x);
13486
13487 ik1k0 = 0;
13488 ibound = 1;
13489 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13490 like, &cs__4, &cs__0, &cs__4, &cs__5);
13491 s__1 = nf;
13492 for (i__ = 1; i__ <= s__1; ++i__) {
13493 hexa[i__ - 1] = abscoef[i__ - 1];
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504 alfatot[i__ - 1] += abscoef[i__ - 1];
13505 }
13506 goto L334;
13507
13508
13509
13510
13511
13512 L333:
13513 ik1k0 = 0;
13514 ibound = 1;
13515 s = c_b78 * exp((c_b80 * x + c_b79) * x);
13516 e = c_b46 * exp((c_b47 * x + c_b47) * x);
13517 t1 = c_b84 * exp((c_b86 * x + c_b85) * x);
13518 t2 = c_b87 * exp((c_b89 * x + c_b88) * x);
13519 t3 = c_b90 * exp((c_b92 * x + c_b91) * x);
13520 t4 = c_b93 * exp((c_b95 * x + c_b94) * x);
13521
13522 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13523 like, &cs__4, &cs__0, &cs__4, &cs__5);
13524 s__1 = nf;
13525 for (i__ = 1; i__ <= s__1; ++i__) {
13526 hexa[i__ - 1] = abscoef[i__ - 1];
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537 alfatot[i__ - 1] += abscoef[i__ - 1];
13538 }
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549 L334:
13550 ik1k0 = 1;
13551 ibound = 0;
13552
13553 s = c_b112 * exp((c_b114 * x + c_b113) * x);
13554 t1 = c_b115 * exp((c_b117 * x + c_b116) * x);
13555 t2 = c_b118 * exp((c_b120 * x + c_b119) * x);
13556 t3 = 0.;
13557 t4 = 0.;
13558 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13559 like, &cs__2, &cs__2, &cs__3, &cs__3);
13560 s__1 = nf;
13561 for (i__ = 1; i__ <= s__1; ++i__) {
13562 dtrans[i__ - 1] = abscoef[i__ - 1];
13563
13564 alfatot[i__ - 1] += abscoef[i__ - 1];
13565 }
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590 tksabs[0] = quad[0];
13591 tksabs[1] = hexa[0];
13592 tksabs[2] = dtrans[0];
13593 tksabs[3] = alfatot[0];
13594 ret_val = alfatot[0];
13595
13596 L999:
13597 return ret_val;
13598 }
13599
13600 #undef temp
13601 #undef fnumin
13602 #undef fnumax
13603 #undef dnu
13604 #undef slit
13605 #undef dx
13606 #undef rsilo
13607 #undef omeg
13608 #undef rsi
13609 #undef rsigg
13610 #undef nsol
13611 #undef like
13612 #undef ik1k0
13613 #undef ibound
13614
13615 #define wnrmax3 (app3a_1.wnrmax3)
13616 #define rsilo (rsilo_1.rsilo)
13617 #define omeg (bba_2.omeg)
13618 #define rsigg (bba_2.rsigg)
13619 #define beta (bba_2.beta)
13620 #define nsol (bbc_1.nsol)
13621 #define ibound (bbb_1.ibound)
13622 #define q1 (n2part_1.q1)
13623 #define wn2 (n2part_1.wn2)
13624 #define b01 (n2part_1.b01)
13625 #define d01 (n2part_1.d01)
13626 #define jrange2 (n2part_1.jrange2)
13627
13628
13629
13630
13631
13632
13633 int addspec_(double *g0, double *ep, double *
13634 tau1, double *tau2, double *tau5, double *tau6,
13635 double *temp, int *nf, double *freq, double *abscoef,
13636 int * , int *like, int *lambda1, int *lambda2,
13637 int *lambda, int * )
13638 {
13639
13640
13641 static double closchm = 2.68675484e19;
13642 static double boltzwn = .6950304;
13643 static double hbar = 1.054588757e-27;
13644 static double pi = 3.1415926535898;
13645 static double clight = 2.997925e10;
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655 int s__1, s__2, s__3, s__4, s__5, s__6;
13656 double d__1, d__2;
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666 int list, jsum;
13667 extern double bgama_(double *, double *, double *,
13668 double *, double *, double *, double *);
13669 int i__, j;
13670 double calib, p;
13671 int i1, j1, i2, j2;
13672 double p1, p2, omega1, omega2;
13673 int ip, jp, iq;
13674 double twopic;
13675 int jplusl, ip1, jp1, ip2, jp2;
13676 double fac, cgs, xbg, wkf, frq, wki;
13677 extern double specfct_(double *, double *, double *,
13678 double *, int *, double *), clebsqr_(int *,
13679 int *, int *);
13680 double cg1s, cg2s;
13681
13682
13683
13684
13685
13686
13687
13688
13689
13690
13691
13692
13693
13694
13695
13696
13697
13698 --abscoef;
13699 --freq;
13700
13701
13702
13703 twopic = 2. * pi * clight;
13704 if (*like != 1) {
13705 *like = 0;
13706 }
13707
13708
13709 d__1 = pi;
13710
13711 d__2 = closchm * 1e-30;
13712 calib = twopic * (d__1 * d__1 * 4. / (hbar * 3. * clight)) * (d__2 * d__2)
13713 ;
13714 calib /= (double) (*like + 1);
13715 beta = 1. / (boltzwn * *temp);
13716 list = *nf;
13717 s__1 = list;
13718 for (i__ = 1; i__ <= s__1; ++i__) {
13719
13720 abscoef[i__] = 0.;
13721 }
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740 if (*lambda1 == 0 || *lambda2 == 0) {
13741 goto L152;
13742 }
13743 jplusl = jrange2 + max(*lambda1,*lambda2);
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753 jsum = 0;
13754 s__1 = jrange2;
13755 for (i1 = 1; i1 <= s__1; ++i1) {
13756 j1 = i1 - 1;
13757 s__2 = jplusl;
13758 for (ip1 = 1; ip1 <= s__2; ++ip1) {
13759 jp1 = ip1 - 1;
13760 cg1s = clebsqr_(&j1, lambda1, &jp1);
13761 if (cg1s <= 0.) {
13762 goto L150;
13763 } else {
13764 goto L130;
13765 }
13766 L130:
13767 s__3 = j1 * (j1 + 1);
13768 p1 = (double) (2 * j1 + 1) * wn2[1 + j1 % 2 - 1] * exp(
13769 -1.4387859 / *temp * ((b01 - (double) s__3 * d01) * (
13770 double) s__3)) / q1;
13771 ++jsum;
13772 s__3 = jp1 * ip1;
13773 s__4 = j1 * i1;
13774 omega1 = (b01 - (double) s__3 * d01) * (double) s__3 - (
13775 b01 - (double) s__4 * d01) * (double) s__4;
13776 s__3 = jrange2;
13777 for (i2 = 1; i2 <= s__3; ++i2) {
13778 j2 = i2 - 1;
13779 s__4 = jplusl;
13780 for (ip2 = 1; ip2 <= s__4; ++ip2) {
13781 jp2 = ip2 - 1;
13782 cg2s = clebsqr_(&j2, lambda2, &jp2);
13783 if (cg2s <= 0.) {
13784 goto L148;
13785 } else {
13786 goto L132;
13787 }
13788 L132:
13789 s__5 = j2 * (j2 + 1);
13790 p2 = (double) (2 * j2 + 1) * wn2[1 + j2 % 2 - 1] *
13791 exp(-1.4387859 / *temp * ((b01 - (double)
13792 s__5 * d01) * (double) s__5)) / q1;
13793 s__5 = jp2 * ip2;
13794 s__6 = j2 * i2;
13795 omega2 = (b01 - (double) s__5 * d01) * (double)
13796 s__5 - (b01 - (double) s__6 * d01) * (
13797 double) s__6;
13798 fac = calib * p1 * p2 * cg1s * cg2s;
13799 s__5 = list;
13800 for (i__ = 1; i__ <= s__5; ++i__) {
13801 frq = freq[i__] - omega1 - omega2;
13802 wki = freq[i__] * (1. - exp(-beta * freq[i__]));
13803 wkf = wki * fac;
13804 xbg = *g0 * bgama_(&frq, tau1, tau2, ep, tau5, tau6,
13805 temp);
13806 if (ibound == 0) {
13807 goto L555;
13808 }
13809 if (abs(frq) <= wnrmax3) {
13810 xbg += specfct_(&frq, omeg, rsilo, rsigg, &nsol, &
13811 beta);
13812 }
13813 L555:
13814 abscoef[i__] += xbg * wkf;
13815
13816 }
13817 L148:
13818 ;
13819 }
13820 }
13821 L150:
13822 ;
13823 }
13824 }
13825 goto L2222;
13826
13827
13828 L152:
13829 jplusl = jrange2 + *lambda;
13830 s__2 = jrange2;
13831 for (i__ = 1; i__ <= s__2; ++i__) {
13832 j = i__ - 1;
13833 s__1 = jplusl;
13834 for (ip = 1; ip <= s__1; ++ip) {
13835 jp = ip - 1;
13836 cgs = clebsqr_(&j, lambda, &jp);
13837 if (cgs <= 0.) {
13838 goto L200;
13839 } else {
13840 goto L210;
13841 }
13842 L210:
13843 s__4 = j * (j + 1);
13844 p = (double) (2 * j + 1) * wn2[1 + j % 2 - 1] * exp(
13845 -1.4387859 / *temp * ((b01 - (double) s__4 * d01) * (
13846 double) s__4)) / q1;
13847 ++jsum;
13848 s__4 = jp * ip;
13849 s__3 = j * i__;
13850 omega1 = (b01 - (double) s__4 * d01) * (double) s__4 - (
13851 b01 - (double) s__3 * d01) * (double) s__3;
13852 fac = calib * p * cgs;
13853 s__4 = list;
13854 for (iq = 1; iq <= s__4; ++iq) {
13855 frq = freq[iq] - omega1;
13856
13857 wki = freq[iq] * (1. - exp(-beta * freq[iq]));
13858 wkf = wki * fac;
13859 xbg = *g0 * bgama_(&frq, tau1, tau2, ep, tau5, tau6, temp);
13860 if (ibound == 0) {
13861 goto L444;
13862 }
13863 if (abs(frq) <= wnrmax3) {
13864 xbg += specfct_(&frq, omeg, rsilo, rsigg, &nsol, &beta);
13865 }
13866 L444:
13867 abscoef[iq] += xbg * wkf;
13868
13869 }
13870 L200:
13871 ;
13872 }
13873 }
13874
13875 L2222:
13876
13877
13878 return 0;
13879 }
13880
13881 #undef wnrmax3
13882 #undef rsilo
13883 #undef omeg
13884 #undef rsigg
13885 #undef beta
13886 #undef nsol
13887 #undef ibound
13888 #undef q1
13889 #undef wn2
13890 #undef b01
13891 #undef d01
13892 #undef jrange2
13893
13894 #define q (n2part_2.q)
13895 #define wn2 (n2part_2.wn2)
13896 #define b0 (n2part_2.b0)
13897 #define d0 (n2part_2.d0)
13898 #define jrange1 (n2part_2.jrange1)
13899
13900 int partsum_(double *temp)
13901 {
13902
13903 int s__1;
13904
13905
13906 int j;
13907 double dq;
13908
13909
13910
13911
13912
13913
13914 q = 0.;
13915 j = 0;
13916 L50:
13917 s__1 = j * (j + 1);
13918 dq = (double) (2 * j + 1) * wn2[1 + j % 2 - 1] * exp(-1.4387859 * ((
13919 b0 - (double) s__1 * d0) * (double) s__1) / *temp);
13920 q += dq;
13921 ++j;
13922 if (dq > q / 900.) {
13923 goto L50;
13924 }
13925 jrange1 = j;
13926
13927
13928
13929 return 0;
13930 }
13931
13932 #undef q
13933 #undef wn2
13934 #undef b0
13935 #undef d0
13936 #undef jrange1
13937
13938 #define slit (app3a_1.slit)
13939 #define dx (app3a_1.dx)
13940 #define wnrmax3 (app3a_1.wnrmax3)
13941 #define nsri (app3b_1.nsri)
13942 #define ns (app3b_1.ns)
13943 #define nsriup (app3b_1.nsriup)
13944 #define rsi (bl3_1.rsi)
13945
13946 int profile_(double *x, double *y)
13947 {
13948
13949 int s__1;
13950
13951
13952 int i__;
13953 double slope;
13954 int n1;
13955 double x0;
13956 int nc;
13957 double dr;
13958 int no;
13959 double xi;
13960 int nu;
13961
13962
13963
13964
13965
13966
13967 if (*y < 0.) {
13968 goto L105;
13969 } else if (*y == 0) {
13970 goto L106;
13971 } else {
13972 goto L1;
13973 }
13974 L1:
13975 x0 = nsri + 1. + *x / dx;
13976 nc = (int) x0;
13977 n1 = nc + 1;
13978 slope = *y / slit;
13979 nu = (int) (x0 - ns);
13980 if (nu < 1) {
13981 nu = 1;
13982 }
13983 if (nu > nsriup) {
13984 return 0;
13985 }
13986 no = (int) (x0 + ns);
13987 if (no > nsriup) {
13988 no = nsriup;
13989 }
13990 if (no < 1) {
13991 return 0;
13992 }
13993 if (nc > nsriup) {
13994 nc = nsriup;
13995 }
13996 if (nc <= 1) {
13997 goto L101;
13998 }
13999 s__1 = nc;
14000 for (i__ = nu; i__ <= s__1; ++i__) {
14001 xi = (i__ - 1.) * dx - wnrmax3;
14002 dr = slope * (xi - (*x - slit));
14003 if (dr <= 0.) {
14004 goto L100;
14005 }
14006 rsi[i__ - 1] += dr;
14007 L100:
14008 ;
14009 }
14010 L101:
14011
14012 if (nc >= nsriup) {
14013 return 0;
14014 }
14015 if (n1 < 1) {
14016 n1 = 1;
14017 }
14018 s__1 = no;
14019 for (i__ = n1; i__ <= s__1; ++i__) {
14020 xi = (i__ - 1.) * dx - wnrmax3;
14021 dr = *y - slope * (xi - *x);
14022 if (dr <= 0.) {
14023 goto L102;
14024 }
14025 rsi[i__ - 1] += dr;
14026 L102:
14027 ;
14028 }
14029 return 0;
14030 L105:
14031
14032
14033
14034 L106:
14035 return 0;
14036 }
14037
14038 #undef slit
14039 #undef dx
14040 #undef wnrmax3
14041 #undef nsri
14042 #undef ns
14043 #undef nsriup
14044 #undef rsi
14045
14046
14047
14048
14049 double specfct_(double *freq, double *omega, double *phi,
14050 double *phi2, int *n, double *rtemp)
14051 {
14052
14053 double ret_val;
14054
14055
14056 double tfac, f, gp, si;
14057 int nr;
14058 extern int ixpolat_(int *, int *, int *,
14059 double *, double *, double *, double *,
14060 double *, double *, int *, double *);
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079 --phi2;
14080 --phi;
14081 --omega;
14082
14083
14084 tfac = 0.;
14085 f = *freq;
14086 if (f >= 0.) {
14087 goto L20;
14088 } else {
14089 goto L10;
14090 }
14091 L10:
14092 f = abs(f);
14093 tfac = -(*rtemp) * f;
14094 L20:
14095 if (f <= omega[*n]) {
14096 goto L30;
14097 }
14098 ret_val = exp(-(phi[*n - 1] - phi[*n]) * (f - omega[*n]) / (omega[*n] -
14099 omega[*n - 1]) + phi[*n] + tfac) * 1e-80;
14100
14101
14102
14103 return ret_val;
14104
14105
14106
14107 L30:
14108 ixpolat_(n, &cs__1, &cs__0, &c_b183, &omega[1], &phi[1], &f, &gp, &si, &
14109 nr, &phi2[1]);
14110 ret_val = exp(tfac + gp) * 1e-80;
14111
14112
14113
14114 return ret_val;
14115 }
14116 #define slit (app3a_1.slit)
14117 #define dx (app3a_1.dx)
14118 #define wnrmax3 (app3a_1.wnrmax3)
14119 #define nsri (app3b_1.nsri)
14120 #define ns (app3b_1.ns)
14121 #define nsriup (app3b_1.nsriup)
14122 #define eb (energ_1.eb)
14123 #define niv (energ_1.niv)
14124 #define nlines (dimer_1.nlines)
14125 #define rsibb (bl3_2.rsibb)
14126 #define ldelvi (bbbb_2.ldelvi)
14127 #define ivi (bbbb_2.ivi)
14128 #define ivip (bbbb_2.ivip)
14129 #define ldelel (bbbb_2.ldelel)
14130 #define ll (bbbb_2.ll)
14131 #define llp (bbbb_2.llp)
14132
14133 int bound32_(double *temp, double *rsi, int *
14134 nsol)
14135 {
14136
14137
14138 static int ldelvis[63] = { 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,
14139 1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,
14140 3,4,4,4,4,4,4,4,4 };
14141 static int ivis[63] = { 0,0,1,1,2,2,3,3,4,4,0,0,0,0,1,1,1,1,2,2,2,2,
14142 3,3,3,3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,1,2,0,1,2,0,1,0,1,0,1,2,
14143 0,1,0,1,0,1,0,1 };
14144 static int ivips[63] = { 0,0,1,1,2,2,3,3,4,4,1,1,1,1,2,2,2,2,3,3,3,3,
14145 4,4,4,4,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,3,4,5,3,4,5,3,4,3,4,3,4,5,
14146 4,5,4,5,4,5,4,5 };
14147 static int ldelels[63] = { 1,3,1,3,1,3,1,3,1,3,-3,-1,1,3,-3,-1,1,3,
14148 -3,-1,1,3,3,1,-1,-3,-3,-1,1,3,-3,-1,1,3,-3,-1,1,3,-1,-3,1,3,1,1,1,
14149 -1,-1,-1,-3,-3,3,3,-3,-3,-3,-3,-3,3,3,1,1,-1,-1 };
14150 static double as[63] = { 4.4844e-40,4.4356e-40,2.9345e-40,2.885e-40,
14151 1.6441e-40,1.5899e-40,7.2882e-41,6.7748e-41,1.0378e-41,1.3041e-42,
14152 1.5006e-41,1.537e-41,1.6139e-41,1.7143e-41,1.9985e-41,2.0169e-41,
14153 2.0994e-41,2.2094e-41,1.636e-41,1.6281e-41,1.6714e-41,1.7326e-41,
14154 8.0425e-42,8.0862e-42,8.0093e-42,8.1366e-42,2.4471e-42,2.5406e-42,
14155 2.6629e-42,2.8064e-42,4.6227e-42,4.715e-42,4.8513e-42,5.0133e-42,
14156 3.9968e-42,3.984e-42,3.981e-42,3.9687e-42,1.1806e-42,1.3458e-42,
14157 3.8746e-42,3.9219e-42,7.3334e-43,1.339e-42,1.3041e-42,7.1401e-43,
14158 1.3461e-42,6.5776e-43,6.9847e-43,1.3517e-42,7.5545e-43,1.3268e-42,
14159 6.9847e-43,1.3517e-42,7.464e-43,2.1322e-43,2.6037e-43,2.0823e-43,
14160 2.0632e-43,2.1067e-43,2.0531e-43,2.1218e-43,2.3006e-43 };
14161 static double bs[63] = { 4.3e-4,4.6e-4,8.3e-4,8.9e-4,.0017,.00186,
14162 .0041,.00457,0.,0.,9.99e-4,5.23e-4,1.49e-4,-1.68e-4,.001837,
14163 .001153,6.6e-4,2.54e-4,.003603,.002677,.002101,.001738,.00595,
14164 .006843,0.,.007035,.001025,6.42e-4,2.54e-4,-1.64e-4,.002342,
14165 .001975,.00164,.001328,.004943,.004999,.005461,.006839,0.,.010993,
14166 0.,0.,.001367,.005262,0.,.001601,.00451,0.,.001828,.004175,.04816,
14167 .007033,.001828,.004175,.009338,.003733,.008508,.006979,0.,
14168 .005035,0.,.004169,0. };
14169 static double twopic = 1.88365183e11;
14170 static double pi = 3.141592654;
14171
14172
14173 int s__1;
14174 double d__1;
14175
14176
14177 double alfa;
14178 int nnii, nsol2;
14179 double a, b;
14180 int i__, l, n;
14181 double stoke, stoki, am, pf;
14182 int lp;
14183 double rm;
14184 int nr, iv;
14185 double stokip;
14186 int ivp;
14187 extern double clebsqr_(int *, int *, int *);
14188 extern int profile_(double *, double *);
14189
14190
14191 #define eb_ref(a_1,a_2) eb[(a_2)*41 + a_1 - 42]
14192
14193
14194
14195
14196
14197
14198
14199
14200 --rsi;
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216 nsri = 190;
14217 wnrmax3 = 45.;
14218 nsriup = (nsri << 1) + 1;
14219 dx = wnrmax3 / (double) nsri;
14220 ns = (int) (slit / dx);
14221
14222 for (i__ = 1; i__ <= 401; ++i__) {
14223
14224 rsibb[i__ - 1] = 0.;
14225 }
14226
14227 alfa = 1. / (*temp * .69519);
14228 rm = 2.32498211e-23;
14229
14230
14231 d__1 = rm * 1.380662e-16 * *temp * 2. * pi / 4.3906208382975998e-53;
14232 pf = pow(d__1, c_b186);
14233
14234 pf *= 1e-60;
14235
14236 nr = 0;
14237 L555:
14238 ++nr;
14239 ldelvi = ldelvis[nr - 1];
14240 ivi = ivis[nr - 1];
14241 ivip = ivips[nr - 1];
14242 ldelel = ldelels[nr - 1];
14243 a = as[nr - 1];
14244 b = bs[nr - 1];
14245
14246
14247
14248
14249
14250
14251
14252 iv = ivi + 1;
14253 ivp = ivip + 1;
14254
14255
14256 nnii = niv[iv - 1];
14257
14258 s__1 = nnii;
14259 for (l = 1; l <= s__1; ++l) {
14260
14261
14262 am = a * exp(-b * (double) ((l - 1) * l));
14263
14264 lp = l + ldelel;
14265 ll = l - 1;
14266 llp = lp - 1;
14267
14268
14269 if (lp > niv[ivp - 1] || lp < 1) {
14270 goto L20;
14271 }
14272 if (eb_ref(lp, ivp) == 0.) {
14273 goto L20;
14274 }
14275 if (eb_ref(l, iv) == 0.) {
14276 goto L20;
14277 }
14278 stoke = eb_ref(lp, ivp) - eb_ref(l, iv);
14279
14280 stoki = am * exp(-alfa * eb_ref(l, iv)) / pf * (double) ((ll << 1)
14281 + 1) * clebsqr_(&ll, &cs__3, &llp);
14282
14283 profile_(&stoke, &stoki);
14284 if (stoki > 0.) {
14285 ++nlines;
14286 }
14287
14288 stokip = am * exp(-alfa * eb_ref(lp, ivp)) / pf * (double) ((llp
14289 << 1) + 1) * clebsqr_(&llp, &cs__3, &ll);
14290
14291 d__1 = -stoke;
14292 profile_(&d__1, &stokip);
14293 if (stokip > 0.) {
14294 ++nlines;
14295 }
14296
14297 L20:
14298 ;
14299 }
14300 if (nr == 63) {
14301 goto L56;
14302 }
14303 goto L555;
14304 L56:
14305
14306
14307
14308
14309 s__1 = nsriup;
14310 for (n = 1; n <= s__1; ++n) {
14311
14312 rsibb[n - 1] = rsibb[n - 1] / twopic / slit;
14313 }
14314
14315 *nsol = nsri + 1;
14316 nsol2 = *nsol + 1;
14317
14318
14319 s__1 = *nsol;
14320 for (i__ = 1; i__ <= s__1; ++i__) {
14321
14322 rsi[i__] = rsibb[*nsol - 1 + i__ - 1];
14323 }
14324
14325
14326
14327
14328 return 0;
14329 }
14330
14331 #undef slit
14332 #undef dx
14333 #undef wnrmax3
14334 #undef nsri
14335 #undef ns
14336 #undef nsriup
14337 #undef eb
14338 #undef niv
14339 #undef nlines
14340 #undef rsibb
14341 #undef ldelvi
14342 #undef ivi
14343 #undef ivip
14344 #undef ldelel
14345 #undef ll
14346 #undef llp
14347
14348
14349 #undef eb_ref
14350
14351 #define slit (app3a_1.slit)
14352 #define dx (app3a_1.dx)
14353 #define wnrmax3 (app3a_1.wnrmax3)
14354 #define nsri (app3b_1.nsri)
14355 #define ns (app3b_1.ns)
14356 #define nsriup (app3b_1.nsriup)
14357 #define eb (energ_1.eb)
14358 #define niv (energ_1.niv)
14359 #define nlines (dimer_1.nlines)
14360 #define rsibb (bl3_2.rsibb)
14361
14362 int bound54_(double *temp, double *rsi, int *
14363 nsol)
14364 {
14365
14366
14367 static int ldelvis[54] = { 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
14368 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
14369 };
14370 static int ivis[54] = { 0,0,0,1,1,1,2,2,2,3,3,3,0,0,0,0,0,0,1,1,1,1,
14371 1,1,2,2,2,2,2,2,3,3,3,3,3,3,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2 };
14372 static int ivips[54] = { 0,0,0,1,1,1,2,2,2,3,3,3,1,1,1,1,1,1,2,2,2,2,
14373 2,2,3,3,3,3,3,3,4,4,4,4,4,4,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4 };
14374 static int ldelels[54] = { 1,3,5,1,3,5,1,3,5,1,3,5,-5,-3,-1,1,3,5,-5,
14375 -3,-1,1,3,5,-5,-3,-1,1,3,5,-5,-3,-1,1,3,5,-5,-3,-1,1,3,5,-5,-3,-1,
14376 1,3,5,-5,-3,-1,1,3,5 };
14377 static double as[54] = { 7.9332e-42,7.8207e-42,7.7235e-42,4.5815e-42,
14378 4.4834e-42,4.4059e-42,2.173e-42,2.0824e-42,2.025e-42,7.7222e-43,
14379 7.0351e-43,6.6815e-43,4.9611e-43,5.2232e-43,5.2979e-43,5.4652e-43,
14380 5.6827e-43,5.9277e-43,5.733e-43,6.062e-43,6.0862e-43,6.2104e-43,
14381 6.3809e-43,6.5698e-43,3.9501e-43,4.1599e-43,4.1033e-43,4.1097e-43,
14382 4.1339e-43,4.153e-43,1.5858e-43,1.5976e-43,1.5478e-43,1.5066e-43,
14383 1.4554e-43,1.3848e-43,9.9241e-44,1.0109e-43,1.0396e-43,1.0758e-43,
14384 1.1176e-43,1.1636e-43,1.646e-43,1.647e-43,1.6617e-43,1.6837e-43,
14385 1.7085e-43,1.7327e-43,1.1797e-43,1.1593e-43,1.1405e-43,1.1174e-43,
14386 1.0853e-43,1.0401e-43 };
14387 static double bs[54] = { 6.12e-4,6.35e-4,6.77e-4,.001137,.001201,
14388 .001341,.00229,.002449,.00287,.005426,.005876,.00745,.001,8.83e-4,
14389 6.09e-4,3.92e-4,2.07e-4,3.7e-5,.001625,.001624,.001305,.001084,
14390 9.27e-4,8.21e-4,.002978,.003273,.002994,.002954,.003153,.003668,
14391 .005799,.006423,.006733,.00796,.010937,.019179,.001229,9.93e-4,
14392 7.67e-4,5.43e-4,3.09e-4,5.1e-5,.002456,.0023,.00221,.002193,
14393 .002273,.002506,.004556,.004825,.005454,.006725,.009431,.016672 };
14394 static double twopic = 1.88365183e11;
14395 static double pi = 3.141592654;
14396
14397
14398 int s__1;
14399 double d__1;
14400
14401
14402 double alfa;
14403 int nnii, ivip, nsol2;
14404 double a, b;
14405 int i__, l, n;
14406 double stoke, stoki, am, pf;
14407 int ll, lp;
14408 double rm;
14409 int nr, ldelel, iv, ldelvi;
14410 double stokip;
14411 int ivi, llp, ivp;
14412 extern double clebsqr_(int *, int *, int *);
14413 extern int profile_(double *, double *);
14414
14415
14416 #define eb_ref(a_1,a_2) eb[(a_2)*41 + a_1 - 42]
14417
14418
14419
14420
14421
14422
14423
14424
14425
14426
14427
14428
14429 --rsi;
14430
14431
14432
14433
14434
14435
14436
14437
14438
14439
14440 nsri = 190;
14441 wnrmax3 = 47.;
14442 nsriup = (nsri << 1) + 1;
14443 dx = wnrmax3 / (double) nsri;
14444 ns = (int) (slit / dx);
14445
14446 for (i__ = 1; i__ <= 401; ++i__) {
14447
14448 rsibb[i__ - 1] = 0.;
14449 }
14450 alfa = 1. / (*temp * .69519);
14451 rm = 2.32498211e-23;
14452
14453
14454 d__1 = rm * 1.380662e-16 * *temp * 2. * pi / 4.3906208382975998e-53;
14455 pf = pow(d__1, c_b186);
14456
14457 pf *= 1e-60;
14458
14459 nr = 0;
14460 L555:
14461 ++nr;
14462 ldelvi = ldelvis[nr - 1];
14463 ivi = ivis[nr - 1];
14464 ivip = ivips[nr - 1];
14465 ldelel = ldelels[nr - 1];
14466 a = as[nr - 1];
14467 b = bs[nr - 1];
14468
14469
14470
14471
14472
14473
14474 iv = ivi + 1;
14475 ivp = ivip + 1;
14476 nnii = niv[iv - 1];
14477 s__1 = nnii;
14478 for (l = 1; l <= s__1; ++l) {
14479 am = a * exp(-b * (double) (l * (l + 1)));
14480 lp = l + ldelel;
14481 ll = l - 1;
14482 llp = lp - 1;
14483 if (lp > niv[ivp - 1] || lp < 1) {
14484 goto L20;
14485 }
14486 if (eb_ref(lp, ivp) == 0.) {
14487 goto L20;
14488 }
14489 if (eb_ref(l, iv) == 0.) {
14490 goto L20;
14491 }
14492
14493 stoke = eb_ref(lp, ivp) - eb_ref(l, iv);
14494 stoki = am * exp(-alfa * eb_ref(l, iv)) / pf * (double) ((ll << 1)
14495 + 1) * clebsqr_(&ll, &cs__5, &llp);
14496 profile_(&stoke, &stoki);
14497 if (stoki > 0.) {
14498 ++nlines;
14499 }
14500 stokip = am * exp(-alfa * eb_ref(lp, ivp)) / pf * (double) ((llp
14501 << 1) + 1) * clebsqr_(&llp, &cs__5, &ll);
14502 d__1 = -stoke;
14503 profile_(&d__1, &stokip);
14504 if (stokip > 0.) {
14505 ++nlines;
14506 }
14507 L20:
14508 ;
14509 }
14510 if (nr == 54) {
14511 goto L56;
14512 }
14513
14514 goto L555;
14515 L56:
14516
14517
14518 s__1 = nsriup;
14519 for (n = 1; n <= s__1; ++n) {
14520
14521 rsibb[n - 1] = rsibb[n - 1] / twopic / slit;
14522 }
14523
14524 *nsol = nsri + 1;
14525 nsol2 = *nsol + 1;
14526
14527 s__1 = *nsol;
14528 for (i__ = 1; i__ <= s__1; ++i__) {
14529
14530 rsi[i__] = rsibb[*nsol - 1 + i__ - 1];
14531 }
14532
14533
14534
14535
14536 return 0;
14537 }
14538
14539 #undef slit
14540 #undef dx
14541 #undef wnrmax3
14542 #undef nsri
14543 #undef ns
14544 #undef nsriup
14545 #undef eb
14546 #undef niv
14547 #undef nlines
14548 #undef rsibb
14549
14550
14551 #undef eb_ref
14552
14553
14554 double clebsqr_0_(int n__, int *l, int *lambda, int *lp)
14555 {
14556
14557 int s__1, s__2;
14558 double ret_val, d__1;
14559
14560
14561 extern double fctl_(int *);
14562 double f;
14563 int i__;
14564 double p;
14565 int i0, i1;
14566 double fc;
14567
14568
14569
14570
14571
14572
14573 switch(n__) {
14574 case 1: goto L_threej2;
14575 }
14576
14577 fc = (double) ((*lp << 1) + 1);
14578 goto L2;
14579
14580
14581 L_threej2:
14582
14583
14584
14585
14586
14587
14588
14589
14590 fc = 1.;
14591 L2:
14592 ret_val = 0.;
14593 if (*l + *lambda < *lp || *lambda + *lp < *l || *l + *lp < *lambda) {
14594 return ret_val;
14595 }
14596 if ((*l + *lp + *lambda) % 2 != 0) {
14597 return ret_val;
14598 }
14599 if (*l < 0 || *lp < 0 || *lambda < 0) {
14600 return ret_val;
14601 }
14602 f = 1. / (double) (*l + *lp + 1 - *lambda);
14603 if (*lambda == 0) {
14604 goto L22;
14605 }
14606 i1 = (*l + *lp + *lambda) / 2;
14607 i0 = (*l + *lp - *lambda) / 2 + 1;
14608 s__1 = i1;
14609 for (i__ = i0; i__ <= s__1; ++i__) {
14610
14611 f = f * (double) i__ / (double) (((i__ << 1) + 1) << 1);
14612 }
14613 L22:
14614 s__1 = *lambda + *l - *lp;
14615 s__2 = *lambda + *lp - *l;
14616 p = fc * f * fctl_(&s__1) * fctl_(&s__2);
14617 s__1 = (*lambda + *l - *lp) / 2;
14618 s__2 = (*lambda + *lp - *l) / 2;
14619
14620 d__1 = fctl_(&s__1) * fctl_(&s__2);
14621 ret_val = p / (d__1 * d__1);
14622 return ret_val;
14623 }
14624
14625 double clebsqr_(int *l, int *lambda, int *lp)
14626 {
14627 return clebsqr_0_(0, l, lambda, lp);
14628 }
14629
14630 double threej2_(void)
14631 {
14632 return clebsqr_0_(1, (int *)0, (int *)0, (int *)0);
14633 }
14634
14635 double fctl_(int *n)
14636 {
14637
14638 int s__1;
14639 double ret_val, d__1;
14640
14641
14642 int i__, j;
14643 double z__;
14644
14645
14646
14647 ret_val = 1.;
14648 if (*n <= 1) {
14649 return ret_val;
14650 }
14651 if (*n > 15) {
14652 goto L20;
14653 }
14654 j = 1;
14655 s__1 = *n;
14656 for (i__ = 2; i__ <= s__1; ++i__) {
14657
14658 j *= i__;
14659 }
14660 ret_val = (double) j;
14661 return ret_val;
14662 L20:
14663 z__ = (double) (*n + 1);
14664 d__1 = z__ - .5;
14665 ret_val = exp(-z__) * pow(z__, d__1) * ((((-2.294720936e-4 / z__ -
14666 .00268132716) / z__ + .003472222222) / z__ + .08333333333) / z__
14667 + 1.) * 2.506628274631;
14668 return ret_val;
14669 }
14670 #define ik1k0 (k1k0_1.ik1k0)
14671
14672 double bgama_(double *fnu, double *t1, double *t2, double
14673 *eps, double *t3, double *t4, double *temp)
14674 {
14675
14676
14677 static double pi = 3.1415926535898;
14678 static double clight = 29979245800.;
14679 static double hbar = 1.0545887e-27;
14680 static double boltz = 1.380662e-16;
14681
14682
14683 double ret_val, d__1, d__2, d__3, d__4;
14684
14685
14686 double omega, z__, k0, t0, bgambc, zp, xk1;
14687
14688
14689
14690
14691
14692
14693
14694
14695
14696 omega = 2. * pi * clight * *fnu;
14697 t0 = hbar / (boltz * 2. * *temp);
14698
14699 d__1 = omega * *t1;
14700 z__ = sqrt((d__1 * d__1 + 1.) * (*t2 * *t2 + t0 * t0)) / *t1;
14701 if (z__ - 2. <= 0.) {
14702 goto L10;
14703 } else {
14704 goto L12;
14705 }
14706 L10:
14707
14708 d__2 = z__ / 3.75;
14709 d__1 = d__2 * d__2;
14710
14711 d__4 = z__ / 2.;
14712 d__3 = d__4 * d__4;
14713 xk1 = z__ * z__ * log(z__ / 2.) * ((((((3.2411e-4 * d__1 + .00301532) *
14714 d__1 + .02658733) * d__1 + .15084934) * d__1 + .51498869) * d__1
14715 + .87890594) * d__1 + .5) + ((((((-4.686e-5 * d__3 - .00110404) *
14716 d__3 - .01919402) * d__3 - .18156897) * d__3 - .67278579) * d__3
14717 + .15443144) * d__3 + 1.);
14718 goto L20;
14719 L12:
14720 d__1 = 2. / z__;
14721 xk1 = sqrt(z__) * exp(-z__) * ((((((-6.8245e-4 * d__1 + .00325614) * d__1
14722 - .00780353) * d__1 + .01504268) * d__1 - .0365562) * d__1 +
14723 .23498619) * d__1 + 1.25331414);
14724 L20:
14725
14726 d__1 = *t1 * omega;
14727 bgambc = *t1 / pi * exp(*t2 / *t1 + t0 * omega) * xk1 / (d__1 * d__1 + 1.)
14728 ;
14729 if (ik1k0 == 1) {
14730 goto L55;
14731 }
14732
14733 d__1 = omega * *t4;
14734 zp = sqrt((d__1 * d__1 + 1.) * (*t3 * *t3 + t0 * t0)) / *t4;
14735 if (zp - 2. <= 0.) {
14736 goto L22;
14737 } else {
14738 goto L24;
14739 }
14740 L22:
14741
14742 d__2 = zp / 3.75;
14743 d__1 = d__2 * d__2;
14744
14745 d__4 = zp / 2.;
14746 d__3 = d__4 * d__4;
14747 k0 = -log(zp / 2.) * ((((((.0045813 * d__1 + .0360768) * d__1 + .2659732)
14748 * d__1 + 1.2067492) * d__1 + 3.0899424) * d__1 + 3.5156229) *
14749 d__1 + 1.) + ((((((7.4e-6 * d__3 + 1.075e-4) * d__3 + .00262698) *
14750 d__3 + .0348859) * d__3 + .23069756) * d__3 + .4227842) * d__3 -
14751 .57721566);
14752 goto L30;
14753 L24:
14754 d__1 = 2. / zp;
14755 k0 = exp(-zp) * ((((((5.3208e-4 * d__1 - .0025154) * d__1 + .00587872) *
14756 d__1 - .01062446) * d__1 + .02189568) * d__1 - .07832358) * d__1
14757 + 1.25331414) / sqrt(zp);
14758 L30:
14759 ret_val = (bgambc + *eps * (*t3 / pi) * exp(*t3 / *t4 + t0 * omega) * k0)
14760 / (*eps + 1.);
14761 goto L66;
14762 L55:
14763 ret_val = bgambc;
14764 L66:
14765 return ret_val;
14766 }
14767
14768 #undef ik1k0
14769
14770
14771 int spline_0_(int n__, int *l, int *m, int *k,
14772 double *eps, double *x, double *y, double *t,
14773 double *ss, double *si, int *nr, double *s2)
14774 {
14775
14776 int s__1, s__2;
14777 double d__1, d__2;
14778
14779
14780 double epsi, prod, h__;
14781 int i__, j, n;
14782 double w, omega;
14783 int n1;
14784 double s3;
14785 int ic;
14786 double sm, delsqs, ht1, ht2, ss2, yp1, eta, ypn;
14787
14788
14789
14790
14791
14792
14793
14794
14795
14796
14797
14798
14799
14800
14801
14802
14803
14804
14805 --x;
14806 --y;
14807 --t;
14808 --ss;
14809 --s2;
14810
14811
14812 switch(n__) {
14813 case 1: goto L_ixpolat;
14814 }
14815
14816 n = *l;
14817 n1 = n - 1;
14818 *nr = 0;
14819
14820 s__1 = n1;
14821 for (i__ = 2; i__ <= s__1; ++i__) {
14822
14823 s__2 = i__ - 1;
14824 s2[i__] = 3. * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) - (y[
14825 s__2 + 1] - y[s__2]) / (x[s__2 + 1] - x[s__2])) / (x[i__ + 1]
14826 - x[i__ - 1]) / 1.5;
14827 }
14828 omega = 1.0717968;
14829 ic = 0;
14830
14831 s2[1] = 0.;
14832 s2[n] = 0.;
14833 L5:
14834 eta = 0.;
14835 ++ic;
14836 sm = abs(s2[1]);
14837 s__2 = n;
14838 for (i__ = 2; i__ <= s__2; ++i__) {
14839 if ((d__1 = s2[i__], abs(d__1)) > sm) {
14840 sm = (d__2 = s2[i__], abs(d__2));
14841 }
14842
14843 }
14844 epsi = *eps * sm;
14845
14846 s__2 = n1;
14847 for (i__ = 2; i__ <= s__2; ++i__) {
14848
14849 s__1 = i__ - 1;
14850 w = (3. * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) - (y[s__1 +
14851 1] - y[s__1]) / (x[s__1 + 1] - x[s__1])) / (x[i__ + 1] - x[
14852 i__ - 1]) - (x[i__] - x[i__ - 1]) * .5 / (x[i__ + 1] - x[i__
14853 - 1]) * s2[i__ - 1] - (.5 - (x[i__] - x[i__ - 1]) * .5 / (x[
14854 i__ + 1] - x[i__ - 1])) * s2[i__ + 1] - s2[i__]) * omega;
14855
14856 if (abs(w) - eta <= 0.) {
14857 goto L10;
14858 } else {
14859 goto L9;
14860 }
14861 L9:
14862 eta = abs(w);
14863 L10:
14864 s2[i__] += w;
14865 }
14866
14867 if (eta - epsi >= 0.) {
14868 goto L5;
14869 } else {
14870 goto L14;
14871 }
14872
14873
14874 L_ixpolat:
14875
14876
14877 n = *l;
14878 n1 = n - 1;
14879 *nr = 0;
14880 ic = -1;
14881 L14:
14882 if (*k - 2 != 0) {
14883 goto L15;
14884 } else {
14885 goto L20;
14886 }
14887 L15:
14888 s__2 = *m;
14889 for (j = 1; j <= s__2; ++j) {
14890
14891 i__ = 1;
14892
14893 if ((d__1 = t[j] - x[1]) < 0.) {
14894 goto L58;
14895 } else if (d__1 == 0) {
14896 goto L17;
14897 } else {
14898 goto L55;
14899 }
14900 L55:
14901 if ((d__1 = t[j] - x[n]) < 0.) {
14902 goto L57;
14903 } else if (d__1 == 0) {
14904 goto L59;
14905 } else {
14906 goto L158;
14907 }
14908 L56:
14909 if ((d__1 = t[j] - x[i__]) < 0.) {
14910 goto L60;
14911 } else if (d__1 == 0) {
14912 goto L17;
14913 } else {
14914 goto L57;
14915 }
14916 L57:
14917 ++i__;
14918 goto L56;
14919
14920 L58:
14921 ++(*nr);
14922 ht1 = t[j] - x[1];
14923 ht2 = t[j] - x[2];
14924 yp1 = (y[cs__1 + 1] - y[cs__1]) / (x[cs__1 + 1] - x[cs__1]) + (x[1] -
14925 x[2]) * (s2[1] * 2. + s2[2]) / 6.;
14926 if (*k < 0) {
14927 goto L72;
14928 } else if (*k == 0) {
14929 goto L70;
14930 } else {
14931 goto L71;
14932 }
14933 L71:
14934 ss[j] = yp1 + ht1 * s2[1];
14935 goto L61;
14936 L70:
14937 ss[j] = y[1] + yp1 * ht1 + s2[1] * ht1 * ht1 / 2.;
14938 goto L61;
14939 L72:
14940 ss[j] = s2[i__];
14941 goto L61;
14942 L158:
14943 ht2 = t[j] - x[n];
14944 ht1 = t[j] - x[n1];
14945 ++(*nr);
14946 ypn = (y[n1 + 1] - y[n1]) / (x[n1 + 1] - x[n1]) + (x[n] - x[n1]) * (
14947 s2[n1] + s2[n] * 2.) / 6.;
14948 if (*k < 0) {
14949 goto L82;
14950 } else if (*k == 0) {
14951 goto L80;
14952 } else {
14953 goto L81;
14954 }
14955 L81:
14956 ss[j] = ypn + ht2 * s2[n];
14957 goto L61;
14958 L80:
14959 ss[j] = y[n] + ypn * ht2 + s2[n] * ht2 * ht2 / 2.;
14960 goto L61;
14961 L82:
14962 ss[j] = s2[n];
14963 goto L61;
14964
14965 L59:
14966 i__ = n;
14967 L60:
14968 --i__;
14969 L17:
14970 ht1 = t[j] - x[i__];
14971 ht2 = t[j] - x[i__ + 1];
14972 prod = ht1 * ht2;
14973 s3 = (s2[i__ + 1] - s2[i__]) / (x[i__ + 1] - x[i__]);
14974 ss2 = s2[i__] + ht1 * s3;
14975 delsqs = (s2[i__] + s2[i__ + 1] + ss2) / 6.;
14976
14977 if (*k < 0) {
14978 goto L43;
14979 } else if (*k == 0) {
14980 goto L41;
14981 } else {
14982 goto L42;
14983 }
14984 L41:
14985 ss[j] = y[i__] + ht1 * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]))
14986 + prod * delsqs;
14987 goto L61;
14988 L42:
14989 ss[j] = (y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) + (ht1 + ht2) *
14990 delsqs + prod * s3 / 6.;
14991 goto L61;
14992 L43:
14993 ss[j] = ss2;
14994 L61:
14995 ;
14996 }
14997 L20:
14998 *si = 0.;
14999
15000 s__2 = n1;
15001 for (i__ = 1; i__ <= s__2; ++i__) {
15002 h__ = x[i__ + 1] - x[i__];
15003
15004
15005 d__1 = h__;
15006 *si = *si + h__ * .5 * (y[i__] + y[i__ + 1]) - d__1 * (d__1 * d__1) *
15007 (s2[i__] + s2[i__ + 1]) / 24.;
15008 }
15009
15010 if (*k == 2) {
15011 *nr = ic;
15012 }
15013
15014 return 0;
15015 }
15016
15017 int spline_(int *l, int *m, int *k,
15018 double *eps, double *x, double *y, double *t,
15019 double *ss, double *si, int *nr, double *s2)
15020 {
15021 return spline_0_(0, l, m, k, eps, x, y, t, ss, si, nr, s2);
15022 }
15023
15024 int ixpolat_(int *l, int *m, int *k,
15025 double *eps, double *x, double *y, double *t,
15026 double *ss, double *si, int *nr, double *s2)
15027 {
15028 return spline_0_(1, l, m, k, eps, x, y, t, ss, si, nr, s2);
15029 }
15030
15031
15032
15033
15034
15035
15036
15037
15038
15039
15040 struct fh2oa_1_ {
15041 double fh2o[2003];
15042 };
15043
15044 #define fh2oa_1 (*(struct fh2oa_1_ *) &fh2oa_)
15045
15046 struct fh2ob_1_ {
15047 double v1, v2, dv;
15048 int nptfh2o;
15049 };
15050 struct fh2ob_2_ {
15051 double v1, v2, dv;
15052 int npts;
15053 };
15054
15055 #define fh2ob_1 (*(struct fh2ob_1_ *) &fh2ob_)
15056 #define fh2ob_2 (*(struct fh2ob_2_ *) &fh2ob_)
15057
15058 struct sh2oa_1_ {
15059 double swv296[2003];
15060 };
15061
15062 #define sh2oa_1 (*(struct sh2oa_1_ *) &sh2oa_)
15063
15064 struct sh2ob_1_ {
15065 double v1, v2, dv;
15066 int nptslfwv;
15067 };
15068 struct sh2ob_2_ {
15069 double v1, v2, dv;
15070 int npts;
15071 };
15072
15073 #define sh2ob_1 (*(struct sh2ob_1_ *) &sh2ob_)
15074 #define sh2ob_2 (*(struct sh2ob_2_ *) &sh2ob_)
15075
15076 struct s260a_1_ {
15077 double swv260[2003];
15078 };
15079
15080 #define s260a_1 (*(struct s260a_1_ *) &s260a_)
15081
15082 struct s260b_1_ {
15083 double v1___, v2___, dv___;
15084 int nptslfwv___;
15085 };
15086 struct s260b_2_ {
15087 double v1, v2, dv;
15088 int npts;
15089 };
15090
15091 #define s260b_1 (*(struct s260b_1_ *) &s260b_)
15092 #define s260b_2 (*(struct s260b_2_ *) &s260b_)
15093
15094 struct consts_1_ {
15095 double pi, planck, boltz, clight, avogad, alosmt, gascon, radcn1,
15096 radcn2;
15097 };
15098
15099 #define consts_1 (*(struct consts_1_ *) &consts_)
15100
15101
15102
15103 struct s_fh2oa_ {
15104 double e_1[2003];
15105 } fh2oa_ = { {.012859, .011715, .011038, .011715, .012859, .015326,
15106 .016999, .018321, .019402, .01957, .019432, .017572, .01676,
15107 .01548, .013984, .012266, .010467, .0094526, .0080485, .0069484,
15108 .0061416, .0050941, .0044836, .0038133, .0034608, .0031487,
15109 .0024555, .0020977, .0017266, .001492, .0012709, 9.8081e-4,
15110 8.5063e-4, 6.8822e-4, 5.3809e-4, 4.4679e-4, 3.3774e-4, 2.7979e-4,
15111 2.1047e-4, 1.6511e-4, 1.2993e-4, 9.3033e-5, 7.436e-5, 5.6428e-5,
15112 4.5442e-5, 3.4575e-5, 2.7903e-5, 2.1374e-5, 1.6075e-5, 1.3022e-5,
15113 1.0962e-5, 8.5959e-6, 6.9125e-6, 5.3808e-6, 4.3586e-6, 3.6394e-6,
15114 2.9552e-6, 2.3547e-6, 1.8463e-6, 1.6036e-6, 1.3483e-6, 1.1968e-6,
15115 1.0333e-6, 8.4484e-7, 6.7195e-7, 5.0947e-7, 4.2343e-7, 3.4453e-7,
15116 2.783e-7, 2.3063e-7, 1.9951e-7, 1.7087e-7, 1.4393e-7, 1.2575e-7,
15117 1.075e-7, 8.2325e-8, 5.7524e-8, 4.4482e-8, 3.8106e-8, 3.4315e-8,
15118 2.9422e-8, 2.5069e-8, 2.2402e-8, 1.9349e-8, 1.6152e-8, 1.2208e-8,
15119 8.966e-9, 7.1322e-9, 6.1028e-9, 5.2938e-9, 4.535e-9, 3.4977e-9,
15120 2.9511e-9, 2.4734e-9, 2.0508e-9, 1.8507e-9, 1.6373e-9, 1.5171e-9,
15121 1.3071e-9, 1.2462e-9, 1.2148e-9, 1.259e-9, 1.3153e-9, 1.3301e-9,
15122 1.4483e-9, 1.6944e-9, 2.0559e-9, 2.2954e-9, 2.6221e-9, 3.2606e-9,
15123 4.2392e-9, 5.2171e-9, 6.2553e-9, 8.2548e-9, 9.5842e-9, 1.128e-8,
15124 1.3628e-8, 1.7635e-8, 2.1576e-8, 2.4835e-8, 3.0014e-8, 3.8485e-8,
15125 4.744e-8, 5.5202e-8, 7.0897e-8, 9.6578e-8, 1.3976e-7, 1.8391e-7,
15126 2.3207e-7, 2.996e-7, 4.0408e-7, 5.926e-7, 7.8487e-7, 1.0947e-6,
15127 1.4676e-6, 1.9325e-6, 2.6587e-6, 3.4534e-6, 4.4376e-6, 5.8061e-6,
15128 7.0141e-6, 8.4937e-6, 1.0186e-5, 1.2034e-5, 1.3837e-5, 1.6595e-5,
15129 1.9259e-5, 2.162e-5, 2.3681e-5, 2.7064e-5, 3.251e-5, 3.546e-5,
15130 3.9109e-5, 4.2891e-5, 4.7757e-5, 5.0981e-5, 5.0527e-5, 4.8618e-5,
15131 4.4001e-5, 3.7982e-5, 3.2667e-5, 2.7794e-5, 2.491e-5, 2.4375e-5,
15132 2.7316e-5, 3.2579e-5, 3.5499e-5, 3.801e-5, 4.1353e-5, 4.3323e-5,
15133 4.3004e-5, 3.979e-5, 3.7718e-5, 3.636e-5, 3.2386e-5, 2.7409e-5,
15134 2.3626e-5, 2.0631e-5, 1.8371e-5, 1.5445e-5, 1.2989e-5, 1.1098e-5,
15135 9.6552e-6, 8.0649e-6, 7.2365e-6, 5.9137e-6, 5.2759e-6, 4.886e-6,
15136 4.1321e-6, 3.5918e-6, 2.764e-6, 2.4892e-6, 2.1018e-6, 1.7848e-6,
15137 1.5855e-6, 1.3569e-6, 1.1986e-6, 9.4693e-7, 7.4097e-7, 6.3443e-7,
15138 4.8131e-7, 4.0942e-7, 3.3316e-7, 2.8488e-7, 2.3461e-7, 1.7397e-7,
15139 1.4684e-7, 1.0953e-7, 8.5396e-8, 6.9261e-8, 5.4001e-8, 4.543e-8,
15140 3.2791e-8, 2.5995e-8, 2.0225e-8, 1.571e-8, 1.3027e-8, 1.0229e-8,
15141 8.5277e-9, 6.5249e-9, 5.0117e-9, 3.9906e-9, 3.2332e-9, 2.7847e-9,
15142 2.457e-9, 2.3359e-9, 2.0599e-9, 1.8436e-9, 1.6559e-9, 1.491e-9,
15143 1.2794e-9, 9.8229e-10, 8.0054e-10, 6.0769e-10, 4.5646e-10,
15144 3.3111e-10, 2.4428e-10, 1.8007e-10, 1.3291e-10, 9.7974e-11,
15145 7.8271e-11, 6.3833e-11, 5.4425e-11, 4.6471e-11, 4.0209e-11,
15146 3.5227e-11, 3.1212e-11, 2.884e-11, 2.7762e-11, 2.7935e-11,
15147 3.2012e-11, 3.9525e-11, 5.0303e-11, 6.8027e-11, 9.3954e-11,
15148 1.2986e-10, 1.8478e-10, 2.5331e-10, 3.4827e-10, 4.6968e-10,
15149 6.238e-10, 7.9106e-10, 1.0026e-9, 1.2102e-9, 1.4146e-9, 1.6154e-9,
15150 1.751e-9, 1.8575e-9, 1.8742e-9, 1.87e-9, 1.8582e-9, 1.9657e-9,
15151 2.1204e-9, 2.0381e-9, 2.0122e-9, 2.0436e-9, 2.1213e-9, 2.0742e-9,
15152 1.987e-9, 2.0465e-9, 2.1556e-9, 2.2222e-9, 2.1977e-9, 2.1047e-9,
15153 1.9334e-9, 1.7357e-9, 1.5754e-9, 1.4398e-9, 1.4018e-9, 1.5459e-9,
15154 1.7576e-9, 2.1645e-9, 2.948e-9, 4.4439e-9, 5.8341e-9, 8.0757e-9,
15155 1.1658e-8, 1.6793e-8, 2.2694e-8, 2.9468e-8, 3.9278e-8, 5.2145e-8,
15156 6.4378e-8, 7.7947e-8, 8.5321e-8, 9.7848e-8, 1.0999e-7, 1.1489e-7,
15157 1.2082e-7, 1.2822e-7, 1.4053e-7, 1.5238e-7, 1.5454e-7, 1.5018e-7,
15158 1.4048e-7, 1.2359e-7, 1.0858e-7, 9.3486e-8, 8.1638e-8, 7.769e-8,
15159 8.4625e-8, 1.0114e-7, 1.143e-7, 1.2263e-7, 1.3084e-7, 1.338e-7,
15160 1.3573e-7, 1.3441e-7, 1.2962e-7, 1.2638e-7, 1.1934e-7, 1.1371e-7,
15161 1.0871e-7, 9.8843e-8, 9.1877e-8, 9.105e-8, 9.3213e-8, 9.2929e-8,
15162 1.0155e-7, 1.1263e-7, 1.237e-7, 1.3636e-7, 1.54e-7, 1.7656e-7,
15163 2.1329e-7, 2.3045e-7, 2.5811e-7, 2.9261e-7, 3.4259e-7, 4.077e-7,
15164 4.8771e-7, 5.8081e-7, 7.2895e-7, 8.7482e-7, 1.0795e-6, 1.3384e-6,
15165 1.7208e-6, 2.0677e-6, 2.5294e-6, 3.1123e-6, 3.79e-6, 4.7752e-6,
15166 5.6891e-6, 6.6261e-6, 7.6246e-6, 8.773e-6, 9.6672e-6, 1.098e-5,
15167 1.1287e-5, 1.167e-5, 1.1635e-5, 1.1768e-5, 1.2039e-5, 1.2253e-5,
15168 1.3294e-5, 1.4005e-5, 1.3854e-5, 1.342e-5, 1.3003e-5, 1.2645e-5,
15169 1.1715e-5, 1.1258e-5, 1.1516e-5, 1.2494e-5, 1.3655e-5, 1.4931e-5,
15170 1.4649e-5, 1.3857e-5, 1.312e-5, 1.1791e-5, 1.0637e-5, 8.276e-6,
15171 6.5821e-6, 5.1959e-6, 4.0158e-6, 3.0131e-6, 2.0462e-6, 1.4853e-6,
15172 1.0365e-6, 7.3938e-7, 4.9752e-7, 3.4148e-7, 2.4992e-7, 1.8363e-7,
15173 1.4591e-7, 1.138e-7, 9.0588e-8, 7.3697e-8, 6.0252e-8, 5.1868e-8,
15174 4.266e-8, 3.6163e-8, 3.2512e-8, 2.9258e-8, 2.4238e-8, 2.1209e-8,
15175 1.6362e-8, 1.3871e-8, 1.2355e-8, 9.694e-9, 7.7735e-9, 6.2278e-9,
15176 5.2282e-9, 4.3799e-9, 3.5545e-9, 2.7527e-9, 2.095e-9, 1.6344e-9,
15177 1.2689e-9, 1.0403e-9, 8.488e-10, 6.3461e-10, 4.7657e-10,
15178 3.522e-10, 2.7879e-10, 2.3021e-10, 1.6167e-10, 1.1732e-10,
15179 8.9206e-11, 7.0596e-11, 5.831e-11, 4.4084e-11, 3.1534e-11,
15180 2.5068e-11, 2.2088e-11, 2.2579e-11, 2.2637e-11, 2.5705e-11,
15181 3.2415e-11, 4.6116e-11, 6.5346e-11, 9.4842e-11, 1.2809e-10,
15182 1.8211e-10, 2.4052e-10, 3.027e-10, 3.5531e-10, 4.2402e-10,
15183 4.673e-10, 4.7942e-10, 4.6813e-10, 4.5997e-10, 4.5788e-10,
15184 4.0311e-10, 3.7367e-10, 3.3149e-10, 2.9281e-10, 2.5231e-10,
15185 2.1152e-10, 1.9799e-10, 1.8636e-10, 1.9085e-10, 2.0786e-10,
15186 2.2464e-10, 2.3785e-10, 2.5684e-10, 2.7499e-10, 2.6962e-10,
15187 2.6378e-10, 2.6297e-10, 2.6903e-10, 2.7035e-10, 2.5394e-10,
15188 2.5655e-10, 2.7184e-10, 2.9013e-10, 3.0585e-10, 3.0791e-10,
15189 3.1667e-10, 3.4343e-10, 3.7365e-10, 4.0269e-10, 4.726e-10,
15190 5.6584e-10, 6.9791e-10, 8.6569e-10, 1.0393e-9, 1.2067e-9,
15191 1.5047e-9, 1.8583e-9, 2.2357e-9, 2.6498e-9, 3.2483e-9, 3.9927e-9,
15192 4.6618e-9, 5.5555e-9, 6.6609e-9, 8.2139e-9, 1.0285e-8, 1.3919e-8,
15193 1.8786e-8, 2.515e-8, 3.313e-8, 4.5442e-8, 6.337e-8, 9.0628e-8,
15194 1.2118e-7, 1.5927e-7, 2.1358e-7, 2.7825e-7, 3.7671e-7, 4.4894e-7,
15195 5.4442e-7, 6.224e-7, 7.3004e-7, 8.3384e-7, 8.7933e-7, 8.808e-7,
15196 8.6939e-7, 8.6541e-7, 8.2055e-7, 7.7278e-7, 7.5989e-7, 8.6909e-7,
15197 9.7945e-7, 1.0394e-6, 1.0646e-6, 1.1509e-6, 1.2017e-6, 1.1915e-6,
15198 1.1259e-6, 1.1549e-6, 1.1938e-6, 1.2356e-6, 1.2404e-6, 1.1716e-6,
15199 1.1149e-6, 1.0073e-6, 8.9845e-7, 7.6639e-7, 6.1517e-7, 5.0887e-7,
15200 4.1269e-7, 3.2474e-7, 2.5698e-7, 1.8893e-7, 1.4009e-7, 1.034e-7,
15201 7.7724e-8, 5.7302e-8, 4.2178e-8, 2.9603e-8, 2.1945e-8, 1.6301e-8,
15202 1.2806e-8, 1.0048e-8, 7.897e-9, 6.1133e-9, 4.9054e-9, 4.1985e-9,
15203 3.6944e-9, 3.2586e-9, 2.7362e-9, 2.3647e-9, 2.1249e-9, 1.8172e-9,
15204 1.6224e-9, 1.5158e-9, 1.2361e-9, 1.0682e-9, 9.2312e-10, 7.922e-10,
15205 6.8174e-10, 5.6147e-10, 4.8268e-10, 4.1534e-10, 3.3106e-10,
15206 2.8275e-10, 2.4584e-10, 2.0742e-10, 1.784e-10, 1.4664e-10,
15207 1.239e-10, 1.0497e-10, 8.5038e-11, 6.7008e-11, 5.6355e-11,
15208 4.3323e-11, 3.6914e-11, 3.2262e-11, 3.0749e-11, 3.0318e-11,
15209 2.9447e-11, 2.9918e-11, 3.0668e-11, 3.1315e-11, 3.0329e-11,
15210 2.8259e-11, 2.6065e-11, 2.3578e-11, 2.0469e-11, 1.6908e-11,
15211 1.4912e-11, 1.1867e-11, 9.973e-12, 8.1014e-12, 6.7528e-12,
15212 6.3133e-12, 5.8599e-12, 6.0145e-12, 6.5105e-12, 7.0537e-12,
15213 7.4973e-12, 7.8519e-12, 8.5039e-12, 9.1995e-12, 1.0694e-11,
15214 1.1659e-11, 1.2685e-11, 1.3087e-11, 1.3222e-11, 1.2634e-11,
15215 1.1077e-11, 9.6259e-12, 8.3202e-12, 7.4857e-12, 6.8069e-12,
15216 6.7496e-12, 7.3116e-12, 8.0171e-12, 8.6394e-12, 9.2659e-12,
15217 1.0048e-11, 1.0941e-11, 1.2226e-11, 1.3058e-11, 1.5193e-11,
15218 1.8923e-11, 2.3334e-11, 2.8787e-11, 3.6693e-11, 4.8295e-11,
15219 6.426e-11, 8.8269e-11, 1.1865e-10, 1.5961e-10, 2.0605e-10,
15220 2.7349e-10, 3.7193e-10, 4.8216e-10, 6.1966e-10, 7.715e-10,
15221 1.0195e-9, 1.2859e-9, 1.6535e-9, 2.0316e-9, 2.3913e-9, 3.0114e-9,
15222 3.7495e-9, 4.6504e-9, 5.9145e-9, 7.684e-9, 1.0304e-8, 1.301e-8,
15223 1.6441e-8, 2.1475e-8, 2.5892e-8, 2.9788e-8, 3.382e-8, 4.0007e-8,
15224 4.4888e-8, 4.5765e-8, 4.6131e-8, 4.6239e-8, 4.4849e-8, 4.0729e-8,
15225 3.6856e-8, 3.6164e-8, 3.7606e-8, 4.1457e-8, 4.375e-8, 5.115e-8,
15226 5.6054e-8, 6.1586e-8, 6.4521e-8, 6.6494e-8, 6.9024e-8, 6.8893e-8,
15227 7.0901e-8, 6.976e-8, 7.1485e-8, 7.074e-8, 7.3764e-8, 7.6618e-8,
15228 8.4182e-8, 9.3838e-8, 1.0761e-7, 1.2851e-7, 1.4748e-7, 1.8407e-7,
15229 2.2109e-7, 2.6392e-7, 2.9887e-7, 3.4493e-7, 4.0336e-7, 4.3551e-7,
15230 4.9231e-7, 5.0728e-7, 5.3781e-7, 5.3285e-7, 5.4496e-7, 5.5707e-7,
15231 5.6944e-7, 6.1123e-7, 6.4317e-7, 6.4581e-7, 6.1999e-7, 6.0191e-7,
15232 5.7762e-7, 5.7241e-7, 5.7013e-7, 6.016e-7, 6.6905e-7, 7.4095e-7,
15233 8.2121e-7, 8.0947e-7, 7.6145e-7, 7.2193e-7, 6.3722e-7, 5.4316e-7,
15234 4.2186e-7, 3.2528e-7, 2.5207e-7, 1.8213e-7, 1.2658e-7, 8.6746e-8,
15235 6.0216e-8, 4.1122e-8, 2.8899e-8, 2.174e-8, 1.799e-8, 1.5593e-8,
15236 1.397e-8, 1.2238e-8, 1.0539e-8, 9.2386e-9, 7.8481e-9, 6.8704e-9,
15237 5.7615e-9, 5.0434e-9, 4.6886e-9, 4.377e-9, 3.9768e-9, 3.5202e-9,
15238 3.1854e-9, 2.9009e-9, 2.5763e-9, 2.2135e-9, 1.9455e-9, 1.6248e-9,
15239 1.3368e-9, 1.0842e-9, 8.4254e-10, 6.7414e-10, 5.4667e-10,
15240 4.5005e-10, 3.4932e-10, 2.6745e-10, 2.2053e-10, 1.8162e-10,
15241 1.4935e-10, 1.1618e-10, 9.1888e-11, 8.0672e-11, 6.8746e-11,
15242 6.2668e-11, 5.5715e-11, 4.5074e-11, 3.7669e-11, 3.2082e-11,
15243 2.8085e-11, 2.4838e-11, 1.9791e-11, 1.6964e-11, 1.3887e-11,
15244 1.1179e-11, 9.7499e-12, 7.8255e-12, 6.3698e-12, 5.3265e-12,
15245 4.6588e-12, 4.4498e-12, 3.9984e-12, 3.7513e-12, 3.7176e-12,
15246 3.9148e-12, 4.2702e-12, 5.009e-12, 6.5801e-12, 8.7787e-12,
15247 1.2718e-11, 1.8375e-11, 2.5304e-11, 3.5403e-11, 4.8842e-11,
15248 6.484e-11, 8.0911e-11, 1.0136e-10, 1.2311e-10, 1.4203e-10,
15249 1.5869e-10, 1.8093e-10, 2.137e-10, 2.5228e-10, 2.8816e-10,
15250 3.4556e-10, 3.986e-10, 4.435e-10, 4.776e-10, 5.2357e-10,
15251 6.0827e-10, 6.3635e-10, 6.5886e-10, 6.8753e-10, 7.2349e-10,
15252 7.2789e-10, 6.8232e-10, 6.6081e-10, 6.4232e-10, 6.3485e-10,
15253 6.4311e-10, 7.2235e-10, 7.7263e-10, 8.1668e-10, 9.0324e-10,
15254 9.7643e-10, 1.0535e-9, 1.0195e-9, 1.0194e-9, 1.0156e-9,
15255 9.6792e-10, 9.2725e-10, 8.7347e-10, 8.4484e-10, 8.2647e-10,
15256 8.4363e-10, 9.1261e-10, 1.0051e-9, 1.1511e-9, 1.4037e-9,
15257 1.8066e-9, 2.4483e-9, 3.2739e-9, 4.3194e-9, 5.6902e-9, 7.7924e-9,
15258 9.7376e-9, 1.2055e-8, 1.4303e-8, 1.6956e-8, 1.9542e-8, 2.2233e-8,
15259 2.5186e-8, 2.7777e-8, 2.8943e-8, 2.8873e-8, 2.9417e-8, 2.7954e-8,
15260 2.7524e-8, 2.704e-8, 3.1254e-8, 3.6843e-8, 3.7797e-8, 3.8713e-8,
15261 4.0135e-8, 4.2824e-8, 4.3004e-8, 4.0279e-8, 4.2781e-8, 4.522e-8,
15262 4.8948e-8, 5.0172e-8, 4.8499e-8, 4.7182e-8, 4.2204e-8, 3.7701e-8,
15263 3.0972e-8, 2.4654e-8, 1.9543e-8, 1.4609e-8, 1.1171e-8, 8.3367e-9,
15264 6.3791e-9, 5.079e-9, 4.0655e-9, 3.3658e-9, 2.7882e-9, 2.4749e-9,
15265 2.2287e-9, 2.0217e-9, 1.8191e-9, 1.5897e-9, 1.4191e-9, 1.2448e-9,
15266 1.0884e-9, 9.3585e-10, 7.9429e-10, 7.3214e-10, 6.5008e-10,
15267 5.7549e-10, 5.43e-10, 4.7251e-10, 4.3451e-10, 3.8446e-10,
15268 3.5589e-10, 3.4432e-10, 2.8209e-10, 2.462e-10, 2.1278e-10,
15269 1.8406e-10, 1.6314e-10, 1.3261e-10, 1.1696e-10, 9.6865e-11,
15270 7.6814e-11, 6.6411e-11, 5.0903e-11, 4.0827e-11, 3.0476e-11,
15271 2.323e-11, 1.7707e-11, 1.3548e-11, 1.0719e-11, 9.3026e-12,
15272 8.7967e-12, 8.3136e-12, 7.3918e-12, 6.5293e-12, 5.9243e-12,
15273 5.3595e-12, 3.5266e-12, 2.2571e-12, 1.615e-12, 1.1413e-12,
15274 8.4998e-13, 7.0803e-13, 5.1747e-13, 4.0694e-13, 3.6528e-13,
15275 3.367e-13, 3.1341e-13, 2.939e-13, 2.868e-13, 3.1283e-13,
15276 3.7294e-13, 5.0194e-13, 6.7919e-13, 1.0455e-12, 1.523e-12,
15277 2.3932e-12, 3.4231e-12, 5.0515e-12, 7.3193e-12, 9.9406e-12,
15278 1.2193e-11, 1.4742e-11, 1.9269e-11, 2.1816e-11, 2.275e-11,
15279 2.2902e-11, 2.3888e-11, 2.4902e-11, 2.216e-11, 2.0381e-11,
15280 1.9903e-11, 2.0086e-11, 1.9304e-11, 2.0023e-11, 2.2244e-11,
15281 2.545e-11, 3.1228e-11, 3.456e-11, 3.6923e-11, 3.7486e-11,
15282 3.8124e-11, 3.8317e-11, 3.4737e-11, 3.3037e-11, 3.1724e-11,
15283 2.984e-11, 2.8301e-11, 2.5857e-11, 2.3708e-11, 1.9452e-11,
15284 1.6232e-11, 1.5174e-11, 1.4206e-11, 1.4408e-11, 1.5483e-11,
15285 1.8642e-11, 2.3664e-11, 3.0181e-11, 4.016e-11, 5.2287e-11,
15286 7.2754e-11, 1.0511e-10, 1.4531e-10, 2.0998e-10, 2.6883e-10,
15287 3.3082e-10, 4.2638e-10, 5.3132e-10, 6.3617e-10, 7.1413e-10,
15288 8.5953e-10, 9.9715e-10, 1.0796e-9, 1.0978e-9, 1.1052e-9,
15289 1.1095e-9, 1.0641e-9, 9.7881e-10, 9.659e-10, 1.0332e-9, 1.1974e-9,
15290 1.3612e-9, 1.5829e-9, 1.8655e-9, 2.1465e-9, 2.4779e-9, 2.737e-9,
15291 2.9915e-9, 3.3037e-9, 3.6347e-9, 3.9587e-9, 4.4701e-9, 5.0122e-9,
15292 5.8044e-9, 6.1916e-9, 6.9613e-9, 7.7863e-9, 8.282e-9, 9.4359e-9,
15293 9.7387e-9, 1.0656e-8, 1.0746e-8, 1.121e-8, 1.1905e-8, 1.2194e-8,
15294 1.3145e-8, 1.3738e-8, 1.3634e-8, 1.3011e-8, 1.2511e-8, 1.1805e-8,
15295 1.2159e-8, 1.239e-8, 1.3625e-8, 1.5678e-8, 1.7886e-8, 1.9933e-8,
15296 1.9865e-8, 1.9e-8, 1.7812e-8, 1.5521e-8, 1.2593e-8, 9.5635e-9,
15297 7.2987e-9, 5.2489e-9, 3.5673e-9, 2.4206e-9, 1.6977e-9, 1.2456e-9,
15298 9.3744e-10, 7.8379e-10, 6.996e-10, 6.6451e-10, 6.8521e-10,
15299 7.4234e-10, 8.6658e-10, 9.4972e-10, 1.0791e-9, 1.2359e-9,
15300 1.3363e-9, 1.5025e-9, 1.5368e-9, 1.6152e-9, 1.6184e-9, 1.6557e-9,
15301 1.7035e-9, 1.6916e-9, 1.7237e-9, 1.7175e-9, 1.6475e-9, 1.5335e-9,
15302 1.4272e-9, 1.3282e-9, 1.3459e-9, 1.4028e-9, 1.5192e-9, 1.7068e-9,
15303 1.9085e-9, 2.1318e-9, 2.102e-9, 1.9942e-9, 1.8654e-9, 1.6391e-9,
15304 1.3552e-9, 1.0186e-9, 7.854e-10, 5.7022e-10, 3.9247e-10,
15305 2.5441e-10, 1.6699e-10, 1.1132e-10, 6.8989e-11, 4.5255e-11,
15306 3.1106e-11, 2.3161e-11, 1.7618e-11, 1.438e-11, 1.1601e-11,
15307 9.7148e-12, 8.4519e-12, 6.5392e-12, 5.4113e-12, 4.7624e-12,
15308 4.0617e-12, 3.6173e-12, 2.8608e-12, 2.2724e-12, 1.7436e-12,
15309 1.3424e-12, 1.0358e-12, 7.3064e-13, 5.45e-13, 4.0551e-13,
15310 2.8642e-13, 2.1831e-13, 1.686e-13, 1.2086e-13, 1.015e-13,
15311 9.355e-14, 8.4105e-14, 7.3051e-14, 6.9796e-14, 7.9949e-14,
15312 1.0742e-13, 1.5639e-13, 2.1308e-13, 3.1226e-13, 4.6853e-13,
15313 6.6917e-13, 1.0088e-12, 1.4824e-12, 2.2763e-12, 3.3917e-12,
15314 4.4585e-12, 6.3187e-12, 8.4189e-12, 1.1302e-11, 1.3431e-11,
15315 1.5679e-11, 1.9044e-11, 2.2463e-11, 2.3605e-11, 2.3619e-11,
15316 2.3505e-11, 2.3805e-11, 2.2549e-11, 1.9304e-11, 1.8382e-11,
15317 1.7795e-11, 1.8439e-11, 1.9146e-11, 2.1966e-11, 2.6109e-11,
15318 3.1883e-11, 3.7872e-11, 4.3966e-11, 4.8789e-11, 5.3264e-11,
15319 5.9705e-11, 6.3744e-11, 7.0163e-11, 7.9114e-11, 8.8287e-11,
15320 9.9726e-11, 1.1498e-10, 1.37e-10, 1.6145e-10, 1.9913e-10,
15321 2.2778e-10, 2.6216e-10, 2.977e-10, 3.3405e-10, 3.7821e-10,
15322 3.9552e-10, 4.1322e-10, 4.0293e-10, 4.0259e-10, 3.8853e-10,
15323 3.7842e-10, 3.8551e-10, 4.4618e-10, 5.0527e-10, 5.0695e-10,
15324 5.1216e-10, 5.193e-10, 5.5794e-10, 5.332e-10, 5.2008e-10,
15325 5.6888e-10, 6.1883e-10, 6.9006e-10, 6.9505e-10, 6.6768e-10,
15326 6.329e-10, 5.6753e-10, 5.0327e-10, 3.983e-10, 3.1147e-10,
15327 2.4416e-10, 1.886e-10, 1.3908e-10, 9.9156e-11, 7.3779e-11,
15328 5.6048e-11, 4.2457e-11, 3.4505e-11, 2.9881e-11, 2.7865e-11,
15329 2.8471e-11, 3.1065e-11, 3.4204e-11, 3.914e-11, 4.3606e-11,
15330 4.9075e-11, 5.3069e-11, 5.5236e-11, 5.5309e-11, 5.3832e-11,
15331 5.3183e-11, 5.1783e-11, 5.2042e-11, 5.4422e-11, 5.5656e-11,
15332 5.4409e-11, 5.2659e-11, 5.1696e-11, 5.1726e-11, 4.9003e-11,
15333 4.905e-11, 5.17e-11, 5.6818e-11, 6.3129e-11, 6.6542e-11,
15334 6.4367e-11, 5.9908e-11, 5.447e-11, 4.7903e-11, 3.9669e-11,
15335 2.9651e-11, 2.2286e-11, 1.6742e-11, 1.1827e-11, 7.7739e-12,
15336 4.8805e-12, 3.1747e-12, 2.0057e-12, 1.255e-12, 8.7434e-13,
15337 6.2755e-13, 4.9752e-13, 4.0047e-13, 3.5602e-13, 3.093e-13,
15338 2.4903e-13, 1.9316e-13, 1.4995e-13, 1.2059e-13, 8.7242e-14,
15339 6.4511e-14, 5.33e-14, 4.3741e-14, 3.4916e-14, 2.656e-14,
15340 1.6923e-14, 1.1816e-14, 6.7071e-15, 3.6474e-15, 2.0686e-15,
15341 1.1925e-15, 6.8948e-16, 3.9661e-16, 2.2576e-16, 1.2669e-16,
15342 6.9908e-17, 3.7896e-17, 2.028e-17, 1.1016e-17, 6.7816e-18,
15343 6.0958e-18, 8.9913e-18, 1.7201e-17, 3.4964e-17, 7.0722e-17,
15344 1.402e-16, 2.7167e-16, 5.1478e-16, 9.55e-16, 1.7376e-15,
15345 3.1074e-15, 5.4789e-15, 9.564e-15, 1.6635e-14, 2.9145e-14,
15346 5.2179e-14, 8.8554e-14, 1.4764e-13, 2.3331e-13, 3.5996e-13,
15347 5.2132e-13, 6.3519e-13, 7.3174e-13, 8.3752e-13, 9.8916e-13,
15348 1.1515e-12, 1.4034e-12, 1.6594e-12, 2.1021e-12, 2.7416e-12,
15349 3.4135e-12, 4.5517e-12, 5.5832e-12, 7.2303e-12, 9.9484e-12,
15350 1.2724e-11, 1.6478e-11, 2.0588e-11, 2.5543e-11, 3.3625e-11,
15351 4.1788e-11, 5.0081e-11, 6.0144e-11, 6.9599e-11, 8.4408e-11,
15352 9.7143e-11, 1.0805e-10, 1.1713e-10, 1.2711e-10, 1.3727e-10,
15353 1.4539e-10, 1.6049e-10, 1.768e-10, 2.0557e-10, 2.4967e-10,
15354 3.0096e-10, 3.5816e-10, 4.0851e-10, 4.6111e-10, 5.2197e-10,
15355 5.5043e-10, 6.0324e-10, 6.4983e-10, 6.7498e-10, 7.0545e-10,
15356 7.068e-10, 7.5218e-10, 7.5723e-10, 7.784e-10, 8.0081e-10,
15357 8.0223e-10, 7.7271e-10, 7.1676e-10, 6.7819e-10, 6.4753e-10,
15358 6.5844e-10, 7.0163e-10, 7.7503e-10, 8.8152e-10, 9.9022e-10,
15359 1.0229e-9, 9.9296e-10, 8.9911e-10, 7.7813e-10, 6.3785e-10,
15360 4.7491e-10, 3.528e-10, 2.4349e-10, 1.6502e-10, 1.1622e-10,
15361 8.6715e-11, 6.736e-11, 5.391e-11, 4.5554e-11, 4.13e-11,
15362 3.9728e-11, 3.9e-11, 3.9803e-11, 4.1514e-11, 4.3374e-11,
15363 4.6831e-11, 4.8921e-11, 5.1995e-11, 5.7242e-11, 6.2759e-11,
15364 7.0801e-11, 7.4555e-11, 7.9754e-11, 8.7616e-11, 9.1171e-11,
15365 1.0349e-10, 1.1047e-10, 1.2024e-10, 1.299e-10, 1.3725e-10,
15366 1.5005e-10, 1.5268e-10, 1.5535e-10, 1.5623e-10, 1.5009e-10,
15367 1.4034e-10, 1.3002e-10, 1.2225e-10, 1.1989e-10, 1.2411e-10,
15368 1.3612e-10, 1.5225e-10, 1.7202e-10, 1.9471e-10, 1.9931e-10,
15369 1.9079e-10, 1.7478e-10, 1.5259e-10, 1.2625e-10, 9.3332e-11,
15370 6.8796e-11, 4.6466e-11, 2.9723e-11, 1.8508e-11, 1.2106e-11,
15371 8.0142e-12, 5.4066e-12, 3.9329e-12, 3.1665e-12, 2.742e-12,
15372 2.3996e-12, 2.3804e-12, 2.3242e-12, 2.4476e-12, 2.5331e-12,
15373 2.3595e-12, 2.2575e-12, 2.1298e-12, 2.0088e-12, 1.8263e-12,
15374 1.6114e-12, 1.4422e-12, 1.2946e-12, 1.0837e-12, 9.1282e-13,
15375 7.2359e-13, 5.3307e-13, 3.8837e-13, 2.6678e-13, 1.6769e-13,
15376 1.0826e-13, 7.2364e-14, 4.5201e-14, 3.0808e-14, 2.2377e-14,
15377 1.704e-14, 9.2181e-15, 5.2934e-15, 3.5774e-15, 3.1431e-15,
15378 3.7647e-15, 5.6428e-15, 9.5139e-15, 1.7322e-14, 2.8829e-14,
15379 4.7708e-14, 6.9789e-14, 9.7267e-14, 1.4662e-13, 1.9429e-13,
15380 2.5998e-13, 3.6636e-13, 4.796e-13, 6.5129e-13, 7.7638e-13,
15381 9.3774e-13, 1.1467e-12, 1.3547e-12, 1.5686e-12, 1.6893e-12,
15382 1.9069e-12, 2.1352e-12, 2.3071e-12, 2.4759e-12, 2.8247e-12,
15383 3.4365e-12, 4.3181e-12, 5.6107e-12, 7.0017e-12, 8.6408e-12,
15384 1.0974e-11, 1.3742e-11, 1.6337e-11, 2.0157e-11, 2.3441e-11,
15385 2.6733e-11, 3.0247e-11, 3.3737e-11, 3.8618e-11, 4.1343e-11,
15386 4.387e-11, 4.4685e-11, 4.4881e-11, 4.5526e-11, 4.3628e-11,
15387 4.4268e-11, 4.6865e-11, 5.3426e-11, 5.402e-11, 5.3218e-11,
15388 5.4587e-11, 5.636e-11, 5.774e-11, 5.6426e-11, 6.0399e-11,
15389 6.6981e-11, 7.4319e-11, 7.7977e-11, 7.5539e-11, 7.161e-11,
15390 6.4606e-11, 5.5498e-11, 4.3944e-11, 3.3769e-11, 2.5771e-11,
15391 1.9162e-11, 1.3698e-11, 1.0173e-11, 7.8925e-12, 6.1938e-12,
15392 4.7962e-12, 4.0811e-12, 3.3912e-12, 2.8625e-12, 2.4504e-12,
15393 2.2188e-12, 2.2139e-12, 2.2499e-12, 2.2766e-12, 2.3985e-12,
15394 2.5459e-12, 2.9295e-12, 3.4196e-12, 3.6155e-12, 4.0733e-12,
15395 4.461e-12, 4.9372e-12, 5.4372e-12, 5.7304e-12, 6.164e-12,
15396 6.1278e-12, 6.294e-12, 6.4947e-12, 6.8174e-12, 7.519e-12,
15397 8.2608e-12, 8.4971e-12, 8.3484e-12, 8.1888e-12, 7.8552e-12,
15398 7.8468e-12, 7.5943e-12, 7.9096e-12, 8.6869e-12, 9.1303e-12,
15399 9.2547e-12, 8.9322e-12, 8.2177e-12, 7.3408e-12, 5.7956e-12,
15400 4.447e-12, 3.5881e-12, 2.6748e-12, 1.7074e-12, 9.67e-13,
15401 5.2645e-13, 2.9943e-13, 1.7316e-13, 1.0039e-13, 5.7859e-14,
15402 3.2968e-14, 1.8499e-14, 1.0192e-14, 5.5015e-15, 2.904e-15,
15403 1.4968e-15, 7.5244e-16, 3.6852e-16, 1.7568e-16, 8.1464e-17,
15404 3.6717e-17, 1.6076e-17, 6.8341e-18, 2.8195e-18, 1.1286e-18, 0.,
15405 0., 0., 0., 0., 0., 0., 0., 0., 1.407e-18, 3.0405e-18, 6.4059e-18,
15406 1.3169e-17, 2.6443e-17, 5.1917e-17, 9.9785e-17, 1.8802e-16,
15407 3.4788e-16, 6.3328e-16, 1.137e-15, 2.0198e-15, 3.5665e-15,
15408 6.3053e-15, 1.1309e-14, 2.1206e-14, 3.2858e-14, 5.5165e-14,
15409 8.6231e-14, 1.2776e-13, 1.778e-13, 2.5266e-13, 3.6254e-13,
15410 5.1398e-13, 6.8289e-13, 8.7481e-13, 1.1914e-12, 1.6086e-12,
15411 2.0469e-12, 2.5761e-12, 3.4964e-12, 4.498e-12, 5.5356e-12,
15412 6.7963e-12, 8.572e-12, 1.07e-11, 1.2983e-11, 1.627e-11,
15413 1.9609e-11, 2.2668e-11, 2.5963e-11, 3.0918e-11, 3.493e-11,
15414 3.933e-11, 4.4208e-11, 4.6431e-11, 5.1141e-11, 5.4108e-11,
15415 5.8077e-11, 6.505e-11, 7.2126e-11, 8.1064e-11, 8.1973e-11,
15416 8.1694e-11, 8.3081e-11, 8.024e-11, 7.9225e-11, 7.6256e-11,
15417 7.8468e-11, 8.0041e-11, 8.1585e-11, 8.3485e-11, 8.3774e-11,
15418 8.587e-11, 8.6104e-11, 8.8516e-11, 9.0814e-11, 9.2522e-11,
15419 8.8913e-11, 7.8381e-11, 6.8568e-11, 5.6797e-11, 4.4163e-11,
15420 3.2369e-11, 2.3259e-11, 1.6835e-11, 1.1733e-11, 8.5273e-12,
15421 6.3805e-12, 4.8983e-12, 3.8831e-12, 3.261e-12, 2.8577e-12,
15422 2.521e-12, 2.2913e-12, 2.0341e-12, 1.8167e-12, 1.6395e-12,
15423 1.489e-12, 1.3516e-12, 1.2542e-12, 1.291e-12, 1.3471e-12,
15424 1.4689e-12, 1.5889e-12, 1.6989e-12, 1.8843e-12, 2.0902e-12,
15425 2.3874e-12, 2.7294e-12, 3.3353e-12, 4.0186e-12, 4.5868e-12,
15426 5.2212e-12, 5.8856e-12, 6.5991e-12, 7.2505e-12, 7.6637e-12,
15427 8.5113e-12, 9.4832e-12, 9.9678e-12, 1.0723e-11, 1.0749e-11,
15428 1.138e-11, 1.1774e-11, 1.1743e-11, 1.2493e-11, 1.2559e-11,
15429 1.2332e-11, 1.1782e-11, 1.1086e-11, 1.0945e-11, 1.1178e-11,
15430 1.2083e-11, 1.3037e-11, 1.473e-11, 1.645e-11, 1.7403e-11,
15431 1.7004e-11, 1.5117e-11, 1.3339e-11, 1.0844e-11, 8.0915e-12,
15432 5.6615e-12, 3.7196e-12, 2.5194e-12, 1.6569e-12, 1.1201e-12,
15433 8.2335e-13, 6.027e-13, 4.8205e-13, 4.1313e-13, 3.6243e-13,
15434 3.2575e-13, 2.773e-13, 2.5292e-13, 2.3062e-13, 2.1126e-13,
15435 2.1556e-13, 2.1213e-13, 2.2103e-13, 2.1927e-13, 2.0794e-13,
15436 1.9533e-13, 1.6592e-13, 1.4521e-13, 1.1393e-13, 8.3772e-14,
15437 6.2077e-14, 4.3337e-14, 2.7165e-14, 1.6821e-14, 9.5407e-15,
15438 5.3093e-15, 3.032e-15, 1.7429e-15, 9.9828e-16, 5.6622e-16,
15439 3.1672e-16, 1.7419e-16, 9.3985e-17, 4.9656e-17, 2.5652e-17,
15440 1.2942e-17, 6.3695e-18, 3.0554e-18, 1.4273e-18, -0., -0., -0.,
15441 -0., -0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15442 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15443 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15444 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15445 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15446 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15447 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15448 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15449 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15450 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15451 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15452 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.} };
15453
15454 struct s_fh2ob_ {
15455 double e_1[3];
15456 int e_2;
15457 } fh2ob_ = { {-20., 2e4, 10.}, 2003 };
15458
15459 struct s_sh2oa_ {
15460 double e_1[2003];
15461 } sh2oa_ = { {.11109, .10573, .10162, .10573, .11109, .12574, .13499,
15462 .14327, .15065, .15164, .15022, .13677, .13115, .12253, .11271,
15463 .1007, .087495, .080118, .06994, .062034, .056051, .047663,
15464 .04245, .03669, .033441, .030711, .025205, .022113, .01888,
15465 .016653, .014626, .012065, .010709, .0091783, .0077274, .0067302,
15466 .0056164, .0049089, .0041497, .0035823, .0031124, .0026414,
15467 .0023167, .0020156, .0017829, .0015666, .0013928, .0012338,
15468 .0010932, 9.7939e-4, 8.8241e-4, 7.9173e-4, 7.1296e-4, 6.4179e-4,
15469 5.8031e-4, 5.2647e-4, 4.7762e-4, 4.3349e-4, 3.9355e-4, 3.5887e-4,
15470 3.2723e-4, 2.9919e-4, 2.7363e-4, 2.5013e-4, 2.2876e-4, 2.0924e-4,
15471 1.9193e-4, 1.7618e-4, 1.6188e-4, 1.4891e-4, 1.3717e-4, 1.2647e-4,
15472 1.1671e-4, 1.0786e-4, 9.9785e-5, 9.235e-5, 8.5539e-5, 7.9377e-5,
15473 7.3781e-5, 6.8677e-5, 6.3993e-5, 5.9705e-5, 5.5788e-5, 5.2196e-5,
15474 4.8899e-5, 4.5865e-5, 4.3079e-5, 4.0526e-5, 3.8182e-5, 3.6025e-5,
15475 3.4038e-5, 3.2203e-5, 3.0511e-5, 2.8949e-5, 2.7505e-5, 2.617e-5,
15476 2.4933e-5, 2.3786e-5, 2.2722e-5, 2.1736e-5, 2.0819e-5, 1.9968e-5,
15477 1.9178e-5, 1.8442e-5, 1.776e-5, 1.7127e-5, 1.6541e-5, 1.5997e-5,
15478 1.5495e-5, 1.5034e-5, 1.4614e-5, 1.423e-5, 1.3883e-5, 1.3578e-5,
15479 1.3304e-5, 1.3069e-5, 1.2876e-5, 1.2732e-5, 1.2626e-5, 1.2556e-5,
15480 1.2544e-5, 1.2604e-5, 1.2719e-5, 1.2883e-5, 1.3164e-5, 1.3581e-5,
15481 1.4187e-5, 1.4866e-5, 1.5669e-5, 1.6717e-5, 1.8148e-5, 2.0268e-5,
15482 2.2456e-5, 2.5582e-5, 2.9183e-5, 3.3612e-5, 3.9996e-5, 4.6829e-5,
15483 5.5055e-5, 6.5897e-5, 7.536e-5, 8.7213e-5, 1.0046e-4, 1.1496e-4,
15484 1.2943e-4, 1.5049e-4, 1.6973e-4, 1.8711e-4, 2.0286e-4, 2.2823e-4,
15485 2.678e-4, 2.8766e-4, 3.1164e-4, 3.364e-4, 3.6884e-4, 3.9159e-4,
15486 3.8712e-4, 3.7433e-4, 3.4503e-4, 3.1003e-4, 2.8027e-4, 2.5253e-4,
15487 2.3408e-4, 2.2836e-4, 2.4442e-4, 2.7521e-4, 2.9048e-4, 3.0489e-4,
15488 3.2646e-4, 3.388e-4, 3.3492e-4, 3.0987e-4, 2.9482e-4, 2.8711e-4,
15489 2.6068e-4, 2.2683e-4, 1.9996e-4, 1.7788e-4, 1.6101e-4, 1.3911e-4,
15490 1.2013e-4, 1.0544e-4, 9.4224e-5, 8.1256e-5, 7.3667e-5, 6.2233e-5,
15491 5.5906e-5, 5.1619e-5, 4.514e-5, 4.0273e-5, 3.3268e-5, 3.0258e-5,
15492 2.644e-5, 2.3103e-5, 2.0749e-5, 1.8258e-5, 1.6459e-5, 1.4097e-5,
15493 1.2052e-5, 1.0759e-5, 9.14e-6, 8.1432e-6, 7.146e-6, 6.4006e-6,
15494 5.6995e-6, 4.9372e-6, 4.4455e-6, 3.9033e-6, 3.474e-6, 3.1269e-6,
15495 2.8059e-6, 2.5558e-6, 2.2919e-6, 2.0846e-6, 1.8983e-6, 1.7329e-6,
15496 1.5929e-6, 1.4631e-6, 1.3513e-6, 1.2461e-6, 1.1519e-6, 1.0682e-6,
15497 9.9256e-7, 9.2505e-7, 8.6367e-7, 8.0857e-7, 7.5674e-7, 7.0934e-7,
15498 6.658e-7, 6.258e-7, 5.8853e-7, 5.5333e-7, 5.2143e-7, 4.9169e-7,
15499 4.6431e-7, 4.3898e-7, 4.1564e-7, 3.9405e-7, 3.7403e-7, 3.5544e-7,
15500 3.3819e-7, 3.2212e-7, 3.0714e-7, 2.9313e-7, 2.8003e-7, 2.6777e-7,
15501 2.5628e-7, 2.4551e-7, 2.354e-7, 2.2591e-7, 2.1701e-7, 2.0866e-7,
15502 2.0082e-7, 1.9349e-7, 1.8665e-7, 1.8027e-7, 1.7439e-7, 1.6894e-7,
15503 1.64e-7, 1.5953e-7, 1.5557e-7, 1.5195e-7, 1.4888e-7, 1.4603e-7,
15504 1.4337e-7, 1.4093e-7, 1.3828e-7, 1.3569e-7, 1.327e-7, 1.2984e-7,
15505 1.2714e-7, 1.2541e-7, 1.2399e-7, 1.2102e-7, 1.1878e-7, 1.1728e-7,
15506 1.1644e-7, 1.1491e-7, 1.1305e-7, 1.1235e-7, 1.1228e-7, 1.1224e-7,
15507 1.1191e-7, 1.1151e-7, 1.1098e-7, 1.1068e-7, 1.1109e-7, 1.1213e-7,
15508 1.1431e-7, 1.1826e-7, 1.2322e-7, 1.3025e-7, 1.4066e-7, 1.5657e-7,
15509 1.7214e-7, 1.9449e-7, 2.2662e-7, 2.6953e-7, 3.1723e-7, 3.7028e-7,
15510 4.4482e-7, 5.3852e-7, 6.2639e-7, 7.2175e-7, 7.7626e-7, 8.7248e-7,
15511 9.6759e-7, 1.0102e-6, 1.062e-6, 1.1201e-6, 1.2107e-6, 1.2998e-6,
15512 1.313e-6, 1.2856e-6, 1.235e-6, 1.1489e-6, 1.0819e-6, 1.012e-6,
15513 9.4795e-7, 9.2858e-7, 9.806e-7, 1.0999e-6, 1.1967e-6, 1.2672e-6,
15514 1.3418e-6, 1.3864e-6, 1.433e-6, 1.4592e-6, 1.4598e-6, 1.4774e-6,
15515 1.4726e-6, 1.482e-6, 1.505e-6, 1.4984e-6, 1.5181e-6, 1.5888e-6,
15516 1.685e-6, 1.769e-6, 1.9277e-6, 2.1107e-6, 2.3068e-6, 2.5347e-6,
15517 2.8069e-6, 3.1345e-6, 3.5822e-6, 3.9051e-6, 4.3422e-6, 4.8704e-6,
15518 5.5351e-6, 6.3454e-6, 7.269e-6, 8.2974e-6, 9.7609e-6, 1.1237e-5,
15519 1.3187e-5, 1.5548e-5, 1.8784e-5, 2.1694e-5, 2.5487e-5, 3.0092e-5,
15520 3.5385e-5, 4.2764e-5, 4.9313e-5, 5.58e-5, 6.2968e-5, 7.106e-5,
15521 7.7699e-5, 8.7216e-5, 8.9335e-5, 9.2151e-5, 9.2779e-5, 9.4643e-5,
15522 9.7978e-5, 1.0008e-4, 1.0702e-4, 1.1026e-4, 1.0828e-4, 1.055e-4,
15523 1.0432e-4, 1.0428e-4, 9.898e-5, 9.4992e-5, 9.5159e-5, 1.0058e-4,
15524 1.0738e-4, 1.155e-4, 1.1229e-4, 1.0596e-4, 1.0062e-4, 9.1742e-5,
15525 8.4492e-5, 6.8099e-5, 5.6295e-5, 4.6502e-5, 3.8071e-5, 3.0721e-5,
15526 2.3297e-5, 1.8688e-5, 1.483e-5, 1.2049e-5, 9.6754e-6, 7.9192e-6,
15527 6.6673e-6, 5.6468e-6, 4.8904e-6, 4.2289e-6, 3.688e-6, 3.2396e-6,
15528 2.8525e-6, 2.5363e-6, 2.2431e-6, 1.9949e-6, 1.7931e-6, 1.6164e-6,
15529 1.4431e-6, 1.2997e-6, 1.1559e-6, 1.0404e-6, 9.43e-7, 8.4597e-7,
15530 7.6133e-7, 6.8623e-7, 6.2137e-7, 5.6345e-7, 5.1076e-7, 4.6246e-7,
15531 4.1906e-7, 3.8063e-7, 3.461e-7, 3.1554e-7, 2.8795e-7, 2.6252e-7,
15532 2.3967e-7, 2.1901e-7, 2.0052e-7, 1.8384e-7, 1.6847e-7, 1.5459e-7,
15533 1.4204e-7, 1.3068e-7, 1.2036e-7, 1.1095e-7, 1.0237e-7, 9.4592e-8,
15534 8.753e-8, 8.1121e-8, 7.5282e-8, 6.9985e-8, 6.5189e-8, 6.0874e-8,
15535 5.6989e-8, 5.353e-8, 5.0418e-8, 4.7745e-8, 4.5367e-8, 4.3253e-8,
15536 4.1309e-8, 3.9695e-8, 3.8094e-8, 3.6482e-8, 3.4897e-8, 3.35e-8,
15537 3.2302e-8, 3.0854e-8, 2.9698e-8, 2.8567e-8, 2.76e-8, 2.6746e-8,
15538 2.5982e-8, 2.551e-8, 2.5121e-8, 2.4922e-8, 2.4909e-8, 2.5013e-8,
15539 2.5216e-8, 2.5589e-8, 2.6049e-8, 2.6451e-8, 2.6978e-8, 2.7687e-8,
15540 2.86e-8, 2.9643e-8, 3.0701e-8, 3.2058e-8, 3.3695e-8, 3.5558e-8,
15541 3.7634e-8, 3.9875e-8, 4.2458e-8, 4.548e-8, 4.8858e-8, 5.2599e-8,
15542 5.703e-8, 6.2067e-8, 6.7911e-8, 7.4579e-8, 8.1902e-8, 8.9978e-8,
15543 9.987e-8, 1.1102e-7, 1.2343e-7, 1.3732e-7, 1.5394e-7, 1.7318e-7,
15544 1.9383e-7, 2.1819e-7, 2.4666e-7, 2.8109e-7, 3.2236e-7, 3.776e-7,
15545 4.4417e-7, 5.2422e-7, 6.1941e-7, 7.4897e-7, 9.2041e-7, 1.1574e-6,
15546 1.4126e-6, 1.7197e-6, 2.1399e-6, 2.6266e-6, 3.3424e-6, 3.8418e-6,
15547 4.514e-6, 5.0653e-6, 5.8485e-6, 6.5856e-6, 6.8937e-6, 6.9121e-6,
15548 6.9005e-6, 6.9861e-6, 6.82e-6, 6.6089e-6, 6.5809e-6, 7.3496e-6,
15549 8.0311e-6, 8.3186e-6, 8.426e-6, 9.0644e-6, 9.4965e-6, 9.4909e-6,
15550 9.016e-6, 9.1494e-6, 9.3629e-6, 9.5944e-6, 9.5459e-6, 8.9919e-6,
15551 8.604e-6, 7.8613e-6, 7.1567e-6, 6.2677e-6, 5.1899e-6, 4.4188e-6,
15552 3.7167e-6, 3.0636e-6, 2.5573e-6, 2.0317e-6, 1.6371e-6, 1.3257e-6,
15553 1.0928e-6, 8.9986e-7, 7.4653e-7, 6.1111e-7, 5.1395e-7, 4.35e-7,
15554 3.7584e-7, 3.2633e-7, 2.8413e-7, 2.4723e-7, 2.1709e-7, 1.9294e-7,
15555 1.7258e-7, 1.5492e-7, 1.382e-7, 1.2389e-7, 1.1189e-7, 1.0046e-7,
15556 9.0832e-8, 8.2764e-8, 7.4191e-8, 6.7085e-8, 6.0708e-8, 5.4963e-8,
15557 4.9851e-8, 4.5044e-8, 4.0916e-8, 3.722e-8, 3.3678e-8, 3.0663e-8,
15558 2.7979e-8, 2.5495e-8, 2.3286e-8, 2.1233e-8, 1.9409e-8, 1.777e-8,
15559 1.626e-8, 1.4885e-8, 1.3674e-8, 1.2543e-8, 1.1551e-8, 1.0655e-8,
15560 9.8585e-9, 9.1398e-9, 8.4806e-9, 7.8899e-9, 7.3547e-9, 6.867e-9,
15561 6.4131e-9, 5.993e-9, 5.6096e-9, 5.2592e-9, 4.9352e-9, 4.6354e-9,
15562 4.3722e-9, 4.125e-9, 3.9081e-9, 3.7118e-9, 3.5372e-9, 3.3862e-9,
15563 3.2499e-9, 3.1324e-9, 3.0313e-9, 2.9438e-9, 2.8686e-9, 2.805e-9,
15564 2.7545e-9, 2.7149e-9, 2.6907e-9, 2.6724e-9, 2.6649e-9, 2.6642e-9,
15565 2.6725e-9, 2.6871e-9, 2.7056e-9, 2.7357e-9, 2.7781e-9, 2.8358e-9,
15566 2.9067e-9, 2.9952e-9, 3.102e-9, 3.2253e-9, 3.3647e-9, 3.5232e-9,
15567 3.7037e-9, 3.9076e-9, 4.1385e-9, 4.3927e-9, 4.6861e-9, 5.0238e-9,
15568 5.4027e-9, 5.8303e-9, 6.3208e-9, 6.8878e-9, 7.5419e-9, 8.313e-9,
15569 9.1952e-9, 1.0228e-8, 1.1386e-8, 1.2792e-8, 1.4521e-8, 1.6437e-8,
15570 1.8674e-8, 2.116e-8, 2.4506e-8, 2.8113e-8, 3.2636e-8, 3.7355e-8,
15571 4.2234e-8, 4.9282e-8, 5.7358e-8, 6.6743e-8, 7.8821e-8, 9.4264e-8,
15572 1.1542e-7, 1.3684e-7, 1.6337e-7, 2.0056e-7, 2.3252e-7, 2.6127e-7,
15573 2.9211e-7, 3.3804e-7, 3.7397e-7, 3.8205e-7, 3.881e-7, 3.9499e-7,
15574 3.9508e-7, 3.7652e-7, 3.5859e-7, 3.6198e-7, 3.7871e-7, 4.0925e-7,
15575 4.2717e-7, 4.8241e-7, 5.2008e-7, 5.653e-7, 5.9531e-7, 6.1994e-7,
15576 6.508e-7, 6.6355e-7, 6.9193e-7, 6.993e-7, 7.3058e-7, 7.4678e-7,
15577 7.9193e-7, 8.3627e-7, 9.1267e-7, 1.0021e-6, 1.1218e-6, 1.2899e-6,
15578 1.4447e-6, 1.7268e-6, 2.0025e-6, 2.3139e-6, 2.5599e-6, 2.892e-6,
15579 3.3059e-6, 3.5425e-6, 3.9522e-6, 4.0551e-6, 4.2818e-6, 4.2892e-6,
15580 4.421e-6, 4.5614e-6, 4.6739e-6, 4.9482e-6, 5.1118e-6, 5.0986e-6,
15581 4.9417e-6, 4.9022e-6, 4.8449e-6, 4.8694e-6, 4.8111e-6, 4.9378e-6,
15582 5.3231e-6, 5.7362e-6, 6.235e-6, 6.0951e-6, 5.7281e-6, 5.4585e-6,
15583 4.9032e-6, 4.3009e-6, 3.4776e-6, 2.8108e-6, 2.2993e-6, 1.7999e-6,
15584 1.387e-6, 1.075e-6, 8.5191e-7, 6.7951e-7, 5.5336e-7, 4.6439e-7,
15585 4.0243e-7, 3.5368e-7, 3.1427e-7, 2.7775e-7, 2.4486e-7, 2.1788e-7,
15586 1.9249e-7, 1.7162e-7, 1.5115e-7, 1.3478e-7, 1.2236e-7, 1.1139e-7,
15587 1.0092e-7, 9.0795e-8, 8.2214e-8, 7.4691e-8, 6.7486e-8, 6.0414e-8,
15588 5.4584e-8, 4.8754e-8, 4.3501e-8, 3.8767e-8, 3.4363e-8, 3.0703e-8,
15589 2.7562e-8, 2.4831e-8, 2.2241e-8, 1.9939e-8, 1.8049e-8, 1.6368e-8,
15590 1.4863e-8, 1.346e-8, 1.2212e-8, 1.1155e-8, 1.0185e-8, 9.3417e-9,
15591 8.5671e-9, 7.8292e-9, 7.1749e-9, 6.5856e-9, 6.0588e-9, 5.5835e-9,
15592 5.135e-9, 4.7395e-9, 4.3771e-9, 4.0476e-9, 3.756e-9, 3.4861e-9,
15593 3.2427e-9, 3.024e-9, 2.8278e-9, 2.6531e-9, 2.4937e-9, 2.3511e-9,
15594 2.2245e-9, 2.1133e-9, 2.0159e-9, 1.933e-9, 1.8669e-9, 1.8152e-9,
15595 1.7852e-9, 1.7752e-9, 1.7823e-9, 1.8194e-9, 1.8866e-9, 1.9759e-9,
15596 2.0736e-9, 2.2083e-9, 2.3587e-9, 2.4984e-9, 2.6333e-9, 2.816e-9,
15597 3.0759e-9, 3.372e-9, 3.6457e-9, 4.0668e-9, 4.4541e-9, 4.7976e-9,
15598 5.0908e-9, 5.4811e-9, 6.1394e-9, 6.3669e-9, 6.5714e-9, 6.8384e-9,
15599 7.1918e-9, 7.3741e-9, 7.2079e-9, 7.2172e-9, 7.2572e-9, 7.3912e-9,
15600 7.6188e-9, 8.3291e-9, 8.7885e-9, 9.2412e-9, 1.0021e-8, 1.0752e-8,
15601 1.1546e-8, 1.1607e-8, 1.1949e-8, 1.2346e-8, 1.2516e-8, 1.2826e-8,
15602 1.3053e-8, 1.3556e-8, 1.4221e-8, 1.5201e-8, 1.6661e-8, 1.8385e-8,
15603 2.0585e-8, 2.3674e-8, 2.7928e-8, 3.3901e-8, 4.1017e-8, 4.9595e-8,
15604 6.0432e-8, 7.6304e-8, 9.0764e-8, 1.0798e-7, 1.2442e-7, 1.4404e-7,
15605 1.6331e-7, 1.8339e-7, 2.0445e-7, 2.2288e-7, 2.3083e-7, 2.3196e-7,
15606 2.3919e-7, 2.3339e-7, 2.3502e-7, 2.3444e-7, 2.6395e-7, 2.9928e-7,
15607 3.0025e-7, 3.0496e-7, 3.1777e-7, 3.4198e-7, 3.4739e-7, 3.2696e-7,
15608 3.41e-7, 3.5405e-7, 3.7774e-7, 3.8285e-7, 3.6797e-7, 3.58e-7,
15609 3.2283e-7, 2.9361e-7, 2.4881e-7, 2.0599e-7, 1.7121e-7, 1.3641e-7,
15610 1.1111e-7, 8.9413e-8, 7.3455e-8, 6.2078e-8, 5.2538e-8, 4.5325e-8,
15611 3.9005e-8, 3.4772e-8, 3.1203e-8, 2.8132e-8, 2.525e-8, 2.2371e-8,
15612 2.0131e-8, 1.7992e-8, 1.6076e-8, 1.4222e-8, 1.249e-8, 1.1401e-8,
15613 1.0249e-8, 9.2279e-9, 8.5654e-9, 7.6227e-9, 6.9648e-9, 6.2466e-9,
15614 5.7252e-9, 5.38e-9, 4.696e-9, 4.2194e-9, 3.7746e-9, 3.3813e-9,
15615 3.0656e-9, 2.6885e-9, 2.4311e-9, 2.1572e-9, 1.8892e-9, 1.7038e-9,
15616 1.4914e-9, 1.3277e-9, 1.1694e-9, 1.0391e-9, 9.2779e-10,
15617 8.3123e-10, 7.4968e-10, 6.8385e-10, 6.2915e-10, 5.7784e-10,
15618 5.2838e-10, 4.8382e-10, 4.4543e-10, 4.1155e-10, 3.7158e-10,
15619 3.3731e-10, 3.0969e-10, 2.8535e-10, 2.6416e-10, 2.4583e-10,
15620 2.2878e-10, 2.1379e-10, 2.0073e-10, 1.8907e-10, 1.7866e-10,
15621 1.6936e-10, 1.6119e-10, 1.5424e-10, 1.4847e-10, 1.4401e-10,
15622 1.4068e-10, 1.3937e-10, 1.3943e-10, 1.4281e-10, 1.4766e-10,
15623 1.5701e-10, 1.7079e-10, 1.8691e-10, 2.0081e-10, 2.174e-10,
15624 2.4847e-10, 2.6463e-10, 2.7087e-10, 2.7313e-10, 2.8352e-10,
15625 2.9511e-10, 2.8058e-10, 2.7227e-10, 2.7356e-10, 2.8012e-10,
15626 2.8034e-10, 2.9031e-10, 3.103e-10, 3.3745e-10, 3.8152e-10,
15627 4.0622e-10, 4.2673e-10, 4.3879e-10, 4.5488e-10, 4.7179e-10,
15628 4.614e-10, 4.6339e-10, 4.6716e-10, 4.7024e-10, 4.7931e-10,
15629 4.8503e-10, 4.9589e-10, 4.9499e-10, 5.0363e-10, 5.3184e-10,
15630 5.6451e-10, 6.0932e-10, 6.6469e-10, 7.4076e-10, 8.3605e-10,
15631 9.4898e-10, 1.0935e-9, 1.2593e-9, 1.4913e-9, 1.8099e-9, 2.1842e-9,
15632 2.7284e-9, 3.2159e-9, 3.7426e-9, 4.5226e-9, 5.3512e-9, 6.1787e-9,
15633 6.8237e-9, 7.9421e-9, 9.0002e-9, 9.6841e-9, 9.9558e-9, 1.0232e-8,
15634 1.0591e-8, 1.0657e-8, 1.0441e-8, 1.0719e-8, 1.1526e-8, 1.2962e-8,
15635 1.4336e-8, 1.615e-8, 1.8417e-8, 2.0725e-8, 2.3426e-8, 2.5619e-8,
15636 2.7828e-8, 3.0563e-8, 3.3438e-8, 3.6317e-8, 4.04e-8, 4.4556e-8,
15637 5.0397e-8, 5.3315e-8, 5.9185e-8, 6.5311e-8, 6.9188e-8, 7.7728e-8,
15638 7.9789e-8, 8.6598e-8, 8.7768e-8, 9.1773e-8, 9.7533e-8, 1.0007e-7,
15639 1.065e-7, 1.0992e-7, 1.0864e-7, 1.0494e-7, 1.0303e-7, 1.0031e-7,
15640 1.0436e-7, 1.0537e-7, 1.1184e-7, 1.2364e-7, 1.3651e-7, 1.4881e-7,
15641 1.4723e-7, 1.4118e-7, 1.3371e-7, 1.1902e-7, 1.0007e-7, 7.9628e-8,
15642 6.4362e-8, 5.0243e-8, 3.8133e-8, 2.94e-8, 2.3443e-8, 1.9319e-8,
15643 1.6196e-8, 1.4221e-8, 1.2817e-8, 1.1863e-8, 1.1383e-8, 1.1221e-8,
15644 1.1574e-8, 1.1661e-8, 1.2157e-8, 1.2883e-8, 1.3295e-8, 1.4243e-8,
15645 1.424e-8, 1.4614e-8, 1.4529e-8, 1.4685e-8, 1.4974e-8, 1.479e-8,
15646 1.489e-8, 1.4704e-8, 1.4142e-8, 1.3374e-8, 1.2746e-8, 1.2172e-8,
15647 1.2336e-8, 1.2546e-8, 1.3065e-8, 1.409e-8, 1.5215e-8, 1.654e-8,
15648 1.6144e-8, 1.5282e-8, 1.4358e-8, 1.2849e-8, 1.0998e-8, 8.6956e-9,
15649 7.0881e-9, 5.5767e-9, 4.2792e-9, 3.2233e-9, 2.502e-9, 1.9985e-9,
15650 1.5834e-9, 1.3015e-9, 1.0948e-9, 9.4141e-10, 8.1465e-10,
15651 7.1517e-10, 6.2906e-10, 5.5756e-10, 4.9805e-10, 4.3961e-10,
15652 3.9181e-10, 3.5227e-10, 3.167e-10, 2.8667e-10, 2.5745e-10,
15653 2.3212e-10, 2.0948e-10, 1.897e-10, 1.7239e-10, 1.5659e-10,
15654 1.4301e-10, 1.3104e-10, 1.2031e-10, 1.1095e-10, 1.0262e-10,
15655 9.513e-11, 8.8595e-11, 8.2842e-11, 7.7727e-11, 7.3199e-11,
15656 6.9286e-11, 6.5994e-11, 6.3316e-11, 6.1244e-11, 5.9669e-11,
15657 5.8843e-11, 5.8832e-11, 5.9547e-11, 6.1635e-11, 6.4926e-11,
15658 7.0745e-11, 7.8802e-11, 8.6724e-11, 1.0052e-10, 1.1575e-10,
15659 1.3626e-10, 1.5126e-10, 1.6751e-10, 1.9239e-10, 2.1748e-10,
15660 2.2654e-10, 2.2902e-10, 2.324e-10, 2.4081e-10, 2.393e-10,
15661 2.2378e-10, 2.2476e-10, 2.2791e-10, 2.4047e-10, 2.5305e-10,
15662 2.8073e-10, 3.1741e-10, 3.6592e-10, 4.1495e-10, 4.6565e-10,
15663 5.099e-10, 5.5607e-10, 6.1928e-10, 6.6779e-10, 7.335e-10,
15664 8.1434e-10, 8.9635e-10, 9.9678e-10, 1.1256e-9, 1.2999e-9,
15665 1.4888e-9, 1.7642e-9, 1.9606e-9, 2.2066e-9, 2.4601e-9, 2.7218e-9,
15666 3.0375e-9, 3.1591e-9, 3.2852e-9, 3.2464e-9, 3.3046e-9, 3.271e-9,
15667 3.2601e-9, 3.3398e-9, 3.7446e-9, 4.0795e-9, 4.0284e-9, 4.0584e-9,
15668 4.1677e-9, 4.5358e-9, 4.4097e-9, 4.2744e-9, 4.5449e-9, 4.8147e-9,
15669 5.2656e-9, 5.2476e-9, 5.0275e-9, 4.7968e-9, 4.3654e-9, 3.953e-9,
15670 3.2447e-9, 2.6489e-9, 2.1795e-9, 1.788e-9, 1.4309e-9, 1.1256e-9,
15671 9.1903e-10, 7.6533e-10, 6.3989e-10, 5.5496e-10, 4.9581e-10,
15672 4.5722e-10, 4.3898e-10, 4.3505e-10, 4.3671e-10, 4.5329e-10,
15673 4.6827e-10, 4.9394e-10, 5.1122e-10, 5.1649e-10, 5.0965e-10,
15674 4.9551e-10, 4.8928e-10, 4.7947e-10, 4.7989e-10, 4.9071e-10,
15675 4.8867e-10, 4.726e-10, 4.5756e-10, 4.54e-10, 4.5993e-10,
15676 4.4042e-10, 4.3309e-10, 4.4182e-10, 4.6735e-10, 5.0378e-10,
15677 5.2204e-10, 5.0166e-10, 4.6799e-10, 4.3119e-10, 3.8803e-10,
15678 3.3291e-10, 2.6289e-10, 2.1029e-10, 1.7011e-10, 1.3345e-10,
15679 1.0224e-10, 7.8207e-11, 6.2451e-11, 5.0481e-11, 4.1507e-11,
15680 3.5419e-11, 3.0582e-11, 2.69e-11, 2.3778e-11, 2.1343e-11,
15681 1.9182e-11, 1.7162e-11, 1.5391e-11, 1.3877e-11, 1.2619e-11,
15682 1.145e-11, 1.0461e-11, 9.6578e-12, 8.9579e-12, 8.3463e-12,
15683 7.8127e-12, 7.3322e-12, 6.9414e-12, 6.6037e-12, 6.3285e-12,
15684 6.1095e-12, 5.9387e-12, 5.8118e-12, 5.726e-12, 5.6794e-12,
15685 5.6711e-12, 5.7003e-12, 5.767e-12, 5.8717e-12, 6.0151e-12,
15686 6.1984e-12, 6.4232e-12, 6.6918e-12, 7.0065e-12, 7.3705e-12,
15687 7.7873e-12, 8.2612e-12, 8.7972e-12, 9.4009e-12, 1.0079e-11,
15688 1.084e-11, 1.1692e-11, 1.2648e-11, 1.3723e-11, 1.4935e-11,
15689 1.6313e-11, 1.7905e-11, 1.974e-11, 2.1898e-11, 2.4419e-11,
15690 2.7426e-11, 3.0869e-11, 3.4235e-11, 3.7841e-11, 4.1929e-11,
15691 4.6776e-11, 5.2123e-11, 5.8497e-11, 6.5294e-11, 7.4038e-11,
15692 8.4793e-11, 9.6453e-11, 1.1223e-10, 1.2786e-10, 1.4882e-10,
15693 1.7799e-10, 2.0766e-10, 2.4523e-10, 2.8591e-10, 3.3386e-10,
15694 4.0531e-10, 4.7663e-10, 5.4858e-10, 6.3377e-10, 7.1688e-10,
15695 8.4184e-10, 9.5144e-10, 1.0481e-9, 1.1356e-9, 1.2339e-9,
15696 1.3396e-9, 1.4375e-9, 1.5831e-9, 1.7323e-9, 1.9671e-9, 2.2976e-9,
15697 2.6679e-9, 3.0777e-9, 3.4321e-9, 3.8192e-9, 4.2711e-9, 4.4903e-9,
15698 4.8931e-9, 5.2253e-9, 5.404e-9, 5.6387e-9, 5.6704e-9, 6.0345e-9,
15699 6.1079e-9, 6.2576e-9, 6.4039e-9, 6.3776e-9, 6.1878e-9, 5.8616e-9,
15700 5.7036e-9, 5.584e-9, 5.6905e-9, 5.8931e-9, 6.2478e-9, 6.8291e-9,
15701 7.4528e-9, 7.6078e-9, 7.3898e-9, 6.7573e-9, 5.9827e-9, 5.0927e-9,
15702 4.0099e-9, 3.1933e-9, 2.4296e-9, 1.8485e-9, 1.4595e-9, 1.2017e-9,
15703 1.0164e-9, 8.7433e-10, 7.7108e-10, 7.0049e-10, 6.5291e-10,
15704 6.1477e-10, 5.9254e-10, 5.815e-10, 5.7591e-10, 5.849e-10,
15705 5.8587e-10, 5.9636e-10, 6.2408e-10, 6.5479e-10, 7.048e-10,
15706 7.2313e-10, 7.5524e-10, 8.0863e-10, 8.3386e-10, 9.2342e-10,
15707 9.6754e-10, 1.0293e-9, 1.0895e-9, 1.133e-9, 1.221e-9, 1.2413e-9,
15708 1.2613e-9, 1.2671e-9, 1.2225e-9, 1.1609e-9, 1.0991e-9, 1.06e-9,
15709 1.057e-9, 1.0818e-9, 1.1421e-9, 1.227e-9, 1.337e-9, 1.4742e-9,
15710 1.4946e-9, 1.4322e-9, 1.321e-9, 1.1749e-9, 1.0051e-9, 7.8387e-10,
15711 6.1844e-10, 4.6288e-10, 3.4164e-10, 2.5412e-10, 1.9857e-10,
15712 1.5876e-10, 1.2966e-10, 1.092e-10, 9.4811e-11, 8.3733e-11,
15713 7.3906e-11, 6.7259e-11, 6.1146e-11, 5.7119e-11, 5.3546e-11,
15714 4.8625e-11, 4.4749e-11, 4.1089e-11, 3.7825e-11, 3.4465e-11,
15715 3.1018e-11, 2.8109e-11, 2.561e-11, 2.2859e-11, 2.049e-11,
15716 1.8133e-11, 1.5835e-11, 1.3949e-11, 1.2295e-11, 1.0799e-11,
15717 9.6544e-12, 8.7597e-12, 7.999e-12, 7.3973e-12, 6.9035e-12,
15718 6.4935e-12, 6.1195e-12, 5.8235e-12, 5.5928e-12, 5.4191e-12,
15719 5.2993e-12, 5.2338e-12, 5.2272e-12, 5.2923e-12, 5.4252e-12,
15720 5.6523e-12, 5.9433e-12, 6.3197e-12, 6.9016e-12, 7.5016e-12,
15721 8.2885e-12, 9.405e-12, 1.0605e-11, 1.2257e-11, 1.3622e-11,
15722 1.5353e-11, 1.7543e-11, 1.9809e-11, 2.2197e-11, 2.4065e-11,
15723 2.6777e-11, 2.9751e-11, 3.2543e-11, 3.5536e-11, 3.9942e-11,
15724 4.6283e-11, 5.4556e-11, 6.549e-11, 7.6803e-11, 9.0053e-11,
15725 1.0852e-10, 1.2946e-10, 1.4916e-10, 1.7748e-10, 2.0073e-10,
15726 2.2485e-10, 2.5114e-10, 2.7715e-10, 3.1319e-10, 3.3305e-10,
15727 3.5059e-10, 3.5746e-10, 3.6311e-10, 3.7344e-10, 3.6574e-10,
15728 3.7539e-10, 3.9434e-10, 4.351e-10, 4.334e-10, 4.2588e-10,
15729 4.3977e-10, 4.6062e-10, 4.7687e-10, 4.6457e-10, 4.8578e-10,
15730 5.2344e-10, 5.6752e-10, 5.8702e-10, 5.6603e-10, 5.3784e-10,
15731 4.9181e-10, 4.3272e-10, 3.5681e-10, 2.8814e-10, 2.332e-10,
15732 1.8631e-10, 1.4587e-10, 1.1782e-10, 9.8132e-11, 8.2528e-11,
15733 6.9174e-11, 6.1056e-11, 5.3459e-11, 4.7116e-11, 4.1878e-11,
15734 3.8125e-11, 3.6347e-11, 3.5071e-11, 3.3897e-11, 3.3541e-11,
15735 3.3563e-11, 3.5469e-11, 3.8111e-11, 3.8675e-11, 4.1333e-11,
15736 4.3475e-11, 4.6476e-11, 4.9761e-11, 5.138e-11, 5.4135e-11,
15737 5.3802e-11, 5.5158e-11, 5.6864e-11, 5.9311e-11, 6.3827e-11,
15738 6.7893e-11, 6.823e-11, 6.6694e-11, 6.6018e-11, 6.4863e-11,
15739 6.5893e-11, 6.3813e-11, 6.4741e-11, 6.863e-11, 7.0255e-11,
15740 7.0667e-11, 6.881e-11, 6.4104e-11, 5.8136e-11, 4.7242e-11,
15741 3.7625e-11, 3.1742e-11, 2.5581e-11, 1.8824e-11, 1.3303e-11,
15742 9.6919e-12, 7.5353e-12, 6.0986e-12, 5.0742e-12, 4.3094e-12,
15743 3.719e-12, 3.252e-12, 2.8756e-12, 2.568e-12, 2.3139e-12,
15744 2.1025e-12, 1.9257e-12, 1.7777e-12, 1.6539e-12, 1.5508e-12,
15745 1.4657e-12, 1.3966e-12, 1.3417e-12, 1.2998e-12, 1.27e-12,
15746 1.2514e-12, 1.2437e-12, 1.2463e-12, 1.2592e-12, 1.2823e-12,
15747 1.3157e-12, 1.3596e-12, 1.4144e-12, 1.4806e-12, 1.5588e-12,
15748 1.6497e-12, 1.7544e-12, 1.8738e-12, 2.0094e-12, 2.1626e-12,
15749 2.3354e-12, 2.5297e-12, 2.7483e-12, 2.9941e-12, 3.2708e-12,
15750 3.5833e-12, 3.9374e-12, 4.3415e-12, 4.8079e-12, 5.3602e-12,
15751 5.9816e-12, 6.7436e-12, 7.6368e-12, 8.6812e-12, 9.8747e-12,
15752 1.135e-11, 1.3181e-11, 1.5406e-11, 1.7868e-11, 2.0651e-11,
15753 2.4504e-11, 2.9184e-11, 3.4159e-11, 3.9979e-11, 4.8704e-11,
15754 5.7856e-11, 6.7576e-11, 7.9103e-11, 9.437e-11, 1.1224e-10,
15755 1.3112e-10, 1.5674e-10, 1.8206e-10, 2.0576e-10, 2.3187e-10,
15756 2.7005e-10, 3.0055e-10, 3.3423e-10, 3.6956e-10, 3.8737e-10,
15757 4.263e-10, 4.5154e-10, 4.8383e-10, 5.3582e-10, 5.8109e-10,
15758 6.3741e-10, 6.3874e-10, 6.387e-10, 6.5818e-10, 6.5056e-10,
15759 6.5291e-10, 6.3159e-10, 6.3984e-10, 6.4549e-10, 6.5444e-10,
15760 6.7035e-10, 6.7665e-10, 6.9124e-10, 6.8451e-10, 6.9255e-10,
15761 6.9923e-10, 7.0396e-10, 6.7715e-10, 6.0371e-10, 5.3774e-10,
15762 4.6043e-10, 3.7635e-10, 2.9484e-10, 2.2968e-10, 1.8185e-10,
15763 1.4191e-10, 1.1471e-10, 9.479e-11, 7.9613e-11, 6.7989e-11,
15764 5.9391e-11, 5.281e-11, 4.7136e-11, 4.2618e-11, 3.8313e-11,
15765 3.4686e-11, 3.1669e-11, 2.911e-11, 2.6871e-11, 2.5074e-11,
15766 2.4368e-11, 2.3925e-11, 2.4067e-11, 2.4336e-11, 2.4704e-11,
15767 2.5823e-11, 2.7177e-11, 2.9227e-11, 3.1593e-11, 3.573e-11,
15768 4.0221e-11, 4.3994e-11, 4.8448e-11, 5.3191e-11, 5.8552e-11,
15769 6.3458e-11, 6.6335e-11, 7.2457e-11, 7.9091e-11, 8.2234e-11,
15770 8.7668e-11, 8.7951e-11, 9.2952e-11, 9.6157e-11, 9.5926e-11,
15771 1.012e-10, 1.0115e-10, 9.9577e-11, 9.6633e-11, 9.2891e-11,
15772 9.3315e-11, 9.5584e-11, 1.0064e-10, 1.0509e-10, 1.1455e-10,
15773 1.2443e-10, 1.2963e-10, 1.2632e-10, 1.1308e-10, 1.0186e-10,
15774 8.588e-11, 6.7863e-11, 5.1521e-11, 3.778e-11, 2.8842e-11,
15775 2.2052e-11, 1.7402e-11, 1.4406e-11, 1.1934e-11, 1.0223e-11,
15776 8.9544e-12, 7.9088e-12, 7.0675e-12, 6.2222e-12, 5.6051e-12,
15777 5.0502e-12, 4.5578e-12, 4.2636e-12, 3.9461e-12, 3.7599e-12,
15778 3.5215e-12, 3.2467e-12, 3.0018e-12, 2.6558e-12, 2.3928e-12,
15779 2.0707e-12, 1.7575e-12, 1.5114e-12, 1.2941e-12, 1.1004e-12,
15780 9.5175e-13, 8.2894e-13, 7.3253e-13, 6.5551e-13, 5.9098e-13,
15781 5.3548e-13, 4.8697e-13, 4.4413e-13, 4.06e-13, 3.7188e-13,
15782 3.4121e-13, 3.1356e-13, 2.8856e-13, 2.659e-13, 2.4533e-13,
15783 2.2663e-13, 2.096e-13, 1.9407e-13, 1.799e-13, 1.6695e-13,
15784 1.5512e-13, 1.4429e-13, 1.3437e-13, 1.2527e-13, 1.1693e-13,
15785 1.0927e-13, 1.0224e-13, 9.5767e-14, 8.9816e-14, 8.4335e-14,
15786 7.9285e-14, 7.4626e-14, 7.0325e-14, 6.6352e-14, 6.2676e-14,
15787 5.9274e-14, 5.6121e-14, 5.3195e-14, 5.0479e-14, 4.7953e-14,
15788 4.5602e-14, 4.3411e-14, 4.1367e-14, 3.9456e-14, 3.767e-14,
15789 3.5996e-14, 3.4427e-14, 3.2952e-14, 3.1566e-14, 3.0261e-14,
15790 2.903e-14, 2.7868e-14, 2.677e-14, 2.573e-14, 2.4745e-14,
15791 2.3809e-14, 2.2921e-14, 2.2076e-14, 2.1271e-14, 2.0504e-14,
15792 1.9772e-14, 1.9073e-14, 1.8404e-14, 1.7764e-14, 1.7151e-14,
15793 1.6564e-14, 1.6e-14, 1.5459e-14, 1.4939e-14, 1.4439e-14,
15794 1.3958e-14, 1.3495e-14, 1.3049e-14, 1.262e-14, 1.2206e-14,
15795 1.1807e-14, 1.1422e-14, 1.105e-14, 1.0691e-14, 1.0345e-14,
15796 1.001e-14, 9.687e-15, 9.3747e-15, 9.0727e-15, 8.7808e-15,
15797 8.4986e-15, 8.2257e-15, 7.9617e-15, 7.7064e-15, 7.4594e-15,
15798 7.2204e-15, 6.9891e-15, 6.7653e-15, 6.5488e-15, 6.3392e-15,
15799 6.1363e-15, 5.9399e-15, 5.7499e-15, 5.5659e-15, 5.3878e-15,
15800 5.2153e-15, 5.0484e-15, 4.8868e-15, 4.7303e-15, 4.5788e-15,
15801 4.4322e-15, 4.2902e-15, 4.1527e-15, 4.0196e-15, 3.8907e-15,
15802 3.7659e-15, 3.6451e-15, 3.5281e-15, 3.4149e-15, 3.3052e-15,
15803 3.1991e-15, 3.0963e-15, 2.9967e-15, 2.9004e-15, 2.8071e-15,
15804 2.7167e-15, 2.6293e-15, 2.5446e-15, 2.4626e-15, 2.3833e-15,
15805 2.3064e-15, 2.232e-15, 2.16e-15, 2.0903e-15, 2.0228e-15,
15806 1.9574e-15, 1.8942e-15, 1.8329e-15, 1.7736e-15, 1.7163e-15,
15807 1.6607e-15, 1.6069e-15, 1.5548e-15, 1.5044e-15, 1.4557e-15,
15808 1.4084e-15, 1.3627e-15, 1.3185e-15, 1.2757e-15, 1.2342e-15,
15809 1.1941e-15, 1.1552e-15, 1.1177e-15, 1.0813e-15, 1.0461e-15,
15810 1.012e-15, 9.79e-16, 9.4707e-16, 9.1618e-16, 8.8628e-16,
15811 8.5734e-16, 8.2933e-16, 8.0223e-16, 7.76e-16, 7.5062e-16,
15812 7.2606e-16, 7.0229e-16, 6.7929e-16, 6.5703e-16, 6.355e-16,
15813 6.1466e-16, 5.9449e-16, 5.7498e-16, 5.561e-16, 5.3783e-16,
15814 5.2015e-16, 5.0305e-16, 4.865e-16, 4.7049e-16, 4.55e-16,
15815 4.4002e-16, 4.2552e-16, 4.1149e-16, 3.9792e-16, 3.8479e-16,
15816 3.7209e-16, 3.5981e-16, 3.4792e-16, 3.3642e-16, 3.253e-16,
15817 3.1454e-16, 3.0413e-16, 2.9406e-16, 2.8432e-16, 2.749e-16,
15818 2.6579e-16, 2.5697e-16, 2.4845e-16, 2.402e-16, 2.3223e-16,
15819 2.2451e-16, 2.1705e-16, 2.0984e-16, 2.0286e-16, 1.9611e-16,
15820 1.8958e-16, 1.8327e-16, 1.7716e-16, 1.7126e-16, 1.6555e-16,
15821 1.6003e-16, 1.5469e-16, 1.4952e-16, 1.4453e-16, 1.397e-16,
15822 1.3503e-16 } };
15823
15824 struct s_sh2ob_ {
15825 double e_1[3];
15826 int e_2;
15827 } sh2ob_ = { {-20., 2e4, 10.}, 2003 };
15828
15829 struct s_s260a_ {
15830 double e_1[2003];
15831 } s260a_ = { {.1775, .17045, .16457, .17045, .1775, .20036, .21347, .22454,
15832 .23428, .23399, .23022, .20724, .19712, .18317, .16724, .1478,
15833 .12757, .11626, .10098, .089033, .07977, .067416, .059588,
15834 .051117, .046218, .042179, .034372, .029863, .025252, .022075,
15835 .019209, .015816, .013932, .011943, .010079, .0087667, .0074094,
15836 .0064967, .0055711, .0048444, .0042552, .0036953, .0032824,
15837 .0029124, .0026102, .002337, .00211, .0019008, .0017145, .0015573,
15838 .0014206, .0012931, .0011803, .0010774, 9.8616e-4, 9.0496e-4,
15839 8.3071e-4, 7.6319e-4, 7.0149e-4, 6.4637e-4, 5.9566e-4, 5.4987e-4,
15840 5.0768e-4, 4.688e-4, 4.3317e-4, 4.0037e-4, 3.7064e-4, 3.4325e-4,
15841 3.1809e-4, 2.9501e-4, 2.7382e-4, 2.543e-4, 2.363e-4, 2.1977e-4,
15842 2.0452e-4, 1.9042e-4, 1.774e-4, 1.6544e-4, 1.5442e-4, 1.4425e-4,
15843 1.3486e-4, 1.2618e-4, 1.1817e-4, 1.1076e-4, 1.0391e-4, 9.7563e-5,
15844 9.1696e-5, 8.6272e-5, 8.1253e-5, 7.6607e-5, 7.2302e-5, 6.8311e-5,
15845 6.4613e-5, 6.1183e-5, 5.8001e-5, 5.5048e-5, 5.2307e-5, 4.9761e-5,
15846 4.7395e-5, 4.5197e-5, 4.3155e-5, 4.1256e-5, 3.9491e-5, 3.7849e-5,
15847 3.6324e-5, 3.4908e-5, 3.3594e-5, 3.2374e-5, 3.1244e-5, 3.0201e-5,
15848 2.924e-5, 2.8356e-5, 2.7547e-5, 2.6814e-5, 2.6147e-5, 2.5551e-5,
15849 2.5029e-5, 2.4582e-5, 2.4203e-5, 2.3891e-5, 2.3663e-5, 2.3531e-5,
15850 2.3483e-5, 2.3516e-5, 2.3694e-5, 2.4032e-5, 2.4579e-5, 2.5234e-5,
15851 2.6032e-5, 2.7119e-5, 2.8631e-5, 3.0848e-5, 3.3262e-5, 3.6635e-5,
15852 4.0732e-5, 4.5923e-5, 5.3373e-5, 6.1875e-5, 7.2031e-5, 8.598e-5,
15853 9.8642e-5, 1.1469e-4, 1.3327e-4, 1.539e-4, 1.7513e-4, 2.0665e-4,
15854 2.3609e-4, 2.622e-4, 2.8677e-4, 3.259e-4, 3.8624e-4, 4.157e-4,
15855 4.5207e-4, 4.9336e-4, 5.45e-4, 5.8258e-4, 5.8086e-4, 5.6977e-4,
15856 5.3085e-4, 4.802e-4, 4.3915e-4, 4.0343e-4, 3.7853e-4, 3.7025e-4,
15857 3.9637e-4, 4.4675e-4, 4.7072e-4, 4.9022e-4, 5.2076e-4, 5.3676e-4,
15858 5.2755e-4, 4.8244e-4, 4.5473e-4, 4.3952e-4, 3.9614e-4, 3.4086e-4,
15859 2.9733e-4, 2.6367e-4, 2.3767e-4, 2.0427e-4, 1.7595e-4, 1.5493e-4,
15860 1.3851e-4, 1.1874e-4, 1.0735e-4, 9.049e-5, 8.1149e-5, 7.4788e-5,
15861 6.5438e-5, 5.8248e-5, 4.8076e-5, 4.3488e-5, 3.7856e-5, 3.3034e-5,
15862 2.9592e-5, 2.6088e-5, 2.3497e-5, 2.0279e-5, 1.7526e-5, 1.5714e-5,
15863 1.3553e-5, 1.2145e-5, 1.0802e-5, 9.7681e-6, 8.8196e-6, 7.8291e-6,
15864 7.1335e-6, 6.4234e-6, 5.8391e-6, 5.3532e-6, 4.9079e-6, 4.5378e-6,
15865 4.1716e-6, 3.8649e-6, 3.5893e-6, 3.3406e-6, 3.1199e-6, 2.9172e-6,
15866 2.7348e-6, 2.5644e-6, 2.4086e-6, 2.2664e-6, 2.1359e-6, 2.0159e-6,
15867 1.9051e-6, 1.8031e-6, 1.7074e-6, 1.6185e-6, 1.5356e-6, 1.4584e-6,
15868 1.3861e-6, 1.3179e-6, 1.2545e-6, 1.1951e-6, 1.1395e-6, 1.0873e-6,
15869 1.0384e-6, 9.925e-7, 9.4935e-7, 9.0873e-7, 8.705e-7, 8.3446e-7,
15870 8.0046e-7, 7.6834e-7, 7.38e-7, 7.0931e-7, 6.8217e-7, 6.5648e-7,
15871 6.3214e-7, 6.0909e-7, 5.8725e-7, 5.6655e-7, 5.4693e-7, 5.2835e-7,
15872 5.1077e-7, 4.9416e-7, 4.7853e-7, 4.6381e-7, 4.5007e-7, 4.3728e-7,
15873 4.255e-7, 4.145e-7, 4.0459e-7, 3.9532e-7, 3.8662e-7, 3.7855e-7,
15874 3.7041e-7, 3.6254e-7, 3.542e-7, 3.4617e-7, 3.3838e-7, 3.3212e-7,
15875 3.2655e-7, 3.1865e-7, 3.1203e-7, 3.067e-7, 3.0252e-7, 2.9749e-7,
15876 2.9184e-7, 2.8795e-7, 2.8501e-7, 2.8202e-7, 2.7856e-7, 2.7509e-7,
15877 2.7152e-7, 2.6844e-7, 2.6642e-7, 2.6548e-7, 2.6617e-7, 2.6916e-7,
15878 2.7372e-7, 2.8094e-7, 2.9236e-7, 3.1035e-7, 3.2854e-7, 3.5481e-7,
15879 3.9377e-7, 4.4692e-7, 5.0761e-7, 5.7715e-7, 6.7725e-7, 8.0668e-7,
15880 9.3716e-7, 1.0797e-6, 1.1689e-6, 1.3217e-6, 1.4814e-6, 1.5627e-6,
15881 1.6519e-6, 1.7601e-6, 1.906e-6, 2.0474e-6, 2.0716e-6, 2.0433e-6,
15882 1.9752e-6, 1.8466e-6, 1.7526e-6, 1.6657e-6, 1.587e-6, 1.5633e-6,
15883 1.652e-6, 1.8471e-6, 1.9953e-6, 2.0975e-6, 2.2016e-6, 2.2542e-6,
15884 2.3081e-6, 2.3209e-6, 2.2998e-6, 2.3056e-6, 2.2757e-6, 2.2685e-6,
15885 2.2779e-6, 2.2348e-6, 2.2445e-6, 2.3174e-6, 2.4284e-6, 2.529e-6,
15886 2.734e-6, 2.972e-6, 3.2332e-6, 3.5392e-6, 3.9013e-6, 4.3334e-6,
15887 4.9088e-6, 5.3428e-6, 5.9142e-6, 6.6106e-6, 7.4709e-6, 8.5019e-6,
15888 9.6835e-6, 1.0984e-5, 1.2831e-5, 1.4664e-5, 1.708e-5, 2.0103e-5,
15889 2.4148e-5, 2.7948e-5, 3.2855e-5, 3.9046e-5, 4.6429e-5, 5.6633e-5,
15890 6.6305e-5, 7.6048e-5, 8.7398e-5, 1.0034e-4, 1.1169e-4, 1.2813e-4,
15891 1.3354e-4, 1.3952e-4, 1.4204e-4, 1.4615e-4, 1.5144e-4, 1.5475e-4,
15892 1.6561e-4, 1.7135e-4, 1.6831e-4, 1.6429e-4, 1.6353e-4, 1.6543e-4,
15893 1.5944e-4, 1.5404e-4, 1.5458e-4, 1.6287e-4, 1.7277e-4, 1.8387e-4,
15894 1.7622e-4, 1.636e-4, 1.5273e-4, 1.3667e-4, 1.2364e-4, 9.7576e-5,
15895 7.914e-5, 6.4241e-5, 5.1826e-5, 4.1415e-5, 3.1347e-5, 2.5125e-5,
15896 2.0027e-5, 1.6362e-5, 1.3364e-5, 1.1117e-5, 9.4992e-6, 8.1581e-6,
15897 7.1512e-6, 6.2692e-6, 5.5285e-6, 4.9e-6, 4.3447e-6, 3.8906e-6,
15898 3.4679e-6, 3.1089e-6, 2.8115e-6, 2.5496e-6, 2.2982e-6, 2.0861e-6,
15899 1.8763e-6, 1.7035e-6, 1.5548e-6, 1.4107e-6, 1.2839e-6, 1.1706e-6,
15900 1.0709e-6, 9.8099e-7, 8.9901e-7, 8.2394e-7, 7.5567e-7, 6.9434e-7,
15901 6.3867e-7, 5.8845e-7, 5.4263e-7, 5.0033e-7, 4.6181e-7, 4.2652e-7,
15902 3.9437e-7, 3.6497e-7, 3.3781e-7, 3.1292e-7, 2.9011e-7, 2.6915e-7,
15903 2.4989e-7, 2.3215e-7, 2.1582e-7, 2.0081e-7, 1.87e-7, 1.7432e-7,
15904 1.6264e-7, 1.5191e-7, 1.4207e-7, 1.3306e-7, 1.2484e-7, 1.1737e-7,
15905 1.1056e-7, 1.0451e-7, 9.906e-8, 9.4135e-8, 8.9608e-8, 8.5697e-8,
15906 8.1945e-8, 7.8308e-8, 7.4808e-8, 7.1686e-8, 6.8923e-8, 6.5869e-8,
15907 6.3308e-8, 6.084e-8, 5.8676e-8, 5.6744e-8, 5.5016e-8, 5.3813e-8,
15908 5.2792e-8, 5.2097e-8, 5.1737e-8, 5.1603e-8, 5.1656e-8, 5.1989e-8,
15909 5.2467e-8, 5.2918e-8, 5.3589e-8, 5.456e-8, 5.5869e-8, 5.7403e-8,
15910 5.8968e-8, 6.0973e-8, 6.3432e-8, 6.6245e-8, 6.9353e-8, 7.2686e-8,
15911 7.6541e-8, 8.0991e-8, 8.595e-8, 9.1429e-8, 9.7851e-8, 1.0516e-7,
15912 1.1349e-7, 1.2295e-7, 1.3335e-7, 1.4488e-7, 1.5864e-7, 1.7412e-7,
15913 1.914e-7, 2.1078e-7, 2.3369e-7, 2.5996e-7, 2.8848e-7, 3.2169e-7,
15914 3.5991e-7, 4.0566e-7, 4.5969e-7, 5.3094e-7, 6.1458e-7, 7.1155e-7,
15915 8.3045e-7, 9.9021e-7, 1.2042e-6, 1.4914e-6, 1.8145e-6, 2.221e-6,
15916 2.7831e-6, 3.4533e-6, 4.4446e-6, 5.1989e-6, 6.2289e-6, 7.1167e-6,
15917 8.3949e-6, 9.6417e-6, 1.0313e-5, 1.0485e-5, 1.0641e-5, 1.0898e-5,
15918 1.0763e-5, 1.0506e-5, 1.0497e-5, 1.1696e-5, 1.2654e-5, 1.3029e-5,
15919 1.3175e-5, 1.4264e-5, 1.4985e-5, 1.4999e-5, 1.4317e-5, 1.4616e-5,
15920 1.4963e-5, 1.5208e-5, 1.4942e-5, 1.3879e-5, 1.3087e-5, 1.1727e-5,
15921 1.0515e-5, 9.0073e-6, 7.3133e-6, 6.1181e-6, 5.0623e-6, 4.1105e-6,
15922 3.3915e-6, 2.6711e-6, 2.1464e-6, 1.7335e-6, 1.4302e-6, 1.1847e-6,
15923 9.9434e-7, 8.2689e-7, 7.0589e-7, 6.075e-7, 5.3176e-7, 4.6936e-7,
15924 4.1541e-7, 3.6625e-7, 3.2509e-7, 2.9156e-7, 2.6308e-7, 2.3819e-7,
15925 2.1421e-7, 1.9366e-7, 1.7626e-7, 1.5982e-7, 1.4567e-7, 1.3354e-7,
15926 1.2097e-7, 1.1029e-7, 1.0063e-7, 9.2003e-8, 8.4245e-8, 7.7004e-8,
15927 7.0636e-8, 6.4923e-8, 5.9503e-8, 5.4742e-8, 5.045e-8, 4.647e-8,
15928 4.2881e-8, 3.955e-8, 3.6541e-8, 3.3803e-8, 3.1279e-8, 2.8955e-8,
15929 2.6858e-8, 2.4905e-8, 2.3146e-8, 2.1539e-8, 2.0079e-8, 1.8746e-8,
15930 1.7517e-8, 1.6396e-8, 1.5369e-8, 1.4426e-8, 1.3543e-8, 1.2724e-8,
15931 1.1965e-8, 1.1267e-8, 1.0617e-8, 1.001e-8, 9.4662e-9, 8.9553e-9,
15932 8.4988e-9, 8.0807e-9, 7.7043e-9, 7.3721e-9, 7.0707e-9, 6.8047e-9,
15933 6.5702e-9, 6.3634e-9, 6.1817e-9, 6.0239e-9, 5.8922e-9, 5.7824e-9,
15934 5.7019e-9, 5.6368e-9, 5.594e-9, 5.5669e-9, 5.5583e-9, 5.5653e-9,
15935 5.5837e-9, 5.6243e-9, 5.6883e-9, 5.78e-9, 5.8964e-9, 6.0429e-9,
15936 6.2211e-9, 6.4282e-9, 6.6634e-9, 6.9306e-9, 7.2336e-9, 7.5739e-9,
15937 7.9562e-9, 8.3779e-9, 8.8575e-9, 9.3992e-9, 1.0004e-8, 1.0684e-8,
15938 1.145e-8, 1.232e-8, 1.3311e-8, 1.4455e-8, 1.5758e-8, 1.7254e-8,
15939 1.8927e-8, 2.093e-8, 2.3348e-8, 2.6074e-8, 2.9221e-8, 3.277e-8,
15940 3.7485e-8, 4.2569e-8, 4.8981e-8, 5.5606e-8, 6.2393e-8, 7.1901e-8,
15941 8.2921e-8, 9.5513e-8, 1.1111e-7, 1.3143e-7, 1.5971e-7, 1.8927e-7,
15942 2.2643e-7, 2.786e-7, 3.2591e-7, 3.7024e-7, 4.2059e-7, 4.9432e-7,
15943 5.5543e-7, 5.7498e-7, 5.921e-7, 6.1005e-7, 6.1577e-7, 5.9193e-7,
15944 5.6602e-7, 5.7403e-7, 6.005e-7, 6.4723e-7, 6.7073e-7, 7.5415e-7,
15945 8.0982e-7, 8.7658e-7, 9.143e-7, 9.4459e-7, 9.8347e-7, 9.8768e-7,
15946 1.0153e-6, 1.0066e-6, 1.0353e-6, 1.0353e-6, 1.0722e-6, 1.1138e-6,
15947 1.1923e-6, 1.2947e-6, 1.4431e-6, 1.6537e-6, 1.8662e-6, 2.2473e-6,
15948 2.6464e-6, 3.1041e-6, 3.4858e-6, 4.0167e-6, 4.6675e-6, 5.0983e-6,
15949 5.7997e-6, 6.0503e-6, 6.4687e-6, 6.5396e-6, 6.7986e-6, 7.0244e-6,
15950 7.2305e-6, 7.6732e-6, 7.9783e-6, 7.9846e-6, 7.7617e-6, 7.7657e-6,
15951 7.7411e-6, 7.8816e-6, 7.8136e-6, 8.0051e-6, 8.5799e-6, 9.1659e-6,
15952 9.8646e-6, 9.492e-6, 8.767e-6, 8.2034e-6, 7.2297e-6, 6.2324e-6,
15953 4.9315e-6, 3.9128e-6, 3.1517e-6, 2.4469e-6, 1.8815e-6, 1.4627e-6,
15954 1.1698e-6, 9.4686e-7, 7.8486e-7, 6.697e-7, 5.8811e-7, 5.2198e-7,
15955 4.6809e-7, 4.1671e-7, 3.7006e-7, 3.3066e-7, 2.9387e-7, 2.6415e-7,
15956 2.3409e-7, 2.0991e-7, 1.9132e-7, 1.7519e-7, 1.5939e-7, 1.4368e-7,
15957 1.305e-7, 1.1883e-7, 1.0772e-7, 9.6884e-8, 8.7888e-8, 7.8956e-8,
15958 7.1024e-8, 6.3824e-8, 5.7256e-8, 5.1769e-8, 4.7037e-8, 4.2901e-8,
15959 3.897e-8, 3.5467e-8, 3.2502e-8, 2.9827e-8, 2.7389e-8, 2.5111e-8,
15960 2.3056e-8, 2.1267e-8, 1.961e-8, 1.8133e-8, 1.6775e-8, 1.5491e-8,
15961 1.4329e-8, 1.3265e-8, 1.23e-8, 1.142e-8, 1.0593e-8, 9.8475e-9,
15962 9.1585e-9, 8.5256e-9, 7.9525e-9, 7.4226e-9, 6.9379e-9, 6.495e-9,
15963 6.0911e-9, 5.7242e-9, 5.3877e-9, 5.0821e-9, 4.8051e-9, 4.5554e-9,
15964 4.3315e-9, 4.1336e-9, 3.9632e-9, 3.8185e-9, 3.708e-9, 3.6296e-9,
15965 3.5804e-9, 3.5776e-9, 3.6253e-9, 3.7115e-9, 3.8151e-9, 3.9804e-9,
15966 4.1742e-9, 4.3581e-9, 4.5306e-9, 4.7736e-9, 5.1297e-9, 5.5291e-9,
15967 5.9125e-9, 6.4956e-9, 7.0362e-9, 7.5318e-9, 7.9947e-9, 8.6438e-9,
15968 9.7227e-9, 1.013e-8, 1.0549e-8, 1.1064e-8, 1.1702e-8, 1.2043e-8,
15969 1.1781e-8, 1.1838e-8, 1.1917e-8, 1.2131e-8, 1.2476e-8, 1.3611e-8,
15970 1.436e-8, 1.5057e-8, 1.6247e-8, 1.7284e-8, 1.842e-8, 1.8352e-8,
15971 1.8722e-8, 1.9112e-8, 1.9092e-8, 1.9311e-8, 1.9411e-8, 1.9884e-8,
15972 2.0508e-8, 2.151e-8, 2.3143e-8, 2.505e-8, 2.7596e-8, 3.1231e-8,
15973 3.626e-8, 4.341e-8, 5.224e-8, 6.3236e-8, 7.7522e-8, 9.8688e-8,
15974 1.1859e-7, 1.4341e-7, 1.6798e-7, 1.9825e-7, 2.2898e-7, 2.6257e-7,
15975 2.9884e-7, 3.3247e-7, 3.4936e-7, 3.5583e-7, 3.715e-7, 3.658e-7,
15976 3.7124e-7, 3.703e-7, 4.1536e-7, 4.6656e-7, 4.6677e-7, 4.7507e-7,
15977 4.9653e-7, 5.3795e-7, 5.4957e-7, 5.2238e-7, 5.469e-7, 5.6569e-7,
15978 5.9844e-7, 5.9835e-7, 5.6522e-7, 5.4123e-7, 4.7904e-7, 4.2851e-7,
15979 3.5603e-7, 2.8932e-7, 2.3655e-7, 1.8592e-7, 1.4943e-7, 1.1971e-7,
15980 9.8482e-8, 8.3675e-8, 7.127e-8, 6.2496e-8, 5.4999e-8, 4.9821e-8,
15981 4.5387e-8, 4.134e-8, 3.7453e-8, 3.3298e-8, 3.012e-8, 2.7032e-8,
15982 2.4236e-8, 2.15e-8, 1.8988e-8, 1.7414e-8, 1.5706e-8, 1.4192e-8,
15983 1.3204e-8, 1.1759e-8, 1.0737e-8, 9.6309e-9, 8.8179e-9, 8.2619e-9,
15984 7.2264e-9, 6.4856e-9, 5.8037e-9, 5.2093e-9, 4.7205e-9, 4.1749e-9,
15985 3.7852e-9, 3.3915e-9, 3.0089e-9, 2.7335e-9, 2.4398e-9, 2.2031e-9,
15986 1.9786e-9, 1.789e-9, 1.6266e-9, 1.483e-9, 1.3576e-9, 1.2518e-9,
15987 1.1587e-9, 1.0726e-9, 9.9106e-10, 9.1673e-10, 8.5084e-10,
15988 7.9147e-10, 7.2882e-10, 6.7342e-10, 6.2593e-10, 5.8294e-10,
15989 5.4435e-10, 5.0997e-10, 4.7806e-10, 4.4931e-10, 4.2357e-10,
15990 4.0023e-10, 3.7909e-10, 3.5999e-10, 3.4285e-10, 3.2776e-10,
15991 3.1468e-10, 3.0377e-10, 2.9479e-10, 2.8877e-10, 2.8512e-10,
15992 2.8617e-10, 2.8976e-10, 3.0001e-10, 3.1718e-10, 3.3898e-10,
15993 3.5857e-10, 3.8358e-10, 4.3131e-10, 4.5741e-10, 4.6948e-10,
15994 4.7594e-10, 4.9529e-10, 5.1563e-10, 4.9475e-10, 4.8369e-10,
15995 4.8829e-10, 5.0047e-10, 5.0203e-10, 5.1954e-10, 5.5352e-10,
15996 5.9928e-10, 6.7148e-10, 7.1121e-10, 7.4317e-10, 7.6039e-10,
15997 7.8313e-10, 8.0684e-10, 7.8553e-10, 7.8312e-10, 7.8537e-10,
15998 7.8872e-10, 8.0185e-10, 8.1004e-10, 8.2608e-10, 8.2525e-10,
15999 8.3857e-10, 8.792e-10, 9.2451e-10, 9.8661e-10, 1.0629e-9,
16000 1.1659e-9, 1.2922e-9, 1.4387e-9, 1.6254e-9, 1.8425e-9, 2.1428e-9,
16001 2.5477e-9, 3.0379e-9, 3.757e-9, 4.4354e-9, 5.1802e-9, 6.2769e-9,
16002 7.4894e-9, 8.7474e-9, 9.8037e-9, 1.1582e-8, 1.3293e-8, 1.4471e-8,
16003 1.5025e-8, 1.558e-8, 1.6228e-8, 1.6413e-8, 1.602e-8, 1.6393e-8,
16004 1.7545e-8, 1.959e-8, 2.1449e-8, 2.3856e-8, 2.705e-8, 3.0214e-8,
16005 3.3733e-8, 3.6487e-8, 3.9353e-8, 4.266e-8, 4.6385e-8, 4.9955e-8,
16006 5.5313e-8, 6.0923e-8, 6.8948e-8, 7.3649e-8, 8.2602e-8, 9.2212e-8,
16007 9.908e-8, 1.1319e-7, 1.179e-7, 1.2941e-7, 1.3199e-7, 1.3914e-7,
16008 1.4843e-7, 1.53e-7, 1.6419e-7, 1.7095e-7, 1.6988e-7, 1.6494e-7,
16009 1.6327e-7, 1.6067e-7, 1.6909e-7, 1.7118e-7, 1.8106e-7, 1.9857e-7,
16010 2.1696e-7, 2.3385e-7, 2.2776e-7, 2.1402e-7, 1.9882e-7, 1.7362e-7,
16011 1.4308e-7, 1.1158e-7, 8.8781e-8, 6.8689e-8, 5.2062e-8, 4.0427e-8,
16012 3.2669e-8, 2.7354e-8, 2.32e-8, 2.058e-8, 1.8676e-8, 1.7329e-8,
16013 1.6621e-8, 1.6433e-8, 1.6953e-8, 1.7134e-8, 1.7948e-8, 1.9107e-8,
16014 1.9875e-8, 2.1416e-8, 2.1556e-8, 2.2265e-8, 2.2171e-8, 2.2534e-8,
16015 2.3029e-8, 2.2828e-8, 2.3143e-8, 2.2965e-8, 2.2223e-8, 2.1108e-8,
16016 2.0265e-8, 1.9516e-8, 1.9941e-8, 2.0312e-8, 2.108e-8, 2.2611e-8,
16017 2.421e-8, 2.6069e-8, 2.5097e-8, 2.3318e-8, 2.1543e-8, 1.8942e-8,
16018 1.596e-8, 1.2386e-8, 9.934e-9, 7.7502e-9, 5.9462e-9, 4.5113e-9,
16019 3.5523e-9, 2.8844e-9, 2.3394e-9, 1.9584e-9, 1.6749e-9, 1.4624e-9,
16020 1.2809e-9, 1.1359e-9, 1.0087e-9, 9.0166e-10, 8.1079e-10,
16021 7.2219e-10, 6.4922e-10, 5.8803e-10, 5.329e-10, 4.859e-10,
16022 4.4111e-10, 4.0184e-10, 3.6644e-10, 3.3529e-10, 3.0789e-10,
16023 2.8286e-10, 2.6089e-10, 2.4125e-10, 2.2355e-10, 2.0783e-10,
16024 1.937e-10, 1.8088e-10, 1.6948e-10, 1.5929e-10, 1.5013e-10,
16025 1.4193e-10, 1.347e-10, 1.2841e-10, 1.2307e-10, 1.1865e-10,
16026 1.1502e-10, 1.1243e-10, 1.1099e-10, 1.1066e-10, 1.1216e-10,
16027 1.1529e-10, 1.2171e-10, 1.3128e-10, 1.4153e-10, 1.5962e-10,
16028 1.8048e-10, 2.0936e-10, 2.3165e-10, 2.5746e-10, 2.96e-10,
16029 3.3707e-10, 3.5267e-10, 3.5953e-10, 3.6822e-10, 3.8363e-10,
16030 3.8286e-10, 3.5883e-10, 3.6154e-10, 3.6653e-10, 3.8507e-10,
16031 4.025e-10, 4.4435e-10, 4.9889e-10, 5.6932e-10, 6.3599e-10,
16032 7.0281e-10, 7.5777e-10, 8.1279e-10, 8.891e-10, 9.34e-10,
16033 1.0076e-9, 1.0945e-9, 1.1898e-9, 1.3108e-9, 1.4725e-9, 1.7028e-9,
16034 1.9619e-9, 2.3527e-9, 2.6488e-9, 3.0327e-9, 3.4396e-9, 3.8797e-9,
16035 4.4115e-9, 4.6853e-9, 4.9553e-9, 4.9551e-9, 5.1062e-9, 5.0996e-9,
16036 5.1119e-9, 5.2283e-9, 5.8297e-9, 6.3439e-9, 6.2675e-9, 6.3296e-9,
16037 6.5173e-9, 7.1685e-9, 7.0528e-9, 6.8856e-9, 7.3182e-9, 7.699e-9,
16038 8.3461e-9, 8.1946e-9, 7.7153e-9, 7.2411e-9, 6.4511e-9, 5.7336e-9,
16039 4.6105e-9, 3.6962e-9, 2.9944e-9, 2.4317e-9, 1.9399e-9, 1.5331e-9,
16040 1.2633e-9, 1.0613e-9, 9.0136e-10, 7.9313e-10, 7.1543e-10,
16041 6.6485e-10, 6.4225e-10, 6.398e-10, 6.4598e-10, 6.7428e-10,
16042 7.027e-10, 7.4694e-10, 7.7946e-10, 7.9395e-10, 7.8716e-10,
16043 7.6933e-10, 7.622e-10, 7.4825e-10, 7.4805e-10, 7.6511e-10,
16044 7.6492e-10, 7.4103e-10, 7.1979e-10, 7.1686e-10, 7.3403e-10,
16045 7.1142e-10, 7.0212e-10, 7.1548e-10, 7.5253e-10, 8.0444e-10,
16046 8.2378e-10, 7.8004e-10, 7.1712e-10, 6.4978e-10, 5.7573e-10,
16047 4.8675e-10, 3.7945e-10, 3.0118e-10, 2.4241e-10, 1.91e-10,
16048 1.4816e-10, 1.1567e-10, 9.4183e-11, 7.766e-11, 6.527e-11,
16049 5.6616e-11, 4.9576e-11, 4.4137e-11, 3.9459e-11, 3.5759e-11,
16050 3.2478e-11, 2.9419e-11, 2.6703e-11, 2.4365e-11, 2.2412e-11,
16051 2.0606e-11, 1.9067e-11, 1.78e-11, 1.6695e-11, 1.5729e-11,
16052 1.4887e-11, 1.4135e-11, 1.3519e-11, 1.2992e-11, 1.2563e-11,
16053 1.2223e-11, 1.1962e-11, 1.1775e-11, 1.1657e-11, 1.1605e-11,
16054 1.1619e-11, 1.1697e-11, 1.1839e-11, 1.2046e-11, 1.2319e-11,
16055 1.2659e-11, 1.307e-11, 1.3553e-11, 1.4113e-11, 1.4754e-11,
16056 1.548e-11, 1.6298e-11, 1.7214e-11, 1.8236e-11, 1.9372e-11,
16057 2.0635e-11, 2.2036e-11, 2.359e-11, 2.5317e-11, 2.7242e-11,
16058 2.94e-11, 3.1849e-11, 3.4654e-11, 3.7923e-11, 4.1695e-11,
16059 4.6055e-11, 5.094e-11, 5.5624e-11, 6.0667e-11, 6.6261e-11,
16060 7.2692e-11, 7.9711e-11, 8.7976e-11, 9.6884e-11, 1.0775e-10,
16061 1.2093e-10, 1.3531e-10, 1.5404e-10, 1.7315e-10, 1.9862e-10,
16062 2.3341e-10, 2.7014e-10, 3.1716e-10, 3.6957e-10, 4.3233e-10,
16063 5.2566e-10, 6.2251e-10, 7.2149e-10, 8.3958e-10, 9.5931e-10,
16064 1.1388e-9, 1.2973e-9, 1.4442e-9, 1.5638e-9, 1.6974e-9, 1.8489e-9,
16065 1.983e-9, 2.172e-9, 2.3662e-9, 2.6987e-9, 3.1697e-9, 3.6907e-9,
16066 4.2625e-9, 4.7946e-9, 5.3848e-9, 6.0897e-9, 6.473e-9, 7.1483e-9,
16067 7.7432e-9, 8.0851e-9, 8.5013e-9, 8.5909e-9, 9.189e-9, 9.3124e-9,
16068 9.5936e-9, 9.8787e-9, 9.9036e-9, 9.6712e-9, 9.2036e-9, 9.0466e-9,
16069 8.938e-9, 9.1815e-9, 9.5092e-9, 1.0027e-8, 1.0876e-8, 1.1744e-8,
16070 1.1853e-8, 1.1296e-8, 1.0134e-8, 8.8245e-9, 7.393e-9, 5.715e-9,
16071 4.4884e-9, 3.4027e-9, 2.6054e-9, 2.079e-9, 1.7267e-9, 1.4724e-9,
16072 1.2722e-9, 1.1234e-9, 1.0186e-9, 9.468e-10, 8.8854e-10,
16073 8.5127e-10, 8.3157e-10, 8.2226e-10, 8.3395e-10, 8.3294e-10,
16074 8.4725e-10, 8.8814e-10, 9.3697e-10, 1.0112e-9, 1.0412e-9,
16075 1.0948e-9, 1.181e-9, 1.2267e-9, 1.369e-9, 1.4512e-9, 1.5568e-9,
16076 1.6552e-9, 1.7321e-9, 1.8797e-9, 1.921e-9, 1.9686e-9, 1.9917e-9,
16077 1.9357e-9, 1.8486e-9, 1.7575e-9, 1.7113e-9, 1.7163e-9, 1.7623e-9,
16078 1.8536e-9, 1.9765e-9, 2.1334e-9, 2.3237e-9, 2.3259e-9, 2.1833e-9,
16079 1.9785e-9, 1.7308e-9, 1.4596e-9, 1.1198e-9, 8.7375e-10,
16080 6.5381e-10, 4.8677e-10, 3.6756e-10, 2.9155e-10, 2.3735e-10,
16081 1.959e-10, 1.6638e-10, 1.4549e-10, 1.2947e-10, 1.1511e-10,
16082 1.0548e-10, 9.6511e-11, 9.0469e-11, 8.517e-11, 7.7804e-11,
16083 7.1971e-11, 6.6213e-11, 6.1063e-11, 5.5881e-11, 5.0508e-11,
16084 4.5932e-11, 4.1997e-11, 3.7672e-11, 3.3972e-11, 3.0318e-11,
16085 2.6769e-11, 2.3874e-11, 2.1336e-11, 1.9073e-11, 1.7313e-11,
16086 1.5904e-11, 1.4684e-11, 1.3698e-11, 1.2873e-11, 1.2175e-11,
16087 1.1542e-11, 1.1024e-11, 1.0602e-11, 1.0267e-11, 1.0012e-11,
16088 9.8379e-12, 9.7482e-12, 9.7564e-12, 9.8613e-12, 1.0092e-11,
16089 1.0418e-11, 1.0868e-11, 1.1585e-11, 1.2351e-11, 1.3372e-11,
16090 1.4841e-11, 1.6457e-11, 1.8681e-11, 2.055e-11, 2.2912e-11,
16091 2.5958e-11, 2.9137e-11, 3.2368e-11, 3.4848e-11, 3.8462e-11,
16092 4.219e-11, 4.5629e-11, 4.9022e-11, 5.4232e-11, 6.19e-11,
16093 7.1953e-11, 8.5368e-11, 9.9699e-11, 1.1734e-10, 1.4185e-10,
16094 1.7017e-10, 1.9813e-10, 2.3859e-10, 2.7304e-10, 3.0971e-10,
16095 3.5129e-10, 3.9405e-10, 4.5194e-10, 4.8932e-10, 5.2436e-10,
16096 5.4098e-10, 5.5542e-10, 5.7794e-10, 5.6992e-10, 5.879e-10,
16097 6.1526e-10, 6.8034e-10, 6.7956e-10, 6.6864e-10, 6.9329e-10,
16098 7.2971e-10, 7.6546e-10, 7.5078e-10, 7.8406e-10, 8.3896e-10,
16099 9.0111e-10, 9.1994e-10, 8.7189e-10, 8.1426e-10, 7.3097e-10,
16100 6.3357e-10, 5.1371e-10, 4.0936e-10, 3.2918e-10, 2.6255e-10,
16101 2.0724e-10, 1.6879e-10, 1.4165e-10, 1.1989e-10, 1.0125e-10,
16102 8.9629e-11, 7.8458e-11, 6.8826e-11, 6.0935e-11, 5.5208e-11,
16103 5.2262e-11, 5.026e-11, 4.8457e-11, 4.7888e-11, 4.8032e-11,
16104 5.0838e-11, 5.4668e-11, 5.579e-11, 6.0056e-11, 6.3811e-11,
16105 6.8848e-11, 7.459e-11, 7.8249e-11, 8.3371e-11, 8.3641e-11,
16106 8.6591e-11, 8.9599e-11, 9.3487e-11, 1.0066e-10, 1.0765e-10,
16107 1.0851e-10, 1.0619e-10, 1.0557e-10, 1.046e-10, 1.0796e-10,
16108 1.0523e-10, 1.0674e-10, 1.1261e-10, 1.1431e-10, 1.1408e-10,
16109 1.0901e-10, 9.9105e-11, 8.8077e-11, 6.9928e-11, 5.4595e-11,
16110 4.5401e-11, 3.6313e-11, 2.6986e-11, 1.9463e-11, 1.4577e-11,
16111 1.1583e-11, 9.5492e-12, 8.077e-12, 6.9642e-12, 6.0966e-12,
16112 5.4046e-12, 4.8431e-12, 4.3815e-12, 3.9987e-12, 3.679e-12,
16113 3.4113e-12, 3.1868e-12, 2.9992e-12, 2.8434e-12, 2.7153e-12,
16114 2.612e-12, 2.5311e-12, 2.4705e-12, 2.429e-12, 2.4053e-12,
16115 2.3988e-12, 2.4087e-12, 2.4349e-12, 2.4771e-12, 2.5355e-12,
16116 2.6103e-12, 2.7019e-12, 2.811e-12, 2.9383e-12, 3.0848e-12,
16117 3.2518e-12, 3.4405e-12, 3.6527e-12, 3.8902e-12, 4.1555e-12,
16118 4.451e-12, 4.7801e-12, 5.1462e-12, 5.5539e-12, 6.0086e-12,
16119 6.5171e-12, 7.0884e-12, 7.7357e-12, 8.4831e-12, 9.3096e-12,
16120 1.0282e-11, 1.1407e-11, 1.269e-11, 1.4148e-11, 1.5888e-11,
16121 1.7992e-11, 2.0523e-11, 2.3342e-11, 2.6578e-11, 3.0909e-11,
16122 3.6228e-11, 4.2053e-11, 4.9059e-11, 5.9273e-11, 7.0166e-11,
16123 8.2298e-11, 9.7071e-11, 1.1673e-10, 1.401e-10, 1.6621e-10,
16124 2.0127e-10, 2.3586e-10, 2.705e-10, 3.095e-10, 3.6584e-10,
16125 4.1278e-10, 4.6591e-10, 5.222e-10, 5.5246e-10, 6.15e-10,
16126 6.5878e-10, 7.1167e-10, 7.9372e-10, 8.6975e-10, 9.6459e-10,
16127 9.7368e-10, 9.8142e-10, 1.0202e-9, 1.02e-9, 1.0356e-9, 1.0092e-9,
16128 1.0269e-9, 1.0366e-9, 1.049e-9, 1.0717e-9, 1.0792e-9, 1.1016e-9,
16129 1.0849e-9, 1.0929e-9, 1.0971e-9, 1.0969e-9, 1.046e-9, 9.2026e-10,
16130 8.1113e-10, 6.8635e-10, 5.5369e-10, 4.2908e-10, 3.3384e-10,
16131 2.648e-10, 2.081e-10, 1.6915e-10, 1.4051e-10, 1.1867e-10,
16132 1.0158e-10, 8.899e-11, 7.9175e-11, 7.044e-11, 6.3453e-11,
16133 5.7009e-11, 5.1662e-11, 4.7219e-11, 4.3454e-11, 4.0229e-11,
16134 3.7689e-11, 3.6567e-11, 3.5865e-11, 3.5955e-11, 3.5928e-11,
16135 3.6298e-11, 3.7629e-11, 3.93e-11, 4.1829e-11, 4.4806e-11,
16136 5.0534e-11, 5.6672e-11, 6.2138e-11, 6.8678e-11, 7.6111e-11,
16137 8.4591e-11, 9.2634e-11, 9.8085e-11, 1.083e-10, 1.1949e-10,
16138 1.2511e-10, 1.3394e-10, 1.3505e-10, 1.4342e-10, 1.4874e-10,
16139 1.492e-10, 1.5872e-10, 1.5972e-10, 1.5821e-10, 1.5425e-10,
16140 1.4937e-10, 1.5089e-10, 1.5521e-10, 1.6325e-10, 1.6924e-10,
16141 1.8265e-10, 1.9612e-10, 2.0176e-10, 1.9359e-10, 1.7085e-10,
16142 1.5197e-10, 1.2646e-10, 9.8552e-11, 7.453e-11, 5.5052e-11,
16143 4.2315e-11, 3.2736e-11, 2.6171e-11, 2.1909e-11, 1.8286e-11,
16144 1.5752e-11, 1.3859e-11, 1.2288e-11, 1.1002e-11, 9.7534e-12,
16145 8.8412e-12, 8.0169e-12, 7.2855e-12, 6.8734e-12, 6.4121e-12,
16146 6.1471e-12, 5.778e-12, 5.3478e-12, 4.9652e-12, 4.4043e-12,
16147 3.9862e-12, 3.4684e-12, 2.9681e-12, 2.5791e-12, 2.2339e-12,
16148 1.9247e-12, 1.6849e-12, 1.4863e-12, 1.3291e-12, 1.2021e-12,
16149 1.0947e-12, 1.0015e-12, 9.1935e-13, 8.4612e-13, 7.8036e-13,
16150 7.21e-13, 6.6718e-13, 6.1821e-13, 5.7353e-13, 5.3269e-13,
16151 4.9526e-13, 4.6093e-13, 4.2937e-13, 4.0034e-13, 3.7361e-13,
16152 3.4895e-13, 3.2621e-13, 3.052e-13, 2.8578e-13, 2.6782e-13,
16153 2.512e-13, 2.3581e-13, 2.2154e-13, 2.0832e-13, 1.9605e-13,
16154 1.8466e-13, 1.7408e-13, 1.6425e-13, 1.5511e-13, 1.4661e-13,
16155 1.3869e-13, 1.3131e-13, 1.2444e-13, 1.1803e-13, 1.1205e-13,
16156 1.0646e-13, 1.0124e-13, 9.6358e-14, 9.1789e-14, 8.7509e-14,
16157 8.3498e-14, 7.9735e-14, 7.6202e-14, 7.2882e-14, 6.976e-14,
16158 6.6822e-14, 6.4053e-14, 6.1442e-14, 5.8978e-14, 5.665e-14,
16159 5.4448e-14, 5.2364e-14, 5.0389e-14, 4.8516e-14, 4.6738e-14,
16160 4.5048e-14, 4.3441e-14, 4.1911e-14, 4.0453e-14, 3.9063e-14,
16161 3.7735e-14, 3.6467e-14, 3.5254e-14, 3.4093e-14, 3.298e-14,
16162 3.1914e-14, 3.0891e-14, 2.9909e-14, 2.8965e-14, 2.8058e-14,
16163 2.7185e-14, 2.6344e-14, 2.5535e-14, 2.4755e-14, 2.4002e-14,
16164 2.3276e-14, 2.2576e-14, 2.1899e-14, 2.1245e-14, 2.0613e-14,
16165 2.0002e-14, 1.9411e-14, 1.8839e-14, 1.8285e-14, 1.7749e-14,
16166 1.723e-14, 1.6727e-14, 1.624e-14, 1.5768e-14, 1.531e-14,
16167 1.4867e-14, 1.4436e-14, 1.4019e-14, 1.3614e-14, 1.3221e-14,
16168 1.284e-14, 1.2471e-14, 1.2112e-14, 1.1764e-14, 1.1425e-14,
16169 1.1097e-14, 1.0779e-14, 1.0469e-14, 1.0169e-14, 9.8775e-15,
16170 9.5943e-15, 9.3193e-15, 9.0522e-15, 8.7928e-15, 8.5409e-15,
16171 8.2962e-15, 8.0586e-15, 7.8278e-15, 7.6036e-15, 7.3858e-15,
16172 7.1742e-15, 6.9687e-15, 6.7691e-15, 6.5752e-15, 6.3868e-15,
16173 6.2038e-15, 6.026e-15, 5.8533e-15, 5.6856e-15, 5.5226e-15,
16174 5.3642e-15, 5.2104e-15, 5.061e-15, 4.9158e-15, 4.7748e-15,
16175 4.6378e-15, 4.5047e-15, 4.3753e-15, 4.2497e-15, 4.1277e-15,
16176 4.0091e-15, 3.8939e-15, 3.782e-15, 3.6733e-15, 3.5677e-15,
16177 3.4651e-15, 3.3655e-15, 3.2686e-15, 3.1746e-15, 3.0832e-15,
16178 2.9944e-15, 2.9082e-15, 2.8244e-15, 2.7431e-15, 2.664e-15,
16179 2.5872e-15, 2.5126e-15, 2.4401e-15, 2.3697e-15, 2.3014e-15,
16180 2.2349e-15, 2.1704e-15, 2.1077e-15, 2.0468e-15, 1.9877e-15,
16181 1.9302e-15, 1.8744e-15, 1.8202e-15, 1.7675e-15, 1.7164e-15,
16182 1.6667e-15, 1.6184e-15, 1.5716e-15, 1.526e-15, 1.4818e-15,
16183 1.4389e-15, 1.3971e-15, 1.3566e-15, 1.3172e-15, 1.279e-15,
16184 1.2419e-15, 1.2058e-15, 1.1708e-15, 1.1368e-15, 1.1037e-15,
16185 1.0716e-15, 1.0405e-15, 1.0102e-15, 9.8079e-16, 9.5224e-16,
16186 9.2451e-16, 8.9758e-16, 8.7142e-16, 8.4602e-16, 8.2136e-16,
16187 7.974e-16, 7.7414e-16, 7.5154e-16, 7.2961e-16, 7.083e-16,
16188 6.8761e-16, 6.6752e-16, 6.4801e-16, 6.2906e-16, 6.1066e-16,
16189 5.928e-16, 5.7545e-16, 5.586e-16, 5.4224e-16, 5.2636e-16,
16190 5.1094e-16, 4.9596e-16} };
16191
16192 struct s_s260b_ {
16193 double e_1[3];
16194 int e_2;
16195 } s260b_ = { {-20., 2e4, 10.}, 2003 };
16196
16197 struct s_consts_ {
16198 double e_1[9];
16199 } consts_ = { {3.1415927410125732, 6.62606876e-27, 1.3806503e-16,
16200 29979245800., 6.02214199e23, 2.6867775e19, 83144720.,
16201 1.191042722e-12, 1.4387752} };
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243 double artsckd_(double p, double t, double vmrh2o,
16244 double vmrn2, double vmro2, double freq, int ivc)
16245 {
16246
16247
16248 static double xslf = 1.;
16249 static double xfrg = 1.;
16250 static double xcn2 = 1.;
16251
16252
16253 double ret_val=0.0e0;
16254
16255
16256
16257
16258 double w_wv__, oc_n2, radct;
16259 double w_other__, w_n2__, w_o2__;
16260 double of_wv, os_wv, p0, xn_wv__, t0, rhofac, wn, xn, xn0, tksvpt, rft;
16261
16262 extern int initi_(double, double , double *,
16263 double *, double *, double *, double *,
16264 double *, double *, double *, double *,
16265 double *, double *);
16266 extern double fwv_(int , double , double *, double *,
16267 double *, double *, double *, double *);
16268 extern double swv_(int , double , double , double *, double *
16269 , double *, double *, double *, double *,
16270 double *);
16271 extern double conti_n2__(double , double , double *,
16272 double *, double *, double *, double *);
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358 w_wv__ = 0.0e0;
16359 w_o2__ = 0.0e0;
16360 w_n2__ = 0.0e0;
16361 w_other__ = 0.0e0;
16362 ret_val = 0.0e0;
16363 rft = 0.0e0;
16364 os_wv = 0.0e0;
16365 of_wv = 0.0e0;
16366 oc_n2 = 0.0e0;
16367
16368
16369
16370
16371
16372 tksvpt = (p * 100.0) / t;
16373
16374 w_wv__ = vmrh2o * 7.242923e16 * tksvpt;
16375 w_o2__ = vmro2 * 7.242923e16 * tksvpt;
16376 w_n2__ = vmrn2 * 7.242923e16 * tksvpt;
16377 w_other__ = (1.0000E0-vmrh2o-vmro2-vmrn2) * 7.242923e16 * tksvpt;
16378
16379
16380 wn = freq / 29979245800.0;
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390 initi_(p, t, &radct, &t0, &p0, &w_wv__, &w_o2__, &w_n2__, &w_other__, &
16391 xn0, &xn, &xn_wv__, &rhofac);
16392
16393
16394
16395
16396
16397
16398
16399
16400 rft = wn * tanh(radct * wn / (t * 2));
16401
16402
16403
16404
16405 if (ivc == 21) {
16406
16407 os_wv = 1.0000e2 * swv_(2, wn, t, &t0, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xslf);
16408
16409 return os_wv;
16410 }
16411 if (ivc == 31) {
16412
16413 os_wv = 1.0000e2 * swv_(3, wn, t, &t0, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xslf);
16414
16415 return os_wv;
16416 }
16417 if (ivc == 22) {
16418
16419 of_wv = 1.0000e2 * fwv_(2, wn, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xfrg);
16420
16421 return of_wv;
16422 }
16423 if (ivc == 32) {
16424
16425 of_wv = 1.0000e2 * fwv_(3, wn, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xfrg);
16426
16427 return of_wv ;
16428 }
16429
16430
16431 if (ivc == 1) {
16432 oc_n2 = 1.0000e2 * conti_n2__(wn, t, &t0, &w_n2__, &rft, &rhofac, &xcn2);
16433
16434 return oc_n2;
16435 }
16436
16437
16438
16439
16440
16441
16442
16443 return ret_val;
16444 }
16445
16446
16447
16448
16449 double fwv_(int ivc, double wn, double *w_wv__, double *rft,
16450 double *xn, double *xn_wv__, double *xn0, double *xfrg)
16451 {
16452
16453 double ret_val = 0.0e0;
16454
16455
16456 extern double fwv24_(double , double *, double *,
16457 double *, double *, double *, double *),
16458 fwv_mpmf87s93__(double , double *, double *,
16459 double *, double *, double *, double *);
16460
16461 ret_val = 0.0e0;
16462
16463
16464 if (ivc == 2 && *w_wv__ > 0.) {
16465 ret_val = fwv24_(wn, w_wv__, rft, xn, xn_wv__, xn0, xfrg);
16466 }
16467
16468
16469
16470 if (ivc == 3 && *w_wv__ > 0.) {
16471 ret_val = fwv_mpmf87s93__(wn, w_wv__, rft, xn, xn_wv__, xn0, xfrg);
16472 }
16473
16474 return ret_val;
16475 }
16476
16477 double fwv_mpmf87s93__(double wn, double *w_wv__, double *rft,
16478 double *xn, double *xn_wv__, double *xn0, double *xfrg)
16479 {
16480
16481 double ret_val=0.0e0;
16482
16483
16484 extern double xlgr_(double *, double *);
16485 int i__, j;
16486 double x[4], fscal, xf;
16487
16488 ret_val = 0.0e0;
16489
16490 j = (int) ((wn - fh2ob_1.v1) / fh2ob_1.dv) + 1;
16491
16492 for (i__ = 1; i__ <= 4; ++i__) {
16493 x[i__ - 1] = fh2oa_1.fh2o[j + i__ - 3];
16494 }
16495
16496 xf = (wn - (fh2ob_1.v1 + fh2ob_1.dv * (double) (j - 1))) /
16497 fh2ob_1.dv;
16498 fscal = .8;
16499 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_wv__ * *rft * ((*xn - *xn_wv__) / *
16500 xn0)) * fscal * *xfrg;
16501
16502
16503 return ret_val;
16504 }
16505
16506 double fwv24_(double wn, double *w_wv__, double *rft,
16507 double *xn, double *xn_wv__, double *xn0, double *
16508 xfrg)
16509 {
16510
16511
16512 static double v0f1 = 350.;
16513 static double hwsqf1 = 4e4;
16514 static double betaf1 = 5e-9;
16515 static double factrf1 = -.7;
16516 static double v0f1a = 630.;
16517 static double hwsqf1a = 4225.;
16518 static double betaf1a = 2e-8;
16519 static double factrf1a = .75;
16520 static double v0f2 = 1130.;
16521 static double hwsqf2 = 108900.;
16522 static double betaf2 = 8e-11;
16523 static double factrf2 = -.97;
16524 static double v0f3 = 1975.;
16525 static double hwsqf3 = 62500.;
16526 static double betaf3 = 5e-6;
16527 static double factrf3 = -.65;
16528
16529
16530 double ret_val=0.0e0;
16531 double d__1;
16532
16533
16534 extern double xlgr_(double *, double *);
16535 int i__, j;
16536 double x[4], fscal, xf, vf2, vf4, vf6;
16537
16538 ret_val = 0.0e0;
16539
16540 j = (int) ((wn - fh2ob_1.v1) / fh2ob_1.dv) + 1;
16541 for (i__ = 1; i__ <= 4; ++i__) {
16542 x[i__ - 1] = fh2oa_1.fh2o[j + i__ - 3];
16543 }
16544
16545 xf = (wn - (fh2ob_1.v1 + fh2ob_1.dv * (double) (j - 1))) /
16546 fh2ob_1.dv;
16547
16548
16549
16550 d__1 = wn - v0f1;
16551 vf2 = d__1 * d__1;
16552 vf6 = vf2 * vf2 * vf2;
16553 fscal = factrf1 * (hwsqf1 / (vf2 + betaf1 * vf6 + hwsqf1)) + 1.;
16554
16555 d__1 = wn - v0f1a;
16556 vf2 = d__1 * d__1;
16557 vf6 = vf2 * vf2 * vf2;
16558 fscal *= factrf1a * (hwsqf1a / (vf2 + betaf1a * vf6 + hwsqf1a)) + 1.;
16559
16560 d__1 = wn - v0f2;
16561 vf2 = d__1 * d__1;
16562 vf6 = vf2 * vf2 * vf2;
16563 fscal *= factrf2 * (hwsqf2 / (vf2 + betaf2 * vf6 + hwsqf2)) + 1.;
16564
16565 d__1 = wn - v0f3;
16566 vf2 = d__1 * d__1;
16567 vf4 = vf2 * vf2;
16568 fscal *= factrf3 * (hwsqf3 / (vf2 + betaf3 * vf4 + hwsqf3)) + 1.;
16569 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_wv__ * *rft * ((*xn - *xn_wv__) / *
16570 xn0)) * fscal * *xfrg;
16571
16572
16573 return ret_val;
16574 }
16575
16576
16577
16578
16579 double swv_(int ivc, double wn, double t, double *t0,
16580 double *w_wv__, double *rft, double *xn, double *
16581 xn_wv__, double *xn0, double *xslf)
16582 {
16583
16584 double ret_val;
16585
16586
16587 extern double swv_mpmf87s93__(double , double , double *
16588 , double *, double *, double *, double *,
16589 double *, double *);
16590 extern double swv24_(double , double ,
16591 double *, double *, double *, double *,
16592 double *, double *, double *);
16593
16594 ret_val = 0.;
16595
16596
16597 if (ivc == 2 && *w_wv__ > 0.) {
16598
16599 ret_val = swv24_(wn, t, t0, w_wv__, rft, xn, xn_wv__, xn0, xslf);
16600 }
16601
16602 if (ivc == 3 && *w_wv__ > 0.) {
16603
16604
16605 ret_val = swv_mpmf87s93__(wn, t, t0, w_wv__, rft, xn, xn_wv__, xn0,
16606 xslf);
16607 }
16608
16609 return ret_val;
16610 }
16611
16612
16613
16614 double swv24_(double wn, double t, double *t0, double *
16615 w_wv__, double *rft, double * , double *xn_wv__,
16616 double *xn0, double *xslf)
16617 {
16618
16619
16620 static double v0s1 = 0.;
16621 static double hwsq1 = 1e4;
16622 static double betas1 = 1e-4;
16623 static double factrs1 = .688;
16624 static double v0s2 = 1050.;
16625 static double hwsq2 = 4e4;
16626 static double factrs2 = -.2333;
16627 static double v0s3 = 1310.;
16628 static double hwsq3 = 14400.;
16629 static double betas3 = 5e-6;
16630 static double factrs3 = -.15;
16631
16632
16633 double ret_val, d__1, d__2;
16634
16635
16636 double sfac;
16637 extern double xlgr_(double *, double *);
16638 int j;
16639 double x[4], xf, vs2, vs4;
16640
16641
16642
16643 ret_val = 0.;
16644
16645 j = (int) ((wn - sh2ob_1.v1) / sh2ob_1.dv) + 1;
16646 d__1 = s260a_1.swv260[j - 2] / sh2oa_1.swv296[j - 2];
16647 d__2 = (t - *t0) / (260. - *t0);
16648 x[0] = sh2oa_1.swv296[j - 2] * pow(d__1, d__2);
16649 d__1 = s260a_1.swv260[j - 1] / sh2oa_1.swv296[j - 1];
16650 d__2 = (t - *t0) / (260. - *t0);
16651 x[1] = sh2oa_1.swv296[j - 1] * pow(d__1, d__2);
16652 d__1 = s260a_1.swv260[j] / sh2oa_1.swv296[j];
16653 d__2 = (t - *t0) / (260. - *t0);
16654 x[2] = sh2oa_1.swv296[j] * pow(d__1, d__2);
16655 d__1 = s260a_1.swv260[j + 1] / sh2oa_1.swv296[j + 1];
16656 d__2 = (t - *t0) / (260. - *t0);
16657 x[3] = sh2oa_1.swv296[j + 1] * pow(d__1, d__2);
16658 xf = (wn - (sh2ob_1.v1 + sh2ob_1.dv * (double) (j - 1))) /
16659 sh2ob_1.dv;
16660 sfac = 1.;
16661
16662 d__1 = wn - v0s1;
16663 vs2 = d__1 * d__1;
16664 vs4 = vs2 * vs2;
16665
16666 d__1 = wn;
16667 sfac *= factrs1 * (hwsq1 / (d__1 * d__1 + betas1 * vs4 + hwsq1)) + 1.;
16668
16669 d__1 = wn - v0s2;
16670 vs2 = d__1 * d__1;
16671 sfac *= factrs2 * (hwsq2 / (vs2 + hwsq2)) + 1.;
16672
16673 d__1 = wn - v0s3;
16674 vs2 = d__1 * d__1;
16675 vs4 = vs2 * vs2;
16676 sfac *= factrs3 * (hwsq3 / (vs2 + betas3 * vs4 + hwsq3)) + 1.;
16677 ret_val = *w_wv__ * *rft * (*xn_wv__ / *xn0) * xlgr_(&xf, x) * 1e-20 *
16678 sfac * *xslf;
16679
16680 return ret_val;
16681 }
16682
16683 double swv_mpmf87s93__(double wn, double t, double *t0,
16684 double *w_wv__, double *rft, double * , double *
16685 xn_wv__, double *xn0, double *xslf)
16686 {
16687
16688 double ret_val, d__1, d__2;
16689
16690
16691 double sfac;
16692 extern double xlgr_(double *, double *);
16693 int j;
16694 double x[4], xf;
16695
16696
16697
16698 ret_val = 0.;
16699
16700 j = (int) ((wn - sh2ob_1.v1) / sh2ob_1.dv) + 1;
16701 d__1 = s260a_1.swv260[j - 2] / sh2oa_1.swv296[j - 2];
16702 d__2 = (t - *t0) / (260. - *t0);
16703 x[0] = sh2oa_1.swv296[j - 2] * pow(d__1, d__2);
16704 d__1 = s260a_1.swv260[j - 1] / sh2oa_1.swv296[j - 1];
16705 d__2 = (t - *t0) / (260. - *t0);
16706 x[1] = sh2oa_1.swv296[j - 1] * pow(d__1, d__2);
16707 d__1 = s260a_1.swv260[j] / sh2oa_1.swv296[j];
16708 d__2 = (t - *t0) / (260. - *t0);
16709 x[2] = sh2oa_1.swv296[j] * pow(d__1, d__2);
16710 d__1 = s260a_1.swv260[j + 1] / sh2oa_1.swv296[j + 1];
16711 d__2 = (t - *t0) / (260. - *t0);
16712 x[3] = sh2oa_1.swv296[j + 1] * pow(d__1, d__2);
16713 xf = (wn - (sh2ob_1.v1 + sh2ob_1.dv * (double) (j - 1))) /
16714 sh2ob_1.dv;
16715 sfac = 3.;
16716 ret_val = *w_wv__ * *rft * (*xn_wv__ / *xn0) * xlgr_(&xf, x) * 1e-20 *
16717 sfac * *xslf;
16718
16719
16720 return ret_val;
16721 }
16722
16723
16724 double conti_n2__(double wn, double t, double *t0,
16725 double *w_n2__, double *rft, double *rhofac, double *
16726 xcn2)
16727 {
16728
16729
16730 static double v1 = -10.;
16731 static double dv = 5.;
16732 static double ct296[73] = { 4.303e-7,4.85e-7,4.979e-7,4.85e-7,
16733 4.303e-7,3.715e-7,3.292e-7,3.086e-7,2.92e-7,2.813e-7,2.804e-7,
16734 2.738e-7,2.726e-7,2.724e-7,2.635e-7,2.621e-7,2.547e-7,2.428e-7,
16735 2.371e-7,2.228e-7,2.1e-7,1.991e-7,1.822e-7,1.697e-7,1.555e-7,
16736 1.398e-7,1.281e-7,1.138e-7,1.012e-7,9.078e-8,7.879e-8,6.944e-8,
16737 6.084e-8,5.207e-8,4.54e-8,3.897e-8,3.313e-8,2.852e-8,2.413e-8,
16738 2.045e-8,1.737e-8,1.458e-8,1.231e-8,1.031e-8,8.586e-9,7.162e-9,
16739 5.963e-9,4.999e-9,4.226e-9,3.607e-9,3.09e-9,2.669e-9,2.325e-9,
16740 2.024e-9,1.783e-9,1.574e-9,1.387e-9,1.236e-9,1.098e-9,9.777e-10,
16741 8.765e-10,7.833e-10,7.022e-10,6.317e-10,5.65e-10,5.1e-10,
16742 4.572e-10,4.115e-10,3.721e-10,3.339e-10,3.005e-10,2.715e-10,
16743 2.428e-10 };
16744 static double ct220[73] = { 4.946e-7,5.756e-7,5.964e-7,5.756e-7,
16745 4.946e-7,4.145e-7,3.641e-7,3.482e-7,3.34e-7,3.252e-7,3.299e-7,
16746 3.206e-7,3.184e-7,3.167e-7,2.994e-7,2.943e-7,2.794e-7,2.582e-7,
16747 2.468e-7,2.237e-7,2.038e-7,1.873e-7,1.641e-7,1.474e-7,1.297e-7,
16748 1.114e-7,9.813e-8,8.309e-8,7.059e-8,6.068e-8,5.008e-8,4.221e-8,
16749 3.537e-8,2.885e-8,2.407e-8,1.977e-8,1.605e-8,1.313e-8,1.057e-8,
16750 8.482e-9,6.844e-9,5.595e-9,4.616e-9,3.854e-9,3.257e-9,2.757e-9,
16751 2.372e-9,2.039e-9,1.767e-9,1.548e-9,1.346e-9,1.181e-9,1.043e-9,
16752 9.11e-10,8.103e-10,7.189e-10,6.314e-10,5.635e-10,4.976e-10,
16753 4.401e-10,3.926e-10,3.477e-10,3.085e-10,2.745e-10,2.416e-10,
16754 2.155e-10,1.895e-10,1.678e-10,1.493e-10,1.31e-10,1.154e-10,
16755 1.019e-10,8.855e-11 };
16756
16757
16758 double ret_val, d__1, d__2;
16759
16760
16761 extern double xlgr_(double *, double *);
16762 int j;
16763 double x[4], xf;
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774 ret_val = 0.;
16775
16776 if (wn <= 0.) {
16777 ret_val = 0.;
16778 return ret_val;
16779 }
16780 if (wn > 350.) {
16781 ret_val = 0.;
16782 return ret_val;
16783 }
16784
16785
16786 if (*w_n2__ == 0.) {
16787 ret_val = 0.;
16788 return ret_val;
16789 }
16790
16791 j = (int) ((wn - v1) / dv) + 1;
16792 d__1 = ct296[j - 2] / ct220[j - 2];
16793 d__2 = (t - *t0) / (220. - *t0);
16794 x[0] = ct296[j - 2] * pow(d__1, d__2);
16795 d__1 = ct296[j - 1] / ct220[j - 1];
16796 d__2 = (t - *t0) / (220. - *t0);
16797 x[1] = ct296[j - 1] * pow(d__1, d__2);
16798 d__1 = ct296[j] / ct220[j];
16799 d__2 = (t - *t0) / (220. - *t0);
16800 x[2] = ct296[j] * pow(d__1, d__2);
16801 d__1 = ct296[j + 1] / ct220[j + 1];
16802 d__2 = (t - *t0) / (220. - *t0);
16803 x[3] = ct296[j + 1] * pow(d__1, d__2);
16804 xf = (wn - (v1 + dv * (double) (j - 1))) / dv;
16805 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_n2__ / .26867775 * *rft * *rhofac) *
16806 *xcn2;
16807
16808 return ret_val;
16809 }
16810
16811
16812 double xlgr_(double *xf, double *x)
16813 {
16814
16815 double ret_val;
16816
16817
16818 double a[4], b;
16819
16820
16821
16822
16823
16824
16825 --x;
16826
16827
16828 b = *xf * .5 * (1. - *xf);
16829 a[0] = -b * (1. - *xf);
16830 a[1] = 1. - (3. - *xf * 2.) * *xf * *xf + b * *xf;
16831 a[2] = (3. - *xf * 2.) * *xf * *xf + b * (1. - *xf);
16832 a[3] = -(b * *xf);
16833 ret_val = a[0] * x[1] + a[1] * x[2] + a[2] * x[3] + a[3] * x[4];
16834
16835
16836 return ret_val;
16837 }
16838
16839
16840 int initi_(double p, double t, double *radct,
16841 double *t0, double *p0, double *w_wv__, double *
16842 w_o2__, double *w_n2__, double *w_other__, double *xn0,
16843 double *xn, double *xn_wv__, double *rhofac)
16844 {
16845
16846
16847 static double wvmolmass = 18.016;
16848 static double drymolmass = 28.97;
16849
16850 double wdry, ratiomix, wvpress;
16851
16852
16853 *t0 = 296.;
16854
16855 *p0 = 1013.25;
16856
16857
16858 *radct = consts_1.planck * consts_1.clight / consts_1.boltz;
16859 *xn0 = *p0 / (consts_1.boltz * *t0) * 1e3;
16860 *xn = p / (consts_1.boltz * t) * 1e3;
16861 wdry = *w_o2__ + *w_n2__ + *w_other__;
16862 ratiomix = *w_wv__ * wvmolmass / (wdry * drymolmass);
16863 wvpress = ratiomix / (ratiomix + wvmolmass / drymolmass) * p;
16864 *xn_wv__ = wvpress / (consts_1.boltz * t) * 1e3;
16865 *rhofac = *w_n2__ / (wdry + *w_wv__) * (p / *p0) * (273.15 / t);
16866
16867
16868 return 0;
16869 }
16870
16871
16872
16873 int phys_consts__(void)
16874 {
16875 return 0;
16876 }
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892 int bsa296_(void)
16893 {
16894 return 0;
16895 }
16896
16897
16898
16899
16900
16901
16902
16903 int bsb296_(void)
16904 {
16905 return 0;
16906 }
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917 int bs260a_(void)
16918 {
16919 return 0;
16920 }
16921
16922
16923
16924
16925
16926
16927
16928
16929 int bs260b_(void)
16930 {
16931 return 0;
16932 }
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943 int bfh2oa_(void)
16944 {
16945 return 0;
16946 }
16947
16948
16949
16950
16951
16952
16953
16954
16955 int bfh2ob_(void)
16956 {
16957 return 0;
16958 }
16959
16960
16961