00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00336 #include <cmath>
00337 #include "arts.h"
00338 #include "matpackI.h"
00339 #include "array.h"
00340 #include "absorption.h"
00341 #include "messages.h"
00342 #include "continua.h"
00343
00344
00345
00346
00347
00348 extern const Numeric EULER_NUMBER;
00349 extern const Numeric LOG10_EULER_NUMBER;
00350 extern const Numeric NAT_LOG_TEN;
00351 extern const Numeric PI;
00352 extern const Numeric SPEED_OF_LIGHT;
00353
00354
00355
00356
00357 const Numeric Np_to_dB = (10.000000 * LOG10_EULER_NUMBER);
00358
00359 const Numeric dB_to_Np = (1.000000 / Np_to_dB);
00360
00361 const Numeric GHz_to_Hz = 1.000000e9;
00362
00363 const Numeric Hz_to_GHz = 1.000000e-9;
00364
00365 const Numeric kPa_to_Pa = 1.000000e3;
00366
00367 const Numeric Pa_to_kPa = 1.000000e-3;
00368
00369 const Numeric hPa_to_Pa = 1.000000e2;
00370
00371 const Numeric Pa_to_hPa = 1.000000e-2;
00372
00373
00374 const Numeric dB_m_Hz = 0.1820427855916028e-06;
00375 const Numeric dB_km_GHz = 0.1820427855916028e+06;
00376
00377
00378
00379
00380
00381 const Numeric dB_km_to_Np_km = dB_to_Np;
00382
00383 const Numeric dB_km_to_Np_m = (1.00000e-3 / (10.0 * LOG10_EULER_NUMBER));
00384
00385 const Numeric dB_km_to_1_m = (1.00000e-3 / (10.0 * LOG10_EULER_NUMBER));
00386
00387
00388
00389
00390 const Numeric VMRCalcLimit = 1.000e-25;
00391
00392
00393
00394
00395
00431 void MPM87H2OAbsModel( MatrixView xsec,
00432 const Numeric CCin,
00433 const Numeric CLin,
00434 const Numeric CWin,
00435 const String& model,
00436 ConstVectorView f_mono,
00437 ConstVectorView p_abs,
00438 ConstVectorView t_abs,
00439 ConstVectorView vmr )
00440 {
00441
00442
00443
00444
00445
00446 const Numeric mpm87[30][4] = {
00447 { 22.235080, 0.1090, 2.143, 27.84e-3},
00448 { 67.813960, 0.0011, 8.730, 27.60e-3},
00449 { 119.995940, 0.0007, 8.347, 27.00e-3},
00450 { 183.310117, 2.3000, 0.653, 31.64e-3},
00451 { 321.225644, 0.0464, 6.156, 21.40e-3},
00452 { 325.152919, 1.5400, 1.515, 29.70e-3},
00453 { 336.187000, 0.0010, 9.802, 26.50e-3},
00454 { 380.197372, 11.9000, 1.018, 30.36e-3},
00455 { 390.134508, 0.0044, 7.318, 19.00e-3},
00456 { 437.346667, 0.0637, 5.015, 13.70e-3},
00457 { 439.150812, 0.9210, 3.561, 16.40e-3},
00458 { 443.018295, 0.1940, 5.015, 14.40e-3},
00459 { 448.001075, 10.6000, 1.370, 23.80e-3},
00460 { 470.888947, 0.3300, 3.561, 18.20e-3},
00461 { 474.689127, 1.2800, 2.342, 19.80e-3},
00462 { 488.491133, 0.2530, 2.814, 24.90e-3},
00463 { 503.568532, 0.0374, 6.693, 11.50e-3},
00464 { 504.482692, 0.0125, 6.693, 11.90e-3},
00465 { 556.936002, 510.0000, 0.114, 30.00e-3},
00466 { 620.700807, 5.0900, 2.150, 22.30e-3},
00467 { 658.006500, 0.2740, 7.767, 30.00e-3},
00468 { 752.033227, 250.0000, 0.336, 28.60e-3},
00469 { 841.073593, 0.0130, 8.113, 14.10e-3},
00470 { 859.865000, 0.1330, 7.989, 28.60e-3},
00471 { 899.407000, 0.0550, 7.845, 28.60e-3},
00472 { 902.555000, 0.0380, 8.360, 26.40e-3},
00473 { 906.205524, 0.1830, 5.039, 23.40e-3},
00474 { 916.171582, 8.5600, 1.369, 25.30e-3},
00475 { 970.315022, 9.1600, 1.842, 24.00e-3},
00476 { 987.926764, 138.0000, 0.178, 28.60e-3}};
00477
00478
00479
00480 const Numeric CC_MPM87 = 1.00000;
00481 const Numeric CL_MPM87 = 1.00000;
00482 const Numeric CW_MPM87 = 1.00000;
00483
00484
00485
00486
00487 Numeric CC, CL, CW;
00488 if ( model == "MPM87" )
00489 {
00490 CC = CC_MPM87;
00491 CL = CL_MPM87;
00492 CW = CW_MPM87;
00493 }
00494 else if ( model == "MPM87Lines" )
00495 {
00496 CC = 0.000;
00497 CL = CL_MPM87;
00498 CW = CW_MPM87;
00499 }
00500 else if ( model == "MPM87Continuum" )
00501 {
00502 CC = CC_MPM87;
00503 CL = 0.000;
00504 CW = 0.000;
00505 }
00506 else if ( model == "user" )
00507 {
00508 CC = CCin;
00509 CL = CLin;
00510 CW = CWin;
00511 }
00512 else
00513 {
00514 ostringstream os;
00515 os << "H2O-MPM87: ERROR! Wrong model values given.\n"
00516 << "Valid models are: 'MPM87', 'MPM87Lines', 'MPM87Continuum', and 'user'" << '\n';
00517 throw runtime_error(os.str());
00518 }
00519 out3 << "H2O-MPM87: (model=" << model << ") parameter values in use:\n"
00520 << " CC = " << CC << "\n"
00521 << " CL = " << CL << "\n"
00522 << " CW = " << CW << "\n";
00523
00524
00525
00526 const Index i_first = 0;
00527 const Index i_last = 29;
00528
00529 const Index n_p = p_abs.nelem();
00530 const Index n_f = f_mono.nelem();
00531
00532
00533 assert ( n_p==t_abs.nelem() );
00534 assert ( n_p==vmr.nelem() );
00535
00536
00537
00538 assert ( n_f==xsec.nrows() );
00539 assert ( n_p==xsec.ncols() );
00540
00541
00542 for ( Index i=0; i<n_p; ++i )
00543 {
00544
00545
00546 Numeric pwv_dummy = Pa_to_kPa * p_abs[i];
00547
00548 Numeric theta = (300.0 / t_abs[i]);
00549
00550 Numeric pwv = Pa_to_kPa * p_abs[i] * vmr[i];
00551
00552 Numeric pda = (Pa_to_kPa * p_abs[i]) - pwv;
00553
00554 Numeric Nppc = CC * pwv_dummy * pow(theta, (Numeric)3.0) * 1.000e-5
00555 * ( (0.113 * pda) + (3.57 * pwv * pow(theta, (Numeric)7.8)) );
00556
00557
00558 for ( Index s=0; s<n_f; ++s )
00559 {
00560
00561 Numeric ff = f_mono[s] * Hz_to_GHz;
00562
00563 Numeric Nppl = 0.000;
00564
00565
00566 for ( Index l = i_first; l <= i_last; ++l )
00567 {
00568
00569 Numeric strength = CL * pwv_dummy * mpm87[l][1]
00570 * pow(theta,(Numeric)3.5) * exp(mpm87[l][2]*(1.000-theta));
00571
00572 Numeric gam = CW * mpm87[l][3] *
00573 ( (4.80 * pwv * pow(theta, (Numeric)1.1)) +
00574 ( pda * pow(theta, (Numeric)0.6)) );
00575
00576
00577
00578 Nppl += strength * MPMLineShapeFunction(gam, mpm87[l][0], ff);
00579 }
00580
00581 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * ( Nppl + (Nppc * ff) );
00582 }
00583 }
00584 return;
00585 }
00586
00587
00588
00615 void MPM89H2OAbsModel( MatrixView xsec,
00616 const Numeric CCin,
00617 const Numeric CLin,
00618 const Numeric CWin,
00619 const String& model,
00620 ConstVectorView f_mono,
00621 ConstVectorView p_abs,
00622 ConstVectorView t_abs,
00623 ConstVectorView vmr )
00624 {
00625
00626
00627
00628
00629
00630 const Numeric mpm89[30][7] = {
00631 { 22.235080, 0.1090, 2.143, 28.11, 0.69, 4.80, 1.00},
00632 { 67.813960, 0.0011, 8.735, 28.58, 0.69, 4.93, 0.82},
00633 { 119.995940, 0.0007, 8.356, 29.48, 0.70, 4.78, 0.79},
00634 { 183.310074, 2.3000, 0.668, 28.13, 0.64, 5.30, 0.85},
00635 { 321.225644, 0.0464, 6.181, 23.03, 0.67, 4.69, 0.54},
00636 { 325.152919, 1.5400, 1.540, 27.83, 0.68, 4.85, 0.74},
00637 { 336.187000, 0.0010, 9.829, 26.93, 0.69, 4.74, 0.61},
00638 { 380.197372, 11.9000, 1.048, 28.73, 0.69, 5.38, 0.84},
00639 { 390.134508, 0.0044, 7.350, 21.52, 0.63, 4.81, 0.55},
00640 { 437.346667, 0.0637, 5.050, 18.45, 0.60, 4.23, 0.48},
00641 { 439.150812, 0.9210, 3.596, 21.00, 0.63, 4.29, 0.52},
00642 { 443.018295, 0.1940, 5.050, 18.60, 0.60, 4.23, 0.50},
00643 { 448.001075, 10.6000, 1.405, 26.32, 0.66, 4.84, 0.67},
00644 { 470.888947, 0.3300, 3.599, 21.52, 0.66, 4.57, 0.65},
00645 { 474.689127, 1.2800, 2.381, 23.55, 0.65, 4.65, 0.64},
00646 { 488.491133, 0.2530, 2.853, 26.02, 0.69, 5.04, 0.72},
00647 { 503.568532, 0.0374, 6.733, 16.12, 0.61, 3.98, 0.43},
00648 { 504.482692, 0.0125, 6.733, 16.12, 0.61, 4.01, 0.45},
00649 { 556.936002, 510.0000, 0.159, 32.10, 0.69, 4.11, 1.00},
00650 { 620.700807, 5.0900, 2.200, 24.38, 0.71, 4.68, 0.68},
00651 { 658.006500, 0.2740, 7.820, 32.10, 0.69, 4.14, 1.00},
00652 { 752.033227, 250.0000, 0.396, 30.60, 0.68, 4.09, 0.84},
00653 { 841.073593, 0.0130, 8.180, 15.90, 0.33, 5.76, 0.45},
00654 { 859.865000, 0.1330, 7.989, 30.60, 0.68, 4.09, 0.84},
00655 { 899.407000, 0.0550, 7.917, 29.85, 0.68, 4.53, 0.90},
00656 { 902.555000, 0.0380, 8.432, 28.65, 0.70, 5.10, 0.95},
00657 { 906.205524, 0.1830, 5.111, 24.08, 0.70, 4.70, 0.53},
00658 { 916.171582, 8.5600, 1.442, 26.70, 0.70, 4.78, 0.78},
00659 { 970.315022, 9.1600, 1.920, 25.50, 0.64, 4.94, 0.67},
00660 { 987.926764, 138.0000, 0.258, 29.85, 0.68, 4.55, 0.90}};
00661
00662
00663
00664
00665 const Numeric CC_MPM89 = 1.00000;
00666 const Numeric CL_MPM89 = 1.00000;
00667 const Numeric CW_MPM89 = 1.00000;
00668
00669
00670
00671
00672 Numeric CC, CL, CW;
00673 if ( model == "MPM89" )
00674 {
00675 CC = CC_MPM89;
00676 CL = CL_MPM89;
00677 CW = CW_MPM89;
00678 }
00679 else if ( model == "MPM89Lines" )
00680 {
00681 CC = 0.000;
00682 CL = CL_MPM89;
00683 CW = CW_MPM89;
00684 }
00685 else if ( model == "MPM89Continuum" )
00686 {
00687 CC = CC_MPM89;
00688 CL = 0.000;
00689 CW = 0.000;
00690 }
00691 else if ( model == "user" )
00692 {
00693 CC = CCin;
00694 CL = CLin;
00695 CW = CWin;
00696 }
00697 else
00698 {
00699 ostringstream os;
00700 os << "H2O-MPM89: ERROR! Wrong model values given.\n"
00701 << "Valid models are: 'MPM89', 'MPM89Lines', 'MPM89Continuum', and 'user'" << '\n';
00702 throw runtime_error(os.str());
00703 }
00704 out3 << "H2O-MPM89: (model=" << model << ") parameter values in use:\n"
00705 << " CC = " << CC << "\n"
00706 << " CL = " << CL << "\n"
00707 << " CW = " << CW << "\n";
00708
00709
00710
00711 const Index i_first = 0;
00712 const Index i_last = 29;
00713
00714 const Index n_p = p_abs.nelem();
00715 const Index n_f = f_mono.nelem();
00716
00717
00718 assert ( n_p==t_abs.nelem() );
00719 assert ( n_p==vmr.nelem() );
00720
00721
00722
00723 assert ( n_f==xsec.nrows() );
00724 assert ( n_p==xsec.ncols() );
00725
00726
00727 for ( Index i=0; i<n_p; ++i )
00728 {
00729
00730
00731 Numeric pwv_dummy = Pa_to_kPa * p_abs[i];
00732
00733 Numeric theta = (300.0 / t_abs[i]);
00734
00735 Numeric pwv = Pa_to_kPa * p_abs[i] * vmr[i];
00736
00737 Numeric pda = (Pa_to_kPa * p_abs[i]) - pwv;
00738
00739 Numeric Nppc = CC * pwv_dummy * pow(theta, (Numeric)3.0) * 1.000e-5
00740 * ( (0.113 * pda) + (3.57 * pwv * pow(theta, (Numeric)7.5)) );
00741
00742
00743 for ( Index s=0; s<n_f; ++s )
00744 {
00745
00746 Numeric ff = f_mono[s] * Hz_to_GHz;
00747
00748 Numeric Nppl = 0.000;
00749
00750
00751 for ( Index l = i_first; l <= i_last; ++l )
00752 {
00753
00754 Numeric strength = CL * pwv_dummy * mpm89[l][1]
00755 * pow(theta, (Numeric)3.5) * exp(mpm89[l][2]*(1.000-theta));
00756
00757 Numeric gam = CW * mpm89[l][3] * 0.001
00758 * ( mpm89[l][5] * pwv * pow(theta, mpm89[l][6]) +
00759 pda * pow(theta, mpm89[l][4]) );
00760
00761
00762
00763
00764
00765 Nppl += strength * MPMLineShapeFunction(gam, mpm89[l][0], ff);
00766 }
00767
00768 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * ( Nppl + (Nppc * ff) );
00769 }
00770 }
00771 return;
00772 }
00773
00774
00775
00817 void MPM02H2OAbsModel( MatrixView xsec,
00818 const Numeric CCin,
00819 const Numeric CLin,
00820 const Numeric CWin,
00821 const String& model,
00822 ConstVectorView f_mono,
00823 ConstVectorView p_abs,
00824 ConstVectorView t_abs,
00825 ConstVectorView vmr )
00826 {
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854 const Numeric mpm02[35][7] = {
00855 { 22235.0800, 0.10947, 2.1678, 2.811, 4.80, 0.69, 0.61},
00856 { 67803.9600, 0.00111, 8.7518, 2.858, 4.93, 0.69, 0.82},
00857 { 119995.9400, 0.00072, 8.3688, 2.948, 4.78, 0.70, 0.79},
00858 { 183310.1170, 2.30351, 0.6794, 3.050, 5.30, 0.76, 0.85},
00859 { 321225.6400, 0.04646, 6.1792, 2.303, 4.69, 0.67, 0.54},
00860 { 325152.9190, 1.53869, 1.5408, 2.783, 4.85, 0.68, 0.74},
00861 { 336227.6200, 0.00099, 9.8233, 2.693, 4.74, 0.64, 0.61},
00862 { 380197.3720, 11.9079, 1.0439, 2.873, 5.38, 0.72, 0.89},
00863 { 390134.5080, 0.00437, 7.3408, 2.152, 4.81, 0.63, 0.55},
00864 { 437346.6670, 0.06378, 5.0384, 1.845, 4.23, 0.60, 0.48},
00865 { 439150.8120, 0.92144, 3.5853, 2.100, 4.29, 0.63, 0.62},
00866 { 443018.2950, 0.19384, 5.0384, 1.860, 4.23, 0.60, 0.50},
00867 { 448001.0750, 10.6190, 1.3952, 2.632, 4.84, 0.66, 0.67},
00868 { 470888.9470, 0.33005, 3.5853, 2.152, 4.57, 0.66, 0.65},
00869 { 474689.1270, 1.27660, 2.3674, 2.355, 4.65, 0.65, 0.64},
00870 { 488491.1330, 0.25312, 2.8391, 2.602, 5.04, 0.69, 0.72},
00871 { 503568.5320, 0.03746, 6.7158, 1.612, 3.98, 0.61, 0.43},
00872 { 504482.6920, 0.01250, 6.7158, 1.612, 4.01, 0.61, 0.45},
00873 { 547676.4400, 1.01467, 0.1427, 2.600, 4.50, 0.69, 1.00},
00874 { 552020.9600, 0.18668, 0.1452, 2.600, 4.50, 0.69, 1.00},
00875 { 556936.0020, 510.51086, 0.1405, 3.210, 4.11, 0.69, 1.00},
00876 { 620700.8070, 5.10539, 2.3673, 2.438, 4.68, 0.71, 0.68},
00877 { 645905.6200, 0.00667, 8.6065, 1.800, 4.00, 0.60, 0.43},
00878 { 658006.5500, 0.27451, 7.7889, 3.210, 4.14, 0.69, 1.00},
00879 { 752033.2270, 249.68466, 0.3625, 3.060, 4.09, 0.68, 0.84},
00880 { 841051.1620, 0.01308, 8.1347, 1.590, 5.76, 0.33, 0.45},
00881 { 859965.6490, 0.13326, 8.0114, 3.060, 4.09, 0.68, 0.84},
00882 { 899302.1710, 0.05492, 7.8676, 2.985, 4.53, 0.68, 0.90},
00883 { 902609.4360, 0.03854, 8.3823, 2.865, 5.10, 0.70, 0.95},
00884 { 906206.1180, 0.18323, 5.0628, 2.408, 4.70, 0.70, 0.53},
00885 { 916171.5820, 8.56444, 1.3943, 2.670, 4.78, 0.70, 0.78},
00886 { 923113.1900, 0.00784, 10.2441, 2.900, 5.00, 0.66, 0.67},
00887 { 970315.0220, 9.16280, 1.8673, 2.550, 4.94, 0.64, 0.67},
00888 { 987926.7640, 138.28461, 0.2045, 2.985, 4.55, 0.68, 0.90},
00889
00890 { 1780.000000, 2230.00000, 0.952, 17.620, 30.50, 2.00, 5.00}};
00891
00892
00893
00894
00895
00896
00897
00898 const Numeric CC_MPM02 = 1.00000;
00899 const Numeric CL_MPM02 = 1.00000;
00900 const Numeric CW_MPM02 = 1.00000;
00901
00902
00903
00904
00905 Numeric CC, CL, CW;
00906
00907 Index i_first = 0;
00908 Index i_last = 34;
00909 if ( model == "MPM02" )
00910 {
00911 CC = CC_MPM02;
00912 CL = CL_MPM02;
00913 CW = CW_MPM02;
00914 i_first = 0;
00915 i_last = 34;
00916 }
00917 else if ( model == "MPM02Lines" )
00918 {
00919 CC = 0.000;
00920 CL = CL_MPM02;
00921 CW = CW_MPM02;
00922 i_first = 0;
00923 i_last = 33;
00924 }
00925 else if ( model == "MPM02Continuum" )
00926 {
00927 CC = CC_MPM02;
00928 CL = 0.000;
00929 CW = 0.000;
00930 i_first = 34;
00931 i_last = 34;
00932 }
00933 else if ( model == "user" )
00934 {
00935 CC = CCin;
00936 CL = CLin;
00937 CW = CWin;
00938 i_first = 0;
00939 i_last = 34;
00940
00941 }
00942 else
00943 {
00944 ostringstream os;
00945 os << "H2O-MPM02: ERROR! Wrong model values given.\n"
00946 << "Valid models are: 'MPM02', 'MPM02Lines', 'MPM02Continuum', and 'user'" << '\n';
00947 throw runtime_error(os.str());
00948 }
00949 out3 << "H2O-MPM02: (model=" << model << ") parameter values in use:\n"
00950 << " CC = " << CC << "\n"
00951 << " CL = " << CL << "\n"
00952 << " CW = " << CW << "\n";
00953
00954
00955 const Index n_p = p_abs.nelem();
00956 const Index n_f = f_mono.nelem();
00957
00958
00959 assert ( n_p==t_abs.nelem() );
00960 assert ( n_p==vmr.nelem() );
00961
00962
00963
00964 assert ( n_f==xsec.nrows() );
00965 assert ( n_p==xsec.ncols() );
00966
00967
00968 for ( Index i=0; i<n_p; ++i )
00969 {
00970
00971
00972 Numeric pwv_dummy = Pa_to_hPa * p_abs[i];
00973
00974 Numeric theta = (300.0 / t_abs[i]);
00975
00976 Numeric pwv = Pa_to_hPa * p_abs[i] * vmr[i];
00977
00978 Numeric pda = (Pa_to_hPa * p_abs[i]) - pwv;
00979
00980
00981
00982 for ( Index s=0; s<n_f; ++s )
00983 {
00984
00985 Numeric ff = f_mono[s] * Hz_to_GHz;
00986
00987 for ( Index l = i_first; l <= i_last; ++l )
00988 {
00989
00990
00991 Numeric strength = 0.00;
00992 Numeric gam = 0.00;
00993 if ( (l >= 0) && (l <= 33) )
00994 {
00995 strength = CL * pwv_dummy * mpm02[l][1] *
00996 pow(theta, (Numeric)3.5) * exp(mpm02[l][2]*(1.0-theta));
00997
00998 gam = CW * mpm02[l][3] * 0.001 *
00999 ( (mpm02[l][4] * pwv * pow(theta, mpm02[l][6])) +
01000 ( pda * pow(theta, mpm02[l][5])) );
01001 }
01002 else if ( l == 34 )
01003 {
01004 strength = CC * pwv_dummy * mpm02[l][1] *
01005 pow(theta, (Numeric)3.5) * exp(mpm02[l][2]*(1.0-theta));
01006
01007 gam = mpm02[l][3] * 0.001 *
01008 ( (mpm02[l][4] * pwv * pow(theta, mpm02[l][6])) +
01009 ( pda * pow(theta, mpm02[l][5])) );
01010 }
01011 else
01012 {
01013 ostringstream os;
01014 os << "H2O-MPM02: wrong line number detected l=" << l << " (0-34)\n";
01015 throw runtime_error(os.str());
01016 return;
01017 }
01018
01019
01020
01021
01022
01023 Numeric Npp = strength * MPMLineShapeFunction(gam, mpm02[l][0], ff);
01024
01025 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * Npp;
01026 }
01027 }
01028 }
01029 return;
01030 }
01031
01032
01033
01034
01075 void MPM93H2OAbsModel( MatrixView xsec,
01076 const Numeric CCin,
01077 const Numeric CLin,
01078 const Numeric CWin,
01079 const String& model,
01080 ConstVectorView f_mono,
01081 ConstVectorView p_abs,
01082 ConstVectorView t_abs,
01083 ConstVectorView vmr )
01084 {
01085
01086
01087
01088
01089
01090 const Numeric mpm93[35][7] = {
01091 { 22.235080, 0.01130, 2.143, 2.811, 4.80, 0.69, 1.00},
01092 { 67.803960, 0.00012, 8.735, 2.858, 4.93, 0.69, 0.82},
01093 { 119.995940, 0.00008, 8.356, 2.948, 4.78, 0.70, 0.79},
01094 { 183.310091, 0.24200, 0.668, 3.050, 5.30, 0.64, 0.85},
01095 { 321.225644, 0.00483, 6.181, 2.303, 4.69, 0.67, 0.54},
01096 { 325.152919, 0.14990, 1.540, 2.783, 4.85, 0.68, 0.74},
01097 { 336.222601, 0.00011, 9.829, 2.693, 4.74, 0.69, 0.61},
01098 { 380.197372, 1.15200, 1.048, 2.873, 5.38, 0.54, 0.89},
01099 { 390.134508, 0.00046, 7.350, 2.152, 4.81, 0.63, 0.55},
01100 { 437.346667, 0.00650, 5.050, 1.845, 4.23, 0.60, 0.48},
01101 { 439.150812, 0.09218, 3.596, 2.100, 4.29, 0.63, 0.52},
01102 { 443.018295, 0.01976, 5.050, 1.860, 4.23, 0.60, 0.50},
01103 { 448.001075, 1.03200, 1.405, 2.632, 4.84, 0.66, 0.67},
01104 { 470.888947, 0.03297, 3.599, 2.152, 4.57, 0.66, 0.65},
01105 { 474.689127, 0.12620, 2.381, 2.355, 4.65, 0.65, 0.64},
01106 { 488.491133, 0.02520, 2.853, 2.602, 5.04, 0.69, 0.72},
01107 { 503.568532, 0.00390, 6.733, 1.612, 3.98, 0.61, 0.43},
01108 { 504.482692, 0.00130, 6.733, 1.612, 4.01, 0.61, 0.45},
01109
01110
01111 { 547.676440, 0.97010*0.00199983, 0.114, 2.600, 4.50, 0.70, 1.00},
01112 { 552.020960, 1.47700*0.00037200, 0.114, 2.600, 4.50, 0.70, 1.00},
01113 { 556.936002, 48.74000, 0.159, 3.210, 4.11, 0.69, 1.00},
01114 { 620.700807, 0.50120, 2.200, 2.438, 4.68, 0.71, 0.68},
01115 { 645.866155, 0.00713, 8.580, 1.800, 4.00, 0.60, 0.50},
01116 { 658.005280, 0.03022, 7.820, 3.210, 4.14, 0.69, 1.00},
01117 { 752.033227, 23.96000, 0.396, 3.060, 4.09, 0.68, 0.84},
01118 { 841.053973, 0.00140, 8.180, 1.590, 5.76, 0.33, 0.45},
01119 { 859.962313, 0.01472, 7.989, 3.060, 4.09, 0.68, 0.84},
01120 { 899.306675, 0.00605, 7.917, 2.985, 4.53, 0.68, 0.90},
01121 { 902.616173, 0.00426, 8.432, 2.865, 5.10, 0.70, 0.95},
01122 { 906.207325, 0.01876, 5.111, 2.408, 4.70, 0.70, 0.53},
01123 { 916.171582, 0.83400, 1.442, 2.670, 4.78, 0.70, 0.78},
01124 { 923.118427, 0.00869, 10.220, 2.900, 5.00, 0.70, 0.80},
01125 { 970.315022, 0.89720, 1.920, 2.550, 4.94, 0.64, 0.67},
01126 { 987.926764, 13.21000, 0.258, 2.985, 4.55, 0.68, 0.90},
01127
01128 { 1780.000000, 2230.00000, 0.952, 17.620, 30.50, 2.00, 5.00}};
01129
01130
01131
01132
01133
01134
01135
01136 const Numeric CC_MPM93 = 1.00000;
01137 const Numeric CL_MPM93 = 1.00000;
01138 const Numeric CW_MPM93 = 1.00000;
01139
01140
01141
01142
01143 Numeric CC, CL, CW;
01144
01145 Index i_first = 0;
01146 Index i_last = 34;
01147 if ( model == "MPM93" )
01148 {
01149 CC = CC_MPM93;
01150 CL = CL_MPM93;
01151 CW = CW_MPM93;
01152 i_first = 0;
01153 i_last = 34;
01154 }
01155 else if ( model == "MPM93Lines" )
01156 {
01157 CC = 0.000;
01158 CL = CL_MPM93;
01159 CW = CW_MPM93;
01160 i_first = 0;
01161 i_last = 33;
01162 }
01163 else if ( model == "MPM93Continuum" )
01164 {
01165 CC = CC_MPM93;
01166 CL = 0.000;
01167 CW = 0.000;
01168 i_first = 34;
01169 i_last = 34;
01170 }
01171 else if ( model == "user" )
01172 {
01173 CC = CCin;
01174 CL = CLin;
01175 CW = CWin;
01176 i_first = 0;
01177 i_last = 34;
01178
01179 }
01180 else
01181 {
01182 ostringstream os;
01183 os << "H2O-MPM93: ERROR! Wrong model values given.\n"
01184 << "Valid models are: 'MPM93', 'MPM93Lines', 'MPM93Continuum', and 'user'" << '\n';
01185 throw runtime_error(os.str());
01186 }
01187 out3 << "H2O-MPM93: (model=" << model << ") parameter values in use:\n"
01188 << " CC = " << CC << "\n"
01189 << " CL = " << CL << "\n"
01190 << " CW = " << CW << "\n";
01191
01192
01193 const Index n_p = p_abs.nelem();
01194 const Index n_f = f_mono.nelem();
01195
01196
01197 assert ( n_p==t_abs.nelem() );
01198 assert ( n_p==vmr.nelem() );
01199
01200
01201
01202 assert ( n_f==xsec.nrows() );
01203 assert ( n_p==xsec.ncols() );
01204
01205
01206 for ( Index i=0; i<n_p; ++i )
01207 {
01208
01209
01210 Numeric pwv_dummy = Pa_to_hPa * p_abs[i];
01211
01212 Numeric theta = (300.0 / t_abs[i]);
01213
01214 Numeric pwv = Pa_to_hPa * p_abs[i] * vmr[i];
01215
01216 Numeric pda = (Pa_to_hPa * p_abs[i]) - pwv;
01217
01218
01219
01220 for ( Index s=0; s<n_f; ++s )
01221 {
01222
01223 Numeric ff = f_mono[s] * Hz_to_GHz;
01224
01225 for ( Index l = i_first; l <= i_last; ++l )
01226 {
01227
01228
01229 Numeric strength = 0.00;
01230 Numeric gam = 0.00;
01231 if ( (l >= 0) && (l <= 33) )
01232 {
01233 strength = CL * pwv_dummy * mpm93[l][1]
01234 * pow(theta, (Numeric)3.5) * exp(mpm93[l][2]*(1.0-theta));
01235
01236 gam = CW * mpm93[l][3] * 0.001 *
01237 ( (mpm93[l][4] * pwv * pow(theta, mpm93[l][6])) +
01238 ( pda * pow(theta, mpm93[l][5])) );
01239 }
01240 else if ( l == 34 )
01241 {
01242 strength = CC * pwv_dummy * mpm93[l][1]
01243 * pow(theta, (Numeric)3.5) * exp(mpm93[l][2]*(1.0-theta));
01244
01245 gam = mpm93[l][3] * 0.001 *
01246 ( (mpm93[l][4] * pwv * pow(theta, mpm93[l][6])) +
01247 ( pda * pow(theta, mpm93[l][5])) );
01248 }
01249 else
01250 {
01251 ostringstream os;
01252 os << "H2O-MPM93: wrong line number detected l=" << l << " (0-34)\n";
01253 throw runtime_error(os.str());
01254 return;
01255 }
01256
01257
01258
01259
01260
01261 Numeric Npp = strength * MPMLineShapeFunction(gam, mpm93[l][0], ff);
01262
01263 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * Npp;
01264 }
01265 }
01266 }
01267 return;
01268 }
01269
01270
01271
01299 void PWR98H2OAbsModel( MatrixView xsec,
01300 const Numeric CCin,
01301 const Numeric CLin,
01302 const Numeric CWin,
01303 const String& model,
01304 ConstVectorView f_mono,
01305 ConstVectorView p_abs,
01306 ConstVectorView t_abs,
01307 ConstVectorView vmr )
01308 {
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326 const Numeric PWRfl[15] = { 22.2350800, 183.3101170, 321.2256400, 325.1529190, 380.1973720,
01327 439.1508120, 443.0182950, 448.0010750, 470.8889470, 474.6891270,
01328 488.4911330, 556.9360020, 620.7008070, 752.0332270, 916.1715820 };
01329
01330 const Numeric PWRs1[15] = { 1.31e-14, 2.273e-12, 8.036e-14, 2.694e-12, 2.438e-11,
01331 2.179e-12, 4.624e-13, 2.562e-11, 8.369e-13, 3.263e-12,
01332 6.659e-13, 1.531e-9, 1.707e-11, 1.011e-9, 4.227e-11 };
01333
01334 const Numeric PWRb2[15] = { 2.144, 0.668, 6.179, 1.541, 1.048,
01335 3.595, 5.048, 1.405, 3.597, 2.379,
01336 2.852, 0.159, 2.391, 0.396, 1.441 };
01337
01338 const Numeric PWRw3[15] = { 0.00281, 0.00281, 0.00230, 0.00278, 0.00287,
01339 0.00210, 0.00186, 0.00263, 0.00215, 0.00236,
01340 0.00260, 0.00321, 0.00244, 0.00306, 0.00267 };
01341
01342 const Numeric PWRx[15] = { 0.69, 0.64, 0.67, 0.68, 0.54,
01343 0.63, 0.60, 0.66, 0.66, 0.65,
01344 0.69, 0.69, 0.71, 0.68, 0.70 };
01345
01346 const Numeric PWRws[15] = { 0.01349, 0.01491, 0.01080, 0.01350, 0.01541,
01347 0.00900, 0.00788, 0.01275, 0.00983, 0.01095,
01348 0.01313, 0.01320, 0.01140, 0.01253, 0.01275 };
01349
01350
01351 const Numeric PWRxs[15] = { 0.61, 0.85, 0.54, 0.74, 0.89,
01352 0.52, 0.50, 0.67, 0.65, 0.64,
01353 0.72, 1.00, 0.68, 0.84, 0.78 };
01354
01355
01356
01357 const Numeric CC_PWR98 = 1.00000;
01358 const Numeric CL_PWR98 = 1.00000;
01359 const Numeric CW_PWR98 = 1.00000;
01360
01361
01362
01363
01364 Numeric CC, CL, CW;
01365 if ( model == "Rosenkranz" )
01366 {
01367 CC = CC_PWR98;
01368 CL = CL_PWR98;
01369 CW = CW_PWR98;
01370 }
01371 else if ( model == "RosenkranzLines" )
01372 {
01373 CC = 0.000;
01374 CL = CL_PWR98;
01375 CW = CW_PWR98;
01376 }
01377 else if ( model == "RosenkranzContinuum" )
01378 {
01379 CC = CC_PWR98;
01380 CL = 0.000;
01381 CW = 0.000;
01382 }
01383 else if ( model == "user" )
01384 {
01385 CC = CCin;
01386 CL = CLin;
01387 CW = CWin;
01388 }
01389 else
01390 {
01391 ostringstream os;
01392 os << "H2O-PWR98: ERROR! Wrong model values given.\n"
01393 << "Valid models are: 'Rosenkranz', 'RosenkranzLines', 'RosenkranzContinuum', and 'user'" << '\n';
01394 throw runtime_error(os.str());
01395 }
01396 out3 << "H2O-PWR98: (model=" << model << ") parameter values in use:\n"
01397 << " CC = " << CC << "\n"
01398 << " CL = " << CL << "\n"
01399 << " CW = " << CW << "\n";
01400
01401
01402 const Index n_p = p_abs.nelem();
01403 const Index n_f = f_mono.nelem();
01404
01405
01406 assert ( n_p==t_abs.nelem() );
01407 assert ( n_p==vmr.nelem() );
01408
01409
01410
01411 assert ( n_f==xsec.nrows() );
01412 assert ( n_p==xsec.ncols() );
01413
01414
01415 for ( Index i=0; i<n_p; ++i )
01416 {
01417
01418
01419 Numeric pvap_dummy = Pa_to_hPa * p_abs[i];
01420
01421 Numeric pvap = Pa_to_hPa * p_abs[i] * vmr[i];
01422
01423 Numeric pda = (Pa_to_hPa * p_abs[i]) - pvap;
01424
01425
01426
01427
01428
01429
01430 Numeric den_dummy = 3.335e16 * (2.1667 * p_abs[i] / t_abs[i]);
01431
01432 Numeric ti = (300.0 / t_abs[i]);
01433 Numeric ti2 = pow(ti, (Numeric)2.5);
01434
01435
01436 Numeric con = CC * pvap_dummy * pow(ti, (Numeric)3.0) * 1.000e-9
01437 * ( (0.543 * pda) + (17.96 * pvap * pow(ti, (Numeric)4.5)) );
01438
01439
01440 for ( Index s=0; s<n_f; ++s )
01441 {
01442
01443 Numeric ff = f_mono[s] * Hz_to_GHz;
01444
01445 Numeric sum = 0.000;
01446
01447
01448 for (Index l = 0; l < 15; l++)
01449 {
01450 Numeric width = ( CW * PWRw3[l] * pda * pow(ti, PWRx[l]) ) +
01451 ( PWRws[l] * pvap * pow(ti, PWRxs[l]));
01452
01453
01454 Numeric wsq = width * width;
01455 Numeric strength = CL * PWRs1[l] * ti2 * exp(PWRb2[l]*(1.0 - ti));
01456
01457 Numeric df0 = ff - PWRfl[l];
01458 Numeric df1 = ff + PWRfl[l];
01459
01460 Numeric base = width / (wsq + 562500.000);
01461
01462 Numeric res = 0.000;
01463 if (fabs(df0) < 750.0) res += width / (df0*df0 + wsq) - base;
01464 if (fabs(df1) < 750.0) res += width / (df1*df1 + wsq) - base;
01465 sum += strength * res * pow( (ff/PWRfl[l]),
01466 (Numeric)2.0 );
01467 }
01468
01469 Numeric absl = 0.3183e-4 * den_dummy * sum;
01470
01471
01472 xsec(s,i) += 1.000e-3 * ( absl + (con * ff * ff) );
01473 }
01474 }
01475 return;
01476 }
01477
01478
01479
01506 void CP98H2OAbsModel( MatrixView xsec,
01507 const Numeric CCin,
01508 const Numeric CLin,
01509 const Numeric CWin,
01510 const String& model,
01511 ConstVectorView f_mono,
01512 ConstVectorView p_abs,
01513 ConstVectorView t_abs,
01514 ConstVectorView vmr )
01515 {
01516
01517
01518
01519 const Numeric CC_CP98 = 1.2369;
01520 const Numeric CL_CP98 = 1.0639;
01521 const Numeric CW_CP98 = 1.0658;
01522
01523
01524
01525 Numeric CC, CL, CW;
01526 if ( model == "CruzPol" )
01527 {
01528 CC = CC_CP98;
01529 CL = CL_CP98;
01530 CW = CW_CP98;
01531 }
01532 else if ( model == "CruzPolLine" )
01533 {
01534 CC = 0.000;
01535 CL = CL_CP98;
01536 CW = CW_CP98;
01537 }
01538 else if ( model == "CruzPolContinuum" )
01539 {
01540 CC = CC_CP98;
01541 CL = 0.000;
01542 CW = 0.000;
01543 }
01544 else if ( model == "user" )
01545 {
01546 CC = CCin;
01547 CL = CLin;
01548 CW = CWin;
01549 }
01550 else
01551 {
01552 ostringstream os;
01553 os << "H2O-CP98: ERROR! Wrong model values given.\n"
01554 << "Valid models are: 'CruzPol', 'CruzPolLine', 'CruzPolContinuum', and 'user'" << "\n";
01555 throw runtime_error(os.str());
01556 }
01557 out3 << "H2O-CP98: (model=" << model << ") parameter values in use:\n"
01558 << " CC = " << CC << "\n"
01559 << " CL = " << CL << "\n"
01560 << " CW = " << CW << "\n";
01561
01562 const Index n_p = p_abs.nelem();
01563 const Index n_f = f_mono.nelem();
01564
01565
01566 assert ( n_p==t_abs.nelem() );
01567 assert ( n_p==vmr.nelem() );
01568
01569
01570
01571 assert ( n_f==xsec.nrows() );
01572 assert ( n_p==xsec.ncols() );
01573
01574
01575 for ( Index i=0; i<n_p; ++i )
01576 {
01577
01578 if (vmr[i] > VMRCalcLimit)
01579 {
01580
01581 Numeric theta = (300.0 / t_abs[i]);
01582
01583 Numeric pwv = Pa_to_hPa * p_abs[i] * vmr[i];
01584
01585 Numeric pda = (Pa_to_hPa * p_abs[i]) - pwv;
01586
01587 Numeric TL = CL * 0.0109 * pwv * pow(theta,(Numeric)3.5)
01588 * exp(2.143*(1.0-theta));
01589
01590 Numeric gam = CW * 0.002784 *
01591 ( (pda * pow(theta,(Numeric)0.6))
01592 + (4.80 * pwv * pow(theta,(Numeric)1.1)) );
01593
01594 Numeric TC = CC * pwv * pow(theta, (Numeric)3.0) * 1.000e-7
01595 * ( (0.113 * pda) + (3.57 * pwv * pow(theta,(Numeric)7.5)) );
01596
01597
01598 for ( Index s=0; s<n_f; ++s )
01599 {
01600
01601 Numeric ff = f_mono[s] * Hz_to_GHz;
01602 Numeric TSf = MPMLineShapeFunction(gam, 22.235080, ff);
01603
01604 xsec(s,i) += 4.1907e-5 * ff * ( (TL * TSf) + (ff * TC) ) / vmr[i];
01605 }
01606 }
01607 }
01608 return;
01609 }
01610
01611
01612
01636 void Standard_H2O_self_continuum( MatrixView xsec,
01637 const Numeric Cin,
01638 const Numeric xin,
01639 const String& model,
01640 ConstVectorView f_mono,
01641 ConstVectorView p_abs,
01642 ConstVectorView t_abs,
01643 ConstVectorView vmr )
01644 {
01645
01646
01647
01648 const Numeric Cs_PWR = 1.796e-33;
01649 const Numeric xs_PWR = 4.5;
01650
01651 const Numeric Cs_CP = 1.851e-33;
01652 const Numeric xs_CP = 7.5;
01653
01654 const Numeric Cs_MPM89 = 1.500e-33;
01655 const Numeric xs_MPM89 = 7.5;
01656
01657 const Numeric Cs_MPM87 = 1.500e-33;
01658 const Numeric xs_MPM87 = 7.5;
01659
01660
01661
01662 Numeric C, x;
01663 if ( model == "Rosenkranz" )
01664 {
01665 C = Cs_PWR;
01666 x = xs_PWR;
01667 }
01668 else if ( model == "CruzPol" )
01669 {
01670 C = Cs_CP;
01671 x = xs_CP;
01672 }
01673 else if ( model == "MPM89" )
01674 {
01675 C = Cs_MPM89;
01676 x = xs_MPM89;
01677 }
01678 else if ( model == "MPM87" )
01679 {
01680 C = Cs_MPM87;
01681 x = xs_MPM87;
01682 }
01683 else if ( model == "user" )
01684 {
01685 C = Cin;
01686 x = xin;
01687 }
01688 else
01689 {
01690 ostringstream os;
01691 os << "H2O-SelfContStandardType: ERROR! Wrong model values given.\n"
01692 << "allowed models are: 'Rosenkranz', 'CruzPol', 'MPM89', 'MPM87', 'user'" << '\n';
01693 throw runtime_error(os.str());
01694 }
01695 out3 << "H2O-SelfContStandardType: (model=" << model << ") parameter values in use:\n"
01696 << " C_s = " << C << "\n"
01697 << " x_s = " << x << "\n";
01698
01699
01700
01701 const Index n_p = p_abs.nelem();
01702 const Index n_f = f_mono.nelem();
01703
01704
01705 assert ( n_p==t_abs.nelem() );
01706 assert ( n_p==vmr.nelem() );
01707
01708
01709
01710 assert ( n_f==xsec.nrows() );
01711 assert ( n_p==xsec.ncols() );
01712
01713
01714 for ( Index i=0; i<n_p; ++i )
01715 {
01716
01717
01718
01719 Numeric dummy =
01720 C * pow( (Numeric)300./t_abs[i], x+(Numeric)3. )
01721 * pow( p_abs[i], (Numeric)2. ) * vmr[i];
01722
01723
01724 for ( Index s=0; s<n_f; ++s )
01725 {
01726 xsec(s,i) += dummy * pow( f_mono[s], (Numeric)2. );
01727
01728 }
01729 }
01730 }
01731
01732
01733
01758 void Standard_H2O_foreign_continuum( MatrixView xsec,
01759 const Numeric Cin,
01760 const Numeric xin,
01761 const String& model,
01762 ConstVectorView f_mono,
01763 ConstVectorView p_abs,
01764 ConstVectorView t_abs,
01765 ConstVectorView vmr )
01766 {
01767
01768
01769
01770 const Numeric Cf_PWR = 5.43e-35 ;
01771 const Numeric xf_PWR = 0.0;
01772
01773 const Numeric Cf_CP = 5.85e-35;
01774 const Numeric xf_CP = 0.0;
01775
01776 const Numeric Cf_MPM89 = 4.74e-35;
01777 const Numeric xf_MPM89 = 0.0;
01778
01779 const Numeric Cf_MPM87 = 4.74e-35;
01780 const Numeric xf_MPM87 = 0.0;
01781
01782
01783
01784
01785 Numeric C, x;
01786 if ( model == "Rosenkranz" )
01787 {
01788 C = Cf_PWR;
01789 x = xf_PWR;
01790 }
01791 else if ( model == "CruzPol" )
01792 {
01793 C = Cf_CP;
01794 x = xf_CP;
01795 }
01796 else if ( model == "MPM89" )
01797 {
01798 C = Cf_MPM89;
01799 x = xf_MPM89;
01800 }
01801 else if ( model == "MPM87" )
01802 {
01803 C = Cf_MPM87;
01804 x = xf_MPM87;
01805 }
01806 else if ( model == "user" )
01807 {
01808 C = Cin;
01809 x = xin;
01810 }
01811 else
01812 {
01813 ostringstream os;
01814 os << "H2O-ForeignContStandardType: ERROR! Wrong model values given.\n"
01815 << "allowed models are: 'Rosenkranz', 'CruzPol', 'MPM89', 'MPM87', 'user'" << '\n';
01816 throw runtime_error(os.str());
01817 }
01818 out3 << "H2O-ForeignContStandardType: (model=" << model << ") parameter values in use:\n"
01819 << " C_s = " << C << "\n"
01820 << " x_s = " << x << "\n";
01821
01822 const Index n_p = p_abs.nelem();
01823 const Index n_f = f_mono.nelem();
01824
01825
01826 assert ( n_p==t_abs.nelem() );
01827 assert ( n_p==vmr.nelem() );
01828
01829
01830
01831 assert ( n_f==xsec.nrows() );
01832 assert ( n_p==xsec.ncols() );
01833
01834
01835 for ( Index i=0; i<n_p; ++i )
01836 {
01837
01838 Numeric pdry = p_abs[i] * (1.000e0-vmr[i]);
01839
01840
01841
01842 Numeric dummy = C * pow( (Numeric)300./t_abs[i], x+(Numeric)3. )
01843 * p_abs[i] * pdry;
01844
01845
01846 for ( Index s=0; s<n_f; ++s )
01847 {
01848 xsec(s,i) += dummy * pow( f_mono[s], (Numeric)2. );
01849
01850 }
01851 }
01852 }
01853
01854
01855
01856
01880 void MaTipping_H2O_foreign_continuum( MatrixView xsec,
01881 const Numeric Cin,
01882 const Numeric xin,
01883 const String& model,
01884 ConstVectorView f_mono,
01885 ConstVectorView p_abs,
01886 ConstVectorView t_abs,
01887 ConstVectorView vmr )
01888 {
01889
01890
01891
01892
01893
01894
01895 const Numeric Cf_MaTipping = 1.8590e-35;
01896 const Numeric xf_MaTipping = 4.6019;
01897
01898
01899
01900
01901 Numeric C, x;
01902 if ( model == "MaTipping" )
01903 {
01904 C = Cf_MaTipping;
01905 x = xf_MaTipping;
01906 }
01907 else if ( model == "user" )
01908 {
01909 C = Cin;
01910 x = xin;
01911 }
01912 else
01913 {
01914 ostringstream os;
01915 os << "H2O-MaTipping_H2O_foreign_continuum: ERROR! Wrong model values given.\n"
01916 << "allowed models are: 'MaTipping', 'user'" << '\n';
01917 throw runtime_error(os.str());
01918 }
01919 out3 << "H2O-MaTipping_H2O_foreign_continuum: (model=" << model << ") parameter values in use:\n"
01920 << " C_s = " << C << "\n"
01921 << " x_s = " << x << "\n";
01922
01923 const Index n_p = p_abs.nelem();
01924 const Index n_f = f_mono.nelem();
01925
01926
01927 assert ( n_p==t_abs.nelem() );
01928 assert ( n_p==vmr.nelem() );
01929
01930
01931
01932 assert ( n_f==xsec.nrows() );
01933 assert ( n_p==xsec.ncols() );
01934
01935
01936 for ( Index i=0; i<n_p; ++i )
01937 {
01938
01939 Numeric pdry = p_abs[i] * (1.000e0-vmr[i]);
01940
01941
01942
01943 Numeric dummy = C * pow( (Numeric)300./t_abs[i], x )
01944 * p_abs[i] * pdry;
01945
01946
01947 for ( Index s=0; s<n_f; ++s )
01948 {
01949 xsec(s,i) += dummy * pow( f_mono[s], (Numeric)2.0389 );
01950
01951 }
01952 }
01953 }
01954
01955
01956
01957
01958
01959
01960
01961
01962 Numeric XINT_FUN( const Numeric V1A,
01963 const Numeric ,
01964 const Numeric DVA,
01965 const Numeric A[],
01966 const Numeric VI)
01967 {
01968
01969
01970
01971
01972
01973
01974 const Numeric ONEPL = 1.001;
01975
01976
01977
01978
01979 Numeric RECDVA = 1.00e0/DVA;
01980
01981 int J = (int) ((VI-V1A)*RECDVA + ONEPL) ;
01982 Numeric VJ = V1A + DVA * (Numeric)(J-1);
01983 Numeric P = RECDVA * (VI-VJ);
01984 Numeric C = (3.00e0-2.00e0*P) * P * P;
01985 Numeric B = 0.500e0 * P * (1.00e0-P);
01986 Numeric B1 = B * (1.00e0-P);
01987 Numeric B2 = B * P;
01988
01989 Numeric xint = -A[J-1] * B1 +
01990 A[J] * (1.00e0-C+B2) +
01991 A[J+1] * (C+B1) -
01992 A[J+2] * B2;
01993
01994
01995
01996
01997
01998
01999
02000 return xint;
02001 }
02002
02003
02004
02005 Numeric RADFN_FUN (const Numeric VI,
02006 const Numeric XKT)
02007 {
02008
02009
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035 Numeric XVI = VI;
02036 Numeric RADFN = 0.00e0;
02037
02038 if (XKT > 0.0)
02039 {
02040 Numeric XVIOKT = XVI/XKT;
02041
02042 if (XVIOKT <= 0.01e0)
02043 {
02044 RADFN = 0.500e0 * XVIOKT * XVI;
02045 }
02046 else if (XVIOKT <= 10.0e0)
02047 {
02048 Numeric EXPVKT = exp(-XVIOKT);
02049 RADFN = XVI * (1.00e0-EXPVKT) / (1.00e0+EXPVKT);
02050 }
02051 else
02052 {
02053 RADFN = XVI;
02054 }
02055 }
02056 else
02057 {
02058 RADFN = XVI;
02059 }
02060
02061 return RADFN;
02062 }
02063
02064
02065
02066
02093 void CKD_222_self_h2o( MatrixView xsec,
02094 const Numeric Cin,
02095 const String& model,
02096 ConstVectorView f_mono,
02097 ConstVectorView p_abs,
02098 ConstVectorView t_abs,
02099 ConstVectorView vmr,
02100 ConstVectorView )
02101 {
02102
02103
02104
02105 if ((model != "user") && (model != "CKD222"))
02106 {
02107 ostringstream os;
02108 os << "!!ERROR!!\n"
02109 << "CKDv2.2.2 H2O self continuum:\n"
02110 << "INPUT model name is: " << model << ".\n"
02111 << "VALID model names are user and CKD222\n";
02112 throw runtime_error(os.str());
02113 }
02114
02115
02116
02117 Numeric ScalingFac = 1.0000e0;
02118 if ( model == "user" )
02119 {
02120 ScalingFac = Cin;
02121 }
02122
02123
02124 const Index n_p = p_abs.nelem();
02125 const Index n_f = f_mono.nelem();
02126
02127
02128
02129 assert ( n_p==t_abs.nelem() );
02130 assert ( n_p==vmr.nelem() );
02131
02132
02133
02134 assert ( n_f==xsec.nrows() );
02135 assert ( n_p==xsec.ncols() );
02136
02137
02138
02139
02140 const Numeric xLosmt = 2.686763e19;
02141
02142 const Numeric TO = 296.0e0;
02143 const Numeric PO = 1013.0e0;
02144
02145
02146 const Numeric ALPHA2 = 200.000 * 200.000;
02147 const Numeric ALPHS2 = 120.000 * 120.000;
02148 const Numeric BETAS = 5.000e-06;
02149 const Numeric V0S = 1310.000;
02150 const Numeric FACTRS = 0.150;
02151
02152
02153 const Numeric XFAC[51] = {
02154 1.00000,1.01792,1.03767,1.05749,1.07730,1.09708,
02155 1.10489,1.11268,1.12047,1.12822,1.13597,1.14367,
02156 1.15135,1.15904,1.16669,1.17431,1.18786,1.20134,
02157 1.21479,1.22821,1.24158,1.26580,1.28991,1.28295,
02158 1.27600,1.26896,1.25550,1.24213,1.22879,1.21560,
02159 1.20230,1.18162,1.16112,1.14063,1.12016,1.10195,
02160 1.09207,1.08622,1.08105,1.07765,1.07398,1.06620,
02161 1.05791,1.04905,1.03976,1.02981,1.00985,1.00000,
02162 1.00000,1.00000,1.00000};
02163
02164
02165 const Numeric VABS_min = SL260_ckd_0_v1;
02166 const Numeric VABS_max = SL260_ckd_0_v2;
02167
02168
02169
02170
02171
02172 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
02173 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02174 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02175 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02176 {
02177 out3 << "WARNING:\n"
02178 << " CKD2.2.2 H2O self continuum:\n"
02179 << " input frequency vector exceeds range of model validity\n"
02180 << " " << SL296_ckd_0_v1 << "<->" << SL296_ckd_0_v2 << "cm^-1\n";
02181 }
02182
02183
02184
02185
02186 if (SL296_ckd_0_v1 != SL260_ckd_0_v1)
02187 {
02188 ostringstream os;
02189 os << "!!ERROR!!\n"
02190 << "CKD2.2.2 H2O self continuum:\n"
02191 << "parameter V1 not the same for different ref. temperatures.\n";
02192 throw runtime_error(os.str());
02193 }
02194 if (SL296_ckd_0_v2 != SL260_ckd_0_v2)
02195 {
02196 ostringstream os;
02197 os << "!!ERROR!!\n"
02198 << "CKD2.2.2 H2O self continuum:\n"
02199 << "parameter V2 not the same for different ref. temperatures.\n";
02200 throw runtime_error(os.str());
02201 }
02202 if (SL296_ckd_0_dv != SL260_ckd_0_dv)
02203 {
02204 ostringstream os;
02205 os << "!!ERROR!!\n"
02206 << "CKD2.2.2 H2O self continuum:\n"
02207 << "parameter DV not the same for different ref. temperatures.\n";
02208 throw runtime_error(os.str());
02209 }
02210 if (SL296_ckd_0_npt != SL260_ckd_0_npt)
02211 {
02212 ostringstream os;
02213 os << "!!ERROR!!\n"
02214 << "CKD2.2.2 H2O self continuum:\n"
02215 << "parameter NPT not the same for different ref. temperatures.\n";
02216 throw runtime_error(os.str());
02217 }
02218
02219
02220
02221 Numeric DVC = SL296_ckd_0_dv;
02222 Numeric V1C = V1ABS - DVC;
02223 Numeric V2C = V2ABS + DVC;
02224
02225 int I1 = (int) ((V1C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02226 if (V1C < SL296_ckd_0_v1) I1 = -1;
02227 V1C = SL296_ckd_0_v1 + (SL296_ckd_0_dv * (Numeric)I1);
02228
02229 int I2 = (int) ((V2C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02230
02231 int NPTC = I2-I1+3;
02232 if (NPTC > SL296_ckd_0_npt) NPTC = SL296_ckd_0_npt+1;
02233
02234 V2C = V1C + SL296_ckd_0_dv * (Numeric)(NPTC-1);
02235
02236 if (NPTC < 1)
02237 {
02238 ostringstream os;
02239 out3 << "WARNING:\n"
02240 << " CKD2.2.2 H2O self continuum:\n"
02241 << " no elements of internal continuum coefficients could be found for the\n"
02242 << " input frequency range.\n"
02243 << " Leave the function without calculating the absorption.";
02244 return;
02245 }
02246
02247 Numeric SH2OT0[NPTC+addF77fields];
02248 Numeric SH2OT1[NPTC+addF77fields];
02249
02250 for (Index J = 1 ; J <= NPTC ; ++J)
02251 {
02252 Index I = I1+J;
02253 if ( (I < 1) || (I > SL296_ckd_0_npt) )
02254 {
02255 SH2OT0[J] = 0.0e0;
02256 SH2OT1[J] = 0.0e0;
02257 }
02258 else
02259 {
02260 SH2OT0[J] = SL296_ckd_0[I];
02261 SH2OT1[J] = SL260_ckd_0[I];
02262 }
02263 }
02264
02265
02266
02267 Numeric SFAC = 1.00e0;
02268 Numeric VS2 = 0.00e0;
02269
02270
02271
02272 for ( Index i = 0 ; i < n_p ; ++i )
02273 {
02274
02275
02276 Numeric Tave = t_abs[i];
02277 Numeric Pave = (p_abs[i]*1.000e-2);
02278 Numeric Patm = Pave/PO;
02279 Numeric vmrh2o = vmr[i];
02280
02281
02282 Numeric Rh2o = Patm * (TO/Tave);
02283 Numeric Tfac = (Tave-TO)/(260.0-TO);
02284 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
02285 Numeric W1 = vmrh2o * WTOT;
02286 Numeric XKT = Tave / 1.4387752e0;
02287
02288
02289
02290
02291 Numeric k[NPTC+addF77fields];
02292 k[0] = 0.00e0;
02293 for (Index J = 1 ; J <= NPTC ; ++J)
02294 {
02295 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02296 Numeric SH2O = 0.0e0;
02297 if (SH2OT0[J] > 0.0e0)
02298 {
02299 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
02300 SFAC = 1.00e0;
02301
02302 if ( (VJ >= 700.0e0) && (VJ <= 1200.0e0) )
02303 {
02304 int JFAC = (int)((VJ - 700.0e0)/10.0e0 + 0.00001e0);
02305 if ( (JFAC >= 0) && (JFAC <= 50) )
02306 SFAC = XFAC[JFAC];
02307 }
02308
02309
02310
02311
02312
02313 VS2 = (VJ-V0S) * (VJ-V0S);
02314
02315 SFAC = SFAC *
02316 ( 1.000e0 + 0.3000e0 * (1.000e4 / ((VJ*VJ) + 1.000e4)) ) *
02317 ( 1.000e0 - 0.2333e0 * (ALPHA2 / ((VJ-1050.000e0)*(VJ-1050.000e0) + ALPHA2)) ) *
02318 ( 1.000e0 - FACTRS * (ALPHS2 / (VS2+(BETAS*VS2*VS2)+ALPHS2)) );
02319
02320 SH2O = SFAC * SH2O;
02321 }
02322
02323
02324
02325
02326 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02327
02328 }
02329
02330
02331
02332
02333 for ( Index s = 0 ; s < n_f ; ++s )
02334 {
02335
02336 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
02337 if ( (V >= 0.000e0) && (V < SL296_ckd_0_v2) )
02338 {
02339
02340
02341
02342
02343 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02344 }
02345 }
02346 }
02347
02348 }
02349
02350
02351
02352
02353
02354
02381 void CKD_222_foreign_h2o( MatrixView xsec,
02382 const Numeric Cin,
02383 const String& model,
02384 ConstVectorView f_mono,
02385 ConstVectorView p_abs,
02386 ConstVectorView t_abs,
02387 ConstVectorView vmr,
02388 ConstVectorView )
02389 {
02390
02391
02392 if ((model != "user") && (model != "CKD222"))
02393 {
02394 ostringstream os;
02395 os << "!!ERROR!!\n"
02396 << "CKDv2.2.2 H2O foreign continuum:\n"
02397 << "INPUT model name is: " << model << ".\n"
02398 << "VALID model names are user and CKD222\n";
02399 throw runtime_error(os.str());
02400 }
02401
02402
02403
02404 Numeric ScalingFac = 1.0000e0;
02405 if ( model == "user" )
02406 {
02407 ScalingFac = Cin;
02408 }
02409
02410
02411 const Index n_p = p_abs.nelem();
02412 const Index n_f = f_mono.nelem();
02413
02414
02415
02416 assert ( n_p==t_abs.nelem() );
02417 assert ( n_p==vmr.nelem() );
02418
02419
02420
02421 assert ( n_f==xsec.nrows() );
02422 assert ( n_p==xsec.ncols() );
02423
02424
02425
02426
02427 const Numeric xLosmt = 2.686763e19;
02428 const Numeric T1 = 273.000e0;
02429 const Numeric TO = 296.000e0;
02430 const Numeric PO = 1013.000e0;
02431
02432
02433 const Numeric HWSQF = 330.000e0 * 330.000e0;
02434 const Numeric BETAF = 8.000e-11;
02435 const Numeric V0F = 1130.000e0;
02436 const Numeric FACTRF = 0.970e0;
02437
02438 const Numeric V0F2 = 1900.000e0;
02439 const Numeric HWSQF2 = 150.000e0 * 150.000e0;
02440 const Numeric BETA2 = 3.000e-6;
02441
02442
02443 const Numeric VABS_min = FH2O_ckd_0_v1;
02444 const Numeric VABS_max = FH2O_ckd_0_v2;
02445
02446
02447
02448
02449
02450 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
02451 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02452 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02453 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02454 {
02455 out3 << "WARNING:\n"
02456 << " CKD2.2.2 H2O foreign continuum:\n"
02457 << " input frequency vector exceeds range of model validity\n"
02458 << " " << FH2O_ckd_0_v1 << "<->" << FH2O_ckd_0_v2 << "cm^-1\n";
02459 }
02460
02461
02462
02463
02464
02465
02466 Numeric DVC = FH2O_ckd_0_dv;
02467 Numeric V1C = V1ABS - DVC;
02468 Numeric V2C = V2ABS + DVC;
02469
02470 int I1 = (int) ((V1C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
02471 if (V1C < FH2O_ckd_0_v1) I1 = -1;
02472 V1C = FH2O_ckd_0_v1 + (FH2O_ckd_0_dv * (Numeric)I1);
02473
02474 int I2 = (int) ((V2C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
02475
02476 int NPTC = I2-I1+3;
02477 if (NPTC > FH2O_ckd_0_npt) NPTC = FH2O_ckd_0_npt+1;
02478
02479 V2C = V1C + FH2O_ckd_0_dv * (Numeric)(NPTC-1);
02480
02481 if (NPTC < 1)
02482 {
02483 out3 << "WARNING:\n"
02484 << " CKD2.2.2 H2O foreign continuum:\n"
02485 << " no elements of internal continuum coefficients could be found for the\n"
02486 << " input frequency range.\n"
02487 << " Leave the function without calculating the absorption.";
02488 return;
02489 }
02490
02491 Numeric FH2OT0[NPTC+addF77fields];
02492
02493 for (Index J = 1 ; J <= NPTC ; ++J)
02494 {
02495 Index I = I1+J;
02496 if ( (I < 1) || (I > FH2O_ckd_0_npt) )
02497 {
02498 FH2OT0[J] = 0.0e0;
02499 }
02500 else
02501 {
02502 FH2OT0[J] = FH2O_ckd_0[I];
02503 }
02504 }
02505
02506
02507
02508 Numeric VF2 = 0.000e0;
02509 Numeric VF4 = 0.000e0;
02510 Numeric VF6 = 0.000e0;
02511 Numeric FSCAL = 0.000e0;
02512 Numeric FH2O = 0.000e0;
02513
02514
02515 for ( Index i = 0 ; i < n_p ; ++i )
02516 {
02517
02518
02519 Numeric Tave = t_abs[i];
02520 Numeric Pave = (p_abs[i]*1.000e-2);
02521 Numeric vmrh2o = vmr[i];
02522
02523 Numeric PFRGN = (Pave/PO) * (1.00000e0 - vmrh2o);
02524 Numeric RFRGN = PFRGN * (TO/Tave);
02525 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
02526
02527 Numeric XKT = Tave / 1.4387752;
02528
02529
02530
02531
02532 Numeric k[NPTC+addF77fields];
02533 k[0] = 0.00e0;
02534 for (Index J = 1 ; J <= NPTC ; ++J)
02535 {
02536 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02537
02538
02539 VF2 = (VJ-V0F) * (VJ-V0F);
02540 VF6 = VF2 * VF2 * VF2;
02541 FSCAL = (1.000e0 - FACTRF*(HWSQF/(VF2+(BETAF*VF6)+HWSQF)));
02542
02543 VF2 = (VJ-V0F2) * (VJ-V0F2);
02544 VF4 = VF2 * VF2;
02545 FSCAL = FSCAL * (1.000e0 - 0.600e0*(HWSQF2/(VF2 + BETA2*VF4 + HWSQF2)));
02546
02547 FH2O = FH2OT0[J] * FSCAL;
02548
02549
02550
02551
02552 k[J] = WTOT * RFRGN * (FH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02553
02554 }
02555
02556
02557
02558
02559 for ( Index s = 0 ; s < n_f ; ++s )
02560 {
02561
02562 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
02563 if ( (V > 0.000e0) && (V < VABS_max) )
02564 {
02565
02566
02567
02568
02569 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02570 }
02571 }
02572 }
02573
02574 }
02575
02576
02577
02578
02579
02606 void CKD_242_self_h2o( MatrixView xsec,
02607 const Numeric Cin,
02608 const String& model,
02609 ConstVectorView f_mono,
02610 ConstVectorView p_abs,
02611 ConstVectorView t_abs,
02612 ConstVectorView vmr,
02613 ConstVectorView )
02614 {
02615
02616
02617
02618 if ((model != "user") && (model != "CKD242"))
02619 {
02620 ostringstream os;
02621 os << "!!ERROR!!\n"
02622 << "CKDv2.4.2 H2O self continuum:\n"
02623 << "INPUT model name is: " << model << ".\n"
02624 << "VALID model names are user and CKD242\n";
02625 throw runtime_error(os.str());
02626 }
02627
02628
02629
02630 Numeric ScalingFac = 1.0000e0;
02631 if ( model == "user" )
02632 {
02633 ScalingFac = Cin;
02634 }
02635
02636
02637 const Index n_p = p_abs.nelem();
02638 const Index n_f = f_mono.nelem();
02639
02640
02641
02642 assert ( n_p==t_abs.nelem() );
02643 assert ( n_p==vmr.nelem() );
02644
02645
02646
02647 assert ( n_f==xsec.nrows() );
02648 assert ( n_p==xsec.ncols() );
02649
02650
02651
02652
02653 const Numeric xLosmt = 2.686763e19;
02654
02655 const Numeric TO = 296.0e0;
02656 const Numeric PO = 1013.0e0;
02657
02658
02659 const Numeric V0S1 = 0.000e+00;
02660 const Numeric HWSQ1 = (1.000e+02 * 1.000e+02);
02661 const Numeric BETAS1 = 1.000e-04;
02662 const Numeric FACTRS1 = 0.688e+00;
02663
02664 const Numeric V0S2 = 1.050e+03;
02665 const Numeric HWSQ2 = (2.000e+02 * 2.000e+02);
02666 const Numeric FACTRS2 = -0.2333e+00;
02667
02668 const Numeric V0S3 = 1.310e+03;
02669 const Numeric HWSQ3 = (1.200e+02 * 1.200e+02);
02670 const Numeric BETAS3 = 5.000e-06;
02671 const Numeric FACTRS3 = -0.150e+00;
02672
02673 const Numeric XFAC[51] = {
02674 1.00000,1.01792,1.03767,1.05749,1.07730,1.09708,
02675 1.10489,1.11268,1.12047,1.12822,1.13597,1.14367,
02676 1.15135,1.15904,1.16669,1.17431,1.18786,1.20134,
02677 1.21479,1.22821,1.24158,1.26580,1.28991,1.28295,
02678 1.27600,1.26896,1.25550,1.24213,1.22879,1.21560,
02679 1.20230,1.18162,1.16112,1.14063,1.12016,1.10195,
02680 1.09207,1.08622,1.08105,1.07765,1.07398,1.06620,
02681 1.05791,1.04905,1.03976,1.02981,1.00985,1.00000,
02682 1.00000,1.00000,1.00000};
02683
02684
02685 const Numeric VABS_min = SL260_ckd_0_v1;
02686 const Numeric VABS_max = SL260_ckd_0_v2;
02687
02688
02689
02690
02691
02692 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
02693 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02694 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02695 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02696 {
02697 out3 << "WARNING:\n"
02698 << " CKD2.4.2 H2O self continuum:\n"
02699 << " input frequency vector exceeds range of model validity\n"
02700 << " " << SL296_ckd_0_v1 << "<->" << SL296_ckd_0_v2 << "cm^-1\n";
02701 }
02702
02703
02704
02705
02706 if (SL296_ckd_0_v1 != SL260_ckd_0_v1)
02707 {
02708 ostringstream os;
02709 os << "!!ERROR!!\n"
02710 << "CKD2.4.2 H2O self continuum:\n"
02711 << "parameter V1 not the same for different ref. temperatures.\n";
02712 throw runtime_error(os.str());
02713 }
02714 if (SL296_ckd_0_v2 != SL260_ckd_0_v2)
02715 {
02716 ostringstream os;
02717 os << "!!ERROR!!\n"
02718 << "CKD2.4.2 H2O self continuum:\n"
02719 << "parameter V2 not the same for different ref. temperatures.\n";
02720 throw runtime_error(os.str());
02721 }
02722 if (SL296_ckd_0_dv != SL260_ckd_0_dv)
02723 {
02724 ostringstream os;
02725 os << "!!ERROR!!\n"
02726 << "CKD2.4.2 H2O self continuum:\n"
02727 << "parameter DV not the same for different ref. temperatures.\n";
02728 throw runtime_error(os.str());
02729 }
02730 if (SL296_ckd_0_npt != SL260_ckd_0_npt)
02731 {
02732 ostringstream os;
02733 os << "!!ERROR!!\n"
02734 << "CKD2.4.2 H2O self continuum:\n"
02735 << "parameter NPT not the same for different ref. temperatures.\n";
02736 throw runtime_error(os.str());
02737 }
02738
02739
02740
02741 Numeric DVC = SL296_ckd_0_dv;
02742 Numeric V1C = V1ABS - DVC;
02743 Numeric V2C = V2ABS + DVC;
02744
02745 int I1 = (int) ((V1C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02746 if (V1C < SL296_ckd_0_v1) I1 = -1;
02747 V1C = SL296_ckd_0_v1 + (SL296_ckd_0_dv * (Numeric)I1);
02748
02749 int I2 = (int) ((V2C-SL296_ckd_0_v1) / SL296_ckd_0_dv);
02750
02751 int NPTC = I2-I1+3;
02752 if (NPTC > SL296_ckd_0_npt) NPTC = SL296_ckd_0_npt+1;
02753
02754 V2C = V1C + SL296_ckd_0_dv * (Numeric)(NPTC-1);
02755
02756 if (NPTC < 1)
02757 {
02758 ostringstream os;
02759 out3 << "WARNING:\n"
02760 << " CKDv2.4.2 H2O self continuum:\n"
02761 << " no elements of internal continuum coefficients could be found for the\n"
02762 << " input frequency range.\n"
02763 << " Leave the function without calculating the absorption.";
02764 return;
02765 }
02766
02767 Numeric SH2OT0[NPTC+addF77fields];
02768 Numeric SH2OT1[NPTC+addF77fields];
02769
02770 for (Index J = 1 ; J <= NPTC ; ++J)
02771 {
02772 Index I = I1+J;
02773 if ( (I < 1) || (I > SL296_ckd_0_npt) )
02774 {
02775 SH2OT0[J] = 0.0e0;
02776 SH2OT1[J] = 0.0e0;
02777 }
02778 else
02779 {
02780 SH2OT0[J] = SL296_ckd_0[I];
02781 SH2OT1[J] = SL260_ckd_0[I];
02782 }
02783 }
02784
02785
02786
02787 Numeric SFAC = 1.00e0;
02788 Numeric VS2 = 0.00e0;
02789 Numeric VS4 = 0.00e0;
02790
02791
02792 for ( Index i = 0 ; i < n_p ; ++i )
02793 {
02794
02795
02796 Numeric Tave = t_abs[i];
02797 Numeric Pave = (p_abs[i]*1.000e-2);
02798 Numeric Patm = Pave/PO;
02799 Numeric vmrh2o = vmr[i];
02800
02801
02802 Numeric Rh2o = Patm * (TO/Tave);
02803 Numeric Tfac = (Tave-TO)/(260.0-TO);
02804 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
02805 Numeric W1 = vmrh2o * WTOT;
02806 Numeric XKT = Tave / 1.4387752e0;
02807
02808
02809
02810
02811 Numeric k[NPTC+addF77fields];
02812 k[0] = 0.00e0;
02813 for (Index J = 1 ; J <= NPTC ; ++J)
02814 {
02815 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
02816 Numeric SH2O = 0.0e0;
02817 if (SH2OT0[J] > 0.0e0)
02818 {
02819 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
02820 SFAC = 1.00e0;
02821
02822 if ( (VJ >= 700.0e0) && (VJ <= 1200.0e0) )
02823 {
02824 int JFAC = (int)((VJ - 700.0e0)/10.0e0 + 0.00001e0);
02825 if ( (JFAC >= 0) && (JFAC <= 50) )
02826 SFAC = XFAC[JFAC];
02827 }
02828
02829
02830
02831
02832
02833 VS2 = (VJ-V0S1) * (VJ-V0S1);
02834 VS4 = VS2*VS2;
02835 SFAC = SFAC *
02836 (1.000e0 + FACTRS1*(HWSQ1/((VJ*VJ)+(BETAS1*VS4)+HWSQ1)));
02837
02838 VS2 = (VJ-V0S2) * (VJ-V0S2);
02839 SFAC = SFAC *
02840 (1.000e0 + FACTRS2*(HWSQ2/(VS2+HWSQ2)));
02841
02842 VS2 = (VJ-V0S3) * (VJ-V0S3);
02843 VS4 = VS2*VS2;
02844 SFAC = SFAC *
02845 (1.000e0 + FACTRS3*(HWSQ3/(VS2+(BETAS3*VS4)+HWSQ3)));
02846
02847 SH2O = SFAC * SH2O;
02848 }
02849
02850
02851
02852
02853 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
02854
02855 }
02856
02857
02858
02859
02860 for ( Index s = 0 ; s < n_f ; ++s )
02861 {
02862
02863 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
02864 if ( (V >= 0.000e0) && (V < SL296_ckd_0_v2) )
02865 {
02866
02867
02868
02869
02870 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
02871 }
02872 }
02873 }
02874
02875 }
02876
02877
02878
02879
02880
02907 void CKD_242_foreign_h2o( MatrixView xsec,
02908 const Numeric Cin,
02909 const String& model,
02910 ConstVectorView f_mono,
02911 ConstVectorView p_abs,
02912 ConstVectorView t_abs,
02913 ConstVectorView vmr,
02914 ConstVectorView )
02915 {
02916
02917
02918
02919 if ((model != "user") && (model != "CKD242"))
02920 {
02921 ostringstream os;
02922 os << "!!ERROR!!\n"
02923 << "CKDv2.4.2 H2O foreign continuum:\n"
02924 << "INPUT model name is: " << model << ".\n"
02925 << "VALID model names are user and CKD242\n";
02926 throw runtime_error(os.str());
02927 }
02928
02929
02930
02931 Numeric ScalingFac = 1.0000e0;
02932 if ( model == "user" )
02933 {
02934 ScalingFac = Cin;
02935 }
02936
02937
02938 const Index n_p = p_abs.nelem();
02939 const Index n_f = f_mono.nelem();
02940
02941
02942 assert ( n_p==t_abs.nelem() );
02943 assert ( n_p==vmr.nelem() );
02944
02945
02946
02947 assert ( n_f==xsec.nrows() );
02948 assert ( n_p==xsec.ncols() );
02949
02950
02951
02952
02953 const Numeric xLosmt = 2.686763e19;
02954 const Numeric T1 = 273.0e0;
02955 const Numeric TO = 296.0e0;
02956 const Numeric PO = 1013.0e0;
02957
02958
02959 const Numeric V0F1 = 350.000e0;
02960 const Numeric HWSQF1 = 200.000e0 * 200.000e0;
02961 const Numeric BETAF1 = 5.000e-9 ;
02962 const Numeric FACTRF1 = -0.700e0;
02963
02964 const Numeric V0F1a = 630.000e0;
02965 const Numeric HWSQF1a = 65.000e0*65.000e0;
02966 const Numeric BETAF1a = 2.000e-08 ;
02967 const Numeric FACTRF1a = 0.750e0;
02968
02969 const Numeric V0F2 = 1130.000e0;
02970 const Numeric HWSQF2 = 330.000e0 * 330.000e0;
02971 const Numeric BETAF2 = 8.000e-11;
02972 const Numeric FACTRF2 = -0.970e0;
02973
02974 const Numeric V0F3 = 1975.000e0;
02975 const Numeric HWSQF3 = 250.000e0 * 250.000e0;
02976 const Numeric BETAF3 = 5.000e-06;
02977 const Numeric FACTRF3 = -0.650e0;
02978
02979
02980 const Numeric VABS_min = FH2O_ckd_0_v1;
02981 const Numeric VABS_max = FH2O_ckd_0_v2;
02982
02983
02984
02985
02986
02987 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
02988 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
02989 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
02990 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
02991 {
02992 out3 << "WARNING:\n"
02993 << " CKDv2.4.2 H2O foreign continuum:\n"
02994 << " input frequency vector exceeds range of model validity\n"
02995 << " " << FH2O_ckd_0_v1 << "<->" << FH2O_ckd_0_v2 << "cm^-1\n";
02996 }
02997
02998
02999
03000
03001
03002
03003 Numeric DVC = FH2O_ckd_0_dv;
03004 Numeric V1C = V1ABS - DVC;
03005 Numeric V2C = V2ABS + DVC;
03006
03007 int I1 = (int) ((V1C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
03008 if (V1C < FH2O_ckd_0_v1) I1 = -1;
03009 V1C = FH2O_ckd_0_v1 + (FH2O_ckd_0_dv * (Numeric)I1);
03010
03011 int I2 = (int) ((V2C-FH2O_ckd_0_v1) / FH2O_ckd_0_dv);
03012
03013 int NPTC = I2-I1+3;
03014 if (NPTC > FH2O_ckd_0_npt) NPTC = FH2O_ckd_0_npt+1;
03015
03016 V2C = V1C + FH2O_ckd_0_dv * (Numeric)(NPTC-1);
03017
03018 if (NPTC < 1)
03019 {
03020 out3 << "WARNING:\n"
03021 << " CKDv2.4.2 H2O foreign continuum:\n"
03022 << " no elements of internal continuum coefficients could be found for the\n"
03023 << " input frequency range.\n"
03024 << " Leave the function without calculating the absorption.";
03025 return;
03026 }
03027
03028 Numeric FH2OT0[NPTC+addF77fields];
03029
03030 for (Index J = 1 ; J <= NPTC ; ++J)
03031 {
03032 Index I = I1+J;
03033 if ( (I < 1) || (I > FH2O_ckd_0_npt) )
03034 {
03035 FH2OT0[J] = 0.0e0;
03036 }
03037 else
03038 {
03039 FH2OT0[J] = FH2O_ckd_0[I];
03040 }
03041 }
03042
03043
03044
03045 Numeric VF2 = 0.000e0;
03046 Numeric VF4 = 0.000e0;
03047 Numeric VF6 = 0.000e0;
03048 Numeric FSCAL = 0.000e0;
03049 Numeric FH2O = 0.000e0;
03050
03051
03052 for ( Index i = 0 ; i < n_p ; ++i )
03053 {
03054
03055
03056 Numeric Tave = t_abs[i];
03057 Numeric Pave = (p_abs[i]*1.000e-2);
03058 Numeric vmrh2o = vmr[i];
03059
03060 Numeric PFRGN = (Pave/PO) * (1.00000e0 - vmrh2o);
03061 Numeric RFRGN = PFRGN * (TO/Tave);
03062 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03063
03064 Numeric XKT = Tave / 1.4387752;
03065
03066
03067
03068
03069 Numeric k[NPTC+addF77fields];
03070 k[0] = 0.00e0;
03071 for (Index J = 1 ; J <= NPTC ; ++J)
03072 {
03073 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03074
03075
03076 VF2 = (VJ-V0F1) * (VJ-V0F1);
03077 VF6 = VF2 * VF2 * VF2;
03078 FSCAL = (1.000e0 + FACTRF1*(HWSQF1/(VF2+(BETAF1*VF6)+HWSQF1)));
03079
03080 VF2 = (VJ-V0F1a) * (VJ-V0F1a);
03081 VF6 = VF2 * VF2 * VF2;
03082 FSCAL = FSCAL *
03083 (1.000e0 + FACTRF1a*(HWSQF1a/(VF2+(BETAF1a*VF6)+HWSQF1a)));
03084
03085 VF2 = (VJ-V0F2) * (VJ-V0F2);
03086 VF6 = VF2 * VF2 * VF2;
03087 FSCAL = FSCAL *
03088 (1.000e0 + FACTRF2*(HWSQF2/(VF2+(BETAF2*VF6)+HWSQF2)));
03089
03090 VF2 = (VJ-V0F3) * (VJ-V0F3);
03091 VF4 = VF2 * VF2;
03092 FSCAL = FSCAL *
03093 (1.000e0 + FACTRF3*(HWSQF3/(VF2+BETAF3*VF4+HWSQF3)));
03094
03095 FH2O = FH2OT0[J] * FSCAL;
03096
03097
03098
03099
03100 k[J] = WTOT * RFRGN * (FH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
03101
03102 }
03103
03104
03105
03106
03107 for ( Index s = 0 ; s < n_f ; ++s )
03108 {
03109
03110 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
03111 if ( (V >= 0.000e0) && (V < VABS_max) )
03112 {
03113
03114
03115 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03116 }
03117 }
03118 }
03119
03120 }
03121
03122
03123
03124
03125
03152 void CKD_mt_100_self_h2o( MatrixView xsec,
03153 const Numeric Cin,
03154 const String& model,
03155 ConstVectorView f_mono,
03156 ConstVectorView p_abs,
03157 ConstVectorView t_abs,
03158 ConstVectorView vmr,
03159 ConstVectorView )
03160 {
03161
03162
03163 if ((model != "user") && (model != "CKDMT100"))
03164 {
03165 ostringstream os;
03166 os << "!!ERROR!!\n"
03167 << "CKD_MT1.00 H2O self continuum:\n"
03168 << "INPUT model name is: " << model << ".\n"
03169 << "VALID model names are user and CKDMT100\n";
03170 throw runtime_error(os.str());
03171 }
03172
03173
03174
03175 Numeric ScalingFac = 1.0000e0;
03176 if ( model == "user" )
03177 {
03178 ScalingFac = Cin;
03179 }
03180
03181
03182 const Index n_p = p_abs.nelem();
03183 const Index n_f = f_mono.nelem();
03184
03185
03186
03187 assert ( n_p==t_abs.nelem() );
03188 assert ( n_p==vmr.nelem() );
03189
03190
03191
03192 assert ( n_f==xsec.nrows() );
03193 assert ( n_p==xsec.ncols() );
03194
03195
03196
03197
03198 const Numeric xLosmt = 2.68675e19;
03199
03200 const Numeric TO = 296.000e0;
03201 const Numeric PO = 1013.000e0;
03202
03203 const Numeric XFACREV[15] =
03204 {1.003, 1.009, 1.015, 1.023, 1.029,1.033,
03205 1.037, 1.039, 1.040, 1.046, 1.036,1.027,
03206 1.01, 1.002, 1.00};
03207
03208
03209 const Numeric VABS_min = -2.000e1;
03210 const Numeric VABS_max = 2.000e4;
03211
03212
03213
03214
03215
03216 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
03217 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03218 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03219 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03220 {
03221 out3 << "WARNING:\n"
03222 << " CKD_MT 1.00 H2O self continuum:\n"
03223 << " input frequency vector exceeds range of model validity\n"
03224 << " " << SL296_ckd_mt_100_v1 << "<->" << SL296_ckd_mt_100_v2 << "cm^-1\n";
03225 }
03226
03227
03228
03229
03230 if (SL296_ckd_mt_100_v1 != SL260_ckd_mt_100_v1)
03231 {
03232 ostringstream os;
03233 os << "!!ERROR!!\n"
03234 << "CKD_MT 1.00 H2O self continuum:\n"
03235 << "parameter V1 not the same for different ref. temperatures.\n";
03236 throw runtime_error(os.str());
03237 }
03238 if (SL296_ckd_mt_100_v2 != SL260_ckd_mt_100_v2)
03239 {
03240 ostringstream os;
03241 os << "!!ERROR!!\n"
03242 << "CKD_MT 1.00 H2O self continuum:\n"
03243 << "parameter V2 not the same for different ref. temperatures.\n";
03244 throw runtime_error(os.str());
03245 }
03246 if (SL296_ckd_mt_100_dv != SL260_ckd_mt_100_dv)
03247 {
03248 ostringstream os;
03249 os << "!!ERROR!!\n"
03250 << "CKD_MT 1.00 H2O self continuum:\n"
03251 << "parameter DV not the same for different ref. temperatures.\n";
03252 throw runtime_error(os.str());
03253 }
03254 if (SL296_ckd_mt_100_npt != SL260_ckd_mt_100_npt)
03255 {
03256 ostringstream os;
03257 os << "!!ERROR!!\n"
03258 << "CKD_MT 1.00 H2O self continuum:\n"
03259 << "parameter NPT not the same for different ref. temperatures.\n";
03260 throw runtime_error(os.str());
03261 }
03262
03263
03264
03265 Numeric DVC = SL296_ckd_mt_100_dv;
03266 Numeric V1C = V1ABS - DVC;
03267 Numeric V2C = V2ABS + DVC;
03268
03269 int I1 = (int) ((V1C-SL296_ckd_mt_100_v1) / SL296_ckd_mt_100_dv);
03270 if (V1C < SL296_ckd_mt_100_v1) I1 = -1;
03271 V1C = SL296_ckd_mt_100_v1 + (SL296_ckd_mt_100_dv * (Numeric)I1);
03272
03273 int I2 = (int) ((V2C-SL296_ckd_mt_100_v1) / SL296_ckd_mt_100_dv);
03274
03275 int NPTC = I2-I1+3;
03276 if (NPTC > SL296_ckd_mt_100_npt) NPTC = SL296_ckd_mt_100_npt+1;
03277
03278 V2C = V1C + SL296_ckd_mt_100_dv * (Numeric)(NPTC-1);
03279
03280 if (NPTC < 1)
03281 {
03282 ostringstream os;
03283 out3 << "WARNING:\n"
03284 << " CKD_MT 1.00 H2O self continuum:\n"
03285 << " no elements of internal continuum coefficients could be found for the\n"
03286 << " input frequency range.\n"
03287 << " Leave the function without calculating the absorption.";
03288 return;
03289 }
03290
03291 Numeric SH2OT0[NPTC+addF77fields];
03292 Numeric SH2OT1[NPTC+addF77fields];
03293
03294 for (Index J = 1 ; J <= NPTC ; ++J)
03295 {
03296 Index I = I1+J;
03297 if ( (I < 1) || (I > SL296_ckd_mt_100_npt) )
03298 {
03299 SH2OT0[J] = 0.0e0;
03300 SH2OT1[J] = 0.0e0;
03301 }
03302 else
03303 {
03304 SH2OT0[J] = SL296_ckd_mt_100[I];
03305 SH2OT1[J] = SL260_ckd_mt_100[I];
03306 }
03307 }
03308
03309
03310
03311 Numeric SFAC = 1.00e0;
03312
03313
03314 for ( Index i = 0 ; i < n_p ; ++i )
03315 {
03316
03317
03318 Numeric Tave = t_abs[i];
03319 Numeric Pave = (p_abs[i]*1.000e-2);
03320 Numeric Patm = Pave/PO;
03321 Numeric vmrh2o = vmr[i];
03322
03323
03324 Numeric Rh2o = Patm * (TO/Tave);
03325 Numeric Tfac = (Tave-TO)/(260.0-TO);
03326 Numeric WTOT = xLosmt * (Pave/1.013000e3) * (2.7300e2/Tave);
03327 Numeric W1 = vmrh2o * WTOT;
03328 Numeric XKT = Tave / 1.4387752e0;
03329
03330
03331
03332
03333 Numeric k[NPTC+addF77fields];
03334 k[0] = 0.00e0;
03335 for (Index J = 1 ; J <= NPTC ; ++J)
03336 {
03337 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03338 Numeric SH2O = 0.0e0;
03339 if (SH2OT0[J] > 0.0e0)
03340 {
03341 SH2O = SH2OT0[J] * pow( (SH2OT1[J]/SH2OT0[J]), Tfac );
03342 SFAC = 1.00e0;
03343
03344 if ( (VJ >= 820.0e0) && (VJ <= 960.0e0) )
03345 {
03346 int JFAC = (int)((VJ - 820.0e0)/10.0e0 + 0.00001e0);
03347 if ( (JFAC >= 0) && (JFAC <=14) )
03348 SFAC = XFACREV[JFAC];
03349 }
03350
03351 SH2O = SFAC * SH2O;
03352 }
03353
03354
03355
03356
03357 k[J] = W1 * Rh2o * (SH2O*1.000e-20) * RADFN_FUN(VJ,XKT);
03358
03359 }
03360
03361
03362
03363
03364 for ( Index s = 0 ; s < n_f ; ++s )
03365 {
03366
03367 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
03368 if ( (V > 0.000e0) && (V < SL296_ckd_mt_100_v2) )
03369 {
03370
03371
03372
03373
03374 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03375 }
03376 }
03377 }
03378
03379 }
03380
03381
03382
03383
03410 void CKD_mt_100_foreign_h2o( MatrixView xsec,
03411 const Numeric Cin,
03412 const String& model,
03413 ConstVectorView f_mono,
03414 ConstVectorView p_abs,
03415 ConstVectorView t_abs,
03416 ConstVectorView vmr,
03417 ConstVectorView )
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 = p_abs.nelem();
03442 const Index n_f = f_mono.nelem();
03443
03444
03445
03446 assert ( n_p==t_abs.nelem() );
03447 assert ( n_p==vmr.nelem() );
03448
03449
03450
03451 assert ( n_f==xsec.nrows() );
03452 assert ( n_p==xsec.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_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
03471 Numeric V2ABS = f_mono[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 = t_abs[i];
03536 Numeric Pave = (p_abs[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_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
03568 if ( (V >= 0.000e0) && (V < VABS_max) )
03569 {
03570
03571
03572
03573
03574 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03575 }
03576 }
03577 }
03578
03579 }
03580
03581
03582
03583
03584
03585
03611 void CKD_241_co2( MatrixView xsec,
03612 const Numeric Cin,
03613 const String& model,
03614 ConstVectorView f_mono,
03615 ConstVectorView p_abs,
03616 ConstVectorView t_abs,
03617 ConstVectorView vmr )
03618 {
03619
03620
03621 if ((model != "user") && (model != "CKD241"))
03622 {
03623 ostringstream os;
03624 os << "!!ERROR!!\n"
03625 << "CKDv2.4.1 CO2 continuum:\n"
03626 << "INPUT model name is: " << model << ".\n"
03627 << "VALID model names are user and CKD241\n";
03628 throw runtime_error(os.str());
03629 }
03630
03631
03632
03633 Numeric ScalingFac = 0.0000e0;
03634 if ( model == "user" )
03635 {
03636 ScalingFac = Cin;
03637 }
03638 else
03639 {
03640 ScalingFac = 1.0000e0;
03641 }
03642
03643 const Index n_p = p_abs.nelem();
03644 const Index n_f = f_mono.nelem();
03645
03646
03647
03648 assert ( n_p==t_abs.nelem() );
03649 assert ( n_p==vmr.nelem() );
03650
03651
03652
03653 assert ( n_f==xsec.nrows() );
03654 assert ( n_p==xsec.ncols() );
03655
03656
03657
03658
03659 const Numeric xLosmt = 2.686763e19;
03660 const Numeric T1 = 273.0e0;
03661 const Numeric TO = 296.0e0;
03662 const Numeric PO = 1013.0e0;
03663
03664
03665 const Numeric VABS_min = -2.000e1;
03666 const Numeric VABS_max = 1.000e4;
03667
03668
03669
03670
03671
03672 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
03673 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03674 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03675 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03676 {
03677 out3 << "WARNING:\n"
03678 << " CKDv2.4.1 CO2 continuum:\n"
03679 << " input frequency vector exceeds range of model validity\n"
03680 << " " << FCO2_ckd_mt_100_v1 << "<->" << FCO2_ckd_mt_100_v2 << "cm^-1\n";
03681 }
03682
03683
03684
03685
03686
03687
03688 Numeric DVC = FCO2_ckd_mt_100_dv;
03689 Numeric V1C = V1ABS - DVC;
03690 Numeric V2C = V2ABS + DVC;
03691
03692 int I1 = (int) ((V1C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03693 if (V1C < FCO2_ckd_mt_100_v1) I1 = -1;
03694 V1C = FCO2_ckd_mt_100_v1 + (FCO2_ckd_mt_100_dv * (Numeric)I1);
03695
03696 int I2 = (int) ((V2C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03697
03698 int NPTC = I2-I1+3;
03699 if (NPTC > FCO2_ckd_mt_100_npt) NPTC = FCO2_ckd_mt_100_npt+1;
03700
03701 V2C = V1C + FCO2_ckd_mt_100_dv * (Numeric)(NPTC-1);
03702
03703 if (NPTC < 1)
03704 {
03705 out3 << "WARNING:\n"
03706 << " CKDv2.4.1 CO2 continuum:\n"
03707 << " no elements of internal continuum coefficients could be found for the\n"
03708 << " input frequency range.\n"
03709 << " Leave the function without calculating the absorption.";
03710 return;
03711 }
03712
03713 Numeric FCO2T0[NPTC+addF77fields];
03714
03715 for (Index J = 1 ; J <= NPTC ; ++J)
03716 {
03717 Index I = I1+J;
03718 if ( (I < 1) || (I > FCO2_ckd_mt_100_npt) )
03719 {
03720 FCO2T0[J] = 0.0e0;
03721 }
03722 else
03723 {
03724 FCO2T0[J] = FCO2_ckd_mt_100[I];
03725 }
03726 }
03727
03728
03729
03730
03731
03732
03733
03734 for ( Index i = 0 ; i < n_p ; ++i )
03735 {
03736 Numeric Tave = t_abs[i];
03737 Numeric Pave = (p_abs[i]*1.000e-2);
03738
03739 Numeric Rhoave = (Pave/PO) * (TO/Tave);
03740 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03741 Numeric XKT = Tave / 1.4387752;
03742
03743
03744
03745
03746
03747 Numeric k[NPTC+addF77fields];
03748 k[0] = 0.00e0;
03749 for (Index J = 1 ; J <= NPTC ; ++J)
03750 {
03751 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03752 Numeric FCO2 = FCO2T0[J];
03753
03754
03755
03756 k[J] = ((WTOT * Rhoave) * (FCO2*1.000e-20) * RADFN_FUN(VJ,XKT));
03757
03758 }
03759
03760
03761
03762
03763 for ( Index s = 0 ; s < n_f ; ++s )
03764 {
03765
03766 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
03767 if ( (V > 0.000e0) && (V < FCO2_ckd_mt_100_v2) )
03768 {
03769
03770
03771 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03772 }
03773 }
03774 }
03775
03776 }
03777
03778
03779
03780
03781
03782
03808 void CKD_mt_co2( MatrixView xsec,
03809 const Numeric Cin,
03810 const String& model,
03811 ConstVectorView f_mono,
03812 ConstVectorView p_abs,
03813 ConstVectorView t_abs,
03814 ConstVectorView vmr)
03815 {
03816
03817
03818
03819 if ((model != "user") && (model != "CKDMT100"))
03820 {
03821 ostringstream os;
03822 os << "!!ERROR!!\n"
03823 << "CKD_MT.1.00 CO2 continuum:\n"
03824 << "INPUT model name is: " << model << ".\n"
03825 << "VALID model names are user and CKDMT100\n";
03826 throw runtime_error(os.str());
03827 }
03828
03829
03830
03831 Numeric ScalingFac = 0.0000e0;
03832 if ( model == "user" )
03833 {
03834 ScalingFac = Cin;
03835 }
03836 else
03837 {
03838 ScalingFac = 1.0000e0;
03839 }
03840
03841 const Index n_p = p_abs.nelem();
03842 const Index n_f = f_mono.nelem();
03843
03844
03845
03846 assert ( n_p==t_abs.nelem() );
03847 assert ( n_p==vmr.nelem() );
03848
03849
03850
03851 assert ( n_f==xsec.nrows() );
03852 assert ( n_p==xsec.ncols() );
03853
03854
03855
03856
03857 const Numeric xLosmt = 2.686763e19;
03858 const Numeric T1 = 273.0e0;
03859 const Numeric TO = 296.0e0;
03860 const Numeric PO = 1013.0e0;
03861
03862
03863 const Numeric VABS_min = FCO2_ckd_mt_100_v1;
03864 const Numeric VABS_max = FCO2_ckd_mt_100_v2;
03865
03866
03867
03868
03869
03870 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
03871 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
03872 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
03873 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
03874 {
03875 out3 << "WARNING:\n"
03876 << " CKD_MT 1.00 CO2 continuum:\n"
03877 << " input frequency vector exceeds range of model validity\n"
03878 << " " << FCO2_ckd_mt_100_v1 << "<->" << FCO2_ckd_mt_100_v2 << "cm^-1\n";
03879 }
03880
03881
03882
03883
03884
03885
03886 Numeric DVC = FCO2_ckd_mt_100_dv;
03887 Numeric V1C = V1ABS - DVC;
03888 Numeric V2C = V2ABS + DVC;
03889
03890 int I1 = (int) ((V1C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03891 if (V1C < FCO2_ckd_mt_100_v1) I1 = -1;
03892 V1C = FCO2_ckd_mt_100_v1 + (FCO2_ckd_mt_100_dv * (Numeric)I1);
03893
03894 int I2 = (int) ((V2C-FCO2_ckd_mt_100_v1) / FCO2_ckd_mt_100_dv);
03895
03896 int NPTC = I2-I1+3;
03897 if (NPTC > FCO2_ckd_mt_100_npt) NPTC = FCO2_ckd_mt_100_npt+1;
03898
03899 V2C = V1C + FCO2_ckd_mt_100_dv * (Numeric)(NPTC-1);
03900
03901 if (NPTC < 1)
03902 {
03903 out3 << "WARNING:\n"
03904 << " CKD_MT 1.00 CO2 continuum:\n"
03905 << " no elements of internal continuum coefficients could be found for the\n"
03906 << " input frequency range.\n"
03907 << " Leave the function without calculating the absorption.";
03908 return;
03909 }
03910
03911 Numeric FCO2T0[NPTC+addF77fields];
03912
03913 for (Index J = 1 ; J <= NPTC ; ++J)
03914 {
03915 Index I = I1+J;
03916 if ( (I < 1) || (I > FCO2_ckd_mt_100_npt) )
03917 {
03918 FCO2T0[J] = 0.0e0;
03919 }
03920 else
03921 {
03922 FCO2T0[J] = FCO2_ckd_mt_100[I];
03923 }
03924 }
03925
03926
03927
03928
03929
03930
03931
03932 for ( Index i = 0 ; i < n_p ; ++i )
03933 {
03934 Numeric Tave = t_abs[i];
03935 Numeric Pave = (p_abs[i]*1.000e-2);
03936
03937 Numeric Rhoave = (Pave/PO) * (TO/Tave);
03938 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
03939 Numeric XKT = Tave / 1.4387752;
03940
03941
03942
03943
03944
03945 Numeric k[NPTC+addF77fields];
03946 k[0] = 0.00e0;
03947 for (Index J = 1 ; J <= NPTC ; ++J)
03948 {
03949 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
03950 Numeric FCO2 = FCO2T0[J];
03951
03952
03953 if ( (VJ > 500.0e0) && (VJ < 900.0e0) )
03954 {
03955 FCO2 = 7.000e0 * FCO2;
03956 }
03957
03958
03959
03960 k[J] = ((WTOT * Rhoave) * (FCO2*1.000e-20) * RADFN_FUN(VJ,XKT));
03961
03962 }
03963
03964
03965
03966
03967 for ( Index s = 0 ; s < n_f ; ++s )
03968 {
03969
03970 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
03971 if ( (V > 0.000e0) && (V < FCO2_ckd_mt_100_v2) )
03972 {
03973
03974
03975 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
03976 }
03977 }
03978 }
03979
03980 }
03981
03982
03983
03984
03985
03986
03987
03988
03989
04020 void CKD_mt_CIArot_n2( MatrixView xsec,
04021 const Numeric Cin,
04022 const String& model,
04023 ConstVectorView f_mono,
04024 ConstVectorView p_abs,
04025 ConstVectorView t_abs,
04026 ConstVectorView vmr )
04027 {
04028
04029
04030 if ((model != "user") && (model != "CKDMT100"))
04031 {
04032 ostringstream os;
04033 os << "!!ERROR!!\n"
04034 << "CKD_MT1.00 N2 CIA rotational band:\n"
04035 << "INPUT model name is: " << model << ".\n"
04036 << "VALID model names are user and CKDMT100\n";
04037 throw runtime_error(os.str());
04038 }
04039
04040
04041
04042 Numeric ScalingFac = 0.0000e0;
04043 if ( model == "user" )
04044 {
04045 ScalingFac = Cin;
04046 }
04047 else
04048 {
04049 ScalingFac = 1.0000e0;
04050 }
04051
04052 const Index n_p = p_abs.nelem();
04053 const Index n_f = f_mono.nelem();
04054
04055
04056
04057 assert ( n_p==t_abs.nelem() );
04058 assert ( n_p==vmr.nelem() );
04059
04060
04061
04062 assert ( n_f==xsec.nrows() );
04063 assert ( n_p==xsec.ncols() );
04064
04065
04066
04067
04068
04069 const Numeric T1 = 273.0e0;
04070 const Numeric TO = 296.0e0;
04071 const Numeric PO = 1013.0e0;
04072
04073
04074
04075 const Numeric VABS_min = -1.000e1;
04076 const Numeric VABS_max = 3.500e2;
04077
04078
04079
04080
04081
04082 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
04083 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04084 if ( (V1ABS < VABS_min) || (V1ABS > VABS_max) ||
04085 (V2ABS < VABS_min) || (V2ABS > VABS_max) )
04086 {
04087 out3 << "WARNING:\n"
04088 << " CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04089 << " input frequency vector exceeds range of model validity\n"
04090 << " " << N2N2_CT296_ckd_mt_100_v1 << "<->" << N2N2_CT220_ckd_mt_100_v2 << "cm^-1\n";
04091 }
04092
04093
04094
04095
04096 if (N2N2_CT296_ckd_mt_100_v1 != N2N2_CT220_ckd_mt_100_v1)
04097 {
04098 ostringstream os;
04099 os << "!!ERROR!!\n"
04100 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04101 << "parameter V1 not the same for different ref. temperatures.\n";
04102 throw runtime_error(os.str());
04103 }
04104 if (N2N2_CT296_ckd_mt_100_v2 != N2N2_CT220_ckd_mt_100_v2)
04105 {
04106 ostringstream os;
04107 os << "!!ERROR!!\n"
04108 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04109 << "parameter V2 not the same for different ref. temperatures.\n";
04110 throw runtime_error(os.str());
04111 }
04112 if (N2N2_CT296_ckd_mt_100_dv != N2N2_CT220_ckd_mt_100_dv)
04113 {
04114 ostringstream os;
04115 os << "!!ERROR!!\n"
04116 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04117 << "parameter DV not the same for different ref. temperatures.\n";
04118 throw runtime_error(os.str());
04119 }
04120 if (N2N2_CT296_ckd_mt_100_npt != N2N2_CT220_ckd_mt_100_npt)
04121 {
04122 ostringstream os;
04123 os << "!!ERROR!!\n"
04124 << "CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04125 << "parameter NPT not the same for different ref. temperatures.\n";
04126 throw runtime_error(os.str());
04127 }
04128
04129
04130
04131 Numeric DVC = N2N2_CT296_ckd_mt_100_dv;
04132 Numeric V1C = V1ABS - DVC;
04133 Numeric V2C = V2ABS + DVC;
04134
04135 int I1 = (int) ((V1C-N2N2_CT296_ckd_mt_100_v1) / N2N2_CT296_ckd_mt_100_dv);
04136 if (V1C < N2N2_CT296_ckd_mt_100_v1) I1 = -1;
04137 V1C = N2N2_CT296_ckd_mt_100_v1 + (N2N2_CT296_ckd_mt_100_dv * (Numeric)I1);
04138
04139 int I2 = (int) ((V2C-N2N2_CT296_ckd_mt_100_v1) / N2N2_CT296_ckd_mt_100_dv);
04140
04141 int NPTC = I2-I1+3;
04142 if (NPTC > N2N2_CT296_ckd_mt_100_npt) NPTC = N2N2_CT296_ckd_mt_100_npt+1;
04143
04144 V2C = V1C + N2N2_CT296_ckd_mt_100_dv * (Numeric)(NPTC-1);
04145
04146 if (NPTC < 1)
04147 {
04148 out3 << "WARNING:\n"
04149 << " CKD_MT 1.00 N2-N2 CIA rotational band:\n"
04150 << " no elements of internal continuum coefficients could be found for the\n"
04151 << " input frequency range.\n"
04152 << " Leave the function without calculating the absorption.\n";
04153 return;
04154 }
04155
04156 Numeric C0[NPTC+addF77fields];
04157 Numeric C1[NPTC+addF77fields];
04158
04159 for (Index J = 1 ; J <= NPTC ; ++J)
04160 {
04161 Index I = I1+J;
04162 if ( (I < 1) || (I > N2N2_CT296_ckd_mt_100_npt) )
04163 {
04164 C0[J] = 0.0e0;
04165 C1[J] = 0.0e0;
04166 }
04167 else
04168 {
04169 C0[J] = N2N2_CT296_ckd_mt_100[I];
04170 C1[J] = N2N2_CT220_ckd_mt_100[I];
04171 }
04172 }
04173
04174
04175
04176
04177
04178
04179
04180 for ( Index i = 0 ; i < n_p ; ++i )
04181 {
04182 Numeric Tave = t_abs[i];
04183 Numeric Pave = (p_abs[i]*1.000e-2);
04184 Numeric vmrn2 = vmr[i];
04185 Numeric facfac = vmrn2 * (Pave/PO) * (Pave/PO) *
04186 (T1/Tave) * (T1/Tave);
04187
04188 Numeric XKT = Tave / 1.4387752;
04189 Numeric Tfac = (Tave - TO) / (220.0e0 - TO);
04190
04191
04192
04193
04194 Numeric k[NPTC+addF77fields];
04195 k[0] = 0.00e0;
04196 for (Index J = 1 ; J <= NPTC ; ++J)
04197 {
04198 k[J] = 0.000e0;
04199 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04200 Numeric SN2 = 0.000e0;
04201 if ( (C0[J] > 0.000e0) && (C1[J] > 0.000e0) )
04202 {
04203 SN2 = facfac* C0[J] * pow( (C1[J]/C0[J]), Tfac );
04204 }
04205
04206
04207 k[J] = SN2 * RADFN_FUN(VJ,XKT);
04208 }
04209
04210
04211
04212
04213 for ( Index s = 0 ; s < n_f ; ++s )
04214 {
04215
04216 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
04217 if ( (V > 0.000e0) && (V < N2N2_CT220_ckd_mt_100_v2) )
04218 {
04219
04220
04221 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04222 }
04223 }
04224 }
04225
04226 }
04227
04228
04229
04230
04231
04232
04233
04234
04235
04236
04237
04271 void CKD_mt_CIAfun_n2( MatrixView xsec,
04272 const Numeric Cin,
04273 const String& model,
04274 ConstVectorView f_mono,
04275 ConstVectorView p_abs,
04276 ConstVectorView t_abs,
04277 ConstVectorView vmr )
04278 {
04279
04280
04281 if ((model != "user") && (model != "CKDMT100"))
04282 {
04283 ostringstream os;
04284 os << "!!ERROR!!\n"
04285 << "CKD_MT1.00 N2 CIA fundamental band:\n"
04286 << "INPUT model name is: " << model << ".\n"
04287 << "VALID model names are user and CKDMT100\n";
04288 throw runtime_error(os.str());
04289 }
04290
04291
04292
04293 Numeric ScalingFac = 1.0000e0;
04294 if ( model == "user" )
04295 {
04296 ScalingFac = Cin;
04297 }
04298
04299
04300 const Index n_p = p_abs.nelem();
04301 const Index n_f = f_mono.nelem();
04302
04303
04304
04305 assert ( n_p==t_abs.nelem() );
04306 assert ( n_p==vmr.nelem() );
04307
04308
04309
04310 assert ( n_f==xsec.nrows() );
04311 assert ( n_p==xsec.ncols() );
04312
04313
04314
04315
04316 const Numeric xLosmt = 2.686763e19;
04317 const Numeric T1 = 273.0e0;
04318 const Numeric TO = 296.0e0;
04319 const Numeric PO = 1013.0e0;
04320 const Numeric a1 = 0.8387e0;
04321 const Numeric a2 = 0.0754e0;
04322
04323
04324
04325
04326
04327 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
04328 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04329 if ( (V1ABS < N2N2_N2F_ckd_mt_100_v1) || (V1ABS > N2N2_N2F_ckd_mt_100_v2) ||
04330 (V2ABS < N2N2_N2F_ckd_mt_100_v1) || (V2ABS > N2N2_N2F_ckd_mt_100_v2) )
04331 {
04332 out3 << "WARNING:\n"
04333 << " CKD_MT 1.00 N2-N2 CIA fundamental band:\n"
04334 << " input frequency vector exceeds range of model validity\n"
04335 << " " << N2N2_N2F_ckd_mt_100_v1 << "<->" << N2N2_N2F_ckd_mt_100_v2 << "cm^-1\n";
04336 }
04337
04338
04339
04340
04341
04342
04343 Numeric DVC = N2N2_N2F_ckd_mt_100_dv;
04344 Numeric V1C = V1ABS - DVC;
04345 Numeric V2C = V2ABS + DVC;
04346
04347 int I1 = (int) ((V1C-N2N2_N2F_ckd_mt_100_v1) / N2N2_N2F_ckd_mt_100_dv);
04348 if (V1C < N2N2_N2F_ckd_mt_100_v1) I1 = -1;
04349 V1C = N2N2_N2F_ckd_mt_100_v1 + (N2N2_N2F_ckd_mt_100_dv * (Numeric)I1);
04350
04351 int I2 = (int) ((V2C-N2N2_N2F_ckd_mt_100_v1) / N2N2_N2F_ckd_mt_100_dv);
04352
04353 int NPTC = I2-I1+3;
04354 if (NPTC > N2N2_N2F_ckd_mt_100_npt) NPTC = N2N2_N2F_ckd_mt_100_npt+1;
04355
04356 V2C = V1C + N2N2_N2F_ckd_mt_100_dv * (Numeric)(NPTC-1);
04357
04358 if (NPTC < 1)
04359 {
04360 out3 << "WARNING:\n"
04361 << " CKD_MT 1.00 N2-N2 CIA fundamental band:\n"
04362 << " no elements of internal continuum coefficients could be found for the\n"
04363 << " input frequency range.\n";
04364 return;
04365 }
04366
04367 Numeric xn2[NPTC+addF77fields];
04368 Numeric xn2t[NPTC+addF77fields];
04369
04370 for (Index J = 1 ; J <= NPTC ; ++J)
04371 {
04372 xn2[J] = 0.000e0;
04373 xn2t[J] = 0.000e0;
04374 Index I = I1+J;
04375 if ( (I > 0) && (I <= N2N2_N2F_ckd_mt_100_npt) )
04376 {
04377 xn2[J] = N2N2_N2F_ckd_mt_100[I];
04378 xn2t[J] = N2N2_N2Ft_ckd_mt_100[I];
04379 }
04380 }
04381
04382
04383
04384
04385
04386
04387
04388 for ( Index i = 0 ; i < n_p ; ++i )
04389 {
04390 Numeric Tave = t_abs[i];
04391 Numeric Pave = (p_abs[i]*1.000e-2);
04392 Numeric vmrn2 = vmr[i];
04393 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
04394 Numeric tau_fac= WTOT * (Pave/PO) * (T1/Tave);
04395
04396 Numeric XKT = Tave / 1.4387752e0;
04397
04398
04399 Numeric xktfac = (1.000e0/TO) - (1.000e0/Tave);
04400 Numeric factor = 0.000e0;
04401 if (vmrn2 > VMRCalcLimit)
04402 {
04403 factor = (1.000e0 / xLosmt) * (1.000e0/vmrn2) * (a1 - a2*(Tave/TO));
04404 }
04405
04406
04407
04408
04409 Numeric k[NPTC+addF77fields];
04410 k[0] = 0.000e0;
04411 for (Index J = 1 ; J <= NPTC ; ++J)
04412 {
04413 k[J] = 0.000e0;
04414 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04415 Numeric SN2 = 0.000e0;
04416 if (xn2[J] > 0.000e0)
04417 {
04418 Numeric C0 = factor * xn2[J] * exp(xn2t[J]*xktfac) / VJ;
04419 SN2 = tau_fac * C0;
04420 }
04421
04422
04423 k[J] = SN2 * RADFN_FUN(VJ,XKT);
04424 }
04425
04426
04427
04428
04429 for ( Index s = 0 ; s < n_f ; ++s )
04430 {
04431
04432 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
04433 if ( (V > N2N2_N2F_ckd_mt_100_v1) && (V < N2N2_N2F_ckd_mt_100_v2) )
04434 {
04435
04436
04437 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04438 }
04439 }
04440 }
04441
04442 }
04443
04444
04445
04446
04447
04448
04449
04450
04451
04452
04484 void CKD_mt_CIAfun_o2( MatrixView xsec,
04485 const Numeric Cin,
04486 const String& model,
04487 ConstVectorView f_mono,
04488 ConstVectorView p_abs,
04489 ConstVectorView t_abs,
04490 ConstVectorView vmr )
04491 {
04492
04493
04494 if ((model != "user") && (model != "CKDMT100"))
04495 {
04496 ostringstream os;
04497 os << "!!ERROR!!\n"
04498 << "CKD_MT1.00 O2 CIA fundamental band:\n"
04499 << "INPUT model name is: " << model << ".\n"
04500 << "VALID model names are user and CKDMT100\n";
04501 throw runtime_error(os.str());
04502 }
04503
04504
04505
04506 Numeric ScalingFac = 1.0000e0;
04507 if ( model == "user" )
04508 {
04509 ScalingFac = Cin;
04510 }
04511
04512
04513 const Index n_p = p_abs.nelem();
04514 const Index n_f = f_mono.nelem();
04515
04516
04517
04518 assert ( n_p==t_abs.nelem() );
04519 assert ( n_p==vmr.nelem() );
04520
04521
04522
04523 assert ( n_f==xsec.nrows() );
04524 assert ( n_p==xsec.ncols() );
04525
04526
04527
04528
04529 const Numeric xLosmt = 2.686763e19;
04530 const Numeric T1 = 273.0e0;
04531 const Numeric TO = 296.0e0;
04532 const Numeric PO = 1013.0e0;
04533
04534
04535
04536
04537
04538 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
04539 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04540 if ( (V1ABS < O2O2_O2F_ckd_mt_100_v1) || (V1ABS > O2O2_O2F_ckd_mt_100_v2) ||
04541 (V2ABS < O2O2_O2F_ckd_mt_100_v1) || (V2ABS > O2O2_O2F_ckd_mt_100_v2) )
04542 {
04543 out3 << "WARNING:\n"
04544 << " CKD_MT 1.00 O2-O2 CIA fundamental band:\n"
04545 << " input frequency vector exceeds range of model validity\n"
04546 << " " << O2O2_O2F_ckd_mt_100_v1 << "<->" << O2O2_O2F_ckd_mt_100_v2 << "cm^-1\n";
04547 }
04548
04549
04550
04551
04552
04553 Numeric DVC = O2O2_O2F_ckd_mt_100_dv;
04554 Numeric V1C = V1ABS - DVC;
04555 Numeric V2C = V2ABS + DVC;
04556
04557 int I1 = (int) ((V1C-O2O2_O2F_ckd_mt_100_v1) / O2O2_O2F_ckd_mt_100_dv);
04558 if (V1C < O2O2_O2F_ckd_mt_100_v1) I1 = -1;
04559 V1C = O2O2_O2F_ckd_mt_100_v1 + (O2O2_O2F_ckd_mt_100_dv * (Numeric)I1);
04560
04561 int I2 = (int) ((V2C-O2O2_O2F_ckd_mt_100_v1) / O2O2_O2F_ckd_mt_100_dv);
04562
04563 int NPTC = I2-I1+3;
04564 if (NPTC > O2O2_O2F_ckd_mt_100_npt) NPTC = O2O2_O2F_ckd_mt_100_npt+1;
04565
04566 V2C = V1C + O2O2_O2F_ckd_mt_100_dv * (Numeric)(NPTC-1);
04567
04568 if (NPTC < 1)
04569 {
04570 out3 << "WARNING:\n"
04571 << " CKD_MT 1.00 O2 CIA fundamental band:\n"
04572 << " no elements of internal continuum coefficients could be found for the\n"
04573 << " input frequency range.\n"
04574 << " Leave the function without calculating the absorption.\n";
04575 return;
04576 }
04577
04578 Numeric xo2[NPTC+addF77fields];
04579 Numeric xo2t[NPTC+addF77fields];
04580
04581 for (Index J = 1 ; J <= NPTC ; ++J)
04582 {
04583 xo2[J] = 0.000e0;
04584 xo2t[J] = 0.000e0;
04585 Index I = I1+J;
04586 if ( (I > 0) && (I <= O2O2_O2F_ckd_mt_100_npt) )
04587 {
04588 xo2[J] = O2O2_O2Fo_ckd_mt_100[I];
04589 xo2t[J] = O2O2_O2Ft_ckd_mt_100[I];
04590 }
04591 }
04592
04593
04594
04595
04596
04597
04598
04599 for ( Index i = 0 ; i < n_p ; ++i )
04600 {
04601 Numeric Tave = t_abs[i];
04602 Numeric Pave = (p_abs[i]*1.000e-2);
04603
04604 Numeric WTOT = xLosmt * (Pave/PO) * (T1/Tave);
04605 Numeric tau_fac= WTOT * (Pave/PO) * (T1/Tave);
04606
04607 Numeric XKT = Tave / 1.4387752;
04608
04609 Numeric xktfac = (1.000e0/TO) - (1.000e0/Tave);
04610 Numeric factor = (1.000e0 / xLosmt);
04611
04612
04613
04614
04615 Numeric k[NPTC+addF77fields];
04616 k[0] = 0.00e0;
04617 for (Index J = 1 ; J <= NPTC ; ++J)
04618 {
04619 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04620 Numeric SO2 = 0.0e0;
04621 if (xo2[J] > 0.0e0)
04622 {
04623 Numeric C0 = factor * xo2[J] * exp(xo2t[J]*xktfac) / VJ;
04624 SO2 = tau_fac * C0;
04625 }
04626
04627
04628 k[J] = SO2 * RADFN_FUN(VJ,XKT);
04629 }
04630
04631
04632
04633
04634 for ( Index s = 0 ; s < n_f ; ++s )
04635 {
04636
04637 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
04638 if ( (V > O2O2_O2F_ckd_mt_100_v1) && (V < O2O2_O2F_ckd_mt_100_v2) )
04639 {
04640
04641
04642 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04643 }
04644 }
04645 }
04646
04647 }
04648
04649
04650
04651
04652
04653
04654
04655
04656
04657
04658
04659
04660
04661
04662
04663
04664
04665
04666
04705 void CKD_mt_v0v0_o2( MatrixView xsec,
04706 const Numeric Cin,
04707 const String& model,
04708 ConstVectorView f_mono,
04709 ConstVectorView p_abs,
04710 ConstVectorView t_abs,
04711 ConstVectorView vmr,
04712 ConstVectorView n2_abs)
04713 {
04714
04715
04716
04717 if ((model != "user") && (model != "CKDMT100"))
04718 {
04719 ostringstream os;
04720 os << "!!ERROR!!\n"
04721 << "CKD_MT1.00 O2 band at 1.27 micrometer:\n"
04722 << "INPUT model name is: " << model << ".\n"
04723 << "VALID model names are user and CKDMT100\n";
04724 throw runtime_error(os.str());
04725 }
04726
04727
04728
04729 Numeric ScalingFac = 1.0000e0;
04730 if ( model == "user" )
04731 {
04732 ScalingFac = Cin;
04733 };
04734
04735 const Index n_p = p_abs.nelem();
04736 const Index n_f = f_mono.nelem();
04737
04738
04739
04740 assert ( n_p==t_abs.nelem() );
04741 assert ( n_p==vmr.nelem() );
04742
04743
04744
04745 assert ( n_f==xsec.nrows() );
04746 assert ( n_p==xsec.ncols() );
04747
04748
04749
04750
04751
04752 const Numeric T1 = 273.0e0;
04753
04754 const Numeric PO = 1013.0e0;
04755
04756
04757
04758
04759 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
04760 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04761 if ( (V1ABS < O2_00_ckd_mt_100_v1) || (V1ABS > O2_00_ckd_mt_100_v2) ||
04762 (V2ABS < O2_00_ckd_mt_100_v1) || (V2ABS > O2_00_ckd_mt_100_v2) )
04763 {
04764 out3 << "WARNING:\n"
04765 << " CKD_MT 1.00 O2 v0<-v0 band:\n"
04766 << " input frequency vector exceeds range of model validity\n"
04767 << " " << O2_00_ckd_mt_100_v1 << "<->" << O2_00_ckd_mt_100_v2 << "cm^-1\n";
04768 }
04769
04770
04771
04772
04773
04774 Numeric DVC = O2_00_ckd_mt_100_dv;
04775 Numeric V1C = V1ABS - DVC;
04776 Numeric V2C = V2ABS + DVC;
04777
04778 int I1 = (int) ((V1C-O2_00_ckd_mt_100_v1) / O2_00_ckd_mt_100_dv);
04779 if (V1C < O2_00_ckd_mt_100_v1) I1 = I1-1;
04780 V1C = O2_00_ckd_mt_100_v1 + (O2_00_ckd_mt_100_dv * (Numeric)I1);
04781
04782 int I2 = (int) ((V2C-O2_00_ckd_mt_100_v1) / O2_00_ckd_mt_100_dv);
04783
04784 int NPTC = I2-I1+3;
04785
04786 V2C = V1C + O2_00_ckd_mt_100_dv * (Numeric)(NPTC-1);
04787
04788 if (NPTC < 1)
04789 {
04790 out3 << "WARNING:\n"
04791 << " CKD_MT 1.00 O2 v0<-v0 band:\n"
04792 << " no elements of internal continuum coefficients could be found for the\n"
04793 << " input frequency range.\n"
04794 << " Leave the function without calculating the absorption.\n";
04795 return;
04796 }
04797
04798 Numeric CO[(int)(NPTC+addF77fields)];
04799
04800
04801 for (Index J = 1 ; J <= NPTC ; ++J)
04802 {
04803 CO[J] = 0.000e0;
04804 Index I = I1+J;
04805 if ( (I > 0) && (I <= O2_00_ckd_mt_100_npt) )
04806 {
04807 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04808 CO[J] = O2_00_ckd_mt_100[I] / VJ;
04809 }
04810 }
04811
04812
04813
04814
04815
04816
04817
04818 for ( Index i = 0 ; i < n_p ; ++i )
04819 {
04820 Numeric Tave = t_abs[i];
04821 Numeric Pave = (p_abs[i]*1.000e-2);
04822 Numeric vmro2 = vmr[i];
04823 Numeric vmrn2 = n2_abs[i];
04824 Numeric ADJWO2 = (vmro2 + 0.300e0*vmrn2) / 0.446e0 *
04825 (Pave/PO) * (Pave/PO) * (T1/Tave) * (T1/Tave);
04826 Numeric XKT = Tave / 1.4387752e0;
04827
04828
04829
04830
04831
04832 Numeric k[NPTC+addF77fields];
04833 k[0] = 0.00e0;
04834 for (Index J = 1 ; J <= NPTC ; ++J)
04835 {
04836 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
04837 Numeric SO2 = 0.0e0;
04838 if (CO[J] > 0.0e0)
04839 {
04840 SO2 = ADJWO2 * CO[J];
04841 }
04842
04843
04844 k[J] = SO2 * RADFN_FUN(VJ,XKT);
04845 }
04846
04847
04848
04849
04850 for ( Index s = 0 ; s < n_f ; ++s )
04851 {
04852
04853 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
04854 if ( (V > O2_00_ckd_mt_100_v1) && (V < O2_00_ckd_mt_100_v2) )
04855 {
04856
04857
04858 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
04859 }
04860 }
04861 }
04862
04863 }
04864
04865
04866
04867
04868
04869
04870
04871
04872
04910 void CKD_mt_v1v0_o2( MatrixView xsec,
04911 const Numeric Cin,
04912 const String& model,
04913 ConstVectorView f_mono,
04914 ConstVectorView p_abs,
04915 ConstVectorView t_abs,
04916 ConstVectorView vmr )
04917 {
04918
04919
04920 if ((model != "user") && (model != "CKDMT100"))
04921 {
04922 ostringstream os;
04923 os << "!!ERROR!!\n"
04924 << "CKD_MT1.00 O2 band at 1.06 micrometer:\n"
04925 << "INPUT model name is: " << model << ".\n"
04926 << "VALID model names are user and CKDMT100\n";
04927 throw runtime_error(os.str());
04928 }
04929
04930
04931
04932 Numeric ScalingFac = 1.0000e0;
04933 if ( model == "user" )
04934 {
04935 ScalingFac = Cin;
04936 };
04937
04938 const Index n_p = p_abs.nelem();
04939 const Index n_f = f_mono.nelem();
04940
04941
04942
04943 assert ( n_p==t_abs.nelem() );
04944 assert ( n_p==vmr.nelem() );
04945
04946
04947
04948 assert ( n_f==xsec.nrows() );
04949 assert ( n_p==xsec.ncols() );
04950
04951
04952
04953
04954 const Numeric xLosmt = 2.686763e19;
04955 const Numeric T1 = 273.0e0;
04956 const Numeric TO = 296.0e0;
04957 const Numeric PO = 1013.0e0;
04958
04959
04960
04961
04962
04963
04964
04965 const Numeric V1S = O2_10_ckd_mt_100_v1;
04966 const Numeric V2S = O2_10_ckd_mt_100_v2;
04967 const Numeric DVS = O2_10_ckd_mt_100_dv;
04968 const Numeric V1_osc = 9375.000e0;
04969 const Numeric HW1 = 58.960e0;
04970 const Numeric V2_osc = 9439.000e0;
04971 const Numeric HW2 = 45.040e0;
04972 const Numeric S1 = 1.166e-4;
04973 const Numeric S2 = 3.086e-5;
04974
04975
04976
04977
04978
04979 Numeric V1ABS = f_mono[0] / (SPEED_OF_LIGHT * 1.00e2);
04980 Numeric V2ABS = f_mono[n_f-1] / (SPEED_OF_LIGHT * 1.00e2);
04981 if ( (V1ABS < O2_10_ckd_mt_100_v1) || (V1ABS > O2_10_ckd_mt_100_v2) ||
04982 (V2ABS < O2_10_ckd_mt_100_v1) || (V2ABS > O2_10_ckd_mt_100_v2) )
04983 {
04984 out3 << "WARNING:\n"
04985 << " CKD_MT 1.00 O2 v1<-v0 band:\n"
04986 << " input frequency vector exceeds range of model validity\n"
04987 << " " << O2_10_ckd_mt_100_v1 << "<->" << O2_10_ckd_mt_100_v2 << "cm^-1\n";
04988 }
04989
04990
04991
04992
04993
04994 Numeric DVC = DVS;
04995 Numeric V1C = V1ABS - DVC;
04996 Numeric V2C = V2ABS + DVC;
04997
04998 int NPTC = (int)( ((V2C-V1C)/DVC) + 3 );
04999
05000 V2C = V1C + ( DVC * (Numeric)(NPTC-1) );
05001
05002 if (NPTC < 1)
05003 {
05004 out3 << "WARNING:\n"
05005 << " CKD_MT 1.00 O2 v1<-v0 band:\n"
05006 << " no elements of internal continuum coefficients could be found for the\n"
05007 << " input frequency range.\n"
05008 << " Leave the function without calculating the absorption.\n";
05009 return;
05010 }
05011
05012 Numeric C[NPTC+addF77fields];
05013 C[0] = 0.000e0;
05014
05015 for (Index J = 1 ; J <= NPTC ; ++J)
05016 {
05017 C[J] = 0.000e0;
05018 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
05019
05020 if ( (VJ > V1S) && (VJ < V2S) )
05021 {
05022 Numeric DV1 = VJ - V1_osc;
05023 Numeric DV2 = VJ - V2_osc;
05024
05025 Numeric DAMP1 = 1.00e0;
05026 Numeric DAMP2 = 1.00e0;
05027
05028 if ( DV1 < 0.00e0 )
05029 {
05030 DAMP1 = exp(DV1 / 176.100e0);
05031 }
05032
05033 if ( DV2 < 0.00e0 )
05034 {
05035 DAMP2 = exp(DV2 / 176.100e0);
05036 }
05037
05038 Numeric O2INF = 0.31831e0 *
05039 ( ((S1 * DAMP1 / HW1)/(1.000e0 + pow((DV1/HW1),(Numeric)2.0e0) )) +
05040 ((S2 * DAMP2 / HW2)/(1.000e0 + pow((DV2/HW2),(Numeric)2.0e0) )) ) * 1.054e0;
05041 C[J] = O2INF / VJ;
05042 }
05043 }
05044
05045
05046
05047
05048
05049
05050 for ( Index i = 0 ; i < n_p ; ++i )
05051 {
05052 Numeric Tave = t_abs[i];
05053 Numeric Pave = (p_abs[i]*1.000e-2);
05054 Numeric vmro2 = vmr[i];
05055 Numeric WTOT = 1.000e-20 * xLosmt * (Pave/PO) * (T1/Tave);
05056 Numeric ADJWO2 = (vmro2 / 0.209e0) * WTOT * (Pave/PO) * (TO/Tave);
05057 Numeric XKT = Tave / 1.4387752;
05058
05059
05060
05061
05062 Numeric k[NPTC+addF77fields];
05063 k[0] = 0.00e0;
05064 for (Index J = 1 ; J <= NPTC ; ++J)
05065 {
05066 Numeric VJ = V1C + (DVC * (Numeric)(J-1));
05067 Numeric SO2 = 0.0e0;
05068 if (C[J] > 0.0e0)
05069 {
05070 SO2 = ADJWO2 * C[J];
05071 }
05072
05073
05074 k[J] = SO2 * RADFN_FUN(VJ,XKT);
05075 }
05076
05077
05078
05079
05080 for ( Index s = 0 ; s < n_f ; ++s )
05081 {
05082
05083 Numeric V = f_mono[s] / (SPEED_OF_LIGHT * 1.00e2);
05084 if ( (V > V1S) && (V < V2S) )
05085 {
05086
05087
05088 xsec(s,i) += ScalingFac * 1.000e2 * XINT_FUN(V1C,V2C,DVC,k,V);
05089 }
05090 }
05091 }
05092
05093 }
05094
05095
05096
05097
05132 void CKD24_H20( MatrixView xsec,
05133 int isf,
05134 const Numeric Cin,
05135 const String& model,
05136 ConstVectorView f_mono,
05137 ConstVectorView p_abs,
05138 ConstVectorView t_abs,
05139 ConstVectorView vmr,
05140 ConstVectorView n2_abs )
05141 {
05142
05143
05144
05145
05146
05147
05148
05149
05150
05151
05152 extern double artsckd_(double p, double t,
05153 double vmrh2o, double vmrn2, double vmro2,
05154 double freq, int ivc);
05155
05156
05157 Numeric XFAC = 1.0000;
05158
05159
05160
05161
05162 if ((model != "user") && (model != "CKD24"))
05163 {
05164 ostringstream os;
05165 os << "!!ERROR!!\n"
05166 << "CKDv2.4.2 H2O self/foreign continuum:\n"
05167 << "INPUT model name is: " << model << ".\n"
05168 << "VALID model names are user and CKD24\n";
05169 throw runtime_error(os.str());
05170 }
05171
05172
05173
05174 if ( model == "CKD24" )
05175 {
05176 XFAC = 1.0000;
05177 }
05178 else if ( model == "user" )
05179 {
05180 XFAC = Cin;
05181 }
05182 else
05183 {
05184 if (isf == 0) {
05185 ostringstream os;
05186 os << "H2O-SelfContCKD24: ERROR! Wrong model values given.\n"
05187 << "allowed models are: 'CKD24', 'user'" << '\n';
05188 throw runtime_error(os.str());
05189 }
05190 if (isf == 1) {
05191 ostringstream os;
05192 os << "H2O-ForeignContCKD: ERROR! Wrong model values given.\n"
05193 << "allowed models are: 'CKD24', 'user'" << '\n';
05194 throw runtime_error(os.str());
05195 }
05196 }
05197
05198 if (isf == 0) {
05199 out3 << "H2O-SelfContCKD24: (model=" << model << ") parameter values in use:\n"
05200 << " XFAC = " << XFAC << "\n";
05201 }
05202 if (isf == 1) {
05203 out3 << "H2O-ForeignContCKD: (model=" << model << ") parameter values in use:\n"
05204 << " XFAC = " << XFAC << "\n";
05205 }
05206
05207
05208 const Index n_p = p_abs.nelem();
05209 const Index n_f = f_mono.nelem();
05210
05211
05212
05213 assert ( n_p==t_abs.nelem() );
05214 assert ( n_p==vmr.nelem() );
05215
05216
05217
05218 assert ( n_f==xsec.nrows() );
05219 assert ( n_p==xsec.ncols() );
05220
05221
05222
05223
05224
05225
05226 int ivc = 55;
05227 if (isf == 0) {
05228 ivc = 21;
05229
05230 }
05231 if (isf == 1) {
05232 ivc = 22;
05233
05234 }
05235 if ((ivc != 1) && (ivc != 21) && (ivc != 22) && (ivc != 31) && (ivc != 32)) {
05236 ostringstream os;
05237 os << "!!ERROR: CKD24 H2O model: wrong input parameter isf (=0,1) given!\n"
05238 << "retrun without calculation!" << "\n"
05239 << "actual value of isf is " << isf << "\n";
05240 throw runtime_error(os.str());
05241 return;
05242 }
05243
05244
05245
05246 for ( Index i=0; i<n_p; ++i )
05247 {
05248 double T = (double) t_abs[i];
05249 double p = (double) (p_abs[i]*1.000e-2);
05250 double vmrh2o = (double) vmr[i];
05251 double vmrn2 = (double) n2_abs[i];
05252 double vmro2 = 0.0e0;
05253
05254
05255
05256
05257
05258
05259
05260
05261
05262 for ( Index s=0; s<n_f; ++s )
05263 {
05264
05265
05266 double f = (double) f_mono[s];
05267 if (ivc == 1) {
05268 if (n2_abs[i] > 0.0e0) {
05269
05270 double cont = artsckd_(p, T, vmrh2o, vmrn2, vmro2, f, ivc);
05271 xsec(s,i) += (Numeric) (cont / vmr[i]);
05272
05273 }
05274 } else {
05275 if (vmr[i] > 0.0e0) {
05276
05277 double cont = artsckd_(p, T, vmrh2o, vmrn2, vmro2, f, ivc);
05278 xsec(s,i) += (Numeric) (cont / vmr[i]);
05279
05280 }
05281 }
05282 }
05283 }
05284 return;
05285 }
05286
05287
05288
05313 void Pardo_ATM_H2O_ForeignContinuum( MatrixView xsec,
05314 const Numeric Cin,
05315 const String& model,
05316 ConstVectorView f_mono,
05317 ConstVectorView p_abs,
05318 ConstVectorView t_abs,
05319 ConstVectorView vmr)
05320 {
05321
05322
05323
05324 const Numeric C_ATM = 0.0315;
05325
05326
05327
05328 Numeric C;
05329 if ( model == "ATM" )
05330 {
05331 C = C_ATM;
05332 }
05333 else if ( model == "user" )
05334 {
05335 C = Cin;
05336 }
05337 else
05338 {
05339 ostringstream os;
05340 os << "H2O-ForeignContATM01: ERROR! Wrong model values given.\n"
05341 << "allowed models are: 'ATM', 'user'" << '\n';
05342 throw runtime_error(os.str());
05343 }
05344 out3 << "H2O-ForeignContATM01: (model=" << model << ") parameter values in use:\n"
05345 << " C_f = " << C << "\n";
05346
05347 const Index n_p = p_abs.nelem();
05348 const Index n_f = f_mono.nelem();
05349
05350
05351 assert ( n_p==t_abs.nelem() );
05352 assert ( n_p==vmr.nelem() );
05353
05354
05355
05356 assert ( n_f==xsec.nrows() );
05357 assert ( n_p==xsec.ncols() );
05358
05359
05360 for ( Index i=0; i<n_p; ++i )
05361 {
05362
05363
05364
05365
05366 Numeric pd = p_abs[i] * ( 1.00000e0 - vmr[i] );
05367
05368 Numeric pwdummy = p_abs[i] ;
05369
05370 for ( Index s=0; s<n_f; ++s )
05371 {
05372
05373
05374
05375
05376 xsec(s,i) += C *
05377 pow( (f_mono[s]/(Numeric)2.25e11), (Numeric)2. ) *
05378 pow( ((Numeric)300.0/t_abs[i]), (Numeric)3. ) *
05379 (pd/1.01300e5) *
05380 (pwdummy/1.01300e5);
05381 }
05382 }
05383 }
05384
05385
05386
05387
05388
05389
05390
05391
05426 void MPM93_H2O_continuum( MatrixView xsec,
05427 const Numeric fcenter,
05428 const Numeric b1,
05429 const Numeric b2,
05430 const Numeric b3,
05431 const Numeric b4,
05432 const Numeric b5,
05433 const Numeric b6,
05434 const String& model,
05435 ConstVectorView f_mono,
05436 ConstVectorView p_abs,
05437 ConstVectorView t_abs,
05438 ConstVectorView vmr )
05439 {
05440
05441
05442
05443
05444
05445 const Numeric MPM93fo_orig = 1780.000e9;
05446 const Numeric MPM93b1_orig = 22300.000;
05447 const Numeric MPM93b2_orig = 0.952;
05448 const Numeric MPM93b3_orig = 17.600e4;
05449 const Numeric MPM93b4_orig = 30.500;
05450 const Numeric MPM93b5_orig = 2.000;
05451 const Numeric MPM93b6_orig = 5.000;
05452
05453
05454
05455
05456 Numeric MPM93fopcl, MPM93b1pcl, MPM93b2pcl,
05457 MPM93b3pcl, MPM93b4pcl, MPM93b5pcl,
05458 MPM93b6pcl;
05459 if ( model == "MPM93" )
05460 {
05461 MPM93fopcl = MPM93fo_orig;
05462 MPM93b1pcl = MPM93b1_orig;
05463 MPM93b2pcl = MPM93b2_orig;
05464 MPM93b3pcl = MPM93b3_orig;
05465 MPM93b4pcl = MPM93b4_orig;
05466 MPM93b5pcl = MPM93b5_orig;
05467 MPM93b6pcl = MPM93b6_orig;
05468 }
05469 else if ( model == "user" )
05470 {
05471 MPM93fopcl = fcenter;
05472 MPM93b1pcl = b1;
05473 MPM93b2pcl = b2;
05474 MPM93b3pcl = b3;
05475 MPM93b4pcl = b4;
05476 MPM93b5pcl = b5;
05477 MPM93b6pcl = b6;
05478 }
05479 else
05480 {
05481 ostringstream os;
05482 os << "H2O-ContMPM93: ERROR! Wrong model values given.\n"
05483 << "allowed models are: 'MPM93', 'user'" << '\n';
05484 throw runtime_error(os.str());
05485 }
05486 out3 << "H2O-ContMPM93: (model=" << model << ") parameter values in use:\n"
05487 << " fo = " << MPM93fopcl << "\n"
05488 << " b1 = " << MPM93b1pcl << "\n"
05489 << " b2 = " << MPM93b2pcl << "\n"
05490 << " b3 = " << MPM93b3pcl << "\n"
05491 << " b4 = " << MPM93b4pcl << "\n"
05492 << " b5 = " << MPM93b5pcl << "\n"
05493 << " b6 = " << MPM93b6pcl << "\n";
05494
05495 const Index n_p = p_abs.nelem();
05496 const Index n_f = f_mono.nelem();
05497
05498
05499 assert ( n_p==t_abs.nelem() );
05500 assert ( n_p==vmr.nelem() );
05501
05502
05503
05504 assert ( n_f==xsec.nrows() );
05505 assert ( n_p==xsec.ncols() );
05506
05507
05508
05509 for ( Index i=0; i<n_p; ++i )
05510 {
05511 Numeric th = 300.0 / t_abs[i];
05512
05513
05514 Numeric strength = MPM93b1pcl * p_abs[i] * pow( th, (Numeric)3.5 )
05515 * exp(MPM93b2pcl * (1 - th));
05516 Numeric gam = MPM93b3pcl * 0.001 *
05517 ( MPM93b4pcl * p_abs[i] * vmr[i] * pow( th, MPM93b6pcl ) +
05518 p_abs[i]*(1.000-vmr[i]) * pow( th, MPM93b5pcl ) );
05519
05520 for ( Index s=0; s<n_f; ++s )
05521 {
05522
05523 xsec(s,i) += dB_km_to_1_m * 0.1820 *
05524 f_mono[s] * strength *
05525 MPMLineShapeFunction(gam, MPM93fopcl, f_mono[s]);
05526 }
05527 }
05528 return;
05529 }
05530
05531
05532
05533
05563 void MPM85O2AbsModel( MatrixView xsec,
05564 const Numeric CCin,
05565 const Numeric CLin,
05566 const Numeric CWin,
05567 const Numeric COin,
05568 const String& model,
05569 ConstVectorView f_mono,
05570 ConstVectorView p_abs,
05571 ConstVectorView t_abs,
05572 ConstVectorView h2o_abs,
05573 ConstVectorView vmr )
05574 {
05575
05576
05577
05578
05579
05580 const Numeric mpm85[48][7] = {
05581 { 49.452379 , 0.12 , 11.830 , 8.40 , 0.0 , 5.600 , 1.700 },
05582 { 49.962257 , 0.34 , 10.720 , 8.50 , 0.0 , 5.600 , 1.700 },
05583 { 50.474238 , 0.94 , 9.690 , 8.60 , 0.0 , 5.600 , 1.700 },
05584 { 50.987748 , 2.46 , 8.690 , 8.70 , 0.0 , 5.500 , 1.700 },
05585 { 51.503350 , 6.08 , 7.740 , 8.90 , 0.0 , 5.600 , 1.800 },
05586 { 52.021409 , 14.14 , 6.840 , 9.20 , 0.0 , 5.500 , 1.800 },
05587 { 52.542393 , 31.02 , 6.000 , 9.40 , 0.0 , 5.700 , 1.800 },
05588 { 53.066906 , 64.10 , 5.220 , 9.70 , 0.0 , 5.300 , 1.900 },
05589 { 53.595748 , 124.70 , 4.480 , 10.00 , 0.0 , 5.400 , 1.800 },
05590 { 54.129999 , 228.00 , 3.810 , 10.20 , 0.0 , 4.800 , 2.000 },
05591 { 54.671157 , 391.80 , 3.190 , 10.50 , 0.0 , 4.800 , 1.900 },
05592 { 55.221365 , 631.60 , 2.620 , 10.79 , 0.0 , 4.170 , 2.100 },
05593 { 55.783800 , 953.50 , 2.115 , 11.10 , 0.0 , 3.750 , 2.100 },
05594 { 56.264777 , 548.90 , 0.010 , 16.46 , 0.0 , 7.740 , 0.900 },
05595 { 56.363387 , 1344.00 , 1.655 , 11.44 , 0.0 , 2.970 , 2.300 },
05596 { 56.968180 , 1763.00 , 1.255 , 11.81 , 0.0 , 2.120 , 2.500 },
05597 { 57.612481 , 2141.00 , 0.910 , 12.21 , 0.0 , 0.940 , 3.700 },
05598 { 58.323874 , 2386.00 , 0.621 , 12.66 , 0.0 , -0.550 , -3.100 },
05599 { 58.446589 , 1457.00 , 0.079 , 14.49 , 0.0 , 5.970 , 0.800 },
05600 { 59.164204 , 2404.00 , 0.386 , 13.19 , 0.0 , -2.440 , 0.100 },
05601 { 59.590982 , 2112.00 , 0.207 , 13.60 , 0.0 , 3.440 , 0.500 },
05602 { 60.306057 , 2124.00 , 0.207 , 13.82 , 0.0 , -4.130 , 0.700 },
05603 { 60.434775 , 2461.00 , 0.386 , 12.97 , 0.0 , 1.320 , -1.000 },
05604 { 61.150558 , 2504.00 , 0.621 , 12.48 , 0.0 , -0.360 , 5.800 },
05605 { 61.800152 , 2298.00 , 0.910 , 12.07 , 0.0 , -1.590 , 2.900 },
05606 { 62.411212 , 1933.00 , 1.255 , 11.71 , 0.0 , -2.660 , 2.300 },
05607 { 62.486253 , 1517.00 , 0.078 , 14.68 , 0.0 , -4.770 , 0.900 },
05608 { 62.997974 , 1503.00 , 1.660 , 11.39 , 0.0 , -3.340 , 2.200 },
05609 { 63.568515 , 1087.00 , 2.110 , 11.08 , 0.0 , -4.170 , 2.000 },
05610 { 64.127764 , 733.50 , 2.620 , 10.78 , 0.0 , -4.480 , 2.000 },
05611 { 64.678900 , 463.50 , 3.190 , 10.50 , 0.0 , -5.100 , 1.800 },
05612 { 65.224067 , 274.80 , 3.810 , 10.20 , 0.0 , -5.100 , 1.900 },
05613 { 65.764769 , 153.00 , 4.480 , 10.00 , 0.0 , -5.700 , 1.800 },
05614 { 66.302088 , 80.09 , 5.220 , 9.70 , 0.0 , -5.500 , 1.800 },
05615 { 66.836827 , 39.46 , 6.000 , 9.40 , 0.0 , -5.900 , 1.700 },
05616 { 67.369595 , 18.32 , 6.840 , 9.20 , 0.0 , -5.600 , 1.800 },
05617 { 67.900862 , 8.01 , 7.740 , 8.90 , 0.0 , -5.800 , 1.700 },
05618 { 68.431001 , 3.30 , 8.690 , 8.70 , 0.0 , -5.700 , 1.700 },
05619 { 68.960306 , 1.28 , 9.690 , 8.60 , 0.0 , -5.600 , 1.700 },
05620 { 69.489021 , 0.47 , 10.720 , 8.50 , 0.0 , -5.600 , 1.700 },
05621 { 70.017342 , 0.16 , 11.830 , 8.40 , 0.0 , -5.600 , 1.700 },
05622 { 118.750341 , 945.00 , 0.000 , 15.92 , 0.0 , -0.440 , 0.900 },
05623 { 368.498350 , 67.90 , 0.020 , 19.20 , 0.6 , 0.000 , 0.000 },
05624 { 424.763120 , 638.00 , 0.011 , 19.16 , 0.6 , 0.000 , 0.000 },
05625 { 487.249370 , 235.00 , 0.011 , 19.20 , 0.6 , 0.000 , 0.000 },
05626 { 715.393150 , 99.60 , 0.089 , 18.10 , 0.6 , 0.000 , 0.000 },
05627 { 773.838730 , 671.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000 },
05628 { 834.145330 , 180.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000 },
05629 };
05630
05631
05632 const Index i_first = 0;
05633 const Index i_last = 47;
05634
05635
05636
05637
05638
05639 const Numeric CC_MPM85 = 1.00000;
05640 const Numeric CL_MPM85 = 1.00000;
05641 const Numeric CW_MPM85 = 1.00000;
05642 const Numeric CO_MPM85 = 1.00000;
05643 int AppCutoff = 0;
05644
05645
05646
05647
05648 Numeric CC, CL, CW, CO;
05649 if ( model == "MPM85" )
05650 {
05651 CC = CC_MPM85;
05652 CL = CL_MPM85;
05653 CW = CW_MPM85;
05654 CO = CO_MPM85;
05655 }
05656 else if ( model == "MPM85Lines" )
05657 {
05658 CC = 0.000;
05659 CL = CL_MPM85;
05660 CW = CW_MPM85;
05661 CO = CO_MPM85;
05662 }
05663 else if ( model == "MPM85Continuum" )
05664 {
05665 CC = CC_MPM85;
05666 CL = 0.000;
05667 CW = 0.000;
05668 CO = 0.000;
05669 }
05670 else if ( model == "MPM85NoCoupling" )
05671 {
05672 CC = CC_MPM85;
05673 CL = CL_MPM85;
05674 CW = CW_MPM85;
05675 CO = 0.000;
05676 }
05677 else if ( model == "MPM85NoCutoff" )
05678 {
05679 CC = CC_MPM85;
05680 CL = CL_MPM85;
05681 CW = CW_MPM85;
05682 CO = CO_MPM85;
05683 AppCutoff = 1;
05684 }
05685 else if ( model == "user" )
05686 {
05687 CC = CCin;
05688 CL = CLin;
05689 CW = CWin;
05690 CO = COin;
05691 }
05692 else
05693 {
05694 ostringstream os;
05695 os << "O2-MPM85: ERROR! Wrong model values given.\n"
05696 << "Valid models are: 'MPM85' 'MPM85Lines' 'MPM85Continuum' 'MPM85NoCoupling' 'MPM85NoCutoff'"
05697 << "and 'user'" << '\n';
05698 throw runtime_error(os.str());
05699 }
05700 out3 << "O2-MPM85: (model=" << model << ") parameter values in use:\n"
05701 << " CC = " << CC << "\n"
05702 << " CL = " << CL << "\n"
05703 << " CW = " << CW << "\n"
05704 << " CO = " << CO << "\n";
05705
05706
05707
05708 const Numeric S0 = 6.140e-4;
05709 const Numeric G0 = 5.600e-3;
05710 const Numeric X0 = 0.800;
05711
05712 const Index n_p = p_abs.nelem();
05713 const Index n_f = f_mono.nelem();
05714
05715
05716
05717
05718
05719 const Numeric VMRISO = 0.2085;
05720
05721
05722 assert ( n_p==t_abs.nelem() );
05723 assert ( n_p==vmr.nelem() );
05724
05725
05726
05727 assert ( n_f==xsec.nrows() );
05728 assert ( n_p==xsec.ncols() );
05729
05730
05731 for ( Index i=0; i<n_p; ++i )
05732 {
05733
05734 if (vmr[i] < VMRCalcLimit)
05735 {
05736 ostringstream os;
05737 os << "ERROR: MPM87 O2 full absorption model has detected a O2 volume mixing ratio of "
05738 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
05739 << "Therefore no calculation is performed.\n";
05740 throw runtime_error(os.str());
05741 return;
05742 }
05743
05744
05745 Numeric theta = (300.0 / t_abs[i]);
05746
05747 Numeric pwv = Pa_to_kPa * p_abs[i] * h2o_abs[i];
05748
05749 Numeric pda = (Pa_to_kPa * p_abs[i]) - pwv;
05750
05751
05752 Numeric pda_dummy = pda;
05753
05754 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
05755
05756 Numeric gam_cont = G0 * ( pda + 1.10*pwv ) * pow( theta, X0 );
05757
05758
05759 for ( Index s=0; s<n_f; ++s )
05760 {
05761
05762 Numeric ff = f_mono[s] * Hz_to_GHz;
05763
05764
05765
05766
05767
05768
05769 Numeric FAC = 1.000 ;
05770 Numeric Nppc = CC * strength_cont * FAC * ff * gam_cont /
05771 ( pow( ff, (Numeric)2.)
05772 + pow( gam_cont, (Numeric)2.) );
05773
05774
05775 Numeric Nppl = 0.0;
05776 for ( Index l = i_first; l <= i_last; ++l )
05777 {
05778
05779 Numeric strength = CL * mpm85[l][1] * 1.000e-6 * pda_dummy *
05780 pow(theta, (Numeric)3.) * exp(mpm85[l][2]*(1.000-theta)) /
05781 mpm85[l][0];
05782
05783 Numeric gam = CW * ( mpm85[l][3] * 1.000e-3 *
05784 ( ( pda * pow(theta, ((Numeric)0.80-mpm85[l][4]))) +
05785 (1.10 * pwv * theta) ) );
05786
05787 Numeric delta = CO * mpm85[l][5] * 1.000e-3 *
05788 pda * pow(theta, mpm85[l][6]);
05789
05790 Nppl += strength * MPMLineShapeO2Function(gam, mpm85[l][0], ff, delta);
05791 }
05792
05793
05794
05795
05796
05797 if (AppCutoff == 0)
05798 {
05799 if (Nppl < 0.000) Nppl = 0.0000;
05800 }
05801
05802
05803
05804
05805 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
05806 }
05807 }
05808 return;
05809 }
05810
05811
05812
05846 void MPM87O2AbsModel( MatrixView xsec,
05847 const Numeric CCin,
05848 const Numeric CLin,
05849 const Numeric CWin,
05850 const Numeric COin,
05851 const String& model,
05852 ConstVectorView f_mono,
05853 ConstVectorView p_abs,
05854 ConstVectorView t_abs,
05855 ConstVectorView h2o_abs,
05856 ConstVectorView vmr )
05857 {
05858
05859
05860
05861
05862
05863 const Numeric mpm87[48][7] = {
05864 { 49.452379 , 0.12 , 11.830 , 8.40 , 0.0 , 6.600 , 1.700},
05865 { 49.962257 , 0.34 , 10.720 , 8.50 , 0.0 , 6.600 , 1.700},
05866 { 50.474238 , 0.94 , 9.690 , 8.60 , 0.0 , 6.600 , 1.700},
05867 { 50.987748 , 2.46 , 8.690 , 8.70 , 0.0 , 6.500 , 1.700},
05868 { 51.503350 , 6.08 , 7.740 , 8.90 , 0.0 , 6.627 , 1.800},
05869 { 52.021409 , 14.14 , 6.840 , 9.20 , 0.0 , 6.347 , 1.800},
05870 { 52.542393 , 31.02 , 6.000 , 9.40 , 0.0 , 6.046 , 1.800},
05871 { 53.066906 , 64.10 , 5.220 , 9.70 , 0.0 , 5.719 , 1.900},
05872 { 53.595748 , 124.70 , 4.480 , 10.00 , 0.0 , 5.400 , 1.800},
05873 { 54.129999 , 228.00 , 3.810 , 10.20 , 0.0 , 5.157 , 2.000},
05874 { 54.671157 , 391.80 , 3.190 , 10.50 , 0.0 , 4.783 , 1.900},
05875 { 55.221365 , 631.60 , 2.620 , 10.79 , 0.0 , 4.339 , 2.100},
05876 { 55.783800 , 953.50 , 2.115 , 11.10 , 0.0 , 4.011 , 2.100},
05877 { 56.264777 , 548.90 , 0.010 , 16.46 , 0.0 , 2.772 , 0.900},
05878 { 56.363387 , 1344.00 , 1.655 , 11.44 , 0.0 , 3.922 , 2.300},
05879 { 56.968180 , 1763.00 , 1.255 , 11.81 , 0.0 , 3.398 , 2.500},
05880 { 57.612481 , 2141.00 , 0.910 , 12.21 , 0.0 , 1.145 , 3.200},
05881 { 58.323874 , 2386.00 , 0.621 , 12.66 , 0.0 , -0.317 , -2.500},
05882 { 58.446589 , 1457.00 , 0.079 , 14.49 , 0.0 , 6.270 , 0.800},
05883 { 59.164204 , 2404.00 , 0.386 , 13.19 , 0.0 , -4.119 , 0.100},
05884 { 59.590982 , 2112.00 , 0.207 , 13.60 , 0.0 , 6.766 , 0.500},
05885 { 60.306057 , 2124.00 , 0.207 , 13.82 , 0.0 , -6.183 , 0.700},
05886 { 60.434775 , 2461.00 , 0.386 , 12.97 , 0.0 , 3.290 , -0.400},
05887 { 61.150558 , 2504.00 , 0.621 , 12.48 , 0.0 , -1.591 , 3.500},
05888 { 61.800152 , 2298.00 , 0.910 , 12.07 , 0.0 , -2.068 , 2.900},
05889 { 62.411212 , 1933.00 , 1.255 , 11.71 , 0.0 , -4.158 , 2.300},
05890 { 62.486253 , 1517.00 , 0.078 , 14.68 , 0.0 , -4.068 , 0.900},
05891 { 62.997974 , 1503.00 , 1.660 , 11.39 , 0.0 , -4.482 , 2.200},
05892 { 63.568515 , 1087.00 , 2.110 , 11.08 , 0.0 , -4.442 , 2.000},
05893 { 64.127764 , 733.50 , 2.620 , 10.78 , 0.0 , -4.687 , 2.000},
05894 { 64.678900 , 463.50 , 3.190 , 10.50 , 0.0 , -5.074 , 1.800},
05895 { 65.224067 , 274.80 , 3.810 , 10.20 , 0.0 , -5.403 , 1.900},
05896 { 65.764769 , 153.00 , 4.480 , 10.00 , 0.0 , -5.610 , 1.800},
05897 { 66.302088 , 80.09 , 5.220 , 9.70 , 0.0 , -5.896 , 1.800},
05898 { 66.836827 , 39.46 , 6.000 , 9.40 , 0.0 , -6.194 , 1.700},
05899 { 67.369595 , 18.32 , 6.840 , 9.20 , 0.0 , -6.468 , 1.800},
05900 { 67.900862 , 8.01 , 7.740 , 8.90 , 0.0 , -6.718 , 1.700},
05901 { 68.431001 , 3.30 , 8.690 , 8.70 , 0.0 , -6.700 , 1.700},
05902 { 68.960306 , 1.28 , 9.690 , 8.60 , 0.0 , -6.600 , 1.700},
05903 { 69.489021 , 0.47 , 10.720 , 8.50 , 0.0 , -6.600 , 1.700},
05904 { 70.017342 , 0.16 , 11.830 , 8.40 , 0.0 , -6.600 , 1.700},
05905 { 118.750341 , 945.00 , 0.000 , 16.30 , 0.0 , -0.134 , 0.800},
05906 { 368.498350 , 67.90 , 0.020 , 19.20 , 0.6 , 0.000 , 0.000},
05907 { 424.763120 , 638.00 , 0.011 , 19.16 , 0.6 , 0.000 , 0.000},
05908 { 487.249370 , 235.00 , 0.011 , 19.20 , 0.6 , 0.000 , 0.000},
05909 { 715.393150 , 99.60 , 0.089 , 18.10 , 0.6 , 0.000 , 0.000},
05910 { 773.838730 , 671.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000},
05911 { 834.145330 , 180.00 , 0.079 , 18.10 , 0.6 , 0.000 , 0.000}
05912 };
05913
05914
05915 const Index i_first = 0;
05916 const Index i_last = 47;
05917
05918
05919
05920
05921
05922 const Numeric CC_MPM87 = 1.00000;
05923 const Numeric CL_MPM87 = 1.00000;
05924 const Numeric CW_MPM87 = 1.00000;
05925 const Numeric CO_MPM87 = 1.00000;
05926 int AppCutoff = 0;
05927
05928
05929
05930
05931 Numeric CC, CL, CW, CO;
05932 if ( model == "MPM87" )
05933 {
05934 CC = CC_MPM87;
05935 CL = CL_MPM87;
05936 CW = CW_MPM87;
05937 CO = CO_MPM87;
05938 }
05939 else if ( model == "MPM87Lines" )
05940 {
05941 CC = 0.000;
05942 CL = CL_MPM87;
05943 CW = CW_MPM87;
05944 CO = CO_MPM87;
05945 }
05946 else if ( model == "MPM87Continuum" )
05947 {
05948 CC = CC_MPM87;
05949 CL = 0.000;
05950 CW = 0.000;
05951 CO = 0.000;
05952 }
05953 else if ( model == "MPM87NoCoupling" )
05954 {
05955 CC = CC_MPM87;
05956 CL = CL_MPM87;
05957 CW = CW_MPM87;
05958 CO = 0.000;
05959 }
05960 else if ( model == "MPM87NoCutoff" )
05961 {
05962
05963
05964
05965 CC = CC_MPM87;
05966 CL = CL_MPM87;
05967 CW = CW_MPM87;
05968 CO = CO_MPM87;
05969 AppCutoff = 1;
05970 }
05971 else if ( model == "user" )
05972 {
05973 CC = CCin;
05974 CL = CLin;
05975 CW = CWin;
05976 CO = COin;
05977 }
05978 else
05979 {
05980 ostringstream os;
05981 os << "O2-MPM87: ERROR! Wrong model values given.\n"
05982 << "Valid models are: 'MPM87' 'MPM87Lines' 'MPM87Continuum' 'MPM87NoCoupling' 'MPM87NoCutoff'"
05983 << "and 'user'" << '\n';
05984 throw runtime_error(os.str());
05985 }
05986 out3 << "O2-MPM87: (model=" << model << ") parameter values in use:\n"
05987 << " CC = " << CC << "\n"
05988 << " CL = " << CL << "\n"
05989 << " CW = " << CW << "\n"
05990 << " CO = " << CO << "\n";
05991
05992
05993
05994 const Numeric S0 = 6.140e-4;
05995 const Numeric G0 = 4.800e-3;
05996 const Numeric X0 = 0.800;
05997
05998 const Index n_p = p_abs.nelem();
05999 const Index n_f = f_mono.nelem();
06000
06001
06002
06003
06004
06005 const Numeric VMRISO = 0.2085;
06006
06007
06008 assert ( n_p==t_abs.nelem() );
06009 assert ( n_p==vmr.nelem() );
06010
06011
06012
06013 assert ( n_f==xsec.nrows() );
06014 assert ( n_p==xsec.ncols() );
06015
06016
06017 for ( Index i=0; i<n_p; ++i )
06018 {
06019
06020 if (vmr[i] < VMRCalcLimit)
06021 {
06022 ostringstream os;
06023 os << "ERROR: MPM87 O2 full absorption model has detected a O2 volume mixing ratio of "
06024 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06025 << "Therefore no calculation is performed.\n";
06026 throw runtime_error(os.str());
06027 return;
06028 }
06029
06030
06031 Numeric theta = (300.0 / t_abs[i]);
06032
06033 Numeric pwv = Pa_to_kPa * p_abs[i] * h2o_abs[i];
06034
06035 Numeric pda = (Pa_to_kPa * p_abs[i]) - pwv;
06036
06037
06038 Numeric pda_dummy = pda;
06039
06040 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06041
06042 Numeric gam_cont = G0 * ( pda + 1.10*pwv ) * pow( theta, X0 );
06043
06044
06045 for ( Index s=0; s<n_f; ++s )
06046 {
06047
06048 Numeric ff = f_mono[s] * Hz_to_GHz;
06049
06050
06051
06052 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06053 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06054
06055
06056 Numeric Nppl = 0.0;
06057 for ( Index l = i_first; l <= i_last; ++l )
06058 {
06059
06060 Numeric strength = CL * mpm87[l][1] * 1.000e-6 * pda_dummy *
06061 pow(theta, (Numeric)3.) * exp(mpm87[l][2]*(1.000-theta)) /
06062 mpm87[l][0];
06063
06064 Numeric gam = CW * ( mpm87[l][3] * 1.000e-3 *
06065 ( ( pda * pow(theta, ((Numeric)0.80-mpm87[l][4]))) +
06066 (1.10 * pwv * theta) ) );
06067
06068 Numeric delta = CO * mpm87[l][5] * 1.000e-3 *
06069 pda * pow(theta, mpm87[l][6]);
06070
06071 Nppl += strength * MPMLineShapeO2Function(gam, mpm87[l][0], ff, delta);
06072 }
06073
06074
06075 if (AppCutoff == 0)
06076 {
06077 if (Nppl < 0.000) Nppl = 0.0000;
06078 }
06079
06080
06081
06082
06083 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06084 }
06085 }
06086 return;
06087 }
06088
06089
06090
06121 void MPM89O2AbsModel( MatrixView xsec,
06122 const Numeric CCin,
06123 const Numeric CLin,
06124 const Numeric CWin,
06125 const Numeric COin,
06126 const String& model,
06127 ConstVectorView f_mono,
06128 ConstVectorView p_abs,
06129 ConstVectorView t_abs,
06130 ConstVectorView h2o_abs,
06131 ConstVectorView vmr )
06132 {
06133
06134
06135
06136
06137
06138 const Numeric mpm89[44][7] = {
06139 { 50.474238, 0.94 , 9.694 , 8.60 , 0.0 , 1.600 , 5.520 },
06140 { 50.987749, 2.46 , 8.694 , 8.70 , 0.0 , 1.400 , 5.520 },
06141 { 51.503350, 6.08 , 7.744 , 8.90 , 0.0 , 1.165 , 5.520 },
06142 { 52.021410, 14.14 , 6.844 , 9.20 , 0.0 , 0.883 , 5.520 },
06143 { 52.542394, 31.02 , 6.004 , 9.40 , 0.0 , 0.579 , 5.520 },
06144 { 53.066907, 64.10 , 5.224 , 9.70 , 0.0 , 0.252 , 5.520 },
06145 { 53.595749, 124.70 , 4.484 , 10.00 , 0.0 , -0.066 , 5.520 },
06146 { 54.130000, 228.00 , 3.814 , 10.20 , 0.0 , -0.314 , 5.520 },
06147 { 54.671159, 391.80 , 3.194 , 10.50 , 0.0 , -0.706 , 5.520 },
06148 { 55.221367, 631.60 , 2.624 , 10.79 , 0.0 , -1.151 , 5.514 },
06149 { 55.783802, 953.50 , 2.119 , 11.10 , 0.0 , -0.920 , 5.025 },
06150 { 56.264775, 548.90 , 0.015 , 16.46 , 0.0 , 2.881 , -0.069 },
06151 { 56.363389, 1344.00 , 1.660 , 11.44 , 0.0 , -0.596 , 4.750 },
06152 { 56.968206, 1763.00 , 1.260 , 11.81 , 0.0 , -0.556 , 4.104 },
06153 { 57.612484, 2141.00 , 0.915 , 12.21 , 0.0 , -2.414 , 3.536 },
06154 { 58.323877, 2386.00 , 0.626 , 12.66 , 0.0 , -2.635 , 2.686 },
06155 { 58.446590, 1457.00 , 0.084 , 14.49 , 0.0 , 6.848 , -0.647 },
06156 { 59.164207, 2404.00 , 0.391 , 13.19 , 0.0 , -6.032 , 1.858 },
06157 { 59.590983, 2112.00 , 0.212 , 13.60 , 0.0 , 8.266 , -1.413 },
06158 { 60.306061, 2124.00 , 0.212 , 13.82 , 0.0 , -7.170 , 0.916 },
06159 { 60.434776, 2461.00 , 0.391 , 12.97 , 0.0 , 5.664 , -2.323 },
06160 { 61.150560, 2504.00 , 0.626 , 12.48 , 0.0 , 1.731 , -3.039 },
06161 { 61.800154, 2298.00 , 0.915 , 12.07 , 0.0 , 1.738 , -3.797 },
06162 { 62.411215, 1933.00 , 1.260 , 11.71 , 0.0 , -0.048 , -4.277 },
06163 { 62.486260, 1517.00 , 0.083 , 14.68 , 0.0 , -4.290 , 0.238 },
06164 { 62.997977, 1503.00 , 1.665 , 11.39 , 0.0 , 0.134 , -4.860 },
06165 { 63.568518, 1087.00 , 2.115 , 11.08 , 0.0 , 0.541 , -5.079 },
06166 { 64.127767, 733.50 , 2.620 , 10.78 , 0.0 , 0.814 , -5.525 },
06167 { 64.678903, 463.50 , 3.195 , 10.50 , 0.0 , 0.415 , -5.520 },
06168 { 65.224071, 274.80 , 3.815 , 10.20 , 0.0 , 0.069 , -5.520 },
06169 { 65.764772, 153.00 , 4.485 , 10.00 , 0.0 , -0.143 , -5.520 },
06170 { 66.302091, 80.09 , 5.225 , 9.70 , 0.0 , -0.428 , -5.520 },
06171 { 66.836830, 39.46 , 6.005 , 9.40 , 0.0 , -0.726 , -5.520 },
06172 { 67.369598, 18.32 , 6.845 , 9.20 , 0.0 , -1.002 , -5.520 },
06173 { 67.900867, 8.01 , 7.745 , 8.90 , 0.0 , -1.255 , -5.520 },
06174 { 68.431005, 3.30 , 8.695 , 8.70 , 0.0 , -1.500 , -5.520 },
06175 { 68.960311, 1.28 , 9.695 , 8.60 , 0.0 , -1.700 , -5.520 },
06176 { 118.750343, 945.00 , 0.009 , 16.30 , 0.0 , -0.247 , 0.003 },
06177 { 368.498350, 67.90 , 0.049 , 19.20 , 0.6 , 0.000 , 0.000 },
06178 { 424.763124, 638.00 , 0.044 , 19.16 , 0.6 , 0.000 , 0.000 },
06179 { 487.249370, 235.00 , 0.049 , 19.20 , 0.6 , 0.000 , 0.000 },
06180 { 715.393150, 99.60 , 0.145 , 18.10 , 0.6 , 0.000 , 0.000 },
06181 { 773.839675, 671.00 , 0.130 , 18.10 , 0.6 , 0.000 , 0.000 },
06182 { 834.145330, 180.00 , 0.147 , 18.10 , 0.6 , 0.000 , 0.000 }
06183 };
06184
06185
06186 const Index i_first = 0;
06187 const Index i_last = 43;
06188
06189
06190
06191
06192
06193 const Numeric CC_MPM89 = 1.00000;
06194 const Numeric CL_MPM89 = 1.00000;
06195 const Numeric CW_MPM89 = 1.00000;
06196 const Numeric CO_MPM89 = 1.00000;
06197 int AppCutoff = 0;
06198
06199
06200
06201
06202 Numeric CC, CL, CW, CO;
06203 if ( model == "MPM89" )
06204 {
06205 CC = CC_MPM89;
06206 CL = CL_MPM89;
06207 CW = CW_MPM89;
06208 CO = CO_MPM89;
06209 }
06210 else if ( model == "MPM89Lines" )
06211 {
06212 CC = 0.000;
06213 CL = CL_MPM89;
06214 CW = CW_MPM89;
06215 CO = CO_MPM89;
06216 }
06217 else if ( model == "MPM89Continuum" )
06218 {
06219 CC = CC_MPM89;
06220 CL = 0.000;
06221 CW = 0.000;
06222 CO = 0.000;
06223 }
06224 else if ( model == "MPM89NoCoupling" )
06225 {
06226 CC = CC_MPM89;
06227 CL = CL_MPM89;
06228 CW = CW_MPM89;
06229 CO = 0.000;
06230 }
06231 else if ( model == "MPM89NoCutoff" )
06232 {
06233 CC = CC_MPM89;
06234 CL = CL_MPM89;
06235 CW = CW_MPM89;
06236 CO = CO_MPM89;
06237 AppCutoff = 1;
06238 }
06239 else if ( model == "user" )
06240 {
06241 CC = CCin;
06242 CL = CLin;
06243 CW = CWin;
06244 CO = COin;
06245 }
06246 else
06247 {
06248 ostringstream os;
06249 os << "O2-MPM89: ERROR! Wrong model values given.\n"
06250 << "Valid models are: 'MPM89' 'MPM89Lines' 'MPM89Continuum' 'MPM89NoCoupling' 'MPM89NoCutoff'"
06251 << "and 'user'" << '\n';
06252 throw runtime_error(os.str());
06253 }
06254 out3 << "O2-MPM89: (model=" << model << ") parameter values in use:\n"
06255 << " CC = " << CC << "\n"
06256 << " CL = " << CL << "\n"
06257 << " CW = " << CW << "\n"
06258 << " CO = " << CO << "\n";
06259
06260
06261
06262 const Numeric S0 = 6.140e-4;
06263 const Numeric G0 = 5.60e-3;
06264 const Numeric X0 = 0.800;
06265
06266 const Index n_p = p_abs.nelem();
06267 const Index n_f = f_mono.nelem();
06268
06269
06270
06271
06272
06273 const Numeric VMRISO = 0.2085;
06274
06275
06276 assert ( n_p==t_abs.nelem() );
06277 assert ( n_p==vmr.nelem() );
06278
06279
06280
06281 assert ( n_f==xsec.nrows() );
06282 assert ( n_p==xsec.ncols() );
06283
06284
06285 for ( Index i=0; i<n_p; ++i )
06286 {
06287
06288 if (vmr[i] < VMRCalcLimit)
06289 {
06290 ostringstream os;
06291 os << "ERROR: MPM89 O2 full absorption model has detected a O2 volume mixing ratio of "
06292 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06293 << "Therefore no calculation is performed.\n";
06294 throw runtime_error(os.str());
06295 return;
06296 }
06297
06298
06299 Numeric theta = (300.0 / t_abs[i]);
06300
06301 Numeric pwv = Pa_to_kPa * p_abs[i] * h2o_abs[i];
06302
06303 Numeric pda = (Pa_to_kPa * p_abs[i]) - pwv;
06304
06305
06306 Numeric pda_dummy = pda;
06307
06308 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06309
06310 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06311
06312
06313 for ( Index s=0; s<n_f; ++s )
06314 {
06315
06316 Numeric ff = f_mono[s] * Hz_to_GHz;
06317
06318
06319
06320 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06321 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06322
06323
06324 Numeric Nppl = 0.0;
06325 for ( Index l = i_first; l <= i_last; ++l )
06326 {
06327
06328 Numeric strength = CL * mpm89[l][1] * 1.000e-6 * pda_dummy *
06329 pow(theta, (Numeric)3.) * exp(mpm89[l][2]*(1.000-theta)) /
06330 mpm89[l][0];
06331
06332 Numeric gam = CW * ( mpm89[l][3] * 1.000e-3 *
06333 ( ( pda * pow(theta, ((Numeric)0.80-mpm89[l][4]))) +
06334 (1.10 * pwv * theta) ) );
06335
06336 Numeric delta = CO * ( (mpm89[l][5] + mpm89[l][6] * theta) * 1.000e-3 *
06337 pda * pow(theta, (Numeric)0.8) );
06338
06339 Nppl += strength * MPMLineShapeO2Function(gam, mpm89[l][0], ff, delta);
06340 }
06341
06342
06343 if (AppCutoff == 0)
06344 {
06345 if (Nppl < 0.000) Nppl = 0.0000;
06346 }
06347
06348
06349
06350
06351 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06352 }
06353 }
06354 return;
06355 }
06356
06357
06358
06359
06391 void MPM92O2AbsModel( MatrixView xsec,
06392 const Numeric CCin,
06393 const Numeric CLin,
06394 const Numeric CWin,
06395 const Numeric COin,
06396 const String& model,
06397 ConstVectorView f_mono,
06398 ConstVectorView p_abs,
06399 ConstVectorView t_abs,
06400 ConstVectorView h2o_abs,
06401 ConstVectorView vmr )
06402 {
06403
06404
06405
06406
06407
06408 const Numeric mpm92[44][7] = {
06409 { 50.474238, 0.094, 9.694, 0.850, 0.0, 0.210, 0.685},
06410 { 50.987749, 0.246, 8.694, 0.870, 0.0, 0.190, 0.680},
06411 { 51.503350, 0.608, 7.744, 0.890, 0.0, 0.171, 0.673},
06412 { 52.021410, 1.414, 6.844, 0.920, 0.0, 0.144, 0.664},
06413 { 52.542394, 3.102, 6.004, 0.940, 0.0, 0.118, 0.653},
06414 { 53.066907, 6.410, 5.224, 0.970, 0.0, 0.114, 0.621},
06415 { 53.595749, 12.470, 4.484, 1.000, 0.0, 0.200, 0.508},
06416 { 54.130000, 22.800, 3.814, 1.020, 0.0, 0.291, 0.375},
06417 { 54.671159, 39.180, 3.194, 1.050, 0.0, 0.325, 0.265},
06418 { 55.221367, 63.160, 2.624, 1.080, 0.0, 0.224, 0.295},
06419 { 55.783802, 95.350, 2.119, 1.110, 0.0, -0.144, 0.613},
06420 { 56.264775, 54.890, 0.015, 1.646, 0.0, 0.339, -0.098},
06421 { 56.363389, 134.400, 1.660, 1.144, 0.0, -0.258, 0.655},
06422 { 56.968206, 176.300, 1.260, 1.181, 0.0, -0.362, 0.645},
06423 { 57.612484, 214.100, 0.915, 1.221, 0.0, -0.533, 0.606},
06424 { 58.323877, 238.600, 0.626, 1.266, 0.0, -0.178, 0.044},
06425 { 58.446590, 145.700, 0.084, 1.449, 0.0, 0.650, -0.127},
06426 { 59.164207, 240.400, 0.391, 1.319, 0.0, -0.628, 0.231},
06427 { 59.590983, 211.200, 0.212, 1.360, 0.0, 0.665, -0.078},
06428 { 60.306061, 212.400, 0.212, 1.382, 0.0, -0.613, 0.070},
06429 { 60.434776, 246.100, 0.391, 1.297, 0.0, 0.606, -0.282},
06430 { 61.150560, 250.400, 0.626, 1.248, 0.0, 0.090, -0.058},
06431 { 61.800154, 229.800, 0.915, 1.207, 0.0, 0.496, -0.662},
06432 { 62.411215, 193.300, 1.260, 1.171, 0.0, 0.313, -0.676},
06433 { 62.486260, 151.700, 0.083, 1.468, 0.0, -0.433, 0.084},
06434 { 62.997977, 150.300, 1.665, 1.139, 0.0, 0.208, -0.668},
06435 { 63.568518, 108.700, 2.115, 1.110, 0.0, 0.094, -0.614},
06436 { 64.127767, 73.350, 2.620, 1.080, 0.0, -0.270, -0.289},
06437 { 64.678903, 46.350, 3.195, 1.050, 0.0, -0.366, -0.259},
06438 { 65.224071, 27.480, 3.815, 1.020, 0.0, -0.326, -0.368},
06439 { 65.764772, 15.300, 4.485, 1.000, 0.0, -0.232, -0.500},
06440 { 66.302091, 8.009, 5.225, 0.970, 0.0, -0.146, -0.609},
06441 { 66.836830, 3.946, 6.005, 0.940, 0.0, -0.147, -0.639},
06442 { 67.369598, 1.832, 6.845, 0.920, 0.0, -0.174, -0.647},
06443 { 67.900867, 0.801, 7.745, 0.890, 0.0, -0.198, -0.655},
06444 { 68.431005, 0.330, 8.695, 0.870, 0.0, -0.210, -0.660},
06445 { 68.960311, 0.128, 9.695, 0.850, 0.0, -0.220, -0.665},
06446 { 118.750343, 94.500, 0.009, 1.630, 0.0, -0.031, 0.008},
06447 { 368.498350, 6.790, 0.049, 1.920, 0.6, 0.000, 0.000},
06448 { 424.763124, 63.800, 0.044, 1.926, 0.6, 0.000, 0.000},
06449 { 487.249370, 23.500, 0.049, 1.920, 0.6, 0.000, 0.000},
06450 { 715.393150, 9.960, 0.145, 1.810, 0.6, 0.000, 0.000},
06451 { 773.839675, 67.100, 0.130, 1.810, 0.6, 0.000, 0.000},
06452 { 834.145330, 18.000, 0.147, 1.810, 0.6, 0.000, 0.000}};
06453
06454
06455 const Index i_first = 0;
06456 const Index i_last = 43;
06457
06458
06459
06460
06461
06462 const Numeric CC_MPM92 = 1.00000;
06463 const Numeric CL_MPM92 = 1.00000;
06464 const Numeric CW_MPM92 = 1.00000;
06465 const Numeric CO_MPM92 = 1.00000;
06466 int AppCutoff = 0;
06467
06468
06469
06470
06471 Numeric CC, CL, CW, CO;
06472 if ( model == "MPM92" )
06473 {
06474 CC = CC_MPM92;
06475 CL = CL_MPM92;
06476 CW = CW_MPM92;
06477 CO = CO_MPM92;
06478 }
06479 else if ( model == "MPM92Lines" )
06480 {
06481 CC = 0.000;
06482 CL = CL_MPM92;
06483 CW = CW_MPM92;
06484 CO = CO_MPM92;
06485 }
06486 else if ( model == "MPM92Continuum" )
06487 {
06488 CC = CC_MPM92;
06489 CL = 0.000;
06490 CW = 0.000;
06491 CO = 0.000;
06492 }
06493 else if ( model == "MPM92NoCoupling" )
06494 {
06495 CC = CC_MPM92;
06496 CL = CL_MPM92;
06497 CW = CW_MPM92;
06498 CO = 0.000;
06499 }
06500 else if ( model == "MPM92NoCutoff" )
06501 {
06502 CC = CC_MPM92;
06503 CL = CL_MPM92;
06504 CW = CW_MPM92;
06505 CO = CO_MPM92;
06506 AppCutoff = 1;
06507 }
06508 else if ( model == "user" )
06509 {
06510 CC = CCin;
06511 CL = CLin;
06512 CW = CWin;
06513 CO = COin;
06514 }
06515 else
06516 {
06517 ostringstream os;
06518 os << "O2-MPM92: ERROR! Wrong model values given.\n"
06519 << "Valid models are: 'MPM92' 'MPM92Lines' 'MPM92Continuum' 'MPM92NoCoupling' 'MPM92NoCutoff'"
06520 << "and 'user'" << '\n';
06521 throw runtime_error(os.str());
06522 }
06523 out3 << "O2-MPM92: (model=" << model << ") parameter values in use:\n"
06524 << " CC = " << CC << "\n"
06525 << " CL = " << CL << "\n"
06526 << " CW = " << CW << "\n"
06527 << " CO = " << CO << "\n";
06528
06529
06530
06531
06532
06533
06534 const Numeric VMRISO = 0.2085;
06535
06536
06537 const Numeric S0 = 6.140e-5;
06538 const Numeric G0 = 0.560e-3;
06539 const Numeric X0 = 0.800;
06540
06541 const Index n_p = p_abs.nelem();
06542 const Index n_f = f_mono.nelem();
06543
06544
06545 assert ( n_p==t_abs.nelem() );
06546 assert ( n_p==vmr.nelem() );
06547
06548
06549
06550 assert ( n_f==xsec.nrows() );
06551 assert ( n_p==xsec.ncols() );
06552
06553
06554 for ( Index i=0; i<n_p; ++i )
06555 {
06556
06557 if (vmr[i] < VMRCalcLimit)
06558 {
06559 ostringstream os;
06560 os << "ERROR: MPM92 O2 full absorption model has detected a O2 volume mixing ratio of "
06561 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06562 << "Therefore no calculation is performed.\n";
06563 throw runtime_error(os.str());
06564 return;
06565 }
06566
06567
06568 Numeric theta = (300.0 / t_abs[i]);
06569
06570 Numeric pwv = Pa_to_hPa * p_abs[i] * h2o_abs[i];
06571
06572 Numeric pda = (Pa_to_hPa * p_abs[i]) - pwv;
06573
06574
06575 Numeric pda_dummy = pda;
06576
06577 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06578
06579 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06580
06581
06582 for ( Index s=0; s<n_f; ++s )
06583 {
06584
06585 Numeric ff = f_mono[s] * Hz_to_GHz;
06586
06587
06588
06589 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06590 ( pow( ff, (Numeric)2.) + pow( gam_cont, (Numeric)2.) );
06591
06592
06593 Numeric Nppl = 0.0;
06594 for ( Index l = i_first; l <= i_last; ++l )
06595 {
06596
06597 Numeric strength = CL * 1.000e-6 * pda_dummy * mpm92[l][1] / mpm92[l][0] *
06598 pow(theta, (Numeric)3.) * exp(mpm92[l][2]*(1.0-theta));
06599
06600 Numeric gam = CW * ( mpm92[l][3] * 0.001 *
06601 ( ( pda * pow(theta, ((Numeric)0.8-mpm92[l][4]))) +
06602 (1.10 * pwv * theta) ) );
06603
06604
06605 Numeric delta = CO * ( (mpm92[l][5] + mpm92[l][6] * theta) *
06606 (pda+pwv) * 0.001 * pow(theta, (Numeric)0.8) );
06607
06608 Nppl += strength * MPMLineShapeO2Function(gam, mpm92[l][0], ff, delta);
06609 }
06610
06611
06612 if (AppCutoff == 0)
06613 {
06614 if (Nppl < 0.000) Nppl = 0.0000;
06615 }
06616
06617
06618
06619
06620 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06621 }
06622 }
06623 return;
06624 }
06625
06626
06627
06660 void MPM93O2AbsModel( MatrixView xsec,
06661 const Numeric CCin,
06662 const Numeric CLin,
06663 const Numeric CWin,
06664 const Numeric COin,
06665 const String& model,
06666 ConstVectorView f_mono,
06667 ConstVectorView p_abs,
06668 ConstVectorView t_abs,
06669 ConstVectorView h2o_abs,
06670 ConstVectorView vmr )
06671 {
06672
06673
06674
06675
06676
06677 const Numeric mpm93[44][7] = {
06678 { 50.474238, 0.094, 9.694, 0.890, 0.0, 0.240, 0.790},
06679 { 50.987749, 0.246, 8.694, 0.910, 0.0, 0.220, 0.780},
06680 { 51.503350, 0.608, 7.744, 0.940, 0.0, 0.197, 0.774},
06681 { 52.021410, 1.414, 6.844, 0.970, 0.0, 0.166, 0.764},
06682 { 52.542394, 3.102, 6.004, 0.990, 0.0, 0.136, 0.751},
06683 { 53.066907, 6.410, 5.224, 1.020, 0.0, 0.131, 0.714},
06684 { 53.595749, 12.470, 4.484, 1.050, 0.0, 0.230, 0.584},
06685 { 54.130000, 22.800, 3.814, 1.070, 0.0, 0.335, 0.431},
06686 { 54.671159, 39.180, 3.194, 1.100, 0.0, 0.374, 0.305},
06687 { 55.221367, 63.160, 2.624, 1.130, 0.0, 0.258, 0.339},
06688 { 55.783802, 95.350, 2.119, 1.170, 0.0, -0.166, 0.705},
06689 { 56.264775, 54.890, 0.015, 1.730, 0.0, 0.390, -0.113},
06690 { 56.363389, 134.400, 1.660, 1.200, 0.0, -0.297, 0.753},
06691 { 56.968206, 176.300, 1.260, 1.240, 0.0, -0.416, 0.742},
06692 { 57.612484, 214.100, 0.915, 1.280, 0.0, -0.613, 0.697},
06693 { 58.323877, 238.600, 0.626, 1.330, 0.0, -0.205, 0.051},
06694 { 58.446590, 145.700, 0.084, 1.520, 0.0, 0.748, -0.146},
06695 { 59.164207, 240.400, 0.391, 1.390, 0.0, -0.722, 0.266},
06696 { 59.590983, 211.200, 0.212, 1.430, 0.0, 0.765, -0.090},
06697 { 60.306061, 212.400, 0.212, 1.450, 0.0, -0.705, 0.081},
06698 { 60.434776, 246.100, 0.391, 1.360, 0.0, 0.697, -0.324},
06699 { 61.150560, 250.400, 0.626, 1.310, 0.0, 0.104, -0.067},
06700 { 61.800154, 229.800, 0.915, 1.270, 0.0, 0.570, -0.761},
06701 { 62.411215, 193.300, 1.260, 1.230, 0.0, 0.360, -0.777},
06702 { 62.486260, 151.700, 0.083, 1.540, 0.0, -0.498, 0.097},
06703 { 62.997977, 150.300, 1.665, 1.200, 0.0, 0.239, -0.768},
06704 { 63.568518, 108.700, 2.115, 1.170, 0.0, 0.108, -0.706},
06705 { 64.127767, 73.350, 2.620, 1.130, 0.0, -0.311, -0.332},
06706 { 64.678903, 46.350, 3.195, 1.100, 0.0, -0.421, -0.298},
06707 { 65.224071, 27.480, 3.815, 1.070, 0.0, -0.375, -0.423},
06708 { 65.764772, 15.300, 4.485, 1.050, 0.0, -0.267, -0.575},
06709 { 66.302091, 8.009, 5.225, 1.020, 0.0, -0.168, -0.700},
06710 { 66.836830, 3.946, 6.005, 0.990, 0.0, -0.169, -0.735},
06711 { 67.369598, 1.832, 6.845, 0.970, 0.0, -0.200, -0.744},
06712 { 67.900867, 0.801, 7.745, 0.940, 0.0, -0.228, -0.753},
06713 { 68.431005, 0.330, 8.695, 0.920, 0.0, -0.240, -0.760},
06714 { 68.960311, 0.128, 9.695, 0.900, 0.0, -0.250, -0.765},
06715 { 118.750343, 94.500, 0.009, 1.630, 0.0, -0.036, 0.009},
06716 { 368.498350, 6.790, 0.049, 1.920, 0.6, 0.000, 0.000},
06717 { 424.763124, 63.800, 0.044, 1.930, 0.6, 0.000, 0.000},
06718 { 487.249370, 23.500, 0.049, 1.920, 0.6, 0.000, 0.000},
06719 { 715.393150, 9.960, 0.145, 1.810, 0.6, 0.000, 0.000},
06720 { 773.839675, 67.100, 0.130, 1.820, 0.6, 0.000, 0.000},
06721 { 834.145330, 18.000, 0.147, 1.810 , 0.6, 0.000, 0.000}};
06722
06723 const Index i_first = 0;
06724 const Index i_last = 43;
06725
06726
06727
06728
06729
06730 const Numeric CC_MPM93 = 1.00000;
06731 const Numeric CL_MPM93 = 1.00000;
06732 const Numeric CW_MPM93 = 1.00000;
06733 const Numeric CO_MPM93 = 1.00000;
06734 int AppCutoff = 0;
06735
06736
06737
06738
06739 Numeric CC, CL, CW, CO;
06740 if ( model == "MPM93" )
06741 {
06742 CC = CC_MPM93;
06743 CL = CL_MPM93;
06744 CW = CW_MPM93;
06745 CO = CO_MPM93;
06746 }
06747 else if ( model == "MPM93Lines" )
06748 {
06749 CC = 0.000;
06750 CL = CL_MPM93;
06751 CW = CW_MPM93;
06752 CO = CO_MPM93;
06753 }
06754 else if ( model == "MPM93Continuum" )
06755 {
06756 CC = CC_MPM93;
06757 CL = 0.000;
06758 CW = 0.000;
06759 CO = 0.000;
06760 }
06761 else if ( model == "MPM93NoCoupling" )
06762 {
06763 CC = CC_MPM93;
06764 CL = CL_MPM93;
06765 CW = CW_MPM93;
06766 CO = 0.000;
06767 }
06768 else if ( model == "MPM93NoCutoff" )
06769 {
06770
06771
06772
06773 CC = CC_MPM93;
06774 CL = CL_MPM93;
06775 CW = CW_MPM93;
06776 CO = CO_MPM93;
06777 AppCutoff = 1;
06778 }
06779 else if ( model == "user" )
06780 {
06781 CC = CCin;
06782 CL = CLin;
06783 CW = CWin;
06784 CO = COin;
06785 }
06786 else
06787 {
06788 ostringstream os;
06789 os << "O2-MPM93: ERROR! Wrong model values given.\n"
06790 << "Valid models are: 'MPM93' 'MPM93Lines' 'MPM93Continuum' 'MPM93NoCoupling' 'MPM93NoCutoff'"
06791 << "and 'user'" << '\n';
06792 throw runtime_error(os.str());
06793 }
06794 out3 << "O2-MPM93: (model=" << model << ") parameter values in use:\n"
06795 << " CC = " << CC << "\n"
06796 << " CL = " << CL << "\n"
06797 << " CW = " << CW << "\n"
06798 << " CO = " << CO << "\n";
06799
06800
06801
06802
06803
06804
06805 const Numeric VMRISO = 0.2085;
06806
06807
06808 const Numeric S0 = 6.140e-5;
06809 const Numeric G0 = 0.560e-3;
06810 const Numeric X0 = 0.800;
06811
06812 const Index n_p = p_abs.nelem();
06813 const Index n_f = f_mono.nelem();
06814
06815
06816 assert ( n_p==t_abs.nelem() );
06817 assert ( n_p==vmr.nelem() );
06818
06819
06820
06821 assert ( n_f==xsec.nrows() );
06822 assert ( n_p==xsec.ncols() );
06823
06824
06825 for ( Index i=0; i<n_p; ++i )
06826 {
06827
06828 if (vmr[i] < VMRCalcLimit)
06829 {
06830 ostringstream os;
06831 os << "ERROR: MPM93 O2 full absorption model has detected a O2 volume mixing ratio of "
06832 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
06833 << "Therefore no calculation is performed.\n";
06834 throw runtime_error(os.str());
06835 return;
06836 }
06837
06838
06839 Numeric theta = (300.0 / t_abs[i]);
06840
06841 Numeric pwv = Pa_to_hPa * p_abs[i] * h2o_abs[i];
06842
06843 Numeric pda = (Pa_to_hPa * p_abs[i]) - pwv;
06844
06845
06846
06847 Numeric pda_dummy = pda;
06848
06849 Numeric strength_cont = S0 * pda_dummy * pow( theta, (Numeric)2. );
06850
06851 Numeric gam_cont = G0 * (pwv+pda) * pow( theta, X0 );
06852
06853
06854 for ( Index s=0; s<n_f; ++s )
06855 {
06856
06857 Numeric ff = f_mono[s] * Hz_to_GHz;
06858
06859
06860
06861 Numeric Nppc = CC * strength_cont * ff * gam_cont /
06862 ( pow( ff, (Numeric)2.)
06863 + pow( gam_cont, (Numeric)2.) );
06864
06865
06866 Numeric Nppl = 0.0;
06867 for ( Index l = i_first; l <= i_last; ++l )
06868 {
06869
06870 Numeric strength = CL * 1.000e-6 * pda_dummy *
06871 mpm93[l][1] / mpm93[l][0] *
06872 pow(theta, (Numeric)3.) * exp(mpm93[l][2]*(1.0-theta));
06873
06874 Numeric gam = CW * ( mpm93[l][3] * 0.001 *
06875 ( ( pda * pow(theta, ((Numeric)0.8-mpm93[l][4]))) +
06876 (1.10 * pwv * theta) ) );
06877
06878
06879 Numeric delta = CO * ( (mpm93[l][5] + mpm93[l][6] * theta) *
06880 (pda+pwv) * pow(theta, (Numeric)0.8)
06881 * (Numeric)0.001 );
06882
06883 Nppl += strength * MPMLineShapeO2Function(gam, mpm93[l][0], ff, delta);
06884 }
06885
06886
06887 if (AppCutoff == 0)
06888 {
06889 if (Nppl < 0.000) Nppl = 0.0000;
06890 }
06891
06892
06893
06894
06895 xsec(s,i) += dB_km_to_1_m * 0.1820 * ff * (Nppl+Nppc) / VMRISO;
06896 }
06897 }
06898 return;
06899 }
06900
06901
06902
06903
06904
06905
06906
06907
06908
06909
06910
06911
06912
06913
06914
06915
06916
06917
06918
06919
06920
06921
06957 void PWR93O2AbsModel( MatrixView xsec,
06958 const Numeric CCin,
06959 const Numeric CLin,
06960 const Numeric CWin,
06961 const Numeric COin,
06962 const String& model,
06963 const String& version,
06964 ConstVectorView f_mono,
06965 ConstVectorView p_abs,
06966 ConstVectorView t_abs,
06967 ConstVectorView vmrh2o,
06968 ConstVectorView vmr )
06969 {
06970 const Index n_lines = 40;
06971
06972
06973
06974 const Numeric F93[n_lines] = { 118.7503, 56.2648, 62.4863, 58.4466,
06975 60.3061, 59.5910, 59.1642, 60.4348,
06976 58.3239, 61.1506, 57.6125, 61.8002,
06977 56.9682, 62.4112, 56.3634, 62.9980,
06978 55.7838, 63.5685, 55.2214, 64.1278,
06979 54.6712, 64.6789, 54.1300, 65.2241,
06980 53.5957, 65.7648, 53.0669, 66.3021,
06981 52.5424, 66.8368, 52.0214, 67.3696,
06982 51.5034, 67.9009, 368.4984, 424.7631,
06983 487.2494, 715.3932, 773.8397, 834.1453};
06984
06985
06986 const Numeric F98[n_lines] = { 118.7503, 56.2648, 62.4863, 58.4466, 60.3061, 59.5910,
06987 59.1642, 60.4348, 58.3239, 61.1506, 57.6125, 61.8002,
06988 56.9682, 62.4112, 56.3634, 62.9980, 55.7838, 63.5685,
06989 55.2214, 64.1278, 54.6712, 64.6789, 54.1300, 65.2241,
06990 53.5957, 65.7648, 53.0669, 66.3021, 52.5424, 66.8368,
06991 52.0214, 67.3696, 51.5034, 67.9009, 368.4984, 424.7632,
06992 487.2494, 715.3931, 773.8397, 834.1458};
06993
06994
06995
06996 const Numeric S93[n_lines] = { 0.2936E-14, 0.8079E-15, 0.2480E-14, 0.2228E-14,
06997 0.3351E-14, 0.3292E-14, 0.3721E-14, 0.3891E-14,
06998 0.3640E-14, 0.4005E-14, 0.3227E-14, 0.3715E-14,
06999 0.2627E-14, 0.3156E-14, 0.1982E-14, 0.2477E-14,
07000 0.1391E-14, 0.1808E-14, 0.9124E-15, 0.1230E-14,
07001 0.5603E-15, 0.7842E-15, 0.3228E-15, 0.4689E-15,
07002 0.1748E-15, 0.2632E-15, 0.8898E-16, 0.1389E-15,
07003 0.4264E-16, 0.6899E-16, 0.1924E-16, 0.3229E-16,
07004 0.8191E-17, 0.1423E-16, 0.6460E-15, 0.7047E-14,
07005 0.3011E-14, 0.1826E-14, 0.1152E-13, 0.3971E-14};
07006
07007
07008 const Numeric S98[n_lines] = { 0.2936E-14, 0.8079E-15, 0.2480E-14, 0.2228E-14,
07009 0.3351E-14, 0.3292E-14, 0.3721E-14, 0.3891E-14,
07010 0.3640E-14, 0.4005E-14, 0.3227E-14, 0.3715E-14,
07011 0.2627E-14, 0.3156E-14, 0.1982E-14, 0.2477E-14,
07012 0.1391E-14, 0.1808E-14, 0.9124E-15, 0.1230E-14,
07013 0.5603E-15, 0.7842E-15, 0.3228E-15, 0.4689E-15,
07014 0.1748E-15, 0.2632E-15, 0.8898E-16, 0.1389E-15,
07015 0.4264E-16, 0.6899E-16, 0.1924E-16, 0.3229E-16,
07016 0.8191E-17, 0.1423E-16, 0.6494E-15, 0.7083E-14,
07017 0.3025E-14, 0.1835E-14, 0.1158E-13, 0.3993E-14};
07018
07019
07020 const Numeric BE[n_lines] = { 0.009, 0.015, 0.083, 0.084,
07021 0.212, 0.212, 0.391, 0.391,
07022 0.626, 0.626, 0.915, 0.915,
07023 1.260, 1.260, 1.660, 1.665,
07024 2.119, 2.115, 2.624, 2.625,
07025 3.194, 3.194, 3.814, 3.814,
07026 4.484, 4.484, 5.224, 5.224,
07027 6.004, 6.004, 6.844, 6.844,
07028 7.744, 7.744, 0.048, 0.044,
07029 0.049, 0.145, 0.141, 0.145};
07030
07031
07032 const Numeric WB300 = 0.56;
07033 const Numeric X = 0.80;
07034
07035
07036 const Numeric W300[n_lines] = { 1.630, 1.646, 1.468, 1.449,
07037 1.382, 1.360, 1.319, 1.297,
07038 1.266, 1.248, 1.221, 1.207,
07039 1.181, 1.171, 1.144, 1.139,
07040 1.110, 1.108, 1.079, 1.078,
07041 1.050, 1.050, 1.020, 1.020,
07042 1.000, 1.000, 0.970, 0.970,
07043 0.940, 0.940, 0.920, 0.920,
07044 0.890, 0.890, 1.920, 1.920,
07045 1.920, 1.810, 1.810, 1.810};
07046
07047
07048 const Numeric Y93[n_lines] = { -0.0233, 0.2408, -0.3486, 0.5227,
07049 -0.5430, 0.5877, -0.3970, 0.3237,
07050 -0.1348, 0.0311, 0.0725, -0.1663,
07051 0.2832, -0.3629, 0.3970, -0.4599,
07052 0.4695, -0.5199, 0.5187, -0.5597,
07053 0.5903, -0.6246, 0.6656, -0.6942,
07054 0.7086, -0.7325, 0.7348, -0.7546,
07055 0.7702, -0.7864, 0.8083, -0.8210,
07056 0.8439, -0.8529, 0.0000, 0.0000,
07057 0.0000, 0.0000, 0.0000, 0.0000};
07058
07059
07060
07061
07062 const Numeric Y88[n_lines] = { -0.0244, 0.2772, -0.4068, 0.6270,
07063 -0.6183, 0.6766, -0.4119, 0.3290,
07064 0.0317, -0.1591, 0.1145, -0.2068,
07065 0.3398, -0.4158, 0.3922, -0.4482,
07066 0.4011, -0.4442, 0.4339, -0.4687,
07067 0.4783, -0.5074, 0.5157, -0.5403,
07068 0.5400, -0.5610, 0.5719, -0.5896,
07069 0.6046, -0.6194, 0.6347, -0.6468,
07070 0.6627, -0.6718, 0.0000, 0.0000,
07071 0.0000, 0.0000, 0.0000, 0.0000};
07072
07073
07074 const Numeric V[n_lines] ={ 0.0079, -0.0978, 0.0844, -0.1273,
07075 0.0699, -0.0776, 0.2309, -0.2825,
07076 0.0436, -0.0584, 0.6056, -0.6619,
07077 0.6451, -0.6759, 0.6547, -0.6675,
07078 0.6135, -0.6139, 0.2952, -0.2895,
07079 0.2654, -0.2590, 0.3750, -0.3680,
07080 0.5085, -0.5002, 0.6206, -0.6091,
07081 0.6526, -0.6393, 0.6640, -0.6475,
07082 0.6729, -0.6545, 0.0000, 0.0000,
07083 0.0000, 0.0000, 0.0000, 0.0000};
07084
07085 const Index first_line = 0;
07086 const Index last_line = 39;
07087
07088
07089
07090
07091
07092 const Numeric CC_PWR93 = 1.00000;
07093 const Numeric CL_PWR93 = 1.00000;
07094 const Numeric CW_PWR93 = 1.00000;
07095 const Numeric CO_PWR93 = 1.00000;
07096
07097
07098
07099
07100 Numeric CC, CL, CW, CO, Y300[n_lines], S300[n_lines], F[n_lines];
07101
07102
07103 if ( model == "Rosenkranz" )
07104 {
07105 CC = CC_PWR93;
07106 CL = CL_PWR93;
07107 CW = CW_PWR93;
07108 CO = CO_PWR93;
07109 }
07110 else if ( model == "RosenkranzLines" )
07111 {
07112 CC = 0.000;
07113 CL = CL_PWR93;
07114 CW = CW_PWR93;
07115 CO = CO_PWR93;
07116 }
07117 else if ( model == "RosenkranzContinuum" )
07118 {
07119 CC = CC_PWR93;
07120 CL = 0.000;
07121 CW = 0.000;
07122 CO = 0.000;
07123 }
07124 else if ( model == "RosenkranzNoCoupling" )
07125 {
07126 CC = CC_PWR93;
07127 CL = CL_PWR93;
07128 CW = CW_PWR93;
07129 CO = 0.000;
07130 }
07131 else if ( model == "user" )
07132 {
07133 CC = CCin;
07134 CL = CLin;
07135 CW = CWin;
07136 CO = COin;
07137 }
07138 else
07139 {
07140 ostringstream os;
07141 os << "O2-PWR93: ERROR! Wrong model values given.\n"
07142 << "Valid models are: 'Rosenkranz', 'RosenkranzLines', RosenkranzContinuum, "
07143 << "'RosenkranzNoCoupling', and 'user'" << '\n';
07144 throw runtime_error(os.str());
07145 }
07146 out3 << "O2-PWR93: (model=" << model << ") parameter values in use:\n"
07147 << " CC = " << CC << "\n"
07148 << " CL = " << CL << "\n"
07149 << " CW = " << CW << "\n"
07150 << " CO = " << CO << "\n";
07151
07152
07153
07154 if ( (version != "PWR98") && (version != "PWR93") && (version != "PWR88") )
07155 {
07156 ostringstream os;
07157 os << "O2-PWR93/PWR88: ERROR! Wrong version is selected.\n"
07158 << "Valid versions are:\n"
07159 << " 'PWR98' updates of F and S to HISTRAN96 and M.J.Schwartz, MIT, 1997\n"
07160 << " suggestions implemented.\n"
07161 << " 'PWR93' for the oxygen absorption model described in \n"
07162 << " P. W. Rosenkranz, Chapter 2, in M. A. Janssen,\n"
07163 << " Atmospheric Remote Sensing by Microwave Radiometry,\n"
07164 << " John Wiley & Sons, Inc., 1993.\n"
07165 << " 'PWR88' for the oxygen absorption model described in \n"
07166 << " P. W. Rosenkranz, Interference coefficients for the \n"
07167 << " overlapping oxygen lines in air, \n"
07168 << " JQSRT, 1988, Volume 39, 287-297.\n";
07169 throw runtime_error(os.str());
07170 }
07171
07172
07173
07174 if ( version == "PWR88" ) {
07175 for ( Index i=0; i<n_lines; ++i )
07176 {
07177 F[i] = F93[i];
07178 S300[i] = S93[i];
07179 Y300[i] = Y88[i];
07180 };
07181 }
07182 if ( version == "PWR93" ) {
07183 for ( Index i=0; i<n_lines; ++i )
07184 {
07185 F[i] = F93[i];
07186 S300[i] = S93[i];
07187 Y300[i] = Y93[i];
07188 };
07189 }
07190 if ( version == "PWR98" ) {
07191 for ( Index i=0; i<n_lines; ++i )
07192 {
07193 F[i] = F98[i];
07194 S300[i] = S98[i];
07195 Y300[i] = Y93[i];
07196 };
07197 }
07198
07199 const Index n_p = p_abs.nelem();
07200 const Index n_f = f_mono.nelem();
07201
07202
07203 assert ( n_p==t_abs.nelem() );
07204 assert ( n_p==vmr.nelem() );
07205
07206
07207
07208 assert ( n_f==xsec.nrows() );
07209 assert ( n_p==xsec.ncols() );
07210
07211
07212 for ( Index i=0; i<n_p; ++i )
07213 {
07214
07215 if (vmr[i] < VMRCalcLimit)
07216 {
07217 ostringstream os;
07218 os << "ERROR: PWR93 O2 full absorption model has detected a O2 volume mixing ratio of "
07219 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
07220 << "Therefore no calculation is performed.\n";
07221 throw runtime_error(os.str());
07222 return;
07223 }
07224
07225 Numeric TH = 3.0000e2 / t_abs[i];
07226 Numeric TH1 = (TH-1.000e0);
07227 Numeric B = pow(TH, X);
07228
07229 Numeric PRESWV = Pa_to_hPa * (p_abs[i] * vmrh2o[i]);
07230 Numeric PRESDA = Pa_to_hPa * (p_abs[i] * (1.000e0 - vmrh2o[i]));
07231 Numeric DEN = 0.001*(PRESDA*B + 1.1*PRESWV*TH);
07232 Numeric DENS = 0.001*(PRESDA + 1.1*PRESWV)*TH;
07233 Numeric DFNR = WB300*DEN;
07234
07235
07236 Numeric CCONT = CC * 1.23e-10 * pow( TH, (Numeric)2. ) * p_abs[i];
07237
07238
07239 for ( Index s=0; s<n_f; ++s )
07240 {
07241
07242
07243
07244
07245 Numeric ff = Hz_to_GHz * f_mono[s];
07246
07247
07248 Numeric CONT = CCONT * (ff * ff * DFNR / (ff*ff + DFNR*DFNR));
07249
07250
07251 Numeric SUM = 0.000e0;
07252 for ( Index l=first_line; l<=last_line; ++l )
07253 {
07254 Numeric DF = CW * W300[l] * DEN;
07255
07256 if ( (version == "PWR98") && (fabs((F[l]-118.75)) < 0.10) )
07257 {
07258 DF = CW * W300[l] * DENS;
07259 }
07260 Numeric Y = CO * 0.001 * 0.01 * p_abs[i] * B * ( Y300[l] + V[l]*TH1 );
07261 Numeric STR = CL * S300[l] * exp(-BE[l] * TH1);
07262 Numeric SF1 = ( DF + (ff-F[l])*Y ) / ( (ff-F[l])*(ff-F[l]) + DF*DF );
07263 Numeric SF2 = ( DF - (ff+F[l])*Y ) / ( (ff+F[l])*(ff+F[l]) + DF*DF );
07264 SUM += STR * (SF1+SF2) * (ff/F[l]) * (ff/F[l]);
07265 }
07266
07267
07268
07269
07270
07271
07272
07273
07274
07275
07276
07277
07278 xsec(s,i) += CONT + (2.414322e7 * SUM * p_abs[i] * pow(TH, (Numeric)3.) / PI);
07279 }
07280 }
07281 return;
07282 }
07283
07284
07285
07286
07287
07288
07289
07290
07323 void MPM93_O2_continuum( MatrixView xsec,
07324 const Numeric S0in,
07325 const Numeric G0in,
07326 const Numeric XS0in,
07327 const Numeric XG0in,
07328 const String& model,
07329 ConstVectorView f_mono,
07330 ConstVectorView p_abs,
07331 ConstVectorView t_abs,
07332 ConstVectorView h2o_abs,
07333 ConstVectorView vmr )
07334 {
07335
07336
07337
07338
07339
07340
07341
07342
07343 const Numeric S0_MPM93 = 6.140e-13;
07344 const Numeric G0_MPM93 = 0.560e4;
07345 const Numeric XS0_MPM93 = 2.000;
07346 const Numeric XG0_MPM93 = 0.800;
07347
07348
07349
07350
07351 Numeric S0, G0, XS0, XG0;
07352 if ( model == "MPM93" )
07353 {
07354 S0 = S0_MPM93;
07355 G0 = G0_MPM93;
07356 XS0 = XS0_MPM93;
07357 XG0 = XG0_MPM93;
07358 }
07359 else if ( model == "user" )
07360 {
07361 S0 = S0in;
07362 G0 = G0in;
07363 XS0 = XS0in;
07364 XG0 = XG0in;
07365 }
07366 else
07367 {
07368 ostringstream os;
07369 os << "O2-SelfContMPM93: ERROR! Wrong model values given.\n"
07370 << "Valid models are: 'MPM93' and 'user'" << '\n';
07371 throw runtime_error(os.str());
07372 }
07373 out3 << "O2-SelfContMPM93: (model=" << model << ") parameter values in use:\n"
07374 << " S0 = " << S0 << "\n"
07375 << " G0 = " << G0 << "\n"
07376 << " XS0 = " << XS0 << "\n"
07377 << " XG0 = " << XG0 << "\n";
07378
07379
07380 const Index n_p = p_abs.nelem();
07381 const Index n_f = f_mono.nelem();
07382
07383
07384 assert ( n_p==t_abs.nelem() );
07385 assert ( n_p==vmr.nelem() );
07386
07387
07388
07389 assert ( n_f==xsec.nrows() );
07390 assert ( n_p==xsec.ncols() );
07391
07392
07393
07394
07395
07396 const Numeric VMRISO = 0.2085;
07397
07398
07399
07400 for ( Index i=0; i<n_p; ++i )
07401 {
07402 if (vmr[i] < VMRCalcLimit)
07403 {
07404 ostringstream os;
07405 os << "ERROR: MPM93 O2 continuum absorption model has detected a O2 volume mixing ratio of "
07406 << vmr[i] << " which is below the threshold of " << VMRCalcLimit << ".\n"
07407 << "Therefore no calculation is performed.\n";
07408 throw runtime_error(os.str());
07409 return;
07410 }
07411 Numeric th = 300.0 / t_abs[i];
07412
07413 Numeric strength = S0 * p_abs[i] * (1.0000 - h2o_abs[i]) * pow( th, XS0 );
07414
07415 Numeric gamma = G0 * p_abs[i] * pow( th, XG0 );
07416
07417
07418 for ( Index s=0; s<n_f; ++s )
07419 {
07420
07421
07422 xsec(s,i) += (4.0 * PI / SPEED_OF_LIGHT) *
07423 (strength / VMRISO) *
07424 ( pow( f_mono[s], (Numeric)2.) * gamma /
07425 ( pow( f_mono[s], (Numeric)2.) + pow( gamma, (Numeric)2.) ) );
07426 }
07427 }
07428 return;
07429 }
07430
07431
07432
07433
07434
07435
07436
07437
07468 void Rosenkranz_O2_continuum( MatrixView xsec,
07469 const Numeric S0in,
07470 const Numeric G0in,
07471 const Numeric XS0in,
07472 const Numeric XG0in,
07473 const String& model,
07474 ConstVectorView f_mono,
07475 ConstVectorView p_abs,
07476 ConstVectorView t_abs,
07477 ConstVectorView h2o_abs,
07478 ConstVectorView vmr )
07479 {
07480
07481
07482
07483
07484
07485 const Numeric S0_PWR93 = 1.11e-14;
07486 const Numeric G0_PWR93 = 5600.000;
07487 const Numeric XS0_PWR93 = 2.000;
07488 const Numeric XG0_PWR93 = 0.800;
07489
07490
07491
07492 Numeric S0, G0, XS0, XG0;
07493 if ( model == "Rosenkranz" )
07494 {
07495 S0 = S0_PWR93;
07496 G0 = G0_PWR93;
07497 XS0 = XS0_PWR93;
07498 XG0 = XG0_PWR93;
07499 }
07500 else if ( model == "user" )
07501 {
07502 S0 = S0in;
07503 G0 = G0in;
07504 XS0 = XS0in;
07505 XG0 = XG0in;
07506 }
07507 else
07508 {
07509 ostringstream os;
07510 os << "O2-SelfContPWR93: ERROR! Wrong model values given.\n"
07511 << "Valid models are: 'Rosenkranz' and 'user'" << '\n';
07512 throw runtime_error(os.str());
07513 }
07514 out3 << "O2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
07515 << " S0 = " << S0 << "\n"
07516 << " G0 = " << G0 << "\n"
07517 << " XS0 = " << XS0 << "\n"
07518 << " XG0 = " << XG0 << "\n";
07519
07520
07521 const Index n_p = p_abs.nelem();
07522 const Index n_f = f_mono.nelem();
07523
07524
07525 assert ( n_p==t_abs.nelem() );
07526 assert ( n_p==vmr.nelem() );
07527
07528
07529
07530 assert ( n_f==xsec.nrows() );
07531 assert ( n_p==xsec.ncols() );
07532
07533
07534 for ( Index i=0; i<n_p; ++i )
07535 {
07536 Numeric TH = 300.00 / t_abs[i];
07537
07538 Numeric ph2o = p_abs[i] * h2o_abs[i];
07539 Numeric pdry = p_abs[i] - ph2o;
07540
07541
07542
07543 Numeric gamma = G0 * (pdry * pow( TH, XG0 ) + 1.100 * ph2o * TH);
07544
07545
07546 for ( Index s=0; s<n_f; ++s )
07547 {
07548
07549
07550 xsec(s,i) += S0 * p_abs[i] / pow( t_abs[i], XS0 ) *
07551 ( pow( f_mono[s], (Numeric)2. )
07552 * gamma / ( pow( f_mono[s], 2 )
07553 + pow( gamma, (Numeric)2. ) ) ) ;
07554 }
07555 }
07556 }
07557
07558
07559
07560
07598 void Standard_O2_continuum( MatrixView xsec,
07599 const Numeric Cin,
07600 const Numeric G0in,
07601 const Numeric G0Ain,
07602 const Numeric G0Bin,
07603 const Numeric XG0din,
07604 const Numeric XG0win,
07605 const String& model,
07606 ConstVectorView f_mono,
07607 ConstVectorView p_abs,
07608 ConstVectorView t_abs,
07609 ConstVectorView h2o_abs,
07610 ConstVectorView vmr )
07611 {
07612
07613
07614
07615
07616
07617 const Numeric C_PWR93 = (1.108e-14/pow((Numeric)3.0e2,(Numeric)2.));
07618 const Numeric G0_PWR93 = 5600.000;
07619 const Numeric G0A_PWR93 = 1.000;
07620 const Numeric G0B_PWR93 = 1.100;
07621 const Numeric XG0d_PWR93 = 0.800;
07622 const Numeric XG0w_PWR93 = 1.000;
07623
07624
07625
07626
07627
07628
07629
07630 const Numeric C_MPM93 = 6.14e-13*(4.0*PI/SPEED_OF_LIGHT)/0.2085;
07631
07632 const Numeric G0_MPM93 = 5600.000;
07633 const Numeric G0A_MPM93 = 1.000;
07634 const Numeric G0B_MPM93 = 1.000;
07635 const Numeric XG0d_MPM93 = 0.800;
07636 const Numeric XG0w_MPM93 = 0.800;
07637
07638
07639
07640 Numeric C, G0, G0A, G0B, XG0d, XG0w;
07641 if ( model == "Rosenkranz" )
07642 {
07643 C = C_PWR93;
07644 G0 = G0_PWR93;
07645 G0A = G0A_PWR93;
07646 G0B = G0B_PWR93;
07647 XG0d = XG0d_PWR93;
07648 XG0w = XG0w_PWR93;
07649 }
07650 else if ( model == "MPM93" )
07651 {
07652 C = C_MPM93;
07653 G0 = G0_MPM93;
07654 G0A = G0A_MPM93;
07655 G0B = G0B_MPM93;
07656 XG0d = XG0d_MPM93;
07657 XG0w = XG0w_MPM93;
07658 }
07659 else if ( model == "user" )
07660 {
07661 C = Cin;
07662 G0 = G0in;
07663 G0A = G0Ain;
07664 G0B = G0Bin;
07665 XG0d = XG0din;
07666 XG0w = XG0win;
07667 }
07668 else
07669 {
07670 ostringstream os;
07671 os << "O2-GenerealCont: ERROR! Wrong model values given.\n"
07672 << "Valid models are: 'Rosenkranz', 'MPM93' and 'user'" << '\n';
07673 throw runtime_error(os.str());
07674 }
07675 out3 << "O2-GeneralCont: (model=" << model << ") parameter values in use:\n"
07676 << " C = " << C << "\n"
07677 << " G0 = " << G0 << "\n"
07678 << " G0A = " << G0A << "\n"
07679 << " G0B = " << G0B << "\n"
07680 << " XG0d = " << XG0d << "\n"
07681 << " XG0w = " << XG0w << "\n";
07682
07683
07684 const Index n_p = p_abs.nelem();
07685 const Index n_f = f_mono.nelem();
07686
07687
07688 assert ( n_p==t_abs.nelem() );
07689 assert ( n_p==vmr.nelem() );
07690
07691
07692
07693 assert ( n_f==xsec.nrows() );
07694 assert ( n_p==xsec.ncols() );
07695
07696
07697
07698
07699
07700
07701
07702
07703 for ( Index i=0; i<n_p; ++i )
07704 {
07705 Numeric TH = 3.0e2 / t_abs[i];
07706
07707 Numeric ph2o = p_abs[i] * h2o_abs[i];
07708 Numeric pdry = p_abs[i] - ph2o;
07709
07710
07711
07712 Numeric gamma = G0 * (G0A * pdry * pow( TH, XG0d ) + G0B * ph2o * pow( TH, XG0w ));
07713
07714
07715 for ( Index s=0; s<n_f; ++s )
07716 {
07717
07718
07719 xsec(s,i) += C * p_abs[i] * pow( TH, (Numeric)2. ) *
07720 ( gamma * pow( f_mono[s], (Numeric)2. ) /
07721 ( pow( f_mono[s], 2 ) + pow( gamma, (Numeric)2. ) ) );
07722 }
07723 }
07724 }
07725
07726
07727
07728
07729
07730
07731
07732
07733
07734
07762 void BF86_CIA_N2( MatrixView xsec,
07763 const Numeric Cin,
07764 const String& model,
07765 ConstVectorView f_mono,
07766 ConstVectorView p_abs,
07767 ConstVectorView t_abs,
07768 ConstVectorView vmr )
07769 {
07770
07771
07772
07773 extern Numeric n2n2tks_(double t, double f);
07774
07775
07776
07777
07778
07779 Numeric XFAC = 1.0000;
07780
07781
07782
07783 if ( model == "BF86" )
07784 {
07785 XFAC = 1.0000;
07786 }
07787 else if ( model == "user" )
07788 {
07789 XFAC = Cin;
07790 }
07791 else
07792 {
07793 ostringstream os;
07794 os << "N2-SelfContBorysow: ERROR! Wrong model values given.\n"
07795 << "allowed models are: 'BF86', 'user'" << '\n';
07796 throw runtime_error(os.str());
07797 }
07798
07799 out3 << "N2-SelfContBorysow: (model=" << model << ") parameter values in use:\n"
07800 << " XFAC = " << XFAC << "\n";
07801
07802 const Index n_p = p_abs.nelem();
07803 const Index n_f = f_mono.nelem();
07804
07805
07806 const Numeric AMAG2DEN = 44.53807;
07807 const Numeric RIDGAS = 8.314510;
07808
07809
07810 assert ( n_p==t_abs.nelem() );
07811 assert ( n_p==vmr.nelem() );
07812
07813
07814
07815 assert ( n_f==xsec.nrows() );
07816 assert ( n_p==xsec.ncols() );
07817
07818
07819 for ( Index i=0; i<n_p; ++i )
07820 {
07821
07822 double T = (double) t_abs[i];
07823
07824
07825
07826 Numeric XAMA = (p_abs[i]) / ( AMAG2DEN * RIDGAS * t_abs[i] );
07827 Numeric XAMA2 = pow(XAMA,(Numeric)2.);
07828
07829
07830
07831 for ( Index s=0; s<n_f; ++s )
07832 {
07833
07834
07835 double f = (double) f_mono[s];
07836
07837 double cont = n2n2tks_(T, f);
07838 xsec(s,i) += (Numeric) (cont * 1.000e2 * vmr[i] * XAMA2);
07839
07840
07841 }
07842 }
07843 return;
07844 }
07845
07846
07847
07848
07849
07850
07851
07852
07885 void MPM93_N2_continuum( MatrixView xsec,
07886 const Numeric Cin,
07887 const Numeric Gin,
07888 const Numeric xTin,
07889 const Numeric xfin,
07890 const String& model,
07891 ConstVectorView f_mono,
07892 ConstVectorView p_abs,
07893 ConstVectorView t_abs,
07894 ConstVectorView h2o_abs,
07895 ConstVectorView vmr )
07896 {
07897
07898
07899
07900
07901
07902 const Numeric xT_MPM93 = 3.500;
07903 const Numeric xf_MPM93 = 1.500;
07904 const Numeric gxf_MPM93 = 9.000*xf_MPM93;
07905 const Numeric S_MPM93 = 2.296e-31;
07906 const Numeric G_MPM93 = 1.930e-5*pow((Numeric)10.000, -gxf_MPM93);
07907
07908
07909
07910 Numeric S0, G0, xf, xT, gxf;
07911 if ( model == "MPM93" )
07912 {
07913 S0 = S_MPM93;
07914 G0 = G_MPM93;
07915 xT = xT_MPM93;
07916 xf = xf_MPM93;
07917 gxf = gxf_MPM93;
07918 }
07919 else if ( model == "MPM93Scale" )
07920 {
07921 S0 = Cin * S_MPM93;
07922 G0 = G_MPM93;
07923 xT = xT_MPM93;
07924 xf = xf_MPM93;
07925 gxf = gxf_MPM93;
07926 }
07927 else if ( model == "user" )
07928 {
07929 S0 = Cin;
07930 G0 = Gin;
07931 xT = xTin;
07932 xf = xfin;
07933 gxf = 9.000*xf;
07934 }
07935 else
07936 {
07937 ostringstream os;
07938 os << "N2-SelfContMPM93 : ERROR! Wrong model values given.\n"
07939 << "allowed models are: 'MPM93', 'MPM93Scale' or 'user'" << '\n';
07940 throw runtime_error(os.str());
07941 }
07942
07943 out3 << "N2-SelfContMPM93: (model=" << model << ") parameter values in use:\n"
07944 << " S0 = " << S0 << "\n"
07945 << " G0 = " << G0 << "\n"
07946 << " xT = " << xT << "\n"
07947 << " xf = " << xf << "\n";
07948
07949
07950
07951
07952
07953 const Index n_p = p_abs.nelem();
07954 const Index n_f = f_mono.nelem();
07955
07956
07957 assert ( n_p==t_abs.nelem() );
07958 assert ( n_p==vmr.nelem() );
07959
07960
07961
07962 assert ( n_f==xsec.nrows() );
07963 assert ( n_p==xsec.ncols() );
07964
07965 Numeric fac = 4.0 * PI / SPEED_OF_LIGHT;
07966
07967 for ( Index i=0; i<n_p; ++i )
07968 {
07969 Numeric th = 300.0 / t_abs[i];
07970 Numeric strength = S0 *
07971 pow( (p_abs[i] * ((Numeric)1.0000 - h2o_abs[i])),
07972 (Numeric)2. )
07973 * pow( th, xT );
07974
07975
07976 for ( Index s=0; s<n_f; ++s )
07977 {
07978
07979
07980
07981 xsec(s,i) += fac * strength *
07982 pow(f_mono[s], (Numeric)2.) /
07983 ( 1.000 + G0 * pow( f_mono[s], xf) ) *
07984 vmr[i];
07985 }
07986 }
07987 return;
07988 }
07989
07990
07991
08017 void Pardo_ATM_N2_dry_continuum( MatrixView xsec,
08018 const Numeric Cin,
08019 const String& model,
08020 ConstVectorView f_mono,
08021 ConstVectorView p_abs,
08022 ConstVectorView t_abs,
08023 ConstVectorView vmr,
08024 ConstVectorView h2ovmr )
08025 {
08026
08027
08028
08029 const Numeric C_ATM = 2.612e-6;
08030
08031
08032
08033 Numeric C;
08034 if ( model == "ATM" )
08035 {
08036 C = C_ATM;
08037 }
08038 else if ( model == "user" )
08039 {
08040 C = Cin;
08041 }
08042 else
08043 {
08044 ostringstream os;
08045 os << "N2-DryContATM01: ERROR! Wrong model values given.\n"
08046 << "allowed models are: 'ATM', 'user'" << '\n';
08047 throw runtime_error(os.str());
08048 }
08049 out3 << "N2-DryContATM01: (model=" << model << ") parameter values in use:\n"
08050 << " C_s = " << C << "\n";
08051
08052 const Index n_p = p_abs.nelem();
08053 const Index n_f = f_mono.nelem();
08054
08055
08056 assert ( n_p==t_abs.nelem() );
08057 assert ( n_p==vmr.nelem() );
08058
08059
08060
08061 assert ( n_f==xsec.nrows() );
08062 assert ( n_p==xsec.ncols() );
08063
08064
08065 for ( Index i=0; i<n_p; ++i )
08066 {
08067
08068
08069
08070
08071 Numeric pd = p_abs[i] * ( 1.00000e0 - h2ovmr[i] );
08072
08073 if (vmr[i] > VMRCalcLimit )
08074 {
08075 for ( Index s=0; s<n_f; ++s )
08076 {
08077
08078
08079
08080
08081 xsec(s,i) += C *
08082 pow( (f_mono[s]/(Numeric)2.25e11), (Numeric)2. ) *
08083 pow( ((Numeric)300.0/t_abs[i]), (Numeric)3.5 ) *
08084 pow( (pd/(Numeric)1.01300e5), (Numeric)2. ) /
08085 vmr[i];
08086 }
08087 }
08088 }
08089 }
08090
08091
08092
08119 void Rosenkranz_N2_self_continuum( MatrixView xsec,
08120 const Numeric Cin,
08121 const Numeric xin,
08122 const String& model,
08123 ConstVectorView f_mono,
08124 ConstVectorView p_abs,
08125 ConstVectorView t_abs,
08126 ConstVectorView vmr )
08127 {
08128
08129
08130
08131 const Numeric C_PWR = 1.05e-38;
08132 const Numeric x_PWR = 3.55;
08133
08134
08135
08136 Numeric C, x;
08137 if ( model == "Rosenkranz" )
08138 {
08139 C = C_PWR;
08140 x = x_PWR;
08141 }
08142 else if ( model == "user" )
08143 {
08144 C = Cin;
08145 x = xin;
08146 }
08147 else
08148 {
08149 ostringstream os;
08150 os << "N2-SelfContPWR93: ERROR! Wrong model values given.\n"
08151 << "allowed models are: 'Rosenkranz', 'user'" << '\n';
08152 throw runtime_error(os.str());
08153 }
08154 out3 << "N2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
08155 << " C_s = " << C << "\n"
08156 << " x_s = " << x << "\n";
08157
08158 const Index n_p = p_abs.nelem();
08159 const Index n_f = f_mono.nelem();
08160
08161
08162 assert ( n_p==t_abs.nelem() );
08163 assert ( n_p==vmr.nelem() );
08164
08165
08166
08167 assert ( n_f==xsec.nrows() );
08168 assert ( n_p==xsec.ncols() );
08169
08170
08171 for ( Index i=0; i<n_p; ++i )
08172 {
08173
08174 for ( Index s=0; s<n_f; ++s )
08175 {
08176
08177
08178 xsec(s,i) += C *
08179 pow( f_mono[s], (Numeric)2. ) *
08180 pow( (Numeric)300.0/t_abs[i], x ) *
08181 pow( p_abs[i], (Numeric)2. ) *
08182 vmr[i];
08183
08184 }
08185 }
08186 }
08187
08188
08189
08190
08191
08192
08222 void Standard_N2_self_continuum( MatrixView xsec,
08223 const Numeric Cin,
08224 const Numeric xfin,
08225 const Numeric xtin,
08226 const Numeric xpin,
08227 const String& model,
08228 ConstVectorView f_mono,
08229 ConstVectorView p_abs,
08230 ConstVectorView t_abs,
08231 ConstVectorView vmr )
08232 {
08233
08234
08235
08236
08237 const Numeric C_GM = 1.05e-38;
08238 const Numeric xf_GM = 2.00;
08239 const Numeric xt_GM = 3.55;
08240 const Numeric xp_GM = 2.00;
08241
08242
08243
08244 Numeric C, xt, xf, xp;
08245 if ( model == "Rosenkranz" )
08246 {
08247 C = C_GM;
08248 xt = xt_GM;
08249 xf = xf_GM;
08250 xp = xp_GM;
08251 }
08252 else if ( model == "user" )
08253 {
08254 C = Cin;
08255 xt = xtin;
08256 xf = xfin;
08257 xp = xpin;
08258 }
08259 else
08260 {
08261 ostringstream os;
08262 os << "N2-SelfContStandardType: ERROR! Wrong model values given.\n"
08263 << "allowed models are: 'Rosenkranz', 'user'" << '\n';
08264 throw runtime_error(os.str());
08265 }
08266 out3 << "N2-SelfContStandardType: (model=" << model << ") parameter values in use:\n"
08267 << " C = " << C << "\n"
08268 << " xt = " << xt << "\n"
08269 << " xf = " << xf << "\n"
08270 << " xp = " << xp << "\n";
08271
08272
08273 const Index n_p = p_abs.nelem();
08274 const Index n_f = f_mono.nelem();
08275
08276
08277 assert ( n_p==t_abs.nelem() );
08278 assert ( n_p==vmr.nelem() );
08279
08280
08281
08282 assert ( n_f==xsec.nrows() );
08283 assert ( n_p==xsec.ncols() );
08284
08285
08286 for ( Index i=0; i<n_p; ++i )
08287 {
08288
08289
08290 for ( Index s=0; s<n_f; ++s )
08291 {
08292
08293
08294 xsec(s,i) += C *
08295 pow( ((Numeric)300.00/t_abs[i]), xt ) *
08296 pow( f_mono[s], xf ) *
08297 pow( p_abs[i], xp ) *
08298 pow( vmr[i], (xp-(Numeric)1.) );
08299
08300 }
08301 }
08302 }
08303
08304
08305
08306
08307
08334 void Rosenkranz_CO2_self_continuum( MatrixView xsec,
08335 const Numeric Cin,
08336 const Numeric xin,
08337 const String& model,
08338 ConstVectorView f_mono,
08339 ConstVectorView p_abs,
08340 ConstVectorView t_abs,
08341 ConstVectorView vmr )
08342 {
08343
08344
08345
08346 const Numeric C_PWR = 7.43e-37;
08347 const Numeric x_PWR = 5.08;
08348
08349
08350
08351 Numeric C, x;
08352 if ( model == "Rosenkranz" )
08353 {
08354 C = C_PWR;
08355 x = x_PWR;
08356 }
08357 else if ( model == "user" )
08358 {
08359 C = Cin;
08360 x = xin;
08361 }
08362 else
08363 {
08364 ostringstream os;
08365 os << "CO2-SelfContPWR93 : ERROR! Wrong model values given.\n"
08366 << "allowed models are: 'Rosenkranz', 'user'" << "\n";
08367 throw runtime_error(os.str());
08368 }
08369
08370 out3 << "CO2-SelfContPWR93: (model=" << model << ") parameter values in use:\n"
08371 << " C = " << C << "\n"
08372 << " x = " << x << "\n";
08373
08374 const Index n_p = p_abs.nelem();
08375 const Index n_f = f_mono.nelem();
08376
08377
08378 assert ( n_p==t_abs.nelem() );
08379 assert ( n_p==vmr.nelem() );
08380
08381
08382
08383 assert ( n_f==xsec.nrows() );
08384 assert ( n_p==xsec.ncols() );
08385
08386
08387 for ( Index i=0; i<n_p; ++i )
08388 {
08389
08390
08391
08392 Numeric dummy =
08393 C * pow( (Numeric)300./t_abs[i], x ) * pow( p_abs[i], (Numeric)2. ) * vmr[i];
08394
08395
08396 for ( Index s=0; s<n_f; ++s )
08397 {
08398 xsec(s,i) += dummy * pow( f_mono[s], (Numeric)2. );
08399 }
08400 }
08401 }
08402
08403
08404
08433 void Rosenkranz_CO2_foreign_continuum( MatrixView xsec,
08434 const Numeric Cin,
08435 const Numeric xin,
08436 const String& model,
08437 ConstVectorView f_mono,
08438 ConstVectorView p_abs,
08439 ConstVectorView t_abs,
08440 ConstVectorView n2_abs,
08441 ConstVectorView vmr )
08442 {
08443
08444
08445
08446 const Numeric C_PWR = 2.71e-37;
08447 const Numeric x_PWR = 4.7;
08448
08449
08450
08451 Numeric C, x;
08452 if ( model == "Rosenkranz" )
08453 {
08454 C = C_PWR;
08455 x = x_PWR;
08456 }
08457 else if ( model == "user" )
08458 {
08459 C = Cin;
08460 x = xin;
08461 }
08462 else
08463 {
08464 ostringstream os;
08465 os << "CO2-ForeignContPWR93: ERROR! Wrong model values given.\n"
08466 << "allowed models are: 'Rosenkranz', 'user'" << "\n";
08467 throw runtime_error(os.str());
08468 }
08469
08470 out3 << "CO2-ForeignContPWR93: (model=" << model << ") parameter values in use:\n"
08471 << " C = " << C << "\n"
08472 << " x = " << x << "\n";
08473
08474 const Index n_p = p_abs.nelem();
08475 const Index n_f = f_mono.nelem();
08476
08477
08478 assert ( n_p==t_abs.nelem() );
08479 assert ( n_p==vmr.nelem() );
08480
08481
08482
08483 assert ( n_f==xsec.nrows() );
08484 assert ( n_p==xsec.ncols() );
08485
08486
08487 for ( Index i=0; i<n_p; ++i )
08488 {
08489
08490
08491
08492 Numeric dummy = C * pow( (Numeric)300./t_abs[i], x ) * p_abs[i] * p_abs[i] * n2_abs[i];
08493
08494
08495 for ( Index s=0; s<n_f; ++s )
08496 {
08497 xsec(s,i) += dummy * pow( f_mono[s], (Numeric)2. );
08498 }
08499 }
08500 }
08501
08502
08503
08504
08505
08538 void MPM93WaterDropletAbs( MatrixView xsec,
08539 const Numeric CCin,
08540 const Numeric CGin,
08541 const Numeric CEin,
08542 const String& model,
08543 ConstVectorView f_mono,
08544 ConstVectorView p_abs,
08545 ConstVectorView t_abs,
08546 ConstVectorView vmr)
08547 {
08548
08549
08550
08551
08552
08553
08554
08555 const Numeric CC_MPM93 = 1.00000;
08556 const Numeric CG_MPM93 = 1.00000;
08557 const Numeric CE_MPM93 = 1.00000;
08558
08559
08560
08561
08562 Numeric CC, CG, CE;
08563 if ( model == "MPM93" )
08564 {
08565 CC = CC_MPM93;
08566 CG = CG_MPM93;
08567 CE = CE_MPM93;
08568 }
08569 else if ( model == "user" )
08570 {
08571 CC = CCin;
08572 CG = CGin;
08573 CE = CEin;
08574 }
08575 else
08576 {
08577 ostringstream os;
08578 os << "liquidcloud-MPM93: ERROR! Wrong model values given.\n"
08579 << "Valid models are: 'MPM93' and 'user'" << '\n';
08580 throw runtime_error(os.str());
08581 }
08582 out3 << "liquidcloud-MPM93: (model=" << model << ") parameter values in use:\n"
08583 << " CC = " << CC << "\n"
08584 << " CG = " << CG << "\n"
08585 << " CE = " << CE << "\n";
08586
08587
08588 const Numeric m = 1.00e3;
08589 const Numeric low_lim_den = 0.000;
08590 const Numeric high_lim_den = 10.00e-3;
08591
08592 const Index n_p = p_abs.nelem();
08593 const Index n_f = f_mono.nelem();
08594
08595
08596 assert ( n_p==t_abs.nelem() );
08597 assert ( n_p==vmr.nelem() );
08598
08599
08600
08601 assert ( n_f==xsec.nrows() );
08602 assert ( n_p==xsec.ncols() );
08603
08604
08605 for ( Index i=0; i<n_p; ++i )
08606 {
08607
08608
08609
08610
08611
08612
08613
08614
08615 if ( (vmr[i] > low_lim_den) && (vmr[i] < high_lim_den) )
08616 {
08617
08618 Numeric theta = 300.000 / t_abs[i];
08619
08620 Numeric gamma1 = CG * 20.20 - 146.40*(theta-1.000) + 316.00*(theta-1.000)*(theta-1.000);
08621
08622 Numeric gamma2 = 39.80 * gamma1;
08623
08624 Numeric epsilon0 = CE * 103.30 * (theta-1.000) + 77.66;
08625 Numeric epsilon1 = 0.0671 * epsilon0;
08626 Numeric epsilon2 = 3.52;
08627
08628
08629 for ( Index s=0; s<n_f; ++s )
08630 {
08631
08632 Numeric Reepsilon = epsilon0 -
08633 pow((f_mono[s]*Hz_to_GHz),(Numeric)2.) *
08634 ( ((epsilon0-epsilon1)/
08635 (pow((f_mono[s]*Hz_to_GHz),(Numeric)2.)
08636 + pow(gamma1,(Numeric)2.))) +
08637 ((epsilon1-epsilon2)/
08638 (pow((f_mono[s]*Hz_to_GHz),(Numeric)2.)
08639 + pow(gamma2,(Numeric)2.))) );
08640
08641 Numeric Imepsilon = (f_mono[s]*Hz_to_GHz) *
08642 ( (gamma1*(epsilon0-epsilon1)/
08643 (pow((f_mono[s]*Hz_to_GHz),(Numeric)2.)
08644 + pow(gamma1,(Numeric)2.))) +
08645 (gamma2*(epsilon1-epsilon2)/
08646 (pow((f_mono[s]*Hz_to_GHz),(Numeric)2.)
08647 + pow(gamma2,(Numeric)2.))) );
08648
08649
08650
08651
08652
08653
08654
08655 Numeric ImNw = 1.500 / m *
08656 ( 3.000 * Imepsilon
08657 / ( pow((Reepsilon+(Numeric)2.000),(Numeric)2.)
08658 + pow(Imepsilon,(Numeric)2.) ) );
08659
08660
08661
08662
08663 xsec(s,i) += CC * 1.000e6 * dB_km_to_1_m * 0.1820 * (f_mono[s]*Hz_to_GHz) * ImNw;
08664 }
08665 } else
08666 {
08667 if ( (vmr[i] < low_lim_den) || (vmr[i] > high_lim_den) )
08668 {
08669 ostringstream os;
08670 os << "ERROR in MPM93WaterDropletAbs:\n"
08671 << " suspended water droplet density (valid range 0.00-10.00e-3 kg/m3):" << vmr[i] << "\n"
08672 << " ==> no calculation performed!\n";
08673 throw runtime_error(os.str());
08674 }
08675 }
08676 }
08677
08678 }
08679
08680
08681
08714 void MPM93IceCrystalAbs( MatrixView xsec,
08715 const Numeric CCin,
08716 const Numeric CAin,
08717 const Numeric CBin,
08718 const String& model,
08719 ConstVectorView f_mono,
08720 ConstVectorView p_abs,
08721 ConstVectorView t_abs,
08722 ConstVectorView vmr )
08723
08724 {
08725
08726
08727
08728
08729
08730
08731
08732 const Numeric CC_MPM93 = 1.00000;
08733 const Numeric CA_MPM93 = 1.00000;
08734 const Numeric CB_MPM93 = 1.00000;
08735
08736
08737
08738
08739 Numeric CC, CA, CB;
08740 if ( model == "MPM93" )
08741 {
08742 CC = CC_MPM93;
08743 CA = CA_MPM93;
08744 CB = CB_MPM93;
08745 }
08746 else if ( model == "user" )
08747 {
08748 CC = CCin;
08749 CA = CAin;
08750 CB = CBin;
08751 }
08752 else
08753 {
08754 ostringstream os;
08755 os << "icecloud-MPM93: ERROR! Wrong model values given.\n"
08756 << "Valid models are: 'MPM93' and 'user'" << '\n';
08757 throw runtime_error(os.str());
08758 }
08759 out3 << "icecloud-MPM93: (model=" << model << ") parameter values in use:\n"
08760 << " CC = " << CC << "\n"
08761 << " CA = " << CA << "\n"
08762 << " CB = " << CB << "\n";
08763
08764
08765 const Numeric m = 0.916e3;
08766 const Numeric low_lim_den = 0.000;
08767 const Numeric high_lim_den = 10.00e-3;
08768
08769 const Index n_p = p_abs.nelem();
08770 const Index n_f = f_mono.nelem();
08771
08772
08773 assert ( n_p==t_abs.nelem() );
08774 assert ( n_p==vmr.nelem() );
08775
08776
08777
08778 assert ( n_f==xsec.nrows() );
08779 assert ( n_p==xsec.ncols() );
08780
08781
08782
08783
08784 for ( Index i=0; i<n_p; ++i )
08785 {
08786
08787
08788
08789
08790
08791
08792
08793
08794 if ( (vmr[i] > low_lim_den) && (vmr[i] < high_lim_den) )
08795 {
08796
08797 Numeric theta = 300.000 / t_abs[i];
08798
08799 Numeric ai = CA * (62.000 * theta - 11.600) * exp(-22.100 * (theta-1.000)) * 1.000e-4;
08800
08801 Numeric bi = CB * 0.542e-6 *
08802 ( -24.17 + (116.79/theta)
08803 + pow((theta/(theta-(Numeric)0.9927)),(Numeric)2.) );
08804
08805
08806 for ( Index s=0; s<n_f; ++s )
08807 {
08808
08809 Numeric Reepsilon = 3.15;
08810
08811 Numeric Imepsilon = ( ( ai/(f_mono[s]*Hz_to_GHz) ) +
08812 ( bi*(f_mono[s]*Hz_to_GHz) ) );
08813
08814
08815
08816
08817
08818
08819
08820 Numeric ImNw = 1.500 / m *
08821 ( 3.000 * Imepsilon
08822 / ( pow((Reepsilon+(Numeric)2.000),(Numeric)2.)
08823 + pow(Imepsilon,(Numeric)2.) ) );
08824
08825
08826
08827
08828 xsec(s,i) += CC * 1.000e6 * dB_km_to_1_m * 0.1820 * (f_mono[s]*Hz_to_GHz) * ImNw;
08829 }
08830 } else
08831 {
08832 if ( (vmr[i] < low_lim_den) || (vmr[i] > high_lim_den) )
08833 {
08834 ostringstream os;
08835 os << "ERROR in MPM93IceCrystalAbs:\n"
08836 << " suspended ice particle density (valid range: 0-10.0e-3 kg/m3):" << vmr[i] << "\n"
08837 << " ==> no calculation performed!\n";
08838 throw runtime_error(os.str());
08839 }
08840 }
08841 }
08842 return;
08843 }
08844
08845
08846
08876 void MPM93RainExt( MatrixView xsec,
08877 const Numeric CEin,
08878 const Numeric CAin,
08879 const Numeric CBin,
08880 const String& model,
08881 ConstVectorView f_mono,
08882 ConstVectorView p_abs,
08883 ConstVectorView t_abs,
08884 ConstVectorView vmr)
08885 {
08886
08887
08888
08889
08890
08891
08892 const Numeric CE_MPM93 = 1.00000;
08893 const Numeric CA_MPM93 = 1.00000;
08894 const Numeric CB_MPM93 = 1.00000;
08895
08896
08897
08898
08899 Numeric CE, CA, CB;
08900 if ( model == "MPM93" )
08901 {
08902 CE = CE_MPM93;
08903 CA = CA_MPM93;
08904 CB = CB_MPM93;
08905 }
08906 else if ( model == "user" )
08907 {
08908 CE = CEin;
08909 CA = CAin;
08910 CB = CBin;
08911 }
08912 else
08913 {
08914 ostringstream os;
08915 os << "rain-MPM93: ERROR! Wrong model values given.\n"
08916 << "Valid models are: 'MPM93' and 'user'" << '\n';
08917 throw runtime_error(os.str());
08918 }
08919 out3 << "rain-MPM93: (model=" << model << ") parameter values in use:\n"
08920 << " CE = " << CE << "\n"
08921 << " CA = " << CA << "\n"
08922 << " CB = " << CB << "\n";
08923
08924
08925 const Numeric low_lim_rr = 0.000;
08926 const Numeric high_lim_rr = 150.000;
08927
08928 const Index n_p = p_abs.nelem();
08929 const Index n_f = f_mono.nelem();
08930
08931
08932 assert ( n_p==t_abs.nelem() );
08933 assert ( n_p==vmr.nelem() );
08934
08935
08936
08937 assert ( n_f==xsec.nrows() );
08938 assert ( n_p==xsec.ncols() );
08939
08940
08941 for ( Index i=0; i<n_p; ++i )
08942 {
08943
08944
08945
08946
08947
08948 Numeric Ga = 0.;
08949 Numeric Ea = 0.;
08950 Numeric Gb = 0.;
08951 Numeric Eb = 0.;
08952
08953
08954
08955
08956
08957 if ( (vmr[i] >= low_lim_rr) && (vmr[i] < high_lim_rr) )
08958 {
08959
08960 for ( Index s=0; s<n_f; ++s )
08961 {
08962
08963
08964
08965
08966 if ( vmr[i] <= 25 )
08967 {
08968
08969 if ( f_mono[s] <= 2.9e9 )
08970 {
08971 Ga = 6.39e-5;
08972 Ea = 2.03;
08973 }
08974 else if ( f_mono[s] <= 54.0e9 )
08975 {
08976 Ga = 4.21e-5;
08977 Ea = 2.42;
08978 }
08979 else if ( f_mono[s] <= 180e9 )
08980 {
08981 Ga = 4.09e-2;
08982 Ea = 0.699;
08983 }
08984 else if ( f_mono[s] <= 1000e9 )
08985 {
08986 Ga = 3.38;
08987 Ea = -0.151;
08988 }
08989 else
08990 {
08991 ostringstream os;
08992 os << "ERROR in MPM93RainExt:\n"
08993 << " frequency (valid range 0-1000 GHz):" << f_mono[s]*Hz_to_GHz << "\n"
08994 << " ==> no calculation performed!\n";
08995 throw runtime_error(os.str());
08996 }
08997
08998 if ( f_mono[s] <= 8.5e9 )
08999 {
09000 Gb = 0.851;
09001 Eb = 0.158;
09002 }
09003 else if ( f_mono[s] <= 25.0e9 )
09004 {
09005 Gb = 1.41;
09006 Eb = -0.0779;
09007 }
09008 else if ( f_mono[s] <= 164.0e9 )
09009 {
09010 Gb = 2.63;
09011 Eb = -0.272;
09012 }
09013 else if ( f_mono[s] <= 1000e9 )
09014 {
09015 Gb = 0.616;
09016 Eb = 0.0126;
09017 }
09018 else
09019 {
09020 ostringstream os;
09021 os << "ERROR in MPM93RainExt:\n"
09022 << " frequency (valid range 0-1000 GHz):" << f_mono[s]*Hz_to_GHz << "\n"
09023 << " ==> no calculation performed!\n";
09024 throw runtime_error(os.str());
09025 }
09026
09027 }
09028 else if (vmr[i] > 25)
09029 {
09030
09031 if ( f_mono[s] <= 4.9e9 )
09032 {
09033 Ga = 5.30e-5;
09034 Ea = 1.87;
09035 }
09036 else if ( f_mono[s] <= 10.7e9 )
09037 {
09038 Ga = 5.03e-6;
09039 Ea = 3.35;
09040 }
09041 else if ( f_mono[s] <= 40.1e9 )
09042 {
09043 Ga = 2.53e-5;
09044 Ea = 2.67;
09045 }
09046 else if ( f_mono[s] <= 59.1e9 )
09047 {
09048 Ga = 3.58e-3;
09049 Ea = 1.33;
09050 }
09051 else if ( f_mono[s] <= 100e9 )
09052 {
09053 Ga = 0.143;
09054 Ea = 0.422;
09055 }
09056 else
09057 {
09058 ostringstream os;
09059 os << "ERROR in MPM93RainExt:\n"
09060 << " frequency (valid range for rain rate > 25mm/h: 0-100 GHz):" << f_mono[s]*Hz_to_GHz << "\n"
09061 << " ==> no calculation performed!\n";
09062 throw runtime_error(os.str());
09063 }
09064
09065 if ( f_mono[s] <= 6.2e9 )
09066 {
09067 Gb = 0.911;
09068 Eb = 0.190;
09069 }
09070 else if ( f_mono[s] <= 23.8e9 )
09071 {
09072 Gb = 1.71;
09073 Eb = -0.156;
09074 }
09075 else if ( f_mono[s] <= 48.4e9 )
09076 {
09077 Gb = 3.08;
09078 Eb = -0.342;
09079 }
09080 else if ( f_mono[s] <= 68.2e9 )
09081 {
09082 Gb = 1.28;
09083 Eb = -0.116;
09084 }
09085 else if ( f_mono[s] <= 100e9 )
09086 {
09087 Gb = 0.932;
09088 Eb = -0.0408;
09089 }
09090 else
09091 {
09092 ostringstream os;
09093 os << "ERROR in MPM93RainExt:\n"
09094 << " frequency (valid range for rain rate > 25mm/h: 0-100 GHz):" << f_mono[s]*Hz_to_GHz << "\n"
09095 << " ==> no calculation performed!\n";
09096 throw runtime_error(os.str());
09097 }
09098 }
09099
09100 Numeric a_rain = Ga * pow((f_mono[s]*Hz_to_GHz),Ea);
09101
09102 Numeric b_rain = Gb * pow((f_mono[s]*Hz_to_GHz),Eb);
09103
09104
09105 Numeric ext_rain = CA * a_rain * pow(vmr[i],(CB*b_rain));
09106
09107
09108
09109
09110 xsec(s,i) += CE * dB_km_to_1_m * ext_rain / vmr[i];
09111 }
09112 } else
09113 {
09114 if ( (vmr[i] < low_lim_rr) || (vmr[i] > high_lim_rr) )
09115 {
09116 ostringstream os;
09117 os << "ERROR in MPM93RainExt:\n"
09118 << " rain rate (valid range 0.00-150.00 mm/h):" << vmr[i] << "\n"
09119 << " ==> no calculation performed!\n";
09120 throw runtime_error(os.str());
09121 }
09122 }
09123 }
09124
09125 }
09126
09127
09128
09129
09130
09151 Numeric MPMLineShapeFunction( const Numeric gamma,
09152 const Numeric fl,
09153 const Numeric f)
09154 {
09155
09156
09157
09158
09159
09160
09161
09162
09163
09164
09165
09166
09167
09168
09169
09170 double f_minus, f_plus ;
09171 double value;
09172
09173
09174 f_minus = 1.000 / ((f-fl)*(f-fl) + gamma*gamma);
09175
09176
09177 f_plus = 1.000 / ((f+fl)*(f+fl) + gamma*gamma);
09178
09179
09180 value = fabs(f/fl) * gamma * (f_minus + f_plus);
09181
09182 return value;
09183 }
09184
09185
09186
09208 Numeric MPMLineShapeO2Function( const Numeric gamma,
09209 const Numeric fl,
09210 const Numeric f,
09211 const Numeric delta)
09212 {
09213
09214
09215
09216
09217
09218
09219
09220
09221
09222
09223
09224
09225
09226
09227
09228
09229 double f_minus, f_plus ;
09230 double value;
09231
09232
09233 f_minus = (gamma - delta * (fl-f)) / ((fl-f)*(fl-f) + gamma*gamma);
09234
09235
09236 f_plus = (gamma - delta * (fl+f)) / ((fl+f)*(fl+f) + gamma*gamma);
09237
09238
09239 value = f * (f_minus + f_plus);
09240
09241 return value;
09242 }
09243
09244
09245
09268 Numeric WVSatPressureLiquidWater(const Numeric t)
09269 {
09270
09271
09272 if (t < 0.000)
09273 {
09274 ostringstream os;
09275 os << "In WVSatPressureLiquidWater:\n"
09276 << "temperature negative: T=" << t <<"K \n";
09277 throw runtime_error(os.str());
09278 }
09279
09280
09281
09282
09283
09284
09285
09286
09287
09288
09289
09290
09291 Numeric theta = 373.16 / t;
09292 Numeric exponent = ( -7.90298 * (theta-1.000) +
09293 5.02808 * log10(theta) -
09294 1.3816e-7 * ( pow( (Numeric)10.00,
09295 ((Numeric)11.344*
09296 ((Numeric)1.00-((Numeric)1.00
09297 /theta))) )
09298 - (Numeric)1.000 ) +
09299 8.1328e-3 * ( pow( (Numeric)10.00,
09300 ((Numeric)-3.49149
09301 *(theta-(Numeric)1.00)))
09302 - 1.000) +
09303 log10(1013.246) );
09304 Numeric es_MPM93 = 100.000 * pow((Numeric)10.00,exponent);
09305
09306 return es_MPM93;
09307 }
09308
09309
09310
09333 Numeric WVSatPressureIce(const Numeric t)
09334 {
09335
09336
09337 if (t < 0.000)
09338 {
09339 ostringstream os;
09340 os << "In WVSatPressureIce:\n"
09341 << "temperature negative: T=" << t <<"K \n";
09342 throw runtime_error(os.str());
09343 }
09344
09345
09346 Numeric theta = 273.16 / t;
09347 Numeric exponent = (-9.09718 * (theta-1.000) -
09348 3.56654 * log10(theta) +
09349 0.876793 * (1.000-(1.000/theta)) +
09350 log10(6.1071) );
09351
09352 Numeric es_MPM93 = 100.000 * pow((Numeric)10.00,exponent);
09353
09354 return es_MPM93;
09355 }
09356
09357
09358
09359
09360
09361
09392 void xsec_continuum_tag( MatrixView xsec,
09393 const String& name,
09394 ConstVectorView parameters,
09395 const String& model,
09396 ConstVectorView f_mono,
09397 ConstVectorView p_abs,
09398 ConstVectorView t_abs,
09399 ConstVectorView n2_abs,
09400 ConstVectorView h2o_abs,
09401 ConstVectorView vmr )
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
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( xsec,
09467 parameters[0],
09468 parameters[1],
09469 model,
09470 f_mono,
09471 p_abs,
09472 t_abs,
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 return;
09483 }
09484 else if ( (model != "user") && (parameters.nelem() == 0) )
09485 {
09486 out3 << "Continuum model " << name << " running with \n"
09487 << "the parameters for model " << model << ".\n";
09488 Standard_H2O_self_continuum( xsec,
09489 0.00,
09490 0.00,
09491 model,
09492 f_mono,
09493 p_abs,
09494 t_abs,
09495 vmr );
09496 }
09497 else if ( (model != "user") && (parameters.nelem() != 0) )
09498 {
09499 ostringstream os;
09500 os << "ERROR: Continuum model " << name << " requires NO input\n"
09501 << "parameters for the model " << model << ",\n"
09502 << "but you specified " << parameters.nelem() << " parameters.\n"
09503 << "This ambiguity can not be solved by arts.\n"
09504 << "Please see the arts user guide chapter 3.\n";
09505 throw runtime_error(os.str());
09506 return;
09507 }
09508 }
09509
09510 else if ( "H2O-ForeignContStandardType"==name )
09511 {
09512
09513
09514
09515
09516
09517
09518
09519
09520
09521
09522
09523
09524 const int Nparam = 2;
09525 if ( (model == "user") && (parameters.nelem() == Nparam) )
09526 {
09527 out3 << "Continuum model " << name << " is running with \n"
09528 << "user defined parameters according to model " << model << ".\n";
09529 Standard_H2O_foreign_continuum( xsec,
09530 parameters[0],
09531 parameters[1],
09532 model,
09533 f_mono,
09534 p_abs,
09535 t_abs,
09536 vmr );
09537 }
09538 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09539 {
09540 ostringstream os;
09541 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09542 << "parameters for the model " << model << ",\n"
09543 << "but you specified " << parameters.nelem() << " parameters.\n";
09544 throw runtime_error(os.str());
09545 return;
09546 }
09547 else if ( (model != "user") && (parameters.nelem() == 0) )
09548 {
09549 out3 << "Continuum model " << name << " running with \n"
09550 << "the parameters for model " << model << ".\n";
09551 Standard_H2O_foreign_continuum( xsec,
09552 0.00,
09553 0.00,
09554 model,
09555 f_mono,
09556 p_abs,
09557 t_abs,
09558 vmr );
09559 }
09560 else if ( (model != "user") && (parameters.nelem() != 0) )
09561 {
09562 ostringstream os;
09563 os << "ERROR: Continuum model " << name << " requires NO input\n"
09564 << "parameters for the model " << model << ",\n"
09565 << "but you specified " << parameters.nelem() << " parameters.\n"
09566 << "This ambiguity can not be solved by arts.\n"
09567 << "Please see the arts user guide chapter 3.\n";
09568 }
09569 }
09570
09571 else if ( "H2O-ForeignContMaTippingType"==name )
09572 {
09573
09574
09575
09576
09577
09578
09579
09580
09581
09582
09583
09584
09585 const int Nparam = 2;
09586 if ( (model == "user") && (parameters.nelem() == Nparam) )
09587 {
09588 out3 << "Continuum model " << name << " is running with \n"
09589 << "user defined parameters according to model " << model << ".\n";
09590 MaTipping_H2O_foreign_continuum( xsec,
09591 parameters[0],
09592 parameters[1],
09593 model,
09594 f_mono,
09595 p_abs,
09596 t_abs,
09597 vmr );
09598 }
09599 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09600 {
09601 ostringstream os;
09602 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09603 << "parameters for the model " << model << ",\n"
09604 << "but you specified " << parameters.nelem() << " parameters.\n";
09605 throw runtime_error(os.str());
09606 return;
09607 }
09608 else if ( (model != "user") && (parameters.nelem() == 0) )
09609 {
09610 out3 << "Continuum model " << name << " running with \n"
09611 << "the parameters for model " << model << ".\n";
09612 MaTipping_H2O_foreign_continuum( xsec,
09613 0.00,
09614 0.00,
09615 model,
09616 f_mono,
09617 p_abs,
09618 t_abs,
09619 vmr );
09620 }
09621 else if ( (model != "user") && (parameters.nelem() != 0) )
09622 {
09623 ostringstream os;
09624 os << "ERROR: Continuum model " << name << " requires NO input\n"
09625 << "parameters for the model " << model << ",\n"
09626 << "but you specified " << parameters.nelem() << " parameters.\n"
09627 << "This ambiguity can not be solved by arts.\n"
09628 << "Please see the arts user guide chapter 3.\n";
09629 }
09630 }
09631
09632 else if ( "H2O-ContMPM93"==name )
09633 {
09634
09635
09636
09637
09638
09639
09640
09641
09642
09643
09644
09645
09646
09647
09648
09649
09650
09651
09652
09653
09654 const int Nparam = 7;
09655 if ( (model == "user") && (parameters.nelem() == Nparam) )
09656 {
09657 out3 << "Continuum model " << name << " is running with \n"
09658 << "user defined parameters according to model " << model << ".\n";
09659 MPM93_H2O_continuum( xsec,
09660 parameters[0],
09661 parameters[1],
09662 parameters[2],
09663 parameters[3],
09664 parameters[4],
09665 parameters[5],
09666 parameters[6],
09667 model,
09668 f_mono,
09669 p_abs,
09670 t_abs,
09671 vmr );
09672 }
09673 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09674 {
09675 ostringstream os;
09676 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09677 << "parameters for the model " << model << ",\n"
09678 << "but you specified " << parameters.nelem() << " parameters.\n";
09679 throw runtime_error(os.str());
09680 return;
09681 }
09682 else if ( (model != "user") && (parameters.nelem() == 0) )
09683 {
09684 out3 << "Continuum model " << name << " running with \n"
09685 << "the parameters for model " << model << ".\n";
09686 MPM93_H2O_continuum( xsec,
09687 0.00,
09688 0.00,
09689 0.00,
09690 0.00,
09691 0.00,
09692 0.00,
09693 0.00,
09694 model,
09695 f_mono,
09696 p_abs,
09697 t_abs,
09698 vmr );
09699 }
09700 else if ( (model != "user") && (parameters.nelem() != 0) )
09701 {
09702 ostringstream os;
09703 os << "ERROR: Continuum model " << name << " requires NO input\n"
09704 << "parameters for the model " << model << ",\n"
09705 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
09706 << "This ambiguity can not be solved by arts.\n"
09707 << "Please see the arts user guide chapter 3.\n";
09708 throw runtime_error(os.str());
09709 return;
09710 }
09711 }
09712
09713 else if ( "H2O-ForeignContATM01"==name )
09714 {
09715
09716
09717
09718
09719
09720
09721
09722
09723
09724
09725
09726
09727
09728
09729
09730 const int Nparam = 1;
09731 if ( (model == "user") && (parameters.nelem() == Nparam) )
09732 {
09733 out3 << "Continuum model " << name << " is running with \n"
09734 << "user defined parameters according to model " << model << ".\n";
09735 Pardo_ATM_H2O_ForeignContinuum( xsec,
09736 parameters[0],
09737 model,
09738 f_mono,
09739 p_abs,
09740 t_abs,
09741 vmr );
09742 }
09743 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09744 {
09745 ostringstream os;
09746 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09747 << "parameters for the model " << model << ",\n"
09748 << "but you specified " << parameters.nelem() << " parameters.\n";
09749 throw runtime_error(os.str());
09750 return;
09751 }
09752 else if ( (model != "user") && (parameters.nelem() == 0) )
09753 {
09754 out3 << "Continuum model " << name << " running with \n"
09755 << "the parameters for model " << model << ".\n";
09756 Pardo_ATM_H2O_ForeignContinuum( xsec,
09757 0.000,
09758 model,
09759 f_mono,
09760 p_abs,
09761 t_abs,
09762 vmr );
09763 }
09764 else if ( (model != "user") && (parameters.nelem() != 0) )
09765 {
09766 ostringstream os;
09767 os << "ERROR: Continuum model " << name << " requires NO input\n"
09768 << "parameters for the model " << model << ",\n"
09769 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
09770 << "This ambiguity can not be solved by arts.\n"
09771 << "Please see the arts user guide chapter 3.\n";
09772 throw runtime_error(os.str());
09773 return;
09774 }
09775 }
09776
09777 else if ( "H2O-SelfContCKD222"==name )
09778 {
09779
09780
09781
09782
09783
09784
09785
09786
09787
09788
09789
09790
09791
09792
09793
09794 const int Nparam = 1;
09795 if ( (model == "user") && (parameters.nelem() == Nparam) )
09796 {
09797 out3 << "Continuum model " << name << " is running with \n"
09798 << "user defined parameters according to model " << model << ".\n";
09799 CKD_222_self_h2o( xsec,
09800 parameters[0],
09801 model,
09802 f_mono,
09803 p_abs,
09804 t_abs,
09805 vmr,
09806 n2_abs );
09807 }
09808 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09809 {
09810 ostringstream os;
09811 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09812 << "parameters for the model " << model << ",\n"
09813 << "but you specified " << parameters.nelem() << " parameters.\n";
09814 throw runtime_error(os.str());
09815 return;
09816 }
09817 else if ( (model != "user") && (parameters.nelem() == 0) )
09818 {
09819 out3 << "Continuum model " << name << " running with \n"
09820 << "the parameters for model " << model << ".\n";
09821 CKD_222_self_h2o( xsec,
09822 0.000,
09823 model,
09824 f_mono,
09825 p_abs,
09826 t_abs,
09827 vmr,
09828 n2_abs );
09829 }
09830 else if ( (model != "user") && (parameters.nelem() != 0) )
09831 {
09832 ostringstream os;
09833 os << "ERROR: continuum model " << name << " requires NO input\n"
09834 << "parameters for the model " << model << ",\n"
09835 << "but you specified " << parameters.nelem() << " parameters.\n"
09836 << "This ambiguity can not be solved by arts.\n"
09837 << "Please see the arts user guide chapter 3.\n";
09838 throw runtime_error(os.str());
09839 }
09840 }
09841
09842 else if ( "H2O-ForeignContCKD222"==name )
09843 {
09844
09845
09846
09847
09848
09849
09850
09851
09852
09853
09854
09855
09856
09857
09858
09859 const int Nparam = 1;
09860 if ( (model == "user") && (parameters.nelem() == Nparam) )
09861 {
09862 out3 << "Continuum model " << name << " is running with \n"
09863 << "user defined parameters according to model " << model << ".\n";
09864 CKD_222_foreign_h2o( xsec,
09865 parameters[0],
09866 model,
09867 f_mono,
09868 p_abs,
09869 t_abs,
09870 vmr,
09871 n2_abs );
09872 }
09873 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09874 {
09875 ostringstream os;
09876 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09877 << "parameters for the model " << model << ",\n"
09878 << "but you specified " << parameters.nelem() << " parameters.\n";
09879 throw runtime_error(os.str());
09880 return;
09881 }
09882 else if ( (model != "user") && (parameters.nelem() == 0) )
09883 {
09884 out3 << "Continuum model " << name << " running with \n"
09885 << "the parameters for model " << model << ".\n";
09886 CKD_222_foreign_h2o( xsec,
09887 0.000,
09888 model,
09889 f_mono,
09890 p_abs,
09891 t_abs,
09892 vmr,
09893 n2_abs );
09894 }
09895 else if ( (model != "user") && (parameters.nelem() != 0) )
09896 {
09897 ostringstream os;
09898 os << "ERROR: continuum model " << name << " requires NO input\n"
09899 << "parameters for the model " << model << ",\n"
09900 << "but you specified " << parameters.nelem() << " parameters.\n"
09901 << "This ambiguity can not be solved by arts.\n"
09902 << "Please see the arts user guide chapter 3.\n";
09903 throw runtime_error(os.str());
09904 }
09905 }
09906
09907 else if ( "H2O-SelfContCKD242"==name )
09908 {
09909
09910
09911
09912
09913
09914
09915
09916
09917
09918
09919
09920
09921
09922
09923
09924 const int Nparam = 1;
09925 if ( (model == "user") && (parameters.nelem() == Nparam) )
09926 {
09927 out3 << "Continuum model " << name << " is running with \n"
09928 << "user defined parameters according to model " << model << ".\n";
09929 CKD_242_self_h2o( xsec,
09930 parameters[0],
09931 model,
09932 f_mono,
09933 p_abs,
09934 t_abs,
09935 vmr,
09936 n2_abs );
09937 }
09938 else if ( (model == "user") && (parameters.nelem() != Nparam) )
09939 {
09940 ostringstream os;
09941 os << "Continuum model " << name << " requires " << Nparam << " input\n"
09942 << "parameters for the model " << model << ",\n"
09943 << "but you specified " << parameters.nelem() << " parameters.\n";
09944 throw runtime_error(os.str());
09945 return;
09946 }
09947 else if ( (model != "user") && (parameters.nelem() == 0) )
09948 {
09949 out3 << "Continuum model " << name << " running with \n"
09950 << "the parameters for model " << model << ".\n";
09951 CKD_242_self_h2o( xsec,
09952 0.000,
09953 model,
09954 f_mono,
09955 p_abs,
09956 t_abs,
09957 vmr,
09958 n2_abs );
09959 }
09960 else if ( (model != "user") && (parameters.nelem() != 0) )
09961 {
09962 ostringstream os;
09963 os << "ERROR: continuum model " << name << " requires NO input\n"
09964 << "parameters for the model " << model << ",\n"
09965 << "but you specified " << parameters.nelem() << " parameters.\n"
09966 << "This ambiguity can not be solved by arts.\n"
09967 << "Please see the arts user guide chapter 3.\n";
09968 throw runtime_error(os.str());
09969 }
09970 }
09971
09972 else if ( "H2O-ForeignContCKD242"==name )
09973 {
09974
09975
09976
09977
09978
09979
09980
09981
09982
09983
09984
09985
09986
09987
09988
09989 const int Nparam = 1;
09990 if ( (model == "user") && (parameters.nelem() == Nparam) )
09991 {
09992 out3 << "Continuum model " << name << " is running with \n"
09993 << "user defined parameters according to model " << model << ".\n";
09994 CKD_242_foreign_h2o( xsec,
09995 parameters[0],
09996 model,
09997 f_mono,
09998 p_abs,
09999 t_abs,
10000 vmr,
10001 n2_abs );
10002 }
10003 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10004 {
10005 ostringstream os;
10006 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10007 << "parameters for the model " << model << ",\n"
10008 << "but you specified " << parameters.nelem() << " parameters.\n";
10009 throw runtime_error(os.str());
10010 return;
10011 }
10012 else if ( (model != "user") && (parameters.nelem() == 0) )
10013 {
10014 out3 << "Continuum model " << name << " running with \n"
10015 << "the parameters for model " << model << ".\n";
10016 CKD_242_foreign_h2o( xsec,
10017 0.000,
10018 model,
10019 f_mono,
10020 p_abs,
10021 t_abs,
10022 vmr,
10023 n2_abs );
10024 }
10025 else if ( (model != "user") && (parameters.nelem() != 0) )
10026 {
10027 ostringstream os;
10028 os << "ERROR: continuum model " << name << " requires NO input\n"
10029 << "parameters for the model " << model << ",\n"
10030 << "but you specified " << parameters.nelem() << " parameters.\n"
10031 << "This ambiguity can not be solved by arts.\n"
10032 << "Please see the arts user guide chapter 3.\n";
10033 throw runtime_error(os.str());
10034 }
10035 }
10036
10037 else if ( "H2O-SelfContCKDMT100"==name )
10038 {
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054 const int Nparam = 1;
10055 if ( (model == "user") && (parameters.nelem() == Nparam) )
10056 {
10057 out3 << "Continuum model " << name << " is running with \n"
10058 << "user defined parameters according to model " << model << ".\n";
10059 CKD_mt_100_self_h2o( xsec,
10060 parameters[0],
10061 model,
10062 f_mono,
10063 p_abs,
10064 t_abs,
10065 vmr,
10066 n2_abs );
10067 }
10068 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10069 {
10070 ostringstream os;
10071 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10072 << "parameters for the model " << model << ",\n"
10073 << "but you specified " << parameters.nelem() << " parameters.\n";
10074 throw runtime_error(os.str());
10075 return;
10076 }
10077 else if ( (model != "user") && (parameters.nelem() == 0) )
10078 {
10079 out3 << "Continuum model " << name << " running with \n"
10080 << "the parameters for model " << model << ".\n";
10081 CKD_mt_100_self_h2o( xsec,
10082 0.000,
10083 model,
10084 f_mono,
10085 p_abs,
10086 t_abs,
10087 vmr,
10088 n2_abs );
10089 }
10090 else if ( (model != "user") && (parameters.nelem() != 0) )
10091 {
10092 ostringstream os;
10093 os << "ERROR: continuum model " << name << " requires NO input\n"
10094 << "parameters for the model " << model << ",\n"
10095 << "but you specified " << parameters.nelem() << " parameters.\n"
10096 << "This ambiguity can not be solved by arts.\n"
10097 << "Please see the arts user guide chapter 3.\n";
10098 throw runtime_error(os.str());
10099 }
10100 }
10101
10102 else if ( "H2O-ForeignContCKDMT100"==name )
10103 {
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119 const int Nparam = 1;
10120 if ( (model == "user") && (parameters.nelem() == Nparam) )
10121 {
10122 out3 << "Continuum model " << name << " is running with \n"
10123 << "user defined parameters according to model " << model << ".\n";
10124 CKD_mt_100_foreign_h2o( xsec,
10125 parameters[0],
10126 model,
10127 f_mono,
10128 p_abs,
10129 t_abs,
10130 vmr,
10131 n2_abs );
10132 }
10133 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10134 {
10135 ostringstream os;
10136 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10137 << "parameters for the model " << model << ",\n"
10138 << "but you specified " << parameters.nelem() << " parameters.\n";
10139 throw runtime_error(os.str());
10140 return;
10141 }
10142 else if ( (model != "user") && (parameters.nelem() == 0) )
10143 {
10144 out3 << "Continuum model " << name << " running with \n"
10145 << "the parameters for model " << model << ".\n";
10146 CKD_mt_100_foreign_h2o( xsec,
10147 0.000,
10148 model,
10149 f_mono,
10150 p_abs,
10151 t_abs,
10152 vmr,
10153 n2_abs );
10154 }
10155 else if ( (model != "user") && (parameters.nelem() != 0) )
10156 {
10157 ostringstream os;
10158 os << "ERROR: continuum model " << name << " requires NO input\n"
10159 << "parameters for the model " << model << ",\n"
10160 << "but you specified " << parameters.nelem() << " parameters.\n"
10161 << "This ambiguity can not be solved by arts.\n"
10162 << "Please see the arts user guide chapter 3.\n";
10163 throw runtime_error(os.str());
10164 }
10165 }
10166
10167 else if ( "H2O-SelfContCKD24"==name )
10168 {
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184 const int Nparam = 1;
10185 if ( (model == "user") && (parameters.nelem() == Nparam) )
10186 {
10187 out3 << "Continuum model " << name << " is running with \n"
10188 << "user defined parameters according to model " << model << ".\n";
10189 CKD24_H20( xsec,
10190 0,
10191 parameters[0],
10192 model,
10193 f_mono,
10194 p_abs,
10195 t_abs,
10196 vmr,
10197 n2_abs );
10198 }
10199 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10200 {
10201 ostringstream os;
10202 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10203 << "parameters for the model " << model << ",\n"
10204 << "but you specified " << parameters.nelem() << " parameters.\n";
10205 throw runtime_error(os.str());
10206 return;
10207 }
10208 else if ( (model != "user") && (parameters.nelem() == 0) )
10209 {
10210 out3 << "Continuum model " << name << " running with \n"
10211 << "the parameters for model " << model << ".\n";
10212 CKD24_H20( xsec,
10213 0,
10214 0.000,
10215 model,
10216 f_mono,
10217 p_abs,
10218 t_abs,
10219 vmr,
10220 n2_abs );
10221 }
10222 else if ( (model != "user") && (parameters.nelem() != 0) )
10223 {
10224 ostringstream os;
10225 os << "ERROR: continuum model " << name << " requires NO input\n"
10226 << "parameters for the model " << model << ",\n"
10227 << "but you specified " << parameters.nelem() << " parameters.\n"
10228 << "This ambiguity can not be solved by arts.\n"
10229 << "Please see the arts user guide chapter 3.\n";
10230 throw runtime_error(os.str());
10231 }
10232 }
10233
10234 else if ( "H2O-ForeignContCKD24"==name )
10235 {
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251 const int Nparam = 1;
10252 if ( (model == "user") && (parameters.nelem() == Nparam) )
10253 {
10254 out3 << "Continuum model " << name << " is running with \n"
10255 << "user defined parameters according to model " << model << ".\n";
10256 CKD24_H20( xsec,
10257 1,
10258 parameters[0],
10259 model,
10260 f_mono,
10261 p_abs,
10262 t_abs,
10263 vmr,
10264 n2_abs );
10265 }
10266 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10267 {
10268 ostringstream os;
10269 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10270 << "parameters for the model " << model << ",\n"
10271 << "but you specified " << parameters.nelem() << " parameters.\n";
10272 throw runtime_error(os.str());
10273 return;
10274 }
10275 else if ( (model != "user") && (parameters.nelem() == 0) )
10276 {
10277 out3 << "Continuum model " << name << " running with \n"
10278 << "the parameters for model " << model << ".\n";
10279 CKD24_H20( xsec,
10280 1,
10281 0,
10282 model,
10283 f_mono,
10284 p_abs,
10285 t_abs,
10286 vmr,
10287 n2_abs );
10288 }
10289 else if ( (model != "user") && (parameters.nelem() != 0) )
10290 {
10291 ostringstream os;
10292 os << "ERROR: continuum model " << name << " requires NO input\n"
10293 << "parameters for the model " << model << ",\n"
10294 << "but you specified " << parameters.nelem() << " parameters.\n"
10295 << "This ambiguity can not be solved by arts.\n"
10296 << "Please see the arts user guide chapter 3.\n";
10297 throw runtime_error(os.str());
10298 }
10299 }
10300
10301 else if ( "H2O-CP98"==name )
10302 {
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316 const int Nparam = 3;
10317 if ( (model == "user") && (parameters.nelem() == Nparam) )
10318 {
10319 out3 << "Full model " << name << " is running with \n"
10320 << "user defined parameters according to model " << model << ".\n";
10321 CP98H2OAbsModel( xsec,
10322 parameters[0],
10323 parameters[1],
10324 parameters[2],
10325 model,
10326 f_mono,
10327 p_abs,
10328 t_abs,
10329 vmr );
10330 }
10331 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10332 {
10333 ostringstream os;
10334 os << "Full model " << name << " requires " << Nparam << " input\n"
10335 << "parameters for the model " << model << ",\n"
10336 << "but you specified " << parameters.nelem() << " parameters.\n";
10337 throw runtime_error(os.str());
10338 return;
10339 }
10340 else if ( (model != "user") && (parameters.nelem() == 0) )
10341 {
10342 out3 << "Full model " << name << " running with \n"
10343 << "the parameters for model " << model << ".\n";
10344 CP98H2OAbsModel( xsec,
10345 0.00,
10346 0.00,
10347 0.00,
10348 model,
10349 f_mono,
10350 p_abs,
10351 t_abs,
10352 vmr );
10353 }
10354 else if ( (model != "user") && (parameters.nelem() != 0) )
10355 {
10356 ostringstream os;
10357 os << "ERROR: Full model " << name << " requires NO input\n"
10358 << "parameters for the model " << model << ",\n"
10359 << "but you specified " << parameters.nelem() << " parameters.\n"
10360 << "This ambiguity can not be solved by arts.\n"
10361 << "Please see the arts user guide chapter 3.\n";
10362 throw runtime_error(os.str());
10363 }
10364 }
10365
10366 else if ( "H2O-MPM87"==name )
10367 {
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381 const int Nparam = 3;
10382 if ( (model == "user") && (parameters.nelem() == Nparam) )
10383 {
10384 out3 << "Full model " << name << " is running with \n"
10385 << "user defined parameters according to model " << model << ".\n";
10386 MPM87H2OAbsModel( xsec,
10387 parameters[0],
10388 parameters[1],
10389 parameters[2],
10390 model,
10391 f_mono,
10392 p_abs,
10393 t_abs,
10394 vmr );
10395 }
10396 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10397 {
10398 ostringstream os;
10399 os << "Full model " << name << " requires " << Nparam << " input\n"
10400 << "parameters for the model " << model << ",\n"
10401 << "but you specified " << parameters.nelem() << " parameters.\n";
10402 throw runtime_error(os.str());
10403 return;
10404 }
10405 else if ( (model != "user") && (parameters.nelem() == 0) )
10406 {
10407 out3 << "Full model " << name << " running with \n"
10408 << "the parameters for model " << model << ".\n";
10409 MPM87H2OAbsModel( xsec,
10410 0.00,
10411 0.00,
10412 0.00,
10413 model,
10414 f_mono,
10415 p_abs,
10416 t_abs,
10417 vmr );
10418 }
10419 else if ( (model != "user") && (parameters.nelem() != 0) )
10420 {
10421 ostringstream os;
10422 os << "ERROR: Full model " << name << " requires NO input\n"
10423 << "parameters for the model " << model << ",\n"
10424 << "but you specified " << parameters.nelem() << " parameters.\n"
10425 << "This ambiguity can not be solved by arts.\n"
10426 << "Please see the arts user guide chapter 3.\n";
10427 throw runtime_error(os.str());
10428 return;
10429 }
10430 }
10431
10432 else if ( "H2O-MPM89"==name )
10433 {
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447 const int Nparam = 3;
10448 if ( (model == "user") && (parameters.nelem() == Nparam) )
10449 {
10450 out3 << "Full model " << name << " is running with \n"
10451 << "user defined parameters according to model " << model << ".\n";
10452 MPM89H2OAbsModel( xsec,
10453 parameters[0],
10454 parameters[1],
10455 parameters[2],
10456 model,
10457 f_mono,
10458 p_abs,
10459 t_abs,
10460 vmr );
10461 }
10462 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10463 {
10464 ostringstream os;
10465 os << "Full model " << name << " requires " << Nparam << " input\n"
10466 << "parameters for the model " << model << ",\n"
10467 << "but you specified " << parameters.nelem() << " parameters.\n";
10468 throw runtime_error(os.str());
10469 return;
10470 }
10471 else if ( (model != "user") && (parameters.nelem() == 0) )
10472 {
10473 out3 << "Full model " << name << " running with \n"
10474 << "the parameters for model " << model << ".\n";
10475 MPM89H2OAbsModel( xsec,
10476 0.00,
10477 0.00,
10478 0.00,
10479 model,
10480 f_mono,
10481 p_abs,
10482 t_abs,
10483 vmr );
10484 }
10485 else if ( (model != "user") && (parameters.nelem() != 0) )
10486 {
10487 ostringstream os;
10488 os << "ERROR: Full model " << name << " requires NO input\n"
10489 << "parameters for the model " << model << ",\n"
10490 << "but you specified " << parameters.nelem() << " parameters.\n"
10491 << "This ambiguity can not be solved by arts.\n"
10492 << "Please see the arts user guide chapter 3.\n";
10493 throw runtime_error(os.str());
10494 return;
10495 }
10496 }
10497
10498 else if ( "H2O-MPM93"==name )
10499 {
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513 const int Nparam = 3;
10514 if ( (model == "user") && (parameters.nelem() == Nparam) )
10515 {
10516 out3 << "Full model " << name << " is running with \n"
10517 << "user defined parameters according to model " << model << ".\n";
10518 MPM93H2OAbsModel( xsec,
10519 parameters[0],
10520 parameters[1],
10521 parameters[2],
10522 model,
10523 f_mono,
10524 p_abs,
10525 t_abs,
10526 vmr );
10527 }
10528 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10529 {
10530 ostringstream os;
10531 os << "Full model " << name << " requires " << Nparam << " input\n"
10532 << "parameters for the model " << model << ",\n"
10533 << "but you specified " << parameters.nelem() << " parameters.\n";
10534 throw runtime_error(os.str());
10535 return;
10536 }
10537 else if ( (model != "user") && (parameters.nelem() == 0) )
10538 {
10539 out3 << "Full model " << name << " running with \n"
10540 << "the parameters for model " << model << ".\n";
10541 MPM93H2OAbsModel( xsec,
10542 0.00,
10543 0.00,
10544 0.00,
10545 model,
10546 f_mono,
10547 p_abs,
10548 t_abs,
10549 vmr );
10550 }
10551 else if ( (model != "user") && (parameters.nelem() != 0) )
10552 {
10553 ostringstream os;
10554 os << "ERROR: Full model " << name << " requires NO input\n"
10555 << "parameters for the model " << model << ",\n"
10556 << "but you specified " << parameters.nelem() << " parameters.\n"
10557 << "This ambiguity can not be solved by arts.\n"
10558 << "Please see the arts user guide chapter 3.\n";
10559 throw runtime_error(os.str());
10560 return;
10561 }
10562 }
10563
10564 else if ( "H2O-PWR98"==name )
10565 {
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578 const int Nparam = 3;
10579 if ( (model == "user") && (parameters.nelem() == Nparam) )
10580 {
10581 out3 << "Full model " << name << " is running with \n"
10582 << "user defined parameters according to model " << model << ".\n";
10583 PWR98H2OAbsModel( xsec,
10584 parameters[0],
10585 parameters[1],
10586 parameters[2],
10587 model,
10588 f_mono,
10589 p_abs,
10590 t_abs,
10591 vmr );
10592 }
10593 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10594 {
10595 ostringstream os;
10596 os << "Full model " << name << " requires " << Nparam << " input\n"
10597 << "parameters for the model " << model << ",\n"
10598 << "but you specified " << parameters.nelem() << " parameters.\n";
10599 throw runtime_error(os.str());
10600 return;
10601 }
10602 else if ( (model != "user") && (parameters.nelem() == 0) )
10603 {
10604 out3 << "Full model " << name << " running with \n"
10605 << "the parameters for model " << model << ".\n";
10606 PWR98H2OAbsModel( xsec,
10607 0.00,
10608 0.00,
10609 0.00,
10610 model,
10611 f_mono,
10612 p_abs,
10613 t_abs,
10614 vmr );
10615 }
10616 else if ( (model != "user") && (parameters.nelem() != 0) )
10617 {
10618 ostringstream os;
10619 os << "ERROR: Full model " << name << " requires NO input\n"
10620 << "parameters for the model " << model << ",\n"
10621 << "but you specified " << parameters.nelem() << " parameters.\n"
10622 << "This ambiguity can not be solved by arts.\n"
10623 << "Please see the arts user guide chapter 3.\n";
10624 throw runtime_error(os.str());
10625 return;
10626 }
10627 }
10628
10629 else if ( "O2-CIAfunCKDMT100"==name )
10630 {
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650 const int Nparam = 1;
10651 if ( (model == "user") && (parameters.nelem() == Nparam) )
10652 {
10653 out3 << "Continuum model " << name << " is running with \n"
10654 << "user defined parameters according to model " << model << ".\n";
10655 CKD_mt_CIAfun_o2( xsec,
10656 parameters[0],
10657 model,
10658 f_mono,
10659 p_abs,
10660 t_abs,
10661 vmr );
10662 }
10663 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10664 {
10665 ostringstream os;
10666 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10667 << "parameters for the model " << model << ",\n"
10668 << "but you specified " << parameters.nelem() << " parameters.\n";
10669 throw runtime_error(os.str());
10670 return;
10671 }
10672 else if ( (model != "user") && (parameters.nelem() == 0) )
10673 {
10674 out3 << "Continuum model " << name << " running with \n"
10675 << "the parameters for model " << model << ".\n";
10676 CKD_mt_CIAfun_o2( xsec,
10677 0.00e0,
10678 model,
10679 f_mono,
10680 p_abs,
10681 t_abs,
10682 vmr );
10683 }
10684 else if ( (model != "user") && (parameters.nelem() != 0) )
10685 {
10686 ostringstream os;
10687 os << "ERROR: Continuum model " << name << " requires NO input\n"
10688 << "parameters for the model " << model << ",\n"
10689 << "but you specified " << parameters.nelem() << " parameters.\n"
10690 << "This ambiguity can not be solved by arts.\n"
10691 << "Please see the arts user guide chapter 3.\n";
10692 throw runtime_error(os.str());
10693 return;
10694 }
10695 }
10696
10697 else if ( "O2-v0v0CKDMT100"==name )
10698 {
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718 const int Nparam = 1;
10719 if ( (model == "user") && (parameters.nelem() == Nparam) )
10720 {
10721 out3 << "Continuum model " << name << " is running with \n"
10722 << "user defined parameters according to model " << model << ".\n";
10723 CKD_mt_v0v0_o2( xsec,
10724 parameters[0],
10725 model,
10726 f_mono,
10727 p_abs,
10728 t_abs,
10729 vmr,
10730 n2_abs );
10731 }
10732 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10733 {
10734 ostringstream os;
10735 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10736 << "parameters for the model " << model << ",\n"
10737 << "but you specified " << parameters.nelem() << " parameters.\n";
10738 throw runtime_error(os.str());
10739 return;
10740 }
10741 else if ( (model != "user") && (parameters.nelem() == 0) )
10742 {
10743 out3 << "Continuum model " << name << " running with \n"
10744 << "the parameters for model " << model << ".\n";
10745 CKD_mt_v0v0_o2( xsec,
10746 0.0e0,
10747 model,
10748 f_mono,
10749 p_abs,
10750 t_abs,
10751 vmr,
10752 n2_abs );
10753 }
10754 else if ( (model != "user") && (parameters.nelem() != 0) )
10755 {
10756 ostringstream os;
10757 os << "ERROR: Continuum model " << name << " requires NO input\n"
10758 << "parameters for the model " << model << ",\n"
10759 << "but you specified " << parameters.nelem() << " parameters.\n"
10760 << "This ambiguity can not be solved by arts.\n"
10761 << "Please see the arts user guide chapter 3.\n";
10762 throw runtime_error(os.str());
10763 return;
10764 }
10765 }
10766
10767 else if ( "O2-v1v0CKDMT100"==name )
10768 {
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787 const int Nparam = 1;
10788 if ( (model == "user") && (parameters.nelem() == Nparam) )
10789 {
10790 out3 << "Continuum model " << name << " is running with \n"
10791 << "user defined parameters according to model " << model << ".\n";
10792 CKD_mt_v1v0_o2( xsec,
10793 parameters[0],
10794 model,
10795 f_mono,
10796 p_abs,
10797 t_abs,
10798 vmr );
10799 }
10800 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10801 {
10802 ostringstream os;
10803 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10804 << "parameters for the model " << model << ",\n"
10805 << "but you specified " << parameters.nelem() << " parameters.\n";
10806 throw runtime_error(os.str());
10807 return;
10808 }
10809 else if ( (model != "user") && (parameters.nelem() == 0) )
10810 {
10811 out3 << "Continuum model " << name << " running with \n"
10812 << "the parameters for model " << model << ".\n";
10813 CKD_mt_v1v0_o2( xsec,
10814 0.0e0,
10815 model,
10816 f_mono,
10817 p_abs,
10818 t_abs,
10819 vmr );
10820 }
10821 else if ( (model != "user") && (parameters.nelem() != 0) )
10822 {
10823 ostringstream os;
10824 os << "ERROR: Continuum model " << name << " requires NO input\n"
10825 << "parameters for the model " << model << ",\n"
10826 << "but you specified " << parameters.nelem() << " parameters.\n"
10827 << "This ambiguity can not be solved by arts.\n"
10828 << "Please see the arts user guide chapter 3.\n";
10829 throw runtime_error(os.str());
10830 return;
10831 }
10832 }
10833
10834 else if ( "O2-SelfContStandardType"==name )
10835 {
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865 const int Nparam = 6;
10866 if ( (model == "user") && (parameters.nelem() == Nparam) )
10867 {
10868 out3 << "Continuum model " << name << " is running with \n"
10869 << "user defined parameters according to model " << model << ".\n";
10870 Standard_O2_continuum( xsec,
10871 parameters[0],
10872 parameters[1],
10873 parameters[2],
10874 parameters[3],
10875 parameters[4],
10876 parameters[5],
10877 model,
10878 f_mono,
10879 p_abs,
10880 t_abs,
10881 h2o_abs,
10882 vmr );
10883 }
10884 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10885 {
10886 ostringstream os;
10887 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10888 << "parameters for the model " << model << ",\n"
10889 << "but you specified " << parameters.nelem() << " parameters.\n";
10890 throw runtime_error(os.str());
10891 return;
10892 }
10893 else if ( (model != "user") && (parameters.nelem() == 0) )
10894 {
10895 out3 << "Continuum model " << name << " running with \n"
10896 << "the parameters for model " << model << ".\n";
10897 Standard_O2_continuum( xsec,
10898 0.00,
10899 0.00,
10900 0.00,
10901 0.00,
10902 0.00,
10903 0.00,
10904 model,
10905 f_mono,
10906 p_abs,
10907 t_abs,
10908 h2o_abs,
10909 vmr );
10910 }
10911 else if ( (model != "user") && (parameters.nelem() != 0) )
10912 {
10913 ostringstream os;
10914 os << "ERROR: Continuum model " << name << " requires NO input\n"
10915 << "parameters for the model " << model << ",\n"
10916 << "but you specified " << parameters.nelem() << " parameters.\n"
10917 << "This ambiguity can not be solved by arts.\n"
10918 << "Please see the arts user guide chapter 3.\n";
10919 throw runtime_error(os.str());
10920 return;
10921 }
10922 }
10923
10924 else if ( "O2-SelfContMPM93"==name )
10925 {
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945 const int Nparam = 4;
10946 if ( (model == "user") && (parameters.nelem() == Nparam) )
10947 {
10948 out3 << "Continuum model " << name << " is running with \n"
10949 << "user defined parameters according to model " << model << ".\n";
10950 MPM93_O2_continuum( xsec,
10951 parameters[0],
10952 parameters[1],
10953 parameters[2],
10954 parameters[3],
10955 model,
10956 f_mono,
10957 p_abs,
10958 t_abs,
10959 h2o_abs,
10960 vmr );
10961 }
10962 else if ( (model == "user") && (parameters.nelem() != Nparam) )
10963 {
10964 ostringstream os;
10965 os << "Continuum model " << name << " requires " << Nparam << " input\n"
10966 << "parameters for the model " << model << ",\n"
10967 << "but you specified " << parameters.nelem() << " parameters.\n";
10968 throw runtime_error(os.str());
10969 return;
10970 }
10971 else if ( (model != "user") && (parameters.nelem() == 0) )
10972 {
10973 out3 << "Continuum model " << name << " running with \n"
10974 << "the parameters for model " << model << ".\n";
10975 MPM93_O2_continuum( xsec,
10976 0.00,
10977 0.00,
10978 0.00,
10979 0.00,
10980 model,
10981 f_mono,
10982 p_abs,
10983 t_abs,
10984 h2o_abs,
10985 vmr );
10986 }
10987 else if ( (model != "user") && (parameters.nelem() != 0) )
10988 {
10989 ostringstream os;
10990 os << "ERROR: Continuum model " << name << " requires NO input\n"
10991 << "parameters for the model " << model << ",\n"
10992 << "but you specified " << parameters.nelem() << " parameters.\n"
10993 << "This ambiguity can not be solved by arts.\n"
10994 << "Please see the arts user guide chapter 3.\n";
10995 throw runtime_error(os.str());
10996 return;
10997 }
10998 }
10999
11000 else if ( "O2-SelfContPWR93"==name )
11001 {
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019 const int Nparam = 4;
11020 if ( (model == "user") && (parameters.nelem() == Nparam) )
11021 {
11022 out3 << "Continuum model " << name << " is running with \n"
11023 << "user defined parameters according to model " << model << ".\n";
11024 Rosenkranz_O2_continuum( xsec,
11025 parameters[0],
11026 parameters[1],
11027 parameters[2],
11028 parameters[3],
11029 model,
11030 f_mono,
11031 p_abs,
11032 t_abs,
11033 h2o_abs,
11034 vmr );
11035 }
11036 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11037 {
11038 ostringstream os;
11039 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11040 << "parameters for the model " << model << ",\n"
11041 << "but you specified " << parameters.nelem() << " parameters.\n";
11042 throw runtime_error(os.str());
11043 return;
11044 }
11045 else if ( (model != "user") && (parameters.nelem() == 0) )
11046 {
11047 out3 << "Continuum model " << name << " running with \n"
11048 << "the parameters for model " << model << ".\n";
11049 Rosenkranz_O2_continuum( xsec,
11050 0.00,
11051 0.00,
11052 0.00,
11053 0.00,
11054 model,
11055 f_mono,
11056 p_abs,
11057 t_abs,
11058 h2o_abs,
11059 vmr );
11060 }
11061 else if ( (model != "user") && (parameters.nelem() != 0) )
11062 {
11063 ostringstream os;
11064 os << "ERROR: Continuum model " << name << " requires NO input\n"
11065 << "parameters for the model " << model << ",\n"
11066 << "but you specified " << parameters.nelem() << " parameters.\n"
11067 << "This ambiguity can not be solved by arts.\n"
11068 << "Please see the arts user guide chapter 3.\n";
11069 throw runtime_error(os.str());
11070 return;
11071 }
11072 }
11073
11074 else if ( "O2-PWR88"==name )
11075 {
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087
11088
11089
11090
11091
11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103 const int Nparam = 4;
11104 const char *version="PWR88";
11105 if ( (model == "user") && (parameters.nelem() == Nparam) )
11106 {
11107 out3 << "Full model " << name << " is running with \n"
11108 << "user defined parameters according to model " << model << ".\n";
11109 PWR93O2AbsModel( xsec,
11110 parameters[0],
11111 parameters[1],
11112 parameters[2],
11113 parameters[3],
11114 model,
11115 version,
11116 f_mono,
11117 p_abs,
11118 t_abs,
11119 h2o_abs,
11120 vmr );
11121 }
11122 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11123 {
11124 ostringstream os;
11125 os << "Full model " << name << " requires " << Nparam << " input\n"
11126 << "parameters for the model " << model << ",\n"
11127 << "but you specified " << parameters.nelem() << " parameters.\n";
11128 throw runtime_error(os.str());
11129 return;
11130 }
11131 else if ( (model != "user") && (parameters.nelem() == 0) )
11132 {
11133 out3 << "Full model " << name << " running with \n"
11134 << "the parameters for model " << model << ".\n";
11135 PWR93O2AbsModel( xsec,
11136 0.00,
11137 0.00,
11138 0.00,
11139 0.00,
11140 model,
11141 version,
11142 f_mono,
11143 p_abs,
11144 t_abs,
11145 h2o_abs,
11146 vmr );
11147 }
11148 else if ( (model != "user") && (parameters.nelem() != 0) )
11149 {
11150 ostringstream os;
11151 os << "ERROR: Full model " << name << " requires NO input\n"
11152 << "parameters for the model " << model << ",\n"
11153 << "but you specified " << parameters.nelem() << " parameters.\n"
11154 << "This ambiguity can not be solved by arts.\n"
11155 << "Please see the arts user guide chapter 3.\n";
11156 throw runtime_error(os.str());
11157 return;
11158 }
11159 }
11160
11161 else if ( "O2-PWR93"==name )
11162 {
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183 const int Nparam = 4;
11184 const char *version="PWR93";
11185 if ( (model == "user") && (parameters.nelem() == Nparam) )
11186 {
11187 out3 << "Full model " << name << " is running with \n"
11188 << "user defined parameters according to model " << model << ".\n";
11189 PWR93O2AbsModel( xsec,
11190 parameters[0],
11191 parameters[1],
11192 parameters[2],
11193 parameters[3],
11194 model,
11195 version,
11196 f_mono,
11197 p_abs,
11198 t_abs,
11199 h2o_abs,
11200 vmr );
11201 }
11202 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11203 {
11204 ostringstream os;
11205 os << "Full model " << name << " requires " << Nparam << " input\n"
11206 << "parameters for the model " << model << ",\n"
11207 << "but you specified " << parameters.nelem() << " parameters.\n";
11208 throw runtime_error(os.str());
11209 return;
11210 }
11211 else if ( (model != "user") && (parameters.nelem() == 0) )
11212 {
11213 out3 << "Full model " << name << " running with \n"
11214 << "the parameters for model " << model << ".\n";
11215 PWR93O2AbsModel( xsec,
11216 0.00,
11217 0.00,
11218 0.00,
11219 0.00,
11220 model,
11221 version,
11222 f_mono,
11223 p_abs,
11224 t_abs,
11225 h2o_abs,
11226 vmr );
11227 }
11228 else if ( (model != "user") && (parameters.nelem() != 0) )
11229 {
11230 ostringstream os;
11231 os << "ERROR: Full model " << name << " requires NO input\n"
11232 << "parameters for the model " << model << ",\n"
11233 << "but you specified " << parameters.nelem() << " parameters.\n"
11234 << "This ambiguity can not be solved by arts.\n"
11235 << "Please see the arts user guide chapter 3.\n";
11236 throw runtime_error(os.str());
11237 return;
11238 }
11239 }
11240
11241 else if ( "O2-PWR98"==name )
11242 {
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269 const int Nparam = 4;
11270 const char *version="PWR98";
11271 if ( (model == "user") && (parameters.nelem() == Nparam) )
11272 {
11273 out3 << "Full model " << name << " is running with \n"
11274 << "user defined parameters according to model " << model << ".\n";
11275 PWR93O2AbsModel( xsec,
11276 parameters[0],
11277 parameters[1],
11278 parameters[2],
11279 parameters[3],
11280 model,
11281 version,
11282 f_mono,
11283 p_abs,
11284 t_abs,
11285 h2o_abs,
11286 vmr );
11287 }
11288 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11289 {
11290 ostringstream os;
11291 os << "Full model " << name << " requires " << Nparam << " input\n"
11292 << "parameters for the model " << model << ",\n"
11293 << "but you specified " << parameters.nelem() << " parameters.\n";
11294 throw runtime_error(os.str());
11295 return;
11296 }
11297 else if ( (model != "user") && (parameters.nelem() == 0) )
11298 {
11299 out3 << "Full model " << name << " running with \n"
11300 << "the parameters for model " << model << ".\n";
11301 PWR93O2AbsModel( xsec,
11302 0.00,
11303 0.00,
11304 0.00,
11305 0.00,
11306 model,
11307 version,
11308 f_mono,
11309 p_abs,
11310 t_abs,
11311 h2o_abs,
11312 vmr );
11313 }
11314 else if ( (model != "user") && (parameters.nelem() != 0) )
11315 {
11316 ostringstream os;
11317 os << "ERROR: Full model " << name << " requires NO input\n"
11318 << "parameters for the model " << model << ",\n"
11319 << "but you specified " << parameters.nelem() << " parameters.\n"
11320 << "This ambiguity can not be solved by arts.\n"
11321 << "Please see the arts user guide chapter 3.\n";
11322 throw runtime_error(os.str());
11323 return;
11324 }
11325 }
11326
11327 else if ( "O2-MPM93"==name )
11328 {
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349 const int Nparam = 4;
11350 if ( (model == "user") && (parameters.nelem() == Nparam) )
11351 {
11352 out3 << "Full model " << name << " is running with \n"
11353 << "user defined parameters according to model " << model << ".\n";
11354 MPM93O2AbsModel( xsec,
11355 parameters[0],
11356 parameters[1],
11357 parameters[2],
11358 parameters[3],
11359 model,
11360 f_mono,
11361 p_abs,
11362 t_abs,
11363 h2o_abs,
11364 vmr );
11365 }
11366 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11367 {
11368 ostringstream os;
11369 os << "Full model " << name << " requires " << Nparam << " input\n"
11370 << "parameters for the model " << model << ",\n"
11371 << "but you specified " << parameters.nelem() << " parameters.\n";
11372 throw runtime_error(os.str());
11373 return;
11374 }
11375 else if ( (model != "user") && (parameters.nelem() == 0) )
11376 {
11377 out3 << "Full model " << name << " running with \n"
11378 << "the parameters for model " << model << ".\n";
11379 MPM93O2AbsModel( xsec,
11380 0.00,
11381 0.00,
11382 0.00,
11383 0.00,
11384 model,
11385 f_mono,
11386 p_abs,
11387 t_abs,
11388 h2o_abs,
11389 vmr );
11390 }
11391 else if ( (model != "user") && (parameters.nelem() != 0) )
11392 {
11393 ostringstream os;
11394 os << "ERROR: Full model " << name << " requires NO input\n"
11395 << "parameters for the model " << model << ",\n"
11396 << "but you specified " << parameters.nelem() << " parameters.\n"
11397 << "This ambiguity can not be solved by arts.\n"
11398 << "Please see the arts user guide chapter 3.\n";
11399 throw runtime_error(os.str());
11400 return;
11401 }
11402 }
11403
11404 else if ( "O2-MPM92"==name )
11405 {
11406
11407
11408
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425 const int Nparam = 4;
11426 if ( (model == "user") && (parameters.nelem() == Nparam) )
11427 {
11428 out3 << "Full model " << name << " is running with \n"
11429 << "user defined parameters according to model " << model << ".\n";
11430 MPM92O2AbsModel( xsec,
11431 parameters[0],
11432 parameters[1],
11433 parameters[2],
11434 parameters[3],
11435 model,
11436 f_mono,
11437 p_abs,
11438 t_abs,
11439 h2o_abs,
11440 vmr );
11441 }
11442 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11443 {
11444 ostringstream os;
11445 os << "Full model " << name << " requires " << Nparam << " input\n"
11446 << "parameters for the model " << model << ",\n"
11447 << "but you specified " << parameters.nelem() << " parameters.\n";
11448 throw runtime_error(os.str());
11449 return;
11450 }
11451 else if ( (model != "user") && (parameters.nelem() == 0) )
11452 {
11453 out3 << "Full model " << name << " running with \n"
11454 << "the parameters for model " << model << ".\n";
11455 MPM92O2AbsModel( xsec,
11456 0.00,
11457 0.00,
11458 0.00,
11459 0.00,
11460 model,
11461 f_mono,
11462 p_abs,
11463 t_abs,
11464 h2o_abs,
11465 vmr );
11466 }
11467 else if ( (model != "user") && (parameters.nelem() != 0) )
11468 {
11469 ostringstream os;
11470 os << "ERROR: Full model " << name << " requires NO input\n"
11471 << "parameters for the model " << model << ",\n"
11472 << "but you specified " << parameters.nelem() << " parameters.\n"
11473 << "This ambiguity can not be solved by arts.\n"
11474 << "Please see the arts user guide chapter 3.\n";
11475 throw runtime_error(os.str());
11476 return;
11477 }
11478 }
11479
11480 else if ( "O2-MPM89"==name )
11481 {
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
11500 const int Nparam = 4;
11501 if ( (model == "user") && (parameters.nelem() == Nparam) )
11502 {
11503 out3 << "Full model " << name << " is running with \n"
11504 << "user defined parameters according to model " << model << ".\n";
11505 MPM89O2AbsModel( xsec,
11506 parameters[0],
11507 parameters[1],
11508 parameters[2],
11509 parameters[3],
11510 model,
11511 f_mono,
11512 p_abs,
11513 t_abs,
11514 h2o_abs,
11515 vmr );
11516 }
11517 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11518 {
11519 ostringstream os;
11520 os << "Full model " << name << " requires " << Nparam << " input\n"
11521 << "parameters for the model " << model << ",\n"
11522 << "but you specified " << parameters.nelem() << " parameters.\n";
11523 throw runtime_error(os.str());
11524 return;
11525 }
11526 else if ( (model != "user") && (parameters.nelem() == 0) )
11527 {
11528 out3 << "Full model " << name << " running with \n"
11529 << "the parameters for model " << model << ".\n";
11530 MPM89O2AbsModel( xsec,
11531 0.00,
11532 0.00,
11533 0.00,
11534 0.00,
11535 model,
11536 f_mono,
11537 p_abs,
11538 t_abs,
11539 h2o_abs,
11540 vmr );
11541 }
11542 else if ( (model != "user") && (parameters.nelem() != 0) )
11543 {
11544 ostringstream os;
11545 os << "ERROR: Full model " << name << " requires NO input\n"
11546 << "parameters for the model " << model << ",\n"
11547 << "but you specified " << parameters.nelem() << " parameters.\n"
11548 << "This ambiguity can not be solved by arts.\n"
11549 << "Please see the arts user guide chapter 3.\n";
11550 throw runtime_error(os.str());
11551 return;
11552 }
11553 }
11554
11555 else if ( "O2-MPM87"==name )
11556 {
11557
11558
11559
11560
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579 const int Nparam = 4;
11580 if ( (model == "user") && (parameters.nelem() == Nparam) )
11581 {
11582 out3 << "Full model " << name << " is running with \n"
11583 << "user defined parameters according to model " << model << ".\n";
11584 MPM87O2AbsModel( xsec,
11585 parameters[0],
11586 parameters[1],
11587 parameters[2],
11588 parameters[3],
11589 model,
11590 f_mono,
11591 p_abs,
11592 t_abs,
11593 h2o_abs,
11594 vmr );
11595 }
11596 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11597 {
11598 ostringstream os;
11599 os << "Full model " << name << " requires " << Nparam << " input\n"
11600 << "parameters for the model " << model << ",\n"
11601 << "but you specified " << parameters.nelem() << " parameters.\n";
11602 throw runtime_error(os.str());
11603 return;
11604 }
11605 else if ( (model != "user") && (parameters.nelem() == 0) )
11606 {
11607 out3 << "Full model " << name << " running with \n"
11608 << "the parameters for model " << model << ".\n";
11609 MPM87O2AbsModel( xsec,
11610 0.00,
11611 0.00,
11612 0.00,
11613 0.00,
11614 model,
11615 f_mono,
11616 p_abs,
11617 t_abs,
11618 h2o_abs,
11619 vmr );
11620 }
11621 else if ( (model != "user") && (parameters.nelem() != 0) )
11622 {
11623 ostringstream os;
11624 os << "ERROR: Full model " << name << " requires NO input\n"
11625 << "parameters for the model " << model << ",\n"
11626 << "but you specified " << parameters.nelem() << " parameters.\n"
11627 << "This ambiguity can not be solved by arts.\n"
11628 << "Please see the arts user guide chapter 3.\n";
11629 throw runtime_error(os.str());
11630 return;
11631 }
11632 }
11633
11634 else if ( "O2-MPM85"==name )
11635 {
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654 const int Nparam = 4;
11655 if ( (model == "user") && (parameters.nelem() == Nparam) )
11656 {
11657 out3 << "Full model " << name << " is running with \n"
11658 << "user defined parameters according to model " << model << ".\n";
11659 MPM85O2AbsModel( xsec,
11660 parameters[0],
11661 parameters[1],
11662 parameters[2],
11663 parameters[3],
11664 model,
11665 f_mono,
11666 p_abs,
11667 t_abs,
11668 h2o_abs,
11669 vmr );
11670 }
11671 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11672 {
11673 ostringstream os;
11674 os << "Full model " << name << " requires " << Nparam << " input\n"
11675 << "parameters for the model " << model << ",\n"
11676 << "but you specified " << parameters.nelem() << " parameters.\n";
11677 throw runtime_error(os.str());
11678 return;
11679 }
11680 else if ( (model != "user") && (parameters.nelem() == 0) )
11681 {
11682 out3 << "Full model " << name << " running with \n"
11683 << "the parameters for model " << model << ".\n";
11684 MPM85O2AbsModel( xsec,
11685 0.00,
11686 0.00,
11687 0.00,
11688 0.00,
11689 model,
11690 f_mono,
11691 p_abs,
11692 t_abs,
11693 h2o_abs,
11694 vmr );
11695 }
11696 else if ( (model != "user") && (parameters.nelem() != 0) )
11697 {
11698 ostringstream os;
11699 os << "ERROR: Full model " << name << " requires NO input\n"
11700 << "parameters for the model " << model << ",\n"
11701 << "but you specified " << parameters.nelem() << " parameters.\n"
11702 << "This ambiguity can not be solved by arts.\n"
11703 << "Please see the arts user guide chapter 3.\n";
11704 throw runtime_error(os.str());
11705 return;
11706 }
11707 }
11708
11709 else if ( "N2-SelfContMPM93"==name )
11710 {
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11731 const int Nparam = 4;
11732 if ( (model == "user") && (parameters.nelem() == Nparam) )
11733 {
11734 out3 << "Continuum model " << name << " is running with \n"
11735 << "user defined parameters according to model " << model << ".\n";
11736 MPM93_N2_continuum( xsec,
11737 parameters[0],
11738 parameters[1],
11739 parameters[2],
11740 parameters[3],
11741 model,
11742 f_mono,
11743 p_abs,
11744 t_abs,
11745 h2o_abs,
11746 vmr );
11747 }
11748 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11749 {
11750 ostringstream os;
11751 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11752 << "parameters for the model " << model << ",\n"
11753 << "but you specified " << parameters.nelem() << " parameters.\n";
11754 throw runtime_error(os.str());
11755 return;
11756 }
11757 else if ( (model == "MPM93Scale") && (parameters.nelem() == 1) )
11758 {
11759 out3 << "Continuum model " << name << " running with \n"
11760 << "the parameters for model " << model << ".\n";
11761 MPM93_N2_continuum( xsec,
11762 parameters[0],
11763 0.00,
11764 0.00,
11765 0.00,
11766 model,
11767 f_mono,
11768 p_abs,
11769 t_abs,
11770 h2o_abs,
11771 vmr );
11772 }
11773 else if ( (model == "MPM93Scale") && (parameters.nelem() != 1) )
11774 {
11775 ostringstream os;
11776 os << "Continuum model " << name << " requires 1 scaling input\n"
11777 << "parameters for the model " << model << ",\n"
11778 << "but you specified " << parameters.nelem() << " parameters.\n";
11779 throw runtime_error(os.str());
11780 return;
11781 }
11782 else if ( (model != "user") && (model != "MPM93Scale") && (parameters.nelem() == 0) )
11783 {
11784 out3 << "Continuum model " << name << " running with \n"
11785 << "the parameters for model " << model << ".\n";
11786 MPM93_N2_continuum( xsec,
11787 0.00,
11788 0.00,
11789 0.00,
11790 0.00,
11791 model,
11792 f_mono,
11793 p_abs,
11794 t_abs,
11795 h2o_abs,
11796 vmr );
11797 }
11798
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811 }
11812
11813 else if ( "N2-DryContATM01"==name )
11814 {
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824
11825
11826
11827
11828
11829
11830 const int Nparam = 1;
11831 if ( (model == "user") && (parameters.nelem() == Nparam) )
11832 {
11833 out3 << "Continuum model " << name << " is running with \n"
11834 << "user defined parameters according to model " << model << ".\n";
11835 Pardo_ATM_N2_dry_continuum( xsec,
11836 parameters[0],
11837 model,
11838 f_mono,
11839 p_abs,
11840 t_abs,
11841 vmr,
11842 h2o_abs );
11843 }
11844 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11845 {
11846 ostringstream os;
11847 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11848 << "parameters for the model " << model << ",\n"
11849 << "but you specified " << parameters.nelem() << " parameters.\n";
11850 throw runtime_error(os.str());
11851 return;
11852 }
11853 else if ( (model != "user") && (parameters.nelem() == 0) )
11854 {
11855 out3 << "Continuum model " << name << " running with \n"
11856 << "the parameters for model " << model << ".\n";
11857 Pardo_ATM_N2_dry_continuum( xsec,
11858 0.000,
11859 model,
11860 f_mono,
11861 p_abs,
11862 t_abs,
11863 vmr,
11864 h2o_abs );
11865 }
11866 else if ( (model != "user") && (parameters.nelem() != 0) )
11867 {
11868 ostringstream os;
11869 os << "ERROR: Continuum model " << name << " requires NO input\n"
11870 << "parameters for the model " << model << ",\n"
11871 << "but you specified " << parameters.nelem() << " parameters.\n"
11872 << "This ambiguity can not be solved by arts.\n"
11873 << "Please see the arts user guide chapter 3.\n";
11874 throw runtime_error(os.str());
11875 return;
11876 }
11877 }
11878
11879 else if ( "N2-SelfContPWR93"==name )
11880 {
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897 const int Nparam = 2;
11898 if ( (model == "user") && (parameters.nelem() == Nparam) )
11899 {
11900 out3 << "Continuum model " << name << " is running with \n"
11901 << "user defined parameters according to model " << model << ".\n";
11902 Rosenkranz_N2_self_continuum( xsec,
11903 parameters[0],
11904 parameters[1],
11905 model,
11906 f_mono,
11907 p_abs,
11908 t_abs,
11909 vmr );
11910 }
11911 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11912 {
11913 ostringstream os;
11914 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11915 << "parameters for the model " << model << ",\n"
11916 << "but you specified " << parameters.nelem() << " parameters.\n";
11917 throw runtime_error(os.str());
11918 return;
11919 }
11920 else if ( (model != "user") && (parameters.nelem() == 0) )
11921 {
11922 out3 << "Continuum model " << name << " running with \n"
11923 << "the parameters for model " << model << ".\n";
11924 Rosenkranz_N2_self_continuum( xsec,
11925 0.00,
11926 0.00,
11927 model,
11928 f_mono,
11929 p_abs,
11930 t_abs,
11931 vmr );
11932 }
11933 else if ( (model != "user") && (parameters.nelem() != 0) )
11934 {
11935 ostringstream os;
11936 os << "ERROR: Continuum model " << name << " requires NO input\n"
11937 << "parameters for the model " << model << ",\n"
11938 << "but you specified " << parameters.nelem() << " parameters.\n"
11939 << "This ambiguity can not be solved by arts.\n"
11940 << "Please see the arts user guide chapter 3.\n";
11941 throw runtime_error(os.str());
11942 return;
11943 }
11944 }
11945
11946 else if ( "N2-SelfContStandardType"==name )
11947 {
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11958
11959
11960
11961
11962
11963 const int Nparam = 4;
11964 if ( (model == "user") && (parameters.nelem() == Nparam) )
11965 {
11966 out3 << "Continuum model " << name << " is running with \n"
11967 << "user defined parameters according to model " << model << ".\n";
11968 Standard_N2_self_continuum( xsec,
11969 parameters[0],
11970 parameters[1],
11971 parameters[2],
11972 parameters[3],
11973 model,
11974 f_mono,
11975 p_abs,
11976 t_abs,
11977 vmr );
11978 }
11979 else if ( (model == "user") && (parameters.nelem() != Nparam) )
11980 {
11981 ostringstream os;
11982 os << "Continuum model " << name << " requires " << Nparam << " input\n"
11983 << "parameters for the model " << model << ",\n"
11984 << "but you specified " << parameters.nelem() << " parameters.\n";
11985 throw runtime_error(os.str());
11986 return;
11987 }
11988 else if ( (model != "user") && (parameters.nelem() == 0) )
11989 {
11990 out3 << "Continuum model " << name << " running with \n"
11991 << "the parameters for model " << model << ".\n";
11992 Standard_N2_self_continuum( xsec,
11993 0.000,
11994 0.000,
11995 0.000,
11996 0.000,
11997 model,
11998 f_mono,
11999 p_abs,
12000 t_abs,
12001 vmr );
12002 }
12003 else if ( (model != "user") && (parameters.nelem() != 0) )
12004 {
12005 ostringstream os;
12006 os << "ERROR: Continuum model " << name << " requires NO input\n"
12007 << "parameters for the model " << model << ",\n"
12008 << "but you specified " << parameters.nelem() << " parameters.\n"
12009 << "This ambiguity can not be solved by arts.\n"
12010 << "Please see the arts user guide chapter 3.\n";
12011 throw runtime_error(os.str());
12012 return;
12013 }
12014 }
12015
12016 else if ( "N2-SelfContBorysow"==name )
12017 {
12018
12019
12020
12021 const int Nparam = 1;
12022 if ( (model == "user") && (parameters.nelem() == Nparam) )
12023 {
12024 out3 << "Continuum model " << name << " is running with \n"
12025 << "user defined parameters according to model " << model << ".\n";
12026 BF86_CIA_N2( xsec,
12027 parameters[0],
12028 model,
12029 f_mono,
12030 p_abs,
12031 t_abs,
12032 vmr );
12033 }
12034 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12035 {
12036 ostringstream os;
12037 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12038 << "parameters for the model " << model << ",\n"
12039 << "but you specified " << parameters.nelem() << " parameters.\n";
12040 throw runtime_error(os.str());
12041 return;
12042 }
12043 else if ( (model != "user") && (parameters.nelem() == 0) )
12044 {
12045 out3 << "Continuum model " << name << " running with \n"
12046 << "the parameters for model " << model << ".\n";
12047 BF86_CIA_N2( xsec,
12048 0.0,
12049 model,
12050 f_mono,
12051 p_abs,
12052 t_abs,
12053 vmr );
12054 }
12055 else if ( (model != "user") && (parameters.nelem() != 0) )
12056 {
12057 ostringstream os;
12058 os << "ERROR: Continuum model " << name << " requires NO input\n"
12059 << "parameters for the model " << model << ",\n"
12060 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12061 << "This ambiguity can not be solved by arts.\n"
12062 << "Please see the arts user guide chapter 3.\n";
12063 throw runtime_error(os.str());
12064 return;
12065 }
12066 }
12067
12068 else if ( "N2-CIArotCKDMT100"==name )
12069 {
12070
12071
12072
12073 const int Nparam = 1;
12074 if ( (model == "user") && (parameters.nelem() == Nparam) )
12075 {
12076 out3 << "Continuum model " << name << " is running with \n"
12077 << "user defined parameters according to model " << model << ".\n";
12078 CKD_mt_CIArot_n2( xsec,
12079 parameters[0],
12080 model,
12081 f_mono,
12082 p_abs,
12083 t_abs,
12084 vmr );
12085 }
12086 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12087 {
12088 ostringstream os;
12089 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12090 << "parameters for the model " << model << ",\n"
12091 << "but you specified " << parameters.nelem() << " parameters.\n";
12092 throw runtime_error(os.str());
12093 return;
12094 }
12095 else if ( (model != "user") && (parameters.nelem() == 0) )
12096 {
12097 out3 << "Continuum model " << name << " running with \n"
12098 << "the parameters for model " << model << ".\n";
12099 CKD_mt_CIArot_n2( xsec,
12100 0.0,
12101 model,
12102 f_mono,
12103 p_abs,
12104 t_abs,
12105 vmr );
12106 }
12107 else if ( (model != "user") && (parameters.nelem() != 0) )
12108 {
12109 ostringstream os;
12110 os << "ERROR: Continuum model " << name << " requires NO input\n"
12111 << "parameters for the model " << model << ",\n"
12112 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12113 << "This ambiguity can not be solved by arts.\n"
12114 << "Please see the arts user guide chapter 3.\n";
12115 throw runtime_error(os.str());
12116 return;
12117 }
12118 }
12119
12120 else if ( "N2-CIAfunCKDMT100"==name )
12121 {
12122
12123
12124
12125
12126
12127
12128
12129 const int Nparam = 1;
12130 if ( (model == "user") && (parameters.nelem() == Nparam) )
12131 {
12132 out3 << "Continuum model " << name << " is running with \n"
12133 << "user defined parameters according to model " << model << ".\n";
12134 CKD_mt_CIAfun_n2( xsec,
12135 parameters[0],
12136 model,
12137 f_mono,
12138 p_abs,
12139 t_abs,
12140 vmr );
12141 }
12142 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12143 {
12144 ostringstream os;
12145 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12146 << "parameters for the model " << model << ",\n"
12147 << "but you specified " << parameters.nelem() << " parameters.\n";
12148 throw runtime_error(os.str());
12149 return;
12150 }
12151 else if ( (model != "user") && (parameters.nelem() == 0) )
12152 {
12153 out3 << "Continuum model " << name << " running with \n"
12154 << "the parameters for model " << model << ".\n";
12155 CKD_mt_CIAfun_n2( xsec,
12156 0.0,
12157 model,
12158 f_mono,
12159 p_abs,
12160 t_abs,
12161 vmr );
12162 }
12163 else if ( (model != "user") && (parameters.nelem() != 0) )
12164 {
12165 ostringstream os;
12166 os << "ERROR: Continuum model " << name << " requires NO input\n"
12167 << "parameters for the model " << model << ",\n"
12168 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12169 << "This ambiguity can not be solved by arts.\n"
12170 << "Please see the arts user guide chapter 3.\n";
12171 throw runtime_error(os.str());
12172 return;
12173 }
12174 }
12175
12176 else if ( "CO2-CKD241"==name )
12177 {
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195 const int Nparam = 1;
12196 if ( (model == "user") && (parameters.nelem() == Nparam) )
12197 {
12198 out3 << "Continuum model " << name << " is running with \n"
12199 << "user defined parameters according to model " << model << ".\n";
12200 CKD_241_co2( xsec,
12201 parameters[0],
12202 model,
12203 f_mono,
12204 p_abs,
12205 t_abs,
12206 vmr );
12207 }
12208 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12209 {
12210 ostringstream os;
12211 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12212 << "parameters for the model " << model << ",\n"
12213 << "but you specified " << parameters.nelem() << " parameters.\n";
12214 throw runtime_error(os.str());
12215 return;
12216 }
12217 else if ( (model != "user") && (parameters.nelem() == 0) )
12218 {
12219 out3 << "Continuum model " << name << " running with \n"
12220 << "the parameters for model " << model << ".\n";
12221 CKD_241_co2( xsec,
12222 0.00,
12223 model,
12224 f_mono,
12225 p_abs,
12226 t_abs,
12227 vmr );
12228 }
12229 else if ( (model != "user") && (parameters.nelem() != 0) )
12230 {
12231 ostringstream os;
12232 os << "ERROR: Continuum model " << name << " requires NO input\n"
12233 << "parameters for the model " << model << ",\n"
12234 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12235 << "This ambiguity can not be solved by arts.\n"
12236 << "Please see the arts user guide chapter 3.\n";
12237 throw runtime_error(os.str());
12238 return;
12239 }
12240 }
12241
12242 else if ( "CO2-CKDMT100"==name )
12243 {
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261 const int Nparam = 1;
12262 if ( (model == "user") && (parameters.nelem() == Nparam) )
12263 {
12264 out3 << "Continuum model " << name << " is running with \n"
12265 << "user defined parameters according to model " << model << ".\n";
12266 CKD_mt_co2( xsec,
12267 parameters[0],
12268 model,
12269 f_mono,
12270 p_abs,
12271 t_abs,
12272 vmr );
12273 }
12274 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12275 {
12276 ostringstream os;
12277 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12278 << "parameters for the model " << model << ",\n"
12279 << "but you specified " << parameters.nelem() << " parameters.\n";
12280 throw runtime_error(os.str());
12281 return;
12282 }
12283 else if ( (model != "user") && (parameters.nelem() == 0) )
12284 {
12285 out3 << "Continuum model " << name << " running with \n"
12286 << "the parameters for model " << model << ".\n";
12287 CKD_mt_co2( xsec,
12288 0.00,
12289 model,
12290 f_mono,
12291 p_abs,
12292 t_abs,
12293 vmr );
12294 }
12295 else if ( (model != "user") && (parameters.nelem() != 0) )
12296 {
12297 ostringstream os;
12298 os << "ERROR: Continuum model " << name << " requires NO input\n"
12299 << "parameters for the model " << model << ",\n"
12300 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12301 << "This ambiguity can not be solved by arts.\n"
12302 << "Please see the arts user guide chapter 3.\n";
12303 throw runtime_error(os.str());
12304 return;
12305 }
12306 }
12307
12308 else if ( "CO2-SelfContPWR93"==name )
12309 {
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326 const int Nparam = 2;
12327 if ( (model == "user") && (parameters.nelem() == Nparam) )
12328 {
12329 out3 << "Continuum model " << name << " is running with \n"
12330 << "user defined parameters according to model " << model << ".\n";
12331 Rosenkranz_CO2_self_continuum( xsec,
12332 parameters[0],
12333 parameters[1],
12334 model,
12335 f_mono,
12336 p_abs,
12337 t_abs,
12338 vmr );
12339 }
12340 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12341 {
12342 ostringstream os;
12343 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12344 << "parameters for the model " << model << ",\n"
12345 << "but you specified " << parameters.nelem() << " parameters.\n";
12346 throw runtime_error(os.str());
12347 return;
12348 }
12349 else if ( (model != "user") && (parameters.nelem() == 0) )
12350 {
12351 out3 << "Continuum model " << name << " running with \n"
12352 << "the parameters for model " << model << ".\n";
12353 Rosenkranz_CO2_self_continuum( xsec,
12354 0.00,
12355 0.00,
12356 model,
12357 f_mono,
12358 p_abs,
12359 t_abs,
12360 vmr );
12361 }
12362 else if ( (model != "user") && (parameters.nelem() != 0) )
12363 {
12364 ostringstream os;
12365 os << "ERROR: Continuum model " << name << " requires NO input\n"
12366 << "parameters for the model " << model << ",\n"
12367 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12368 << "This ambiguity can not be solved by arts.\n"
12369 << "Please see the arts user guide chapter 3.\n";
12370 throw runtime_error(os.str());
12371 return;
12372 }
12373 }
12374
12375 else if ( "CO2-ForeignContPWR93"==name )
12376 {
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394 const int Nparam = 2;
12395 if ( (model == "user") && (parameters.nelem() == Nparam) )
12396 {
12397 out3 << "Continuum model " << name << " is running with \n"
12398 << "user defined parameters according to model " << model << ".\n";
12399 Rosenkranz_CO2_foreign_continuum( xsec,
12400 parameters[0],
12401 parameters[1],
12402 model,
12403 f_mono,
12404 p_abs,
12405 t_abs,
12406 n2_abs,
12407 vmr );
12408 }
12409 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12410 {
12411 ostringstream os;
12412 os << "Continuum model " << name << " requires " << Nparam << " input\n"
12413 << "parameters for the model " << model << ",\n"
12414 << "but you specified " << parameters.nelem() << " parameters.\n";
12415 throw runtime_error(os.str());
12416 return;
12417 }
12418 else if ( (model != "user") && (parameters.nelem() == 0) )
12419 {
12420 out3 << "Continuum model " << name << " running with \n"
12421 << "the parameters for model " << model << ".\n";
12422 Rosenkranz_CO2_foreign_continuum( xsec,
12423 0.00,
12424 0.00,
12425 model,
12426 f_mono,
12427 p_abs,
12428 t_abs,
12429 n2_abs,
12430 vmr );
12431 }
12432 else if ( (model != "user") && (parameters.nelem() != 0) )
12433 {
12434 ostringstream os;
12435 os << "ERROR: Continuum model " << name << " requires NO input\n"
12436 << "parameters for the model " << model << ",\n"
12437 << "but you specified " << parameters.nelem() << " parameters. " << "\n"
12438 << "This ambiguity can not be solved by arts.\n"
12439 << "Please see the arts user guide chapter 3.\n";
12440 throw runtime_error(os.str());
12441 return;
12442 }
12443 }
12444
12445 else if ( "liquidcloud-MPM93"==name )
12446 {
12447
12448
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 const int Nparam = 3;
12476 if ( (model == "user") && (parameters.nelem() == Nparam) )
12477 {
12478 out3 << "MPM93 liquid water cloud absorption model " << name << " is running with \n"
12479 << "user defined parameters according to model " << model << ".\n";
12480 MPM93WaterDropletAbs(xsec,
12481 parameters[0],
12482 parameters[1],
12483 parameters[2],
12484 model,
12485 f_mono,
12486 p_abs,
12487 t_abs,
12488 vmr );
12489 }
12490 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12491 {
12492 ostringstream os;
12493 os << "MPM93 liquid water cloud absorption model " << name << " requires\n"
12494 << Nparam << " input parameter for the model " << model << ",\n"
12495 << "but you specified " << parameters.nelem() << " parameters.\n";
12496 throw runtime_error(os.str());
12497 return;
12498 }
12499 else if ( (model != "user") && (parameters.nelem() == 0) )
12500 {
12501 out3 << "MPM93 liquid water cloud absorption model " << name << " running with \n"
12502 << "the parameter for model " << model << ".\n";
12503 MPM93WaterDropletAbs(xsec,
12504 0.000,
12505 0.000,
12506 0.000,
12507 model,
12508 f_mono,
12509 p_abs,
12510 t_abs,
12511 vmr );
12512 }
12513 else if ( (model != "user") && (parameters.nelem() != 0) )
12514 {
12515 ostringstream os;
12516 os << "ERROR: MPM93 liquid water cloud absorption model " << name << " requires NO input\n"
12517 << "parameters for the model " << model << ",\n"
12518 << "but you specified " << parameters.nelem() << " parameters.\n"
12519 << "This ambiguity can not be solved by arts.\n"
12520 << "Please see the arts user guide chapter 4.\n";
12521 throw runtime_error(os.str());
12522 return;
12523 }
12524 }
12525
12526 else if ( "icecloud-MPM93"==name )
12527 {
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 const int Nparam = 3;
12557 if ( (model == "user") && (parameters.nelem() == Nparam) )
12558 {
12559 out3 << "MPM93 ice water cloud absorption model " << name << " is running with \n"
12560 << "user defined parameters according to model " << model << ".\n";
12561 MPM93IceCrystalAbs(xsec,
12562 parameters[0],
12563 parameters[1],
12564 parameters[2],
12565 model,
12566 f_mono,
12567 p_abs,
12568 t_abs,
12569 vmr );
12570 }
12571 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12572 {
12573 ostringstream os;
12574 os << "MPM93 ice water cloud absorption model " << name << " requires \n"
12575 << Nparam << " input parameter for the model " << model << ",\n"
12576 << "but you specified " << parameters.nelem() << " parameters.\n";
12577 throw runtime_error(os.str());
12578 return;
12579 }
12580 else if ( (model != "user") && (parameters.nelem() == 0) )
12581 {
12582 out3 << "MPM93 ice water cloud absorption model " << name << " running with \n"
12583 << "the parameter for model " << model << ".\n";
12584 MPM93IceCrystalAbs(xsec,
12585 0.000,
12586 0.000,
12587 0.000,
12588 model,
12589 f_mono,
12590 p_abs,
12591 t_abs,
12592 vmr );
12593 }
12594 else if ( (model != "user") && (parameters.nelem() != 0) )
12595 {
12596 ostringstream os;
12597 os << "ERROR: MPM93 ice water cloud absorption model " << name << " requires NO input\n"
12598 << "parameters for the model " << model << ",\n"
12599 << "but you specified " << parameters.nelem() << " parameters.\n"
12600 << "This ambiguity can not be solved by arts.\n"
12601 << "Please see the arts user guide chapter 4.\n";
12602 throw runtime_error(os.str());
12603 return;
12604 }
12605 }
12606
12607 else if ( "rain-MPM93"==name )
12608 {
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638 const int Nparam = 3;
12639 if ( (model == "user") && (parameters.nelem() == Nparam) )
12640 {
12641 out3 << "MPM93 rain extinction model " << name << " is running with \n"
12642 << "user defined parameters according to model " << model << ".\n";
12643 MPM93RainExt(xsec,
12644 parameters[0],
12645 parameters[1],
12646 parameters[2],
12647 model,
12648 f_mono,
12649 p_abs,
12650 t_abs,
12651 vmr );
12652 }
12653 else if ( (model == "user") && (parameters.nelem() != Nparam) )
12654 {
12655 ostringstream os;
12656 os << "MPM93 rain extinction model " << name << " requires \n"
12657 << Nparam << " input parameter for the model " << model << ",\n"
12658 << "but you specified " << parameters.nelem() << " parameters.\n";
12659 throw runtime_error(os.str());
12660 return;
12661 }
12662 else if ( (model != "user") && (parameters.nelem() == 0) )
12663 {
12664 out3 << "MPM93 rain extinction model " << name << " running with \n"
12665 << "the parameter for model " << model << ".\n";
12666 MPM93RainExt(xsec,
12667 0.000,
12668 0.000,
12669 0.000,
12670 model,
12671 f_mono,
12672 p_abs,
12673 t_abs,
12674 vmr );
12675 }
12676 else if ( (model != "user") && (parameters.nelem() != 0) )
12677 {
12678 ostringstream os;
12679 os << "ERROR: MPM93 rain extinction model " << name << " requires NO input\n"
12680 << "parameters for the model " << model << ",\n"
12681 << "but you specified " << parameters.nelem() << " parameters.\n"
12682 << "This ambiguity can not be solved by arts.\n"
12683 << "Please see the arts user guide chapter 4.\n";
12684 throw runtime_error(os.str());
12685 return;
12686 }
12687 }
12688 else
12689 {
12690
12691 ostringstream os;
12692 os << "ERROR: Continuum/ full model tag `" << name << "' not yet implemented in arts!";
12693 throw runtime_error(os.str());
12694 return;
12695 }
12696 return;
12697 }
12698
12699
12700
12724 void check_continuum_model(const String& name)
12725 {
12726
12727 extern const Array<SpeciesRecord> species_data;
12728
12729
12730 ArrayOfString valid_models;
12731
12732 bool found = false;
12733
12734
12735 for ( Array<SpeciesRecord>::const_iterator i=species_data.begin();
12736 i<species_data.end();
12737 ++i )
12738 {
12739 String specnam = i->Name();
12740
12741
12742 for ( Array<IsotopeRecord>::const_iterator j=i->Isotope().begin();
12743 j<i->Isotope().end();
12744 ++j )
12745 {
12746 String isonam = j->Name();
12747
12748
12749
12750
12751
12752
12753 String fullnam = specnam + "-" + isonam;
12754
12755
12756
12757
12758 if ( 0 > j->Abundance() )
12759 {
12760 valid_models.push_back(fullnam);
12761 }
12762
12763 if ( name == fullnam )
12764 {
12765 found = true;
12766 }
12767 }
12768 }
12769
12770
12771
12772 if (!found)
12773 {
12774 ostringstream os;
12775 os << "The String `" << name << "' matches none of the known\n"
12776 << "continuum models. Known continuum models are:";
12777 for ( ArrayOfString::const_iterator i=valid_models.begin();
12778 i<valid_models.end();
12779 ++i )
12780 {
12781 os << "\n" << *i;
12782 }
12783 throw runtime_error(os.str());
12784 }
12785 }
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796 #ifndef F2C_INCLUDE
12797 #define F2C_INCLUDE
12798
12799 typedef long int integer;
12800 typedef unsigned long int uinteger;
12801 typedef char *address;
12802 typedef short int shortint;
12803 typedef float real;
12804 typedef double doublereal;
12805 typedef struct { real r, i; } complex;
12806 typedef struct { doublereal r, i; } doublecomplex;
12807 typedef long int logical;
12808 typedef short int shortlogical;
12809 typedef char logical1;
12810 typedef char integer1;
12811 #ifdef INTEGER_STAR_8
12812 typedef long long longint;
12813 typedef unsigned long long ulongint;
12814 #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b)))
12815 #define qbit_set(a,b) ((a) | ((ulongint)1 << (b)))
12816 #endif
12817
12818 #define TRUE_ (1)
12819 #define FALSE_ (0)
12820
12821
12822 #ifndef Extern
12823 #define Extern extern
12824 #endif
12825
12826
12827
12828 #ifdef f2c_i2
12829
12830 typedef short flag;
12831 typedef short ftnlen;
12832 typedef short ftnint;
12833 #else
12834 typedef long int flag;
12835 typedef long int ftnlen;
12836 typedef long int ftnint;
12837 #endif
12838
12839
12840 typedef struct
12841 { flag cierr;
12842 ftnint ciunit;
12843 flag ciend;
12844 char *cifmt;
12845 ftnint cirec;
12846 } cilist;
12847
12848
12849 typedef struct
12850 { flag icierr;
12851 char *iciunit;
12852 flag iciend;
12853 char *icifmt;
12854 ftnint icirlen;
12855 ftnint icirnum;
12856 } icilist;
12857
12858
12859 typedef struct
12860 { flag oerr;
12861 ftnint ounit;
12862 char *ofnm;
12863 ftnlen ofnmlen;
12864 char *osta;
12865 char *oacc;
12866 char *ofm;
12867 ftnint orl;
12868 char *oblnk;
12869 } olist;
12870
12871
12872 typedef struct
12873 { flag cerr;
12874 ftnint cunit;
12875 char *csta;
12876 } cllist;
12877
12878
12879 typedef struct
12880 { flag aerr;
12881 ftnint aunit;
12882 } alist;
12883
12884
12885 typedef struct
12886 { flag inerr;
12887 ftnint inunit;
12888 char *infile;
12889 ftnlen infilen;
12890 ftnint *inex;
12891 ftnint *inopen;
12892 ftnint *innum;
12893 ftnint *innamed;
12894 char *inname;
12895 ftnlen innamlen;
12896 char *inacc;
12897 ftnlen inacclen;
12898 char *inseq;
12899 ftnlen inseqlen;
12900 char *indir;
12901 ftnlen indirlen;
12902 char *infmt;
12903 ftnlen infmtlen;
12904 char *inform;
12905 ftnint informlen;
12906 char *inunf;
12907 ftnlen inunflen;
12908 ftnint *inrecl;
12909 ftnint *innrec;
12910 char *inblank;
12911 ftnlen inblanklen;
12912 } inlist;
12913
12914 #define VOID void
12915
12916 union Multitype {
12917 integer1 g;
12918 shortint h;
12919 integer i;
12920
12921 real r;
12922 doublereal d;
12923 complex c;
12924 doublecomplex z;
12925 };
12926
12927 typedef union Multitype Multitype;
12928
12929
12930
12931 struct Vardesc {
12932 char *name;
12933 char *addr;
12934 ftnlen *dims;
12935 int type;
12936 };
12937 typedef struct Vardesc Vardesc;
12938
12939 struct Namelist {
12940 char *name;
12941 Vardesc **vars;
12942 int nvars;
12943 };
12944 typedef struct Namelist Namelist;
12945
12946 #define abs(x) ((x) >= 0 ? (x) : -(x))
12947 #define dabs(x) (doublereal)abs(x)
12948 #define min(a,b) ((a) <= (b) ? (a) : (b))
12949 #define max(a,b) ((a) >= (b) ? (a) : (b))
12950 #define dmin(a,b) (doublereal)min(a,b)
12951 #define dmax(a,b) (doublereal)max(a,b)
12952 #define bit_test(a,b) ((a) >> (b) & 1)
12953 #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b)))
12954 #define bit_set(a,b) ((a) | ((uinteger)1 << (b)))
12955
12956
12957
12958 #define F2C_proc_par_types 1
12959 #ifdef __cplusplus
12960 typedef int (*U_fp)(...);
12961 typedef shortint (*J_fp)(...);
12962 typedef integer (*I_fp)(...);
12963 typedef real (*R_fp)(...);
12964 typedef doublereal (*D_fp)(...), (*E_fp)(...);
12965 typedef VOID (*C_fp)(...);
12966 typedef VOID (*Z_fp)(...);
12967 typedef logical (*L_fp)(...);
12968 typedef shortlogical (*K_fp)(...);
12969 typedef VOID (*H_fp)(...);
12970 typedef int (*S_fp)(...);
12971 #else
12972 typedef int (*U_fp)();
12973 typedef shortint (*J_fp)();
12974 typedef integer (*I_fp)();
12975 typedef real (*R_fp)();
12976 typedef doublereal (*D_fp)(), (*E_fp)();
12977 typedef VOID (*C_fp)();
12978 typedef VOID (*Z_fp)();
12979 typedef logical (*L_fp)();
12980 typedef shortlogical (*K_fp)();
12981 typedef VOID (*H_fp)();
12982 typedef int (*S_fp)();
12983 #endif
12984
12985 typedef VOID C_f;
12986 typedef VOID H_f;
12987 typedef VOID Z_f;
12988 typedef doublereal E_f;
12989
12990
12991
12992 #ifndef Skip_f2c_Undefs
12993 #undef cray
12994 #undef gcos
12995 #undef mc68010
12996 #undef mc68020
12997 #undef mips
12998 #undef pdp11
12999 #undef sgi
13000 #undef sparc
13001 #undef sun
13002 #undef sun2
13003 #undef sun3
13004 #undef sun4
13005 #undef u370
13006 #undef u3b
13007 #undef u3b2
13008 #undef u3b5
13009 #undef unix
13010 #undef vax
13011 #endif
13012 #endif
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13026
13027 struct s_blockin_ {
13028 double temp, fnumin, fnumax, dnu;
13029 } blockin_;
13030
13031 #define blockin_1 blockin_
13032
13033 struct s_app3a_ {
13034 double slit, dx, wnrmax3;
13035 } app3a_;
13036
13037 #define app3a_1 app3a_
13038
13039 struct s_app3b_ {
13040 int nsri, ns, nsriup;
13041 } app3b_;
13042
13043 #define app3b_1 app3b_
13044
13045 struct s_rsilo_ {
13046 double rsilo[201];
13047 } rsilo_;
13048
13049 #define rsilo_1 rsilo_
13050
13051 struct s_bou43_ {
13052 int initb;
13053 } bou43_;
13054
13055 #define bou43_1 bou43_
13056
13057 union u_bba_ {
13058 struct s_m_1 {
13059 double omeg[201], rsi[201], rsigg[201], alfa;
13060 } m_1;
13061 struct s_m_2 {
13062 double omeg[201], rsi[201], rsigg[201], beta;
13063 } m_2;
13064 } bba_;
13065
13066 #define bba_1 (bba_.m_1)
13067 #define bba_2 (bba_.m_2)
13068
13069 struct s_bbc_ {
13070 int nsol;
13071 } bbc_;
13072
13073 #define bbc_1 bbc_
13074
13075 struct s_bf_ {
13076 double g0bf, delbf, om0;
13077 } bf_;
13078
13079 #define bf_1 bf_
13080
13081 struct like_1_ {
13082 int like;
13083 char lgas[5];
13084 };
13085
13086 #define like_1 (*(struct like_1_ *) &like_)
13087
13088 struct s_k1k0_ {
13089 int ik1k0;
13090 } k1k0_;
13091
13092 #define k1k0_1 k1k0_
13093
13094 struct s_bbb_ {
13095 int ibound;
13096 } bbb_;
13097
13098 #define bbb_1 bbb_
13099
13100 struct energ_1_ {
13101 double eb[246] ;
13102 int niv[6];
13103 };
13104
13105 #define energ_1 (*(struct energ_1_ *) &energ_)
13106
13107 struct s_dimer_ {
13108 int nlines;
13109 } dimer_;
13110
13111 #define dimer_1 dimer_
13112
13113 struct n2part_1_ {
13114 double q1, wn2[2], b01, d01;
13115 int jrange2;
13116 };
13117 struct n2part_2_ {
13118 double q, wn2[2], b0, d0;
13119 int jrange1;
13120 };
13121
13122 #define n2part_1 (*(struct n2part_1_ *) &n2part_)
13123 #define n2part_2 (*(struct n2part_2_ *) &n2part_)
13124
13125 union u_bl3_ {
13126 struct s_m_1 {
13127 double rsi[401];
13128 } m_1;
13129 struct s_m_2 {
13130 double rsibb[401];
13131 } m_2;
13132 } bl3_;
13133
13134 #define bl3_1 (bl3_.m_1)
13135 #define bl3_2 (bl3_.m_2)
13136
13137 union u_bbbb_ {
13138 struct s_m_1 {
13139 int idelv, iv, ivp, idell, il, ilp;
13140 } m_1;
13141 struct s_m_2 {
13142 int ldelvi, ivi, ivip, ldelel, ll, llp;
13143 } m_2;
13144 } bbbb_;
13145
13146 #define bbbb_1 (bbbb_.m_1)
13147 #define bbbb_2 (bbbb_.m_2)
13148
13149
13150
13151 struct s_energe_ {
13152 double e_1[246];
13153 int e_2[6];
13154 } energ_ = { {-54.99996, -54.86228, -54.58697, -54.17413, -53.62391,
13155 -52.93648, -52.11211, -51.15108, -50.05374, -48.82049, -47.45179,
13156 -45.94815, -44.31014, -42.53841, -40.63365, -38.59665, -36.42824,
13157 -34.12937, -31.70105, -29.14439, -26.46061, -23.65103, -20.71709,
13158 -17.66041, -14.48271, -11.18593, -7.77221, -4.24393, -.60374,
13159 3.14531, 6.99978, 10.95566, 15.00818, 19.15136, 23.37787,
13160 27.67681, 32.03237, 36.42278, 40.83668, 45.29436, 49.79246,
13161 -31.89437, -31.77215, -31.52779, -31.16143, -30.67334, -30.06382,
13162 -29.33328, -28.48222, -27.51123, -26.42099, -25.21229, -23.88603,
13163 -22.44322, -20.88502, -19.21272, -17.42777, -15.53182, -13.52669,
13164 -11.41446, -9.1975, -6.87848, -4.46049, -1.94714, .65736, 3.34788,
13165 6.11816, 8.95978, 11.8613, 14.80383, 17.75924, 20.71774,
13166 23.71589, 0., 0., 0., 0., 0., 0., 0., 0., 0., -16.05019, -15.9464,
13167 -15.73896, -15.42815, -15.0144, -14.4983, -13.88057, -13.16213,
13168 -12.34407, -11.42771, -10.41455, -9.30639, -8.10531, -6.81376,
13169 -5.43459, -3.97121, -2.42768, -.80899, .87859, 2.62689, 4.42334,
13170 6.24733, 8.06983, 9.90464, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13171 0., 0., 0., 0., 0., 0., 0., -6.49343, -6.41131, -6.24732,
13172 -6.00202, -5.67623, -5.27111, -4.78813, -4.22919, -3.59665,
13173 -2.89345, -2.12325, -1.29074, -.40202, .5345, 1.50455, 2.48212,
13174 3.46665, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13175 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.76583, -1.70887,
13176 -1.59552, -1.427, -1.20523, -.93302, -.61434, -.25504, .13641, 0.,
13177 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13178 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13179 -.17133, -.14341, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13180 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
13181 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, {41, 32, 24, 17, 9, 2} }
13182 ;
13183
13184 struct s_n2part_ {
13185 double fill_1[1];
13186 double e_2[4];
13187 int fill_3[1];
13188 } n2part_ = { {0}, {2., 1., 1.98957, 5.8e-6}, {0} };
13189
13190 struct s_like_ {
13191 int fill_1[1];
13192 char e_2[5];
13193 } like_ = { {0}, "N2N2" };
13194
13195
13196
13197
13198
13199
13200
13201 static int cs__1 = 1;
13202 static int cs__0 = 0;
13203 static double c_b24 = 2.9723;
13204 static double c_b25 = -.99569;
13205 static double c_b26 = .09464;
13206 static double c_b27 = 1.2962e-12;
13207 static double c_b28 = -.13048;
13208 static double c_b29 = -.03128;
13209 static double c_b30 = 3.7969e-14;
13210 static double c_b31 = 1.03681;
13211 static double c_b32 = -.14336;
13212 static int cs__2 = 2;
13213 static int cs__3 = 3;
13214 static double c_b43 = .180926;
13215 static double c_b44 = -1.69153;
13216 static double c_b45 = .18605;
13217 static double c_b46 = .3;
13218 static double c_b47 = 0.;
13219 static double c_b49 = 6.6017e-16;
13220 static double c_b50 = 2.59982;
13221 static double c_b51 = -.31831;
13222 static double c_b52 = 1.2481e-12;
13223 static double c_b53 = -.57028;
13224 static double c_b54 = .05983;
13225 static double c_b55 = 5.2681e-13;
13226 static double c_b56 = -.24719;
13227 static double c_b57 = .00519;
13228 static double c_b58 = 2.7518e15;
13229 static double c_b59 = -25.38969;
13230 static double c_b60 = 2.46542;
13231 static int cs__4 = 4;
13232 static int cs__5 = 5;
13233
13234 static double c_b78 = .0825299;
13235 static double c_b79 = -1.25562;
13236 static double c_b80 = .12981;
13237 static double c_b84 = 3.6611e-15;
13238 static double c_b85 = 1.47688;
13239 static double c_b86 = -.16537;
13240 static double c_b87 = 6.1264e-10;
13241 static double c_b88 = -2.25011;
13242 static double c_b89 = .15289;
13243 static double c_b90 = 7.982e-10;
13244 static double c_b91 = -2.76152;
13245 static double c_b92 = .21847;
13246 static double c_b93 = 5.2868e-22;
13247 static double c_b94 = 7.66253;
13248 static double c_b95 = -.77527;
13249 static double c_b112 = 119.261;
13250 static double c_b113 = -3.78587;
13251 static double c_b114 = .34024;
13252 static double c_b115 = 9.3777e-12;
13253 static double c_b116 = -.66548;
13254 static double c_b117 = .0033;
13255 static double c_b118 = 3.0395e-13;
13256 static double c_b119 = .24728;
13257 static double c_b120 = -.06607;
13258 static double c_b183 = 1e-6;
13259 static double c_b186 = 1.5;
13260
13261 #define temp (blockin_1.temp)
13262 #define fnumin (blockin_1.fnumin)
13263 #define fnumax (blockin_1.fnumax)
13264 #define dnu (blockin_1.dnu)
13265 #define slit (app3a_1.slit)
13266 #define dx (app3a_1.dx)
13267 #define rsilo (rsilo_1.rsilo)
13268 #define omeg (bba_1.omeg)
13269 #define rsi (bba_1.rsi)
13270 #define rsigg (bba_1.rsigg)
13271 #define nsol (bbc_1.nsol)
13272 #define like (like_1.like)
13273 #define ik1k0 (k1k0_1.ik1k0)
13274 #define ibound (bbb_1.ibound)
13275
13276
13277 Numeric n2n2tks_(double t, double f)
13278 {
13279
13280 int s__1;
13281 double ret_val;
13282
13283
13284 double hexa[10], quad[10], freq[10], e;
13285 int i__;
13286 double s, x, t1, t2, t3, t4;
13287 int ij, nf, jj;
13288 double rslow1, si;
13289 int nr;
13290 double ss[1], tt[2];
13291 extern int bound32_(double *, double *, int
13292 *), bound54_(double *, double *, int *);
13293 double tksabs[5];
13294 extern int spline_(int *, int *, int *,
13295 double *, double *, double *, double *,
13296 double *, double *, int *, double *);
13297 double dtrans[10], abscoef[10];
13298 extern int addspec_(double *, double *,
13299 double *, double *, double *, double *,
13300 double *, int *, double *, double *, int *,
13301 int *, int *, int *, int *, int *);
13302 double eps, alfatot[10];
13303 extern int partsum_(double *);
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346 ret_val = 0.;
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13374
13375 if (t < 50. || t > 300.) {
13376 ostringstream os;
13377 os << "out of T range ( 50<T<300)! return without calc.!" <<"\n";
13378 throw runtime_error(os.str());
13379 goto L999;
13380 }
13381 temp = t;
13382
13383
13384
13385 fnumin = f / 29979245800.;
13386
13387 fnumax = fnumin;
13388
13389 nf = 1;
13390
13391 dnu = 10.;
13392
13393 like = 1;
13394
13395
13396
13397
13398 slit = 4.3;
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408 partsum_(&temp);
13409
13410
13411
13412
13413
13414 x = log(temp);
13415 s__1 = nf;
13416 for (i__ = 1; i__ <= s__1; ++i__) {
13417
13418 freq[i__ - 1] = fnumin;
13419 alfatot[i__ - 1] = 0.;
13420
13421 abscoef[i__ - 1] = 0.;
13422 }
13423
13424
13425
13426
13427
13428 jj = 1;
13429 L442:
13430
13431 ++jj;
13432 if (jj == 42) {
13433 goto L444;
13434 }
13435 goto L442;
13436
13437 L444:
13438
13439
13440
13441
13442
13443
13444
13445
13446 eps = 1e-5;
13447 tt[0] = 10.;
13448 bound32_(&temp, rsi, &nsol);
13449 ij = 0;
13450 rslow1 = 0.;
13451 s__1 = nsol;
13452 for (i__ = 1; i__ <= s__1; ++i__) {
13453 ++ij;
13454
13455 if (ij % 3 == 0) {
13456 rslow1 = 1.5e-60;
13457 }
13458 if (ij % 3 == 1) {
13459 rslow1 = 1.7e-60;
13460 }
13461 if (ij % 3 == 2) {
13462 rslow1 = 1.6e-60;
13463 }
13464 if (rsi[i__ - 1] < 1e-60) {
13465 rsi[i__ - 1] = rslow1;
13466 }
13467
13468 rsilo[i__ - 1] = log(rsi[i__ - 1]) + log(10.) * 80.;
13469 omeg[i__ - 1] = (double) (i__ - 1) * dx;
13470
13471 }
13472
13473
13474
13475 spline_(&nsol, &cs__1, &cs__0, &eps, omeg, rsilo, tt, ss, &si, &nr, rsigg)
13476 ;
13477
13478 ik1k0 = 1;
13479 ibound = 1;
13480
13481
13482
13483
13484 s = c_b24 * exp((c_b26 * x + c_b25) * x);
13485 t1 = c_b27 * exp((c_b29 * x + c_b28) * x);
13486 t2 = c_b30 * exp((c_b32 * x + c_b31) * x);
13487 e = 0.;
13488 t3 = 0.;
13489 t4 = 0.;
13490
13491 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13492 like, &cs__2, &cs__0, &cs__2, &cs__3);
13493 s__1 = nf;
13494 for (i__ = 1; i__ <= s__1; ++i__) {
13495 quad[i__ - 1] = abscoef[i__ - 1];
13496
13497 alfatot[i__ - 1] = abscoef[i__ - 1] + alfatot[i__ - 1];
13498 }
13499
13500
13501
13502
13503
13504
13505
13506
13507 bound54_(&temp, rsi, &nsol);
13508 ij = 0;
13509 s__1 = nsol;
13510 for (i__ = 1; i__ <= s__1; ++i__) {
13511 ++ij;
13512
13513 if (ij % 3 == 0) {
13514 rslow1 = 1.5e-60;
13515 }
13516 if (ij % 3 == 1) {
13517 rslow1 = 1.7e-60;
13518 }
13519 if (ij % 3 == 2) {
13520 rslow1 = 1.6e-60;
13521 }
13522 if (rsi[i__ - 1] < 1e-60) {
13523 rsi[i__ - 1] = rslow1;
13524 }
13525
13526 rsilo[i__ - 1] = log(rsi[i__ - 1]) + log(10.) * 80.;
13527
13528 omeg[i__ - 1] = (double) (i__ - 1) * dx;
13529 }
13530 spline_(&nsol, &cs__1, &cs__0, &eps, omeg, rsilo, tt, ss, &si, &nr, rsigg)
13531 ;
13532
13533
13534
13535
13536
13537 if (temp >= 140.) {
13538 goto L333;
13539 }
13540
13541 s = c_b43 * exp((c_b45 * x + c_b44) * x);
13542 e = c_b46 * exp((c_b47 * x + c_b47) * x);
13543 t1 = c_b49 * exp((c_b51 * x + c_b50) * x);
13544 t2 = c_b52 * exp((c_b54 * x + c_b53) * x);
13545 t3 = c_b55 * exp((c_b57 * x + c_b56) * x);
13546 t4 = c_b58 * exp((c_b60 * x + c_b59) * x);
13547
13548 ik1k0 = 0;
13549 ibound = 1;
13550 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13551 like, &cs__4, &cs__0, &cs__4, &cs__5);
13552 s__1 = nf;
13553 for (i__ = 1; i__ <= s__1; ++i__) {
13554 hexa[i__ - 1] = abscoef[i__ - 1];
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565 alfatot[i__ - 1] += abscoef[i__ - 1];
13566 }
13567 goto L334;
13568
13569
13570
13571
13572
13573 L333:
13574 ik1k0 = 0;
13575 ibound = 1;
13576 s = c_b78 * exp((c_b80 * x + c_b79) * x);
13577 e = c_b46 * exp((c_b47 * x + c_b47) * x);
13578 t1 = c_b84 * exp((c_b86 * x + c_b85) * x);
13579 t2 = c_b87 * exp((c_b89 * x + c_b88) * x);
13580 t3 = c_b90 * exp((c_b92 * x + c_b91) * x);
13581 t4 = c_b93 * exp((c_b95 * x + c_b94) * x);
13582
13583 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13584 like, &cs__4, &cs__0, &cs__4, &cs__5);
13585 s__1 = nf;
13586 for (i__ = 1; i__ <= s__1; ++i__) {
13587 hexa[i__ - 1] = abscoef[i__ - 1];
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598 alfatot[i__ - 1] += abscoef[i__ - 1];
13599 }
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610 L334:
13611 ik1k0 = 1;
13612 ibound = 0;
13613
13614 s = c_b112 * exp((c_b114 * x + c_b113) * x);
13615 t1 = c_b115 * exp((c_b117 * x + c_b116) * x);
13616 t2 = c_b118 * exp((c_b120 * x + c_b119) * x);
13617 t3 = 0.;
13618 t4 = 0.;
13619 addspec_(&s, &e, &t1, &t2, &t3, &t4, &temp, &nf, freq, abscoef, &cs__0, &
13620 like, &cs__2, &cs__2, &cs__3, &cs__3);
13621 s__1 = nf;
13622 for (i__ = 1; i__ <= s__1; ++i__) {
13623 dtrans[i__ - 1] = abscoef[i__ - 1];
13624
13625 alfatot[i__ - 1] += abscoef[i__ - 1];
13626 }
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13651 tksabs[0] = quad[0];
13652 tksabs[1] = hexa[0];
13653 tksabs[2] = dtrans[0];
13654 tksabs[3] = alfatot[0];
13655 ret_val = alfatot[0];
13656
13657 L999:
13658 return ret_val;
13659 }
13660
13661 #undef temp
13662 #undef fnumin
13663 #undef fnumax
13664 #undef dnu
13665 #undef slit
13666 #undef dx
13667 #undef rsilo
13668 #undef omeg
13669 #undef rsi
13670 #undef rsigg
13671 #undef nsol
13672 #undef like
13673 #undef ik1k0
13674 #undef ibound
13675
13676 #define wnrmax3 (app3a_1.wnrmax3)
13677 #define rsilo (rsilo_1.rsilo)
13678 #define omeg (bba_2.omeg)
13679 #define rsigg (bba_2.rsigg)
13680 #define beta (bba_2.beta)
13681 #define nsol (bbc_1.nsol)
13682 #define ibound (bbb_1.ibound)
13683 #define q1 (n2part_1.q1)
13684 #define wn2 (n2part_1.wn2)
13685 #define b01 (n2part_1.b01)
13686 #define d01 (n2part_1.d01)
13687 #define jrange2 (n2part_1.jrange2)
13688
13689
13690
13691
13692
13693
13694 int addspec_(double *g0, double *ep, double *
13695 tau1, double *tau2, double *tau5, double *tau6,
13696 double *temp, int *nf, double *freq, double *abscoef,
13697 int * , int *like, int *lambda1, int *lambda2,
13698 int *lambda, int * )
13699 {
13700
13701
13702 static double closchm = 2.68675484e19;
13703 static double boltzwn = .6950304;
13704 static double hbar = 1.054588757e-27;
13705 static double pi = 3.1415926535898;
13706 static double clight = 2.997925e10;
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716 int s__1, s__2, s__3, s__4, s__5, s__6;
13717 double d__1, d__2;
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727 int list, jsum;
13728 extern double bgama_(double *, double *, double *,
13729 double *, double *, double *, double *);
13730 int i__, j;
13731 double calib, p;
13732 int i1, j1, i2, j2;
13733 double p1, p2, omega1, omega2;
13734 int ip, jp, iq;
13735 double twopic;
13736 int jplusl, ip1, jp1, ip2, jp2;
13737 double fac, cgs, xbg, wkf, frq, wki;
13738 extern double specfct_(double *, double *, double *,
13739 double *, int *, double *), clebsqr_(int *,
13740 int *, int *);
13741 double cg1s, cg2s;
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759 --abscoef;
13760 --freq;
13761
13762
13763
13764 twopic = 2. * pi * clight;
13765 if (*like != 1) {
13766 *like = 0;
13767 }
13768
13769
13770 d__1 = pi;
13771
13772 d__2 = closchm * 1e-30;
13773 calib = twopic * (d__1 * d__1 * 4. / (hbar * 3. * clight)) * (d__2 * d__2)
13774 ;
13775 calib /= (double) (*like + 1);
13776 beta = 1. / (boltzwn * *temp);
13777 list = *nf;
13778 s__1 = list;
13779 for (i__ = 1; i__ <= s__1; ++i__) {
13780
13781 abscoef[i__] = 0.;
13782 }
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801 if (*lambda1 == 0 || *lambda2 == 0) {
13802 goto L152;
13803 }
13804 jplusl = jrange2 + max(*lambda1,*lambda2);
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814 jsum = 0;
13815 s__1 = jrange2;
13816 for (i1 = 1; i1 <= s__1; ++i1) {
13817 j1 = i1 - 1;
13818 s__2 = jplusl;
13819 for (ip1 = 1; ip1 <= s__2; ++ip1) {
13820 jp1 = ip1 - 1;
13821 cg1s = clebsqr_(&j1, lambda1, &jp1);
13822 if (cg1s <= 0.) {
13823 goto L150;
13824 } else {
13825 goto L130;
13826 }
13827 L130:
13828 s__3 = j1 * (j1 + 1);
13829 p1 = (double) (2 * j1 + 1) * wn2[1 + j1 % 2 - 1] * exp(
13830 -1.4387859 / *temp * ((b01 - (double) s__3 * d01) * (
13831 double) s__3)) / q1;
13832 ++jsum;
13833 s__3 = jp1 * ip1;
13834 s__4 = j1 * i1;
13835 omega1 = (b01 - (double) s__3 * d01) * (double) s__3 - (
13836 b01 - (double) s__4 * d01) * (double) s__4;
13837 s__3 = jrange2;
13838 for (i2 = 1; i2 <= s__3; ++i2) {
13839 j2 = i2 - 1;
13840 s__4 = jplusl;
13841 for (ip2 = 1; ip2 <= s__4; ++ip2) {
13842 jp2 = ip2 - 1;
13843 cg2s = clebsqr_(&j2, lambda2, &jp2);
13844 if (cg2s <= 0.) {
13845 goto L148;
13846 } else {
13847 goto L132;
13848 }
13849 L132:
13850 s__5 = j2 * (j2 + 1);
13851 p2 = (double) (2 * j2 + 1) * wn2[1 + j2 % 2 - 1] *
13852 exp(-1.4387859 / *temp * ((b01 - (double)
13853 s__5 * d01) * (double) s__5)) / q1;
13854 s__5 = jp2 * ip2;
13855 s__6 = j2 * i2;
13856 omega2 = (b01 - (double) s__5 * d01) * (double)
13857 s__5 - (b01 - (double) s__6 * d01) * (
13858 double) s__6;
13859 fac = calib * p1 * p2 * cg1s * cg2s;
13860 s__5 = list;
13861 for (i__ = 1; i__ <= s__5; ++i__) {
13862 frq = freq[i__] - omega1 - omega2;
13863 wki = freq[i__] * (1. - exp(-beta * freq[i__]));
13864 wkf = wki * fac;
13865 xbg = *g0 * bgama_(&frq, tau1, tau2, ep, tau5, tau6,
13866 temp);
13867 if (ibound == 0) {
13868 goto L555;
13869 }
13870 if (abs(frq) <= wnrmax3) {
13871 xbg += specfct_(&frq, omeg, rsilo, rsigg, &nsol, &
13872 beta);
13873 }
13874 L555:
13875 abscoef[i__] += xbg * wkf;
13876
13877 }
13878 L148:
13879 ;
13880 }
13881 }
13882 L150:
13883 ;
13884 }
13885 }
13886 goto L2222;
13887
13888
13889 L152:
13890 jplusl = jrange2 + *lambda;
13891 s__2 = jrange2;
13892 for (i__ = 1; i__ <= s__2; ++i__) {
13893 j = i__ - 1;
13894 s__1 = jplusl;
13895 for (ip = 1; ip <= s__1; ++ip) {
13896 jp = ip - 1;
13897 cgs = clebsqr_(&j, lambda, &jp);
13898 if (cgs <= 0.) {
13899 goto L200;
13900 } else {
13901 goto L210;
13902 }
13903 L210:
13904 s__4 = j * (j + 1);
13905 p = (double) (2 * j + 1) * wn2[1 + j % 2 - 1] * exp(
13906 -1.4387859 / *temp * ((b01 - (double) s__4 * d01) * (
13907 double) s__4)) / q1;
13908 ++jsum;
13909 s__4 = jp * ip;
13910 s__3 = j * i__;
13911 omega1 = (b01 - (double) s__4 * d01) * (double) s__4 - (
13912 b01 - (double) s__3 * d01) * (double) s__3;
13913 fac = calib * p * cgs;
13914 s__4 = list;
13915 for (iq = 1; iq <= s__4; ++iq) {
13916 frq = freq[iq] - omega1;
13917
13918 wki = freq[iq] * (1. - exp(-beta * freq[iq]));
13919 wkf = wki * fac;
13920 xbg = *g0 * bgama_(&frq, tau1, tau2, ep, tau5, tau6, temp);
13921 if (ibound == 0) {
13922 goto L444;
13923 }
13924 if (abs(frq) <= wnrmax3) {
13925 xbg += specfct_(&frq, omeg, rsilo, rsigg, &nsol, &beta);
13926 }
13927 L444:
13928 abscoef[iq] += xbg * wkf;
13929
13930 }
13931 L200:
13932 ;
13933 }
13934 }
13935
13936 L2222:
13937
13938
13939 return 0;
13940 }
13941
13942 #undef wnrmax3
13943 #undef rsilo
13944 #undef omeg
13945 #undef rsigg
13946 #undef beta
13947 #undef nsol
13948 #undef ibound
13949 #undef q1
13950 #undef wn2
13951 #undef b01
13952 #undef d01
13953 #undef jrange2
13954
13955 #define q (n2part_2.q)
13956 #define wn2 (n2part_2.wn2)
13957 #define b0 (n2part_2.b0)
13958 #define d0 (n2part_2.d0)
13959 #define jrange1 (n2part_2.jrange1)
13960
13961 int partsum_(double *temp)
13962 {
13963
13964 int s__1;
13965
13966
13967 int j;
13968 double dq;
13969
13970
13971
13972
13973
13974
13975 q = 0.;
13976 j = 0;
13977 L50:
13978 s__1 = j * (j + 1);
13979 dq = (double) (2 * j + 1) * wn2[1 + j % 2 - 1] * exp(-1.4387859 * ((
13980 b0 - (double) s__1 * d0) * (double) s__1) / *temp);
13981 q += dq;
13982 ++j;
13983 if (dq > q / 900.) {
13984 goto L50;
13985 }
13986 jrange1 = j;
13987
13988
13989
13990 return 0;
13991 }
13992
13993 #undef q
13994 #undef wn2
13995 #undef b0
13996 #undef d0
13997 #undef jrange1
13998
13999 #define slit (app3a_1.slit)
14000 #define dx (app3a_1.dx)
14001 #define wnrmax3 (app3a_1.wnrmax3)
14002 #define nsri (app3b_1.nsri)
14003 #define ns (app3b_1.ns)
14004 #define nsriup (app3b_1.nsriup)
14005 #define rsi (bl3_1.rsi)
14006
14007 int profile_(double *x, double *y)
14008 {
14009
14010 int s__1;
14011
14012
14013 int i__;
14014 double slope;
14015 int n1;
14016 double x0;
14017 int nc;
14018 double dr;
14019 int no;
14020 double xi;
14021 int nu;
14022
14023
14024
14025
14026
14027
14028 if (*y < 0.) {
14029 goto L105;
14030 } else if (*y == 0) {
14031 goto L106;
14032 } else {
14033 goto L1;
14034 }
14035 L1:
14036 x0 = nsri + 1. + *x / dx;
14037 nc = (int) x0;
14038 n1 = nc + 1;
14039 slope = *y / slit;
14040 nu = (int) (x0 - ns);
14041 if (nu < 1) {
14042 nu = 1;
14043 }
14044 if (nu > nsriup) {
14045 return 0;
14046 }
14047 no = (int) (x0 + ns);
14048 if (no > nsriup) {
14049 no = nsriup;
14050 }
14051 if (no < 1) {
14052 return 0;
14053 }
14054 if (nc > nsriup) {
14055 nc = nsriup;
14056 }
14057 if (nc <= 1) {
14058 goto L101;
14059 }
14060 s__1 = nc;
14061 for (i__ = nu; i__ <= s__1; ++i__) {
14062 xi = (i__ - 1.) * dx - wnrmax3;
14063 dr = slope * (xi - (*x - slit));
14064 if (dr <= 0.) {
14065 goto L100;
14066 }
14067 rsi[i__ - 1] += dr;
14068 L100:
14069 ;
14070 }
14071 L101:
14072
14073 if (nc >= nsriup) {
14074 return 0;
14075 }
14076 if (n1 < 1) {
14077 n1 = 1;
14078 }
14079 s__1 = no;
14080 for (i__ = n1; i__ <= s__1; ++i__) {
14081 xi = (i__ - 1.) * dx - wnrmax3;
14082 dr = *y - slope * (xi - *x);
14083 if (dr <= 0.) {
14084 goto L102;
14085 }
14086 rsi[i__ - 1] += dr;
14087 L102:
14088 ;
14089 }
14090 return 0;
14091 L105:
14092
14093
14094
14095 L106:
14096 return 0;
14097 }
14098
14099 #undef slit
14100 #undef dx
14101 #undef wnrmax3
14102 #undef nsri
14103 #undef ns
14104 #undef nsriup
14105 #undef rsi
14106
14107
14108
14109
14110 double specfct_(double *freq, double *omega, double *phi,
14111 double *phi2, int *n, double *rtemp)
14112 {
14113
14114 double ret_val;
14115
14116
14117 double tfac, f, gp, si;
14118 int nr;
14119 extern int ixpolat_(int *, int *, int *,
14120 double *, double *, double *, double *,
14121 double *, double *, int *, double *);
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134
14135
14136
14137
14138
14139
14140 --phi2;
14141 --phi;
14142 --omega;
14143
14144
14145 tfac = 0.;
14146 f = *freq;
14147 if (f >= 0.) {
14148 goto L20;
14149 } else {
14150 goto L10;
14151 }
14152 L10:
14153 f = abs(f);
14154 tfac = -(*rtemp) * f;
14155 L20:
14156 if (f <= omega[*n]) {
14157 goto L30;
14158 }
14159 ret_val = exp(-(phi[*n - 1] - phi[*n]) * (f - omega[*n]) / (omega[*n] -
14160 omega[*n - 1]) + phi[*n] + tfac) * 1e-80;
14161
14162
14163
14164 return ret_val;
14165
14166
14167
14168 L30:
14169 ixpolat_(n, &cs__1, &cs__0, &c_b183, &omega[1], &phi[1], &f, &gp, &si, &
14170 nr, &phi2[1]);
14171 ret_val = exp(tfac + gp) * 1e-80;
14172
14173
14174
14175 return ret_val;
14176 }
14177 #define slit (app3a_1.slit)
14178 #define dx (app3a_1.dx)
14179 #define wnrmax3 (app3a_1.wnrmax3)
14180 #define nsri (app3b_1.nsri)
14181 #define ns (app3b_1.ns)
14182 #define nsriup (app3b_1.nsriup)
14183 #define eb (energ_1.eb)
14184 #define niv (energ_1.niv)
14185 #define nlines (dimer_1.nlines)
14186 #define rsibb (bl3_2.rsibb)
14187 #define ldelvi (bbbb_2.ldelvi)
14188 #define ivi (bbbb_2.ivi)
14189 #define ivip (bbbb_2.ivip)
14190 #define ldelel (bbbb_2.ldelel)
14191 #define ll (bbbb_2.ll)
14192 #define llp (bbbb_2.llp)
14193
14194 int bound32_(double *temp, double *rsi, int *
14195 nsol)
14196 {
14197
14198
14199 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,
14200 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,
14201 3,4,4,4,4,4,4,4,4 };
14202 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,
14203 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,
14204 0,1,0,1,0,1,0,1 };
14205 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,
14206 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,
14207 4,5,4,5,4,5,4,5 };
14208 static int ldelels[63] = { 1,3,1,3,1,3,1,3,1,3,-3,-1,1,3,-3,-1,1,3,
14209 -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,
14210 -1,-1,-1,-3,-3,3,3,-3,-3,-3,-3,-3,3,3,1,1,-1,-1 };
14211 static double as[63] = { 4.4844e-40,4.4356e-40,2.9345e-40,2.885e-40,
14212 1.6441e-40,1.5899e-40,7.2882e-41,6.7748e-41,1.0378e-41,1.3041e-42,
14213 1.5006e-41,1.537e-41,1.6139e-41,1.7143e-41,1.9985e-41,2.0169e-41,
14214 2.0994e-41,2.2094e-41,1.636e-41,1.6281e-41,1.6714e-41,1.7326e-41,
14215 8.0425e-42,8.0862e-42,8.0093e-42,8.1366e-42,2.4471e-42,2.5406e-42,
14216 2.6629e-42,2.8064e-42,4.6227e-42,4.715e-42,4.8513e-42,5.0133e-42,
14217 3.9968e-42,3.984e-42,3.981e-42,3.9687e-42,1.1806e-42,1.3458e-42,
14218 3.8746e-42,3.9219e-42,7.3334e-43,1.339e-42,1.3041e-42,7.1401e-43,
14219 1.3461e-42,6.5776e-43,6.9847e-43,1.3517e-42,7.5545e-43,1.3268e-42,
14220 6.9847e-43,1.3517e-42,7.464e-43,2.1322e-43,2.6037e-43,2.0823e-43,
14221 2.0632e-43,2.1067e-43,2.0531e-43,2.1218e-43,2.3006e-43 };
14222 static double bs[63] = { 4.3e-4,4.6e-4,8.3e-4,8.9e-4,.0017,.00186,
14223 .0041,.00457,0.,0.,9.99e-4,5.23e-4,1.49e-4,-1.68e-4,.001837,
14224 .001153,6.6e-4,2.54e-4,.003603,.002677,.002101,.001738,.00595,
14225 .006843,0.,.007035,.001025,6.42e-4,2.54e-4,-1.64e-4,.002342,
14226 .001975,.00164,.001328,.004943,.004999,.005461,.006839,0.,.010993,
14227 0.,0.,.001367,.005262,0.,.001601,.00451,0.,.001828,.004175,.04816,
14228 .007033,.001828,.004175,.009338,.003733,.008508,.006979,0.,
14229 .005035,0.,.004169,0. };
14230 static double twopic = 1.88365183e11;
14231 static double pi = 3.141592654;
14232
14233
14234 int s__1;
14235 double d__1;
14236
14237
14238 double alfa;
14239 int nnii, nsol2;
14240 double a, b;
14241 int i__, l, n;
14242 double stoke, stoki, am, pf;
14243 int lp;
14244 double rm;
14245 int nr, iv;
14246 double stokip;
14247 int ivp;
14248 extern double clebsqr_(int *, int *, int *);
14249 extern int profile_(double *, double *);
14250
14251
14252 #define eb_ref(a_1,a_2) eb[(a_2)*41 + a_1 - 42]
14253
14254
14255
14256
14257
14258
14259
14260
14261 --rsi;
14262
14263
14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277 nsri = 190;
14278 wnrmax3 = 45.;
14279 nsriup = (nsri << 1) + 1;
14280 dx = wnrmax3 / (double) nsri;
14281 ns = (int) (slit / dx);
14282
14283 for (i__ = 1; i__ <= 401; ++i__) {
14284
14285 rsibb[i__ - 1] = 0.;
14286 }
14287
14288 alfa = 1. / (*temp * .69519);
14289 rm = 2.32498211e-23;
14290
14291
14292 d__1 = rm * 1.380662e-16 * *temp * 2. * pi / 4.3906208382975998e-53;
14293 pf = pow(d__1, c_b186);
14294
14295 pf *= 1e-60;
14296
14297 nr = 0;
14298 L555:
14299 ++nr;
14300 ldelvi = ldelvis[nr - 1];
14301 ivi = ivis[nr - 1];
14302 ivip = ivips[nr - 1];
14303 ldelel = ldelels[nr - 1];
14304 a = as[nr - 1];
14305 b = bs[nr - 1];
14306
14307
14308
14309
14310
14311
14312
14313 iv = ivi + 1;
14314 ivp = ivip + 1;
14315
14316
14317 nnii = niv[iv - 1];
14318
14319 s__1 = nnii;
14320 for (l = 1; l <= s__1; ++l) {
14321
14322
14323 am = a * exp(-b * (double) ((l - 1) * l));
14324
14325 lp = l + ldelel;
14326 ll = l - 1;
14327 llp = lp - 1;
14328
14329
14330 if (lp > niv[ivp - 1] || lp < 1) {
14331 goto L20;
14332 }
14333 if (eb_ref(lp, ivp) == 0.) {
14334 goto L20;
14335 }
14336 if (eb_ref(l, iv) == 0.) {
14337 goto L20;
14338 }
14339 stoke = eb_ref(lp, ivp) - eb_ref(l, iv);
14340
14341 stoki = am * exp(-alfa * eb_ref(l, iv)) / pf * (double) ((ll << 1)
14342 + 1) * clebsqr_(&ll, &cs__3, &llp);
14343
14344 profile_(&stoke, &stoki);
14345 if (stoki > 0.) {
14346 ++nlines;
14347 }
14348
14349 stokip = am * exp(-alfa * eb_ref(lp, ivp)) / pf * (double) ((llp
14350 << 1) + 1) * clebsqr_(&llp, &cs__3, &ll);
14351
14352 d__1 = -stoke;
14353 profile_(&d__1, &stokip);
14354 if (stokip > 0.) {
14355 ++nlines;
14356 }
14357
14358 L20:
14359 ;
14360 }
14361 if (nr == 63) {
14362 goto L56;
14363 }
14364 goto L555;
14365 L56:
14366
14367
14368
14369
14370 s__1 = nsriup;
14371 for (n = 1; n <= s__1; ++n) {
14372
14373 rsibb[n - 1] = rsibb[n - 1] / twopic / slit;
14374 }
14375
14376 *nsol = nsri + 1;
14377 nsol2 = *nsol + 1;
14378
14379
14380 s__1 = *nsol;
14381 for (i__ = 1; i__ <= s__1; ++i__) {
14382
14383 rsi[i__] = rsibb[*nsol - 1 + i__ - 1];
14384 }
14385
14386
14387
14388
14389 return 0;
14390 }
14391
14392 #undef slit
14393 #undef dx
14394 #undef wnrmax3
14395 #undef nsri
14396 #undef ns
14397 #undef nsriup
14398 #undef eb
14399 #undef niv
14400 #undef nlines
14401 #undef rsibb
14402 #undef ldelvi
14403 #undef ivi
14404 #undef ivip
14405 #undef ldelel
14406 #undef ll
14407 #undef llp
14408
14409
14410 #undef eb_ref
14411
14412 #define slit (app3a_1.slit)
14413 #define dx (app3a_1.dx)
14414 #define wnrmax3 (app3a_1.wnrmax3)
14415 #define nsri (app3b_1.nsri)
14416 #define ns (app3b_1.ns)
14417 #define nsriup (app3b_1.nsriup)
14418 #define eb (energ_1.eb)
14419 #define niv (energ_1.niv)
14420 #define nlines (dimer_1.nlines)
14421 #define rsibb (bl3_2.rsibb)
14422
14423 int bound54_(double *temp, double *rsi, int *
14424 nsol)
14425 {
14426
14427
14428 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,
14429 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
14430 };
14431 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,
14432 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 };
14433 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,
14434 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 };
14435 static int ldelels[54] = { 1,3,5,1,3,5,1,3,5,1,3,5,-5,-3,-1,1,3,5,-5,
14436 -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,
14437 1,3,5,-5,-3,-1,1,3,5 };
14438 static double as[54] = { 7.9332e-42,7.8207e-42,7.7235e-42,4.5815e-42,
14439 4.4834e-42,4.4059e-42,2.173e-42,2.0824e-42,2.025e-42,7.7222e-43,
14440 7.0351e-43,6.6815e-43,4.9611e-43,5.2232e-43,5.2979e-43,5.4652e-43,
14441 5.6827e-43,5.9277e-43,5.733e-43,6.062e-43,6.0862e-43,6.2104e-43,
14442 6.3809e-43,6.5698e-43,3.9501e-43,4.1599e-43,4.1033e-43,4.1097e-43,
14443 4.1339e-43,4.153e-43,1.5858e-43,1.5976e-43,1.5478e-43,1.5066e-43,
14444 1.4554e-43,1.3848e-43,9.9241e-44,1.0109e-43,1.0396e-43,1.0758e-43,
14445 1.1176e-43,1.1636e-43,1.646e-43,1.647e-43,1.6617e-43,1.6837e-43,
14446 1.7085e-43,1.7327e-43,1.1797e-43,1.1593e-43,1.1405e-43,1.1174e-43,
14447 1.0853e-43,1.0401e-43 };
14448 static double bs[54] = { 6.12e-4,6.35e-4,6.77e-4,.001137,.001201,
14449 .001341,.00229,.002449,.00287,.005426,.005876,.00745,.001,8.83e-4,
14450 6.09e-4,3.92e-4,2.07e-4,3.7e-5,.001625,.001624,.001305,.001084,
14451 9.27e-4,8.21e-4,.002978,.003273,.002994,.002954,.003153,.003668,
14452 .005799,.006423,.006733,.00796,.010937,.019179,.001229,9.93e-4,
14453 7.67e-4,5.43e-4,3.09e-4,5.1e-5,.002456,.0023,.00221,.002193,
14454 .002273,.002506,.004556,.004825,.005454,.006725,.009431,.016672 };
14455 static double twopic = 1.88365183e11;
14456 static double pi = 3.141592654;
14457
14458
14459 int s__1;
14460 double d__1;
14461
14462
14463 double alfa;
14464 int nnii, ivip, nsol2;
14465 double a, b;
14466 int i__, l, n;
14467 double stoke, stoki, am, pf;
14468 int ll, lp;
14469 double rm;
14470 int nr, ldelel, iv, ldelvi;
14471 double stokip;
14472 int ivi, llp, ivp;
14473 extern double clebsqr_(int *, int *, int *);
14474 extern int profile_(double *, double *);
14475
14476
14477 #define eb_ref(a_1,a_2) eb[(a_2)*41 + a_1 - 42]
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490 --rsi;
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501 nsri = 190;
14502 wnrmax3 = 47.;
14503 nsriup = (nsri << 1) + 1;
14504 dx = wnrmax3 / (double) nsri;
14505 ns = (int) (slit / dx);
14506
14507 for (i__ = 1; i__ <= 401; ++i__) {
14508
14509 rsibb[i__ - 1] = 0.;
14510 }
14511 alfa = 1. / (*temp * .69519);
14512 rm = 2.32498211e-23;
14513
14514
14515 d__1 = rm * 1.380662e-16 * *temp * 2. * pi / 4.3906208382975998e-53;
14516 pf = pow(d__1, c_b186);
14517
14518 pf *= 1e-60;
14519
14520 nr = 0;
14521 L555:
14522 ++nr;
14523 ldelvi = ldelvis[nr - 1];
14524 ivi = ivis[nr - 1];
14525 ivip = ivips[nr - 1];
14526 ldelel = ldelels[nr - 1];
14527 a = as[nr - 1];
14528 b = bs[nr - 1];
14529
14530
14531
14532
14533
14534
14535 iv = ivi + 1;
14536 ivp = ivip + 1;
14537 nnii = niv[iv - 1];
14538 s__1 = nnii;
14539 for (l = 1; l <= s__1; ++l) {
14540 am = a * exp(-b * (double) (l * (l + 1)));
14541 lp = l + ldelel;
14542 ll = l - 1;
14543 llp = lp - 1;
14544 if (lp > niv[ivp - 1] || lp < 1) {
14545 goto L20;
14546 }
14547 if (eb_ref(lp, ivp) == 0.) {
14548 goto L20;
14549 }
14550 if (eb_ref(l, iv) == 0.) {
14551 goto L20;
14552 }
14553
14554 stoke = eb_ref(lp, ivp) - eb_ref(l, iv);
14555 stoki = am * exp(-alfa * eb_ref(l, iv)) / pf * (double) ((ll << 1)
14556 + 1) * clebsqr_(&ll, &cs__5, &llp);
14557 profile_(&stoke, &stoki);
14558 if (stoki > 0.) {
14559 ++nlines;
14560 }
14561 stokip = am * exp(-alfa * eb_ref(lp, ivp)) / pf * (double) ((llp
14562 << 1) + 1) * clebsqr_(&llp, &cs__5, &ll);
14563 d__1 = -stoke;
14564 profile_(&d__1, &stokip);
14565 if (stokip > 0.) {
14566 ++nlines;
14567 }
14568 L20:
14569 ;
14570 }
14571 if (nr == 54) {
14572 goto L56;
14573 }
14574
14575 goto L555;
14576 L56:
14577
14578
14579 s__1 = nsriup;
14580 for (n = 1; n <= s__1; ++n) {
14581
14582 rsibb[n - 1] = rsibb[n - 1] / twopic / slit;
14583 }
14584
14585 *nsol = nsri + 1;
14586 nsol2 = *nsol + 1;
14587
14588 s__1 = *nsol;
14589 for (i__ = 1; i__ <= s__1; ++i__) {
14590
14591 rsi[i__] = rsibb[*nsol - 1 + i__ - 1];
14592 }
14593
14594
14595
14596
14597 return 0;
14598 }
14599
14600 #undef slit
14601 #undef dx
14602 #undef wnrmax3
14603 #undef nsri
14604 #undef ns
14605 #undef nsriup
14606 #undef eb
14607 #undef niv
14608 #undef nlines
14609 #undef rsibb
14610
14611
14612 #undef eb_ref
14613
14614
14615 double clebsqr_0_(int n__, int *l, int *lambda, int *lp)
14616 {
14617
14618 int s__1, s__2;
14619 double ret_val, d__1;
14620
14621
14622 extern double fctl_(int *);
14623 double f;
14624 int i__;
14625 double p;
14626 int i0, i1;
14627 double fc;
14628
14629
14630
14631
14632
14633
14634 switch(n__) {
14635 case 1: goto L_threej2;
14636 }
14637
14638 fc = (double) ((*lp << 1) + 1);
14639 goto L2;
14640
14641
14642 L_threej2:
14643
14644
14645
14646
14647
14648
14649
14650
14651 fc = 1.;
14652 L2:
14653 ret_val = 0.;
14654 if (*l + *lambda < *lp || *lambda + *lp < *l || *l + *lp < *lambda) {
14655 return ret_val;
14656 }
14657 if ((*l + *lp + *lambda) % 2 != 0) {
14658 return ret_val;
14659 }
14660 if (*l < 0 || *lp < 0 || *lambda < 0) {
14661 return ret_val;
14662 }
14663 f = 1. / (double) (*l + *lp + 1 - *lambda);
14664 if (*lambda == 0) {
14665 goto L22;
14666 }
14667 i1 = (*l + *lp + *lambda) / 2;
14668 i0 = (*l + *lp - *lambda) / 2 + 1;
14669 s__1 = i1;
14670 for (i__ = i0; i__ <= s__1; ++i__) {
14671
14672 f = f * (double) i__ / (double) ((i__ << 1) + 1 << 1);
14673 }
14674 L22:
14675 s__1 = *lambda + *l - *lp;
14676 s__2 = *lambda + *lp - *l;
14677 p = fc * f * fctl_(&s__1) * fctl_(&s__2);
14678 s__1 = (*lambda + *l - *lp) / 2;
14679 s__2 = (*lambda + *lp - *l) / 2;
14680
14681 d__1 = fctl_(&s__1) * fctl_(&s__2);
14682 ret_val = p / (d__1 * d__1);
14683 return ret_val;
14684 }
14685
14686 double clebsqr_(int *l, int *lambda, int *lp)
14687 {
14688 return clebsqr_0_(0, l, lambda, lp);
14689 }
14690
14691 double threej2_(void)
14692 {
14693 return clebsqr_0_(1, (int *)0, (int *)0, (int *)0);
14694 }
14695
14696 double fctl_(int *n)
14697 {
14698
14699 int s__1;
14700 double ret_val, d__1;
14701
14702
14703 int i__, j;
14704 double z__;
14705
14706
14707
14708 ret_val = 1.;
14709 if (*n <= 1) {
14710 return ret_val;
14711 }
14712 if (*n > 15) {
14713 goto L20;
14714 }
14715 j = 1;
14716 s__1 = *n;
14717 for (i__ = 2; i__ <= s__1; ++i__) {
14718
14719 j *= i__;
14720 }
14721 ret_val = (double) j;
14722 return ret_val;
14723 L20:
14724 z__ = (double) (*n + 1);
14725 d__1 = z__ - .5;
14726 ret_val = exp(-z__) * pow(z__, d__1) * ((((-2.294720936e-4 / z__ -
14727 .00268132716) / z__ + .003472222222) / z__ + .08333333333) / z__
14728 + 1.) * 2.506628274631;
14729 return ret_val;
14730 }
14731 #define ik1k0 (k1k0_1.ik1k0)
14732
14733 double bgama_(double *fnu, double *t1, double *t2, double
14734 *eps, double *t3, double *t4, double *temp)
14735 {
14736
14737
14738 static double pi = 3.1415926535898;
14739 static double clight = 29979245800.;
14740 static double hbar = 1.0545887e-27;
14741 static double boltz = 1.380662e-16;
14742
14743
14744 double ret_val, d__1, d__2, d__3, d__4;
14745
14746
14747 double omega, z__, k0, t0, bgambc, zp, xk1;
14748
14749
14750
14751
14752
14753
14754
14755
14756
14757 omega = 2. * pi * clight * *fnu;
14758 t0 = hbar / (boltz * 2. * *temp);
14759
14760 d__1 = omega * *t1;
14761 z__ = sqrt((d__1 * d__1 + 1.) * (*t2 * *t2 + t0 * t0)) / *t1;
14762 if (z__ - 2. <= 0.) {
14763 goto L10;
14764 } else {
14765 goto L12;
14766 }
14767 L10:
14768
14769 d__2 = z__ / 3.75;
14770 d__1 = d__2 * d__2;
14771
14772 d__4 = z__ / 2.;
14773 d__3 = d__4 * d__4;
14774 xk1 = z__ * z__ * log(z__ / 2.) * ((((((3.2411e-4 * d__1 + .00301532) *
14775 d__1 + .02658733) * d__1 + .15084934) * d__1 + .51498869) * d__1
14776 + .87890594) * d__1 + .5) + ((((((-4.686e-5 * d__3 - .00110404) *
14777 d__3 - .01919402) * d__3 - .18156897) * d__3 - .67278579) * d__3
14778 + .15443144) * d__3 + 1.);
14779 goto L20;
14780 L12:
14781 d__1 = 2. / z__;
14782 xk1 = sqrt(z__) * exp(-z__) * ((((((-6.8245e-4 * d__1 + .00325614) * d__1
14783 - .00780353) * d__1 + .01504268) * d__1 - .0365562) * d__1 +
14784 .23498619) * d__1 + 1.25331414);
14785 L20:
14786
14787 d__1 = *t1 * omega;
14788 bgambc = *t1 / pi * exp(*t2 / *t1 + t0 * omega) * xk1 / (d__1 * d__1 + 1.)
14789 ;
14790 if (ik1k0 == 1) {
14791 goto L55;
14792 }
14793
14794 d__1 = omega * *t4;
14795 zp = sqrt((d__1 * d__1 + 1.) * (*t3 * *t3 + t0 * t0)) / *t4;
14796 if (zp - 2. <= 0.) {
14797 goto L22;
14798 } else {
14799 goto L24;
14800 }
14801 L22:
14802
14803 d__2 = zp / 3.75;
14804 d__1 = d__2 * d__2;
14805
14806 d__4 = zp / 2.;
14807 d__3 = d__4 * d__4;
14808 k0 = -log(zp / 2.) * ((((((.0045813 * d__1 + .0360768) * d__1 + .2659732)
14809 * d__1 + 1.2067492) * d__1 + 3.0899424) * d__1 + 3.5156229) *
14810 d__1 + 1.) + ((((((7.4e-6 * d__3 + 1.075e-4) * d__3 + .00262698) *
14811 d__3 + .0348859) * d__3 + .23069756) * d__3 + .4227842) * d__3 -
14812 .57721566);
14813 goto L30;
14814 L24:
14815 d__1 = 2. / zp;
14816 k0 = exp(-zp) * ((((((5.3208e-4 * d__1 - .0025154) * d__1 + .00587872) *
14817 d__1 - .01062446) * d__1 + .02189568) * d__1 - .07832358) * d__1
14818 + 1.25331414) / sqrt(zp);
14819 L30:
14820 ret_val = (bgambc + *eps * (*t3 / pi) * exp(*t3 / *t4 + t0 * omega) * k0)
14821 / (*eps + 1.);
14822 goto L66;
14823 L55:
14824 ret_val = bgambc;
14825 L66:
14826 return ret_val;
14827 }
14828
14829 #undef ik1k0
14830
14831
14832 int spline_0_(int n__, int *l, int *m, int *k,
14833 double *eps, double *x, double *y, double *t,
14834 double *ss, double *si, int *nr, double *s2)
14835 {
14836
14837 int s__1, s__2;
14838 double d__1, d__2;
14839
14840
14841 double epsi, prod, h__;
14842 int i__, j, n;
14843 double w, omega;
14844 int n1;
14845 double s3;
14846 int ic;
14847 double sm, delsqs, ht1, ht2, ss2, yp1, eta, ypn;
14848
14849
14850
14851
14852
14853
14854
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866 --x;
14867 --y;
14868 --t;
14869 --ss;
14870 --s2;
14871
14872
14873 switch(n__) {
14874 case 1: goto L_ixpolat;
14875 }
14876
14877 n = *l;
14878 n1 = n - 1;
14879 *nr = 0;
14880
14881 s__1 = n1;
14882 for (i__ = 2; i__ <= s__1; ++i__) {
14883
14884 s__2 = i__ - 1;
14885 s2[i__] = 3. * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) - (y[
14886 s__2 + 1] - y[s__2]) / (x[s__2 + 1] - x[s__2])) / (x[i__ + 1]
14887 - x[i__ - 1]) / 1.5;
14888 }
14889 omega = 1.0717968;
14890 ic = 0;
14891
14892 s2[1] = 0.;
14893 s2[n] = 0.;
14894 L5:
14895 eta = 0.;
14896 ++ic;
14897 sm = abs(s2[1]);
14898 s__2 = n;
14899 for (i__ = 2; i__ <= s__2; ++i__) {
14900 if ((d__1 = s2[i__], abs(d__1)) > sm) {
14901 sm = (d__2 = s2[i__], abs(d__2));
14902 }
14903
14904 }
14905 epsi = *eps * sm;
14906
14907 s__2 = n1;
14908 for (i__ = 2; i__ <= s__2; ++i__) {
14909
14910 s__1 = i__ - 1;
14911 w = (3. * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) - (y[s__1 +
14912 1] - y[s__1]) / (x[s__1 + 1] - x[s__1])) / (x[i__ + 1] - x[
14913 i__ - 1]) - (x[i__] - x[i__ - 1]) * .5 / (x[i__ + 1] - x[i__
14914 - 1]) * s2[i__ - 1] - (.5 - (x[i__] - x[i__ - 1]) * .5 / (x[
14915 i__ + 1] - x[i__ - 1])) * s2[i__ + 1] - s2[i__]) * omega;
14916
14917 if (abs(w) - eta <= 0.) {
14918 goto L10;
14919 } else {
14920 goto L9;
14921 }
14922 L9:
14923 eta = abs(w);
14924 L10:
14925 s2[i__] += w;
14926 }
14927
14928 if (eta - epsi >= 0.) {
14929 goto L5;
14930 } else {
14931 goto L14;
14932 }
14933
14934
14935 L_ixpolat:
14936
14937
14938 n = *l;
14939 n1 = n - 1;
14940 *nr = 0;
14941 ic = -1;
14942 L14:
14943 if (*k - 2 != 0) {
14944 goto L15;
14945 } else {
14946 goto L20;
14947 }
14948 L15:
14949 s__2 = *m;
14950 for (j = 1; j <= s__2; ++j) {
14951
14952 i__ = 1;
14953
14954 if ((d__1 = t[j] - x[1]) < 0.) {
14955 goto L58;
14956 } else if (d__1 == 0) {
14957 goto L17;
14958 } else {
14959 goto L55;
14960 }
14961 L55:
14962 if ((d__1 = t[j] - x[n]) < 0.) {
14963 goto L57;
14964 } else if (d__1 == 0) {
14965 goto L59;
14966 } else {
14967 goto L158;
14968 }
14969 L56:
14970 if ((d__1 = t[j] - x[i__]) < 0.) {
14971 goto L60;
14972 } else if (d__1 == 0) {
14973 goto L17;
14974 } else {
14975 goto L57;
14976 }
14977 L57:
14978 ++i__;
14979 goto L56;
14980
14981 L58:
14982 ++(*nr);
14983 ht1 = t[j] - x[1];
14984 ht2 = t[j] - x[2];
14985 yp1 = (y[cs__1 + 1] - y[cs__1]) / (x[cs__1 + 1] - x[cs__1]) + (x[1] -
14986 x[2]) * (s2[1] * 2. + s2[2]) / 6.;
14987 if (*k < 0) {
14988 goto L72;
14989 } else if (*k == 0) {
14990 goto L70;
14991 } else {
14992 goto L71;
14993 }
14994 L71:
14995 ss[j] = yp1 + ht1 * s2[1];
14996 goto L61;
14997 L70:
14998 ss[j] = y[1] + yp1 * ht1 + s2[1] * ht1 * ht1 / 2.;
14999 goto L61;
15000 L72:
15001 ss[j] = s2[i__];
15002 goto L61;
15003 L158:
15004 ht2 = t[j] - x[n];
15005 ht1 = t[j] - x[n1];
15006 ++(*nr);
15007 ypn = (y[n1 + 1] - y[n1]) / (x[n1 + 1] - x[n1]) + (x[n] - x[n1]) * (
15008 s2[n1] + s2[n] * 2.) / 6.;
15009 if (*k < 0) {
15010 goto L82;
15011 } else if (*k == 0) {
15012 goto L80;
15013 } else {
15014 goto L81;
15015 }
15016 L81:
15017 ss[j] = ypn + ht2 * s2[n];
15018 goto L61;
15019 L80:
15020 ss[j] = y[n] + ypn * ht2 + s2[n] * ht2 * ht2 / 2.;
15021 goto L61;
15022 L82:
15023 ss[j] = s2[n];
15024 goto L61;
15025
15026 L59:
15027 i__ = n;
15028 L60:
15029 --i__;
15030 L17:
15031 ht1 = t[j] - x[i__];
15032 ht2 = t[j] - x[i__ + 1];
15033 prod = ht1 * ht2;
15034 s3 = (s2[i__ + 1] - s2[i__]) / (x[i__ + 1] - x[i__]);
15035 ss2 = s2[i__] + ht1 * s3;
15036 delsqs = (s2[i__] + s2[i__ + 1] + ss2) / 6.;
15037
15038 if (*k < 0) {
15039 goto L43;
15040 } else if (*k == 0) {
15041 goto L41;
15042 } else {
15043 goto L42;
15044 }
15045 L41:
15046 ss[j] = y[i__] + ht1 * ((y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]))
15047 + prod * delsqs;
15048 goto L61;
15049 L42:
15050 ss[j] = (y[i__ + 1] - y[i__]) / (x[i__ + 1] - x[i__]) + (ht1 + ht2) *
15051 delsqs + prod * s3 / 6.;
15052 goto L61;
15053 L43:
15054 ss[j] = ss2;
15055 L61:
15056 ;
15057 }
15058 L20:
15059 *si = 0.;
15060
15061 s__2 = n1;
15062 for (i__ = 1; i__ <= s__2; ++i__) {
15063 h__ = x[i__ + 1] - x[i__];
15064
15065
15066 d__1 = h__;
15067 *si = *si + h__ * .5 * (y[i__] + y[i__ + 1]) - d__1 * (d__1 * d__1) *
15068 (s2[i__] + s2[i__ + 1]) / 24.;
15069 }
15070
15071 if (*k == 2) {
15072 *nr = ic;
15073 }
15074
15075 return 0;
15076 }
15077
15078 int spline_(int *l, int *m, int *k,
15079 double *eps, double *x, double *y, double *t,
15080 double *ss, double *si, int *nr, double *s2)
15081 {
15082 return spline_0_(0, l, m, k, eps, x, y, t, ss, si, nr, s2);
15083 }
15084
15085 int ixpolat_(int *l, int *m, int *k,
15086 double *eps, double *x, double *y, double *t,
15087 double *ss, double *si, int *nr, double *s2)
15088 {
15089 return spline_0_(1, l, m, k, eps, x, y, t, ss, si, nr, s2);
15090 }
15091
15092
15093
15094
15095
15096
15097
15098
15099
15100
15101 struct fh2oa_1_ {
15102 double fh2o[2003];
15103 };
15104
15105 #define fh2oa_1 (*(struct fh2oa_1_ *) &fh2oa_)
15106
15107 struct fh2ob_1_ {
15108 double v1, v2, dv;
15109 int nptfh2o;
15110 };
15111 struct fh2ob_2_ {
15112 double v1, v2, dv;
15113 int npts;
15114 };
15115
15116 #define fh2ob_1 (*(struct fh2ob_1_ *) &fh2ob_)
15117 #define fh2ob_2 (*(struct fh2ob_2_ *) &fh2ob_)
15118
15119 struct sh2oa_1_ {
15120 double swv296[2003];
15121 };
15122
15123 #define sh2oa_1 (*(struct sh2oa_1_ *) &sh2oa_)
15124
15125 struct sh2ob_1_ {
15126 double v1, v2, dv;
15127 int nptslfwv;
15128 };
15129 struct sh2ob_2_ {
15130 double v1, v2, dv;
15131 int npts;
15132 };
15133
15134 #define sh2ob_1 (*(struct sh2ob_1_ *) &sh2ob_)
15135 #define sh2ob_2 (*(struct sh2ob_2_ *) &sh2ob_)
15136
15137 struct s260a_1_ {
15138 double swv260[2003];
15139 };
15140
15141 #define s260a_1 (*(struct s260a_1_ *) &s260a_)
15142
15143 struct s260b_1_ {
15144 double v1___, v2___, dv___;
15145 int nptslfwv___;
15146 };
15147 struct s260b_2_ {
15148 double v1, v2, dv;
15149 int npts;
15150 };
15151
15152 #define s260b_1 (*(struct s260b_1_ *) &s260b_)
15153 #define s260b_2 (*(struct s260b_2_ *) &s260b_)
15154
15155 struct consts_1_ {
15156 double pi, planck, boltz, clight, avogad, alosmt, gascon, radcn1,
15157 radcn2;
15158 };
15159
15160 #define consts_1 (*(struct consts_1_ *) &consts_)
15161
15162
15163
15164 struct s_fh2oa_ {
15165 double e_1[2003];
15166 } fh2oa_ = { {.012859, .011715, .011038, .011715, .012859, .015326,
15167 .016999, .018321, .019402, .01957, .019432, .017572, .01676,
15168 .01548, .013984, .012266, .010467, .0094526, .0080485, .0069484,
15169 .0061416, .0050941, .0044836, .0038133, .0034608, .0031487,
15170 .0024555, .0020977, .0017266, .001492, .0012709, 9.8081e-4,
15171 8.5063e-4, 6.8822e-4, 5.3809e-4, 4.4679e-4, 3.3774e-4, 2.7979e-4,
15172 2.1047e-4, 1.6511e-4, 1.2993e-4, 9.3033e-5, 7.436e-5, 5.6428e-5,
15173 4.5442e-5, 3.4575e-5, 2.7903e-5, 2.1374e-5, 1.6075e-5, 1.3022e-5,
15174 1.0962e-5, 8.5959e-6, 6.9125e-6, 5.3808e-6, 4.3586e-6, 3.6394e-6,
15175 2.9552e-6, 2.3547e-6, 1.8463e-6, 1.6036e-6, 1.3483e-6, 1.1968e-6,
15176 1.0333e-6, 8.4484e-7, 6.7195e-7, 5.0947e-7, 4.2343e-7, 3.4453e-7,
15177 2.783e-7, 2.3063e-7, 1.9951e-7, 1.7087e-7, 1.4393e-7, 1.2575e-7,
15178 1.075e-7, 8.2325e-8, 5.7524e-8, 4.4482e-8, 3.8106e-8, 3.4315e-8,
15179 2.9422e-8, 2.5069e-8, 2.2402e-8, 1.9349e-8, 1.6152e-8, 1.2208e-8,
15180 8.966e-9, 7.1322e-9, 6.1028e-9, 5.2938e-9, 4.535e-9, 3.4977e-9,
15181 2.9511e-9, 2.4734e-9, 2.0508e-9, 1.8507e-9, 1.6373e-9, 1.5171e-9,
15182 1.3071e-9, 1.2462e-9, 1.2148e-9, 1.259e-9, 1.3153e-9, 1.3301e-9,
15183 1.4483e-9, 1.6944e-9, 2.0559e-9, 2.2954e-9, 2.6221e-9, 3.2606e-9,
15184 4.2392e-9, 5.2171e-9, 6.2553e-9, 8.2548e-9, 9.5842e-9, 1.128e-8,
15185 1.3628e-8, 1.7635e-8, 2.1576e-8, 2.4835e-8, 3.0014e-8, 3.8485e-8,
15186 4.744e-8, 5.5202e-8, 7.0897e-8, 9.6578e-8, 1.3976e-7, 1.8391e-7,
15187 2.3207e-7, 2.996e-7, 4.0408e-7, 5.926e-7, 7.8487e-7, 1.0947e-6,
15188 1.4676e-6, 1.9325e-6, 2.6587e-6, 3.4534e-6, 4.4376e-6, 5.8061e-6,
15189 7.0141e-6, 8.4937e-6, 1.0186e-5, 1.2034e-5, 1.3837e-5, 1.6595e-5,
15190 1.9259e-5, 2.162e-5, 2.3681e-5, 2.7064e-5, 3.251e-5, 3.546e-5,
15191 3.9109e-5, 4.2891e-5, 4.7757e-5, 5.0981e-5, 5.0527e-5, 4.8618e-5,
15192 4.4001e-5, 3.7982e-5, 3.2667e-5, 2.7794e-5, 2.491e-5, 2.4375e-5,
15193 2.7316e-5, 3.2579e-5, 3.5499e-5, 3.801e-5, 4.1353e-5, 4.3323e-5,
15194 4.3004e-5, 3.979e-5, 3.7718e-5, 3.636e-5, 3.2386e-5, 2.7409e-5,
15195 2.3626e-5, 2.0631e-5, 1.8371e-5, 1.5445e-5, 1.2989e-5, 1.1098e-5,
15196 9.6552e-6, 8.0649e-6, 7.2365e-6, 5.9137e-6, 5.2759e-6, 4.886e-6,
15197 4.1321e-6, 3.5918e-6, 2.764e-6, 2.4892e-6, 2.1018e-6, 1.7848e-6,
15198 1.5855e-6, 1.3569e-6, 1.1986e-6, 9.4693e-7, 7.4097e-7, 6.3443e-7,
15199 4.8131e-7, 4.0942e-7, 3.3316e-7, 2.8488e-7, 2.3461e-7, 1.7397e-7,
15200 1.4684e-7, 1.0953e-7, 8.5396e-8, 6.9261e-8, 5.4001e-8, 4.543e-8,
15201 3.2791e-8, 2.5995e-8, 2.0225e-8, 1.571e-8, 1.3027e-8, 1.0229e-8,
15202 8.5277e-9, 6.5249e-9, 5.0117e-9, 3.9906e-9, 3.2332e-9, 2.7847e-9,
15203 2.457e-9, 2.3359e-9, 2.0599e-9, 1.8436e-9, 1.6559e-9, 1.491e-9,
15204 1.2794e-9, 9.8229e-10, 8.0054e-10, 6.0769e-10, 4.5646e-10,
15205 3.3111e-10, 2.4428e-10, 1.8007e-10, 1.3291e-10, 9.7974e-11,
15206 7.8271e-11, 6.3833e-11, 5.4425e-11, 4.6471e-11, 4.0209e-11,
15207 3.5227e-11, 3.1212e-11, 2.884e-11, 2.7762e-11, 2.7935e-11,
15208 3.2012e-11, 3.9525e-11, 5.0303e-11, 6.8027e-11, 9.3954e-11,
15209 1.2986e-10, 1.8478e-10, 2.5331e-10, 3.4827e-10, 4.6968e-10,
15210 6.238e-10, 7.9106e-10, 1.0026e-9, 1.2102e-9, 1.4146e-9, 1.6154e-9,
15211 1.751e-9, 1.8575e-9, 1.8742e-9, 1.87e-9, 1.8582e-9, 1.9657e-9,
15212 2.1204e-9, 2.0381e-9, 2.0122e-9, 2.0436e-9, 2.1213e-9, 2.0742e-9,
15213 1.987e-9, 2.0465e-9, 2.1556e-9, 2.2222e-9, 2.1977e-9, 2.1047e-9,
15214 1.9334e-9, 1.7357e-9, 1.5754e-9, 1.4398e-9, 1.4018e-9, 1.5459e-9,
15215 1.7576e-9, 2.1645e-9, 2.948e-9, 4.4439e-9, 5.8341e-9, 8.0757e-9,
15216 1.1658e-8, 1.6793e-8, 2.2694e-8, 2.9468e-8, 3.9278e-8, 5.2145e-8,
15217 6.4378e-8, 7.7947e-8, 8.5321e-8, 9.7848e-8, 1.0999e-7, 1.1489e-7,
15218 1.2082e-7, 1.2822e-7, 1.4053e-7, 1.5238e-7, 1.5454e-7, 1.5018e-7,
15219 1.4048e-7, 1.2359e-7, 1.0858e-7, 9.3486e-8, 8.1638e-8, 7.769e-8,
15220 8.4625e-8, 1.0114e-7, 1.143e-7, 1.2263e-7, 1.3084e-7, 1.338e-7,
15221 1.3573e-7, 1.3441e-7, 1.2962e-7, 1.2638e-7, 1.1934e-7, 1.1371e-7,
15222 1.0871e-7, 9.8843e-8, 9.1877e-8, 9.105e-8, 9.3213e-8, 9.2929e-8,
15223 1.0155e-7, 1.1263e-7, 1.237e-7, 1.3636e-7, 1.54e-7, 1.7656e-7,
15224 2.1329e-7, 2.3045e-7, 2.5811e-7, 2.9261e-7, 3.4259e-7, 4.077e-7,
15225 4.8771e-7, 5.8081e-7, 7.2895e-7, 8.7482e-7, 1.0795e-6, 1.3384e-6,
15226 1.7208e-6, 2.0677e-6, 2.5294e-6, 3.1123e-6, 3.79e-6, 4.7752e-6,
15227 5.6891e-6, 6.6261e-6, 7.6246e-6, 8.773e-6, 9.6672e-6, 1.098e-5,
15228 1.1287e-5, 1.167e-5, 1.1635e-5, 1.1768e-5, 1.2039e-5, 1.2253e-5,
15229 1.3294e-5, 1.4005e-5, 1.3854e-5, 1.342e-5, 1.3003e-5, 1.2645e-5,
15230 1.1715e-5, 1.1258e-5, 1.1516e-5, 1.2494e-5, 1.3655e-5, 1.4931e-5,
15231 1.4649e-5, 1.3857e-5, 1.312e-5, 1.1791e-5, 1.0637e-5, 8.276e-6,
15232 6.5821e-6, 5.1959e-6, 4.0158e-6, 3.0131e-6, 2.0462e-6, 1.4853e-6,
15233 1.0365e-6, 7.3938e-7, 4.9752e-7, 3.4148e-7, 2.4992e-7, 1.8363e-7,
15234 1.4591e-7, 1.138e-7, 9.0588e-8, 7.3697e-8, 6.0252e-8, 5.1868e-8,
15235 4.266e-8, 3.6163e-8, 3.2512e-8, 2.9258e-8, 2.4238e-8, 2.1209e-8,
15236 1.6362e-8, 1.3871e-8, 1.2355e-8, 9.694e-9, 7.7735e-9, 6.2278e-9,
15237 5.2282e-9, 4.3799e-9, 3.5545e-9, 2.7527e-9, 2.095e-9, 1.6344e-9,
15238 1.2689e-9, 1.0403e-9, 8.488e-10, 6.3461e-10, 4.7657e-10,
15239 3.522e-10, 2.7879e-10, 2.3021e-10, 1.6167e-10, 1.1732e-10,
15240 8.9206e-11, 7.0596e-11, 5.831e-11, 4.4084e-11, 3.1534e-11,
15241 2.5068e-11, 2.2088e-11, 2.2579e-11, 2.2637e-11, 2.5705e-11,
15242 3.2415e-11, 4.6116e-11, 6.5346e-11, 9.4842e-11, 1.2809e-10,
15243 1.8211e-10, 2.4052e-10, 3.027e-10, 3.5531e-10, 4.2402e-10,
15244 4.673e-10, 4.7942e-10, 4.6813e-10, 4.5997e-10, 4.5788e-10,
15245 4.0311e-10, 3.7367e-10, 3.3149e-10, 2.9281e-10, 2.5231e-10,
15246 2.1152e-10, 1.9799e-10, 1.8636e-10, 1.9085e-10, 2.0786e-10,
15247 2.2464e-10, 2.3785e-10, 2.5684e-10, 2.7499e-10, 2.6962e-10,
15248 2.6378e-10, 2.6297e-10, 2.6903e-10, 2.7035e-10, 2.5394e-10,
15249 2.5655e-10, 2.7184e-10, 2.9013e-10, 3.0585e-10, 3.0791e-10,
15250 3.1667e-10, 3.4343e-10, 3.7365e-10, 4.0269e-10, 4.726e-10,
15251 5.6584e-10, 6.9791e-10, 8.6569e-10, 1.0393e-9, 1.2067e-9,
15252 1.5047e-9, 1.8583e-9, 2.2357e-9, 2.6498e-9, 3.2483e-9, 3.9927e-9,
15253 4.6618e-9, 5.5555e-9, 6.6609e-9, 8.2139e-9, 1.0285e-8, 1.3919e-8,
15254 1.8786e-8, 2.515e-8, 3.313e-8, 4.5442e-8, 6.337e-8, 9.0628e-8,
15255 1.2118e-7, 1.5927e-7, 2.1358e-7, 2.7825e-7, 3.7671e-7, 4.4894e-7,
15256 5.4442e-7, 6.224e-7, 7.3004e-7, 8.3384e-7, 8.7933e-7, 8.808e-7,
15257 8.6939e-7, 8.6541e-7, 8.2055e-7, 7.7278e-7, 7.5989e-7, 8.6909e-7,
15258 9.7945e-7, 1.0394e-6, 1.0646e-6, 1.1509e-6, 1.2017e-6, 1.1915e-6,
15259 1.1259e-6, 1.1549e-6, 1.1938e-6, 1.2356e-6, 1.2404e-6, 1.1716e-6,
15260 1.1149e-6, 1.0073e-6, 8.9845e-7, 7.6639e-7, 6.1517e-7, 5.0887e-7,
15261 4.1269e-7, 3.2474e-7, 2.5698e-7, 1.8893e-7, 1.4009e-7, 1.034e-7,
15262 7.7724e-8, 5.7302e-8, 4.2178e-8, 2.9603e-8, 2.1945e-8, 1.6301e-8,
15263 1.2806e-8, 1.0048e-8, 7.897e-9, 6.1133e-9, 4.9054e-9, 4.1985e-9,
15264 3.6944e-9, 3.2586e-9, 2.7362e-9, 2.3647e-9, 2.1249e-9, 1.8172e-9,
15265 1.6224e-9, 1.5158e-9, 1.2361e-9, 1.0682e-9, 9.2312e-10, 7.922e-10,
15266 6.8174e-10, 5.6147e-10, 4.8268e-10, 4.1534e-10, 3.3106e-10,
15267 2.8275e-10, 2.4584e-10, 2.0742e-10, 1.784e-10, 1.4664e-10,
15268 1.239e-10, 1.0497e-10, 8.5038e-11, 6.7008e-11, 5.6355e-11,
15269 4.3323e-11, 3.6914e-11, 3.2262e-11, 3.0749e-11, 3.0318e-11,
15270 2.9447e-11, 2.9918e-11, 3.0668e-11, 3.1315e-11, 3.0329e-11,
15271 2.8259e-11, 2.6065e-11, 2.3578e-11, 2.0469e-11, 1.6908e-11,
15272 1.4912e-11, 1.1867e-11, 9.973e-12, 8.1014e-12, 6.7528e-12,
15273 6.3133e-12, 5.8599e-12, 6.0145e-12, 6.5105e-12, 7.0537e-12,
15274 7.4973e-12, 7.8519e-12, 8.5039e-12, 9.1995e-12, 1.0694e-11,
15275 1.1659e-11, 1.2685e-11, 1.3087e-11, 1.3222e-11, 1.2634e-11,
15276 1.1077e-11, 9.6259e-12, 8.3202e-12, 7.4857e-12, 6.8069e-12,
15277 6.7496e-12, 7.3116e-12, 8.0171e-12, 8.6394e-12, 9.2659e-12,
15278 1.0048e-11, 1.0941e-11, 1.2226e-11, 1.3058e-11, 1.5193e-11,
15279 1.8923e-11, 2.3334e-11, 2.8787e-11, 3.6693e-11, 4.8295e-11,
15280 6.426e-11, 8.8269e-11, 1.1865e-10, 1.5961e-10, 2.0605e-10,
15281 2.7349e-10, 3.7193e-10, 4.8216e-10, 6.1966e-10, 7.715e-10,
15282 1.0195e-9, 1.2859e-9, 1.6535e-9, 2.0316e-9, 2.3913e-9, 3.0114e-9,
15283 3.7495e-9, 4.6504e-9, 5.9145e-9, 7.684e-9, 1.0304e-8, 1.301e-8,
15284 1.6441e-8, 2.1475e-8, 2.5892e-8, 2.9788e-8, 3.382e-8, 4.0007e-8,
15285 4.4888e-8, 4.5765e-8, 4.6131e-8, 4.6239e-8, 4.4849e-8, 4.0729e-8,
15286 3.6856e-8, 3.6164e-8, 3.7606e-8, 4.1457e-8, 4.375e-8, 5.115e-8,
15287 5.6054e-8, 6.1586e-8, 6.4521e-8, 6.6494e-8, 6.9024e-8, 6.8893e-8,
15288 7.0901e-8, 6.976e-8, 7.1485e-8, 7.074e-8, 7.3764e-8, 7.6618e-8,
15289 8.4182e-8, 9.3838e-8, 1.0761e-7, 1.2851e-7, 1.4748e-7, 1.8407e-7,
15290 2.2109e-7, 2.6392e-7, 2.9887e-7, 3.4493e-7, 4.0336e-7, 4.3551e-7,
15291 4.9231e-7, 5.0728e-7, 5.3781e-7, 5.3285e-7, 5.4496e-7, 5.5707e-7,
15292 5.6944e-7, 6.1123e-7, 6.4317e-7, 6.4581e-7, 6.1999e-7, 6.0191e-7,
15293 5.7762e-7, 5.7241e-7, 5.7013e-7, 6.016e-7, 6.6905e-7, 7.4095e-7,
15294 8.2121e-7, 8.0947e-7, 7.6145e-7, 7.2193e-7, 6.3722e-7, 5.4316e-7,
15295 4.2186e-7, 3.2528e-7, 2.5207e-7, 1.8213e-7, 1.2658e-7, 8.6746e-8,
15296 6.0216e-8, 4.1122e-8, 2.8899e-8, 2.174e-8, 1.799e-8, 1.5593e-8,
15297 1.397e-8, 1.2238e-8, 1.0539e-8, 9.2386e-9, 7.8481e-9, 6.8704e-9,
15298 5.7615e-9, 5.0434e-9, 4.6886e-9, 4.377e-9, 3.9768e-9, 3.5202e-9,
15299 3.1854e-9, 2.9009e-9, 2.5763e-9, 2.2135e-9, 1.9455e-9, 1.6248e-9,
15300 1.3368e-9, 1.0842e-9, 8.4254e-10, 6.7414e-10, 5.4667e-10,
15301 4.5005e-10, 3.4932e-10, 2.6745e-10, 2.2053e-10, 1.8162e-10,
15302 1.4935e-10, 1.1618e-10, 9.1888e-11, 8.0672e-11, 6.8746e-11,
15303 6.2668e-11, 5.5715e-11, 4.5074e-11, 3.7669e-11, 3.2082e-11,
15304 2.8085e-11, 2.4838e-11, 1.9791e-11, 1.6964e-11, 1.3887e-11,
15305 1.1179e-11, 9.7499e-12, 7.8255e-12, 6.3698e-12, 5.3265e-12,
15306 4.6588e-12, 4.4498e-12, 3.9984e-12, 3.7513e-12, 3.7176e-12,
15307 3.9148e-12, 4.2702e-12, 5.009e-12, 6.5801e-12, 8.7787e-12,
15308 1.2718e-11, 1.8375e-11, 2.5304e-11, 3.5403e-11, 4.8842e-11,
15309 6.484e-11, 8.0911e-11, 1.0136e-10, 1.2311e-10, 1.4203e-10,
15310 1.5869e-10, 1.8093e-10, 2.137e-10, 2.5228e-10, 2.8816e-10,
15311 3.4556e-10, 3.986e-10, 4.435e-10, 4.776e-10, 5.2357e-10,
15312 6.0827e-10, 6.3635e-10, 6.5886e-10, 6.8753e-10, 7.2349e-10,
15313 7.2789e-10, 6.8232e-10, 6.6081e-10, 6.4232e-10, 6.3485e-10,
15314 6.4311e-10, 7.2235e-10, 7.7263e-10, 8.1668e-10, 9.0324e-10,
15315 9.7643e-10, 1.0535e-9, 1.0195e-9, 1.0194e-9, 1.0156e-9,
15316 9.6792e-10, 9.2725e-10, 8.7347e-10, 8.4484e-10, 8.2647e-10,
15317 8.4363e-10, 9.1261e-10, 1.0051e-9, 1.1511e-9, 1.4037e-9,
15318 1.8066e-9, 2.4483e-9, 3.2739e-9, 4.3194e-9, 5.6902e-9, 7.7924e-9,
15319 9.7376e-9, 1.2055e-8, 1.4303e-8, 1.6956e-8, 1.9542e-8, 2.2233e-8,
15320 2.5186e-8, 2.7777e-8, 2.8943e-8, 2.8873e-8, 2.9417e-8, 2.7954e-8,
15321 2.7524e-8, 2.704e-8, 3.1254e-8, 3.6843e-8, 3.7797e-8, 3.8713e-8,
15322 4.0135e-8, 4.2824e-8, 4.3004e-8, 4.0279e-8, 4.2781e-8, 4.522e-8,
15323 4.8948e-8, 5.0172e-8, 4.8499e-8, 4.7182e-8, 4.2204e-8, 3.7701e-8,
15324 3.0972e-8, 2.4654e-8, 1.9543e-8, 1.4609e-8, 1.1171e-8, 8.3367e-9,
15325 6.3791e-9, 5.079e-9, 4.0655e-9, 3.3658e-9, 2.7882e-9, 2.4749e-9,
15326 2.2287e-9, 2.0217e-9, 1.8191e-9, 1.5897e-9, 1.4191e-9, 1.2448e-9,
15327 1.0884e-9, 9.3585e-10, 7.9429e-10, 7.3214e-10, 6.5008e-10,
15328 5.7549e-10, 5.43e-10, 4.7251e-10, 4.3451e-10, 3.8446e-10,
15329 3.5589e-10, 3.4432e-10, 2.8209e-10, 2.462e-10, 2.1278e-10,
15330 1.8406e-10, 1.6314e-10, 1.3261e-10, 1.1696e-10, 9.6865e-11,
15331 7.6814e-11, 6.6411e-11, 5.0903e-11, 4.0827e-11, 3.0476e-11,
15332 2.323e-11, 1.7707e-11, 1.3548e-11, 1.0719e-11, 9.3026e-12,
15333 8.7967e-12, 8.3136e-12, 7.3918e-12, 6.5293e-12, 5.9243e-12,
15334 5.3595e-12, 3.5266e-12, 2.2571e-12, 1.615e-12, 1.1413e-12,
15335 8.4998e-13, 7.0803e-13, 5.1747e-13, 4.0694e-13, 3.6528e-13,
15336 3.367e-13, 3.1341e-13, 2.939e-13, 2.868e-13, 3.1283e-13,
15337 3.7294e-13, 5.0194e-13, 6.7919e-13, 1.0455e-12, 1.523e-12,
15338 2.3932e-12, 3.4231e-12, 5.0515e-12, 7.3193e-12, 9.9406e-12,
15339 1.2193e-11, 1.4742e-11, 1.9269e-11, 2.1816e-11, 2.275e-11,
15340 2.2902e-11, 2.3888e-11, 2.4902e-11, 2.216e-11, 2.0381e-11,
15341 1.9903e-11, 2.0086e-11, 1.9304e-11, 2.0023e-11, 2.2244e-11,
15342 2.545e-11, 3.1228e-11, 3.456e-11, 3.6923e-11, 3.7486e-11,
15343 3.8124e-11, 3.8317e-11, 3.4737e-11, 3.3037e-11, 3.1724e-11,
15344 2.984e-11, 2.8301e-11, 2.5857e-11, 2.3708e-11, 1.9452e-11,
15345 1.6232e-11, 1.5174e-11, 1.4206e-11, 1.4408e-11, 1.5483e-11,
15346 1.8642e-11, 2.3664e-11, 3.0181e-11, 4.016e-11, 5.2287e-11,
15347 7.2754e-11, 1.0511e-10, 1.4531e-10, 2.0998e-10, 2.6883e-10,
15348 3.3082e-10, 4.2638e-10, 5.3132e-10, 6.3617e-10, 7.1413e-10,
15349 8.5953e-10, 9.9715e-10, 1.0796e-9, 1.0978e-9, 1.1052e-9,
15350 1.1095e-9, 1.0641e-9, 9.7881e-10, 9.659e-10, 1.0332e-9, 1.1974e-9,
15351 1.3612e-9, 1.5829e-9, 1.8655e-9, 2.1465e-9, 2.4779e-9, 2.737e-9,
15352 2.9915e-9, 3.3037e-9, 3.6347e-9, 3.9587e-9, 4.4701e-9, 5.0122e-9,
15353 5.8044e-9, 6.1916e-9, 6.9613e-9, 7.7863e-9, 8.282e-9, 9.4359e-9,
15354 9.7387e-9, 1.0656e-8, 1.0746e-8, 1.121e-8, 1.1905e-8, 1.2194e-8,
15355 1.3145e-8, 1.3738e-8, 1.3634e-8, 1.3011e-8, 1.2511e-8, 1.1805e-8,
15356 1.2159e-8, 1.239e-8, 1.3625e-8, 1.5678e-8, 1.7886e-8, 1.9933e-8,
15357 1.9865e-8, 1.9e-8, 1.7812e-8, 1.5521e-8, 1.2593e-8, 9.5635e-9,
15358 7.2987e-9, 5.2489e-9, 3.5673e-9, 2.4206e-9, 1.6977e-9, 1.2456e-9,
15359 9.3744e-10, 7.8379e-10, 6.996e-10, 6.6451e-10, 6.8521e-10,
15360 7.4234e-10, 8.6658e-10, 9.4972e-10, 1.0791e-9, 1.2359e-9,
15361 1.3363e-9, 1.5025e-9, 1.5368e-9, 1.6152e-9, 1.6184e-9, 1.6557e-9,
15362 1.7035e-9, 1.6916e-9, 1.7237e-9, 1.7175e-9, 1.6475e-9, 1.5335e-9,
15363 1.4272e-9, 1.3282e-9, 1.3459e-9, 1.4028e-9, 1.5192e-9, 1.7068e-9,
15364 1.9085e-9, 2.1318e-9, 2.102e-9, 1.9942e-9, 1.8654e-9, 1.6391e-9,
15365 1.3552e-9, 1.0186e-9, 7.854e-10, 5.7022e-10, 3.9247e-10,
15366 2.5441e-10, 1.6699e-10, 1.1132e-10, 6.8989e-11, 4.5255e-11,
15367 3.1106e-11, 2.3161e-11, 1.7618e-11, 1.438e-11, 1.1601e-11,
15368 9.7148e-12, 8.4519e-12, 6.5392e-12, 5.4113e-12, 4.7624e-12,
15369 4.0617e-12, 3.6173e-12, 2.8608e-12, 2.2724e-12, 1.7436e-12,
15370 1.3424e-12, 1.0358e-12, 7.3064e-13, 5.45e-13, 4.0551e-13,
15371 2.8642e-13, 2.1831e-13, 1.686e-13, 1.2086e-13, 1.015e-13,
15372 9.355e-14, 8.4105e-14, 7.3051e-14, 6.9796e-14, 7.9949e-14,
15373 1.0742e-13, 1.5639e-13, 2.1308e-13, 3.1226e-13, 4.6853e-13,
15374 6.6917e-13, 1.0088e-12, 1.4824e-12, 2.2763e-12, 3.3917e-12,
15375 4.4585e-12, 6.3187e-12, 8.4189e-12, 1.1302e-11, 1.3431e-11,
15376 1.5679e-11, 1.9044e-11, 2.2463e-11, 2.3605e-11, 2.3619e-11,
15377 2.3505e-11, 2.3805e-11, 2.2549e-11, 1.9304e-11, 1.8382e-11,
15378 1.7795e-11, 1.8439e-11, 1.9146e-11, 2.1966e-11, 2.6109e-11,
15379 3.1883e-11, 3.7872e-11, 4.3966e-11, 4.8789e-11, 5.3264e-11,
15380 5.9705e-11, 6.3744e-11, 7.0163e-11, 7.9114e-11, 8.8287e-11,
15381 9.9726e-11, 1.1498e-10, 1.37e-10, 1.6145e-10, 1.9913e-10,
15382 2.2778e-10, 2.6216e-10, 2.977e-10, 3.3405e-10, 3.7821e-10,
15383 3.9552e-10, 4.1322e-10, 4.0293e-10, 4.0259e-10, 3.8853e-10,
15384 3.7842e-10, 3.8551e-10, 4.4618e-10, 5.0527e-10, 5.0695e-10,
15385 5.1216e-10, 5.193e-10, 5.5794e-10, 5.332e-10, 5.2008e-10,
15386 5.6888e-10, 6.1883e-10, 6.9006e-10, 6.9505e-10, 6.6768e-10,
15387 6.329e-10, 5.6753e-10, 5.0327e-10, 3.983e-10, 3.1147e-10,
15388 2.4416e-10, 1.886e-10, 1.3908e-10, 9.9156e-11, 7.3779e-11,
15389 5.6048e-11, 4.2457e-11, 3.4505e-11, 2.9881e-11, 2.7865e-11,
15390 2.8471e-11, 3.1065e-11, 3.4204e-11, 3.914e-11, 4.3606e-11,
15391 4.9075e-11, 5.3069e-11, 5.5236e-11, 5.5309e-11, 5.3832e-11,
15392 5.3183e-11, 5.1783e-11, 5.2042e-11, 5.4422e-11, 5.5656e-11,
15393 5.4409e-11, 5.2659e-11, 5.1696e-11, 5.1726e-11, 4.9003e-11,
15394 4.905e-11, 5.17e-11, 5.6818e-11, 6.3129e-11, 6.6542e-11,
15395 6.4367e-11, 5.9908e-11, 5.447e-11, 4.7903e-11, 3.9669e-11,
15396 2.9651e-11, 2.2286e-11, 1.6742e-11, 1.1827e-11, 7.7739e-12,
15397 4.8805e-12, 3.1747e-12, 2.0057e-12, 1.255e-12, 8.7434e-13,
15398 6.2755e-13, 4.9752e-13, 4.0047e-13, 3.5602e-13, 3.093e-13,
15399 2.4903e-13, 1.9316e-13, 1.4995e-13, 1.2059e-13, 8.7242e-14,
15400 6.4511e-14, 5.33e-14, 4.3741e-14, 3.4916e-14, 2.656e-14,
15401 1.6923e-14, 1.1816e-14, 6.7071e-15, 3.6474e-15, 2.0686e-15,
15402 1.1925e-15, 6.8948e-16, 3.9661e-16, 2.2576e-16, 1.2669e-16,
15403 6.9908e-17, 3.7896e-17, 2.028e-17, 1.1016e-17, 6.7816e-18,
15404 6.0958e-18, 8.9913e-18, 1.7201e-17, 3.4964e-17, 7.0722e-17,
15405 1.402e-16, 2.7167e-16, 5.1478e-16, 9.55e-16, 1.7376e-15,
15406 3.1074e-15, 5.4789e-15, 9.564e-15, 1.6635e-14, 2.9145e-14,
15407 5.2179e-14, 8.8554e-14, 1.4764e-13, 2.3331e-13, 3.5996e-13,
15408 5.2132e-13, 6.3519e-13, 7.3174e-13, 8.3752e-13, 9.8916e-13,
15409 1.1515e-12, 1.4034e-12, 1.6594e-12, 2.1021e-12, 2.7416e-12,
15410 3.4135e-12, 4.5517e-12, 5.5832e-12, 7.2303e-12, 9.9484e-12,
15411 1.2724e-11, 1.6478e-11, 2.0588e-11, 2.5543e-11, 3.3625e-11,
15412 4.1788e-11, 5.0081e-11, 6.0144e-11, 6.9599e-11, 8.4408e-11,
15413 9.7143e-11, 1.0805e-10, 1.1713e-10, 1.2711e-10, 1.3727e-10,
15414 1.4539e-10, 1.6049e-10, 1.768e-10, 2.0557e-10, 2.4967e-10,
15415 3.0096e-10, 3.5816e-10, 4.0851e-10, 4.6111e-10, 5.2197e-10,
15416 5.5043e-10, 6.0324e-10, 6.4983e-10, 6.7498e-10, 7.0545e-10,
15417 7.068e-10, 7.5218e-10, 7.5723e-10, 7.784e-10, 8.0081e-10,
15418 8.0223e-10, 7.7271e-10, 7.1676e-10, 6.7819e-10, 6.4753e-10,
15419 6.5844e-10, 7.0163e-10, 7.7503e-10, 8.8152e-10, 9.9022e-10,
15420 1.0229e-9, 9.9296e-10, 8.9911e-10, 7.7813e-10, 6.3785e-10,
15421 4.7491e-10, 3.528e-10, 2.4349e-10, 1.6502e-10, 1.1622e-10,
15422 8.6715e-11, 6.736e-11, 5.391e-11, 4.5554e-11, 4.13e-11,
15423 3.9728e-11, 3.9e-11, 3.9803e-11, 4.1514e-11, 4.3374e-11,
15424 4.6831e-11, 4.8921e-11, 5.1995e-11, 5.7242e-11, 6.2759e-11,
15425 7.0801e-11, 7.4555e-11, 7.9754e-11, 8.7616e-11, 9.1171e-11,
15426 1.0349e-10, 1.1047e-10, 1.2024e-10, 1.299e-10, 1.3725e-10,
15427 1.5005e-10, 1.5268e-10, 1.5535e-10, 1.5623e-10, 1.5009e-10,
15428 1.4034e-10, 1.3002e-10, 1.2225e-10, 1.1989e-10, 1.2411e-10,
15429 1.3612e-10, 1.5225e-10, 1.7202e-10, 1.9471e-10, 1.9931e-10,
15430 1.9079e-10, 1.7478e-10, 1.5259e-10, 1.2625e-10, 9.3332e-11,
15431 6.8796e-11, 4.6466e-11, 2.9723e-11, 1.8508e-11, 1.2106e-11,
15432 8.0142e-12, 5.4066e-12, 3.9329e-12, 3.1665e-12, 2.742e-12,
15433 2.3996e-12, 2.3804e-12, 2.3242e-12, 2.4476e-12, 2.5331e-12,
15434 2.3595e-12, 2.2575e-12, 2.1298e-12, 2.0088e-12, 1.8263e-12,
15435 1.6114e-12, 1.4422e-12, 1.2946e-12, 1.0837e-12, 9.1282e-13,
15436 7.2359e-13, 5.3307e-13, 3.8837e-13, 2.6678e-13, 1.6769e-13,
15437 1.0826e-13, 7.2364e-14, 4.5201e-14, 3.0808e-14, 2.2377e-14,
15438 1.704e-14, 9.2181e-15, 5.2934e-15, 3.5774e-15, 3.1431e-15,
15439 3.7647e-15, 5.6428e-15, 9.5139e-15, 1.7322e-14, 2.8829e-14,
15440 4.7708e-14, 6.9789e-14, 9.7267e-14, 1.4662e-13, 1.9429e-13,
15441 2.5998e-13, 3.6636e-13, 4.796e-13, 6.5129e-13, 7.7638e-13,
15442 9.3774e-13, 1.1467e-12, 1.3547e-12, 1.5686e-12, 1.6893e-12,
15443 1.9069e-12, 2.1352e-12, 2.3071e-12, 2.4759e-12, 2.8247e-12,
15444 3.4365e-12, 4.3181e-12, 5.6107e-12, 7.0017e-12, 8.6408e-12,
15445 1.0974e-11, 1.3742e-11, 1.6337e-11, 2.0157e-11, 2.3441e-11,
15446 2.6733e-11, 3.0247e-11, 3.3737e-11, 3.8618e-11, 4.1343e-11,
15447 4.387e-11, 4.4685e-11, 4.4881e-11, 4.5526e-11, 4.3628e-11,
15448 4.4268e-11, 4.6865e-11, 5.3426e-11, 5.402e-11, 5.3218e-11,
15449 5.4587e-11, 5.636e-11, 5.774e-11, 5.6426e-11, 6.0399e-11,
15450 6.6981e-11, 7.4319e-11, 7.7977e-11, 7.5539e-11, 7.161e-11,
15451 6.4606e-11, 5.5498e-11, 4.3944e-11, 3.3769e-11, 2.5771e-11,
15452 1.9162e-11, 1.3698e-11, 1.0173e-11, 7.8925e-12, 6.1938e-12,
15453 4.7962e-12, 4.0811e-12, 3.3912e-12, 2.8625e-12, 2.4504e-12,
15454 2.2188e-12, 2.2139e-12, 2.2499e-12, 2.2766e-12, 2.3985e-12,
15455 2.5459e-12, 2.9295e-12, 3.4196e-12, 3.6155e-12, 4.0733e-12,
15456 4.461e-12, 4.9372e-12, 5.4372e-12, 5.7304e-12, 6.164e-12,
15457 6.1278e-12, 6.294e-12, 6.4947e-12, 6.8174e-12, 7.519e-12,
15458 8.2608e-12, 8.4971e-12, 8.3484e-12, 8.1888e-12, 7.8552e-12,
15459 7.8468e-12, 7.5943e-12, 7.9096e-12, 8.6869e-12, 9.1303e-12,
15460 9.2547e-12, 8.9322e-12, 8.2177e-12, 7.3408e-12, 5.7956e-12,
15461 4.447e-12, 3.5881e-12, 2.6748e-12, 1.7074e-12, 9.67e-13,
15462 5.2645e-13, 2.9943e-13, 1.7316e-13, 1.0039e-13, 5.7859e-14,
15463 3.2968e-14, 1.8499e-14, 1.0192e-14, 5.5015e-15, 2.904e-15,
15464 1.4968e-15, 7.5244e-16, 3.6852e-16, 1.7568e-16, 8.1464e-17,
15465 3.6717e-17, 1.6076e-17, 6.8341e-18, 2.8195e-18, 1.1286e-18, 0.,
15466 0., 0., 0., 0., 0., 0., 0., 0., 1.407e-18, 3.0405e-18, 6.4059e-18,
15467 1.3169e-17, 2.6443e-17, 5.1917e-17, 9.9785e-17, 1.8802e-16,
15468 3.4788e-16, 6.3328e-16, 1.137e-15, 2.0198e-15, 3.5665e-15,
15469 6.3053e-15, 1.1309e-14, 2.1206e-14, 3.2858e-14, 5.5165e-14,
15470 8.6231e-14, 1.2776e-13, 1.778e-13, 2.5266e-13, 3.6254e-13,
15471 5.1398e-13, 6.8289e-13, 8.7481e-13, 1.1914e-12, 1.6086e-12,
15472 2.0469e-12, 2.5761e-12, 3.4964e-12, 4.498e-12, 5.5356e-12,
15473 6.7963e-12, 8.572e-12, 1.07e-11, 1.2983e-11, 1.627e-11,
15474 1.9609e-11, 2.2668e-11, 2.5963e-11, 3.0918e-11, 3.493e-11,
15475 3.933e-11, 4.4208e-11, 4.6431e-11, 5.1141e-11, 5.4108e-11,
15476 5.8077e-11, 6.505e-11, 7.2126e-11, 8.1064e-11, 8.1973e-11,
15477 8.1694e-11, 8.3081e-11, 8.024e-11, 7.9225e-11, 7.6256e-11,
15478 7.8468e-11, 8.0041e-11, 8.1585e-11, 8.3485e-11, 8.3774e-11,
15479 8.587e-11, 8.6104e-11, 8.8516e-11, 9.0814e-11, 9.2522e-11,
15480 8.8913e-11, 7.8381e-11, 6.8568e-11, 5.6797e-11, 4.4163e-11,
15481 3.2369e-11, 2.3259e-11, 1.6835e-11, 1.1733e-11, 8.5273e-12,
15482 6.3805e-12, 4.8983e-12, 3.8831e-12, 3.261e-12, 2.8577e-12,
15483 2.521e-12, 2.2913e-12, 2.0341e-12, 1.8167e-12, 1.6395e-12,
15484 1.489e-12, 1.3516e-12, 1.2542e-12, 1.291e-12, 1.3471e-12,
15485 1.4689e-12, 1.5889e-12, 1.6989e-12, 1.8843e-12, 2.0902e-12,
15486 2.3874e-12, 2.7294e-12, 3.3353e-12, 4.0186e-12, 4.5868e-12,
15487 5.2212e-12, 5.8856e-12, 6.5991e-12, 7.2505e-12, 7.6637e-12,
15488 8.5113e-12, 9.4832e-12, 9.9678e-12, 1.0723e-11, 1.0749e-11,
15489 1.138e-11, 1.1774e-11, 1.1743e-11, 1.2493e-11, 1.2559e-11,
15490 1.2332e-11, 1.1782e-11, 1.1086e-11, 1.0945e-11, 1.1178e-11,
15491 1.2083e-11, 1.3037e-11, 1.473e-11, 1.645e-11, 1.7403e-11,
15492 1.7004e-11, 1.5117e-11, 1.3339e-11, 1.0844e-11, 8.0915e-12,
15493 5.6615e-12, 3.7196e-12, 2.5194e-12, 1.6569e-12, 1.1201e-12,
15494 8.2335e-13, 6.027e-13, 4.8205e-13, 4.1313e-13, 3.6243e-13,
15495 3.2575e-13, 2.773e-13, 2.5292e-13, 2.3062e-13, 2.1126e-13,
15496 2.1556e-13, 2.1213e-13, 2.2103e-13, 2.1927e-13, 2.0794e-13,
15497 1.9533e-13, 1.6592e-13, 1.4521e-13, 1.1393e-13, 8.3772e-14,
15498 6.2077e-14, 4.3337e-14, 2.7165e-14, 1.6821e-14, 9.5407e-15,
15499 5.3093e-15, 3.032e-15, 1.7429e-15, 9.9828e-16, 5.6622e-16,
15500 3.1672e-16, 1.7419e-16, 9.3985e-17, 4.9656e-17, 2.5652e-17,
15501 1.2942e-17, 6.3695e-18, 3.0554e-18, 1.4273e-18, -0., -0., -0.,
15502 -0., -0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15503 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15504 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15505 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15506 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15507 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15508 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15509 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15510 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15511 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15512 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
15513 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.} };
15514
15515 struct s_fh2ob_ {
15516 double e_1[3];
15517 int e_2;
15518 } fh2ob_ = { {-20., 2e4, 10.}, 2003 };
15519
15520 struct s_sh2oa_ {
15521 double e_1[2003];
15522 } sh2oa_ = { {.11109, .10573, .10162, .10573, .11109, .12574, .13499,
15523 .14327, .15065, .15164, .15022, .13677, .13115, .12253, .11271,
15524 .1007, .087495, .080118, .06994, .062034, .056051, .047663,
15525 .04245, .03669, .033441, .030711, .025205, .022113, .01888,
15526 .016653, .014626, .012065, .010709, .0091783, .0077274, .0067302,
15527 .0056164, .0049089, .0041497, .0035823, .0031124, .0026414,
15528 .0023167, .0020156, .0017829, .0015666, .0013928, .0012338,
15529 .0010932, 9.7939e-4, 8.8241e-4, 7.9173e-4, 7.1296e-4, 6.4179e-4,
15530 5.8031e-4, 5.2647e-4, 4.7762e-4, 4.3349e-4, 3.9355e-4, 3.5887e-4,
15531 3.2723e-4, 2.9919e-4, 2.7363e-4, 2.5013e-4, 2.2876e-4, 2.0924e-4,
15532 1.9193e-4, 1.7618e-4, 1.6188e-4, 1.4891e-4, 1.3717e-4, 1.2647e-4,
15533 1.1671e-4, 1.0786e-4, 9.9785e-5, 9.235e-5, 8.5539e-5, 7.9377e-5,
15534 7.3781e-5, 6.8677e-5, 6.3993e-5, 5.9705e-5, 5.5788e-5, 5.2196e-5,
15535 4.8899e-5, 4.5865e-5, 4.3079e-5, 4.0526e-5, 3.8182e-5, 3.6025e-5,
15536 3.4038e-5, 3.2203e-5, 3.0511e-5, 2.8949e-5, 2.7505e-5, 2.617e-5,
15537 2.4933e-5, 2.3786e-5, 2.2722e-5, 2.1736e-5, 2.0819e-5, 1.9968e-5,
15538 1.9178e-5, 1.8442e-5, 1.776e-5, 1.7127e-5, 1.6541e-5, 1.5997e-5,
15539 1.5495e-5, 1.5034e-5, 1.4614e-5, 1.423e-5, 1.3883e-5, 1.3578e-5,
15540 1.3304e-5, 1.3069e-5, 1.2876e-5, 1.2732e-5, 1.2626e-5, 1.2556e-5,
15541 1.2544e-5, 1.2604e-5, 1.2719e-5, 1.2883e-5, 1.3164e-5, 1.3581e-5,
15542 1.4187e-5, 1.4866e-5, 1.5669e-5, 1.6717e-5, 1.8148e-5, 2.0268e-5,
15543 2.2456e-5, 2.5582e-5, 2.9183e-5, 3.3612e-5, 3.9996e-5, 4.6829e-5,
15544 5.5055e-5, 6.5897e-5, 7.536e-5, 8.7213e-5, 1.0046e-4, 1.1496e-4,
15545 1.2943e-4, 1.5049e-4, 1.6973e-4, 1.8711e-4, 2.0286e-4, 2.2823e-4,
15546 2.678e-4, 2.8766e-4, 3.1164e-4, 3.364e-4, 3.6884e-4, 3.9159e-4,
15547 3.8712e-4, 3.7433e-4, 3.4503e-4, 3.1003e-4, 2.8027e-4, 2.5253e-4,
15548 2.3408e-4, 2.2836e-4, 2.4442e-4, 2.7521e-4, 2.9048e-4, 3.0489e-4,
15549 3.2646e-4, 3.388e-4, 3.3492e-4, 3.0987e-4, 2.9482e-4, 2.8711e-4,
15550 2.6068e-4, 2.2683e-4, 1.9996e-4, 1.7788e-4, 1.6101e-4, 1.3911e-4,
15551 1.2013e-4, 1.0544e-4, 9.4224e-5, 8.1256e-5, 7.3667e-5, 6.2233e-5,
15552 5.5906e-5, 5.1619e-5, 4.514e-5, 4.0273e-5, 3.3268e-5, 3.0258e-5,
15553 2.644e-5, 2.3103e-5, 2.0749e-5, 1.8258e-5, 1.6459e-5, 1.4097e-5,
15554 1.2052e-5, 1.0759e-5, 9.14e-6, 8.1432e-6, 7.146e-6, 6.4006e-6,
15555 5.6995e-6, 4.9372e-6, 4.4455e-6, 3.9033e-6, 3.474e-6, 3.1269e-6,
15556 2.8059e-6, 2.5558e-6, 2.2919e-6, 2.0846e-6, 1.8983e-6, 1.7329e-6,
15557 1.5929e-6, 1.4631e-6, 1.3513e-6, 1.2461e-6, 1.1519e-6, 1.0682e-6,
15558 9.9256e-7, 9.2505e-7, 8.6367e-7, 8.0857e-7, 7.5674e-7, 7.0934e-7,
15559 6.658e-7, 6.258e-7, 5.8853e-7, 5.5333e-7, 5.2143e-7, 4.9169e-7,
15560 4.6431e-7, 4.3898e-7, 4.1564e-7, 3.9405e-7, 3.7403e-7, 3.5544e-7,
15561 3.3819e-7, 3.2212e-7, 3.0714e-7, 2.9313e-7, 2.8003e-7, 2.6777e-7,
15562 2.5628e-7, 2.4551e-7, 2.354e-7, 2.2591e-7, 2.1701e-7, 2.0866e-7,
15563 2.0082e-7, 1.9349e-7, 1.8665e-7, 1.8027e-7, 1.7439e-7, 1.6894e-7,
15564 1.64e-7, 1.5953e-7, 1.5557e-7, 1.5195e-7, 1.4888e-7, 1.4603e-7,
15565 1.4337e-7, 1.4093e-7, 1.3828e-7, 1.3569e-7, 1.327e-7, 1.2984e-7,
15566 1.2714e-7, 1.2541e-7, 1.2399e-7, 1.2102e-7, 1.1878e-7, 1.1728e-7,
15567 1.1644e-7, 1.1491e-7, 1.1305e-7, 1.1235e-7, 1.1228e-7, 1.1224e-7,
15568 1.1191e-7, 1.1151e-7, 1.1098e-7, 1.1068e-7, 1.1109e-7, 1.1213e-7,
15569 1.1431e-7, 1.1826e-7, 1.2322e-7, 1.3025e-7, 1.4066e-7, 1.5657e-7,
15570 1.7214e-7, 1.9449e-7, 2.2662e-7, 2.6953e-7, 3.1723e-7, 3.7028e-7,
15571 4.4482e-7, 5.3852e-7, 6.2639e-7, 7.2175e-7, 7.7626e-7, 8.7248e-7,
15572 9.6759e-7, 1.0102e-6, 1.062e-6, 1.1201e-6, 1.2107e-6, 1.2998e-6,
15573 1.313e-6, 1.2856e-6, 1.235e-6, 1.1489e-6, 1.0819e-6, 1.012e-6,
15574 9.4795e-7, 9.2858e-7, 9.806e-7, 1.0999e-6, 1.1967e-6, 1.2672e-6,
15575 1.3418e-6, 1.3864e-6, 1.433e-6, 1.4592e-6, 1.4598e-6, 1.4774e-6,
15576 1.4726e-6, 1.482e-6, 1.505e-6, 1.4984e-6, 1.5181e-6, 1.5888e-6,
15577 1.685e-6, 1.769e-6, 1.9277e-6, 2.1107e-6, 2.3068e-6, 2.5347e-6,
15578 2.8069e-6, 3.1345e-6, 3.5822e-6, 3.9051e-6, 4.3422e-6, 4.8704e-6,
15579 5.5351e-6, 6.3454e-6, 7.269e-6, 8.2974e-6, 9.7609e-6, 1.1237e-5,
15580 1.3187e-5, 1.5548e-5, 1.8784e-5, 2.1694e-5, 2.5487e-5, 3.0092e-5,
15581 3.5385e-5, 4.2764e-5, 4.9313e-5, 5.58e-5, 6.2968e-5, 7.106e-5,
15582 7.7699e-5, 8.7216e-5, 8.9335e-5, 9.2151e-5, 9.2779e-5, 9.4643e-5,
15583 9.7978e-5, 1.0008e-4, 1.0702e-4, 1.1026e-4, 1.0828e-4, 1.055e-4,
15584 1.0432e-4, 1.0428e-4, 9.898e-5, 9.4992e-5, 9.5159e-5, 1.0058e-4,
15585 1.0738e-4, 1.155e-4, 1.1229e-4, 1.0596e-4, 1.0062e-4, 9.1742e-5,
15586 8.4492e-5, 6.8099e-5, 5.6295e-5, 4.6502e-5, 3.8071e-5, 3.0721e-5,
15587 2.3297e-5, 1.8688e-5, 1.483e-5, 1.2049e-5, 9.6754e-6, 7.9192e-6,
15588 6.6673e-6, 5.6468e-6, 4.8904e-6, 4.2289e-6, 3.688e-6, 3.2396e-6,
15589 2.8525e-6, 2.5363e-6, 2.2431e-6, 1.9949e-6, 1.7931e-6, 1.6164e-6,
15590 1.4431e-6, 1.2997e-6, 1.1559e-6, 1.0404e-6, 9.43e-7, 8.4597e-7,
15591 7.6133e-7, 6.8623e-7, 6.2137e-7, 5.6345e-7, 5.1076e-7, 4.6246e-7,
15592 4.1906e-7, 3.8063e-7, 3.461e-7, 3.1554e-7, 2.8795e-7, 2.6252e-7,
15593 2.3967e-7, 2.1901e-7, 2.0052e-7, 1.8384e-7, 1.6847e-7, 1.5459e-7,
15594 1.4204e-7, 1.3068e-7, 1.2036e-7, 1.1095e-7, 1.0237e-7, 9.4592e-8,
15595 8.753e-8, 8.1121e-8, 7.5282e-8, 6.9985e-8, 6.5189e-8, 6.0874e-8,
15596 5.6989e-8, 5.353e-8, 5.0418e-8, 4.7745e-8, 4.5367e-8, 4.3253e-8,
15597 4.1309e-8, 3.9695e-8, 3.8094e-8, 3.6482e-8, 3.4897e-8, 3.35e-8,
15598 3.2302e-8, 3.0854e-8, 2.9698e-8, 2.8567e-8, 2.76e-8, 2.6746e-8,
15599 2.5982e-8, 2.551e-8, 2.5121e-8, 2.4922e-8, 2.4909e-8, 2.5013e-8,
15600 2.5216e-8, 2.5589e-8, 2.6049e-8, 2.6451e-8, 2.6978e-8, 2.7687e-8,
15601 2.86e-8, 2.9643e-8, 3.0701e-8, 3.2058e-8, 3.3695e-8, 3.5558e-8,
15602 3.7634e-8, 3.9875e-8, 4.2458e-8, 4.548e-8, 4.8858e-8, 5.2599e-8,
15603 5.703e-8, 6.2067e-8, 6.7911e-8, 7.4579e-8, 8.1902e-8, 8.9978e-8,
15604 9.987e-8, 1.1102e-7, 1.2343e-7, 1.3732e-7, 1.5394e-7, 1.7318e-7,
15605 1.9383e-7, 2.1819e-7, 2.4666e-7, 2.8109e-7, 3.2236e-7, 3.776e-7,
15606 4.4417e-7, 5.2422e-7, 6.1941e-7, 7.4897e-7, 9.2041e-7, 1.1574e-6,
15607 1.4126e-6, 1.7197e-6, 2.1399e-6, 2.6266e-6, 3.3424e-6, 3.8418e-6,
15608 4.514e-6, 5.0653e-6, 5.8485e-6, 6.5856e-6, 6.8937e-6, 6.9121e-6,
15609 6.9005e-6, 6.9861e-6, 6.82e-6, 6.6089e-6, 6.5809e-6, 7.3496e-6,
15610 8.0311e-6, 8.3186e-6, 8.426e-6, 9.0644e-6, 9.4965e-6, 9.4909e-6,
15611 9.016e-6, 9.1494e-6, 9.3629e-6, 9.5944e-6, 9.5459e-6, 8.9919e-6,
15612 8.604e-6, 7.8613e-6, 7.1567e-6, 6.2677e-6, 5.1899e-6, 4.4188e-6,
15613 3.7167e-6, 3.0636e-6, 2.5573e-6, 2.0317e-6, 1.6371e-6, 1.3257e-6,
15614 1.0928e-6, 8.9986e-7, 7.4653e-7, 6.1111e-7, 5.1395e-7, 4.35e-7,
15615 3.7584e-7, 3.2633e-7, 2.8413e-7, 2.4723e-7, 2.1709e-7, 1.9294e-7,
15616 1.7258e-7, 1.5492e-7, 1.382e-7, 1.2389e-7, 1.1189e-7, 1.0046e-7,
15617 9.0832e-8, 8.2764e-8, 7.4191e-8, 6.7085e-8, 6.0708e-8, 5.4963e-8,
15618 4.9851e-8, 4.5044e-8, 4.0916e-8, 3.722e-8, 3.3678e-8, 3.0663e-8,
15619 2.7979e-8, 2.5495e-8, 2.3286e-8, 2.1233e-8, 1.9409e-8, 1.777e-8,
15620 1.626e-8, 1.4885e-8, 1.3674e-8, 1.2543e-8, 1.1551e-8, 1.0655e-8,
15621 9.8585e-9, 9.1398e-9, 8.4806e-9, 7.8899e-9, 7.3547e-9, 6.867e-9,
15622 6.4131e-9, 5.993e-9, 5.6096e-9, 5.2592e-9, 4.9352e-9, 4.6354e-9,
15623 4.3722e-9, 4.125e-9, 3.9081e-9, 3.7118e-9, 3.5372e-9, 3.3862e-9,
15624 3.2499e-9, 3.1324e-9, 3.0313e-9, 2.9438e-9, 2.8686e-9, 2.805e-9,
15625 2.7545e-9, 2.7149e-9, 2.6907e-9, 2.6724e-9, 2.6649e-9, 2.6642e-9,
15626 2.6725e-9, 2.6871e-9, 2.7056e-9, 2.7357e-9, 2.7781e-9, 2.8358e-9,
15627 2.9067e-9, 2.9952e-9, 3.102e-9, 3.2253e-9, 3.3647e-9, 3.5232e-9,
15628 3.7037e-9, 3.9076e-9, 4.1385e-9, 4.3927e-9, 4.6861e-9, 5.0238e-9,
15629 5.4027e-9, 5.8303e-9, 6.3208e-9, 6.8878e-9, 7.5419e-9, 8.313e-9,
15630 9.1952e-9, 1.0228e-8, 1.1386e-8, 1.2792e-8, 1.4521e-8, 1.6437e-8,
15631 1.8674e-8, 2.116e-8, 2.4506e-8, 2.8113e-8, 3.2636e-8, 3.7355e-8,
15632 4.2234e-8, 4.9282e-8, 5.7358e-8, 6.6743e-8, 7.8821e-8, 9.4264e-8,
15633 1.1542e-7, 1.3684e-7, 1.6337e-7, 2.0056e-7, 2.3252e-7, 2.6127e-7,
15634 2.9211e-7, 3.3804e-7, 3.7397e-7, 3.8205e-7, 3.881e-7, 3.9499e-7,
15635 3.9508e-7, 3.7652e-7, 3.5859e-7, 3.6198e-7, 3.7871e-7, 4.0925e-7,
15636 4.2717e-7, 4.8241e-7, 5.2008e-7, 5.653e-7, 5.9531e-7, 6.1994e-7,
15637 6.508e-7, 6.6355e-7, 6.9193e-7, 6.993e-7, 7.3058e-7, 7.4678e-7,
15638 7.9193e-7, 8.3627e-7, 9.1267e-7, 1.0021e-6, 1.1218e-6, 1.2899e-6,
15639 1.4447e-6, 1.7268e-6, 2.0025e-6, 2.3139e-6, 2.5599e-6, 2.892e-6,
15640 3.3059e-6, 3.5425e-6, 3.9522e-6, 4.0551e-6, 4.2818e-6, 4.2892e-6,
15641 4.421e-6, 4.5614e-6, 4.6739e-6, 4.9482e-6, 5.1118e-6, 5.0986e-6,
15642 4.9417e-6, 4.9022e-6, 4.8449e-6, 4.8694e-6, 4.8111e-6, 4.9378e-6,
15643 5.3231e-6, 5.7362e-6, 6.235e-6, 6.0951e-6, 5.7281e-6, 5.4585e-6,
15644 4.9032e-6, 4.3009e-6, 3.4776e-6, 2.8108e-6, 2.2993e-6, 1.7999e-6,
15645 1.387e-6, 1.075e-6, 8.5191e-7, 6.7951e-7, 5.5336e-7, 4.6439e-7,
15646 4.0243e-7, 3.5368e-7, 3.1427e-7, 2.7775e-7, 2.4486e-7, 2.1788e-7,
15647 1.9249e-7, 1.7162e-7, 1.5115e-7, 1.3478e-7, 1.2236e-7, 1.1139e-7,
15648 1.0092e-7, 9.0795e-8, 8.2214e-8, 7.4691e-8, 6.7486e-8, 6.0414e-8,
15649 5.4584e-8, 4.8754e-8, 4.3501e-8, 3.8767e-8, 3.4363e-8, 3.0703e-8,
15650 2.7562e-8, 2.4831e-8, 2.2241e-8, 1.9939e-8, 1.8049e-8, 1.6368e-8,
15651 1.4863e-8, 1.346e-8, 1.2212e-8, 1.1155e-8, 1.0185e-8, 9.3417e-9,
15652 8.5671e-9, 7.8292e-9, 7.1749e-9, 6.5856e-9, 6.0588e-9, 5.5835e-9,
15653 5.135e-9, 4.7395e-9, 4.3771e-9, 4.0476e-9, 3.756e-9, 3.4861e-9,
15654 3.2427e-9, 3.024e-9, 2.8278e-9, 2.6531e-9, 2.4937e-9, 2.3511e-9,
15655 2.2245e-9, 2.1133e-9, 2.0159e-9, 1.933e-9, 1.8669e-9, 1.8152e-9,
15656 1.7852e-9, 1.7752e-9, 1.7823e-9, 1.8194e-9, 1.8866e-9, 1.9759e-9,
15657 2.0736e-9, 2.2083e-9, 2.3587e-9, 2.4984e-9, 2.6333e-9, 2.816e-9,
15658 3.0759e-9, 3.372e-9, 3.6457e-9, 4.0668e-9, 4.4541e-9, 4.7976e-9,
15659 5.0908e-9, 5.4811e-9, 6.1394e-9, 6.3669e-9, 6.5714e-9, 6.8384e-9,
15660 7.1918e-9, 7.3741e-9, 7.2079e-9, 7.2172e-9, 7.2572e-9, 7.3912e-9,
15661 7.6188e-9, 8.3291e-9, 8.7885e-9, 9.2412e-9, 1.0021e-8, 1.0752e-8,
15662 1.1546e-8, 1.1607e-8, 1.1949e-8, 1.2346e-8, 1.2516e-8, 1.2826e-8,
15663 1.3053e-8, 1.3556e-8, 1.4221e-8, 1.5201e-8, 1.6661e-8, 1.8385e-8,
15664 2.0585e-8, 2.3674e-8, 2.7928e-8, 3.3901e-8, 4.1017e-8, 4.9595e-8,
15665 6.0432e-8, 7.6304e-8, 9.0764e-8, 1.0798e-7, 1.2442e-7, 1.4404e-7,
15666 1.6331e-7, 1.8339e-7, 2.0445e-7, 2.2288e-7, 2.3083e-7, 2.3196e-7,
15667 2.3919e-7, 2.3339e-7, 2.3502e-7, 2.3444e-7, 2.6395e-7, 2.9928e-7,
15668 3.0025e-7, 3.0496e-7, 3.1777e-7, 3.4198e-7, 3.4739e-7, 3.2696e-7,
15669 3.41e-7, 3.5405e-7, 3.7774e-7, 3.8285e-7, 3.6797e-7, 3.58e-7,
15670 3.2283e-7, 2.9361e-7, 2.4881e-7, 2.0599e-7, 1.7121e-7, 1.3641e-7,
15671 1.1111e-7, 8.9413e-8, 7.3455e-8, 6.2078e-8, 5.2538e-8, 4.5325e-8,
15672 3.9005e-8, 3.4772e-8, 3.1203e-8, 2.8132e-8, 2.525e-8, 2.2371e-8,
15673 2.0131e-8, 1.7992e-8, 1.6076e-8, 1.4222e-8, 1.249e-8, 1.1401e-8,
15674 1.0249e-8, 9.2279e-9, 8.5654e-9, 7.6227e-9, 6.9648e-9, 6.2466e-9,
15675 5.7252e-9, 5.38e-9, 4.696e-9, 4.2194e-9, 3.7746e-9, 3.3813e-9,
15676 3.0656e-9, 2.6885e-9, 2.4311e-9, 2.1572e-9, 1.8892e-9, 1.7038e-9,
15677 1.4914e-9, 1.3277e-9, 1.1694e-9, 1.0391e-9, 9.2779e-10,
15678 8.3123e-10, 7.4968e-10, 6.8385e-10, 6.2915e-10, 5.7784e-10,
15679 5.2838e-10, 4.8382e-10, 4.4543e-10, 4.1155e-10, 3.7158e-10,
15680 3.3731e-10, 3.0969e-10, 2.8535e-10, 2.6416e-10, 2.4583e-10,
15681 2.2878e-10, 2.1379e-10, 2.0073e-10, 1.8907e-10, 1.7866e-10,
15682 1.6936e-10, 1.6119e-10, 1.5424e-10, 1.4847e-10, 1.4401e-10,
15683 1.4068e-10, 1.3937e-10, 1.3943e-10, 1.4281e-10, 1.4766e-10,
15684 1.5701e-10, 1.7079e-10, 1.8691e-10, 2.0081e-10, 2.174e-10,
15685 2.4847e-10, 2.6463e-10, 2.7087e-10, 2.7313e-10, 2.8352e-10,
15686 2.9511e-10, 2.8058e-10, 2.7227e-10, 2.7356e-10, 2.8012e-10,
15687 2.8034e-10, 2.9031e-10, 3.103e-10, 3.3745e-10, 3.8152e-10,
15688 4.0622e-10, 4.2673e-10, 4.3879e-10, 4.5488e-10, 4.7179e-10,
15689 4.614e-10, 4.6339e-10, 4.6716e-10, 4.7024e-10, 4.7931e-10,
15690 4.8503e-10, 4.9589e-10, 4.9499e-10, 5.0363e-10, 5.3184e-10,
15691 5.6451e-10, 6.0932e-10, 6.6469e-10, 7.4076e-10, 8.3605e-10,
15692 9.4898e-10, 1.0935e-9, 1.2593e-9, 1.4913e-9, 1.8099e-9, 2.1842e-9,
15693 2.7284e-9, 3.2159e-9, 3.7426e-9, 4.5226e-9, 5.3512e-9, 6.1787e-9,
15694 6.8237e-9, 7.9421e-9, 9.0002e-9, 9.6841e-9, 9.9558e-9, 1.0232e-8,
15695 1.0591e-8, 1.0657e-8, 1.0441e-8, 1.0719e-8, 1.1526e-8, 1.2962e-8,
15696 1.4336e-8, 1.615e-8, 1.8417e-8, 2.0725e-8, 2.3426e-8, 2.5619e-8,
15697 2.7828e-8, 3.0563e-8, 3.3438e-8, 3.6317e-8, 4.04e-8, 4.4556e-8,
15698 5.0397e-8, 5.3315e-8, 5.9185e-8, 6.5311e-8, 6.9188e-8, 7.7728e-8,
15699 7.9789e-8, 8.6598e-8, 8.7768e-8, 9.1773e-8, 9.7533e-8, 1.0007e-7,
15700 1.065e-7, 1.0992e-7, 1.0864e-7, 1.0494e-7, 1.0303e-7, 1.0031e-7,
15701 1.0436e-7, 1.0537e-7, 1.1184e-7, 1.2364e-7, 1.3651e-7, 1.4881e-7,
15702 1.4723e-7, 1.4118e-7, 1.3371e-7, 1.1902e-7, 1.0007e-7, 7.9628e-8,
15703 6.4362e-8, 5.0243e-8, 3.8133e-8, 2.94e-8, 2.3443e-8, 1.9319e-8,
15704 1.6196e-8, 1.4221e-8, 1.2817e-8, 1.1863e-8, 1.1383e-8, 1.1221e-8,
15705 1.1574e-8, 1.1661e-8, 1.2157e-8, 1.2883e-8, 1.3295e-8, 1.4243e-8,
15706 1.424e-8, 1.4614e-8, 1.4529e-8, 1.4685e-8, 1.4974e-8, 1.479e-8,
15707 1.489e-8, 1.4704e-8, 1.4142e-8, 1.3374e-8, 1.2746e-8, 1.2172e-8,
15708 1.2336e-8, 1.2546e-8, 1.3065e-8, 1.409e-8, 1.5215e-8, 1.654e-8,
15709 1.6144e-8, 1.5282e-8, 1.4358e-8, 1.2849e-8, 1.0998e-8, 8.6956e-9,
15710 7.0881e-9, 5.5767e-9, 4.2792e-9, 3.2233e-9, 2.502e-9, 1.9985e-9,
15711 1.5834e-9, 1.3015e-9, 1.0948e-9, 9.4141e-10, 8.1465e-10,
15712 7.1517e-10, 6.2906e-10, 5.5756e-10, 4.9805e-10, 4.3961e-10,
15713 3.9181e-10, 3.5227e-10, 3.167e-10, 2.8667e-10, 2.5745e-10,
15714 2.3212e-10, 2.0948e-10, 1.897e-10, 1.7239e-10, 1.5659e-10,
15715 1.4301e-10, 1.3104e-10, 1.2031e-10, 1.1095e-10, 1.0262e-10,
15716 9.513e-11, 8.8595e-11, 8.2842e-11, 7.7727e-11, 7.3199e-11,
15717 6.9286e-11, 6.5994e-11, 6.3316e-11, 6.1244e-11, 5.9669e-11,
15718 5.8843e-11, 5.8832e-11, 5.9547e-11, 6.1635e-11, 6.4926e-11,
15719 7.0745e-11, 7.8802e-11, 8.6724e-11, 1.0052e-10, 1.1575e-10,
15720 1.3626e-10, 1.5126e-10, 1.6751e-10, 1.9239e-10, 2.1748e-10,
15721 2.2654e-10, 2.2902e-10, 2.324e-10, 2.4081e-10, 2.393e-10,
15722 2.2378e-10, 2.2476e-10, 2.2791e-10, 2.4047e-10, 2.5305e-10,
15723 2.8073e-10, 3.1741e-10, 3.6592e-10, 4.1495e-10, 4.6565e-10,
15724 5.099e-10, 5.5607e-10, 6.1928e-10, 6.6779e-10, 7.335e-10,
15725 8.1434e-10, 8.9635e-10, 9.9678e-10, 1.1256e-9, 1.2999e-9,
15726 1.4888e-9, 1.7642e-9, 1.9606e-9, 2.2066e-9, 2.4601e-9, 2.7218e-9,
15727 3.0375e-9, 3.1591e-9, 3.2852e-9, 3.2464e-9, 3.3046e-9, 3.271e-9,
15728 3.2601e-9, 3.3398e-9, 3.7446e-9, 4.0795e-9, 4.0284e-9, 4.0584e-9,
15729 4.1677e-9, 4.5358e-9, 4.4097e-9, 4.2744e-9, 4.5449e-9, 4.8147e-9,
15730 5.2656e-9, 5.2476e-9, 5.0275e-9, 4.7968e-9, 4.3654e-9, 3.953e-9,
15731 3.2447e-9, 2.6489e-9, 2.1795e-9, 1.788e-9, 1.4309e-9, 1.1256e-9,
15732 9.1903e-10, 7.6533e-10, 6.3989e-10, 5.5496e-10, 4.9581e-10,
15733 4.5722e-10, 4.3898e-10, 4.3505e-10, 4.3671e-10, 4.5329e-10,
15734 4.6827e-10, 4.9394e-10, 5.1122e-10, 5.1649e-10, 5.0965e-10,
15735 4.9551e-10, 4.8928e-10, 4.7947e-10, 4.7989e-10, 4.9071e-10,
15736 4.8867e-10, 4.726e-10, 4.5756e-10, 4.54e-10, 4.5993e-10,
15737 4.4042e-10, 4.3309e-10, 4.4182e-10, 4.6735e-10, 5.0378e-10,
15738 5.2204e-10, 5.0166e-10, 4.6799e-10, 4.3119e-10, 3.8803e-10,
15739 3.3291e-10, 2.6289e-10, 2.1029e-10, 1.7011e-10, 1.3345e-10,
15740 1.0224e-10, 7.8207e-11, 6.2451e-11, 5.0481e-11, 4.1507e-11,
15741 3.5419e-11, 3.0582e-11, 2.69e-11, 2.3778e-11, 2.1343e-11,
15742 1.9182e-11, 1.7162e-11, 1.5391e-11, 1.3877e-11, 1.2619e-11,
15743 1.145e-11, 1.0461e-11, 9.6578e-12, 8.9579e-12, 8.3463e-12,
15744 7.8127e-12, 7.3322e-12, 6.9414e-12, 6.6037e-12, 6.3285e-12,
15745 6.1095e-12, 5.9387e-12, 5.8118e-12, 5.726e-12, 5.6794e-12,
15746 5.6711e-12, 5.7003e-12, 5.767e-12, 5.8717e-12, 6.0151e-12,
15747 6.1984e-12, 6.4232e-12, 6.6918e-12, 7.0065e-12, 7.3705e-12,
15748 7.7873e-12, 8.2612e-12, 8.7972e-12, 9.4009e-12, 1.0079e-11,
15749 1.084e-11, 1.1692e-11, 1.2648e-11, 1.3723e-11, 1.4935e-11,
15750 1.6313e-11, 1.7905e-11, 1.974e-11, 2.1898e-11, 2.4419e-11,
15751 2.7426e-11, 3.0869e-11, 3.4235e-11, 3.7841e-11, 4.1929e-11,
15752 4.6776e-11, 5.2123e-11, 5.8497e-11, 6.5294e-11, 7.4038e-11,
15753 8.4793e-11, 9.6453e-11, 1.1223e-10, 1.2786e-10, 1.4882e-10,
15754 1.7799e-10, 2.0766e-10, 2.4523e-10, 2.8591e-10, 3.3386e-10,
15755 4.0531e-10, 4.7663e-10, 5.4858e-10, 6.3377e-10, 7.1688e-10,
15756 8.4184e-10, 9.5144e-10, 1.0481e-9, 1.1356e-9, 1.2339e-9,
15757 1.3396e-9, 1.4375e-9, 1.5831e-9, 1.7323e-9, 1.9671e-9, 2.2976e-9,
15758 2.6679e-9, 3.0777e-9, 3.4321e-9, 3.8192e-9, 4.2711e-9, 4.4903e-9,
15759 4.8931e-9, 5.2253e-9, 5.404e-9, 5.6387e-9, 5.6704e-9, 6.0345e-9,
15760 6.1079e-9, 6.2576e-9, 6.4039e-9, 6.3776e-9, 6.1878e-9, 5.8616e-9,
15761 5.7036e-9, 5.584e-9, 5.6905e-9, 5.8931e-9, 6.2478e-9, 6.8291e-9,
15762 7.4528e-9, 7.6078e-9, 7.3898e-9, 6.7573e-9, 5.9827e-9, 5.0927e-9,
15763 4.0099e-9, 3.1933e-9, 2.4296e-9, 1.8485e-9, 1.4595e-9, 1.2017e-9,
15764 1.0164e-9, 8.7433e-10, 7.7108e-10, 7.0049e-10, 6.5291e-10,
15765 6.1477e-10, 5.9254e-10, 5.815e-10, 5.7591e-10, 5.849e-10,
15766 5.8587e-10, 5.9636e-10, 6.2408e-10, 6.5479e-10, 7.048e-10,
15767 7.2313e-10, 7.5524e-10, 8.0863e-10, 8.3386e-10, 9.2342e-10,
15768 9.6754e-10, 1.0293e-9, 1.0895e-9, 1.133e-9, 1.221e-9, 1.2413e-9,
15769 1.2613e-9, 1.2671e-9, 1.2225e-9, 1.1609e-9, 1.0991e-9, 1.06e-9,
15770 1.057e-9, 1.0818e-9, 1.1421e-9, 1.227e-9, 1.337e-9, 1.4742e-9,
15771 1.4946e-9, 1.4322e-9, 1.321e-9, 1.1749e-9, 1.0051e-9, 7.8387e-10,
15772 6.1844e-10, 4.6288e-10, 3.4164e-10, 2.5412e-10, 1.9857e-10,
15773 1.5876e-10, 1.2966e-10, 1.092e-10, 9.4811e-11, 8.3733e-11,
15774 7.3906e-11, 6.7259e-11, 6.1146e-11, 5.7119e-11, 5.3546e-11,
15775 4.8625e-11, 4.4749e-11, 4.1089e-11, 3.7825e-11, 3.4465e-11,
15776 3.1018e-11, 2.8109e-11, 2.561e-11, 2.2859e-11, 2.049e-11,
15777 1.8133e-11, 1.5835e-11, 1.3949e-11, 1.2295e-11, 1.0799e-11,
15778 9.6544e-12, 8.7597e-12, 7.999e-12, 7.3973e-12, 6.9035e-12,
15779 6.4935e-12, 6.1195e-12, 5.8235e-12, 5.5928e-12, 5.4191e-12,
15780 5.2993e-12, 5.2338e-12, 5.2272e-12, 5.2923e-12, 5.4252e-12,
15781 5.6523e-12, 5.9433e-12, 6.3197e-12, 6.9016e-12, 7.5016e-12,
15782 8.2885e-12, 9.405e-12, 1.0605e-11, 1.2257e-11, 1.3622e-11,
15783 1.5353e-11, 1.7543e-11, 1.9809e-11, 2.2197e-11, 2.4065e-11,
15784 2.6777e-11, 2.9751e-11, 3.2543e-11, 3.5536e-11, 3.9942e-11,
15785 4.6283e-11, 5.4556e-11, 6.549e-11, 7.6803e-11, 9.0053e-11,
15786 1.0852e-10, 1.2946e-10, 1.4916e-10, 1.7748e-10, 2.0073e-10,
15787 2.2485e-10, 2.5114e-10, 2.7715e-10, 3.1319e-10, 3.3305e-10,
15788 3.5059e-10, 3.5746e-10, 3.6311e-10, 3.7344e-10, 3.6574e-10,
15789 3.7539e-10, 3.9434e-10, 4.351e-10, 4.334e-10, 4.2588e-10,
15790 4.3977e-10, 4.6062e-10, 4.7687e-10, 4.6457e-10, 4.8578e-10,
15791 5.2344e-10, 5.6752e-10, 5.8702e-10, 5.6603e-10, 5.3784e-10,
15792 4.9181e-10, 4.3272e-10, 3.5681e-10, 2.8814e-10, 2.332e-10,
15793 1.8631e-10, 1.4587e-10, 1.1782e-10, 9.8132e-11, 8.2528e-11,
15794 6.9174e-11, 6.1056e-11, 5.3459e-11, 4.7116e-11, 4.1878e-11,
15795 3.8125e-11, 3.6347e-11, 3.5071e-11, 3.3897e-11, 3.3541e-11,
15796 3.3563e-11, 3.5469e-11, 3.8111e-11, 3.8675e-11, 4.1333e-11,
15797 4.3475e-11, 4.6476e-11, 4.9761e-11, 5.138e-11, 5.4135e-11,
15798 5.3802e-11, 5.5158e-11, 5.6864e-11, 5.9311e-11, 6.3827e-11,
15799 6.7893e-11, 6.823e-11, 6.6694e-11, 6.6018e-11, 6.4863e-11,
15800 6.5893e-11, 6.3813e-11, 6.4741e-11, 6.863e-11, 7.0255e-11,
15801 7.0667e-11, 6.881e-11, 6.4104e-11, 5.8136e-11, 4.7242e-11,
15802 3.7625e-11, 3.1742e-11, 2.5581e-11, 1.8824e-11, 1.3303e-11,
15803 9.6919e-12, 7.5353e-12, 6.0986e-12, 5.0742e-12, 4.3094e-12,
15804 3.719e-12, 3.252e-12, 2.8756e-12, 2.568e-12, 2.3139e-12,
15805 2.1025e-12, 1.9257e-12, 1.7777e-12, 1.6539e-12, 1.5508e-12,
15806 1.4657e-12, 1.3966e-12, 1.3417e-12, 1.2998e-12, 1.27e-12,
15807 1.2514e-12, 1.2437e-12, 1.2463e-12, 1.2592e-12, 1.2823e-12,
15808 1.3157e-12, 1.3596e-12, 1.4144e-12, 1.4806e-12, 1.5588e-12,
15809 1.6497e-12, 1.7544e-12, 1.8738e-12, 2.0094e-12, 2.1626e-12,
15810 2.3354e-12, 2.5297e-12, 2.7483e-12, 2.9941e-12, 3.2708e-12,
15811 3.5833e-12, 3.9374e-12, 4.3415e-12, 4.8079e-12, 5.3602e-12,
15812 5.9816e-12, 6.7436e-12, 7.6368e-12, 8.6812e-12, 9.8747e-12,
15813 1.135e-11, 1.3181e-11, 1.5406e-11, 1.7868e-11, 2.0651e-11,
15814 2.4504e-11, 2.9184e-11, 3.4159e-11, 3.9979e-11, 4.8704e-11,
15815 5.7856e-11, 6.7576e-11, 7.9103e-11, 9.437e-11, 1.1224e-10,
15816 1.3112e-10, 1.5674e-10, 1.8206e-10, 2.0576e-10, 2.3187e-10,
15817 2.7005e-10, 3.0055e-10, 3.3423e-10, 3.6956e-10, 3.8737e-10,
15818 4.263e-10, 4.5154e-10, 4.8383e-10, 5.3582e-10, 5.8109e-10,
15819 6.3741e-10, 6.3874e-10, 6.387e-10, 6.5818e-10, 6.5056e-10,
15820 6.5291e-10, 6.3159e-10, 6.3984e-10, 6.4549e-10, 6.5444e-10,
15821 6.7035e-10, 6.7665e-10, 6.9124e-10, 6.8451e-10, 6.9255e-10,
15822 6.9923e-10, 7.0396e-10, 6.7715e-10, 6.0371e-10, 5.3774e-10,
15823 4.6043e-10, 3.7635e-10, 2.9484e-10, 2.2968e-10, 1.8185e-10,
15824 1.4191e-10, 1.1471e-10, 9.479e-11, 7.9613e-11, 6.7989e-11,
15825 5.9391e-11, 5.281e-11, 4.7136e-11, 4.2618e-11, 3.8313e-11,
15826 3.4686e-11, 3.1669e-11, 2.911e-11, 2.6871e-11, 2.5074e-11,
15827 2.4368e-11, 2.3925e-11, 2.4067e-11, 2.4336e-11, 2.4704e-11,
15828 2.5823e-11, 2.7177e-11, 2.9227e-11, 3.1593e-11, 3.573e-11,
15829 4.0221e-11, 4.3994e-11, 4.8448e-11, 5.3191e-11, 5.8552e-11,
15830 6.3458e-11, 6.6335e-11, 7.2457e-11, 7.9091e-11, 8.2234e-11,
15831 8.7668e-11, 8.7951e-11, 9.2952e-11, 9.6157e-11, 9.5926e-11,
15832 1.012e-10, 1.0115e-10, 9.9577e-11, 9.6633e-11, 9.2891e-11,
15833 9.3315e-11, 9.5584e-11, 1.0064e-10, 1.0509e-10, 1.1455e-10,
15834 1.2443e-10, 1.2963e-10, 1.2632e-10, 1.1308e-10, 1.0186e-10,
15835 8.588e-11, 6.7863e-11, 5.1521e-11, 3.778e-11, 2.8842e-11,
15836 2.2052e-11, 1.7402e-11, 1.4406e-11, 1.1934e-11, 1.0223e-11,
15837 8.9544e-12, 7.9088e-12, 7.0675e-12, 6.2222e-12, 5.6051e-12,
15838 5.0502e-12, 4.5578e-12, 4.2636e-12, 3.9461e-12, 3.7599e-12,
15839 3.5215e-12, 3.2467e-12, 3.0018e-12, 2.6558e-12, 2.3928e-12,
15840 2.0707e-12, 1.7575e-12, 1.5114e-12, 1.2941e-12, 1.1004e-12,
15841 9.5175e-13, 8.2894e-13, 7.3253e-13, 6.5551e-13, 5.9098e-13,
15842 5.3548e-13, 4.8697e-13, 4.4413e-13, 4.06e-13, 3.7188e-13,
15843 3.4121e-13, 3.1356e-13, 2.8856e-13, 2.659e-13, 2.4533e-13,
15844 2.2663e-13, 2.096e-13, 1.9407e-13, 1.799e-13, 1.6695e-13,
15845 1.5512e-13, 1.4429e-13, 1.3437e-13, 1.2527e-13, 1.1693e-13,
15846 1.0927e-13, 1.0224e-13, 9.5767e-14, 8.9816e-14, 8.4335e-14,
15847 7.9285e-14, 7.4626e-14, 7.0325e-14, 6.6352e-14, 6.2676e-14,
15848 5.9274e-14, 5.6121e-14, 5.3195e-14, 5.0479e-14, 4.7953e-14,
15849 4.5602e-14, 4.3411e-14, 4.1367e-14, 3.9456e-14, 3.767e-14,
15850 3.5996e-14, 3.4427e-14, 3.2952e-14, 3.1566e-14, 3.0261e-14,
15851 2.903e-14, 2.7868e-14, 2.677e-14, 2.573e-14, 2.4745e-14,
15852 2.3809e-14, 2.2921e-14, 2.2076e-14, 2.1271e-14, 2.0504e-14,
15853 1.9772e-14, 1.9073e-14, 1.8404e-14, 1.7764e-14, 1.7151e-14,
15854 1.6564e-14, 1.6e-14, 1.5459e-14, 1.4939e-14, 1.4439e-14,
15855 1.3958e-14, 1.3495e-14, 1.3049e-14, 1.262e-14, 1.2206e-14,
15856 1.1807e-14, 1.1422e-14, 1.105e-14, 1.0691e-14, 1.0345e-14,
15857 1.001e-14, 9.687e-15, 9.3747e-15, 9.0727e-15, 8.7808e-15,
15858 8.4986e-15, 8.2257e-15, 7.9617e-15, 7.7064e-15, 7.4594e-15,
15859 7.2204e-15, 6.9891e-15, 6.7653e-15, 6.5488e-15, 6.3392e-15,
15860 6.1363e-15, 5.9399e-15, 5.7499e-15, 5.5659e-15, 5.3878e-15,
15861 5.2153e-15, 5.0484e-15, 4.8868e-15, 4.7303e-15, 4.5788e-15,
15862 4.4322e-15, 4.2902e-15, 4.1527e-15, 4.0196e-15, 3.8907e-15,
15863 3.7659e-15, 3.6451e-15, 3.5281e-15, 3.4149e-15, 3.3052e-15,
15864 3.1991e-15, 3.0963e-15, 2.9967e-15, 2.9004e-15, 2.8071e-15,
15865 2.7167e-15, 2.6293e-15, 2.5446e-15, 2.4626e-15, 2.3833e-15,
15866 2.3064e-15, 2.232e-15, 2.16e-15, 2.0903e-15, 2.0228e-15,
15867 1.9574e-15, 1.8942e-15, 1.8329e-15, 1.7736e-15, 1.7163e-15,
15868 1.6607e-15, 1.6069e-15, 1.5548e-15, 1.5044e-15, 1.4557e-15,
15869 1.4084e-15, 1.3627e-15, 1.3185e-15, 1.2757e-15, 1.2342e-15,
15870 1.1941e-15, 1.1552e-15, 1.1177e-15, 1.0813e-15, 1.0461e-15,
15871 1.012e-15, 9.79e-16, 9.4707e-16, 9.1618e-16, 8.8628e-16,
15872 8.5734e-16, 8.2933e-16, 8.0223e-16, 7.76e-16, 7.5062e-16,
15873 7.2606e-16, 7.0229e-16, 6.7929e-16, 6.5703e-16, 6.355e-16,
15874 6.1466e-16, 5.9449e-16, 5.7498e-16, 5.561e-16, 5.3783e-16,
15875 5.2015e-16, 5.0305e-16, 4.865e-16, 4.7049e-16, 4.55e-16,
15876 4.4002e-16, 4.2552e-16, 4.1149e-16, 3.9792e-16, 3.8479e-16,
15877 3.7209e-16, 3.5981e-16, 3.4792e-16, 3.3642e-16, 3.253e-16,
15878 3.1454e-16, 3.0413e-16, 2.9406e-16, 2.8432e-16, 2.749e-16,
15879 2.6579e-16, 2.5697e-16, 2.4845e-16, 2.402e-16, 2.3223e-16,
15880 2.2451e-16, 2.1705e-16, 2.0984e-16, 2.0286e-16, 1.9611e-16,
15881 1.8958e-16, 1.8327e-16, 1.7716e-16, 1.7126e-16, 1.6555e-16,
15882 1.6003e-16, 1.5469e-16, 1.4952e-16, 1.4453e-16, 1.397e-16,
15883 1.3503e-16 } };
15884
15885 struct s_sh2ob_ {
15886 double e_1[3];
15887 int e_2;
15888 } sh2ob_ = { {-20., 2e4, 10.}, 2003 };
15889
15890 struct s_s260a_ {
15891 double e_1[2003];
15892 } s260a_ = { {.1775, .17045, .16457, .17045, .1775, .20036, .21347, .22454,
15893 .23428, .23399, .23022, .20724, .19712, .18317, .16724, .1478,
15894 .12757, .11626, .10098, .089033, .07977, .067416, .059588,
15895 .051117, .046218, .042179, .034372, .029863, .025252, .022075,
15896 .019209, .015816, .013932, .011943, .010079, .0087667, .0074094,
15897 .0064967, .0055711, .0048444, .0042552, .0036953, .0032824,
15898 .0029124, .0026102, .002337, .00211, .0019008, .0017145, .0015573,
15899 .0014206, .0012931, .0011803, .0010774, 9.8616e-4, 9.0496e-4,
15900 8.3071e-4, 7.6319e-4, 7.0149e-4, 6.4637e-4, 5.9566e-4, 5.4987e-4,
15901 5.0768e-4, 4.688e-4, 4.3317e-4, 4.0037e-4, 3.7064e-4, 3.4325e-4,
15902 3.1809e-4, 2.9501e-4, 2.7382e-4, 2.543e-4, 2.363e-4, 2.1977e-4,
15903 2.0452e-4, 1.9042e-4, 1.774e-4, 1.6544e-4, 1.5442e-4, 1.4425e-4,
15904 1.3486e-4, 1.2618e-4, 1.1817e-4, 1.1076e-4, 1.0391e-4, 9.7563e-5,
15905 9.1696e-5, 8.6272e-5, 8.1253e-5, 7.6607e-5, 7.2302e-5, 6.8311e-5,
15906 6.4613e-5, 6.1183e-5, 5.8001e-5, 5.5048e-5, 5.2307e-5, 4.9761e-5,
15907 4.7395e-5, 4.5197e-5, 4.3155e-5, 4.1256e-5, 3.9491e-5, 3.7849e-5,
15908 3.6324e-5, 3.4908e-5, 3.3594e-5, 3.2374e-5, 3.1244e-5, 3.0201e-5,
15909 2.924e-5, 2.8356e-5, 2.7547e-5, 2.6814e-5, 2.6147e-5, 2.5551e-5,
15910 2.5029e-5, 2.4582e-5, 2.4203e-5, 2.3891e-5, 2.3663e-5, 2.3531e-5,
15911 2.3483e-5, 2.3516e-5, 2.3694e-5, 2.4032e-5, 2.4579e-5, 2.5234e-5,
15912 2.6032e-5, 2.7119e-5, 2.8631e-5, 3.0848e-5, 3.3262e-5, 3.6635e-5,
15913 4.0732e-5, 4.5923e-5, 5.3373e-5, 6.1875e-5, 7.2031e-5, 8.598e-5,
15914 9.8642e-5, 1.1469e-4, 1.3327e-4, 1.539e-4, 1.7513e-4, 2.0665e-4,
15915 2.3609e-4, 2.622e-4, 2.8677e-4, 3.259e-4, 3.8624e-4, 4.157e-4,
15916 4.5207e-4, 4.9336e-4, 5.45e-4, 5.8258e-4, 5.8086e-4, 5.6977e-4,
15917 5.3085e-4, 4.802e-4, 4.3915e-4, 4.0343e-4, 3.7853e-4, 3.7025e-4,
15918 3.9637e-4, 4.4675e-4, 4.7072e-4, 4.9022e-4, 5.2076e-4, 5.3676e-4,
15919 5.2755e-4, 4.8244e-4, 4.5473e-4, 4.3952e-4, 3.9614e-4, 3.4086e-4,
15920 2.9733e-4, 2.6367e-4, 2.3767e-4, 2.0427e-4, 1.7595e-4, 1.5493e-4,
15921 1.3851e-4, 1.1874e-4, 1.0735e-4, 9.049e-5, 8.1149e-5, 7.4788e-5,
15922 6.5438e-5, 5.8248e-5, 4.8076e-5, 4.3488e-5, 3.7856e-5, 3.3034e-5,
15923 2.9592e-5, 2.6088e-5, 2.3497e-5, 2.0279e-5, 1.7526e-5, 1.5714e-5,
15924 1.3553e-5, 1.2145e-5, 1.0802e-5, 9.7681e-6, 8.8196e-6, 7.8291e-6,
15925 7.1335e-6, 6.4234e-6, 5.8391e-6, 5.3532e-6, 4.9079e-6, 4.5378e-6,
15926 4.1716e-6, 3.8649e-6, 3.5893e-6, 3.3406e-6, 3.1199e-6, 2.9172e-6,
15927 2.7348e-6, 2.5644e-6, 2.4086e-6, 2.2664e-6, 2.1359e-6, 2.0159e-6,
15928 1.9051e-6, 1.8031e-6, 1.7074e-6, 1.6185e-6, 1.5356e-6, 1.4584e-6,
15929 1.3861e-6, 1.3179e-6, 1.2545e-6, 1.1951e-6, 1.1395e-6, 1.0873e-6,
15930 1.0384e-6, 9.925e-7, 9.4935e-7, 9.0873e-7, 8.705e-7, 8.3446e-7,
15931 8.0046e-7, 7.6834e-7, 7.38e-7, 7.0931e-7, 6.8217e-7, 6.5648e-7,
15932 6.3214e-7, 6.0909e-7, 5.8725e-7, 5.6655e-7, 5.4693e-7, 5.2835e-7,
15933 5.1077e-7, 4.9416e-7, 4.7853e-7, 4.6381e-7, 4.5007e-7, 4.3728e-7,
15934 4.255e-7, 4.145e-7, 4.0459e-7, 3.9532e-7, 3.8662e-7, 3.7855e-7,
15935 3.7041e-7, 3.6254e-7, 3.542e-7, 3.4617e-7, 3.3838e-7, 3.3212e-7,
15936 3.2655e-7, 3.1865e-7, 3.1203e-7, 3.067e-7, 3.0252e-7, 2.9749e-7,
15937 2.9184e-7, 2.8795e-7, 2.8501e-7, 2.8202e-7, 2.7856e-7, 2.7509e-7,
15938 2.7152e-7, 2.6844e-7, 2.6642e-7, 2.6548e-7, 2.6617e-7, 2.6916e-7,
15939 2.7372e-7, 2.8094e-7, 2.9236e-7, 3.1035e-7, 3.2854e-7, 3.5481e-7,
15940 3.9377e-7, 4.4692e-7, 5.0761e-7, 5.7715e-7, 6.7725e-7, 8.0668e-7,
15941 9.3716e-7, 1.0797e-6, 1.1689e-6, 1.3217e-6, 1.4814e-6, 1.5627e-6,
15942 1.6519e-6, 1.7601e-6, 1.906e-6, 2.0474e-6, 2.0716e-6, 2.0433e-6,
15943 1.9752e-6, 1.8466e-6, 1.7526e-6, 1.6657e-6, 1.587e-6, 1.5633e-6,
15944 1.652e-6, 1.8471e-6, 1.9953e-6, 2.0975e-6, 2.2016e-6, 2.2542e-6,
15945 2.3081e-6, 2.3209e-6, 2.2998e-6, 2.3056e-6, 2.2757e-6, 2.2685e-6,
15946 2.2779e-6, 2.2348e-6, 2.2445e-6, 2.3174e-6, 2.4284e-6, 2.529e-6,
15947 2.734e-6, 2.972e-6, 3.2332e-6, 3.5392e-6, 3.9013e-6, 4.3334e-6,
15948 4.9088e-6, 5.3428e-6, 5.9142e-6, 6.6106e-6, 7.4709e-6, 8.5019e-6,
15949 9.6835e-6, 1.0984e-5, 1.2831e-5, 1.4664e-5, 1.708e-5, 2.0103e-5,
15950 2.4148e-5, 2.7948e-5, 3.2855e-5, 3.9046e-5, 4.6429e-5, 5.6633e-5,
15951 6.6305e-5, 7.6048e-5, 8.7398e-5, 1.0034e-4, 1.1169e-4, 1.2813e-4,
15952 1.3354e-4, 1.3952e-4, 1.4204e-4, 1.4615e-4, 1.5144e-4, 1.5475e-4,
15953 1.6561e-4, 1.7135e-4, 1.6831e-4, 1.6429e-4, 1.6353e-4, 1.6543e-4,
15954 1.5944e-4, 1.5404e-4, 1.5458e-4, 1.6287e-4, 1.7277e-4, 1.8387e-4,
15955 1.7622e-4, 1.636e-4, 1.5273e-4, 1.3667e-4, 1.2364e-4, 9.7576e-5,
15956 7.914e-5, 6.4241e-5, 5.1826e-5, 4.1415e-5, 3.1347e-5, 2.5125e-5,
15957 2.0027e-5, 1.6362e-5, 1.3364e-5, 1.1117e-5, 9.4992e-6, 8.1581e-6,
15958 7.1512e-6, 6.2692e-6, 5.5285e-6, 4.9e-6, 4.3447e-6, 3.8906e-6,
15959 3.4679e-6, 3.1089e-6, 2.8115e-6, 2.5496e-6, 2.2982e-6, 2.0861e-6,
15960 1.8763e-6, 1.7035e-6, 1.5548e-6, 1.4107e-6, 1.2839e-6, 1.1706e-6,
15961 1.0709e-6, 9.8099e-7, 8.9901e-7, 8.2394e-7, 7.5567e-7, 6.9434e-7,
15962 6.3867e-7, 5.8845e-7, 5.4263e-7, 5.0033e-7, 4.6181e-7, 4.2652e-7,
15963 3.9437e-7, 3.6497e-7, 3.3781e-7, 3.1292e-7, 2.9011e-7, 2.6915e-7,
15964 2.4989e-7, 2.3215e-7, 2.1582e-7, 2.0081e-7, 1.87e-7, 1.7432e-7,
15965 1.6264e-7, 1.5191e-7, 1.4207e-7, 1.3306e-7, 1.2484e-7, 1.1737e-7,
15966 1.1056e-7, 1.0451e-7, 9.906e-8, 9.4135e-8, 8.9608e-8, 8.5697e-8,
15967 8.1945e-8, 7.8308e-8, 7.4808e-8, 7.1686e-8, 6.8923e-8, 6.5869e-8,
15968 6.3308e-8, 6.084e-8, 5.8676e-8, 5.6744e-8, 5.5016e-8, 5.3813e-8,
15969 5.2792e-8, 5.2097e-8, 5.1737e-8, 5.1603e-8, 5.1656e-8, 5.1989e-8,
15970 5.2467e-8, 5.2918e-8, 5.3589e-8, 5.456e-8, 5.5869e-8, 5.7403e-8,
15971 5.8968e-8, 6.0973e-8, 6.3432e-8, 6.6245e-8, 6.9353e-8, 7.2686e-8,
15972 7.6541e-8, 8.0991e-8, 8.595e-8, 9.1429e-8, 9.7851e-8, 1.0516e-7,
15973 1.1349e-7, 1.2295e-7, 1.3335e-7, 1.4488e-7, 1.5864e-7, 1.7412e-7,
15974 1.914e-7, 2.1078e-7, 2.3369e-7, 2.5996e-7, 2.8848e-7, 3.2169e-7,
15975 3.5991e-7, 4.0566e-7, 4.5969e-7, 5.3094e-7, 6.1458e-7, 7.1155e-7,
15976 8.3045e-7, 9.9021e-7, 1.2042e-6, 1.4914e-6, 1.8145e-6, 2.221e-6,
15977 2.7831e-6, 3.4533e-6, 4.4446e-6, 5.1989e-6, 6.2289e-6, 7.1167e-6,
15978 8.3949e-6, 9.6417e-6, 1.0313e-5, 1.0485e-5, 1.0641e-5, 1.0898e-5,
15979 1.0763e-5, 1.0506e-5, 1.0497e-5, 1.1696e-5, 1.2654e-5, 1.3029e-5,
15980 1.3175e-5, 1.4264e-5, 1.4985e-5, 1.4999e-5, 1.4317e-5, 1.4616e-5,
15981 1.4963e-5, 1.5208e-5, 1.4942e-5, 1.3879e-5, 1.3087e-5, 1.1727e-5,
15982 1.0515e-5, 9.0073e-6, 7.3133e-6, 6.1181e-6, 5.0623e-6, 4.1105e-6,
15983 3.3915e-6, 2.6711e-6, 2.1464e-6, 1.7335e-6, 1.4302e-6, 1.1847e-6,
15984 9.9434e-7, 8.2689e-7, 7.0589e-7, 6.075e-7, 5.3176e-7, 4.6936e-7,
15985 4.1541e-7, 3.6625e-7, 3.2509e-7, 2.9156e-7, 2.6308e-7, 2.3819e-7,
15986 2.1421e-7, 1.9366e-7, 1.7626e-7, 1.5982e-7, 1.4567e-7, 1.3354e-7,
15987 1.2097e-7, 1.1029e-7, 1.0063e-7, 9.2003e-8, 8.4245e-8, 7.7004e-8,
15988 7.0636e-8, 6.4923e-8, 5.9503e-8, 5.4742e-8, 5.045e-8, 4.647e-8,
15989 4.2881e-8, 3.955e-8, 3.6541e-8, 3.3803e-8, 3.1279e-8, 2.8955e-8,
15990 2.6858e-8, 2.4905e-8, 2.3146e-8, 2.1539e-8, 2.0079e-8, 1.8746e-8,
15991 1.7517e-8, 1.6396e-8, 1.5369e-8, 1.4426e-8, 1.3543e-8, 1.2724e-8,
15992 1.1965e-8, 1.1267e-8, 1.0617e-8, 1.001e-8, 9.4662e-9, 8.9553e-9,
15993 8.4988e-9, 8.0807e-9, 7.7043e-9, 7.3721e-9, 7.0707e-9, 6.8047e-9,
15994 6.5702e-9, 6.3634e-9, 6.1817e-9, 6.0239e-9, 5.8922e-9, 5.7824e-9,
15995 5.7019e-9, 5.6368e-9, 5.594e-9, 5.5669e-9, 5.5583e-9, 5.5653e-9,
15996 5.5837e-9, 5.6243e-9, 5.6883e-9, 5.78e-9, 5.8964e-9, 6.0429e-9,
15997 6.2211e-9, 6.4282e-9, 6.6634e-9, 6.9306e-9, 7.2336e-9, 7.5739e-9,
15998 7.9562e-9, 8.3779e-9, 8.8575e-9, 9.3992e-9, 1.0004e-8, 1.0684e-8,
15999 1.145e-8, 1.232e-8, 1.3311e-8, 1.4455e-8, 1.5758e-8, 1.7254e-8,
16000 1.8927e-8, 2.093e-8, 2.3348e-8, 2.6074e-8, 2.9221e-8, 3.277e-8,
16001 3.7485e-8, 4.2569e-8, 4.8981e-8, 5.5606e-8, 6.2393e-8, 7.1901e-8,
16002 8.2921e-8, 9.5513e-8, 1.1111e-7, 1.3143e-7, 1.5971e-7, 1.8927e-7,
16003 2.2643e-7, 2.786e-7, 3.2591e-7, 3.7024e-7, 4.2059e-7, 4.9432e-7,
16004 5.5543e-7, 5.7498e-7, 5.921e-7, 6.1005e-7, 6.1577e-7, 5.9193e-7,
16005 5.6602e-7, 5.7403e-7, 6.005e-7, 6.4723e-7, 6.7073e-7, 7.5415e-7,
16006 8.0982e-7, 8.7658e-7, 9.143e-7, 9.4459e-7, 9.8347e-7, 9.8768e-7,
16007 1.0153e-6, 1.0066e-6, 1.0353e-6, 1.0353e-6, 1.0722e-6, 1.1138e-6,
16008 1.1923e-6, 1.2947e-6, 1.4431e-6, 1.6537e-6, 1.8662e-6, 2.2473e-6,
16009 2.6464e-6, 3.1041e-6, 3.4858e-6, 4.0167e-6, 4.6675e-6, 5.0983e-6,
16010 5.7997e-6, 6.0503e-6, 6.4687e-6, 6.5396e-6, 6.7986e-6, 7.0244e-6,
16011 7.2305e-6, 7.6732e-6, 7.9783e-6, 7.9846e-6, 7.7617e-6, 7.7657e-6,
16012 7.7411e-6, 7.8816e-6, 7.8136e-6, 8.0051e-6, 8.5799e-6, 9.1659e-6,
16013 9.8646e-6, 9.492e-6, 8.767e-6, 8.2034e-6, 7.2297e-6, 6.2324e-6,
16014 4.9315e-6, 3.9128e-6, 3.1517e-6, 2.4469e-6, 1.8815e-6, 1.4627e-6,
16015 1.1698e-6, 9.4686e-7, 7.8486e-7, 6.697e-7, 5.8811e-7, 5.2198e-7,
16016 4.6809e-7, 4.1671e-7, 3.7006e-7, 3.3066e-7, 2.9387e-7, 2.6415e-7,
16017 2.3409e-7, 2.0991e-7, 1.9132e-7, 1.7519e-7, 1.5939e-7, 1.4368e-7,
16018 1.305e-7, 1.1883e-7, 1.0772e-7, 9.6884e-8, 8.7888e-8, 7.8956e-8,
16019 7.1024e-8, 6.3824e-8, 5.7256e-8, 5.1769e-8, 4.7037e-8, 4.2901e-8,
16020 3.897e-8, 3.5467e-8, 3.2502e-8, 2.9827e-8, 2.7389e-8, 2.5111e-8,
16021 2.3056e-8, 2.1267e-8, 1.961e-8, 1.8133e-8, 1.6775e-8, 1.5491e-8,
16022 1.4329e-8, 1.3265e-8, 1.23e-8, 1.142e-8, 1.0593e-8, 9.8475e-9,
16023 9.1585e-9, 8.5256e-9, 7.9525e-9, 7.4226e-9, 6.9379e-9, 6.495e-9,
16024 6.0911e-9, 5.7242e-9, 5.3877e-9, 5.0821e-9, 4.8051e-9, 4.5554e-9,
16025 4.3315e-9, 4.1336e-9, 3.9632e-9, 3.8185e-9, 3.708e-9, 3.6296e-9,
16026 3.5804e-9, 3.5776e-9, 3.6253e-9, 3.7115e-9, 3.8151e-9, 3.9804e-9,
16027 4.1742e-9, 4.3581e-9, 4.5306e-9, 4.7736e-9, 5.1297e-9, 5.5291e-9,
16028 5.9125e-9, 6.4956e-9, 7.0362e-9, 7.5318e-9, 7.9947e-9, 8.6438e-9,
16029 9.7227e-9, 1.013e-8, 1.0549e-8, 1.1064e-8, 1.1702e-8, 1.2043e-8,
16030 1.1781e-8, 1.1838e-8, 1.1917e-8, 1.2131e-8, 1.2476e-8, 1.3611e-8,
16031 1.436e-8, 1.5057e-8, 1.6247e-8, 1.7284e-8, 1.842e-8, 1.8352e-8,
16032 1.8722e-8, 1.9112e-8, 1.9092e-8, 1.9311e-8, 1.9411e-8, 1.9884e-8,
16033 2.0508e-8, 2.151e-8, 2.3143e-8, 2.505e-8, 2.7596e-8, 3.1231e-8,
16034 3.626e-8, 4.341e-8, 5.224e-8, 6.3236e-8, 7.7522e-8, 9.8688e-8,
16035 1.1859e-7, 1.4341e-7, 1.6798e-7, 1.9825e-7, 2.2898e-7, 2.6257e-7,
16036 2.9884e-7, 3.3247e-7, 3.4936e-7, 3.5583e-7, 3.715e-7, 3.658e-7,
16037 3.7124e-7, 3.703e-7, 4.1536e-7, 4.6656e-7, 4.6677e-7, 4.7507e-7,
16038 4.9653e-7, 5.3795e-7, 5.4957e-7, 5.2238e-7, 5.469e-7, 5.6569e-7,
16039 5.9844e-7, 5.9835e-7, 5.6522e-7, 5.4123e-7, 4.7904e-7, 4.2851e-7,
16040 3.5603e-7, 2.8932e-7, 2.3655e-7, 1.8592e-7, 1.4943e-7, 1.1971e-7,
16041 9.8482e-8, 8.3675e-8, 7.127e-8, 6.2496e-8, 5.4999e-8, 4.9821e-8,
16042 4.5387e-8, 4.134e-8, 3.7453e-8, 3.3298e-8, 3.012e-8, 2.7032e-8,
16043 2.4236e-8, 2.15e-8, 1.8988e-8, 1.7414e-8, 1.5706e-8, 1.4192e-8,
16044 1.3204e-8, 1.1759e-8, 1.0737e-8, 9.6309e-9, 8.8179e-9, 8.2619e-9,
16045 7.2264e-9, 6.4856e-9, 5.8037e-9, 5.2093e-9, 4.7205e-9, 4.1749e-9,
16046 3.7852e-9, 3.3915e-9, 3.0089e-9, 2.7335e-9, 2.4398e-9, 2.2031e-9,
16047 1.9786e-9, 1.789e-9, 1.6266e-9, 1.483e-9, 1.3576e-9, 1.2518e-9,
16048 1.1587e-9, 1.0726e-9, 9.9106e-10, 9.1673e-10, 8.5084e-10,
16049 7.9147e-10, 7.2882e-10, 6.7342e-10, 6.2593e-10, 5.8294e-10,
16050 5.4435e-10, 5.0997e-10, 4.7806e-10, 4.4931e-10, 4.2357e-10,
16051 4.0023e-10, 3.7909e-10, 3.5999e-10, 3.4285e-10, 3.2776e-10,
16052 3.1468e-10, 3.0377e-10, 2.9479e-10, 2.8877e-10, 2.8512e-10,
16053 2.8617e-10, 2.8976e-10, 3.0001e-10, 3.1718e-10, 3.3898e-10,
16054 3.5857e-10, 3.8358e-10, 4.3131e-10, 4.5741e-10, 4.6948e-10,
16055 4.7594e-10, 4.9529e-10, 5.1563e-10, 4.9475e-10, 4.8369e-10,
16056 4.8829e-10, 5.0047e-10, 5.0203e-10, 5.1954e-10, 5.5352e-10,
16057 5.9928e-10, 6.7148e-10, 7.1121e-10, 7.4317e-10, 7.6039e-10,
16058 7.8313e-10, 8.0684e-10, 7.8553e-10, 7.8312e-10, 7.8537e-10,
16059 7.8872e-10, 8.0185e-10, 8.1004e-10, 8.2608e-10, 8.2525e-10,
16060 8.3857e-10, 8.792e-10, 9.2451e-10, 9.8661e-10, 1.0629e-9,
16061 1.1659e-9, 1.2922e-9, 1.4387e-9, 1.6254e-9, 1.8425e-9, 2.1428e-9,
16062 2.5477e-9, 3.0379e-9, 3.757e-9, 4.4354e-9, 5.1802e-9, 6.2769e-9,
16063 7.4894e-9, 8.7474e-9, 9.8037e-9, 1.1582e-8, 1.3293e-8, 1.4471e-8,
16064 1.5025e-8, 1.558e-8, 1.6228e-8, 1.6413e-8, 1.602e-8, 1.6393e-8,
16065 1.7545e-8, 1.959e-8, 2.1449e-8, 2.3856e-8, 2.705e-8, 3.0214e-8,
16066 3.3733e-8, 3.6487e-8, 3.9353e-8, 4.266e-8, 4.6385e-8, 4.9955e-8,
16067 5.5313e-8, 6.0923e-8, 6.8948e-8, 7.3649e-8, 8.2602e-8, 9.2212e-8,
16068 9.908e-8, 1.1319e-7, 1.179e-7, 1.2941e-7, 1.3199e-7, 1.3914e-7,
16069 1.4843e-7, 1.53e-7, 1.6419e-7, 1.7095e-7, 1.6988e-7, 1.6494e-7,
16070 1.6327e-7, 1.6067e-7, 1.6909e-7, 1.7118e-7, 1.8106e-7, 1.9857e-7,
16071 2.1696e-7, 2.3385e-7, 2.2776e-7, 2.1402e-7, 1.9882e-7, 1.7362e-7,
16072 1.4308e-7, 1.1158e-7, 8.8781e-8, 6.8689e-8, 5.2062e-8, 4.0427e-8,
16073 3.2669e-8, 2.7354e-8, 2.32e-8, 2.058e-8, 1.8676e-8, 1.7329e-8,
16074 1.6621e-8, 1.6433e-8, 1.6953e-8, 1.7134e-8, 1.7948e-8, 1.9107e-8,
16075 1.9875e-8, 2.1416e-8, 2.1556e-8, 2.2265e-8, 2.2171e-8, 2.2534e-8,
16076 2.3029e-8, 2.2828e-8, 2.3143e-8, 2.2965e-8, 2.2223e-8, 2.1108e-8,
16077 2.0265e-8, 1.9516e-8, 1.9941e-8, 2.0312e-8, 2.108e-8, 2.2611e-8,
16078 2.421e-8, 2.6069e-8, 2.5097e-8, 2.3318e-8, 2.1543e-8, 1.8942e-8,
16079 1.596e-8, 1.2386e-8, 9.934e-9, 7.7502e-9, 5.9462e-9, 4.5113e-9,
16080 3.5523e-9, 2.8844e-9, 2.3394e-9, 1.9584e-9, 1.6749e-9, 1.4624e-9,
16081 1.2809e-9, 1.1359e-9, 1.0087e-9, 9.0166e-10, 8.1079e-10,
16082 7.2219e-10, 6.4922e-10, 5.8803e-10, 5.329e-10, 4.859e-10,
16083 4.4111e-10, 4.0184e-10, 3.6644e-10, 3.3529e-10, 3.0789e-10,
16084 2.8286e-10, 2.6089e-10, 2.4125e-10, 2.2355e-10, 2.0783e-10,
16085 1.937e-10, 1.8088e-10, 1.6948e-10, 1.5929e-10, 1.5013e-10,
16086 1.4193e-10, 1.347e-10, 1.2841e-10, 1.2307e-10, 1.1865e-10,
16087 1.1502e-10, 1.1243e-10, 1.1099e-10, 1.1066e-10, 1.1216e-10,
16088 1.1529e-10, 1.2171e-10, 1.3128e-10, 1.4153e-10, 1.5962e-10,
16089 1.8048e-10, 2.0936e-10, 2.3165e-10, 2.5746e-10, 2.96e-10,
16090 3.3707e-10, 3.5267e-10, 3.5953e-10, 3.6822e-10, 3.8363e-10,
16091 3.8286e-10, 3.5883e-10, 3.6154e-10, 3.6653e-10, 3.8507e-10,
16092 4.025e-10, 4.4435e-10, 4.9889e-10, 5.6932e-10, 6.3599e-10,
16093 7.0281e-10, 7.5777e-10, 8.1279e-10, 8.891e-10, 9.34e-10,
16094 1.0076e-9, 1.0945e-9, 1.1898e-9, 1.3108e-9, 1.4725e-9, 1.7028e-9,
16095 1.9619e-9, 2.3527e-9, 2.6488e-9, 3.0327e-9, 3.4396e-9, 3.8797e-9,
16096 4.4115e-9, 4.6853e-9, 4.9553e-9, 4.9551e-9, 5.1062e-9, 5.0996e-9,
16097 5.1119e-9, 5.2283e-9, 5.8297e-9, 6.3439e-9, 6.2675e-9, 6.3296e-9,
16098 6.5173e-9, 7.1685e-9, 7.0528e-9, 6.8856e-9, 7.3182e-9, 7.699e-9,
16099 8.3461e-9, 8.1946e-9, 7.7153e-9, 7.2411e-9, 6.4511e-9, 5.7336e-9,
16100 4.6105e-9, 3.6962e-9, 2.9944e-9, 2.4317e-9, 1.9399e-9, 1.5331e-9,
16101 1.2633e-9, 1.0613e-9, 9.0136e-10, 7.9313e-10, 7.1543e-10,
16102 6.6485e-10, 6.4225e-10, 6.398e-10, 6.4598e-10, 6.7428e-10,
16103 7.027e-10, 7.4694e-10, 7.7946e-10, 7.9395e-10, 7.8716e-10,
16104 7.6933e-10, 7.622e-10, 7.4825e-10, 7.4805e-10, 7.6511e-10,
16105 7.6492e-10, 7.4103e-10, 7.1979e-10, 7.1686e-10, 7.3403e-10,
16106 7.1142e-10, 7.0212e-10, 7.1548e-10, 7.5253e-10, 8.0444e-10,
16107 8.2378e-10, 7.8004e-10, 7.1712e-10, 6.4978e-10, 5.7573e-10,
16108 4.8675e-10, 3.7945e-10, 3.0118e-10, 2.4241e-10, 1.91e-10,
16109 1.4816e-10, 1.1567e-10, 9.4183e-11, 7.766e-11, 6.527e-11,
16110 5.6616e-11, 4.9576e-11, 4.4137e-11, 3.9459e-11, 3.5759e-11,
16111 3.2478e-11, 2.9419e-11, 2.6703e-11, 2.4365e-11, 2.2412e-11,
16112 2.0606e-11, 1.9067e-11, 1.78e-11, 1.6695e-11, 1.5729e-11,
16113 1.4887e-11, 1.4135e-11, 1.3519e-11, 1.2992e-11, 1.2563e-11,
16114 1.2223e-11, 1.1962e-11, 1.1775e-11, 1.1657e-11, 1.1605e-11,
16115 1.1619e-11, 1.1697e-11, 1.1839e-11, 1.2046e-11, 1.2319e-11,
16116 1.2659e-11, 1.307e-11, 1.3553e-11, 1.4113e-11, 1.4754e-11,
16117 1.548e-11, 1.6298e-11, 1.7214e-11, 1.8236e-11, 1.9372e-11,
16118 2.0635e-11, 2.2036e-11, 2.359e-11, 2.5317e-11, 2.7242e-11,
16119 2.94e-11, 3.1849e-11, 3.4654e-11, 3.7923e-11, 4.1695e-11,
16120 4.6055e-11, 5.094e-11, 5.5624e-11, 6.0667e-11, 6.6261e-11,
16121 7.2692e-11, 7.9711e-11, 8.7976e-11, 9.6884e-11, 1.0775e-10,
16122 1.2093e-10, 1.3531e-10, 1.5404e-10, 1.7315e-10, 1.9862e-10,
16123 2.3341e-10, 2.7014e-10, 3.1716e-10, 3.6957e-10, 4.3233e-10,
16124 5.2566e-10, 6.2251e-10, 7.2149e-10, 8.3958e-10, 9.5931e-10,
16125 1.1388e-9, 1.2973e-9, 1.4442e-9, 1.5638e-9, 1.6974e-9, 1.8489e-9,
16126 1.983e-9, 2.172e-9, 2.3662e-9, 2.6987e-9, 3.1697e-9, 3.6907e-9,
16127 4.2625e-9, 4.7946e-9, 5.3848e-9, 6.0897e-9, 6.473e-9, 7.1483e-9,
16128 7.7432e-9, 8.0851e-9, 8.5013e-9, 8.5909e-9, 9.189e-9, 9.3124e-9,
16129 9.5936e-9, 9.8787e-9, 9.9036e-9, 9.6712e-9, 9.2036e-9, 9.0466e-9,
16130 8.938e-9, 9.1815e-9, 9.5092e-9, 1.0027e-8, 1.0876e-8, 1.1744e-8,
16131 1.1853e-8, 1.1296e-8, 1.0134e-8, 8.8245e-9, 7.393e-9, 5.715e-9,
16132 4.4884e-9, 3.4027e-9, 2.6054e-9, 2.079e-9, 1.7267e-9, 1.4724e-9,
16133 1.2722e-9, 1.1234e-9, 1.0186e-9, 9.468e-10, 8.8854e-10,
16134 8.5127e-10, 8.3157e-10, 8.2226e-10, 8.3395e-10, 8.3294e-10,
16135 8.4725e-10, 8.8814e-10, 9.3697e-10, 1.0112e-9, 1.0412e-9,
16136 1.0948e-9, 1.181e-9, 1.2267e-9, 1.369e-9, 1.4512e-9, 1.5568e-9,
16137 1.6552e-9, 1.7321e-9, 1.8797e-9, 1.921e-9, 1.9686e-9, 1.9917e-9,
16138 1.9357e-9, 1.8486e-9, 1.7575e-9, 1.7113e-9, 1.7163e-9, 1.7623e-9,
16139 1.8536e-9, 1.9765e-9, 2.1334e-9, 2.3237e-9, 2.3259e-9, 2.1833e-9,
16140 1.9785e-9, 1.7308e-9, 1.4596e-9, 1.1198e-9, 8.7375e-10,
16141 6.5381e-10, 4.8677e-10, 3.6756e-10, 2.9155e-10, 2.3735e-10,
16142 1.959e-10, 1.6638e-10, 1.4549e-10, 1.2947e-10, 1.1511e-10,
16143 1.0548e-10, 9.6511e-11, 9.0469e-11, 8.517e-11, 7.7804e-11,
16144 7.1971e-11, 6.6213e-11, 6.1063e-11, 5.5881e-11, 5.0508e-11,
16145 4.5932e-11, 4.1997e-11, 3.7672e-11, 3.3972e-11, 3.0318e-11,
16146 2.6769e-11, 2.3874e-11, 2.1336e-11, 1.9073e-11, 1.7313e-11,
16147 1.5904e-11, 1.4684e-11, 1.3698e-11, 1.2873e-11, 1.2175e-11,
16148 1.1542e-11, 1.1024e-11, 1.0602e-11, 1.0267e-11, 1.0012e-11,
16149 9.8379e-12, 9.7482e-12, 9.7564e-12, 9.8613e-12, 1.0092e-11,
16150 1.0418e-11, 1.0868e-11, 1.1585e-11, 1.2351e-11, 1.3372e-11,
16151 1.4841e-11, 1.6457e-11, 1.8681e-11, 2.055e-11, 2.2912e-11,
16152 2.5958e-11, 2.9137e-11, 3.2368e-11, 3.4848e-11, 3.8462e-11,
16153 4.219e-11, 4.5629e-11, 4.9022e-11, 5.4232e-11, 6.19e-11,
16154 7.1953e-11, 8.5368e-11, 9.9699e-11, 1.1734e-10, 1.4185e-10,
16155 1.7017e-10, 1.9813e-10, 2.3859e-10, 2.7304e-10, 3.0971e-10,
16156 3.5129e-10, 3.9405e-10, 4.5194e-10, 4.8932e-10, 5.2436e-10,
16157 5.4098e-10, 5.5542e-10, 5.7794e-10, 5.6992e-10, 5.879e-10,
16158 6.1526e-10, 6.8034e-10, 6.7956e-10, 6.6864e-10, 6.9329e-10,
16159 7.2971e-10, 7.6546e-10, 7.5078e-10, 7.8406e-10, 8.3896e-10,
16160 9.0111e-10, 9.1994e-10, 8.7189e-10, 8.1426e-10, 7.3097e-10,
16161 6.3357e-10, 5.1371e-10, 4.0936e-10, 3.2918e-10, 2.6255e-10,
16162 2.0724e-10, 1.6879e-10, 1.4165e-10, 1.1989e-10, 1.0125e-10,
16163 8.9629e-11, 7.8458e-11, 6.8826e-11, 6.0935e-11, 5.5208e-11,
16164 5.2262e-11, 5.026e-11, 4.8457e-11, 4.7888e-11, 4.8032e-11,
16165 5.0838e-11, 5.4668e-11, 5.579e-11, 6.0056e-11, 6.3811e-11,
16166 6.8848e-11, 7.459e-11, 7.8249e-11, 8.3371e-11, 8.3641e-11,
16167 8.6591e-11, 8.9599e-11, 9.3487e-11, 1.0066e-10, 1.0765e-10,
16168 1.0851e-10, 1.0619e-10, 1.0557e-10, 1.046e-10, 1.0796e-10,
16169 1.0523e-10, 1.0674e-10, 1.1261e-10, 1.1431e-10, 1.1408e-10,
16170 1.0901e-10, 9.9105e-11, 8.8077e-11, 6.9928e-11, 5.4595e-11,
16171 4.5401e-11, 3.6313e-11, 2.6986e-11, 1.9463e-11, 1.4577e-11,
16172 1.1583e-11, 9.5492e-12, 8.077e-12, 6.9642e-12, 6.0966e-12,
16173 5.4046e-12, 4.8431e-12, 4.3815e-12, 3.9987e-12, 3.679e-12,
16174 3.4113e-12, 3.1868e-12, 2.9992e-12, 2.8434e-12, 2.7153e-12,
16175 2.612e-12, 2.5311e-12, 2.4705e-12, 2.429e-12, 2.4053e-12,
16176 2.3988e-12, 2.4087e-12, 2.4349e-12, 2.4771e-12, 2.5355e-12,
16177 2.6103e-12, 2.7019e-12, 2.811e-12, 2.9383e-12, 3.0848e-12,
16178 3.2518e-12, 3.4405e-12, 3.6527e-12, 3.8902e-12, 4.1555e-12,
16179 4.451e-12, 4.7801e-12, 5.1462e-12, 5.5539e-12, 6.0086e-12,
16180 6.5171e-12, 7.0884e-12, 7.7357e-12, 8.4831e-12, 9.3096e-12,
16181 1.0282e-11, 1.1407e-11, 1.269e-11, 1.4148e-11, 1.5888e-11,
16182 1.7992e-11, 2.0523e-11, 2.3342e-11, 2.6578e-11, 3.0909e-11,
16183 3.6228e-11, 4.2053e-11, 4.9059e-11, 5.9273e-11, 7.0166e-11,
16184 8.2298e-11, 9.7071e-11, 1.1673e-10, 1.401e-10, 1.6621e-10,
16185 2.0127e-10, 2.3586e-10, 2.705e-10, 3.095e-10, 3.6584e-10,
16186 4.1278e-10, 4.6591e-10, 5.222e-10, 5.5246e-10, 6.15e-10,
16187 6.5878e-10, 7.1167e-10, 7.9372e-10, 8.6975e-10, 9.6459e-10,
16188 9.7368e-10, 9.8142e-10, 1.0202e-9, 1.02e-9, 1.0356e-9, 1.0092e-9,
16189 1.0269e-9, 1.0366e-9, 1.049e-9, 1.0717e-9, 1.0792e-9, 1.1016e-9,
16190 1.0849e-9, 1.0929e-9, 1.0971e-9, 1.0969e-9, 1.046e-9, 9.2026e-10,
16191 8.1113e-10, 6.8635e-10, 5.5369e-10, 4.2908e-10, 3.3384e-10,
16192 2.648e-10, 2.081e-10, 1.6915e-10, 1.4051e-10, 1.1867e-10,
16193 1.0158e-10, 8.899e-11, 7.9175e-11, 7.044e-11, 6.3453e-11,
16194 5.7009e-11, 5.1662e-11, 4.7219e-11, 4.3454e-11, 4.0229e-11,
16195 3.7689e-11, 3.6567e-11, 3.5865e-11, 3.5955e-11, 3.5928e-11,
16196 3.6298e-11, 3.7629e-11, 3.93e-11, 4.1829e-11, 4.4806e-11,
16197 5.0534e-11, 5.6672e-11, 6.2138e-11, 6.8678e-11, 7.6111e-11,
16198 8.4591e-11, 9.2634e-11, 9.8085e-11, 1.083e-10, 1.1949e-10,
16199 1.2511e-10, 1.3394e-10, 1.3505e-10, 1.4342e-10, 1.4874e-10,
16200 1.492e-10, 1.5872e-10, 1.5972e-10, 1.5821e-10, 1.5425e-10,
16201 1.4937e-10, 1.5089e-10, 1.5521e-10, 1.6325e-10, 1.6924e-10,
16202 1.8265e-10, 1.9612e-10, 2.0176e-10, 1.9359e-10, 1.7085e-10,
16203 1.5197e-10, 1.2646e-10, 9.8552e-11, 7.453e-11, 5.5052e-11,
16204 4.2315e-11, 3.2736e-11, 2.6171e-11, 2.1909e-11, 1.8286e-11,
16205 1.5752e-11, 1.3859e-11, 1.2288e-11, 1.1002e-11, 9.7534e-12,
16206 8.8412e-12, 8.0169e-12, 7.2855e-12, 6.8734e-12, 6.4121e-12,
16207 6.1471e-12, 5.778e-12, 5.3478e-12, 4.9652e-12, 4.4043e-12,
16208 3.9862e-12, 3.4684e-12, 2.9681e-12, 2.5791e-12, 2.2339e-12,
16209 1.9247e-12, 1.6849e-12, 1.4863e-12, 1.3291e-12, 1.2021e-12,
16210 1.0947e-12, 1.0015e-12, 9.1935e-13, 8.4612e-13, 7.8036e-13,
16211 7.21e-13, 6.6718e-13, 6.1821e-13, 5.7353e-13, 5.3269e-13,
16212 4.9526e-13, 4.6093e-13, 4.2937e-13, 4.0034e-13, 3.7361e-13,
16213 3.4895e-13, 3.2621e-13, 3.052e-13, 2.8578e-13, 2.6782e-13,
16214 2.512e-13, 2.3581e-13, 2.2154e-13, 2.0832e-13, 1.9605e-13,
16215 1.8466e-13, 1.7408e-13, 1.6425e-13, 1.5511e-13, 1.4661e-13,
16216 1.3869e-13, 1.3131e-13, 1.2444e-13, 1.1803e-13, 1.1205e-13,
16217 1.0646e-13, 1.0124e-13, 9.6358e-14, 9.1789e-14, 8.7509e-14,
16218 8.3498e-14, 7.9735e-14, 7.6202e-14, 7.2882e-14, 6.976e-14,
16219 6.6822e-14, 6.4053e-14, 6.1442e-14, 5.8978e-14, 5.665e-14,
16220 5.4448e-14, 5.2364e-14, 5.0389e-14, 4.8516e-14, 4.6738e-14,
16221 4.5048e-14, 4.3441e-14, 4.1911e-14, 4.0453e-14, 3.9063e-14,
16222 3.7735e-14, 3.6467e-14, 3.5254e-14, 3.4093e-14, 3.298e-14,
16223 3.1914e-14, 3.0891e-14, 2.9909e-14, 2.8965e-14, 2.8058e-14,
16224 2.7185e-14, 2.6344e-14, 2.5535e-14, 2.4755e-14, 2.4002e-14,
16225 2.3276e-14, 2.2576e-14, 2.1899e-14, 2.1245e-14, 2.0613e-14,
16226 2.0002e-14, 1.9411e-14, 1.8839e-14, 1.8285e-14, 1.7749e-14,
16227 1.723e-14, 1.6727e-14, 1.624e-14, 1.5768e-14, 1.531e-14,
16228 1.4867e-14, 1.4436e-14, 1.4019e-14, 1.3614e-14, 1.3221e-14,
16229 1.284e-14, 1.2471e-14, 1.2112e-14, 1.1764e-14, 1.1425e-14,
16230 1.1097e-14, 1.0779e-14, 1.0469e-14, 1.0169e-14, 9.8775e-15,
16231 9.5943e-15, 9.3193e-15, 9.0522e-15, 8.7928e-15, 8.5409e-15,
16232 8.2962e-15, 8.0586e-15, 7.8278e-15, 7.6036e-15, 7.3858e-15,
16233 7.1742e-15, 6.9687e-15, 6.7691e-15, 6.5752e-15, 6.3868e-15,
16234 6.2038e-15, 6.026e-15, 5.8533e-15, 5.6856e-15, 5.5226e-15,
16235 5.3642e-15, 5.2104e-15, 5.061e-15, 4.9158e-15, 4.7748e-15,
16236 4.6378e-15, 4.5047e-15, 4.3753e-15, 4.2497e-15, 4.1277e-15,
16237 4.0091e-15, 3.8939e-15, 3.782e-15, 3.6733e-15, 3.5677e-15,
16238 3.4651e-15, 3.3655e-15, 3.2686e-15, 3.1746e-15, 3.0832e-15,
16239 2.9944e-15, 2.9082e-15, 2.8244e-15, 2.7431e-15, 2.664e-15,
16240 2.5872e-15, 2.5126e-15, 2.4401e-15, 2.3697e-15, 2.3014e-15,
16241 2.2349e-15, 2.1704e-15, 2.1077e-15, 2.0468e-15, 1.9877e-15,
16242 1.9302e-15, 1.8744e-15, 1.8202e-15, 1.7675e-15, 1.7164e-15,
16243 1.6667e-15, 1.6184e-15, 1.5716e-15, 1.526e-15, 1.4818e-15,
16244 1.4389e-15, 1.3971e-15, 1.3566e-15, 1.3172e-15, 1.279e-15,
16245 1.2419e-15, 1.2058e-15, 1.1708e-15, 1.1368e-15, 1.1037e-15,
16246 1.0716e-15, 1.0405e-15, 1.0102e-15, 9.8079e-16, 9.5224e-16,
16247 9.2451e-16, 8.9758e-16, 8.7142e-16, 8.4602e-16, 8.2136e-16,
16248 7.974e-16, 7.7414e-16, 7.5154e-16, 7.2961e-16, 7.083e-16,
16249 6.8761e-16, 6.6752e-16, 6.4801e-16, 6.2906e-16, 6.1066e-16,
16250 5.928e-16, 5.7545e-16, 5.586e-16, 5.4224e-16, 5.2636e-16,
16251 5.1094e-16, 4.9596e-16} };
16252
16253 struct s_s260b_ {
16254 double e_1[3];
16255 int e_2;
16256 } s260b_ = { {-20., 2e4, 10.}, 2003 };
16257
16258 struct s_consts_ {
16259 double e_1[9];
16260 } consts_ = { {3.1415927410125732, 6.62606876e-27, 1.3806503e-16,
16261 29979245800., 6.02214199e23, 2.6867775e19, 83144720.,
16262 1.191042722e-12, 1.4387752} };
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
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 double artsckd_(double p, double t, double vmrh2o,
16305 double vmrn2, double vmro2, double freq, int ivc)
16306 {
16307
16308
16309 static double xslf = 1.;
16310 static double xfrg = 1.;
16311 static double xcn2 = 1.;
16312
16313
16314 double ret_val=0.0e0;
16315
16316
16317
16318
16319 double w_wv__, oc_n2, radct;
16320 double w_other__, w_n2__, w_o2__;
16321 double of_wv, os_wv, p0, xn_wv__, t0, rhofac, wn, xn, xn0, tksvpt, rft;
16322
16323 extern int initi_(double, double , double *,
16324 double *, double *, double *, double *,
16325 double *, double *, double *, double *,
16326 double *, double *);
16327 extern double fwv_(int , double , double *, double *,
16328 double *, double *, double *, double *);
16329 extern double swv_(int , double , double , double *, double *
16330 , double *, double *, double *, double *,
16331 double *);
16332 extern double conti_n2__(double , double , double *,
16333 double *, double *, double *, double *);
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
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419 w_wv__ = 0.0e0;
16420 w_o2__ = 0.0e0;
16421 w_n2__ = 0.0e0;
16422 w_other__ = 0.0e0;
16423 ret_val = 0.0e0;
16424 rft = 0.0e0;
16425 os_wv = 0.0e0;
16426 of_wv = 0.0e0;
16427 oc_n2 = 0.0e0;
16428
16429
16430
16431
16432
16433 tksvpt = (p * 100.0) / t;
16434
16435 w_wv__ = vmrh2o * 7.242923e16 * tksvpt;
16436 w_o2__ = vmro2 * 7.242923e16 * tksvpt;
16437 w_n2__ = vmrn2 * 7.242923e16 * tksvpt;
16438 w_other__ = (1.0000E0-vmrh2o-vmro2-vmrn2) * 7.242923e16 * tksvpt;
16439
16440
16441 wn = freq / 29979245800.0;
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451 initi_(p, t, &radct, &t0, &p0, &w_wv__, &w_o2__, &w_n2__, &w_other__, &
16452 xn0, &xn, &xn_wv__, &rhofac);
16453
16454
16455
16456
16457
16458
16459
16460
16461 rft = wn * tanh(radct * wn / (t * 2));
16462
16463
16464
16465
16466 if (ivc == 21) {
16467
16468 os_wv = 1.0000e2 * swv_(2, wn, t, &t0, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xslf);
16469
16470 return os_wv;
16471 }
16472 if (ivc == 31) {
16473
16474 os_wv = 1.0000e2 * swv_(3, wn, t, &t0, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xslf);
16475
16476 return os_wv;
16477 }
16478 if (ivc == 22) {
16479
16480 of_wv = 1.0000e2 * fwv_(2, wn, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xfrg);
16481
16482 return of_wv;
16483 }
16484 if (ivc == 32) {
16485
16486 of_wv = 1.0000e2 * fwv_(3, wn, &w_wv__, &rft, &xn, &xn_wv__, &xn0, &xfrg);
16487
16488 return of_wv ;
16489 }
16490
16491
16492 if (ivc == 1) {
16493 oc_n2 = 1.0000e2 * conti_n2__(wn, t, &t0, &w_n2__, &rft, &rhofac, &xcn2);
16494
16495 return oc_n2;
16496 }
16497
16498
16499
16500
16501
16502
16503
16504 return ret_val;
16505 }
16506
16507
16508
16509
16510 double fwv_(int ivc, double wn, double *w_wv__, double *rft,
16511 double *xn, double *xn_wv__, double *xn0, double *xfrg)
16512 {
16513
16514 double ret_val = 0.0e0;
16515
16516
16517 extern double fwv24_(double , double *, double *,
16518 double *, double *, double *, double *),
16519 fwv_mpmf87s93__(double , double *, double *,
16520 double *, double *, double *, double *);
16521
16522 ret_val = 0.0e0;
16523
16524
16525 if (ivc == 2 && *w_wv__ > 0.) {
16526 ret_val = fwv24_(wn, w_wv__, rft, xn, xn_wv__, xn0, xfrg);
16527 }
16528
16529
16530
16531 if (ivc == 3 && *w_wv__ > 0.) {
16532 ret_val = fwv_mpmf87s93__(wn, w_wv__, rft, xn, xn_wv__, xn0, xfrg);
16533 }
16534
16535 return ret_val;
16536 }
16537
16538 double fwv_mpmf87s93__(double wn, double *w_wv__, double *rft,
16539 double *xn, double *xn_wv__, double *xn0, double *xfrg)
16540 {
16541
16542 double ret_val=0.0e0;
16543
16544
16545 extern double xlgr_(double *, double *);
16546 int i__, j;
16547 double x[4], fscal, xf;
16548
16549 ret_val = 0.0e0;
16550
16551 j = (int) ((wn - fh2ob_1.v1) / fh2ob_1.dv) + 1;
16552
16553 for (i__ = 1; i__ <= 4; ++i__) {
16554 x[i__ - 1] = fh2oa_1.fh2o[j + i__ - 3];
16555 }
16556
16557 xf = (wn - (fh2ob_1.v1 + fh2ob_1.dv * (double) (j - 1))) /
16558 fh2ob_1.dv;
16559 fscal = .8;
16560 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_wv__ * *rft * ((*xn - *xn_wv__) / *
16561 xn0)) * fscal * *xfrg;
16562
16563
16564 return ret_val;
16565 }
16566
16567 double fwv24_(double wn, double *w_wv__, double *rft,
16568 double *xn, double *xn_wv__, double *xn0, double *
16569 xfrg)
16570 {
16571
16572
16573 static double v0f1 = 350.;
16574 static double hwsqf1 = 4e4;
16575 static double betaf1 = 5e-9;
16576 static double factrf1 = -.7;
16577 static double v0f1a = 630.;
16578 static double hwsqf1a = 4225.;
16579 static double betaf1a = 2e-8;
16580 static double factrf1a = .75;
16581 static double v0f2 = 1130.;
16582 static double hwsqf2 = 108900.;
16583 static double betaf2 = 8e-11;
16584 static double factrf2 = -.97;
16585 static double v0f3 = 1975.;
16586 static double hwsqf3 = 62500.;
16587 static double betaf3 = 5e-6;
16588 static double factrf3 = -.65;
16589
16590
16591 double ret_val=0.0e0;
16592 double d__1;
16593
16594
16595 extern double xlgr_(double *, double *);
16596 int i__, j;
16597 double x[4], fscal, xf, vf2, vf4, vf6;
16598
16599 ret_val = 0.0e0;
16600
16601 j = (int) ((wn - fh2ob_1.v1) / fh2ob_1.dv) + 1;
16602 for (i__ = 1; i__ <= 4; ++i__) {
16603 x[i__ - 1] = fh2oa_1.fh2o[j + i__ - 3];
16604 }
16605
16606 xf = (wn - (fh2ob_1.v1 + fh2ob_1.dv * (double) (j - 1))) /
16607 fh2ob_1.dv;
16608
16609
16610
16611 d__1 = wn - v0f1;
16612 vf2 = d__1 * d__1;
16613 vf6 = vf2 * vf2 * vf2;
16614 fscal = factrf1 * (hwsqf1 / (vf2 + betaf1 * vf6 + hwsqf1)) + 1.;
16615
16616 d__1 = wn - v0f1a;
16617 vf2 = d__1 * d__1;
16618 vf6 = vf2 * vf2 * vf2;
16619 fscal *= factrf1a * (hwsqf1a / (vf2 + betaf1a * vf6 + hwsqf1a)) + 1.;
16620
16621 d__1 = wn - v0f2;
16622 vf2 = d__1 * d__1;
16623 vf6 = vf2 * vf2 * vf2;
16624 fscal *= factrf2 * (hwsqf2 / (vf2 + betaf2 * vf6 + hwsqf2)) + 1.;
16625
16626 d__1 = wn - v0f3;
16627 vf2 = d__1 * d__1;
16628 vf4 = vf2 * vf2;
16629 fscal *= factrf3 * (hwsqf3 / (vf2 + betaf3 * vf4 + hwsqf3)) + 1.;
16630 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_wv__ * *rft * ((*xn - *xn_wv__) / *
16631 xn0)) * fscal * *xfrg;
16632
16633
16634 return ret_val;
16635 }
16636
16637
16638
16639
16640 double swv_(int ivc, double wn, double t, double *t0,
16641 double *w_wv__, double *rft, double *xn, double *
16642 xn_wv__, double *xn0, double *xslf)
16643 {
16644
16645 double ret_val;
16646
16647
16648 extern double swv_mpmf87s93__(double , double , double *
16649 , double *, double *, double *, double *,
16650 double *, double *);
16651 extern double swv24_(double , double ,
16652 double *, double *, double *, double *,
16653 double *, double *, double *);
16654
16655 ret_val = 0.;
16656
16657
16658 if (ivc == 2 && *w_wv__ > 0.) {
16659
16660 ret_val = swv24_(wn, t, t0, w_wv__, rft, xn, xn_wv__, xn0, xslf);
16661 }
16662
16663 if (ivc == 3 && *w_wv__ > 0.) {
16664
16665
16666 ret_val = swv_mpmf87s93__(wn, t, t0, w_wv__, rft, xn, xn_wv__, xn0,
16667 xslf);
16668 }
16669
16670 return ret_val;
16671 }
16672
16673
16674
16675 double swv24_(double wn, double t, double *t0, double *
16676 w_wv__, double *rft, double * , double *xn_wv__,
16677 double *xn0, double *xslf)
16678 {
16679
16680
16681 static double v0s1 = 0.;
16682 static double hwsq1 = 1e4;
16683 static double betas1 = 1e-4;
16684 static double factrs1 = .688;
16685 static double v0s2 = 1050.;
16686 static double hwsq2 = 4e4;
16687 static double factrs2 = -.2333;
16688 static double v0s3 = 1310.;
16689 static double hwsq3 = 14400.;
16690 static double betas3 = 5e-6;
16691 static double factrs3 = -.15;
16692
16693
16694 double ret_val, d__1, d__2;
16695
16696
16697 double sfac;
16698 extern double xlgr_(double *, double *);
16699 int j;
16700 double x[4], xf, vs2, vs4;
16701
16702
16703
16704 ret_val = 0.;
16705
16706 j = (int) ((wn - sh2ob_1.v1) / sh2ob_1.dv) + 1;
16707 d__1 = s260a_1.swv260[j - 2] / sh2oa_1.swv296[j - 2];
16708 d__2 = (t - *t0) / (260. - *t0);
16709 x[0] = sh2oa_1.swv296[j - 2] * 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[1] = sh2oa_1.swv296[j - 1] * pow(d__1, d__2);
16713 d__1 = s260a_1.swv260[j] / sh2oa_1.swv296[j];
16714 d__2 = (t - *t0) / (260. - *t0);
16715 x[2] = sh2oa_1.swv296[j] * pow(d__1, d__2);
16716 d__1 = s260a_1.swv260[j + 1] / sh2oa_1.swv296[j + 1];
16717 d__2 = (t - *t0) / (260. - *t0);
16718 x[3] = sh2oa_1.swv296[j + 1] * pow(d__1, d__2);
16719 xf = (wn - (sh2ob_1.v1 + sh2ob_1.dv * (double) (j - 1))) /
16720 sh2ob_1.dv;
16721 sfac = 1.;
16722
16723 d__1 = wn - v0s1;
16724 vs2 = d__1 * d__1;
16725 vs4 = vs2 * vs2;
16726
16727 d__1 = wn;
16728 sfac *= factrs1 * (hwsq1 / (d__1 * d__1 + betas1 * vs4 + hwsq1)) + 1.;
16729
16730 d__1 = wn - v0s2;
16731 vs2 = d__1 * d__1;
16732 sfac *= factrs2 * (hwsq2 / (vs2 + hwsq2)) + 1.;
16733
16734 d__1 = wn - v0s3;
16735 vs2 = d__1 * d__1;
16736 vs4 = vs2 * vs2;
16737 sfac *= factrs3 * (hwsq3 / (vs2 + betas3 * vs4 + hwsq3)) + 1.;
16738 ret_val = *w_wv__ * *rft * (*xn_wv__ / *xn0) * xlgr_(&xf, x) * 1e-20 *
16739 sfac * *xslf;
16740
16741 return ret_val;
16742 }
16743
16744 double swv_mpmf87s93__(double wn, double t, double *t0,
16745 double *w_wv__, double *rft, double * , double *
16746 xn_wv__, double *xn0, double *xslf)
16747 {
16748
16749 double ret_val, d__1, d__2;
16750
16751
16752 double sfac;
16753 extern double xlgr_(double *, double *);
16754 int j;
16755 double x[4], xf;
16756
16757
16758
16759 ret_val = 0.;
16760
16761 j = (int) ((wn - sh2ob_1.v1) / sh2ob_1.dv) + 1;
16762 d__1 = s260a_1.swv260[j - 2] / sh2oa_1.swv296[j - 2];
16763 d__2 = (t - *t0) / (260. - *t0);
16764 x[0] = sh2oa_1.swv296[j - 2] * pow(d__1, d__2);
16765 d__1 = s260a_1.swv260[j - 1] / sh2oa_1.swv296[j - 1];
16766 d__2 = (t - *t0) / (260. - *t0);
16767 x[1] = sh2oa_1.swv296[j - 1] * pow(d__1, d__2);
16768 d__1 = s260a_1.swv260[j] / sh2oa_1.swv296[j];
16769 d__2 = (t - *t0) / (260. - *t0);
16770 x[2] = sh2oa_1.swv296[j] * pow(d__1, d__2);
16771 d__1 = s260a_1.swv260[j + 1] / sh2oa_1.swv296[j + 1];
16772 d__2 = (t - *t0) / (260. - *t0);
16773 x[3] = sh2oa_1.swv296[j + 1] * pow(d__1, d__2);
16774 xf = (wn - (sh2ob_1.v1 + sh2ob_1.dv * (double) (j - 1))) /
16775 sh2ob_1.dv;
16776 sfac = 3.;
16777 ret_val = *w_wv__ * *rft * (*xn_wv__ / *xn0) * xlgr_(&xf, x) * 1e-20 *
16778 sfac * *xslf;
16779
16780
16781 return ret_val;
16782 }
16783
16784
16785 double conti_n2__(double wn, double t, double *t0,
16786 double *w_n2__, double *rft, double *rhofac, double *
16787 xcn2)
16788 {
16789
16790
16791 static double v1 = -10.;
16792 static double dv = 5.;
16793 static double ct296[73] = { 4.303e-7,4.85e-7,4.979e-7,4.85e-7,
16794 4.303e-7,3.715e-7,3.292e-7,3.086e-7,2.92e-7,2.813e-7,2.804e-7,
16795 2.738e-7,2.726e-7,2.724e-7,2.635e-7,2.621e-7,2.547e-7,2.428e-7,
16796 2.371e-7,2.228e-7,2.1e-7,1.991e-7,1.822e-7,1.697e-7,1.555e-7,
16797 1.398e-7,1.281e-7,1.138e-7,1.012e-7,9.078e-8,7.879e-8,6.944e-8,
16798 6.084e-8,5.207e-8,4.54e-8,3.897e-8,3.313e-8,2.852e-8,2.413e-8,
16799 2.045e-8,1.737e-8,1.458e-8,1.231e-8,1.031e-8,8.586e-9,7.162e-9,
16800 5.963e-9,4.999e-9,4.226e-9,3.607e-9,3.09e-9,2.669e-9,2.325e-9,
16801 2.024e-9,1.783e-9,1.574e-9,1.387e-9,1.236e-9,1.098e-9,9.777e-10,
16802 8.765e-10,7.833e-10,7.022e-10,6.317e-10,5.65e-10,5.1e-10,
16803 4.572e-10,4.115e-10,3.721e-10,3.339e-10,3.005e-10,2.715e-10,
16804 2.428e-10 };
16805 static double ct220[73] = { 4.946e-7,5.756e-7,5.964e-7,5.756e-7,
16806 4.946e-7,4.145e-7,3.641e-7,3.482e-7,3.34e-7,3.252e-7,3.299e-7,
16807 3.206e-7,3.184e-7,3.167e-7,2.994e-7,2.943e-7,2.794e-7,2.582e-7,
16808 2.468e-7,2.237e-7,2.038e-7,1.873e-7,1.641e-7,1.474e-7,1.297e-7,
16809 1.114e-7,9.813e-8,8.309e-8,7.059e-8,6.068e-8,5.008e-8,4.221e-8,
16810 3.537e-8,2.885e-8,2.407e-8,1.977e-8,1.605e-8,1.313e-8,1.057e-8,
16811 8.482e-9,6.844e-9,5.595e-9,4.616e-9,3.854e-9,3.257e-9,2.757e-9,
16812 2.372e-9,2.039e-9,1.767e-9,1.548e-9,1.346e-9,1.181e-9,1.043e-9,
16813 9.11e-10,8.103e-10,7.189e-10,6.314e-10,5.635e-10,4.976e-10,
16814 4.401e-10,3.926e-10,3.477e-10,3.085e-10,2.745e-10,2.416e-10,
16815 2.155e-10,1.895e-10,1.678e-10,1.493e-10,1.31e-10,1.154e-10,
16816 1.019e-10,8.855e-11 };
16817
16818
16819 double ret_val, d__1, d__2;
16820
16821
16822 extern double xlgr_(double *, double *);
16823 int j;
16824 double x[4], xf;
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835 ret_val = 0.;
16836
16837 if (wn <= 0.) {
16838 ret_val = 0.;
16839 return ret_val;
16840 }
16841 if (wn > 350.) {
16842 ret_val = 0.;
16843 return ret_val;
16844 }
16845
16846
16847 if (*w_n2__ == 0.) {
16848 ret_val = 0.;
16849 return ret_val;
16850 }
16851
16852 j = (int) ((wn - v1) / dv) + 1;
16853 d__1 = ct296[j - 2] / ct220[j - 2];
16854 d__2 = (t - *t0) / (220. - *t0);
16855 x[0] = ct296[j - 2] * pow(d__1, d__2);
16856 d__1 = ct296[j - 1] / ct220[j - 1];
16857 d__2 = (t - *t0) / (220. - *t0);
16858 x[1] = ct296[j - 1] * pow(d__1, d__2);
16859 d__1 = ct296[j] / ct220[j];
16860 d__2 = (t - *t0) / (220. - *t0);
16861 x[2] = ct296[j] * pow(d__1, d__2);
16862 d__1 = ct296[j + 1] / ct220[j + 1];
16863 d__2 = (t - *t0) / (220. - *t0);
16864 x[3] = ct296[j + 1] * pow(d__1, d__2);
16865 xf = (wn - (v1 + dv * (double) (j - 1))) / dv;
16866 ret_val = xlgr_(&xf, x) * 1e-20 * (*w_n2__ / .26867775 * *rft * *rhofac) *
16867 *xcn2;
16868
16869 return ret_val;
16870 }
16871
16872
16873 double xlgr_(double *xf, double *x)
16874 {
16875
16876 double ret_val;
16877
16878
16879 double a[4], b;
16880
16881
16882
16883
16884
16885
16886 --x;
16887
16888
16889 b = *xf * .5 * (1. - *xf);
16890 a[0] = -b * (1. - *xf);
16891 a[1] = 1. - (3. - *xf * 2.) * *xf * *xf + b * *xf;
16892 a[2] = (3. - *xf * 2.) * *xf * *xf + b * (1. - *xf);
16893 a[3] = -(b * *xf);
16894 ret_val = a[0] * x[1] + a[1] * x[2] + a[2] * x[3] + a[3] * x[4];
16895
16896
16897 return ret_val;
16898 }
16899
16900
16901 int initi_(double p, double t, double *radct,
16902 double *t0, double *p0, double *w_wv__, double *
16903 w_o2__, double *w_n2__, double *w_other__, double *xn0,
16904 double *xn, double *xn_wv__, double *rhofac)
16905 {
16906
16907
16908 static double wvmolmass = 18.016;
16909 static double drymolmass = 28.97;
16910
16911 double wdry, ratiomix, wvpress;
16912
16913
16914 *t0 = 296.;
16915
16916 *p0 = 1013.25;
16917
16918
16919 *radct = consts_1.planck * consts_1.clight / consts_1.boltz;
16920 *xn0 = *p0 / (consts_1.boltz * *t0) * 1e3;
16921 *xn = p / (consts_1.boltz * t) * 1e3;
16922 wdry = *w_o2__ + *w_n2__ + *w_other__;
16923 ratiomix = *w_wv__ * wvmolmass / (wdry * drymolmass);
16924 wvpress = ratiomix / (ratiomix + wvmolmass / drymolmass) * p;
16925 *xn_wv__ = wvpress / (consts_1.boltz * t) * 1e3;
16926 *rhofac = *w_n2__ / (wdry + *w_wv__) * (p / *p0) * (273.15 / t);
16927
16928
16929 return 0;
16930 }
16931
16932
16933
16934 int phys_consts__(void)
16935 {
16936 return 0;
16937 }
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953 int bsa296_(void)
16954 {
16955 return 0;
16956 }
16957
16958
16959
16960
16961
16962
16963
16964 int bsb296_(void)
16965 {
16966 return 0;
16967 }
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978 int bs260a_(void)
16979 {
16980 return 0;
16981 }
16982
16983
16984
16985
16986
16987
16988
16989
16990 int bs260b_(void)
16991 {
16992 return 0;
16993 }
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004 int bfh2oa_(void)
17005 {
17006 return 0;
17007 }
17008
17009
17010
17011
17012
17013
17014
17015
17016 int bfh2ob_(void)
17017 {
17018 return 0;
17019 }
17020
17021
17022