diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8e5cff --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +/data +logger.txt diff --git a/README.md b/README.md index 398f714..21b6e11 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,15 @@ On Mac: https://penandpants.com/2012/02/24/install-python/ All absorption lines, intensities, and relevant info are downloaded from hitran.org and stored locally. -For a more comprehensive (ie professional package), be sure to check out HAPI (Hitran API) http://hitran.org/hapi. It is free and open source as well. This project has been more personal opportunity to test and improve my own understanding of radiative transfer through gases. The final version of this project should support modeling radiative transfer through any atmospheric composition. Currently, it serves as a gas cell simulator, similar to http://www.spectralcalc.com/calc/spectralcalc.php +For a more comprehensive (ie professional package), be sure to check out HAPI (Hitran API) http://hitran.org/hapi. It is free and open source as well. This project has been more personal opportunity to test and improve my own understanding of radiative transfer through gases. +The final version of this project should support modeling radiative transfer through any atmospheric composition. Currently, it serves as a gas cell simulator, similar to http://www.spectralcalc.com/calc/spectralcalc.php + +Version 3: +Big jump happening all at once here, but 3.0 is live now. PyRad is officially a line-by-line, radiatvie transfer model for an atmosphere. +-Interactive mode allows access to gas cell simulator, plotting of planck curves (by wavelength, wavenumber, or Hz), and processing and plotting of radiative transfer through an atmosphere +-profiles can be created for custom atmospheres and saved in the PyRad folder. Be sure to use a .pyr extension +-theme files for changing plot colors can be created and added to the theme folder. Again, use a .pyr extension so they are seen +-see below for details on how to create a custom atmosphere Version 1.5: -Release of interactive mode. Simply run the pyrad.py file to access the menu. @@ -26,3 +34,6 @@ HAPI Interface - R.V. Kochanov, I.E. Gordon, L.S. Rothman, P. Wcislo, C. Hill, J Tom Marshall of GATS-Inc.com, for providing guidance in resolving personal ignorances of units. Eli Rabett, for his patience in helping me understand concepts that I have not received an education on previously. + + +Creating a custom atmosphere profile/planet: diff --git a/afgl/midlatitude summer.csv b/afgl/midlatitude summer.csv new file mode 100644 index 0000000..b9fadf5 --- /dev/null +++ b/afgl/midlatitude summer.csv @@ -0,0 +1,52 @@ +midlatitude summer,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1.01E+03,294.2,2.50E+19,1.86E+04,3.02E-02,3.20E-01,1.50E-01,1.70E+00 +1,9.02E+02,289.7,2.26E+12,1.38E+04,3.34E-02,3.20E-01,1.45E-01,1.70E+00 +2,8.02E+02,295.2,2.04E+19,9.68E+03,3.69E-02,3.20E-01,1.40E-01,1.70E+00 +3,7.10E+02,279.2,1.84E+19,5.98E+03,4.22E-02,3.20E-01,1.35E-01,1.70E+00 +4,6.28E+02,273.2,1.67E+19,3.81E+03,4.82E-02,3.20E-01,1.31E-01,1.70E+00 +5,5.54E+02,287.2,1.50E+19,2.23E+03,5.51E-02,3.20E-01,1.30E-01,1.69E+00 +6,4.87E+02,261.2,1.35E+19,1.51E+03,6.41E-02,3.20E-01,1.29E-01,1.67E+00 +7,4.26E+02,254.7,1.21E+19,1.02E+03,7.76E-02,3.20E-01,1.26E-01,1.65E+00 +8,3.72E+02,248.2,1.09E+19,6.46E+02,9.13E-02,3.20E-01,1.20E-01,1.63E+00 +9,3.24E+02,241.7,9.72E+18,4.13E+02,1.11E-01,3.16E-01,1.09E-01,1.62E+00 +10,2.81E+02,235.3,8.66E+18,2.47E+02,1.30E-01,3.10E-01,9.96E-02,1.58E+00 +11,2.43E+02,228.8,7.70E+18,9.56E+01,1.79E-01,2.99E-01,8.96E-02,1.54E+00 +12,2.09E+02,222.3,6.81E+10,2.94E+01,2.23E-01,2.94E-01,7.81E-02,1.51E+00 +13,1.79E+02,215.8,6.01E+18,8.00E+00,3.00E-01,2.86E-01,6.37E-02,1.48E+00 +14,1.53E+02,215.7,5.14E+18,5.00E+00,4.40E-01,2.80E-01,5.03E-02,1.45E+00 +15,1.30E+02,215.7,4.37E+18,3.40E+00,5.00E-01,2.72E-01,3.94E-02,1.42E+00 +16,1.11E+02,215.7,3.73E+18,3.30E+00,6.00E-01,2.61E-01,3.07E-02,1.39E+00 +17,9.50E+01,215.7,3.19E+18,3.20E+00,7.00E-01,2.42E-01,2.49E-02,1.36E+00 +18,8.12E+01,216.8,2.72E+18,3.15E+00,1.00E+00,2.17E-01,1.97E-02,1.32E+00 +19,6.95E+01,217.9,2.31E+18,3.20E+00,1.50E+00,1.84E-01,1.66E-02,1.28E+00 +20,6.95E+01,219.2,1.97E+18,3.30E+00,2.00E+00,1.61E-01,1.33E-02,1.22E+00 +21,5.10E+01,220.4,1.68E+13,3.45E+00,2.40E+00,1.32E-01,1.23E-02,1.15E+00 +22,4.37E+01,221.6,1.43E+18,3.60E+00,2.90E+00,1.15E-01,1.23E-02,1.07E+00 +23,3.76E+01,222.8,1.22E+18,3.85E+00,3.40E+00,1.04E-01,1.31E-02,9.73E-01 +24,3.22E+01,223.9,1.04E+18,4.00E+00,4.00E+00,9.62E-02,1.40E-02,8.80E-01 +25,2.77E+01,225.1,8.92E+17,4.20E+00,4.80E+00,8.96E-02,1.52E-02,7.89E-01 +27.6,1.91E+01,228.5,6.05E+17,4.45E+00,6.00E+00,8.01E-02,1.72E-02,7.05E-01 +30,1.32E+01,233.7,4.09E+17,4.70E+00,7.00E+00,6.70E-02,2.00E-02,6.32E-01 +32.6,9.30E+00,239,2.82E+17,4.87E+00,8.10E+00,4.95E-02,2.27E-02,5.59E-01 +35,6.52E+00,245.2,1.93E+17,4.95E+00,8.90E+00,3.70E-02,2.49E-02,5.01E-01 +37.5,4.64E+00,251.3,1.34E+17,5.00E+00,8.70E+00,2.52E-02,2.72E-02,4.45E-01 +40,3.33E+00,257.5,9.37E+16,5.10E+00,7.55E+00,1.74E-02,2.96E-02,3.92E-01 +42.5,2.41E+00,263.7,6.62E+16,5.30E+00,5.90E+00,1.16E-02,3.14E-02,3.39E-01 +45,1.76E+00,269.9,4.73E+16,5.45E+00,4.50E+00,7.67E-03,3.31E-02,2.87E-01 +47.5,1.29E+00,275.2,3.40E+16,5.50E+00,3.50E+00,5.32E-03,3.49E-02,2.38E-01 +50,9.51E-01,275.7,2.50E+16,5.50E+00,2.80E+00,3.22E-30,3.65E-02,1.94E-01 +55,5.15E-01,269.3,1.39E+16,5.35E+00,1.80E+00,2.03E-03,3.92E-02,1.57E-01 +60,2.72E-01,257.1,7.67E+15,5.00E+00,1.30E+00,1.40E-03,4.67E-02,1.50E-01 +65,1.39E-01,240.1,4.20E+16,4.40E+00,8.00E-01,1.02E-03,6.40E-02,1.50E-01 +70,6.70E-02,218,2.27E+15,3.70E+00,4.00E-01,7.77E-04,1.18E-01,1.50E-01 +75,3.00E-02,196.1,1.11E+15,2.95E+00,1.90E-01,6.26E-04,2.94E-01,1.50E-01 +80,1.20E-02,174.1,5.00E+14,2.10E+00,2.00E-01,5.17E-04,6.82E-01,1.50E-01 +85,4.48E-03,165.1,1.97E+14,1.33E+00,5.70E-01,4.35E-04,1.47E+00,1.50E-01 +90,1.84E-03,165,7.20E+13,8.50E-01,7.50E-01,3.73E-04,2.85E+00,1.40E-01 +95,6.25E-04,178.3,2.54E+13,5.40E-01,7.00E-01,3.24E-04,5.17E+00,1.30E-01 +100,2.58E-04,190.5,9.82E+12,4.00E-01,4.03E-01,2.84E-04,1.01E+01,1.20E-01 +105,1.17E-04,222.2,3.82E+12,3.40E-01,2.00E-01,2.52E-04,1.87E+01,1.10E-01 +110,6.11E-05,262.4,1.69E+12,2.80E-01,5.00E-02,2.26E-04,2.86E+01,9.50E-02 +115,3.56E-05,316.8,8.15E+11,2.40E-01,5.00E-03,2.04E-04,3.89E+01,6.00E-02 +120,2.27E-05,380,4.33E+11,2.00E-01,5.00E-04,1.85E-04,5.00E+01,3.00E-02 diff --git a/afgl/midlatitude summer.ods b/afgl/midlatitude summer.ods new file mode 100644 index 0000000..2be2188 Binary files /dev/null and b/afgl/midlatitude summer.ods differ diff --git a/afgl/midlatitude winter.csv b/afgl/midlatitude winter.csv new file mode 100644 index 0000000..2d74fe4 --- /dev/null +++ b/afgl/midlatitude winter.csv @@ -0,0 +1,52 @@ +midlatitude winter,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1.02E+03,272.2,2.71E+19,4.32E+03,2.78E-02,3.20E-01,1.50E-01,1.70E+00 +1,8.97E+02,268.7,2.42E+19,3.46E+03,2.80E-02,3.20E-01,1.45E-01,1.70E+00 +2,7.90E+02,265.2,2.16E+19,2.79E+03,2.85E-02,3.20E-01,1.40E-01,1.70E+00 +3,6.94E+02,261.7,1.92E+19,2.09E+03,3.20E-02,3.20E-01,1.35E-01,1.70E+00 +4,6.08E+02,255.7,1.72E+19,1.28E+03,3.57E-02,3.20E-01,1.31E-01,1.70E+00 +5,5.31E+02,249.7,1.54E+19,8.24E+02,4.72E-02,3.20E-01,1.30E-01,1.69E+00 +6,4.63E+02,243.7,1.38E+19,5.10E+02,5.84E-02,3.20E-01,1.29E-01,1.67E+00 +7,4.02E+02,237.7,1.23E+19,2.32E+02,7.89E-02,3.20E-01,1.25E-01,1.65E+00 +8,3.47E+02,231.7,1.09E+19,1.08E+02,1.04E-01,3.20E-01,1.19E-01,1.63E+00 +9,2.99E+02,225.7,9.61E+18,5.57E+01,1.57E-01,3.16E-01,1.09E-01,1.62E+00 +10,2.57E+02,219.7,8.47E+18,2.96E+01,2.37E-01,3.10E-01,9.96E-02,1.58E+00 +11,2.20E+02,219.2,7.27E+18,1.00E+01,3.62E-01,2.99E-01,8.96E-02,1.54E+00 +12,1.88E+02,218.7,6.24E+18,6.00E+00,5.23E-01,2.94E-01,7.81E-02,1.51E+00 +13,1.61E+02,218.2,5.35E+18,5.00E+00,7.04E-01,2.86E-01,6.37E-02,1.48E+00 +14,1.38E+02,217.7,4.59E+18,4.80E+00,8.00E-01,2.80E-01,5.03E-02,1.45E+00 +15,1.18E+02,217.2,3.93E+18,4.70E+00,9.00E-01,2.72E-01,3.94E-02,1.42E+00 +16,1.01E+02,216.7,3.37E+18,4.50E+00,1.10E+00,2.61E-01,3.07E-02,1.39E+00 +17,8.61E+01,216.2,2.87E+18,4.50E+00,1.40E+00,2.42E-01,2.49E-02,1.36E+00 +18,7.36E+01,215.7,2.47E+18,4.50E+00,1.80E+00,2.17E-01,1.97E-02,1.62E+00 +19,6.28E+01,215.2,2.12E+18,4.50E+00,2.30E+00,1.84E-01,1.55E-02,1.28E+00 +20,5.37E+01,215.2,1.81E+18,4.50E+00,2.90E+00,1.62E-01,1.33E-02,1.22E+00 +21,4.58E+01,215.2,1.54E+18,4.50E+00,3.50E+00,1.36E-01,1.23E-02,1.15E+00 +22,3.91E+01,215.2,1.32E+18,4.53E+00,3.90E+00,1.23E-01,1.23E-02,1.07E+00 +23,3.34E+01,215.2,1.13E+18,4.55E+00,4.30E+00,1.12E-01,1.31E-02,9.73E-01 +24,2.86E+01,215.2,9.63E+17,4.60E+00,4.70E+00,1.05E-01,1.40E-02,8.80E-01 +25,2.44E+01,215.2,8.22E+17,4.65E+00,5.10E+00,9.66E-02,1.50E-02,7.93E-01 +27.6,1.65E+01,215.5,5.54E+17,4.70E+00,5.60E+00,8.69E-02,1.60E-02,7.13E-01 +30,1.11E+01,217.4,3.70E+17,4.75E+00,6.10E+00,7.52E-02,1.71E-02,6.44E-01 +32.6,7.56E+00,220.4,2.49E+17,4.80E+00,6.80E+00,6.13E-02,1.85E-02,5.75E-01 +35,5.18E+00,227.9,1.64E+17,4.85E+00,7.10E+00,5.12E-02,2.00E-02,5.05E-01 +37.5,3.60E+00,235.5,1.11E+17,4.90E+00,7.20E+00,3.97E-02,2.15E-02,4.48E-01 +40,2.53E+00,243.2,7.54E+16,4.95E+00,6.90E+00,3.00E-02,2.33E-02,3.93E-01 +42.5,1.80E+00,250.8,5.20E+16,5.00E+00,5.90E+00,2.08E-02,2.63E-02,3.41E+00 +45,1.29E+00,258.5,3.62E+16,5.00E+00,4.60E+00,1.31E-02,3.06E-02,2.88E-01 +47.5,9.40E-01,265.1,2.57E+16,5.00E+00,3.70E+00,8.07E-03,3.80E-02,2.39E-01 +50,6.83E-01,265.7,1.86E+16,4.95E+00,2.75E+00,4.16E-03,6.25E-02,1.94E-01 +55,3.62E-01,260.6,1.01E-16,4.85E+00,1.70E+00,2.63E-03,1.48E-01,1.57E-01 +60,1.88E-01,250.8,5.43E+15,4.50E+00,1.00E+00,1.81E-03,2.93E-01,1.50E-01 +65,9.50E-02,240.9,2.86E+15,4.00E+00,5.50E-01,1.32E-03,5.59E-01,1.50E-01 +70,4.70E-02,230.7,1.48E+15,3.30E+00,3.20E-01,1.01E-03,1.08E+00,1.50E-01 +75,2.22E-02,220.4,7.30E+14,2.70E+00,2.50E-01,7.88E-04,1.90E+00,1.50E-01 +80,1.03E-02,210.1,3.55E+14,2.00E+00,2.30E-01,6.33E-04,2.96E+00,1.50E-01 +85,4.56E-03,199.8,1.65E+14,1.33E+00,5.50E-01,5.19E-04,4.53E+00,1.50E-01 +90,1.98E-03,199.5,7.19E+13,8.50E-01,8.00E-01,4.33E-04,6.86E+00,1.40E-01 +95,8.77E-04,208.3,6.05E+13,5.40E-01,8.00E-01,3.67E-04,1.05E+01,1.30E-01 +100,4.07E-04,218.6,1.35E+13,4.00E-01,4.00E-01,3.14E-04,1.71E+01,1.20E-01 +105,2.00E-04,237.1,6.11E+12,3.40E-01,2.00E-01,2.72E-04,2.47E+01,1.10E-01 +110,1.06E-04,259.5,2.95E+12,2.80E-01,5.01E-02,2.37E-04,3.36E+01,9.50E-02 +115,5.98E-05,293,1.48E+12,2.40E-01,5.00E-03,2.09E-04,4.15E+01,6.00E-02 +120,3.60E-05,333,7.84E+11,2.00E-01,5.00E-04,1.85E-04,5.00E+02,3.00E-02 diff --git a/afgl/midlatitude winter.ods b/afgl/midlatitude winter.ods new file mode 100644 index 0000000..646c91c Binary files /dev/null and b/afgl/midlatitude winter.ods differ diff --git a/afgl/subarctic summer.csv b/afgl/subarctic summer.csv new file mode 100644 index 0000000..367ff57 --- /dev/null +++ b/afgl/subarctic summer.csv @@ -0,0 +1,52 @@ +subarctic summer,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1010,287.2,2.55E+19,1.19E+04,0.0241,0.31,0.15,1.7 +1,896,281.7,2.31E+19,8.70E+03,0.0294,0.31,0.145,1.7 +2,792,276.3,2.08E+19,6.75E+03,0.0338,0.31,0.14,1.7 +3,700,270.9,1.87E+19,4.82E+03,0.0389,0.31,0.135,1.7 +4,616,265.5,1.68E+19,3.38E+03,0.0448,0.308,0.131,1.7 +5,541,260.1,1.51E+19,2.22E+03,0.0533,0.302,0.13,1.69 +6,474,253.1,1.36E+19,1.33E+03,0.0656,0.291,0.129,1.67 +7,413,246.1,1.22E+19,7.97E+02,0.0774,0.282,0.125,1.65 +8,359,239.2,1.09E+19,4.00E+02,0.0911,0.276,0.119,1.63 +9,311,232.2,9.70E+18,1.30E+02,0.142,0.27,0.109,1.62 +10,267,225.2,8.62E+18,4.24E+01,0.189,0.265,0.0996,1.58 +11,230,225.2,7.40E+18,1.33E+01,0.305,0.26,0.0896,1.54 +12,198,225.2,6.36E+18,6.00E+00,0.41,0.255,0.0781,1.51 +13,170,225.2,5.47E+18,4.45E+00,0.5,0.249,0.0637,1.47 +14,146,225.2,4.70E+18,4.00E+00,0.6,0.243,0.0503,1.43 +15,126,225.2,4.06E+18,4.00E+00,0.7,0.236,0.0394,1.39 +16,108,225.2,3.48E+18,4.00E+00,0.8,0.228,0.0307,1.34 +17,2.8,225.2,2.99E+18,4.05E+00,1,0.218,0.0249,1.29 +18,79.8,225.2,2.57E+18,4.30E+00,1.3,0.204,0.0197,1.23 +19,68.6,225.2,2.21E+18,4.50E+00,1.7,0.182,0.0155,1.16 +20,59,225.2,1.90E+18,4.60E+00,2.1,0.157,0.0133,1.07 +21,50.7,225.2,1.63E+18,4.70E+00,2.7,0.135,0.0123,0.99 +22,43.6,225.2,1.40E+18,4.80E+00,3.3,0.122,0.0123,0.917 +23,37.5,225.2,1.21E+18,4.83E+00,3.7,0.11,0.0131,0.857 +24,32.3,226.6,1.03E+18,4.85E+00,4.2,0.0989,0.014,0.801 +25,27.8,228.1,8.83E+17,4.90E+00,4.5,0.0878,0.0151,0.748 +27.6,19.2,231,6.03E+17,4.95E+00,5.3,0.0733,0.0165,0.696 +30,13.4,235.1,4.13E+17,5.00E+00,5.7,0.0594,0.0181,0.644 +32.6,9.4,240,2.84E+17,5.00E+00,6.9,0.0415,0.02,0.589 +35,6.61,247.2,1.94E+17,5.00E+00,7.7,0.0303,0.0218,0.524 +37.5,4.72,254.6,1.34E+17,5.00E+00,7.8,0.0195,0.0234,0.451 +40,3.4,262.1,9.40E+16,5.00E+00,7,0.0127,0.025,0.371 +42.5,2.48,269.5,6.67E+16,5.00E+00,5.4,9.00E-03,0.0265,0.299 +45,1.82,273.6,4.82E+16,5.00E+00,4.2,6.29E-03,0.0281,0.245 +47.5,1.34,276.2,3.51E+16,5.00E+00,3.2,4.56E-03,0.03,0.2 +50,0.987,277.2,2.59E+16,4.95E+00,2.5,2.80E-03,0.0322,0.166 +55,5.37E-01,274,1.42E+16,4.85E+00,1.7,1.77E-03,0.0365,0.15 +60,2.88E-01,262.7,7.95E+15,4.50E+00,1.2,1.21E-03,0.0459,0.15 +65,0.147,239.7,4.45E+15,4.00E+00,0.8,8.87E-04,0.0838,0.15 +70,0.071,216.6,2.38E+15,3.30E+00,0.4,6.76E-04,0.118,0.15 +75,3.20E-02,193.6,1.20E+15,2.7,0.2,5.54E-04,0.303,0.15 +80,1.25E-02,170.6,5.31E+14,2,0.18,4.65E-04,0.789,0.15 +85,4.51E-03,161.7,2.02E+14,1.33,0.65,3.98E-04,1.82,0.15 +90,1.61E-03,161.6,7.22E+13,0.85,0.9,3.05E-04,3.4,0.14 +95,6.06E-04,176.8,2.48E+13,0.54,0.8,2.71E-04,5.92,0.13 +100,2.48E-04,190.4,9.44E+12,0.4,0.4,2.44E-04,10.4,0.12 +105,1.13E-04,226,3.62E+12,0.34,0.2,2.21E-04,18.8,0.11 +110,6.00E-05,270.1,1.61E+12,0.28,0.05,2.02E-04,28.7,0.095 +115,3.54E-05,322.7,7.95E+11,0.24,0.005,1.84E-04,38.9,0.06 +120,2.26E-05,380,4.31E+11,0.2,0.0005,0.000185,50,0.03 diff --git a/afgl/subarctic summer.ods b/afgl/subarctic summer.ods new file mode 100644 index 0000000..7c19944 Binary files /dev/null and b/afgl/subarctic summer.ods differ diff --git a/afgl/subarctic winter.csv b/afgl/subarctic winter.csv new file mode 100644 index 0000000..4e32b6b --- /dev/null +++ b/afgl/subarctic winter.csv @@ -0,0 +1,52 @@ +subarctic winter,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1.01E+03,257.2,2.86E+19,1.41E+03,1.80E-02,0.31,3.20E-01,1.70E+00 +1,8.88E+02,239.1,2.48E+19,1.62E+03,2.00E-02,0.31,3.20E-01,1.70E+00 +2,7.78E+02,255.9,2.20E+19,1.43E+03,2.34E-02,0.31,3.20E-01,1.70E+00 +3,6.80E+02,252.7,1.95E+19,1.17E+03,2.77E-02,0.31,3.20E-01,1.70E+00 +4,5.93E+02,247.7,1.74E+19,7.90E+03,3.25E-02,0.308,3.20E-01,1.70E+00 +5,5.52E+02,240.9,1.55E+19,4.31E+02,3.80E-02,0.302,3.20E-01,1.69E+00 +6,4.47E+02,234.1,1.38E+19,2.70E+02,4.45E-02,0.291,3.20E-01,1.67E+00 +7,3.85E+02,227.3,1.23E+19,1.47E+02,7.25E-02,0.282,3.20E-01,1.65E+00 +8,3.31E+02,220.6,1.09E+19,3.38E+01,1.04E-01,0.276,3.20E-01,1.63E+00 +9,2.28E+02,217.2,9.44E+18,2.98E+01,2.10E-01,0.27,3.16E-01,1.62E+00 +10,2.42E+02,217.2,8.07E+18,2.00E+01,3.00E-01,0.265,3.10E-01,1.58E+00 +11,2.07E+02,217.2,6.90E+18,1.00E+01,3.50E-01,0.26,2.90E-01,1.54E+00 +12,1.77E+02,217.2,5.89E+18,6,4.00E-01,0.255,2.94E-01,1.51E+00 +13,1.51E+02,217.2,5.04E+18,4.45,6.50E-01,0.249,2.86E-01,1.47 +14,1.29E+02,217.2,4.31E+18,4.5,9.00E-01,0.243,2.80E-01,1.43 +15,1.10E+02,217.2,3.68E+18,4.55,1.20E+00,0.236,2.70E-01,1.39 +16,9.43E+01,216.6,3.16E+18,4.65,1.50E+00,0.228,2.61E-01,1.34 +17,8.06E+01,216,2.70E+18,4.65,1.90E+00,0.218,2.42E-01,1.29E+00 +18,6.88E+01,215.4,2.32E+18,4.75,2.45E+00,0.204,2.17E-01,1.23E+00 +19,5.88E+01,214.8,1.98E+18,4.75,3.1,0.182,1.84E-01,1.16E+00 +20,5.01E+01,214.2,1.70E+18,4.85,3.7,0.157,1.62E-01,1.08 +21,4.28E+01,213.6,1.45E+18,4.85,4,0.135,1.36E-01,1.01E+00 +22,3.65E+01,213,1.24E+18,4.9,4.2,0.122,1.23E-01,9.56E-01 +23,3.11E+01,212.4,1.06E+18,4.95,4.50E+00,0.11,1.12E-01,9.01E-01 +24,2.65E+01,211.8,9.07E+17,5,4.6,0.0989,1.04E-01,8.48E-01 +25,2.26E+01,211.2,7.74E+17,5,4.7,0.0878,9.57E-02,7.96E-01 +27.6,1.51E+01,213.6,5.13E+17,5,4.9,0.0733,6.60E-02,7.45E-01 +30,1.02E+01,216,3.42E+17,5,5.4,0.0594,7.31E-02,6.94E-01 +32.6,6.91E+00,218.5,2.29E+17,5,5.9,0.0415,5.71E-02,6.43E-01 +35,4.701,222.3,1.53E+17,5,6.2,0.0303,4.67E-02,5.88E-01 +37.5,3.23,228.5,1.03E+17,5,6.25,0.0195,3.44E-02,5.24E-01 +40,2.243,234.7,6.93E+16,5,5.9,0.0127,2.47E-02,4.51E-01 +42.5,1.57E+00,240.8,4.73E+16,5,5.10E+00,9.00E-03,1.63E-02,3.71E-01 +45,1.113,247,3.27E+16,5,4.1,6.29E-03,1.07E-02,3.00E-01 +47.5,7.90E-01,253.2,2.26E+16,5,3.00E+00,4.56E-03,7.06E-03,2.45E-01 +50,5.72E-01,259.3,1.60E+16,4.95E+00,2.6,2.80E-03,3.97E-03,1.98E-01 +55,2.99E-01,259.1,8.36E+15,4.85,1.60E+00,1.77E-03,2.51E-03,1.59E-01 +60,1.55E-01,250.9,4.48E+15,4.50E+00,0.95,1.21E-03,1.73E-03,1.50E-01 +65,7.90E-02,248.4,2.31E+15,4.00E+00,6.50E-01,8.87E-04,1.26E-03,1.50E-01 +70,4.00E-02,245.4,1.18E+15,3.3,0.5,6.76E-04,9.60E-04,1.50E-01 +75,2.00E-02,234.7,6.18E+14,2.70E+00,3.30E-01,5.54E-04,7.55E-04,1.50E-01 +80,9.66E-03,223.9,3.13E+14,2,1.30E-01,4.65E-04,6.10E-04,1.50E-01 +85,4.50E-03,213.1,1.53E+14,1.33,0.75,3.98E-04,5.02E-04,1.50E-01 +90,2.02E-03,202.3,7.24E+13,8.50E-01,0.8,3.05E-04,4.21E-04,1.40E-01 +95,9.07E-04,211,3.12E+13,5.40E-01,0.8,2.71E-04,3.58E-04,1.30E-01 +100,4.23E-04,218.5,1.40E+13,0.4,0.4,2.44E-04,3.08E-04,1.20E-01 +105,2.07E-04,234,6.41E+12,0.34,0.2,2.21E-04,2.68E-04,1.10E-01 +110,1.08E-04,252.6,3.10E+12,0.28,0.05,2.02E-04,2.35E-04,9.50E-02 +115,6.00E-05,288.5,1.51E+12,0.24,0.005,1.84E-04,2.08E-04,6.00E-02 +120,3.59E-05,333,7.81E+11,0.2,5.00E-04,0.000185,1.85E-04,3.00E-02 diff --git a/afgl/subarctic winter.ods b/afgl/subarctic winter.ods new file mode 100644 index 0000000..2493b34 Binary files /dev/null and b/afgl/subarctic winter.ods differ diff --git a/afgl/tropical.csv b/afgl/tropical.csv new file mode 100644 index 0000000..a912a87 --- /dev/null +++ b/afgl/tropical.csv @@ -0,0 +1,52 @@ +tropical,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1.01E+03,299.7,2.45E+19,2.59E+04,2.97E-02,3.20E-01,1.50E-01,1.70E+00 +1,9.04E+02,293.7,2.23E+19,1.25E+04,3.15E-02,3.20E-01,1.45E-01,1.70E+00 +2,8.05E+02,287.7,2.03E+19,1.53E+04,3.34E-02,3.20E-01,1.40E-01,1.70E+00 +3,7.15E+02,283.7,1.83E+19,8.60E+03,3.50E-02,3.20E-01,1.35E-01,1.70E+00 +4,6.33E+02,277,1.66E+19,4.44E+03,3.56E-02,3.20E-01,1.31E-01,1.70E+00 +5,5.59E+02,270.3,1.50E+19,3.35E+03,3.77E-02,3.20E-01,1.30E-01,1.70E+00 +6,4.92E+02,263.6,1.35E+19,2.10E+03,3.99E-02,3.20E-01,1.29E-01,1.70E+00 +7,4.32E+02,257,1.22E+19,1.29E+03,4.22E-02,3.20E-01,1.25E-01,1.70E+00 +8,3.78E+02,250.3,1.10E+19,7.64E+02,4.47E-02,3.20E-01,1.19E-01,1.70E+00 +9,3.29E+02,243.6,9.79E+18,4.10E+02,5.00E-02,3.20E-01,1.09E-01,1.69E+00 +10,2.86E+02,237,8.75E+18,1.91E+02,5.60E-02,3.18E-01,9.96E-02,1.69E+00 +11,2.47E+02,230.1,7.78E+18,7.31E+01,6.61E-02,3.14E-01,8.96E-02,1.68E+00 +12,2.13E+02,223.6,6.90E+18,2.91E+01,7.82E-02,3.10E-01,7.81E-02,1.66E+00 +13,1.82E+02,217,6.08E+18,9.00E+00,9.29E-02,3.05E-01,6.37E-02,1.65E+00 +14,1.58E+02,210.3,5.38E+18,6.22E+00,1.05E-01,3.00E-01,5.03E-02,1.63E+00 +15,1.32E+02,203.7,4.70E+18,4.00E+00,1.26E-01,2.94E-01,3.94E-02,1.61E+00 +16,1.11E+02,197,4.08E+18,3.00E+00,1.44E-01,2.88E-01,3.07E-02,1.58E+00 +17,9.37E+01,164.8,3.49E+18,2.90E+00,2.50E-01,2.78E-01,2.49E-02,1.55E+00 +18,7.89E+01,168.8,2.88E+18,2.75E+00,5.00E-01,2.67E-01,1.97E-02,1.52E+00 +19,6.66E+01,202.7,2.38E+18,2.60E+00,9.50E-01,2.53E-01,1.55E-02,1.48E+00 +20,5.65E+01,206.7,1.98E+18,2.60E+00,1.40E+00,2.37E-01,1.33E-02,1.42E+00 +21,4.80E+01,210.7,1.65E+18,2.65E+00,1.80E+00,2.19E-01,1.23E-02,1.36E+00 +22,4.09E+01,214.6,1.38E+18,2.80E+00,2.40E+00,2.05E-01,1.23E-02,1.27E+00 +23,3.50E+01,217,1.17E+18,2.90E+00,3.40E+00,1.97E-01,1.31E-02,1.19E+00 +24,3.00E+01,219.2,9.92E+17,3.20E+00,4.30E+00,1.88E-01,1.40E-02,1.12E+00 +25,2.57E+01,221.4,8.41E+17,3.25E+00,5.40E+00,1.76E-01,1.50E-02,1.06E+00 +27.6,1.76E+01,227,5.63E+17,3.60E+00,7.80E+00,1.59E-01,1.60E-02,9.87E-01 +30,1.22E+01,232.3,3.81E+17,4.00E+00,9.30E+00,1.42E-01,1.71E-02,9.14E-01 +32.6,8.52E+00,237.7,2.60E+17,4.30E+00,9.85E+00,1.17E-01,1.85E-02,8.30E-01 +35,6.00E+00,243.1,1.79E+17,4.60E+00,9.70E+00,9.28E-02,2.00E-02,7.46E-01 +37.5,4.26E+00,248.5,1.24E+17,4.90E+00,8.80E+00,6.69E-02,2.15E-02,6.62E-01 +40,3.05E+00,254,8.70E+16,5.20E+00,7.50E+00,4.51E-02,2.33E-02,5.64E-01 +42.5,2.20E+00,259.4,6.15E+16,5.50E+00,5.90E+00,2.75E-02,2.63E-02,4.61E-01 +45,1.59E+00,264.8,4.35E+16,5.70E+00,4.50E+00,1.59E-02,3.06E-02,3.63E-01 +47.5,1.16E+00,269.6,3.12E+16,5.90E+00,3.45E+00,9.38E-03,3.80E-02,2.77E-01 +50,8.54E-01,270.2,2.29E+16,6.00E+00,2.80E+00,4.75E-03,6.25E-02,2.10E-01 +55,4.56E-01,263.4,1.26E+16,6.00E+00,1.80E+00,3.00E-03,1.48E-01,1.65E-01 +60,2.39E-01,253.1,6.84E+15,6.00E+00,1.10E+00,2.07E-03,2.93E-01,1.50E-01 +65,1.21E-01,236,3.72E+15,5.40E+00,6.50E-01,1.51E-03,5.59E-01,1.50E-01 +70,5.80E-02,218.9,1.92E+15,4.50E+00,3.00E-01,1.15E-03,1.08E+00,1.50E-01 +75,2.60E-02,201.8,9.34E+14,3.30E+00,1.80E-01,8.89E-04,1.90E+00,1.50E-01 +80,1.10E-02,184.8,4.31E+14,2.10E+00,3.30E-01,7.06E-04,2.96E+00,1.50E-01 +85,4.40E-03,177.1,1.80E+14,1.30E+00,5.00E-01,5.72E-04,4.53E+00,1.50E-01 +90,1.72E-03,177,7.04E+13,8.50E-01,5.20E-01,4.71E-04,6.86E+00,1.40E-01 +95,6.88E-04,184.3,2.71E+13,5.40E-01,5.00E-01,3.93E-04,1.05E+01,1.30E-01 +100,2.89E-04,190.7,1.10E+13,4.00E-01,4.00E-01,3.32E-04,1.71E+01,1.20E-01 +105,1.30E-04,212,4.45E+12,3.40E-01,2.00E-01,2.84E-04,2.47E+01,1.10E-01 +110,6.47E-05,241.6,1.94E+12,2.80E-01,5.00E-02,2.44E-04,3.36E+01,9.50E-02 +115,3.60E-05,299.7,8.71E+11,2.40E-01,5.00E-03,2.12E-04,4.15E+01,6.00E-02 +120,2.25E-05,380,4.23E+11,2.00E-01,5.00E-04,1.85E-04,5.00E+01,3.00E-02 diff --git a/afgl/tropical.ods b/afgl/tropical.ods new file mode 100644 index 0000000..5c6cc45 Binary files /dev/null and b/afgl/tropical.ods differ diff --git a/afgl/us standard.csv b/afgl/us standard.csv new file mode 100644 index 0000000..4fab994 --- /dev/null +++ b/afgl/us standard.csv @@ -0,0 +1,52 @@ +us standard,,,,,,,, +altitude Km,pressure mB,temp K,mol*cm-3,h2o ppmv,o3 ppmv,n2o ppmv,co ppmv,ch4 ppmv +0,1.01E+03,288.2,2.55E+19,7.75E+03,2.66E-02,0.31,1.50E-01,1.70E+00 +1,8.99E+02,281.7,2.31E+19,5.07E+03,2.93E-02,0.31,1.45E-01,1.70E+00 +2,7.95E+02,275.2,2.09E+19,4.63E+03,3.24E-02,0.31,1.40E-01,1.70E+00 +3,7.01E+02,268.7,1.89E+19,3.18E+03,3.32E-02,0.31,1.35E-01,1.70E+00 +4,6.17E+02,262.2,1.70E+19,2.16E+03,3.39E-02,0.308,1.31E-01,1.70E+00 +5,5.41E+02,255.7,1.53E+19,1.40E+03,3.77E-02,0.302,1.30E-01,1.70E+00 +6,4.72E+02,249.2,1.37E+19,9.25E+02,4.11E-02,0.291,1.29E-01,1.70E+00 +7,4.11E+02,242.7,1.23E+19,5.72E+02,5.01E-02,0.282,1.25E-01,1.70E+00 +8,3.57E+02,236.2,1.09E+19,3.67E+02,5.97E-02,0.276,1.19E-01,1.69E+00 +9,3.08E+02,229.7,9.72E+18,1.58E+02,9.17E-02,0.27,1.09E-01,1.69E+00 +10,2.65E+02,223.3,8.60E+18,7.00E+01,1.31E-01,0.265,9.96E-02,1.68E+00 +11,2.27E+02,216.8,7.59E+18,3.61E+01,2.15E-01,0.26,8.96E-02,1.66E+00 +12,1.94E+02,216.7,6.49E+18,19.1,3.10E-01,0.255,7.81E-02,1.65E+00 +13,1.56E+02,216.7,5.55E+18,10.9,3.85E-01,0.249,6.37E-02,1.63E+00 +14,1.42E+02,216.7,4.74E+18,5.93,5.03E-01,0.243,5.03E-02,1.61E+00 +15,1.21E+02,216.7,4.05E+18,5,6.51E-01,0.236,3.94E-02,1.58E+00 +16,1.04E+02,216.7,3.46E+18,3.95,8.70E-01,0.228,3.07E-02,1.55E+00 +17,8.65E+01,216.7,2.96E+18,3.85,1.19E+00,0.218,2.49E-02,1.52E+00 +18,7.57E+01,216.7,2.53E+18,3.83,1.59E+00,0.204,1.97E-02,1.48E+00 +19,6.47E+01,216.7,2.16E+18,3.85,2.03,0.182,1.55E-02,1.42E+00 +20,5.53E+01,216.7,1.85E+18,3.9,2.58,0.157,1.33E-02,1.36E+00 +21,4.73E+01,217.6,1.58E+18,3.98,3.03,0.135,1.23E-02,1.27E+00 +22,4.05E+01,218.6,1.34E+18,4.07,3.65,0.122,1.23E-02,1.19E+00 +23,3.47E+01,219.6,1.14E+18,4.2,4.17E+00,0.11,1.31E-02,1.12E+00 +24,2.97E+01,220.6,9.77E+17,4.3,4.63,0.0989,1.40E-02,1.06E+00 +25,2.55E+01,221.6,8.34E+17,4.43,5.12,0.0878,1.50E-02,9.87E-01 +27.6,1.74E+01,224,5.64E+17,4.58,5.8,0.0733,1.60E-02,9.14E-01 +30,1.20E+01,226.5,3.83E+17,4.73,6.55,0.0594,1.71E-02,8.30E-01 +32.6,8.01E+00,230,2.52E+17,4.83,7.37,0.0415,1.85E-02,7.46E-01 +35,5.746,236.5,1.75E+17,4.9,7.84,0.0303,2.01E-02,6.62E-01 +37.5,4.15,242.9,1.24E+17,4.95,7.8,0.0195,2.22E-02,5.64E-01 +40,2.871,250.4,8.31E+16,5.03,7.3,0.0127,2.50E-02,4.61E-01 +42.5,2.06E+00,257.3,5.80E+16,5.15,6.20E+00,9.00E-03,2.82E-02,3.63E-01 +45,1.491,264.2,4.09E+16,5.23,5.25,6.29E-03,3.24E-02,2.77E-01 +47.5,1.09E+00,270.6,2.92E+16,5.25,4.10E+00,4.56E-03,3.72E-02,2.10E-01 +50,7.98E-01,270.7,2.14E+16,5.23E+00,3.1,2.80E-03,4.60E-02,1.65E-01 +55,4.25E-01,260.8,1.18E+16,5.1,1.80E+00,1.77E-03,6.64E-02,1.50E-01 +60,2.19E-01,247,6.43E+15,4.75E+00,1.1,1.21E-03,1.07E-01,1.50E-01 +65,1.09E-01,233.3,3.39E+15,4.20E+00,7.00E-01,8.87E-04,1.86E-01,1.50E-01 +70,5.22E-02,219.6,1.72E+15,3.5,0.3,6.76E-04,3.06E-01,1.50E-01 +75,2.40E-02,208.4,8.35E+14,2.83E+00,2.50E-01,5.54E-04,6.38E-01,1.50E-01 +80,1.05E-02,198.6,3.83E+14,2.05,3.00E-01,4.65E-04,1.50E+00,1.50E-01 +85,4.46E-03,188.9,1.71E+14,1.33,0.5,3.98E-04,3.24E+00,1.50E-01 +90,1.84E-03,186.9,7.14E+13,8.50E-01,0.7,3.05E-04,5.84E+00,1.40E-01 +95,7.60E-04,188.4,2.92E+13,5.40E-01,0.7,2.71E-04,1.01E+01,1.30E-01 +100,3.20E-04,195.1,1.19E+13,0.4,0.4,2.44E-04,1.69E+01,1.20E-01 +105,1.45E-04,208.8,5.03E+12,0.34,0.2,2.21E-04,2.47E+01,1.10E-01 +110,7.10E-05,240,2.14E+12,0.28,0.05,2.02E-04,3.36E+01,9.50E-02 +115,4.01E-05,300,9.69E+11,0.24,0.005,1.84E-04,4.15E+01,6.00E-02 +120,2.54E-05,360,5.11E+11,0.2,5.00E-04,0.000185,5.00E+01,3.00E-02 diff --git a/afgl/us standard.ods b/afgl/us standard.ods new file mode 100644 index 0000000..e2e9c3d Binary files /dev/null and b/afgl/us standard.ods differ diff --git a/atmProfiles.py b/atmProfiles.py new file mode 100644 index 0000000..1e6587b --- /dev/null +++ b/atmProfiles.py @@ -0,0 +1,351 @@ +# the following atm profiles were pulled from Anderson et al 1986. While this file won't be directly utilized +# by PyRad, the data from these profiles will be used for testing and creating some .pyr profiles for users to build +# from. + +# original paper can be found at: +# https://www.researchgate.net/publication/235054307_AFGL_Atmospheric_Constituent_Profiles_0120km + +# Dictionary {'profile name': {surface temp: , +# list of heights: , +# list of pressures: , +# list of temperatures: , +# list of mol density: , +# list of h2o MR: , +# list of o3 MR: , +# list of n2o MR: , +# list of co MR: , +# list of ch4 MR: , + +from matplotlib import pyplot as plt + +ATM_PROFILES = {'tropical': {'surface temp': 299.7, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, + 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, 45, 47.5, 50, 55, 60, 65, 70, + 75, 80, 85, 90, 95, 100, 105, 110, 115, 120], + 'pressure': [1.013e3, 9.040e2, 8.05e2, 7.15e2, 6.33e2, 5.59e2, 4.92e2, 4.32e2, 3.78e2, + 3.29e2, 2.86e2, 2.47e2, 2.13e2, 1.82e2, 1.56e2, 1.32e2, 1.11e2, 93.7, 78.9, + 66.6, 56.5, 48.0, 40.9, 35.0, 30, 25.7, 17.63, 12.2, 8.52, 6, 4.26, 3.05, 2.2, + 1.59, 1.16, .854, .456, .239, .121, 5.8e-2, 2.6e-2, 1.1e-2, 4.4e-3, 1.72e-3, + 6.88e-4, 2.89e-4, 1.3e-4, 6.47e-5, 3.6e-5, 2.25e-5], + 'temp': [299.7, 293.7, 287.7, 283.7, 277, 270.3, 263.6, 257.0, 250.3, 243.6, 237.0, 230.1, + 223.6, + 217.0, 210.3, 203.7, 197.0, 194.8, 198.8, 202.7, 206.7, 210.7, 214.6, 217.0, + 219.2, 221.4, 227.0, 232.3, 237.7, 243.1, 248.5, 254.0, 259.4, 264.8, 269.6, + 270.2, 263.4, 253.1, 236.0, 218.9, 201.8, 184.8, 177.1, 177.0, 184.3, 190.7, + 212.0, 241.6, 299.7, 380], + 'mol density': [2.45E19, 2.231E19, 2.028E19, 1.827E19, 1.656E19, 1.499E19, 1.353E19, + 1.218E19, 1.098E19, 9.789E18, 8.747E18, 7.780E18, 6.904E18, 6.079E18, + 5.377E18, 4.697E18, 4.084E18, 3.486E18, 2.877E18, 2.381E18, 1.981E18, + 1.651E18, 1.381E18, 1.169e18, 9.920E17, 8.413E17, 5.629E17, 3.807E17, + 2.598E17, 1.789E17, 1.243E17, 8.703E16, 6.147E16, 4.352E16, 3.119E16, + 2.291E16, 1.255E16, 6.844E15, 3.716E15, 1.920E15, 9.338E14, 4.314E14, + 1.801E14, 7.043E13, 2.706E13, 1.098E13, 4.445E12, 1941E12, 8.706E11, + 4.225E11], + 'h2o': [2.59E4, 1.95E4, 1.53E4, 8.60E3, 4.44E3, 3.35E3, 2.1E3, 1.29E3, 7.64E2, 4.1E2, + 1.91E2, 7.31E1, 2.91E1, 9.9E0, 6.22E0, 4E0, 3E0, 2.9E0, 2.75E0, 2.60E0, 2.6E0, + 2.65E0, 2.8E0, 2.9E0, 3.2E0, 3.25E0, 3.6E0, 4E0, 4.3, 4.6, 4.9, 5.2, 5.5, 5.7, 5.9, + 6, 6, 6, 5.4, 4.5, 3.3, 2.1, 1.3, 8.5E-1, 5.4E-1, 4.0E-1, 3.4E-1, 2.8E-1, 2.4E-1, + 2.0E-1], + 'o3': [2.87e-2, 3.15e-2, 3.34e-2, 3.5e-2, 3.55e-2, 3.77e-2, 3.99e-2, 4.22e-2, 4.47e-2, + 5.0e-2, 56e-2, 6.61e-2, 7.82e-2, 9.29e-2, 1.05e-1, 1.26e-1, 1.44e-1, 2.5e-1, 5.0e-1, + 9.5e-1, 1.4, 1.8, 2.4, 3.4, 4.3, 5.4, 7.8, 9.3, 9.85, 9.7, 8.8, 7.5, 5.9, 4.5, 3.45, + 2.8, 1.8, 1.1, 6.5e-1, 3.0e-1, 1.8e-1, 3.3e-1, 5e-1, 5.2e-1, 5e-1, 4e-1, 2e-1, 5e-2, + 5e-3, 5e-4], + 'n2o': [.32, .32, .32, .32, .32, .32, .32, .32, .32, .32, .318, .314, .310, .05, .3, .294, + .288, .28, .267, .253, .237, .219, .205, .197, .188, .176, .159, .142, .117, .0928, + .0698, .0451, .0275, .0159, 9.38e-3, 4.75e-3, 3e-3, 2.07e-3, 1.51e-3, 1.15e-3, + 8.89e-4, 7.046e-4, 5.72e-4, 4.71e-4, 3.93e-4, 3.32e-4, 2.84e-4, 2.44e-4, 2.12e-4, + 1.85e-4], + 'co': [.15, .145, .140, .135, .131, .130, .129, .125, .119, .109, 9.96e-2, 8.92e-2, + 7.81e-2, + 6.37e-2, 5.03e-2, 3.94e-2, 3.07e-2, 2.49e-2, 1.97e-2, 1.55e-2, 1.33e-2, 1.23e-2, + 1.23e-2, 1.31e-2, 1.4e-2, 1.52e-2, 1.72e-2, 2e-2, 2.27e-2, 2.49e-2, 2.74e-2, 3.1e-2, + 3.51e-2, 3.99e-2, 4.48e-2, 5.09e-2, 5.99e-2, 6.96e-2, 9.19e-2, .194, .569, 1.55, + 3.85, 6.59, 10.4, 17.1, 24.7, 33.6, 51.5, 50], + 'ch4': [.17, .17, .17, .17, .17, .17, .17, .17, .17, .169, .169, .168, .166, .165, .163, + .161, .158, .155, .152, .148, .142, .136, .12, .119, .112, .106, 9.87e-1, 9.14e-1, + 8.3e-1, 7.46e-1, 6.62e-1, 5.64e-1, 4.61e-1, 3.63e-1, 2.77e-1, 2.1e-1, 1.65e-1, + 1.5e-1, 1.5e-1, 1.5e-1, 1.5e-1, 1.5e-1, 1.5e-1, 1.4e-1, 1.3e-1, 1.2e-1, 1.1e-1, + 9.5e-2, 6e-2, 3e-2]}, + 'midlatitude summer': {'surface temp': 294.2, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, 45, 47.5, + 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120], + 'temp': [294.2, 289.7, 285.2, 279.2, 273.2, 267.2, 261.2, 254.7, 248.2, 241.7, + 235.3, 228.8, 222.3, 215.8, 215.7, 215.7, 215.7, 215.7, 216.8, 217.9, + 219.2, 220.4, 221.6, 222.8, 223.9, 225.1, 228.5, 233.7, 239.0, 245.2, + 251.3, 257.5, 263.7, 269.9, 275.2, 275.7, 269.3, 257.1, 240.1, 218.1, + 196.1, 174.1, 165.1, 165.0, 178.3, 190.5, 222.2, 262.4, 316.8, 380], + 'pressure': [1.013e3, 9.020e2, 8.020e2, 7.1e2, 6.28e2, 5.54e2, 4.87e2, 4.26e2, + 3.72e2, 3.24e2, 2.81e2, 2.43e2, 2.090e2, 1.79e2, 1.53e2, 1.3e2, + 1.11e2, 95, 81.2, 96.5, 59.5, 51.0, 43.7, 37.6, 32.2, 27.7, 19.07, + 13.2, 9.3, 6.52, 4.64, 3.33, 2.41, 1.76, 1.29, .951, .515, .272, + .139, 6.7e-2, 3e-2, 1.2e-2, 4.48e-3, 1.64e-3, 6.24e-4, 2.58e-4, + 1.17e-4, 6.11e-5, 3.56e-5, 2.27e-5], + 'mol density': [2.496e19, 2.257e19, 2.038e19, 1.843e19, 1.666e19, 1.503e19, + 1.351e19, 1.212e19, 1.806e19, 9.716e18, 8.656e18, 7.698e18, + 6.814e18, 6.012e18, 5.141e18, 4.368e18, 3.73e18, 3.192e18, + 2.715e18, 2.312e18, 1.967e18, 1.677e18, 1.429e18, 1.223e18, + 1.042e18, 8.919e17, 6.050e17, 4.094e17, 2.82e17, 1.927e17, + 1.338e17, 9.373e16, 6.624e16, 4.726e16, 3.398e16, 2.500e16, + 1.3868e16, 7.668e15, 4.2196e15, 2.227e15, 1.109e15, 4.996e14, + 1.967e14, 7.204e13, 2.541e13, 9.816e12, 3.816e12, 1.688e12, + 8.145e11, 4.330e11], + 'h2o': [1.88e4, 1.38e4, 9.68e3, 5.68e3, 3.81e3, 2.23e3, 1.51e3, 1.02e3, 6.46e2, + 4.13e2, 2.47e2, 95.6, 29.4, 8, 5, 3.4, 3.3, 3.2, 3.15, 3.2, 3.3, 3.45, + 3.6, 3.85, 4, 4.2, 4.45, 4.7, 4.85, 4.95, 5, 5.1, 5.3, 5.45, 5.5, 5.5, + 5.35, 5, 4.4, 3.7, 2.95, 2.1, 1.33, .85, .54, .4, .34, .28, .24, .2], + 'o3': [3.02e-2, 3.34e-2, 3.69e-2, 4.22e-2, 4.82e-2, 5.51e-2, 6.41e-2, 7.76e-2, + 9.13e-2, .111, .130, .179, .223, .300, .440, .500, .600, .700, 1, 1.5, 2, + 2.4, 2.9, 3.4, 4, 4.8, 6, 7, 8.1, 8.9, 8.7, 7.55, 5.90, 4.5, 3.5, 2.8, + 1.8, + 1.3, .8, .4, .19, .2, .57, .75, .7, .4, .2, .05, .005, .0005], + 'n2o': [.32, .32, .32, .32, .32, .32, .32, .32, .32, .316, .310, .299, .294, + .286, .280, .272, .261, .242, .217, .184, .161, .132, .115, .105, + 9.62e-2, 8.96e-2, 8.01e-2, 6.7e-2, 4.96e-2, 3.7e-2, 2.52e-2, 1.74e-2, + 1.16e-2, 7.67e-3, 5.32e-3, 3.22e-3, 2.03e-3, 1.4e-3, 1.02e-3, 7.77e-4, + 6.26e-4, 5.17e-4, 4.35e-4, 3.73e-4, 3.24e-4, 2.84e-4, 2.52e-4, 2.26e-4, + 2.04e-4, 1.85e-4], + 'co': [.15, .145, .14, .135, .131, .130, .129, .125, .119, .109, 9.96e-2, + 8.96e-2, + 7.81e-2, 6.3e-2, 5.03e-2, 3.94e-2, 3.07e-2, 2.49e-2, 1.97e-2, 1.55e-2, + 1.33e-2, 1.23e-2, 1.23e-2, 1.31e-2, 1.4e-2, 1.51e-2, 1.72e-2, 2e-2, + 2.27e-2, 2.49e-2, 2.72e-2, 2.96e-2, 3.14e-2, 3.31e-2, 3.49e-2, 3.65e-2, + 3.92e-2, 4.67e-2, 6.4e-2, .118, .294, .682, 1.47, 2.85, 5.14, 10.1, 18.7, + 28.6, 38.9, 50], + 'ch4': [1.7, 1.7, 1.7, 1.7, 1.7, 1.69, 1.57, 1.65, 1.63, 1.62, 1.58, 1.54, 1.51, + 1.48, 1.45, 1.42, 1.39, 1.36, 1.32, 1.28, 1.22, 1.15, 1.07, .973, .880, + .789, .705, .632, .559, .501, .445, .392, .339, .287, .238, .194, .157, + .150, .15, .15, .15, .15, .15, .14, .13, .12, .11, .095, .06, .03]}, + 'midlatitude winter': {'surface temp': 272.2, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, + 45, 47.5, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, + 110, 115, 120], + 'pressure': [1.18e3, 8.973e2, 7.897e2, 6.938e2, 6.081e2, 5.313e2, 4.627e2, + 4.016e2, 3.473e2, 2.993e2, 2.568e2, 2.199e2, 1.882e2, 1.611e2, + 1.378e2, 1.178e2, 1.002e2, 86.1, 73.6, 62.8, 53.7, 45.8, 39.1, 33.4, + 28.6, 24.4, 16.46, 11.1, 7.56, 5.18, 3.6, 2.53, 1.80, 1.29, .94, + .683, .362, .188, 9.5e-2, 4.7e-2, 2.22e-2, 1.03e-2, 4.56e-3, + 1.98e-3, + 8.77e-4, 4.074e-4, 2e-4, 1.057e-4, 5.98e-5, 3.6e-5], + 'temp': [272.2, 268., 265.2, 261.7, 255.7, 249.7, 243.7, 237.7, 231.7, 225.7, + 219.7, 219.2, 218.7, 218.2, 217.7, 217.2, 216.7, 216.2, 215.7, 215.2, + 215.2, 215.2, 215.2, 215.2, 215.2, 215.2, 215.5, 21.4, 220.4, 227.9, + 235.5, 243.2, 250.8, 258.5, 265.1, 265.7, 260.6, 250.8, 240.9, 230.7, + 220.4, 210.1, 199.8, 199.5, 208.3, 218.6, 237.1, 259.5, 293, 333], + 'mol density': [2.711e19, 2.42e19, 2.158e19, 1.922e19, 1.724e19, 1.542e19, + 1.376e19, 1.225e19, 1.086e19, 9.612e18, 8.472e18, 7.271e18, + 6.237e18, 5.351e18, 4.588e18, 3.931e18, 3.366e18, 2.886e18, + 2.473e18, 2.115e18, 1.809e18, 1.543e18, 1.317e18, 1.125e18, + 9.633e17, 8.218e17, 5.536e17, 3.701e17, 2.486e17, 1.647e1, + 1.108e17, 7.540e16, 5.202e16, 3.61e16, 2.570e16, 1.863e16, + 1.007e16, 5.433e15, 2.858e15, 1.477e15, 7.301e14, 3.553e14, + 1.654e14, 7.194e13, 3.052e13, 1.351e13, 6.114e12, 2.952e12, + 1.479e12, 7.836e11], + 'h2o': [4.32e3, 3.45e33, 2.9e3, 2.09e3, 1.28e3, 8.24e2, 5.1e2, 2.32e2, 1.08e2, + 55.7, 29.6, 10, 6, 5, 4.8, 4.7, 4.6, 4.5, 4.5, 4.5, 4.5, 4.5, 4.53, 4.55, + 4.60, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5, 5, 5, 4.95, 4.85, 4.5, + 4.0, 3.3, 2.7, 2, 1.33, .85, .54, .4, .34, .28, .24, .2], + 'o3': [2.78e-2, 2.8e-2, 2.85e-2, 3.2e-2, 3.57e-2, 4.72e-2, 5.84e-2, 7.89e-2, + .104, + .15, .237, .362, .523, .04, .8, .9, 1.1, 1.4, 1.8, 2.3, 2.9, 3.5, 3.9, + 4.3, + 4.7, 5.1, 5.6, 6.1, 6.8, 7.1, 7.2, 6.9, 5.9, 4.6, 3.7, 2.75, 1.7, 1, .55, + .32, .25, .23, .55, .8, .8, .4, .2, .05, .005, .0005], + 'n2o': [.32, .32, .32, .32, .32, .32, .32, .32, .32, .316, .310, .299, .294, + .286, + .280, .22, .261, .242, .21, .184, .162, .136, .123, .112, .105, 9.66e-2, + 8.69e-2, 7.52e-2, 6.13e-2, 5.12e-2, 3.97e-2, 3.0e-2, 2.08e-2, 1.31e-2, + 8.07e-3, 4.16e-3, 2.63e-3, 1.81e-3, 1.32e-3, 1.01e-3, 7.88e-4, 6.33e-4, + 5.19e-4, 4.33e-4, 3.67e-4, 3.14e-4, 2.72e-4, 2.37e-4, 2.0e-4, 1.85e-4], + 'co': [.15, .145, .140, .135, .131, .130, .129, .125, .1119, .109, 9.96e-2, + 8.96e-2, 7.81e-2, 6.3e-2, 5.03e-2, 3.94e-2, 3.07e-2, 2.49e-2, 1.97e-2, + 1.55e-2, 1.33e-2, 1.23e-2, 1.23e-2, 1.31e-2, 1.4e-2, 1.5e-2, 1.6e-2, + 1.71e-2, 1.85e-2, 2.0e-2, 2.15e-2, 2.33e-2, 2.62e-2, 3.06e-2, 3.8e-2, + 6.25e-2, .148, .293, .559, 1.08, 1.9, 2.96, 4.53, 6.86, 10.5, 17.1, 24.7, + 33.6, 41.5, 50], + 'ch4': [1.7, 1.7, 1.7, 1.7, 1.7, 1.69, 1.67, 1.65, 1.32, 1.32, 1.58, 1.54, 1.51, + 1.48, 1.45, 1.42, 1.39, 1.36, 1.32, 1.28, 1.22, 1.15, 1.07, .973, .880, + .793, .713, .644, .575, .505, .448, .393, .340, .288, .239, .194, .157, + .15, .15, .15, .15, .15, .15, .14, .13, .12, .11, .095, .06, .03]}, + 'subarctic summer': {'surface temp': 287.2, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, + 45, 47.5, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, + 110, 115, 120], + 'pressure': [1.01e3, 8.96e2, 7.929e2, 7e2, 6.16e2, 5.41e2, 4.74e2, 4.13e2, 3.59e2, + 3.108e2, 2.677e2, 2.3e2, 1.977e2, 1.7e2, 1.46e2, 1.26e2, 1.08e2, 92.8, + 79.8, 68.6, 59.0, 50.7, 43.6, 37.5, 32.28, 27.80, 19.23, 13.4, 9.4, + 6.61, 4.72, 3.4, 2.48, 1.82, 1.34, .987, .537, .288, .147, 7.1e-2, + 3.2e-2, 1.25e-2, 4.51e-3, 1.61e-3, 6.06e-4, 2.48e-4, 1.13e-4, 6.0e-5, + 3.54e-5, 2.26e-5], + 'temp': [287.2, 281.7, 276.3, 270.9, 265.5, 260.1, 253.1, 246.1, 239.2, 232.2, + 225.5, 225.2, 225.2, 225.2, 225.2, 225.2, 225.2, 225.2, 225.2, 225.2, + 225.2, 225.2, 225.2, 225.2, 226.6, 228.1, 231.0, 235.1, 240, 24.2, 254.6, + 262.1, 269.5, 273.6, 276.2, 277.2, 274, 262.7, 239.7, 216.6, 193.6, 10.6, + 161., 161.6, 176.8, 194.4, 226, 270.1, 322.7, 380], + 'mol density': [2.459e19, 2.305e19, 2.080e19, 1.873e19, 1.682e19, 1.508e19, + 1.357e19, + 1.216e19, 1.088e19, 9.701e18, 8.616e18, 7.402e18, 6.363e18, + 5.471e18, + 4.699e18, 4.055e18, 3.476e18, 2.987e18, 2.568e18, 2.20e18, + 1.899e18, + 1.632e18, 1.403e18, 1.207e18, 1.033e18, 8.834e17, 6.034e17, + 4.131e17, + 2.839e17, 1.938e17, 1.344e17, 9.402e16, 6.670e16, 4.821e16, + 3.513e16, + 2.581e16, 1.421e16, 7.946e15, 4.445e15, 2.376e15, 1.1198e15, + 5.311e14, + 2.022e14, 7.221e13, 2.484e13, 9.441e12, 3.624e12, 1.610e12, + 7.951e11, + 4.311e11], + 'h2o': [1.19e4, 8.7e3, 6.75e3, 4.82e3, 3.38e3, 2.22e3, 1.33e3, 7.97e2, 4e2, 1.3e2, + 42.4, 13.3, 6, 4.45, 4, 4, 4, 4.05, 4.3, 4.5, 4.6, 4.7, 4.8, 4.83, 4.85, + 4.9, 4.95, 5, 5, 5, 5, 5, 5, 5, 5, 4.95, 4.85, 4.5, 4., 3.3, 2.7, 2, 1.33, + .85, .54, .4, .34, .28, .24, .2], + 'o3': [2.41e-2, 2.94e-2, 3.38e-2, 3.89e-2, 4.48e-2, 5.33e-2, 6.56e-2, 7.74e-2, + 9.11e-2, .142, .189, .305, .41, .5, .6, .7, .85, 1, 1.3, 1.7, 2.1, 2.7, 3.3, + 3.7, 4.2, 4.5, 5.3, 5.7, 6.9, 7.7, 7.8, 7, 5.4, 4.2, 3.2, 2.5, 1.7, 1.2, .8, + .4, .2, .18, .65, .9, .8, .4, .2, .05, .005, .0005], + 'n2o': [.31, .31, .31, .31, .308, .302, .291, .282, .276, .270, .265, .260, .255, + .249, .243, .236, .228, .218, .204, .182, .157, .135, .122, .110, 9.89e-2, + 8.78e-2, 7.33e-2, 5.94e-2, 4.15e-2, 3.03e-2, 1.95e-2, 1.27e-2, 9e-3, + 6.29e-3, 4.56e-3, 2.8e-3, 1.77e-3, 1.21e-3, 8.87e-4, 6.76e-4, 5.54e-4, + 4.65e-4, 3.68e-4, 3.46e-4, 3.05e-4, 2.71e-4, 2.44e-4, 2.21e-4, 2.02e-4, + 1.85e-4], + 'co': [.15, .145, .14, .135, .131, .130, .129, .125, .119, .109, 9.96e-2, 8.96e-2, + 7.81e-2, 6.37e-2, 5.03e-2, 3.94e-2, 3.07e-2, 2.49e-2, 1.97e-2, 1.55e-2, + 1.33e-2, 1.23e-2, 1.23e-2, 1.31e-2, 1.4e-2, 1.51e-2, 1.65e-2, 1.81e-2, 2e-2, + 2.18e-2, 2.34e-2, 2.5e-2, 2.65e-2, 2.81e-2, 3e-2, 3.22e-2, 3.65e-2, 4.59e-2, + 6.38e-2, .18, .303, .789, 1.82, 3.4, 5.92, 10.4, 18.8, 28.7, 38.9, 50], + 'ch4': [1.7, 1.7, 1.7, 1.7, 1.7, 1.69, 1.67, 1.65, 1.63, 1.32, 1.58, 1.54, 1.51, + 1.47, 1.43, 1.39, 1.34, 1.29, 1.23, 1.16, 1.08, .99, .917, .857, .801, + .748, + .696, .644, .589, .524, .451, .371, .299, .245, .2, .166, .15, .15, .15, + .15, .15, .15, .15, .14, .13, .12, .11, .095, .06, .03]}, + 'subarctic winter': {'surface temp': 257.2, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, + 45, 47.5, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, + 110, 115, 120], + 'pressure': [1.013e3, 8.878e2, 7.775e2, 6.798e2, 5.932e2, 5.158e2, 4.467e2, + 3.853e2, + 3.308e2, 2.829e2, 2.418e2, 2.067e2, 1.766e2, 1.510e2, 1.291e2, + 1.103e2, + 94.31, 80.58, 68.82, 58.75, 50.14, 42.77, 36.47, 31.09, 26.49, 22.56, + 15.13, 10.20, 6.91, 4.701, 3.23, 2.243, 1.570, 1.113, .79, .5719, + .299, + .155, 7.9e-2, 4e-2, 2e-2, 9.66e-3, 4.5e-3, 2.022e-3, 9.070e-4, + 4.23e-4, + 2.070e-4, 1.080e-4, 6e-5, 3.59e-5], + 'temp': [257.2, 239.1, 255.9, 252.7, 247.7, 240.9, 234.1, 227.3, 220.6, 217.2, + 217.2, 217.2, 217.2, 217.2, 217.2, 217.2, 216.6, 216.0, 215.4, 214.8, + 214.2, 213.6, 213.4, 212.4, 211.8, 211.2, 216.3, 216.0, 218.5, 222.3, + 228.5, 234.7, 240.8, 247.0, 253.2, 259.3, 259.1, 250.9, 248.4, 245.4, + 234.7, 223.9, 213.1, 202.3, 211, 218.5, 234.0, 252.6, 288.5, 333.0], + 'mol density': [2.855e19, 2.484e19, 2.202e19, 1.95e19, 1.736e19, 1.552e19, + 1.383e19, + 1.229e19, 1.087e19, 9.44e18, 8.069e18, 6.898e18, 5.893e18, + 5.039e18, + 4.308e18, 3.681e18, 3.156e18, 2.704e18, 2.316e18, 1.982e18, + 1.697e18, + 1.451e18, 1.241e18, 1.061e18, 9.065e17, 7.742e17, 5.134e17, + 3.423e17, + 2.292e17, 1.533e17, 1.025e17, 6.927e16, 4.726e16, 3.266e16, + 2.261e16, + 1.599e16, 8.364e15, 4.478e15, 2.305e15, 1.181e15, 6.176e14, + 3.127e14, + 1.531e14, 7.244e13, 3.116e13, 1.403e13, 6.412e12, 3.099e12, + 1.507e12, + 7.814e11], + 'h2o': [1.41e3, 1.52e3, 1.43e3, 1.17e3, 9.7e2, 4.31e2, 2.37e2, 1.47e2, 33.8, 29.8, + 20, 10, 6, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4.95, 4.85, 4.5, 4, 3.3, 2.7, 2, 1.33, .85, + .54, .4, .34, .28, .24, .2], + 'o3': [1.8e-2, 2.07e-2, 2.34e-2, 2.77e-2, 3.25e-2, 3.8e-2, 4.45e-2, 7.25e-2, .104, + .210, .3, .35, .4, .65, .9, 1.2, 1.5, 1.9, 2.45, 3.1, 3.7, 4, 4, .2, 4.5, + 4.6, 4.7, 4.9, 5.4, 5.9, 6.2, 6.25, 5.9, 5.1, 4.1, 3, 2.6, 1.6, .95, .65, + .5, + .33, .13, .75, .8, .8, .8, .4, .2, .05, .005, .0005], + 'n2o': [.32, .32, .32, .32, .32, .32, .32, .32, .32, .316, .31, .299, .294, .286, + .28, .272, .261, .242, .217, .184, .162, .136, .123, .112, .104, 9.57e-2, + 8.6e-2, 7.31e-2, 5.71e-2, .467e-2, 3.44e-2, 2.47e-2, 1.53e-2, 1.07e-2, + 7.06e-3, 3.97e-3, 2.51e-3, 1.73e-3, 1.26e-3, 9.6e-4, 7.55e-4, 6.1e-4, + 5.02e-4, 4.21e-4, 3.58e-4, 3.08e-4, 2.68e-4, 2.35e-4, 2.08e-4, 1.85e-4], + 'co': [.15, .145, .14, .135, .131, .13, .129, .125, .119, .109, .0996, .0896, .078, + .0637, .0503, .0394, .0307, .0249, .0197, .0155, .0133, .0123, .0123, .0131, + .0140, .0152, .0172, .0204, .0249, .0317, .0443, .0647, .104, .151, .216, + .314, .484, .715, 1.07, 1.52, 2.17, 3.06, 4.56, 6.88, 10.6, 17.1, 24.7, + 33.6, + 41.5, 50], + 'ch4': [1.7, 1.7, 1.7, 1.7, 1.7, 1.69, 1.67, 1.65, 1.63, 1.62, 1.58, 1.54, 1.51, + 1.47, 1.43, 1.39, 1.34, 1.29, 1.23, 1.16, 1.05, 1.01, .956, .901, .848, + .796, .745, .694, .643, .588, .524, .451, .371, .3, .245, .198, .159, .15, + .15, .15, .15, .15, .15, .14, .13, .12, .11, .095, .06, .03] + }, + 'us standard atm': {'surface temp': 288.2, + 'heights': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 27.5, 30, 32.5, 35, 37.5, 40, 42.5, + 45, 47.5, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, + 110, 115, 120], + 'pressure': [1.013e3, 8.988e2, 7.95e2, 7.012e2, 6.166e2, 5.405e2, 4.722e2, 4.111e2, + 3.565e2, 3.080e2, 2.65e2, 2.27e2, 1.94e2, 1.658e2, 1.417e2, 1.211e2, + 1.035e2, 88.5, 75.65, 64.67, 55.29, 47.29, 40.47, 34.67, 29.72, 25.49, + 17.43, 11.97, 8.01, 5.746, 5.15, 2.871, 2.060, 1.491, 1.0990, .7975, + .4250, .219, .109, 5.022e-2, 2.4e-2, 1.05e-2, 4.46e-3, 1.84e-3, 7.6e-4, + 3.2e-4, 1.45e-4, 7.1e-5, 4.01e-5, 2.54e-4], + 'temp': [288.2, 281.7, 275.2, 268.7, 262.2, 255.7, 249.2, 242.7, 236.2, 229.7, + 223.3, 216.8, 216.7, 216.7, 216.7, 216.7, 216.7, 216.7, 216.7, 216.7, + 216.7, 217.6, 218.6, 219.6, 220.6, 221.6, 224, 226.5, 230, 236.5, 242.9, + 250.4, 257.3, 264.2, 270.6, 270.7, 260.8, 247, 233.3, 219.6, 208.4, 198.6, + 188.9, 186.9, 188.4, 195.1, 208.8, 240, 300, 360], + 'mol density': [2.548e19, 2.313e19, 2.094e19, 1.891e19, 1.704e19, 1.532e19, + 1.373e19, + 1.228e19, 1.094e19, 9.719e18, 8.602e18, 7.589e18, 6.489e18, + 5.546e18, + 4.739e18, 4.050e18, 3.462e18, 2.960e18, 2.530e18, 2.163e18, + 1.849e18, + 1.575e18, 1.342e18, 1.144e18, 9.765e17, 8.337e17, 5.640e17, 3.83e17, + 2.524e17, 1.761e17, 1.238e17, 8.310e16, 5.803e16, 4.090e16, + 2.920e16, + 2.136e16, 1.181e16, 6.426e15, 3.386e15, 1.723e15, 8.347e14, + 3.832e14, + 1.711e14, 7.136e13, 2.924e13, 1.189e13, 5.033e12, 2.144e12, + 9.688e11, + 5.114e11], + 'h2o': [7.75e3, 5.07e3, 4.63e3, 3.18e3, 2.16e3, 1.4e3, 9.25e2, 5.72e2, 3.67e2, + 1.58e2, 70, 36.1, 19.1, 10.9, 5.93, 5, 3.95, 3.85, 3.83, 3.85, 3.9, 3.98, + 4.07, 4.2, 4.3, 4.43, 4.58, 4.73, 4.83, 4.9, 4.95, 5.03, 5.15, 5.23, 5.25, + 5.23, 5.1, 4.75, 4.2, 3.5, 2.83, 2.05, 1.33, .85, .54, .4, .34, .28, .24, + .2], + 'o3': [.0266, .0293, .0324, .0332, .0339, .0377, .0411, .0501, .0597, .0917, .131, + .215, .310, .385, .503, .651, .870, 1.19, 1.59, 2.03, 2.58, 3.03, 3.65, 4.17, + 4.63, 5.12, 5.8, 6.55, 7.37, 7.84, 7.8, 7.3, 6.2, 5.25, 4.1, 3.1, 1.8, 1.1, + .7, .3, .25, .3, .5, .7, .7, .4, .2, .05, .005, .0005], + 'n2o': [.32, .32, .32, .32, .32, .32, .32, .32, .32, .32, .318, .314, .31, .305, .3, + .294, .288, .278, .267, .253, .237, .219, .205, .197, .188, .176, .159, + .142, .117, .0928, .0669, .0451, .0275, .0159, 9.38e-3, 4.75e-3, 3e-3, + 2.07e-3, 1.51e-3, 1.15e-3, 8.89e-4, 7.06e-4, 5.72e-4, 4.71e-4, 3.93e-4, + 3.32e-4, 2.84e-4, 2.44e-4, 2.12e-4, 1.85e-4], + 'co': [.15, .145, .14, .135, .131, .13, .129, .125, .119, .109, .0996, .0896, .0781, + .0637, .0503, .0394, .0307, .0249, .0197, .0155, .0133, .0123, .0123, .0131, + .0140, .0150, .0160, .0171, .0185, .0201, .0222, .0250, .0282, .0324, .0372, + .046, .0664, .107, .186, .306, .638, 1.5, 3.24, 5.84, 10.1, 16.9, 24.7, 33.6, + 41.5, 50], + 'ch4': [1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.69, 1.69, 1.68, 1.66, 1.65, + 1.63, 1.61, 1.58, 1.55, 1.52, 1.46, 1.42, 1.36, 1.27, 1.19, 1.12, 1.06, + .987, + .914, .830, .746, .662, .564, .461, .363, .277, .210, .165, .150, .15, .15, + .15, .15, .15, .14, .13, .12, .11, .095, .06, .03]}} + +properties = ['pressure', 'temp', 'mol density', 'h2o', 'co', 'ch4', 'n2o'] + +region = 'midlatitude winter' +profile = 'h2o' +yAxis = ATM_PROFILES[region]['heights'] +xAxis = ATM_PROFILES[region][profile] + +plt.plot(xAxis, yAxis) +plt.show() \ No newline at end of file diff --git a/collins 1a thick.pyr b/collins 1a thick.pyr new file mode 100644 index 0000000..e1245fe --- /dev/null +++ b/collins 1a thick.pyr @@ -0,0 +1,174 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +#molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 3.02e-08 +#molecule: n2o, 3.2e-07 +#molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/collins 2a thick.pyr b/collins 2a thick.pyr new file mode 100644 index 0000000..10fdcf3 --- /dev/null +++ b/collins 2a thick.pyr @@ -0,0 +1,174 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000369 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +#molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 3.02e-08 +#molecule: n2o, 3.2e-07 +#molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/collins 2b thick.pyr b/collins 2b thick.pyr new file mode 100644 index 0000000..5b24b7f --- /dev/null +++ b/collins 2b thick.pyr @@ -0,0 +1,174 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000574 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +#molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 3.02e-08 +#molecule: n2o, 3.2e-07 +#molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/collins 3a thick.pyr b/collins 3a thick.pyr new file mode 100644 index 0000000..b691d1c --- /dev/null +++ b/collins 3a thick.pyr @@ -0,0 +1,173 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 0.000000806 +molecule: o3, 3.02e-08 +molecule: n2o, 0.000000275 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/collins 4a thick.pyr b/collins 4a thick.pyr new file mode 100644 index 0000000..971ebf0 --- /dev/null +++ b/collins 4a thick.pyr @@ -0,0 +1,174 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .001148 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +#molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 3.02e-08 +#molecule: n2o, 3.2e-07 +#molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/earth no ghg.pyr b/earth no ghg.pyr new file mode 100644 index 0000000..add0ded --- /dev/null +++ b/earth no ghg.pyr @@ -0,0 +1,119 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: o3, 3.02e-08 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + + + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + diff --git a/main.py b/main.py index 363c651..d9fff66 100644 --- a/main.py +++ b/main.py @@ -35,14 +35,14 @@ co2 = layer1.addMolecule(2, percentage=10, isotopeDepth=1) -#layer2 = pyrad.Layer(1000, 300, 1013.25, 500, 800, name='h2o: 1%') -#h2o = layer2.addMolecule('h2o', percentage=1) +# layer2 = pyrad.Layer(1000, 300, 1013.25, 500, 800, name='h2o: 1%') +# h2o = layer2.addMolecule('h2o', percentage=1) layer3 = pyrad.Layer(1000, 300, 1013.25, 500, 700, name='layer3') -#n2o = layer1.addMolecule('n2o', ppb=350) +# n2o = layer1.addMolecule('n2o', ppb=350) -#pyrad.plot('optical depth', layer3.title, [layer1, co2, n2o]) -pyrad.plotSpectrum(layer=layer1, spectrumList=[layer1.transmission(320)], planckTemperatureList=[280, 320]) +# pyrad.plot('optical depth', layer3.title, [layer1, co2, n2o]) +pyrad.plotSpectrum(layer=layer1, objList=[layer1], planckTemperatureList=[280, 320]) """ MOLECULE_ID = {'h2o': 1, 'co2': 2, 'o3': 3, 'n2o': 4, 'co': 5, diff --git a/marssimple.pyr b/marssimple.pyr new file mode 100644 index 0000000..f35e655 --- /dev/null +++ b/marssimple.pyr @@ -0,0 +1,10 @@ +# mars simple + +surface: 6, 220, 100, 200, 3.711, 100, 2500 + +molecule: co2, .9532 +molecule: n2, .027 +molecule: o2, .0013 + +lapse rate: first layer, 45, 120 +lapse rate: final layer, 100, 120 diff --git a/midlatitude summer.pyr b/midlatitude summer.pyr new file mode 100644 index 0000000..8166883 --- /dev/null +++ b/midlatitude summer.pyr @@ -0,0 +1,329 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 3.02e-08 +molecule: n2o, 3.2e-07 +molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.69e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6699999999999999e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 7, 8, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 8, 9, 1.62e-06, ch4 +composition rate: ch4 rule 9, 10, 1.58e-06, ch4 +composition rate: ch4 rule 10, 11, 1.5399999999999999e-06, ch4 +composition rate: ch4 rule 11, 12, 1.51e-06, ch4 +composition rate: ch4 rule 12, 13, 1.48e-06, ch4 +composition rate: ch4 rule 13, 14, 1.4499999999999999e-06, ch4 +composition rate: ch4 rule 14, 15, 1.42e-06, ch4 +composition rate: ch4 rule 15, 16, 1.3899999999999998e-06, ch4 +composition rate: ch4 rule 16, 17, 1.3600000000000001e-06, ch4 +composition rate: ch4 rule 17, 18, 1.32e-06, ch4 +composition rate: ch4 rule 18, 19, 1.28e-06, ch4 +composition rate: ch4 rule 19, 20, 1.22e-06, ch4 +composition rate: ch4 rule 20, 21, 1.1499999999999998e-06, ch4 +composition rate: ch4 rule 21, 22, 1.07e-06, ch4 +composition rate: ch4 rule 22, 23, 9.729999999999998e-07, ch4 +composition rate: ch4 rule 23, 24, 8.799999999999999e-07, ch4 +composition rate: ch4 rule 24, 25, 7.89e-07, ch4 +composition rate: ch4 rule 25, 27.6, 7.049999999999999e-07, ch4 +composition rate: ch4 rule 26, 30, 6.319999999999999e-07, ch4 +composition rate: ch4 rule 27, 32.6, 5.590000000000001e-07, ch4 +composition rate: ch4 rule 28, 35, 5.009999999999999e-07, ch4 +composition rate: ch4 rule 29, 37.5, 4.45e-07, ch4 +composition rate: ch4 rule 30, 40, 3.92e-07, ch4 +composition rate: ch4 rule 31, 42.5, 3.39e-07, ch4 +composition rate: ch4 rule 32, 45, 2.8699999999999996e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2.38e-07, ch4 +composition rate: ch4 rule 34, 50, 1.94e-07, ch4 +composition rate: ch4 rule 35, 55, 1.57e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.3399999999999995e-08, o3 +composition rate: o3 rule 1, 2, 3.69e-08, o3 +composition rate: o3 rule 2, 3, 4.22e-08, o3 +composition rate: o3 rule 3, 4, 4.8199999999999995e-08, o3 +composition rate: o3 rule 4, 5, 5.5100000000000004e-08, o3 +composition rate: o3 rule 5, 6, 6.41e-08, o3 +composition rate: o3 rule 6, 7, 7.76e-08, o3 +composition rate: o3 rule 7, 8, 9.13e-08, o3 +composition rate: o3 rule 8, 9, 1.11e-07, o3 +composition rate: o3 rule 9, 10, 1.3e-07, o3 +composition rate: o3 rule 10, 11, 1.7899999999999997e-07, o3 +composition rate: o3 rule 11, 12, 2.23e-07, o3 +composition rate: o3 rule 12, 13, 3e-07, o3 +composition rate: o3 rule 13, 14, 4.3999999999999997e-07, o3 +composition rate: o3 rule 14, 15, 5e-07, o3 +composition rate: o3 rule 15, 16, 6e-07, o3 +composition rate: o3 rule 16, 17, 7e-07, o3 +composition rate: o3 rule 17, 18, 1e-06, o3 +composition rate: o3 rule 18, 19, 1.5e-06, o3 +composition rate: o3 rule 19, 20, 2e-06, o3 +composition rate: o3 rule 20, 21, 2.4e-06, o3 +composition rate: o3 rule 21, 22, 2.8999999999999998e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4e-06, o3 +composition rate: o3 rule 24, 25, 4.8e-06, o3 +composition rate: o3 rule 25, 27.6, 6e-06, o3 +composition rate: o3 rule 26, 30, 7e-06, o3 +composition rate: o3 rule 27, 32.6, 8.099999999999999e-06, o3 +composition rate: o3 rule 28, 35, 8.9e-06, o3 +composition rate: o3 rule 29, 37.5, 8.7e-06, o3 +composition rate: o3 rule 30, 40, 7.55e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.5e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.3e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 1.8999999999999998e-07, o3 +composition rate: o3 rule 40, 80, 2e-07, o3 +composition rate: o3 rule 41, 85, 5.699999999999999e-07, o3 +composition rate: o3 rule 42, 90, 7.5e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4.03e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.2e-07, n2o +composition rate: n2o rule 1, 2, 3.2e-07, n2o +composition rate: n2o rule 2, 3, 3.2e-07, n2o +composition rate: n2o rule 3, 4, 3.2e-07, n2o +composition rate: n2o rule 4, 5, 3.2e-07, n2o +composition rate: n2o rule 5, 6, 3.2e-07, n2o +composition rate: n2o rule 6, 7, 3.2e-07, n2o +composition rate: n2o rule 7, 8, 3.2e-07, n2o +composition rate: n2o rule 8, 9, 3.1599999999999997e-07, n2o +composition rate: n2o rule 9, 10, 3.1e-07, n2o +composition rate: n2o rule 10, 11, 2.9899999999999996e-07, n2o +composition rate: n2o rule 11, 12, 2.9399999999999996e-07, n2o +composition rate: n2o rule 12, 13, 2.8599999999999994e-07, n2o +composition rate: n2o rule 13, 14, 2.8e-07, n2o +composition rate: n2o rule 14, 15, 2.72e-07, n2o +composition rate: n2o rule 15, 16, 2.61e-07, n2o +composition rate: n2o rule 16, 17, 2.4199999999999997e-07, n2o +composition rate: n2o rule 17, 18, 2.17e-07, n2o +composition rate: n2o rule 18, 19, 1.8399999999999998e-07, n2o +composition rate: n2o rule 19, 20, 1.61e-07, n2o +composition rate: n2o rule 20, 21, 1.32e-07, n2o +composition rate: n2o rule 21, 22, 1.15e-07, n2o +composition rate: n2o rule 22, 23, 1.0399999999999999e-07, n2o +composition rate: n2o rule 23, 24, 9.619999999999999e-08, n2o +composition rate: n2o rule 24, 25, 8.96e-08, n2o +composition rate: n2o rule 25, 27.6, 8.01e-08, n2o +composition rate: n2o rule 26, 30, 6.7e-08, n2o +composition rate: n2o rule 27, 32.6, 4.95e-08, n2o +composition rate: n2o rule 28, 35, 3.6999999999999994e-08, n2o +composition rate: n2o rule 29, 37.5, 2.52e-08, n2o +composition rate: n2o rule 30, 40, 1.7399999999999997e-08, n2o +composition rate: n2o rule 31, 42.5, 1.1599999999999998e-08, n2o +composition rate: n2o rule 32, 45, 7.67e-09, n2o +composition rate: n2o rule 33, 47.5, 5.32e-09, n2o +composition rate: n2o rule 34, 50, 3.22e-36, n2o +composition rate: n2o rule 35, 55, 2.0300000000000002e-09, n2o +composition rate: n2o rule 36, 60, 1.4e-09, n2o +composition rate: n2o rule 37, 65, 1.02e-09, n2o +composition rate: n2o rule 38, 70, 7.77e-10, n2o +composition rate: n2o rule 39, 75, 6.26e-10, n2o +composition rate: n2o rule 40, 80, 5.17e-10, n2o +composition rate: n2o rule 41, 85, 4.35e-10, n2o +composition rate: n2o rule 42, 90, 3.73e-10, n2o +composition rate: n2o rule 43, 95, 3.24e-10, n2o +composition rate: n2o rule 44, 100, 2.84e-10, n2o +composition rate: n2o rule 45, 105, 2.52e-10, n2o +composition rate: n2o rule 46, 110, 2.2599999999999997e-10, n2o +composition rate: n2o rule 47, 115, 2.04e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 1.45e-07, co +composition rate: co rule 1, 2, 1.4e-07, co +composition rate: co rule 2, 3, 1.35e-07, co +composition rate: co rule 3, 4, 1.31e-07, co +composition rate: co rule 4, 5, 1.3e-07, co +composition rate: co rule 5, 6, 1.29e-07, co +composition rate: co rule 6, 7, 1.26e-07, co +composition rate: co rule 7, 8, 1.2e-07, co +composition rate: co rule 8, 9, 1.09e-07, co +composition rate: co rule 9, 10, 9.959999999999999e-08, co +composition rate: co rule 10, 11, 8.96e-08, co +composition rate: co rule 11, 12, 7.81e-08, co +composition rate: co rule 12, 13, 6.370000000000001e-08, co +composition rate: co rule 13, 14, 5.0299999999999994e-08, co +composition rate: co rule 14, 15, 3.9399999999999995e-08, co +composition rate: co rule 15, 16, 3.07e-08, co +composition rate: co rule 16, 17, 2.4899999999999998e-08, co +composition rate: co rule 17, 18, 1.9699999999999998e-08, co +composition rate: co rule 18, 19, 1.66e-08, co +composition rate: co rule 19, 20, 1.3299999999999998e-08, co +composition rate: co rule 20, 21, 1.23e-08, co +composition rate: co rule 21, 22, 1.23e-08, co +composition rate: co rule 22, 23, 1.31e-08, co +composition rate: co rule 23, 24, 1.4e-08, co +composition rate: co rule 24, 25, 1.52e-08, co +composition rate: co rule 25, 27.6, 1.72e-08, co +composition rate: co rule 26, 30, 2e-08, co +composition rate: co rule 27, 32.6, 2.27e-08, co +composition rate: co rule 28, 35, 2.4899999999999998e-08, co +composition rate: co rule 29, 37.5, 2.72e-08, co +composition rate: co rule 30, 40, 2.96e-08, co +composition rate: co rule 31, 42.5, 3.1399999999999997e-08, co +composition rate: co rule 32, 45, 3.31e-08, co +composition rate: co rule 33, 47.5, 3.49e-08, co +composition rate: co rule 34, 50, 3.6499999999999996e-08, co +composition rate: co rule 35, 55, 3.9199999999999994e-08, co +composition rate: co rule 36, 60, 4.6699999999999995e-08, co +composition rate: co rule 37, 65, 6.4e-08, co +composition rate: co rule 38, 70, 1.1799999999999998e-07, co +composition rate: co rule 39, 75, 2.9399999999999996e-07, co +composition rate: co rule 40, 80, 6.82e-07, co +composition rate: co rule 41, 85, 1.47e-06, co +composition rate: co rule 42, 90, 2.85e-06, co +composition rate: co rule 43, 95, 5.17e-06, co +composition rate: co rule 44, 100, 1.01e-05, co +composition rate: co rule 45, 105, 1.8699999999999997e-05, co +composition rate: co rule 46, 110, 2.86e-05, co +composition rate: co rule 47, 115, 3.89e-05, co +composition rate: co rule 48, 120, 4.9999999999999996e-05, co diff --git a/midlatitude winter.pyr b/midlatitude winter.pyr new file mode 100644 index 0000000..bcb065c --- /dev/null +++ b/midlatitude winter.pyr @@ -0,0 +1,329 @@ +# atm profile for midlatitude winter + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1020.0, 272.2, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.00432 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 2.7799999999999997e-08 +molecule: n2o, 3.2e-07 +molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 268.7 +lapse rate: lapse rule 1, 2, 265.2 +lapse rate: lapse rule 2, 3, 261.7 +lapse rate: lapse rule 3, 4, 255.7 +lapse rate: lapse rule 4, 5, 249.7 +lapse rate: lapse rule 5, 6, 243.7 +lapse rate: lapse rule 6, 7, 237.7 +lapse rate: lapse rule 7, 8, 231.7 +lapse rate: lapse rule 8, 9, 225.7 +lapse rate: lapse rule 9, 10, 219.7 +lapse rate: lapse rule 10, 11, 219.2 +lapse rate: lapse rule 11, 12, 218.7 +lapse rate: lapse rule 12, 13, 218.2 +lapse rate: lapse rule 13, 14, 217.7 +lapse rate: lapse rule 14, 15, 217.2 +lapse rate: lapse rule 15, 16, 216.7 +lapse rate: lapse rule 16, 17, 216.2 +lapse rate: lapse rule 17, 18, 215.7 +lapse rate: lapse rule 18, 19, 215.2 +lapse rate: lapse rule 19, 20, 215.2 +lapse rate: lapse rule 20, 21, 215.2 +lapse rate: lapse rule 21, 22, 215.2 +lapse rate: lapse rule 22, 23, 215.2 +lapse rate: lapse rule 23, 24, 215.2 +lapse rate: lapse rule 24, 25, 215.2 +lapse rate: lapse rule 25, 27.6, 215.5 +lapse rate: lapse rule 26, 30, 217.4 +lapse rate: lapse rule 27, 32.6, 220.4 +lapse rate: lapse rule 28, 35, 227.9 +lapse rate: lapse rule 29, 37.5, 235.5 +lapse rate: lapse rule 30, 40, 243.2 +lapse rate: lapse rule 31, 42.5, 250.8 +lapse rate: lapse rule 32, 45, 258.5 +lapse rate: lapse rule 33, 47.5, 265.1 +lapse rate: lapse rule 34, 50, 265.7 +lapse rate: lapse rule 35, 55, 260.6 +lapse rate: lapse rule 36, 60, 250.8 +lapse rate: lapse rule 37, 65, 240.9 +lapse rate: lapse rule 38, 70, 230.7 +lapse rate: lapse rule 39, 75, 220.4 +lapse rate: lapse rule 40, 80, 210.1 +lapse rate: lapse rule 41, 85, 199.8 +lapse rate: lapse rule 42, 90, 199.5 +lapse rate: lapse rule 43, 95, 208.3 +lapse rate: lapse rule 44, 100, 218.6 +lapse rate: lapse rule 45, 105, 237.1 +lapse rate: lapse rule 46, 110, 259.5 +lapse rate: lapse rule 47, 115, 293 +lapse rate: lapse rule 48, 120, 333 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.00346, h2o +composition rate: h2o rule 1, 2, 0.00279, h2o +composition rate: h2o rule 2, 3, 0.00209, h2o +composition rate: h2o rule 3, 4, 0.0012799999999999999, h2o +composition rate: h2o rule 4, 5, 0.000824, h2o +composition rate: h2o rule 5, 6, 0.0005099999999999999, h2o +composition rate: h2o rule 6, 7, 0.000232, h2o +composition rate: h2o rule 7, 8, 0.000108, h2o +composition rate: h2o rule 8, 9, 5.57e-05, h2o +composition rate: h2o rule 9, 10, 2.96e-05, h2o +composition rate: h2o rule 10, 11, 9.999999999999999e-06, h2o +composition rate: h2o rule 11, 12, 6e-06, h2o +composition rate: h2o rule 12, 13, 4.9999999999999996e-06, h2o +composition rate: h2o rule 13, 14, 4.8e-06, h2o +composition rate: h2o rule 14, 15, 4.7e-06, h2o +composition rate: h2o rule 15, 16, 4.5e-06, h2o +composition rate: h2o rule 16, 17, 4.5e-06, h2o +composition rate: h2o rule 17, 18, 4.5e-06, h2o +composition rate: h2o rule 18, 19, 4.5e-06, h2o +composition rate: h2o rule 19, 20, 4.5e-06, h2o +composition rate: h2o rule 20, 21, 4.5e-06, h2o +composition rate: h2o rule 21, 22, 4.53e-06, h2o +composition rate: h2o rule 22, 23, 4.55e-06, h2o +composition rate: h2o rule 23, 24, 4.599999999999999e-06, h2o +composition rate: h2o rule 24, 25, 4.65e-06, h2o +composition rate: h2o rule 25, 27.6, 4.7e-06, h2o +composition rate: h2o rule 26, 30, 4.749999999999999e-06, h2o +composition rate: h2o rule 27, 32.6, 4.8e-06, h2o +composition rate: h2o rule 28, 35, 4.849999999999999e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9000000000000005e-06, h2o +composition rate: h2o rule 30, 40, 4.95e-06, h2o +composition rate: h2o rule 31, 42.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 32, 45, 4.9999999999999996e-06, h2o +composition rate: h2o rule 33, 47.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 34, 50, 4.95e-06, h2o +composition rate: h2o rule 35, 55, 4.849999999999999e-06, h2o +composition rate: h2o rule 36, 60, 4.5e-06, h2o +composition rate: h2o rule 37, 65, 4e-06, h2o +composition rate: h2o rule 38, 70, 3.2999999999999997e-06, h2o +composition rate: h2o rule 39, 75, 2.7e-06, h2o +composition rate: h2o rule 40, 80, 2e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.69e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6699999999999999e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 7, 8, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 8, 9, 1.62e-06, ch4 +composition rate: ch4 rule 9, 10, 1.58e-06, ch4 +composition rate: ch4 rule 10, 11, 1.5399999999999999e-06, ch4 +composition rate: ch4 rule 11, 12, 1.51e-06, ch4 +composition rate: ch4 rule 12, 13, 1.48e-06, ch4 +composition rate: ch4 rule 13, 14, 1.4499999999999999e-06, ch4 +composition rate: ch4 rule 14, 15, 1.42e-06, ch4 +composition rate: ch4 rule 15, 16, 1.3899999999999998e-06, ch4 +composition rate: ch4 rule 16, 17, 1.3600000000000001e-06, ch4 +composition rate: ch4 rule 17, 18, 1.62e-06, ch4 +composition rate: ch4 rule 18, 19, 1.28e-06, ch4 +composition rate: ch4 rule 19, 20, 1.22e-06, ch4 +composition rate: ch4 rule 20, 21, 1.1499999999999998e-06, ch4 +composition rate: ch4 rule 21, 22, 1.07e-06, ch4 +composition rate: ch4 rule 22, 23, 9.729999999999998e-07, ch4 +composition rate: ch4 rule 23, 24, 8.799999999999999e-07, ch4 +composition rate: ch4 rule 24, 25, 7.93e-07, ch4 +composition rate: ch4 rule 25, 27.6, 7.129999999999999e-07, ch4 +composition rate: ch4 rule 26, 30, 6.44e-07, ch4 +composition rate: ch4 rule 27, 32.6, 5.749999999999999e-07, ch4 +composition rate: ch4 rule 28, 35, 5.049999999999999e-07, ch4 +composition rate: ch4 rule 29, 37.5, 4.48e-07, ch4 +composition rate: ch4 rule 30, 40, 3.93e-07, ch4 +composition rate: ch4 rule 31, 42.5, 3.41e-06, ch4 +composition rate: ch4 rule 32, 45, 2.88e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2.3899999999999996e-07, ch4 +composition rate: ch4 rule 34, 50, 1.94e-07, ch4 +composition rate: ch4 rule 35, 55, 1.57e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 2.8e-08, o3 +composition rate: o3 rule 1, 2, 2.85e-08, o3 +composition rate: o3 rule 2, 3, 3.2e-08, o3 +composition rate: o3 rule 3, 4, 3.57e-08, o3 +composition rate: o3 rule 4, 5, 4.72e-08, o3 +composition rate: o3 rule 5, 6, 5.84e-08, o3 +composition rate: o3 rule 6, 7, 7.89e-08, o3 +composition rate: o3 rule 7, 8, 1.0399999999999999e-07, o3 +composition rate: o3 rule 8, 9, 1.57e-07, o3 +composition rate: o3 rule 9, 10, 2.3699999999999996e-07, o3 +composition rate: o3 rule 10, 11, 3.62e-07, o3 +composition rate: o3 rule 11, 12, 5.23e-07, o3 +composition rate: o3 rule 12, 13, 7.04e-07, o3 +composition rate: o3 rule 13, 14, 8e-07, o3 +composition rate: o3 rule 14, 15, 9e-07, o3 +composition rate: o3 rule 15, 16, 1.1e-06, o3 +composition rate: o3 rule 16, 17, 1.4e-06, o3 +composition rate: o3 rule 17, 18, 1.8e-06, o3 +composition rate: o3 rule 18, 19, 2.2999999999999996e-06, o3 +composition rate: o3 rule 19, 20, 2.8999999999999998e-06, o3 +composition rate: o3 rule 20, 21, 3.5e-06, o3 +composition rate: o3 rule 21, 22, 3.9e-06, o3 +composition rate: o3 rule 22, 23, 4.2999999999999995e-06, o3 +composition rate: o3 rule 23, 24, 4.7e-06, o3 +composition rate: o3 rule 24, 25, 5.0999999999999995e-06, o3 +composition rate: o3 rule 25, 27.6, 5.6e-06, o3 +composition rate: o3 rule 26, 30, 6.099999999999999e-06, o3 +composition rate: o3 rule 27, 32.6, 6.799999999999999e-06, o3 +composition rate: o3 rule 28, 35, 7.099999999999999e-06, o3 +composition rate: o3 rule 29, 37.5, 7.2e-06, o3 +composition rate: o3 rule 30, 40, 6.9e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.599999999999999e-06, o3 +composition rate: o3 rule 33, 47.5, 3.7e-06, o3 +composition rate: o3 rule 34, 50, 2.75e-06, o3 +composition rate: o3 rule 35, 55, 1.6999999999999998e-06, o3 +composition rate: o3 rule 36, 60, 1e-06, o3 +composition rate: o3 rule 37, 65, 5.5e-07, o3 +composition rate: o3 rule 38, 70, 3.2e-07, o3 +composition rate: o3 rule 39, 75, 2.5e-07, o3 +composition rate: o3 rule 40, 80, 2.3e-07, o3 +composition rate: o3 rule 41, 85, 5.5e-07, o3 +composition rate: o3 rule 42, 90, 8e-07, o3 +composition rate: o3 rule 43, 95, 8e-07, o3 +composition rate: o3 rule 44, 100, 4e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5.01e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.2e-07, n2o +composition rate: n2o rule 1, 2, 3.2e-07, n2o +composition rate: n2o rule 2, 3, 3.2e-07, n2o +composition rate: n2o rule 3, 4, 3.2e-07, n2o +composition rate: n2o rule 4, 5, 3.2e-07, n2o +composition rate: n2o rule 5, 6, 3.2e-07, n2o +composition rate: n2o rule 6, 7, 3.2e-07, n2o +composition rate: n2o rule 7, 8, 3.2e-07, n2o +composition rate: n2o rule 8, 9, 3.1599999999999997e-07, n2o +composition rate: n2o rule 9, 10, 3.1e-07, n2o +composition rate: n2o rule 10, 11, 2.9899999999999996e-07, n2o +composition rate: n2o rule 11, 12, 2.9399999999999996e-07, n2o +composition rate: n2o rule 12, 13, 2.8599999999999994e-07, n2o +composition rate: n2o rule 13, 14, 2.8e-07, n2o +composition rate: n2o rule 14, 15, 2.72e-07, n2o +composition rate: n2o rule 15, 16, 2.61e-07, n2o +composition rate: n2o rule 16, 17, 2.4199999999999997e-07, n2o +composition rate: n2o rule 17, 18, 2.17e-07, n2o +composition rate: n2o rule 18, 19, 1.8399999999999998e-07, n2o +composition rate: n2o rule 19, 20, 1.62e-07, n2o +composition rate: n2o rule 20, 21, 1.36e-07, n2o +composition rate: n2o rule 21, 22, 1.23e-07, n2o +composition rate: n2o rule 22, 23, 1.12e-07, n2o +composition rate: n2o rule 23, 24, 1.0499999999999999e-07, n2o +composition rate: n2o rule 24, 25, 9.66e-08, n2o +composition rate: n2o rule 25, 27.6, 8.69e-08, n2o +composition rate: n2o rule 26, 30, 7.52e-08, n2o +composition rate: n2o rule 27, 32.6, 6.13e-08, n2o +composition rate: n2o rule 28, 35, 5.12e-08, n2o +composition rate: n2o rule 29, 37.5, 3.97e-08, n2o +composition rate: n2o rule 30, 40, 3e-08, n2o +composition rate: n2o rule 31, 42.5, 2.0799999999999998e-08, n2o +composition rate: n2o rule 32, 45, 1.31e-08, n2o +composition rate: n2o rule 33, 47.5, 8.07e-09, n2o +composition rate: n2o rule 34, 50, 4.16e-09, n2o +composition rate: n2o rule 35, 55, 2.63e-09, n2o +composition rate: n2o rule 36, 60, 1.81e-09, n2o +composition rate: n2o rule 37, 65, 1.32e-09, n2o +composition rate: n2o rule 38, 70, 1.01e-09, n2o +composition rate: n2o rule 39, 75, 7.88e-10, n2o +composition rate: n2o rule 40, 80, 6.33e-10, n2o +composition rate: n2o rule 41, 85, 5.19e-10, n2o +composition rate: n2o rule 42, 90, 4.33e-10, n2o +composition rate: n2o rule 43, 95, 3.6699999999999997e-10, n2o +composition rate: n2o rule 44, 100, 3.1399999999999995e-10, n2o +composition rate: n2o rule 45, 105, 2.72e-10, n2o +composition rate: n2o rule 46, 110, 2.3699999999999996e-10, n2o +composition rate: n2o rule 47, 115, 2.09e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 1.45e-07, co +composition rate: co rule 1, 2, 1.4e-07, co +composition rate: co rule 2, 3, 1.35e-07, co +composition rate: co rule 3, 4, 1.31e-07, co +composition rate: co rule 4, 5, 1.3e-07, co +composition rate: co rule 5, 6, 1.29e-07, co +composition rate: co rule 6, 7, 1.25e-07, co +composition rate: co rule 7, 8, 1.19e-07, co +composition rate: co rule 8, 9, 1.09e-07, co +composition rate: co rule 9, 10, 9.959999999999999e-08, co +composition rate: co rule 10, 11, 8.96e-08, co +composition rate: co rule 11, 12, 7.81e-08, co +composition rate: co rule 12, 13, 6.370000000000001e-08, co +composition rate: co rule 13, 14, 5.0299999999999994e-08, co +composition rate: co rule 14, 15, 3.9399999999999995e-08, co +composition rate: co rule 15, 16, 3.07e-08, co +composition rate: co rule 16, 17, 2.4899999999999998e-08, co +composition rate: co rule 17, 18, 1.9699999999999998e-08, co +composition rate: co rule 18, 19, 1.55e-08, co +composition rate: co rule 19, 20, 1.3299999999999998e-08, co +composition rate: co rule 20, 21, 1.23e-08, co +composition rate: co rule 21, 22, 1.23e-08, co +composition rate: co rule 22, 23, 1.31e-08, co +composition rate: co rule 23, 24, 1.4e-08, co +composition rate: co rule 24, 25, 1.5e-08, co +composition rate: co rule 25, 27.6, 1.6e-08, co +composition rate: co rule 26, 30, 1.71e-08, co +composition rate: co rule 27, 32.6, 1.8499999999999997e-08, co +composition rate: co rule 28, 35, 2e-08, co +composition rate: co rule 29, 37.5, 2.1499999999999997e-08, co +composition rate: co rule 30, 40, 2.33e-08, co +composition rate: co rule 31, 42.5, 2.63e-08, co +composition rate: co rule 32, 45, 3.0599999999999996e-08, co +composition rate: co rule 33, 47.5, 3.7999999999999996e-08, co +composition rate: co rule 34, 50, 6.25e-08, co +composition rate: co rule 35, 55, 1.4799999999999998e-07, co +composition rate: co rule 36, 60, 2.93e-07, co +composition rate: co rule 37, 65, 5.590000000000001e-07, co +composition rate: co rule 38, 70, 1.08e-06, co +composition rate: co rule 39, 75, 1.8999999999999998e-06, co +composition rate: co rule 40, 80, 2.96e-06, co +composition rate: co rule 41, 85, 4.53e-06, co +composition rate: co rule 42, 90, 6.86e-06, co +composition rate: co rule 43, 95, 1.05e-05, co +composition rate: co rule 44, 100, 1.7100000000000002e-05, co +composition rate: co rule 45, 105, 2.4699999999999997e-05, co +composition rate: co rule 46, 110, 3.36e-05, co +composition rate: co rule 47, 115, 4.15e-05, co +composition rate: co rule 48, 120, 0.0005, co diff --git a/pyrad.py b/pyrad.py index 5a7cf0e..d6864a3 100644 --- a/pyrad.py +++ b/pyrad.py @@ -1,890 +1,858 @@ -import os -import pyradUtilities as utils -import pyradLineshape as ls -import pyradIntensity +import pyradClasses +import pyradUtilities as util +import re import pyradPlanck -import numpy as np -import matplotlib.pyplot as plt -import pyradInteractive - - -c = 299792458.0 -k = 1.38064852E-23 -c = 299792458.0 -h = 6.62607004e-34 -pi = 3.141592653589793 -t0 = 296 -p0 = 1013.25 -t0 = 296 -avo = 6.022140857E23 - - -def integrateSpectrum(spectrum, unitAngle=pi, res=utils.BASE_RESOLUTION): - value = np.sum(np.nan_to_num(spectrum)) - value = value * unitAngle * res - return value - - -def getCrossSection(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return obj.crossSection - - -def resetCrossSection(obj): - obj.crossSection = np.zeros(int((obj.rangeMax - obj.rangeMin) / utils.BASE_RESOLUTION)) - obj.progressCrossSection = False - for child in obj: - if not isinstance(child, Line): - resetCrossSection(child) - - -def resetData(obj): - # clears the existing line data from parent object down to isotope, and then reloads the data using getData - # use this if layer ranges get changed. Will also clear the cross section data of the obj. - for child in obj: - if isinstance(child, Isotope): - while len(child) > 0: - child.pop() - child.getData() - else: - resetData(child) - resetCrossSection(obj) - -def getAbsCoef(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return obj.absCoef +existingAtmosphere = False +validValueAndUnits = re.compile('([-])?(\d+)?([.])?(\d+)?(\S+)?') +genericAtmosphere = pyradClasses.Atmosphere('holding atm for pyrad interactive') +pyradClasses.settings.changeSetting('hi') + + +class Menu: + def __init__(self, title, entries, previousMenu=None, menuParams=None, multiChoice=False): + self.title = title + self.entries = entries + self.previousMenu = previousMenu + self.menuParams = menuParams + self.multiChoice = multiChoice + + def displayMenu(self): + titleStr = ' %s detail: %s' % (self.title, pyradClasses.settings.setting) + while len(titleStr) < 60: + titleStr += ' ' + print('\n%s' % util.underlineCyan(titleStr)) + i = 1 + validEntry = ['x'] + for entry in self.entries: + validEntry.append(str(i)) + print(' %s) %s' % (util.magentaText(i), entry.name)) + i += 1 + text = ' %s) Exit' % util.magentaText('X') + if 'Main' not in self.title: + text += '\t%s) Back' % util.magentaText('B') + validEntry.append('b') + if self.title != 'Choose level of detail': + text += '\t%s) Settings' % util.magentaText('S') + validEntry.append('s') + print(text) + validChoice = False + while not validChoice: + userInput = input('Choose an option: ') + if userInput.lower() == 'x': + print('Goodbye') + exit(1) + elif userInput.lower() == 'b' and 'main' not in self.title.lower(): + if type(self.previousMenu) == Menu: + return self.previousMenu + return self.previousMenu() + elif userInput.lower() == 's' and 'settings' not in self.title.lower(): + return settingsMenu(previousMenu=self) + elif not self.multiChoice and userInput in validEntry: + userChoice = self.entries[int(userInput) - 1] + if userChoice.nextFunction: + return userChoice.nextFunction(userChoice.functionParams) + elif userChoice.nextMenu: + return userChoice.nextMenu(userChoice.functionParams) + elif self.multiChoice: + inputs = userInput.split(',') + allValid = True + userChoices = [] + for i in inputs: + if i.strip() not in validEntry: + allValid = False + else: + userChoices.append(self.entries[int(i) - 1]) + if allValid: + if userChoices[0].nextFunction: + nextFunction = userChoices[0].nextFunction + return nextFunction(userChoices) + else: + nextMenu = userChoices[0].nextMenu + tempMenu = nextMenu(userChoices) + return tempMenu + else: + print('Invalid entry. Try again.') + else: + print('Invalid entry. Try again.') + def displayMultiChoiceMenu(self): + titleStr = '%sdetail: %s' % (self.title, pyradClasses.settings.setting) + while len(titleStr) < 60: + titleStr += ' ' + print('\n%s' % util.underlineCyan(titleStr)) + i = 1 + validEntry = ['x'] + for entry in self.entries: + validEntry.append(str(i)) + print(' %s) %s' % (util.magentaText(i), entry.name)) + i += 1 + if 'Main' not in self.title: + print(' %s Previous menu' % util.magentaText('B)')) + validEntry.append('b') + if 'settings' not in self.title: + print(' %s Settings' % util.magentaText('S)')) + validEntry.append('s') + print(' %s Exit' % util.magentaText('X)')) + validChoice = False + while not validChoice: + userInput = input('Choose an option(s). Separate multiple choices with a comma: ') + if userInput.lower() == 'x': + print('Goodbye') + exit(1) + elif userInput.lower() == 'b' and 'main' not in self.title.lower(): + return self.previousMenu() + elif userInput.lower() == 's' and 'settings' not in self.title.lower(): + return settingsMenu(previousMenu=self) + else: + inputs = userInput.split(',') + allValid = True + userChoices = [] + for i in inputs: + + if i.strip() not in validEntry: + allValid = False + else: + userChoices.append(self.entries[int(i) - 1]) + if allValid: + if userChoices[0].nextFunction: + nextFunction = userChoices[0].nextFunction + return nextFunction(userChoices) + else: + nextMenu = userChoices[0].nextMenu + tempMenu = nextMenu(userChoices) + return tempMenu + else: + print('Invalid entry. Try again.') + + +class Entry: + def __init__(self, text, nextMenu=None, nextFunction=None, functionParams=None, previousMenu=None): + self.name = text + self.nextMenu = nextMenu + self.nextFunction = nextFunction + self.functionParams = functionParams + if previousMenu: + self.previousMenu = previousMenu() + + +def changeSettings(params): + value = params[0] + previousMenu = params[1] + pyradClasses.settings.changeSetting(value) + return previousMenu + + +def loadTheme(params): + value = params[0] + previousMenu = params[1] + pyradClasses.theme.loadTheme(value) + return settingsMenu(previousMenu) + + +def createPlot(params): + plotList = params['plots'] + plotType = params['plotType'] + plotTitle = params['title'] + pyradClasses.plot(plotType, plotTitle, plotList) + return menuChoosePlotType() + + +def plotPlanetSpectrum(values): + pList = [] + for p in values['profiles']: + pList.append(p.name) + if values['height'] == -2.71828: + pyradClasses.plotPlanetSpectrum(pList, direction=values['direction'], verify=False) + else: + pyradClasses.plotPlanetSpectrum(pList, direction=values['direction'], height=values['height'], verify=False) + return chooseAtmTransferBuildProfile() -def getTransmittance(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return obj.transmittance +def plotPlanetSpectrumComponents(values): + #planet = pyradClasses.loadEmptyPlanet(values['profiles'][0].name) + if values['height'] == -2.71828: + pyradClasses.plotPlanetAndComponents(values['profiles'][0].name, direction=values['direction'], verify=False) +# pyradClasses.plotPlanetAndComponents(values['profiles'], direction=values['direction'], verify=False) + else: + pyradClasses.plotPlanetAndComponents(values['profiles'][0].name, direction=values['direction'], height=values['height'], verify=False) + return chooseAtmTransferBuildProfile() + + +def createLayer(atmosphere): + defaultLayerName = atmosphere.nextLayerName() + getLayerName = '\n%s\n' \ + 'If no value given, default will be %s : ' \ + % (util.underlineCyan('Enter the name of the layer.\t\t'), + util.limeText(defaultLayerName)) + depth = inputLayerDepth() + pressure = inputLayerPressure() + temperature = inputLayerTemperature() + rangeMin, rangeMax = inputLayerRange() + validName = False + while not validName: + layerName = input(getLayerName) + if layerName not in genericAtmosphere: + validName = True + else: + print('Name already taken. Please try again.') + layer = atmosphere.addLayer(depth, temperature, pressure, rangeMin, rangeMax, name=layerName) + return createMolecule(layer) + + +def createMolecule(layer): + addMoleculeLoop = True + while addMoleculeLoop: + moleculeName = inputMoleculeName() + concentration, units = inputMoleculeComposition() + tempdict = {units: concentration} + molecule = layer.addMolecule(moleculeName, **tempdict) + while pyradClasses.totalConcentration(layer) > 1: + print("%s total concentration exceeds 100%%" % util.magentaText('***\tWARNING\t***')) + menuEditComposition(layer) + validInput = False + while not validInput: + ask = input("Add another molecule to the layer %s " % util.magentaText('(y/n) :')) + if ask.strip().lower() == 'y': + validInput = True + elif ask.strip().lower() == 'n': + return gasCellMenu() + + +def menuEditLayerParam(layer): + editDepth = Entry('Depth', nextFunction=editLayerDepth, functionParams=layer) + editRange = Entry('Min or max range', nextFunction=editLayerRange, functionParams=layer) + editTemperature = Entry('Temp erature',nextFunction=editLayerTemperature, functionParams=layer) + editPressure = Entry('Pressure', nextFunction=editLayerPressure, functionParams=layer) + entryList = [editDepth, editRange, editTemperature, editPressure] + menu = Menu('Choose the parameter to edit for %s' % layer.name, entryList, + previousMenu=menuEditParamsOrComp, menuParams=layer) + return menu + + +def editLayerDepth(layer): + print('Current %s for %s is : %s\n' + % (util.limeText('depth'), util.limeText(layer.name), util.cyanText('%scm' % layer.depth))) + depth = inputLayerDepth(default=layer.depth) + layer.changeDepth(depth) + return menuEditLayerParam(layer) + + +def editLayerTemperature(layer): + print('Current %s for %s is : %s\n' + % (util.limeText('temperature'), util.limeText(layer.name), util.cyanText('%sK' % layer.T))) + temperature = inputLayerTemperature(default=layer.T) + layer.changeTemperature(temperature) + return menuEditLayerParam(layer) + + +def editLayerPressure(layer): + print('Current %s for %s is : %s\n' + % (util.limeText('pressure'), util.limeText(layer.name), util.cyanText('%smbar' % layer.P))) + pressure = inputLayerPressure(default=layer.P) + layer.changePressure(pressure) + return menuEditLayerParam(layer) + + +def editLayerRange(layer): + print('Current %s for %s is %s\n' + % (util.limeText('range'), util.limeText(layer.name), + util.cyanText('%s-%scm-1' % (layer.rangeMin, layer.rangeMax)))) + rangeMin, rangeMax = inputLayerRange(defaultMin=layer.rangeMin, defaultMax=layer.rangeMax) + layer.changeRange(rangeMin, rangeMax) + return menuEditLayerParam(layer) + + +def editComposition(molecule): + print('Current concentration for %s is %s\n' % (util.limeText(molecule.name), util.limeText(molecule.concText))) + return inputMoleculeComposition(molecule, default=molecule.concText) + + +def inputLayerDepth(default=None): + if not default: + default = 10 + text = 'Enter the thickness of the layer.\t\t\t' + getDepth = '%s\n' \ + 'If no units are specified, %s will be assumed.\n' \ + 'Other valid units are %s . If no value given, default will be %s: ' % \ + (util.underlineCyan(text), + util.limeText('cm'), + util.limeText('m, in, ft.'), + util.limeText('%scm' % default)) + depth = receiveInput(getDepth, validDepth, default=default) + return depth + + +def inputLayerTemperature(default=None): + if not default: + default = 300 + text = 'Enter the temperature of the layer.\t\t\t' + getTemperature = '%s\n' \ + 'If no units are specified, %s will be assumed.\n' \ + 'Other valid units are %s . If no value given, default will be %s: ' % \ + (util.underlineCyan(text), + util.limeText('K'), + util.limeText('C or F'), + util.limeText('%sK' % default)) + temperature = receiveInput(getTemperature, validTemperature, default=default) + return temperature + + +def inputLayerPressure(default=None): + if not default: + default = 1013.25 + text = 'Enter the pressure of the layer.\t\t\t' + getPressure = '%s\n' \ + 'If no units are specified, %s will be assumed.\n' \ + 'Other valid units are %s . If no value given, default will be %s: ' % \ + (util.underlineCyan(text), + util.limeText('mBar'), + util.limeText('pa, bar, and atm.'), + util.limeText('%smbar' % default)) + pressure = receiveInput(getPressure, validPressure, default=default) + return pressure + + +def inputLayerRange(defaultMin=None, defaultMax=None): + if not defaultMin: + defaultMin = 600 + if not defaultMax: + defaultMax = 700 + rangeMin = -1 + rangeMax = -1 + text = 'Enter the minimum range of the layer.\t\t\t' + getRangeMin = '%s\n' \ + 'If no units are specified, %s will be assumed.\n' \ + 'Other valid units are %s . If no value given, default will be %s: ' % \ + (util.underlineCyan(text), + util.limeText('cm-1'), + util.limeText('um'), + util.limeText('%scm' % defaultMin)) + while rangeMin < 0: + rangeMin = receiveInput(getRangeMin, validRange, default=defaultMin) + if rangeMin < 0: + print('Range min must be %s than zero' % util.magentaText('greater')) + text = 'Enter the maximum range of the layer.\t\t\t' + getRangeMax = '%s\n' \ + 'If no units are specified, %s will be assumed.\n' \ + 'Other valid units are %s . If no value given, default will be %s: ' % \ + (util.underlineCyan(text), + util.limeText('cm-1'), + util.limeText('um'), + util.limeText('%scm' % defaultMax)) + while rangeMax <= rangeMin: + rangeMax = receiveInput(getRangeMax, validRange, default=defaultMax) + if rangeMax <= rangeMin: + print('Range min must be %s than range min of %s' % (util.magentaText('greater'), util.cyanText(rangeMin))) + return rangeMin, rangeMax + + +def validNumber(userInput): + try: + return float(userInput) + except ValueError: + return False -def getOpticalDepth(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return -np.log(obj.transmittance) +def inputPlanckRange(units): + rangeMin = -1 + rangeMax = -1 + text = '%s\nUnits are %s. Scientific notation is accepted (1e14):' \ + % (util.underlineCyan('Enter the minimum range of the planck spectrum.'),util.limeText(units)) + while rangeMin < 0: + rangeMin = receiveInput(text, validNumber) + if rangeMin < 0: + print('Range min must be %s than zero' % util.magentaText('greater')) + text = '%s\nUnits are %s. Scientific notation is accepted (1e14):' \ + % (util.underlineCyan('Enter the maximum range of the planck spectrum.'), util.limeText(units)) + while rangeMax <= rangeMin: + rangeMax = receiveInput(text, validNumber) + if rangeMax <= rangeMin: + print('Range min must be %s than range min of %s' % (util.magentaText('greater'), util.cyanText(rangeMin))) + return rangeMin, rangeMax + + +def inputMoleculeName(default=None): + if not default: + default = 'co2' + text = 'Enter the short molecule name.\t\t\t' + moleculeName = receiveInput('%s\n' + 'For a full list of options, type %s . If no value given, %s will be used: ' + % (util.underlineCyan(text), + util.magentaText('help'), + util.limeText(default)), validMoleculeName, default=default) + return moleculeName + + +def inputMoleculeComposition(obj=None, default=None): + if not default: + default = '400ppm' + text = 'Enter the molecule composition.\t\t\t' + composition, units = receiveInput('%s\n' + 'If no units entered, composition will be assumed %s.\n' + 'Other valid units are %s . If no value given, %s will be used: ' + % (util.underlineCyan(text), + util.limeText('parts per 1'), + util.limeText('ppm, ppb, or percentage'), + util.limeText(default)), validComposition, default=default) + if obj: + if units == 'ppm': + obj.setPPM(composition) + elif units == 'ppb': + obj.setPPB(composition) + elif 'perc' in units or units == '%': + obj.setPercentage(composition) + else: + obj.setConcentrationPercentage(composition) + return + else: + return composition, units + + +def inputPlanckTemps(): + text = 'Enter the temperature of the planck curves.\t\t\t' + tempList = receiveMultiInput('%s\n' + 'If no units entered, temperature will be assumed %s.\n' + 'Other valid units are %s .Multiple temperatures can be separated with a comma: ' + % (util.underlineCyan(text), + util.limeText('K'), + util.limeText('C and F')), validTemperature) + return tempList + + +def inputHeight(values): + text = 'Enter the height to view transmission from.\t\t\t' + height = receiveInput('%s\n' + 'Units should be in %s. If no value entered, maximum atm height will be used: ' % (util.underlineCyan(text), util.limeText('km')), validNumber, default=-2.71828) + values['height'] = height * 10**5 + return plotPlanetSpectrum(values) + + +def inputHeightComponents(values): + text = 'Enter the height to view transmission from.\t\t\t' + height = receiveInput('%s\n' + 'Units should be in %s. If no value entered, maximum atm height will be used: ' % (util.underlineCyan(text), util.limeText('km')), validNumber, default=-2.71828) + values['height'] = height * 10**5 + return plotPlanetSpectrumComponents(values) + + +def menuChooseLayerToEdit(empty=None): + entryList = [] + for layer in genericAtmosphere: + nextEntry = Entry(layer.name, nextFunction=menuEditParamsOrComp, functionParams=layer) + entryList.append(nextEntry) + editLayerMenu = Menu('Edit layer', entryList) + return editLayerMenu + + +def menuChooseTransmission(plotType): + entryList = [] + for layer in genericAtmosphere: + params = {'plots': [layer], 'plotType': plotType, 'title': layer.title} + nextEntry = Entry(layer.name, nextFunction=createTransmission, functionParams=params) + entryList.append(nextEntry) + plotList, title = createObjAndComponents(layer) + params = {'plots': plotList, 'plotType': plotType, 'title': title} + nextEntry = Entry('%s and components' % layer.name, nextFunction=createTransmission, functionParams=params) + entryList.append(nextEntry) + transmissionMenu = Menu('Choose which layers to plot transmission', entryList) + return transmissionMenu + + +def createPlanckCurves(plotType): + plotList = inputPlanckTemps() + rangeMin, rangeMax = inputPlanckRange(plotType) + pyradClasses.plotSpectrum(title='Planck spectrums', rangeMin=rangeMin, rangeMax=rangeMax, planckTemperatureList=plotList, planckType=plotType) + return menuMain() + + +def menuPlanckType(empty=None): + entryList = [] + wavenumber = 'wavenumber' + hertz = 'Hz' + wavelength = 'wavelength' + entryList.append(Entry('By %s (cm-1)' % wavenumber, nextFunction=createPlanckCurves, functionParams=wavenumber)) + entryList.append(Entry('By %s (um)' % wavelength, nextFunction=createPlanckCurves, functionParams=wavelength)) + entryList.append(Entry('By %s (s-1)' % hertz, nextFunction=createPlanckCurves, functionParams=hertz)) + planckTypeMenu = Menu('Choose planck type', entryList, previousMenu=menuMain) + return planckTypeMenu + + +def createTransmission(params): + layer = params['plots'][0] + text = 'A plot for transmission requires an initial surface temperature.\n'\ + 'Please choose a temperature different from the layer temperature of %sK:' % util.limeText(layer.T) + temperature = receiveMultiInput(text, validTemperature) + objList = [] + for item in params['plots']: + objList.append(item) + temperature.append(layer.T) + pyradClasses.plotSpectrum(layer, objList=objList, + surfaceSpectrum=pyradPlanck.planckWavenumber(layer.xAxis, temperature[0]), + planckTemperatureList=temperature) + return menuChoosePlotType() + + +def menuChoosePlotType(empty=None): + entryList = [] + entryList.append(Entry('transmittance', nextMenu=menuChooseLayerToPlot, functionParams='transmittance')) + entryList.append(Entry('absorption coefficient', nextMenu=menuChooseLayerToPlot, functionParams='absorption coefficient')) + entryList.append(Entry('cross section', nextMenu=menuChooseLayerToPlot, functionParams='cross section')) + entryList.append(Entry('absorbance', nextMenu=menuChooseLayerToPlot, functionParams='absorbance')) + entryList.append(Entry('optical depth', nextMenu=menuChooseLayerToPlot, functionParams='optical depth')) + entryList.append(Entry('line survey', nextMenu=menuChooseLayerToPlot, functionParams='line survey')) + entryList.append(Entry('transmission', nextMenu=menuChooseTransmission, functionParams='transmission')) + choosePlotTypeMenu = Menu('Choose plot type', entryList, previousMenu=gasCellMenu) + return choosePlotTypeMenu + + +def menuChooseLayerToPlot(plotType): + entryList = [] + for layer in genericAtmosphere: + params = {'plots': [layer], 'plotType': plotType, 'title': layer.title} + nextEntry = Entry(layer.name, nextFunction=createPlot, functionParams=params) + entryList.append(nextEntry) + plotList, title = createObjAndComponents(layer) + params = {'plots': plotList, 'plotType': plotType, 'title': title} + nextEntry = Entry('%s and components' % layer.name, nextFunction=createPlot, functionParams=params) + entryList.append(nextEntry) + plotLayerMenu = Menu('Plot layer', entryList, previousMenu=menuChoosePlotType) + return plotLayerMenu + + +def createObjAndComponents(obj): + plotList = [obj] + for item in obj: + plotList.append(item) + return plotList, obj.title + + +def menuEditComposition(layer): + moleculeList = layer.returnMoleculeObjects() + entryList = [] + for molecule in moleculeList: + newEntry = Entry('%s : %s' % (molecule.name, molecule.concText), + functionParams=molecule, nextFunction=inputMoleculeComposition) + entryList.append(newEntry) + entryList.append(Entry('Add a new molecule(s)', nextFunction=createMolecule, functionParams=layer)) + editCompMenu = Menu('Choose a molecule to edit', entryList, previousMenu=menuEditParamsOrComp) + return editCompMenu + + +def menuEditParamsOrComp(layer): + entryList = [] + editLayerParamsEntry = Entry('Edit layer parameters', nextFunction=menuEditLayerParam, functionParams=layer) + entryList.append(editLayerParamsEntry) + duplicateLayerEntry = Entry('Duplicate layer', nextFunction=duplicateObj, functionParams=layer) + entryList.append(duplicateLayerEntry) + editCompositionEntry = Entry('Edit composition', nextFunction=menuEditComposition, functionParams=layer) + entryList.append(editCompositionEntry) + chooseParamsMenu = Menu('Edit or duplicate', entryList, previousMenu=menuChooseLayerToEdit) + return chooseParamsMenu + + +def gasCellMenu(param=None): + createLayerEntry = Entry("Create new gas cell", nextFunction=createLayer, functionParams=genericAtmosphere) + editLayerEntry = Entry("Edit/duplicate gas cell", nextMenu=menuChooseLayerToEdit) + plotLayerEntry = Entry("Plot gas cell", nextMenu=menuChoosePlotType) + menuGasCell = Menu('Gas cell simulator', [createLayerEntry, editLayerEntry, plotLayerEntry], previousMenu=menuMain) + return menuGasCell + + +def chooseDirection(profileList): + lookUpEntry = Entry('Looking up', nextFunction=inputHeight, functionParams={'profiles': profileList, + 'direction': 'up'}) + lookDownEntry = Entry('Looking down', nextFunction=inputHeight, functionParams={'profiles': profileList, + 'direction': 'down'}) + menuChooseDirection = Menu('Choose direction to look', [lookUpEntry, lookDownEntry], previousMenu=plotAtmTransferMenu) + return menuChooseDirection + + +def chooseDirectionComponents(profile): + lookUpEntry = Entry('Looking up', nextFunction=inputHeightComponents, functionParams={'profiles': profile, + 'direction': 'up'}) + lookDownEntry = Entry('Looking down', nextFunction=inputHeightComponents, functionParams={'profiles': profile, + 'direction': 'down'}) + menuChooseDirection = Menu('Choose direction to look', [lookUpEntry, lookDownEntry], + previousMenu=plotProfileComponentsMenu) + return menuChooseDirection + + +def plotProfileComponentsMenu(param=None): + entryList = [] + profileList = util.getCompletedTransmissionList() + for profile in profileList: + entryList.append(Entry('%s' % profile, nextMenu=chooseDirectionComponents, functionParams=profile)) + menuAtmTransfer = Menu('Choose atmosphere', entryList, previousMenu=chooseAtmTransferBuildProfile, multiChoice=True) + return menuAtmTransfer + + +def buildProfile(profileList): + saveAbsData = pyradClasses.yesOrNo("Would you like to save abs coef data?\n" + "This takes up quite a bit of space and generally isn't needed. %s" + % util.limeText('(y/n)')) + # initiate planet variable, in hopes of stopping memory leak + planet = None + + for profile in profileList: + print('Building %s on setting %s' % (profile.name, pyradClasses.settings.setting)) + planet = pyradClasses.createCustomPlanet(profile.name) + overwrite = True + progress, time = util.profileProgress(planet.folderPath) + if util.profileComplete(planet.folderPath): + overwrite = pyradClasses.yesOrNo("Data for this profile and setting seems to exist.\n" + "Do you wish to overwrite it? %s" % util.limeText('(y/n)')) + elif progress: + resume = pyradClasses.yesOrNo('Partial data exists for this setting, do you wish to resume? %s' % util.limeText('(y/n)')) + if not resume: + overwrite = pyradClasses.yesOrNo("Are you sure, choosing yes will erase all previous data.\n" + "Do you wish to overwrite it? %s" % util.limeText('(y/n)')) + else: + planet.processLayers(verify=False, moleculeSpecific=True) + overwrite = False + if overwrite: + util.emptyProfileDirectory(planet.folderPath) + planet.processLayers(verify=False, moleculeSpecific=True) + print('Creating transmission...') + pyradClasses.processTransmissionBySingleLayer(planet.folderPath) + if not saveAbsData: + util.clearAbsData(planet.folderPath) + planet.clearData() + return chooseAtmTransferBuildProfile() + + +def buildProfilesMenu(param=None): + entryList = [] + profileList = util.getPyrFileList() + for profile in profileList: + entryList.append(Entry('%s' % profile[:-4], nextFunction=buildProfile, functionParams=profile)) + menuBuildProfile = Menu('Which profile(s) do you want to build', entryList, previousMenu=chooseAtmTransferBuildProfile, multiChoice=True) + return menuBuildProfile + + +def chooseAtmTransferBuildProfile(param=None): + plotProfilesEntry = Entry('Plot profile(s)', nextMenu=plotAtmTransferMenu) + plotProfileAndComponents = Entry('Plot single atm and components', nextMenu=plotProfileComponentsMenu) + buildProfilesEntry = Entry('Build profile(s)', nextMenu=buildProfilesMenu) + menuChooseProfileBuild = Menu('Plot or build profiles', [plotProfilesEntry, plotProfileAndComponents, buildProfilesEntry], previousMenu=menuMain) + return menuChooseProfileBuild + + +def plotAtmTransferMenu(param=None): + profileList = util.getCompletedTransmissionList() + entryList = [] + for profile in profileList: + entryList.append(Entry('%s' % profile, nextMenu=chooseDirection, functionParams=profile)) + menuAtmTransfer = Menu('Choose atmosphere', entryList, previousMenu=menuMain, multiChoice=True) + return menuAtmTransfer + + +def chooseThemeMenu(originalMenu): + themeList = pyradClasses.theme.listOfThemes + entryList = [] + for theme in themeList: + entryList.append(Entry('%s' % theme, nextFunction=loadTheme, functionParams=(theme, originalMenu))) + menuChooseTheme = Menu('Choose theme', entryList, previousMenu=settingsMenu) + return menuChooseTheme + + +def menuMain(): + gasCellEntry = Entry('Gas cell simulator', nextMenu=gasCellMenu) + atmosphereTransferEntry = Entry('Atmosphere transmission', nextMenu=chooseAtmTransferBuildProfile) + planckPlotEntry = (Entry('Plot planck curves', nextMenu=menuPlanckType)) + mainMenu = Menu('Main menu', [gasCellEntry, atmosphereTransferEntry, planckPlotEntry]) + return mainMenu + + +def settingsMenu(previousMenu=menuMain): + lowSetting = Entry('low (intensity > 1e-21)', nextFunction=changeSettings, functionParams=('low', previousMenu)) + midSetting = Entry('mid (intensity > 1e-24)', nextFunction=changeSettings, functionParams=('mid', previousMenu)) + hiSetting = Entry('high (all absorption lines)', nextFunction=changeSettings, functionParams=('high', previousMenu)) + loadTheme = Entry('Change theme', nextMenu=chooseThemeMenu, functionParams=previousMenu) + menuSettings = Menu('Choose level of detail', [lowSetting, midSetting, hiSetting, loadTheme], previousMenu=previousMenu) + return menuSettings + + +def duplicateObj(obj): + newObj = obj.returnCopy() + if isinstance(newObj, pyradClasses.Layer): + genericAtmosphere.append(newObj) + else: + print('Unknown object %s, type %s' % (obj.name, type(obj))) + return + + +def receiveInput(inputText, validInputFunction, default=None): + validInput = False + while validInput is False: + userInput = input('\n%s' % inputText) + if userInput == '': + return validInputFunction(str(default)) + validInput = validInputFunction(userInput) + return validInput + + +def receiveMultiInput(inputText, validInputFunction, default=None): + validInput = False + while not validInput: + userInput = input(inputText) + inputList = userInput.replace(' ', '').split(',') + testInput = True + for item in inputList: + if not validInputFunction(item): + print('%s not recognized as valid. Please try again.') + testInput = False + if testInput: + return inputList + + +def validMoleculeName(userInput): + if not userInput: + return False + if userInput.strip().lower() == 'help': + util.displayAllMolecules() + return False + elif userInput in pyradClasses.MOLECULE_ID: + return userInput + else: + print('Invalid molecule name. %s' % (util.underlineMagenta('Please try again.'))) + return False -def getAbsorbance(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return obj.absorbance +def validPressure(userInput): + if not userInput: + return False + try: + splitInput = validValueAndUnits.match(userInput) + except AttributeError: + print('Invalid input for pressure. Example: %s. %s' + % (util.limeText('1.35atm'), util.underlineMagenta('Please try again.'))) + return False + unit = splitInput.group(5) + if not unit: + unit = 'mbar' + unit = unit.lower() + if unit not in PRESSURE_UNITS: + print('Invalid units. Accepted units are %s.' % ', '.join(PRESSURE_UNITS)) + return False + textNumber = '' + for i in range(1, 5): + if splitInput.group(i): + textNumber += splitInput.group(i) -def getEmissivity(obj): - if not obj.progressCrossSection: - obj.createCrossSection() - return obj.emissivity + value = float(textNumber) + return pyradClasses.convertPressure(value, unit) -def getGlobalIsotope(ID, isotopeDepth): - globalIsoList = [] - for i in range(1, isotopeDepth + 1): - globalIsoList.append(HITRAN_GLOBAL_ISO[ID][i]) - return globalIsoList +def validComposition(userInput): + if not userInput: + return False + try: + splitInput = validValueAndUnits.match(userInput) + except AttributeError: + print('Invalid input for concentration. Example: %s. %s' + % (util.limeText('15ppb'), util.underlineMagenta('Please try again.'))) + return False + unit = splitInput.group(5) + if not unit: + unit = 'concentration' + if unit not in COMPOSITION_UNITS: + print('Invalid units. Accepted units are %s.' + % (util.limeText(', '.join(COMPOSITION_UNITS)))) + return False + textNumber = '' + for i in range(1, 5): + if splitInput.group(i): + textNumber += splitInput.group(i) + value = float(textNumber) + if value <= 0: + print('Concentration must be greater than 0') + return False + return value, unit -def printProgress(text, obj): - layerName = obj.layer.name - molName = obj.molecule.name - isoName = obj.name - print('Processing %s: %s; %s; isotope %s' % (text, layerName, molName, isoName)) +def validTemperature(userInput): + if not userInput: + return False + try: + splitInput = validValueAndUnits.match(userInput) + except AttributeError: + print('Invalid input for temperature. Example: %s. %s' + % (util.limeText('20C'), util.underlineMagenta('Please try again.'))) + return False + unit = splitInput.group(5) + if not unit: + unit = 'K' + unit = unit.upper()[0] + if unit not in TEMPERATURE_UNITS: + print('Invalid units. Accepted units are %s.' + % (util.limeText(', '.join(TEMPERATURE_UNITS)))) + return False + textNumber = '' + for i in range(1, 5): + if splitInput.group(i): + textNumber += splitInput.group(i) + value = float(textNumber) + return pyradClasses.convertTemperature(value, unit) -def totalConcentration(layer): - total = 0 - for molecule in layer: - total += molecule.concentration - return total +def validRange(userInput): + if not userInput: + return False + try: + splitInput = validValueAndUnits.match(userInput) + except AttributeError: + print('Invalid input for range. Example: %s. %s' + % (util.limeText('150cm-1'), util.underlineMagenta('Please try again.'))) + return False + unit = splitInput.group(5) + if not unit: + unit = 'cm-1' + unit = unit.lower() + if unit not in RANGE_UNITS: + print('Invalid units. Accepted units are %s' + % (util.limeText(', '.join(RANGE_UNITS)))) + return False + textNumber = '' + for i in range(1, 5): + if splitInput.group(i): + textNumber += splitInput.group(i) + value = float(textNumber) + return pyradClasses.convertRange(value, unit) -def totalLineList(obj): - fullList = [] - if isinstance(obj, Isotope): - return obj.linelist() - for item in obj: - fullList += totalLineList(item) - return fullList - - -def convertLength(value, units): - if units == 'cm': - return value - elif units in ['m', 'meter']: - return value * 100 - elif units in ['ft', 'feet']: - return value * 30.48 - elif units in ['in', 'inch']: - return value * 2.54 - - -def convertPressure(value, units): - if units == 'mbar': - return value - elif units in ['atm', 'atmospheres', 'atmosphere']: - return value * 1013.25 - elif units in ['b', 'bar']: - return value * 1000 - elif units in ['pa', 'pascal', 'pascals']: - return value / 100 - - -def convertRange(value, units): - if units == 'cm-1': - return value - elif units in ['um', 'micrometers', 'micrometer']: - return 10000 / value - - -def convertTemperature(value, units): - if units[0].upper() == 'K': - return value - elif units[0].upper() == 'C': - return value + 273 - elif units[0].upper() == 'F': - return (value - 32) * 5 / 9 + 273 - - -def interpolateArray(hiResXAxis, loResXAxis, loResYValues): - hiResY = np.interp(hiResXAxis, loResXAxis, loResYValues) - return hiResY - - -class Line: - def __init__(self, wavenumber, intensity, einsteinA, airHalfWidth, - selfHalfWidth, lowerEnergy, tempExponent, pressureShift, parent): - self.isotope = parent - self.molecule = self.isotope.molecule - self.layer = self.molecule.layer - self.wavenumber = wavenumber - self.intensity = intensity - self.einsteinA = einsteinA - self.airHalfWidth = airHalfWidth - self.selfHalfWidth = selfHalfWidth - self.lowerEnergy = lowerEnergy - self.tempExponent = tempExponent - self.pressureShift = pressureShift - - @property - def broadenedLine(self): - return self.wavenumber + self.pressureShift * self.layer.P / p0 - - @property - def lorentzHW(self): - return (float((1 - self.molecule.concentration) * self.airHalfWidth + self.molecule.concentration - * self.selfHalfWidth) * (self.layer.P / p0) * (t0 / self.layer.T) ** self.tempExponent) - - @property - def gaussianHW(self): - return self.broadenedLine * np.sqrt(2 * k * self.layer.T / self.isotope.molMass / c ** 2) - - -class Isotope(list): - def __init__(self, number, molecule): - super(Isotope, self).__init__(self) - params = utils.readMolParams(number) - self.globalIsoNumber = params[0] - self.shortName = params[1] - self.name = 'Isotope %s' % self.globalIsoNumber - self.molNum = params[2] - self.isoN = params[3] - self.abundance = params[4] - self.q296 = params[5] - self.gj = params[6] - self.molmass = params[7] - self.molecule = molecule - self.layer = self.molecule.layer - self.q = {} - self.crossSection = np.copy(self.layer.crossSection) - self.lineSurvey = np.zeros(int((self.layer.rangeMax - self.layer.rangeMin) / utils.BASE_RESOLUTION)) - self.progressCrossSection = False - - @property - def P(self): - return self.layer.P - - @property - def molMass(self): - return self.molmass / 1000 / avo - - @property - def T(self): - return self.layer.T - - @property - def depth(self): - return self.layer.depth - - @property - def rangeMin(self): - return self.layer.rangeMin - - @property - def rangeMax(self): - return self.layer.rangeMax - - @property - def resolution(self): - return self.layer.resolution - - @property - def distanceFromCenter(self): - return self.layer.distanceFromCenter - - @property - def absCoef(self): - return self.crossSection * self.molecule.concentration * self.layer.P / 1E4 / k / self.layer.T - - @property - def transmittance(self): - return np.exp(-self.absCoef * self.layer.depth) - - @property - def emissivity(self): - return 1 - self.transmittance - - @property - def emittance(self): - return self.emissivity - - @property - def absorbance(self): - return np.log10(1 / self.transmittance) - - @property - def yAxis(self): - return np.copy(self.layer.yAxis) - - @property - def xAxis(self): - return np.copy(self.layer.xAxis) - - def getData(self): - print('Getting data for %s, isotope %s' % (self.molecule.name, self.globalIsoNumber)) - lineDict = utils.gatherData(self.globalIsoNumber, self.layer.effectiveRangeMin, self.layer.effectiveRangeMax) - self.q = utils.getQData(self.globalIsoNumber) - for line in lineDict: - self.append(Line(line, lineDict[line]['intensity'], lineDict[line]['einsteinA'], - lineDict[line]['airHalfWidth'], lineDict[line]['selfHalfWidth'], - lineDict[line]['lowerEnergy'], lineDict[line]['tempExponent'], - lineDict[line]['pressureShift'], self)) - self.createLineSurvey() - - def createCrossSection(self): - molecule = self.molecule - layer = molecule.layer - progress = 0 - i = 1 - alertInterval = int(len(self) / 20) - crossSection = np.copy(self.yAxis) - trackGauss = 0 - trackLorentz = 0 - trackVoigt = 0 - for line in self: - if progress > i * alertInterval: - print('Progress for %s <%s%s>' % (molecule.name, '*' * i, '-' * (20 - i)), end='\r') - os.sys.stdout.flush() - i += 1 - progress += 1 - xValues = np.arange(0, layer.distanceFromCenter, layer.resolution) - hwRatio = line.lorentzHW / line.gaussianHW - if hwRatio < .01: - rightCurve = ls.gaussianLineShape(line.gaussianHW, xValues) - trackGauss += 1 - elif hwRatio > 100: - rightCurve = ls.lorentzLineShape(line.lorentzHW, xValues) - trackLorentz += 1 - else: - rightCurve = ls.pseudoVoigtShape(line.gaussianHW, line.lorentzHW, xValues) - trackVoigt += 1 - intensity = pyradIntensity.intensityFactor(line.intensity, line.broadenedLine, - layer.T, line.lowerEnergy, self.q[layer.T], self.q296) - arrayIndex = int((line.wavenumber - layer.rangeMin) / layer.resolution) - arrayLength = len(crossSection) - 1 - if isBetween(arrayIndex, 0, arrayLength): - crossSection[arrayIndex] = crossSection[arrayIndex] + rightCurve[0] * intensity - for dx in range(1, len(rightCurve) - 1): - rightIndex = arrayIndex + dx - leftIndex = arrayIndex - dx - if isBetween(rightIndex, 0, arrayLength): - crossSection[rightIndex] += rightCurve[dx] * intensity - if isBetween(leftIndex, 0, arrayLength): - crossSection[leftIndex] += rightCurve[dx] * intensity - self.crossSection = interpolateArray(self.xAxis, - np.linspace(self.rangeMin, self.rangeMax, - (self.rangeMax - self.rangeMin) / self.resolution, - endpoint=True), - crossSection) - print('\ngaussian only: %s\t lorentz only: %s\t voigt: %s\n' % (trackGauss, trackLorentz, trackVoigt), end='\r') - self.progressCrossSection = True - - def createLineSurvey(self): - print('Creating line survey for %s' % self.name) - molecule = self.molecule - layer = molecule.layer - progress = 0 - i = 1 - alertInterval = int(len(self) / 20) - lineSurvey = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for line in self: - if progress > i * alertInterval: - print('Progress for %s <%s%s>' % (molecule.name, '*' * i, '-' * (20 - i)), end='\r', flush=True) - i += 1 - progress += 1 - intensity = line.intensity - arrayIndex = int((line.wavenumber - layer.rangeMin) / layer.resolution) - arrayLength = len(lineSurvey) - 1 - if isBetween(arrayIndex, 0, arrayLength): - lineSurvey[arrayIndex] = lineSurvey[arrayIndex] + intensity - self.lineSurvey = lineSurvey - return self.lineSurvey - - def linelist(self): - lines = [] - for line in self: - lines.append(line) - return lines - - def planck(self, temperature): - return self.layer.planck(temperature) - - def transmission(self, surfaceSpectrum): - transmitted = self.transmittance * surfaceSpectrum - emitted = self.emittance * self.planck(self.T) - return transmitted + emitted - - -class Molecule(list): - def __init__(self, shortNameOrMolNum, layer, isotopeDepth=1, **abundance): - super(Molecule, self).__init__(self) - self.layer = layer - self.crossSection = np.copy(layer.crossSection) - self.isotopeDepth = isotopeDepth - self.concText = '' - self.concentration = 0 - try: - int(shortNameOrMolNum) - self.ID = int(shortNameOrMolNum) - self.name = False - except ValueError: - self.name = shortNameOrMolNum - self.ID = MOLECULE_ID[self.name] - for isotope in getGlobalIsotope(self.ID, isotopeDepth): - isoClass = Isotope(isotope, self) - self.append(isoClass) - if not self.name: - self.name = isoClass.shortName - self.progressCrossSection = False - for key in abundance: - if key == 'ppm': - self.setPPM(abundance[key]) - elif key == 'ppb': - self.setPPB(abundance[key]) - elif key == 'percentage' or key == 'perc' or key == '%': - self.setPercentage(abundance[key]) - elif key == 'concentration': - self.setConcentration(abundance[key]) - else: - print('Invalid concentration type. Use ppm, ppb, percentage, or concentration.') - - def __str__(self): - return '%s: %s' % (self.name, self.concText) - - def __bool__(self): - return True - - def returnCopy(self): - valueUnit = self.concText.split() - tempDict = {valueUnit[1]: float(valueUnit[0])} - newMolecule = Molecule(self.name, self.layer, isotopeDepth=int(self.isotopeDepth), **tempDict) - newMolecule.getData() - return newMolecule - - def setPercentage(self, percentage): - self.concentration = percentage / 100 - self.concText = '%s %%' % percentage - resetCrossSection(self) - - def setPPM(self, ppm): - self.concentration = ppm * 10**-6 - self.concText = '%s ppm' % ppm - resetCrossSection(self) - - def setPPB(self, ppb): - self.concentration = ppb * 10**-8 - self.concText = '%s ppb' % ppb - resetCrossSection(self) - - def setConcentration(self, concentration): - self.setPPM(concentration * 1E6) - resetCrossSection(self) - - def getData(self): - for isotope in self: - isotope.getData() - - def createCrossSection(self): - tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for isotope in self: - tempAxis += getCrossSection(isotope) - self.progressCrossSection = True - self.crossSection = tempAxis - - def planck(self, temperature): - return self.layer.planck(temperature) - - def transmission(self, surfaceSpectrum): - transmitted = self.transmittance * surfaceSpectrum - emitted = self.emittance * self.planck(self.T) - return transmitted + emitted - - @property - def absCoef(self): - return self.crossSection * self.concentration * self.layer.P / 1E4 / k / self.layer.T - - @property - def transmittance(self): - return np.exp(-self.absCoef * self.layer.depth) - - @property - def lineSurvey(self): - tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for isotope in self: - tempAxis += isotope.lineSurvey - return tempAxis - - @property - def absorbance(self): - return np.log10(1 / self.transmittance) - - @property - def emissivity(self): - return 1 - self.transmittance - - @property - def emittance(self): - return self.emissivity - - @property - def P(self): - return self.layer.P - - @property - def yAxis(self): - return np.copy(self.layer.yAxis) - - @property - def xAxis(self): - return np.copy(self.layer.xAxis) - - @property - def T(self): - return self.layer.T - - @property - def depth(self): - return self.layer.depth - - @property - def rangeMin(self): - return self.layer.rangeMin - - @property - def rangeMax(self): - return self.layer.rangeMax - - @property - def resolution(self): - return self.layer.resolution - - @property - def distanceFromCenter(self): - return self.layer.distanceFromCenter - - -class Layer(list): - hasAtmosphere = False - - def __init__(self, depth, T, P, rangeMin, rangeMax, atmosphere=None, name='', dynamicResolution=True): - super(Layer, self).__init__(self) - self.rangeMin = rangeMin - self.rangeMax = rangeMax - self.T = T - self.P = P - self.depth = depth - self.distanceFromCenter = self.P / 1013.25 * 5 - self.effectiveRangeMin = max(self.rangeMin - self.distanceFromCenter, 0) - self.effectiveRangeMax = self.rangeMax + self.distanceFromCenter - self.dynamicResolution = dynamicResolution - if not dynamicResolution: - self.resolution = utils.BASE_RESOLUTION - else: - self.resolution = max(10**int(np.log10((self.P / 1013.25))) * .01, utils.BASE_RESOLUTION) - if not atmosphere: - if not Layer.hasAtmosphere: - self.atmosphere = Atmosphere('generic') - Layer.hasAtmosphere = self.atmosphere - else: - self.atmosphere = Layer.hasAtmosphere - else: - self.atmosphere = atmosphere - self.hasAtmosphere = atmosphere - self.crossSection = np.zeros(int((rangeMax - rangeMin) / utils.BASE_RESOLUTION)) - self.progressCrossSection = False - if not name: - name = 'layer %s' % self.atmosphere.nextLayerName() - self.name = name - - def __str__(self): - return '%s; %s' % (self.name, '; '.join(str(m) for m in self)) - - def __bool__(self): - return True - - def createCrossSection(self): - tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for molecule in self: - tempAxis += getCrossSection(molecule) - self.progressCrossSection = True - self.crossSection = tempAxis - - @property - def lineSurvey(self): - tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for molecule in self: - tempAxis += molecule.lineSurvey - return tempAxis - - @property - def yAxis(self): - return np.zeros(int((self.rangeMax - self.rangeMin) / self.resolution)) - - @property - def xAxis(self): - return np.linspace(self.rangeMin, self.rangeMax, (self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION, - endpoint=True) - - @property - def absCoef(self): - tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) - for molecule in self: - tempAxis += getAbsCoef(molecule) - return tempAxis - - @property - def transmittance(self): - return np.exp(-self.absCoef * self.depth) - - @property - def absorbance(self): - return np.log10(1 / self.transmittance) - - @property - def title(self): - return '%s\nP: %smBars; T: %sK; depth: %scm' % (str(self), self.P, self.T, self.depth) - - @property - def emissivity(self): - return 1 - self.transmittance - - @property - def emittance(self): - return self.emissivity - - def changeRange(self, rangeMin, rangeMax): - self.rangeMin = rangeMin - self.rangeMax = rangeMax - self.effectiveRangeMax = self.rangeMax + self.distanceFromCenter - self.effectiveRangeMin = max(self.rangeMin - self.distanceFromCenter, 0) - resetData(self) - - def changeTemperature(self, temperature): - self.T = temperature - resetCrossSection(self) - - def changePressure(self, pressure): - self.P = pressure - self.distanceFromCenter = self.P / 1013.25 * 5 - if not self.dynamicResolution: - self.resolution = utils.BASE_RESOLUTION - else: - self.resolution = max(10**int(np.log10((self.P / 1013.25))) * .01, utils.BASE_RESOLUTION) - resetData(self) - - def changeDepth(self, depth): - self.depth = depth - - def addMolecule(self, name, isotopeDepth=1, **abundance): - molecule = Molecule(name, self, isotopeDepth, **abundance) - self.append(molecule) - if totalConcentration(self) > 1: - print('**Warning : Concentrations exceed 1.') - molecule.getData() - return molecule - - def returnCopy(self): - newCopy = Layer(self.depth, self.T, self.P, self.rangeMin, self.rangeMax, - self.atmosphere, name=self.atmosphere.nextLayerName(), dynamicResolution=self.dynamicResolution) - for molecule in self: - newMolecule = molecule.returnCopy() - newCopy.append(newMolecule) - return newCopy - - def returnMoleculeObjects(self): - moleculeList = [] - for m in self: - moleculeList.append(m) - return moleculeList - - def planck(self, temperature): - return pyradPlanck.planckWavenumber(self.xAxis, temperature) - - def transmission(self, surfaceSpectrum): - transmitted = self.transmittance * surfaceSpectrum - emitted = self.emittance * self.planck(self.T) - return transmitted + emitted - - -class Atmosphere(list): - def __init__(self, name): - super().__init__(self) - self.name = name - - def __str__(self): - return self.name - - def __bool__(self): - return True - - def addLayer(self, depth, T, P, rangeMin, rangeMax, name=None, dynamicResolution=True): - if not name: - name = self.nextLayerName() - newLayer = Layer(depth, T, P, rangeMin, rangeMax, atmosphere=self, name=name, dynamicResolution=dynamicResolution) - self.append(newLayer) - return newLayer - - def nextLayerName(self): - return 'Layer %s' % (len(self) + 1) - - def returnLayerNames(self): - tempList = [] - for layer in self: - tempList.append(layer.name) - return tempList - - def returnLayerObjects(self): - tempList = [] - for layer in self: - tempList.append(layer) - return tempList - - -def returnPlot(obj, propertyToPlot): - if propertyToPlot == "transmittance": - yAxis = getTransmittance(obj), 1 - elif propertyToPlot == 'absorption coefficient': - yAxis = getAbsCoef(obj), 0 - elif propertyToPlot == 'cross section': - yAxis = getCrossSection(obj), 0 - elif propertyToPlot == 'absorbance': - yAxis = getAbsorbance(obj), 0 - elif propertyToPlot == 'optical depth': - yAxis = getOpticalDepth(obj), 0 - elif propertyToPlot == 'line survey': - yAxis = obj.lineSurvey, 0 - else: +def validDepth(userInput): + if not userInput: return False - return yAxis - - -def isBetween(test, minValue, maxValue): - if test >= minValue: - if test <= maxValue: - return True - return False - - -def plot(propertyToPlot, title, plotList, fill=False): - plt.figure(figsize=(10, 6), dpi=80) - plt.subplot(111, facecolor='xkcd:dark grey') - plt.xlabel('wavenumber cm-1') - plt.margins(0.01) - plt.subplots_adjust(left=.07, bottom=.08, right=.97, top=.90) - plt.ylabel(propertyToPlot) - if propertyToPlot == 'line survey': - plt.yscale('log') - plt.grid('grey', linewidth=.5, linestyle=':') - plt.title('%s' % title) - handles = [] - linewidth = 1.2 - alpha =.7 - for singlePlot, color in zip(plotList, COLOR_LIST): - yAxis, fillAxis = returnPlot(singlePlot, propertyToPlot) - fig, = plt.plot(singlePlot.xAxis, yAxis, linewidth=linewidth, alpha=alpha, color=color, label='%s' % singlePlot.name) - handles.append(fig) - plt.fill_between(singlePlot.xAxis, fillAxis, yAxis, color=color, alpha=.3 * fill) - linewidth = .7 - alpha = .5 - legend = plt.legend(handles=handles, frameon=False) - text = legend.get_texts() - plt.setp(text, color='w') - plt.show() - - -def plotSpectrum(layer=None, title=None, rangeMin=None, rangeMax=None, objList=None, surfaceSpectrum=None, - planckTemperatureList=None, planckType='wavenumber', fill=False): - plt.figure(figsize=(10, 6), dpi=80) - plt.subplot(111, facecolor='xkcd:dark grey') - plt.margins(0.01) - plt.subplots_adjust(left=.07, bottom=.08, right=.97, top=.90) - if layer: - rangeMin = layer.rangeMin - rangeMax = layer.rangeMax - title = layer.title - if planckType == 'wavenumber': - plt.xlabel('wavenumber cm-1') - plt.ylabel('Radiance Wm-2sr-1(cm-1)-1') - planckFunction = pyradPlanck.planckWavenumber - xAxis = np.linspace(rangeMin, rangeMax, (rangeMax - rangeMin) / utils.BASE_RESOLUTION) - elif planckType == 'Hz': - plt.xlabel('Hertz') - plt.ylabel('Radiance Wm-2sr-1Hz-1') - planckFunction = pyradPlanck.planckHz - xAxis = np.linspace(rangeMin, rangeMax, 1000) - elif planckType == 'wavelength': - plt.xlabel('wavelength um') - plt.ylabel('Radiance Wm-2sr-1um-1') - planckFunction = pyradPlanck.planckWavelength - xAxis = np.linspace(rangeMin, rangeMax, (rangeMax - rangeMin) / utils.BASE_RESOLUTION) - plt.title('%s' % title) - handles = [] - blue = .3 - red = 1 - green = .6 - dr = -.15 - db = .15 - dg = .15 - if not rangeMax: - xAxis = layer.xAxis - for temperature in planckTemperatureList: - yAxis = planckFunction(xAxis, float(temperature)) - fig, = plt.plot(xAxis, yAxis, linewidth=.75, color=(red, green, blue), - linestyle=':', label='%sK : %sWm-2' % (temperature, round(integrateSpectrum(yAxis, res=(rangeMax - rangeMin) / len(yAxis)), 2))) - handles.append(fig) - if red + dr < 0 or red + dr > 1: - dr *= -1 - if green + dg > 1 or green + dg < 0: - dg *= -1 - if blue + db > 1 or blue + db < 0: - db *= -1 - red += dr - green += dg - blue += db - if red < .3 and green < .3 and blue < .3: - green += .5 - blue += .2 - if red < .3 and green < .3: - green += .4 - if objList: - alpha = .7 - linewidth = 1.2 - surfacePower = integrateSpectrum(surfaceSpectrum, pi) - for obj, color in zip(objList, COLOR_LIST): - yAxis = obj.transmission(surfaceSpectrum) - fig, = plt.plot(layer.xAxis, yAxis, linewidth=linewidth, alpha=alpha, color=color, label='%s : %sWm-2' - % (obj.name, round(integrateSpectrum(yAxis, pi), 2))) - handles.append(fig) - alpha = .5 - linewidth = 1 - legend = plt.legend(handles=handles, frameon=False) - text = legend.get_texts() - plt.setp(text, color='w') - plt.show() - - -def cacheCurves(): - ls.writeCacheToFile() - - -HITRAN_GLOBAL_ISO = {1: {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 129}, - 2: {1: 7, 2: 8, 3: 9, 4: 10, 5: 11, 6: 12, 7: 13, 8: 14, 9: 121, 10: 15, 11: 120, 12: 122}, - 3: {1: 16, 2: 17, 3: 18, 4: 19, 5: 20}, - 4: {1: 21, 2: 22, 3: 23, 4: 24, 5: 25, }, - 5: {1: 26, 2: 27, 3: 28, 4: 29, 5: 30, 6: 31}, - 6: {1: 32, 2: 33, 3: 34, 4: 35}, - 7: {1: 36, 2: 37, 3: 38}, - 8: {1: 39, 2: 40, 3: 41}, - 9: {1: 42, 2: 43}, - 10: {1: 44}, - 11: {1: 45, 2: 46}, - 12: {1: 47, 2: 117}, - 13: {1: 48, 2: 49, 3: 50}, - 14: {1: 51, 2: 110}, - 15: {1: 52, 2: 53, 3: 107, 4: 108}, - 16: {1: 19, 2: 11, 3: 111, 4: 112}, - 17: {1: 56, 2: 113}, - 18: {1: 57, 2: 58}, - 19: {1: 59, 2: 60, 3: 61, 4: 62, 5: 63}, - 20: {1: 64, 2: 65, 3: 66}, - 21: {1: 67, 2: 68}, - 22: {1: 69, 2: 118}, - 23: {1: 70, 2: 71, 3: 72}, - 24: {1: 73, 2: 74}, - 25: {1: 75}, - 26: {1: 76, 2: 77, 3: 105}, - 27: {1: 78, 2: 106}, - 28: {1: 79}, - 29: {1: 80, 2: 119}, - 30: {1: 126}, - 31: {1: 81, 2: 82, 3: 83}, - 32: {1: 84}, - 33: {1: 85}, - 34: {1: 86}, - 35: {1: 127, 2: 128}, - 36: {1: 87}, - 37: {1: 88, 2: 89}, - 38: {1: 90, 2: 91}, - 39: {1: 92}, - 40: {1: 93, 2: 94}, - 41: {1: 95}, - 42: {1: 96}, - 43: {1: 116}, - 44: {1: 109}, - 45: {1: 103, 2: 115}, - 46: {1: 97, 2: 98, 3: 99, 4: 100}, - 47: {1: 114}, - 48: {1: 123}, - 49: {1: 124, 2: 125}} - -COLOR_LIST = ['xkcd:white', - 'xkcd:bright orange', - 'xkcd:seafoam green', - 'xkcd:bright blue', - 'xkcd:salmon', - 'xkcd:light violet', - 'xkcd:green yellow'] - -VERSION = utils.VERSION - -MOLECULE_ID = {'h2o': 1, 'co2': 2, 'o3': 3, 'n2o': 4, 'co': 5, - 'ch4': 6, 'o2': 7, 'no': 8, 'so2': 9, - 'no2': 10, 'nh3': 11, 'hno3': 12, 'oh': 13, - 'hf': 14, 'hcl': 15, 'hbr': 16, 'hi': 17, - 'clo': 18, 'ocs': 19, 'h2co': 20, 'hocl': 21, - 'n2': 22, 'hcn': 23, 'ch3cl': 24, 'h2o2': 25, - 'c2h2': 26, 'c2h6': 27, 'ph3': 28, 'cof2': 29, - 'sf6': 30, 'h2s': 31, 'hcooh': 32, 'ho2': 33, - 'o': 34, 'clono2': 35, 'no+': 36, 'hobr': 37, - 'c2h4': 38, 'ch3oh': 39, 'ch3br': 40, 'ch3cn': 41, - 'cf4': 42, 'c4h2': 43, 'hc3n': 44, 'h2': 45, - 'cs': 46, 'so3': 47, 'c2n2': 48, 'cocl2': 49} - - - -if __name__ == 'main': - pyradInteractive.menuMain() + try: + splitInput = validValueAndUnits.match(userInput) + except AttributeError: + print('Invalid input for depth. Example: %s. %s' + % (util.limeText('10cm'), util.underlineMagenta('Please try again.'))) + return False + unit = splitInput.group(5) + if not unit: + unit = 'cm' + unit = unit.lower() + if unit not in DEPTH_UNITS: + print('Invalid units. Accepted units are %s' + % (util.limeText(', '.join(DEPTH_UNITS)))) + return False + textNumber = '' + for i in range(1, 5): + if splitInput.group(i): + textNumber += splitInput.group(i) + value = float(textNumber) + return pyradClasses.convertLength(value, unit) + + +DEPTH_UNITS = ['cm', 'in', 'inches', 'ft', 'feet', 'meter', 'm'] +PRESSURE_UNITS = ['atm', 'bar', 'mbar', 'pa'] +TEMPERATURE_UNITS = ['K', 'C', 'F'] +RANGE_UNITS = ['um', 'cm-1'] +COMPOSITION_UNITS = ['ppm', 'ppb', '%', 'percentage', 'perc', 'concentration'] + +menu = menuMain() +while True: + menu = menu.displayMenu() + diff --git a/pyradClasses.py b/pyradClasses.py new file mode 100644 index 0000000..5740e39 --- /dev/null +++ b/pyradClasses.py @@ -0,0 +1,1691 @@ +import pyradUtilities as utils +import pyradLineshape as ls +import pyradIntensity +import pyradPlanck +import numpy as np +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +import time +import gc + + +c = 299792458.0 +k = 1.38064852E-23 +h = 6.62607004e-34 +pi = 3.141592653589793 +R = 8.3144598 +t0 = 296 +p0 = 1013.25 +avo = 6.022140857E23 +sb = 5.67E-8 + + +settings = utils.Settings('high') +theme = utils.Theme() + + +def stefanB(power): + return (power / sb) ** .25 + + +def reduceRes(array, finalRes=1.0): + n = int(finalRes / settings.baseRes) + length = int(len(array) * settings.baseRes / finalRes) + newArray = np.zeros(length) + for m in range(0, length): + for i in range(0, n): + newArray[m] += array[m * n + i] / n + return newArray + + +def strToBool(v): + return 'true' in v.lower() + + +def returnHMS(time): + hours = int(time / 3600) + minutes = int((time - hours * 3600) / 60) + seconds = time - hours * 3600 - minutes * 60 + return hours, minutes, seconds + + +def loadEmptyPlanet(folderPath, planet=None, verify=False): + values = utils.readCompleteProfile(folderPath) + if planet is None: + planet = Planet(values['name'], float(values['surfacePressure']), int(values['surfaceTemperature']), float(values['maxHeight']), + rangeMin=int(values['rangeMin']), rangeMax=int(values['rangeMax']), initialThickness=int(float(values['initialDepth'])), + gravity=float(values['gravity']), res=int(float(values['res']))) + for mol in values['molList'].split(','): + planet.moleculeList.append(mol) + if not utils.profileComplete(folderPath): + planet.processLayers(verify=verify) + fileLength = utils.profileLength(folderPath) + while len(planet.atmosphere) > 0: + planet.atmosphere.pop() + for i in range(1, fileLength + 1): + lP = utils.readPlanetProfile(folderPath, i, fileLength) + layer = Layer(lP['depth'], lP['T'], lP['P'], lP['rangeMin'], lP['rangeMax'], height=lP['height'], + name=lP['name']) + layer.absorptionCoefficient = np.asarray(lP['absCoef']) + layer.progressAbsCoef = True + planet.atmosphere.append(layer) + print('') + planet.progressProfileLoaded = True + return planet + + +def readTransmissionFromFile(requestedHeight, folderPath, direction): + completedValues = utils.readCompleteTransmission(folderPath) + heightList = completedValues['heightList'] + maxHeight = float(completedValues['maxHeight']) * 100000 + i = 0 + + if direction == 'down': + height = 0 + while height < requestedHeight and i < len(heightList) - 1: + height = float(heightList[i]) + i += 1 + else: + height = maxHeight + heightList.reverse() + requestedHeight = min(requestedHeight, maxHeight) + while height > requestedHeight and i < len(heightList) - 1: + height = float(heightList[i]) + i += 1 + targetIndex = heightList.index(height) + fileName = 'trans looking %s-%s.pyr' % (direction, targetIndex) + print('retreiving transmission from: %s' % fileName) + transmissionValues = utils.readTransmissionValues(fileName, folderPath) + for key in transmissionValues: + transmissionValues[key] = np.asarray(transmissionValues[key]) + transmissionValues['rangeMin'] = float(completedValues['rangeMin']) + transmissionValues['rangeMax'] = float(completedValues['rangeMax']) + transmissionValues['surfaceTemperature'] = float(completedValues['surfaceTemperature']) + transmissionValues['molList'] = completedValues['molList'] + transmissionValues['surfaceEffEmissivity'] = float(completedValues['surfaceEffEmissivity']), + transmissionValues['res'] = float(completedValues['res']) + transmissionValues['surfacePower'] = float(transmissionValues['surfacePower'][0]) + return transmissionValues + + +def processTransmissionBySingleLayer(folderPath, res=1): + + values = utils.readCompleteProfile(folderPath) + planet = Planet(values['name'], float(values['surfacePressure']), int(float(values['surfaceTemperature'])), + float(values['maxHeight']), + rangeMin=int(values['rangeMin']), rangeMax=int(values['rangeMax']), + initialThickness=int(float(values['initialDepth'])), + gravity=float(values['gravity']), res=int(float(values['res'])), surfaceEffEmissivity=float(values['surfaceEffEmissivity'])) + for mol in values['molList'].split(','): + planet.moleculeList.append(mol) + + xAxis = None + fileLength = utils.profileLength(folderPath) + heightList = [0] + # making a generic layer and molecules + layer = Layer(0, 0, 0, 0, 0) + + spectrumDict = {} + inputDict = {} + + for i in range(1, fileLength + 1): + layerProfile = utils.readPlanetProfile(folderPath, i, fileLength) + layer.depth = layerProfile['depth'] + layer.P = layerProfile['P'] + layer.T = layerProfile['T'] + layer.rangeMin = layerProfile['rangeMin'] + layer.rangeMax = layerProfile['rangeMax'] + layer.height = layerProfile['height'] + layer.name = layerProfile['name'] + layer.absorptionCoefficient = np.asarray(layerProfile['layer absCoef']) + layer.progressAbsCoef = True + + if xAxis is None: + xAxis = np.linspace(planet.rangeMin, planet.rangeMax, len(layer.absorptionCoefficient)) + spectrumDict['temperature'] = planet.surfaceTemperature, + spectrumDict['pressure'] = planet.surfacePressure, + spectrumDict['depth'] = 'surface', + spectrumDict['meanHeight'] = 0 + inputSpectrum = pyradPlanck.planckWavenumber(xAxis, planet.surfaceTemperature) * planet.effEmissivity + surfacePower = integrateSpectrum(inputSpectrum, pi,.01) + spectrumDict['layer transmission'] = reduceRes(inputSpectrum, finalRes=res) + spectrumDict['surfacePower'] = surfacePower + inputDict['layer'] = inputSpectrum + for molecule in planet.moleculeList: + spectrumDict['%s transmission' % molecule] = reduceRes(inputSpectrum, finalRes=res) + spectrumDict['%s concentration' % molecule] = layerProfile['%s concentration' % molecule] + spectrumDict['%s power' % molecule] = integrateSpectrum(inputSpectrum, pi, .01) + inputDict[molecule] = inputSpectrum + utils.writePlanetTransmission(folderPath, 0, spectrumDict, 'down', 0) + spectrumDict['temperature'] = layer.T, + spectrumDict['pressure'] = layer.P, + spectrumDict['depth'] = layer.depth, + spectrumDict['meanHeight'] = layer.meanHeight + inputSpectrum = inputDict['layer'] + transmittedSpectrum = layer.transmission(inputSpectrum) + spectrumDict.update({'layer transmission': reduceRes(transmittedSpectrum, finalRes=res), + 'layer effective emissivity': layer.effectiveEmissivity, + 'layer power': integrateSpectrum(transmittedSpectrum, pi, .01)}) + inputDict['layer'] = transmittedSpectrum + + for molecule in planet.moleculeList: + inputSpectrum = inputDict[molecule] + layer.absorptionCoefficient = np.asarray(layerProfile['%s absCoef' % molecule]) + transmittedSpectrum = layer.transmission(inputSpectrum) + spectrumDict.update({'%s transmission' % molecule: reduceRes(transmittedSpectrum), + '%s effective emissivity' % molecule: layer.effectiveEmissivity, + '%s power' % molecule: integrateSpectrum(transmittedSpectrum, pi, .01), + '%s concentration' % molecule: layerProfile['%s concentration' % molecule]}) + inputDict[molecule] = transmittedSpectrum + + utils.writePlanetTransmission(folderPath, layer.meanHeight, spectrumDict, 'down', i) + heightList.append(layer.meanHeight) + gc.collect() + + heightList.append(planet.maxHeight) + + # with transmission from surface upward processed, do the same in reverse to get the transmission toward the surface + # initial spectrum will be 2.7K for CMB + inputDict = {} + + inputSpectrum = pyradPlanck.planckWavenumber(xAxis, 2.7) + spectrumDict = {'layer transmission': reduceRes(inputSpectrum, finalRes=res)} + surfacePower = integrateSpectrum(inputSpectrum, pi, .01) + spectrumDict['surfacePower'] = surfacePower + inputDict['layer'] = inputSpectrum + for molecule in planet.moleculeList: + spectrumDict['%s transmission' % molecule] = reduceRes(inputSpectrum, finalRes=res) + inputDict[molecule] = inputSpectrum + utils.writePlanetTransmission(folderPath, planet.maxHeight, spectrumDict, 'up', 0) + + for i in range(1, fileLength + 1): + fileNumber = fileLength + 1 - i + layerProfile = utils.readPlanetProfile(folderPath, fileNumber, fileLength) + layer.depth = layerProfile['depth'] + layer.P = layerProfile['P'] + layer.T = layerProfile['T'] + layer.rangeMin = layerProfile['rangeMin'] + layer.rangeMax = layerProfile['rangeMax'] + layer.height = layerProfile['height'] + layer.name = layerProfile['name'] + layer.absorptionCoefficient = np.asarray(layerProfile['layer absCoef']) + layer.progressAbsCoef = True + inputSpectrum = inputDict['layer'] + transmittedSpectrum = layer.transmission(inputSpectrum) + spectrumDict.update({'layer transmission': reduceRes(transmittedSpectrum, finalRes=res), + 'layer effective emissivity': layer.effectiveEmissivity, + 'layer power': integrateSpectrum(transmittedSpectrum, pi, .01)}) + inputDict['layer'] = transmittedSpectrum + + for molecule in planet.moleculeList: + inputSpectrum = inputDict[molecule] + layer.absorptionCoefficient = np.asarray(layerProfile['%s absCoef' % molecule]) + transmittedSpectrum = layer.transmission(inputSpectrum) + spectrumDict.update({'%s transmission' % molecule: reduceRes(transmittedSpectrum), + '%s effective emissivity' % molecule: layer.effectiveEmissivity, + '%s power' % molecule: integrateSpectrum(transmittedSpectrum, pi, .01), + '%s concentration' % molecule: layerProfile['%s concentration' % molecule]}) + inputDict[molecule] = transmittedSpectrum + + utils.writePlanetTransmission(folderPath, layer.meanHeight, spectrumDict, 'up', i) + gc.collect() + + utils.profileWriteTransmissionComplete(folderPath, heightList) + return + + +def createCustomPlanet(name): + + initialParameters = utils.parseCustomProfile(name) + initialValues = initialParameters['initialValues'] + moleculeList = initialParameters['molecules'] + temperatureRuleList = initialParameters['temperatureRules'] + compositionRuleList = initialParameters['compositionRules'] + + planet = Planet(initialParameters['name'], initialValues['surfacePressure'], initialValues['surfaceTemperature'], + initialValues['maxHeight'], rangeMin=initialValues['rangeMin'], + rangeMax=initialValues['rangeMax'], initialThickness=initialValues['initialDepth'], + gravity=initialValues['gravity']) + + for molecule in moleculeList: + planet.addMolecule(molecule['name'], concentration=molecule['concentration']) + + for rule in temperatureRuleList: + planet.addLapseRate(rule['name'], rule['finalHeight'], rule['finalValue']) + + for rule in compositionRuleList: + initalLayer = planet.initialLayer + molecule = initalLayer.returnMolecule(rule['moleculeName']) + planet.addCompositionRate(rule['name'], rule['finalHeight'], rule['finalValue'], molecule) + return planet + + +def yesOrNo(promptText): + validInput = False + while not validInput: + userSelection = input(promptText) + if not userSelection: + pass + elif userSelection.lower()[0] == 'y': + return True + elif userSelection.lower()[0] == 'n': + return False + else: + print('Invalid choice.') + + +def smooth(y, box_pts): + box = np.ones(box_pts)/box_pts + y_smooth = np.convolve(y, box, mode='same') + return y_smooth + + +def linear(baseValue, baseHeight, rate, height): + newValue = baseValue + rate * (height - baseHeight) + return newValue + + +def integrateSpectrum(spectrum, unitAngle=pi, res=utils.BASE_RESOLUTION): + value = np.sum(np.nan_to_num(spectrum)) + value = value * unitAngle * res + + return value + + +def getCrossSection(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return obj.crossSection + + +def resetCrossSection(obj): + if not obj.progressCrossSection: + return + obj.crossSection = np.zeros(int((obj.rangeMax - obj.rangeMin) / utils.BASE_RESOLUTION)) + obj.progressCrossSection = False + for child in obj: + if not isinstance(child, Line): + resetCrossSection(child) + + +def resetData(obj): + # clears the existing line data from parent object down to isotope, and then reloads the data using getData + # use this if layer ranges get changed. Will also clear the cross section data of the obj. + for child in obj: + if isinstance(child, Isotope): + while len(child) > 0: + child.pop() + child.getData() + else: + resetData(child) + resetCrossSection(obj) + + +def getAbsCoef(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return obj.absCoef + + +def getTransmittance(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return obj.transmittance + + +def getOpticalDepth(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return -np.log(obj.transmittance) + + +def getAbsorbance(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return obj.absorbance + + +def getEmissivity(obj): + if not obj.progressCrossSection: + obj.createCrossSection() + return obj.emissivity + + +def getGlobalIsotope(ID, isotopeDepth): + globalIsoList = [] + for i in range(1, isotopeDepth + 1): + globalIsoList.append(HITRAN_GLOBAL_ISO[ID][i]) + return globalIsoList + + +def totalConcentration(layer): + total = 0 + for molecule in layer: + total += molecule.concentration + return total + + +def totalLineList(obj): + fullList = [] + if isinstance(obj, Isotope): + return obj.linelist() + for item in obj: + fullList += totalLineList(item) + return fullList + + +def convertLength(value, units): + if units == 'cm': + return value + elif units in ['m', 'meter']: + return value * 100 + elif units in ['ft', 'feet']: + return value * 30.48 + elif units in ['in', 'inch']: + return value * 2.54 + + +def convertPressure(value, units): + if units == 'mbar': + return value + elif units in ['atm', 'atmospheres', 'atmosphere']: + return value * 1013.25 + elif units in ['b', 'bar']: + return value * 1000 + elif units in ['pa', 'pascal', 'pascals']: + return value / 100 + + +def convertRange(value, units): + if units == 'cm-1': + return value + elif units in ['um', 'micrometers', 'micrometer']: + return 10000 / value + + +def convertTemperature(value, units): + if units[0].upper() == 'K': + return value + elif units[0].upper() == 'C': + return value + 273 + elif units[0].upper() == 'F': + return (value - 32) * 5 / 9 + 273 + + +def interpolateArray(hiResXAxis, loResXAxis, loResYValues): + hiResY = np.interp(hiResXAxis, loResXAxis, loResYValues) + return hiResY + + +class Line: + def __init__(self, wavenumber, intensity, einsteinA, airHalfWidth, + selfHalfWidth, lowerEnergy, tempExponent, pressureShift, parent): + self.isotope = parent + self.molecule = self.isotope.molecule + self.layer = self.molecule.layer + self.wavenumber = wavenumber + self.intensity = intensity + self.einsteinA = einsteinA + self.airHalfWidth = airHalfWidth + self.selfHalfWidth = selfHalfWidth + self.lowerEnergy = lowerEnergy + self.tempExponent = tempExponent + self.pressureShift = pressureShift + + + @property + def broadenedLine(self): + return self.wavenumber + self.pressureShift * self.layer.P / p0 + + @property + def lorentzHW(self): + return (float((1 - self.molecule.concentration) * self.airHalfWidth + self.molecule.concentration + * self.selfHalfWidth) * (self.layer.P / p0) * (t0 / self.layer.T) ** self.tempExponent) + + @property + def gaussianHW(self): + return self.broadenedLine * np.sqrt(2 * k * self.layer.T / self.isotope.molMass / c ** 2) + + +class Isotope(list): + def __init__(self, number, molecule): + super(Isotope, self).__init__(self) + if number in INERT_MOL_DATA: + self.globalIsoNumber = MOLECULE_ID[molecule.name] + self.shortName = molecule.name + self.name = 'Inert molecule %s' % molecule.name + self.molmass = INERT_MOL_DATA[self.globalIsoNumber]['mass'] + else: + params = utils.readMolParams(number) + self.globalIsoNumber = params[0] + self.shortName = params[1] + self.name = 'Isotope %s' % self.globalIsoNumber + self.molNum = params[2] + self.isoN = params[3] + self.abundance = params[4] + self.q296 = params[5] + self.gj = params[6] + self.molmass = params[7] + self.molecule = molecule + self.layer = self.molecule.layer + self.q = {} + self.crossSection = np.copy(self.layer.crossSection) + self.progressCrossSection = False + + def __del__(self): + for line in self: + line = None + + + @property + def P(self): + return self.layer.P + + @property + def molMass(self): + return self.molmass / 1000 / avo + + @property + def T(self): + return self.layer.T + + @property + def depth(self): + return self.layer.depth + + @property + def rangeMin(self): + return self.layer.rangeMin + + @property + def rangeMax(self): + return self.layer.rangeMax + + @property + def resolution(self): + return self.layer.resolution + + @property + def distanceFromCenter(self): + return self.layer.distanceFromCenter + + @property + def absCoef(self): + return self.crossSection * self.molecule.concentration * self.layer.P / 1E4 / k / self.layer.T + + @property + def transmittance(self): + return np.exp(-self.absCoef * self.layer.depth) + + @property + def emissivity(self): + return 1 - self.transmittance + + @property + def emittance(self): + return self.emissivity + + @property + def absorbance(self): + return np.log10(1 / self.transmittance) + + @property + def yAxis(self): + return np.copy(self.layer.yAxis) + + @property + def xAxis(self): + return np.copy(self.layer.xAxis) + + def getData(self, verbose=True): + if 'Inert' in self.name: + print('Inert molecule, no data.') + return + if verbose: + print('Getting data for %s, %s, isotope %s' % (self.layer.name, self.molecule.name, self.globalIsoNumber), end='\r', flush=True) + lineDict = utils.gatherData(self.globalIsoNumber, self.layer.effectiveRangeMin, self.layer.effectiveRangeMax) + self.q = utils.getQData(self.globalIsoNumber) + for line in lineDict: + if lineDict[line]['intensity'] > settings.lineIntensityCutoff: + self.append(Line(line, lineDict[line]['intensity'], lineDict[line]['einsteinA'], + lineDict[line]['airHalfWidth'], lineDict[line]['selfHalfWidth'], + lineDict[line]['lowerEnergy'], lineDict[line]['tempExponent'], + lineDict[line]['pressureShift'], self)) + + def createCrossSection(self): + molecule = self.molecule + layer = molecule.layer + progress = 0 + i = 1 + alertInterval = int(len(self) / 20) + crossSection = np.copy(self.yAxis) + trackGauss = 0 + trackLorentz = 0 + trackVoigt = 0 + if len(self) == 0: + self.progressCrossSection = True + return + for line in self: + if progress > i * alertInterval and len(self) > 50: + text = 'Progress %s: %s: <%s%s>' % (layer.name, molecule.name, '*' * i, '-' * (20 - i)) + print(text, end='\r', flush=True) + i += 1 + progress += 1 + xValues = np.arange(0, layer.distanceFromCenter, layer.resolution) + hwRatio = line.lorentzHW / line.gaussianHW + if hwRatio < .01: + rightCurve = ls.gaussianLineShape(line.gaussianHW, xValues) + trackGauss += 1 + elif hwRatio > 100: + rightCurve = ls.lorentzLineShape(line.lorentzHW, xValues) + trackLorentz += 1 + else: + rightCurve = ls.pseudoVoigtShape(line.gaussianHW, line.lorentzHW, xValues) + trackVoigt += 1 + intensity = pyradIntensity.intensityFactor(line.intensity, line.broadenedLine, + layer.T, line.lowerEnergy, self.q[layer.T], self.q296) + arrayIndex = int((line.wavenumber - layer.rangeMin) / layer.resolution) + arrayLength = len(crossSection) - 1 + if isBetween(arrayIndex, 0, arrayLength): + crossSection[arrayIndex] = crossSection[arrayIndex] + rightCurve[0] * intensity + for dx in range(1, len(rightCurve) - 1): + rightIndex = arrayIndex + dx + leftIndex = arrayIndex - dx + if isBetween(rightIndex, 0, arrayLength): + crossSection[rightIndex] += rightCurve[dx] * intensity + if isBetween(leftIndex, 0, arrayLength): + crossSection[leftIndex] += rightCurve[dx] * intensity + self.crossSection = interpolateArray(self.xAxis, + np.linspace(self.rangeMin, self.rangeMax, + (self.rangeMax - self.rangeMin) / self.resolution, + endpoint=True), + crossSection) + self.progressCrossSection = True + + def createLineSurvey(self): + print('Creating line survey for %s' % self.name) + molecule = self.molecule + layer = molecule.layer + progress = 0 + i = 1 + alertInterval = int(len(self) / 20) + lineSurvey = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + for line in self: + if progress > i * alertInterval: + print('Progress for %s <%s%s>' % (molecule.name, '*' * i, '-' * (20 - i)), end='\r', flush=True) + i += 1 + progress += 1 + intensity = line.intensity + if intensity > settings.lineIntensityCutoff: + arrayIndex = int((line.wavenumber - layer.rangeMin) / layer.resolution) + arrayLength = len(lineSurvey) - 1 + if isBetween(arrayIndex, 0, arrayLength): + lineSurvey[arrayIndex] = lineSurvey[arrayIndex] + intensity + return lineSurvey + + def linelist(self): + lines = [] + for line in self: + lines.append(line) + return lines + + def planck(self, temperature): + return self.layer.planck(temperature) + + def transmission(self, surfaceSpectrum): + transmitted = self.transmittance * surfaceSpectrum + emitted = self.emittance * self.planck(self.T) + return transmitted + emitted + + def returnCopy(self): + return self.linelist() + + @property + def lineSurvey(self): + return self.createLineSurvey() + + +class Molecule(list): + def __init__(self, shortNameOrMolNum, layer, isotopeDepth=1, **abundance): + super(Molecule, self).__init__(self) + self.layer = layer + self.crossSection = np.copy(layer.crossSection) + self.isotopeDepth = isotopeDepth + self.concText = '' + self.concentration = 0 + try: + int(shortNameOrMolNum) + self.ID = int(shortNameOrMolNum) + self.name = False + except ValueError: + self.name = shortNameOrMolNum + self.ID = MOLECULE_ID[self.name] + for isotope in getGlobalIsotope(self.ID, isotopeDepth): + isoClass = Isotope(isotope, self) + self.append(isoClass) + if not self.name: + self.name = isoClass.shortName + self.progressCrossSection = False + for key in abundance: + if key == 'ppm': + self.setPPM(abundance[key]) + elif key == 'ppb': + self.setPPB(abundance[key]) + elif key == 'percentage' or key == 'perc' or key == '%': + self.setPercentage(abundance[key]) + elif key == 'concentration': + self.setConcentration(abundance[key]) + else: + print('Invalid concentration type. Use ppm, ppb, percentage, or concentration.') + + def __str__(self): + return '%s: %s' % (self.name, self.concText) + + def __del__(self): + for iso in self: + iso = None + + def __bool__(self): + return True + + def returnCopy(self): + valueUnit = self.concText.split() + tempDict = {valueUnit[1]: float(valueUnit[0])} + newMolecule = Molecule(self.name, self.layer, isotopeDepth=int(self.isotopeDepth), **tempDict) + newMolecule.getData(verbose=False) + return newMolecule + + def setPercentage(self, percentage): + self.concentration = percentage / 100 + self.concText = '%s %%' % percentage + resetCrossSection(self) + + def setPPM(self, ppm): + self.concentration = ppm * 10**-6 + self.concText = '%s ppm' % ppm + resetCrossSection(self) + + def setPPB(self, ppb): + self.concentration = ppb * 10**-8 + self.concText = '%s ppb' % ppb + resetCrossSection(self) + + def setConcentration(self, concentration): + self.setPPM(concentration * 1E6) + resetCrossSection(self) + + def getData(self, verbose=True): + for isotope in self: + isotope.getData(verbose) + + def createCrossSection(self): + tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + for isotope in self: + tempAxis += getCrossSection(isotope) + self.progressCrossSection = True + self.crossSection = tempAxis + + def planck(self, temperature): + return self.layer.planck(temperature) + + def transmission(self, surfaceSpectrum): + transmitted = self.transmittance * surfaceSpectrum + emitted = self.emittance * self.planck(self.T) + return transmitted + emitted + + @property + def absCoef(self): + return self.crossSection * self.concentration * self.layer.P / 1E4 / k / self.layer.T + + @property + def transmittance(self): + return np.exp(-self.absCoef * self.layer.depth) + + @property + def lineSurvey(self): + tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + for isotope in self: + tempAxis += isotope.lineSurvey + return tempAxis + + @property + def absorbance(self): + return np.log10(1 / self.transmittance) + + @property + def emissivity(self): + return 1 - self.transmittance + + @property + def emittance(self): + return self.emissivity + + @property + def effectiveEmissivity(self): + return np.average(self.emissivity) + + @property + def P(self): + return self.layer.P + + @property + def yAxis(self): + return np.copy(self.layer.yAxis) + + @property + def xAxis(self): + return np.copy(self.layer.xAxis) + + @property + def T(self): + return self.layer.T + + @property + def depth(self): + return self.layer.depth + + @property + def rangeMin(self): + return self.layer.rangeMin + + @property + def rangeMax(self): + return self.layer.rangeMax + + @property + def resolution(self): + return self.layer.resolution + + @property + def distanceFromCenter(self): + return self.layer.distanceFromCenter + + @property + def molarMass(self): + return self[0].molmass + + +class Layer(list): + hasAtmosphere = False + + def __init__(self, depth, T, P, rangeMin, rangeMax, height=0.0, atmosphere=None, name='', dynamicResolution=True): + super(Layer, self).__init__(self) + self.rangeMin = rangeMin + self.rangeMax = rangeMax + self.T = T + self.P = P + self.depth = depth + self.distanceFromCenter = self.P / 1013.25 * 5 + self.effectiveRangeMin = max(self.rangeMin - self.distanceFromCenter, 0) + self.effectiveRangeMax = self.rangeMax + self.distanceFromCenter + self.dynamicResolution = dynamicResolution + self.surfaceSpectrum = None + self.height = height + if not dynamicResolution: + self.resolution = utils.BASE_RESOLUTION + else: + self.resolution = max(self.P / 1013.25 * .01, utils.BASE_RESOLUTION) + if not atmosphere: + if not Layer.hasAtmosphere: + self.atmosphere = Atmosphere('generic') + Layer.hasAtmosphere = self.atmosphere + else: + self.atmosphere = Layer.hasAtmosphere + else: + self.atmosphere = atmosphere + self.hasAtmosphere = atmosphere + self.crossSection = np.zeros(int((rangeMax - rangeMin) / utils.BASE_RESOLUTION)) + self.absorptionCoefficient = np.zeros(int((rangeMax - rangeMin) / utils.BASE_RESOLUTION)) + self.progressCrossSection = False + self.progressAbsCoef = False + if not name: + name = '%s' % self.atmosphere.nextLayerName() + self.atmosphere.append(self) + self.name = name + + def __str__(self): + return '%s; %s' % (self.name, '; '.join(str(m) for m in self)) + + def __bool__(self): + return True + + def __del__(self): + for molecule in self: + molecule.__del__() + + def createCrossSection(self): + tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + for molecule in self: + tempAxis += getCrossSection(molecule) + self.progressCrossSection = True + self.crossSection = tempAxis + + def returnMolecule(self, name): + for m in self: + if m.name == name: + return m + return False + + @property + def meanHeight(self): + return self.height + .5 * self.depth + + @property + def lineSurvey(self): + tempAxis = np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + for molecule in self: + tempAxis += molecule.lineSurvey + return tempAxis + + @property + def yAxis(self): + return np.zeros(int((self.rangeMax - self.rangeMin) / self.resolution)) + + @property + def xAxis(self): + return np.linspace(self.rangeMin, self.rangeMax, len(self.absorptionCoefficient), + endpoint=True) + + @property + def absCoef(self): + if not self.progressAbsCoef: + for molecule in self: + self.absorptionCoefficient += getAbsCoef(molecule) + self.progressAbsCoef = True + return self.absorptionCoefficient + + @property + def transmittance(self): + return np.exp(-self.absCoef * self.depth) + + @property + def absorbance(self): + return np.log10(1 / self.transmittance) + + @property + def title(self): + return '%s\nP: %smBars; T: %sK; depth: %scm' % (str(self), self.P, self.T, self.depth) + + @property + def emissivity(self): + return 1 - self.transmittance + + @property + def emittance(self): + return self.emissivity + + @property + def effectiveEmissivity(self): + return np.average(self.emissivity) + + @property + def normalizedEmissivity(self): + normalized = np.array([]) + emissivity = self.emissivity + nonzeroIndex = np.nonzero(emissivity) + if np.size(nonzeroIndex) == 0: + return 0 + for i in nonzeroIndex: + normalized = np.append(normalized, emissivity[i]) + return np.average(normalized) + + @property + def molarMass(self): + mass = 0 + for mol in self: + if mol.name == 'h2o': + pass + else: + mass += mol.molarMass * mol.concentration + return mass + + @property + def density(self): + d = self.P * 100 / self.T / self.specGasConstant + return d + + @property + def mass(self): + return self.density * self.depth / 100 + + @property + def specGasConstant(self): + con = R * 1000 / self.molarMass + return con + + @property + def temperatureAtHeight(self): + return int(self.atmosphere.temperatureAtHeight(self.meanHeight)) + + @property + def pressureAtHeight(self): + return self.atmosphere.pressureAtHeight(self.meanHeight) + + @property + def densityAtHeight(self): + return self.atmosphere.densityAtHeight(self.temperatureAtHeight, self.specGasConstant) + + def changeRange(self, rangeMin, rangeMax): + self.rangeMin = rangeMin + self.rangeMax = rangeMax + self.effectiveRangeMax = self.rangeMax + self.distanceFromCenter + self.effectiveRangeMin = max(self.rangeMin - self.distanceFromCenter, 0) + resetData(self) + + def changeTemperature(self, temperature): + self.T = temperature + resetCrossSection(self) + + def changePressure(self, pressure): + self.P = pressure + self.distanceFromCenter = self.P / 1013.25 * 5 + if not self.dynamicResolution: + self.resolution = utils.BASE_RESOLUTION + else: + self.resolution = max(self.P / 1013.25 * .01, utils.BASE_RESOLUTION) + resetData(self) + + def changeDepth(self, depth): + self.depth = depth + + def addMolecule(self, name, isotopeDepth=1, **abundance): + molecule = Molecule(name, self, isotopeDepth, **abundance) + self.append(molecule) + if totalConcentration(self) > 1: + print('**Warning : Concentrations exceed 1: total=%s' % totalConcentration(self)) + for molecule in self: + print('concentration %s: %s' % (molecule.name, molecule.concentration)) + exit(1) + molecule.getData() + return molecule + + def returnCopy(self, name=None): + if not name: + name = self.atmosphere.nextLayerName() + newCopy = Layer(self.depth, self.T, self.P, self.rangeMin, self.rangeMax, height=self.height, + atmosphere=self.atmosphere, name=name, dynamicResolution=self.dynamicResolution) + for molecule in self: + newCopy.addMolecule(molecule.name, molecule.isotopeDepth, concentration=molecule.concentration) + print('%s copied to %s' % (self.name, newCopy.name)) + return newCopy + + def returnMoleculeObjects(self): + moleculeList = [] + for m in self: + moleculeList.append(m) + return moleculeList + + def returnMoleculeNameList(self): + nameList = [] + for m in self: + nameList.append(m.name) + return nameList + + def planck(self, temperature): + return pyradPlanck.planckWavenumber(self.xAxis, temperature) + + def transmission(self, surfaceSpectrum): + transmitted = self.transmittance * surfaceSpectrum + emitted = self.emittance * self.planck(self.T) + return transmitted + emitted + + +class Atmosphere(list): + def __init__(self, name, rangeMin=0, rangeMax=0, planet=None): + super().__init__(self) + self.name = name + self.rangeMin = rangeMin + self.rangeMax = rangeMax + self.planet = planet + + def __str__(self): + return self.name + + def __bool__(self): + return True + + def __del__(self): + for layer in self: + layer.__del__() + + def addLayer(self, depth, T, P, rangeMin, rangeMax, name=None, dynamicResolution=True, height=0.0): + if not name: + name = self.nextLayerName() + newLayer = Layer(depth, T, P, rangeMin, rangeMax, atmosphere=self, name=name, + dynamicResolution=dynamicResolution, height=height) + return newLayer + + def nextLayerName(self): + return 'Layer %s' % (len(self) + 1) + + def returnLayerNames(self): + tempList = [] + for layer in self: + tempList.append(layer.name) + return tempList + + def returnLayerObjects(self): + if len(self) == 0: + return False + tempList = [] + for layer in self: + tempList.append(layer) + return tempList + + def temperatureAtHeight(self, height): + ruleList = self.planet.returnApplicableRules(height, 'temperature') + if len(ruleList) > 1: + print('Multiple rules found for height %s: %s' % (height, ruleList)) + rule = ruleList[0] + temperature = rule.rateFunction(rule.baseValue, rule.baseHeight, rule.rate, height) + return temperature + + def pressureAtHeight(self, height): + ruleList = self.planet.returnApplicableRules(height, 'temperature') + if len(ruleList) > 1: + print('Multiple rules found for height %s: %s' % (height, ruleList)) + rule = ruleList[0] + temperature = self.temperatureAtHeight(height) + pressurePa = rule.basePressure * 100 + rateInMeters = rule.rate * 100 + if rule.rate != 0: + pressure = pressurePa * (rule.baseValue / temperature) ** \ + (self.planet.gravity * self.planet.molarMass / R / rateInMeters) + else: + changeInHeightMeters = (height - rule.baseHeight) / 100 + pressure = pressurePa * np.exp(-self.planet.gravity * self.planet.molarMass * changeInHeightMeters / R / rule.baseValue) + return pressure / 100 + + def compositionAtHeight(self, height, molecule): + ruleList = self.planet.returnApplicableRules(height, 'composition') + if not ruleList: + return molecule.concentration + for rule in ruleList: + if rule.molecule.name == molecule.name: + concentration = rule.rateFunction(rule.baseValue, rule.baseHeight, rule.rate, height) + return concentration + return molecule.concentration + + def densityAtHeight(self, height): + gasConstant = self.planet.specGasConstant + temperature = self.temperatureAtHeight(height) + pressure = self.pressureAtHeight(height) + density = pressure * 100 / gasConstant / temperature + return density + + def moleculesAtHeight(self, height): + density = self.densityAtHeight(height) + return density / self.planet.molarMass / 1000 * avo + + +class Planet: + def __init__(self, name, pressure, temperature, maxHeight, surfaceEffEmissivity=.971, + gravity=9.80665, rangeMin=0, rangeMax=2000, initialThickness=100, res=1): + self.name = name + self.gravity = gravity + self.maxHeight = maxHeight * 100000 + self.effEmissivity = surfaceEffEmissivity + self.surfacePressure = pressure + self.surfaceTemperature = temperature + self.atmosphereRules = [] + self.heightList = [] + self.depthList = [] + self.moleculeList = [] + self.rangeMin = rangeMin + self.rangeMax = rangeMax + self.setting = settings.setting + self.atmosphere = Atmosphere("%s's atmosphere" % self.name, planet=self) + self.res = res + self.initialLayer = \ + self.atmosphere.addLayer(initialThickness * 100, temperature, pressure, rangeMin, rangeMax, + name='initial layer', height=0) + self.progressProfileLoaded = False + + def __del__(self): + self.atmosphere.__del__() + + def clearData(self): + self.__del__() + + def addLapseRate(self, name, finalHeight, finalValue, rateFunction=linear): + self.atmosphereRules.append(AtmosphereRule(name, finalHeight * 100000, + finalValue, 'temperature', self, rateFunction=rateFunction)) + + def addCompositionRate(self, name, finalHeight, finalValue, molecule, rateFunction=linear): + self.atmosphereRules.append(AtmosphereRule(name, finalHeight * 100000, finalValue, 'composition', self, + molecule=molecule, rateFunction=rateFunction)) + + def returnApplicableRules(self, height, ruleType): + ruleList = [] + for rule in self.atmosphereRules: + if rule.isInRange(height, ruleType): + ruleList.append(rule) + if not ruleList: + return False + return ruleList + + def returnAllRulesOfType(self, ruleType): + ruleList = [] + for rule in self.atmosphereRules: + if rule.ruleType == ruleType: + ruleList.append(rule) + return ruleList + + def temperatureAtHeight(self, height): + return self.atmosphere.temperatureAtHeight(height) + + def pressureAtHeight(self, height): + return self.atmosphere.pressureAtHeight(height) + + def densityAtHeight(self, height): + return self.atmosphere.densityAtHeight(height) + + def compositionAtHeight(self, height, molecule): + return self.atmosphere.compositionAtHeight(height, molecule) + + def addMolecule(self, name, isotopeDepth=1, **abundance): + molecule = self.initialLayer.addMolecule(name, isotopeDepth, **abundance) + self.moleculeList = self.initialLayer.returnMoleculeNameList() + return molecule + + def sliceAtm(self, verify=True): + acceptSetup = False + layer = self.initialLayer + initialTemp = layer.T + initialPressure = layer.P + initialHeight = layer.height + initialDepth = layer.depth + while not acceptSetup: + mass = self.initialLayer.mass + print('%s, p %s, T %s, depth %s, height %s' % (layer.name, initialPressure, initialTemp, initialDepth, initialHeight)) + self.heightList = [layer.height] + tempList = [layer.T] + pressureList = [layer.P] + self.depthList = [layer.depth] + while layer.height + layer.depth < self.maxHeight: + print('%s: K: %s, mBar: %s, height: %skm, depth: %skm' % ( + 'Layer %s' % len(self.heightList), int(layer.T), round(layer.P, 2), round(layer.height / 100000, 2), round(layer.depth / 100000, 2))) + newHeight = self.heightList[-1] + self.depthList[-1] + tempList.append(self.temperatureAtHeight(newHeight)) + pressureList.append(self.pressureAtHeight(newHeight)) + layer.P = pressureList[-1] + layer.T = tempList[-1] + newDepth = (mass / layer.density * 100) + if newHeight + newDepth > self.maxHeight: + newDepth = self.maxHeight - newHeight + self.heightList.append(newHeight) + self.depthList.append(newDepth) + print('%s: K: %s, mBar: %s, height: %skm, depth: %skm' % ( + 'Layer %s' % len(self.heightList), int(layer.T), round(layer.P, 2), + round(newHeight / 100000, 2), round(newDepth / 100000, 2))) + break + else: + self.heightList.append(newHeight) + self.depthList.append(newDepth) + layer.height = newHeight + layer.depth = newDepth + print('Total # of layers: %s' % len(self.heightList)) + print('Total # of absorption lines per layer: %s' % len(totalLineList(layer))) + if verify: + if yesOrNo('Accept the current slicing (y/n): '): + acceptSetup = True + else: + validNumber = False + while not validNumber: + print('Enter the new initial depth. Larger depth will decrease number of layers, smaller will increase') + userNumber = input('Current depth is %s:' % utils.limeText('%sm' % (int(self.depthList[0]) / 100))) + try: + newDepth = float(userNumber) + self.initialLayer.depth = newDepth * 100 + self.initialLayer.P = initialPressure + self.initialLayer.T = initialTemp + self.initialLayer.height = initialHeight + validNumber = True + except ValueError: + print('Invalid number.') + else: + acceptSetup = True + return + + def processLayers(self, verify=True, moleculeSpecific=False, res=1): + if utils.profileProgress(self.folderPath): + self.sliceAtm(verify=False) + if not self.heightList: + self.sliceAtm(verify=verify) + layer = self.initialLayer + startPoint, timeStart = utils.profileProgress(self.folderPath) + i = startPoint + 1 + totalProcessTime = timeStart + for height, depth in zip(self.heightList[startPoint:], self.depthList[startPoint:]): + layerProcessTimeStart = time.time() + layer.name = 'layer %s_%s' % (i, len(self.heightList)) + layer.height = height + layer.depth = depth + layer.T = int(self.temperatureAtHeight(layer.meanHeight)) + layer.P = self.pressureAtHeight(layer.meanHeight) + for molecule in layer: + molecule.concentration = self.compositionAtHeight(layer.meanHeight, molecule) + layer.createCrossSection() + processTime = time.time() - layerProcessTimeStart + utils.writePlanetProfile(self.folderPath, layer, processTime, self.moleculeList, moleculeSpecific=moleculeSpecific) + totalProcessTime += processTime + utils.profileWriteProgress(self.folderPath, i, len(self.heightList), totalProcessTime, + moleculeSpecific, self.moleculeList, res) + resetCrossSection(layer) + layer.absorptionCoefficient = np.zeros(len(layer.crossSection)) + layer.progressAbsCoef = False + i += 1 + utils.profileWriteComplete(self, i - 1, len(self.heightList), totalProcessTime, res, moleculeSpecific=moleculeSpecific) + return + + def loadProfile(self, verify=True, moleculeSpecific=False): + if not utils.profileComplete(self.folderPath): + self.processLayers(verify=verify, moleculeSpecific=moleculeSpecific) + loadEmptyPlanet(self.folderPath, self, verify=verify) + + def processTransmission(self, height, direction='down', verify=True, moleculeSpecific=False): + if not self.progressProfileLoaded: + self.loadProfile(verify=verify, moleculeSpecific=moleculeSpecific) + height = height * 100000 + print('Processing atmosphere spectrum from %skm looking %s...' % (height / 100000, direction)) + if direction == 'down': + xAxis = np.linspace(self.rangeMin, self.rangeMax, len(self.atmosphere[0].absCoef)) + surfaceSpectrum = pyradPlanck.planckWavenumber(xAxis, self.surfaceTemperature) * self.effEmissivity + for layer in self.atmosphere: + if layer.meanHeight < height: + surfaceSpectrum = layer.transmission(surfaceSpectrum) + print('Processing %s...' % layer.name, end='\r', flush=True) + elif direction == 'up': + surfaceSpectrum = pyradPlanck.planckWavenumber(self.initialLayer.xAxis, 3) + for layer in reversed(self.atmosphere): + if layer.meanHeight > height: + surfaceSpectrum = layer.transmission(surfaceSpectrum) + print('Processing %s...' % layer.name, end='\r', flush=True) + print('') + return surfaceSpectrum + + @property + def yAxis(self): + return np.zeros(int((self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION)) + + @property + def folderPath(self): + return '%s %s' % (self.name, self.setting) + + @property + def surfacePower(self): + return integrateSpectrum(pyradPlanck.planckWavenumber(self.xAxis, self.surfaceTemperature)) * self.effEmissivity + + @property + def molarMass(self): + return self.initialLayer.molarMass / 1000 + + @property + def specGasConstant(self): + return R * 1000 / self.molarMass + + @property + def xAxis(self): + return np.linspace(self.rangeMin, self.rangeMax, (self.rangeMax - self.rangeMin) / utils.BASE_RESOLUTION, + endpoint=True) + + @property + def atmChangePoints(self): + changePointList = [] + for rule in self.atmosphereRules: + changePointList.append(rule.finalHeight) + return sorted(changePointList) + + @property + def transmission(self): + return self.processTransmission(self.maxHeight) + + @property + def moleculesAtHeight(self, height): + return self.atmosphere.moleculesAtHeight(height) + + +class AtmosphereRule: + def __init__(self, name, finalHeight, finalValue, ruleType, planetClass, molecule=None, rateFunction=linear): + self.name = name + self.ruleType = ruleType + self.parent = planetClass + self.baseHeight, self.baseValue, self.basePressure = self.setBaseValues(self.ruleType, molecule) + self.finalHeight = finalHeight + self.finalValue = finalValue + if rateFunction == linear: + self.rate = (self.finalValue - self.baseValue) / (self.finalHeight - self.baseHeight) + self.molecule = molecule + self.rateFunction = rateFunction + + def isInRange(self, height, ruleType): + return self.baseHeight < height <= self.finalHeight and self.ruleType == ruleType + + def baseHeightTemperatureRule(self): + height = 0 + temperature = self.parent.surfaceTemperature + pressure = self.parent.surfacePressure + tempRules = self.parent.returnAllRulesOfType(self.ruleType) + for rule in tempRules: + if rule.finalHeight > height: + height = rule.finalHeight + temperature = rule.finalValue + pressure = self.parent.pressureAtHeight(height) + return height, temperature, pressure + + def baseHeightCompositionRule(self, molecule): + height = 0 + pressure = self.parent.surfacePressure + concentration = molecule.concentration + compRules = self.parent.returnAllRulesOfType(self.ruleType) + for rule in compRules: + if rule.finalHeight > height and rule.molecule == molecule: + height = rule.finalHeight + concentration = rule.finalValue + pressure = self.parent.pressureAtHeight(height) + return height, concentration, pressure + + def setBaseValues(self, ruleType, molecule): + if ruleType == 'temperature': + return self.baseHeightTemperatureRule() + elif ruleType == 'composition': + return self.baseHeightCompositionRule(molecule) + + +def returnPlot(obj, propertyToPlot): + if propertyToPlot == "transmittance": + yAxis = getTransmittance(obj), 1 + elif propertyToPlot == 'absorption coefficient': + yAxis = getAbsCoef(obj), 0 + elif propertyToPlot == 'cross section': + yAxis = getCrossSection(obj), 0 + elif propertyToPlot == 'absorbance': + yAxis = getAbsorbance(obj), 0 + elif propertyToPlot == 'optical depth': + yAxis = getOpticalDepth(obj), 0 + elif propertyToPlot == 'line survey': + yAxis = obj.lineSurvey, 0 + else: + return False + return yAxis + + +def isBetween(test, minValue, maxValue): + if test >= minValue: + if test <= maxValue: + return True + return False + + +def plot(propertyToPlot, title, plotList, fill=False): + plt.figure(figsize=(10, 6), dpi=80) + plt.subplot(111, facecolor=theme.faceColor) + plt.xlabel('wavenumber cm-1') + plt.margins(0.1) + plt.subplots_adjust(left=.07, bottom=.08, right=.97, top=.90) + plt.ylabel(propertyToPlot) + # plt.text(650, .5, '%s' % settings.userName, verticalalignment='bottom', horizontalalignment='right', color=theme.textColor, fontsize=8) + if propertyToPlot == 'line survey': + plt.yscale('log') + plt.grid(theme.gridList[0], linewidth=.5, linestyle=':') + plt.title('%s' % title) + handles = [] + linewidth = .7 + alpha = .7 + for singlePlot, color in zip(plotList, theme.colorList): + yAxis, fillAxis = returnPlot(singlePlot, propertyToPlot) + fig, = plt.plot(singlePlot.xAxis, yAxis, linewidth=linewidth, alpha=alpha, color=color, + label='%s' % singlePlot.name) + handles.append(fig) + plt.fill_between(singlePlot.xAxis, fillAxis, yAxis, color=color, alpha=.3 * fill) + linewidth = .7 + alpha = .5 + credit = 'PyRad v%s\n%s' % (utils.VERSION, settings.userName) + handles.append(mpatches.Patch(color='none', label=credit)) + legend = plt.legend(handles=handles, frameon=False, loc=4, ncol=4) + text = legend.get_texts() + plt.setp(text, color=theme.textColor) + plt.show() + + +def plotSpectrum(layer=None, title=None, rangeMin=None, rangeMax=None, objList=None, surfaceSpectrum=None, + planckTemperatureList=None, planckType='wavenumber'): + plt.figure(figsize=(10, 6), dpi=80) + plt.subplot(111, facecolor=theme.faceColor) + plt.margins(0.01) + plt.subplots_adjust(left=.07, bottom=.08, right=.97, top=.90) + plt.grid(theme.gridList[0], linewidth=.5, linestyle=':') + if layer: + rangeMin = layer.rangeMin + rangeMax = layer.rangeMax + title = layer.title + if planckType == 'wavenumber': + plt.xlabel('wavenumber cm-1') + plt.ylabel('Radiance Wm-2sr-1(cm-1)-1') + planckFunction = pyradPlanck.planckWavenumber + xAxis = np.linspace(rangeMin, rangeMax, (rangeMax - rangeMin) / utils.BASE_RESOLUTION) + elif planckType == 'Hz': + plt.xlabel('Hertz') + plt.ylabel('Radiance Wm-2sr-1Hz-1') + planckFunction = pyradPlanck.planckHz + xAxis = np.linspace(rangeMin, rangeMax, 1000) + else: + plt.xlabel('wavelength um') + plt.ylabel('Radiance Wm-2sr-1um-1') + planckFunction = pyradPlanck.planckWavelength + xAxis = np.linspace(rangeMin, rangeMax, (rangeMax - rangeMin) / utils.BASE_RESOLUTION) + plt.title('%s' % title) + handles = [] + if not rangeMax: + xAxis = layer.xAxis + for temperature, color in zip(planckTemperatureList, theme.colorList[3:]): + yAxis = planckFunction(xAxis, float(temperature)) + fig, = plt.plot(xAxis, yAxis, linewidth=.75, color=color, + label='%sK : %sWm-2' % + (temperature, round(integrateSpectrum(yAxis, res=(rangeMax - rangeMin) / len(yAxis)), 2))) + handles.append(fig) + if objList: + alpha = 1 + linewidth = 1 + for obj, color in zip(objList, theme.colorList): + yAxis = obj.transmission(surfaceSpectrum) + fig, = plt.plot(layer.xAxis, yAxis, linewidth=linewidth, + alpha=alpha, color=color, + label='%s : %sWm-2' % (obj.name, round(integrateSpectrum(yAxis, pi), 2))) + handles.append(fig) + alpha = 1 + linewidth = 1 + credit = 'PyRad v%s\n%s' % (utils.VERSION, settings.userName) + handles.append(mpatches.Patch(color='none', label=credit)) + legend = plt.legend(handles=handles, frameon=False, loc=4, ncol=4) + text = legend.get_texts() + plt.setp(text, color=theme.textColor) + plt.show() + + +def plotPlanetSpectrum(planets, height=None, direction='down', temperatureList=(290, 260, 230, 200), verify=True, integrateRange=[], res=1): + linewidth = 1 + plt.figure(figsize=(10, 6), dpi=80) + plt.subplot(111, facecolor=theme.faceColor) + plt.margins(x=0.01, y=.2) + plt.subplots_adjust(left=.07, bottom=.08, right=.97, top=.90) + plt.ylabel('Radiance Wm-2sr-1(cm-1)-1') + plt.grid(theme.gridList[0], linewidth=.5, linestyle=':') + handles = [] + heightFlag = True + + if height is None: + heightFlag = False + if not heightFlag and direction == 'down': + height = 9999999999999999999 + elif not heightFlag and direction == 'up': + height = 0 + transmissionValues = readTransmissionFromFile(height, planets[0], direction=direction) + totalY = transmissionValues['layer transmission'] + xAxis = np.linspace(transmissionValues['rangeMin'], transmissionValues['rangeMax'], len(totalY)) + + for temperature, color in zip(temperatureList, theme.colorList[1:]): + yAxis = pyradPlanck.planckWavenumber(xAxis, float(temperature)) + fig, = plt.plot(xAxis, yAxis, linewidth=1, color=color, linestyle=':', label='%sK : %sWm-2' % (temperature, round(integrateSpectrum(yAxis, pi, res=res), 2))) + handles.append(fig) + + powerSpectrum = round(integrateSpectrum(totalY, pi, res=res), 2) + effTemp = int(stefanB(powerSpectrum)) + fig, = plt.plot(xAxis, totalY, linewidth=linewidth, color=theme.colorList[0], label='%s : %sWm-2, eff : %sK' % (planets[0], powerSpectrum, effTemp)) + handles.append(fig) + + for planet, color in zip(planets[1:], theme.colorList[1:]): + if not heightFlag and direction == 'down': + height = 9999999999999999999 + elif not heightFlag and direction == 'up': + height = 0 + transmissionValues = readTransmissionFromFile(height, planet, direction) + totalY = transmissionValues['layer transmission'] + powerSpectrum = round(integrateSpectrum(totalY, pi, res=res), 2) + effTemp = int(stefanB(powerSpectrum)) + fig, = plt.plot(xAxis, totalY, linewidth=linewidth, color=color, label='%s : %sWm-2, eff : %sK' % (planet, powerSpectrum, effTemp)) + handles.append(fig) + credit = 'PyRad v%s\n%s' % (utils.VERSION, settings.userName) + handles.append(mpatches.Patch(color='none', label=credit)) + legend = plt.legend(handles=handles, frameon=False, loc=4, ncol=4) + text = legend.get_texts() + plt.setp(text, color=theme.textColor) + plt.show() + + +def plotPlanetAndComponents(planet, height=None, direction='down', temperatureList=(300, 270, 240, 210, 180), verify=True, res=1): + linewidth = 1 + plt.figure(figsize=(10, 6), dpi=80) + plt.subplot(111, facecolor=theme.faceColor) + plt.margins(x=0.01, y=.2) + plt.subplots_adjust(left=.05, bottom=.05, right=.97, top=.95) + plt.grid(theme.gridList[0], linewidth=.5, linestyle=':') + plt.ylabel('radiance Wm-2sr-1(cm-1)-1') + plt.xlabel('wavenumber cm-1') + handles = [] + heightFlag = True + if height is None: + heightFlag = False + if not heightFlag and direction == 'down': + height = 9999999999999999999 + elif not heightFlag and direction == 'up': + height = 0 + transmittanceValues = readTransmissionFromFile(height, planet, direction=direction) + yTotal = transmittanceValues['layer transmission'] + xAxis = np.arange(transmittanceValues['rangeMin'], transmittanceValues['rangeMax'], transmittanceValues['res']) + for temperature, color in zip(temperatureList, theme.colorList[1:]): + yAxis = pyradPlanck.planckWavenumber(xAxis, float(temperature)) + fig, = plt.plot(xAxis, yAxis, linewidth=linewidth / 2, color=color, + linestyle='--', label='%sK : %sWm-2' % + (temperature, + int(integrateSpectrum(yAxis, pi, res=res)))) + handles.append(fig) + + surfacePower = transmittanceValues['surfacePower'] + input() + print(surfacePower) + powerSpectrum = integrateSpectrum(yTotal, pi, res=res) + plt.title('Surface temp: %sK Surface flux: %sWm-2 Effect temp: %sK' + % (transmittanceValues['surfaceTemperature'], round(surfacePower, 2), round(stefanB(powerSpectrum), 2))) + + + fig, = plt.plot(xAxis, yTotal, linewidth=linewidth, color=theme.backingColor, + label='net flux: %sWm-2' % round(powerSpectrum,2)) + handles.append(fig) + moleculeList = transmittanceValues['molList'].split(',') + for molecule, color in zip(moleculeList, theme.colorList): + yAxis = transmittanceValues[molecule + ' transmission'] + tempPowerSpectrum = integrateSpectrum(yAxis, pi, res=res) + print('%s - %s' % (molecule, tempPowerSpectrum)) + effect = surfacePower - tempPowerSpectrum + + fig, = plt.plot(xAxis, yAxis, linewidth=linewidth, color=color, alpha=.6, + label='%s effect: %sWm-2' % (molecule, round(effect,2))) + handles.append(fig) + credit = 'PyRad v%s\n%s' % (utils.VERSION, settings.userName) + handles.append(mpatches.Patch(color='none', label=credit)) + legend = plt.legend(handles=handles, frameon=False, loc=4, ncol=4) + text = legend.get_texts() + plt.setp(text, color=theme.textColor) + plt.show() + return + + +HITRAN_GLOBAL_ISO = {1: {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 129}, + 2: {1: 7, 2: 8, 3: 9, 4: 10, 5: 11, 6: 12, 7: 13, 8: 14, 9: 121, 10: 15, 11: 120, 12: 122}, + 3: {1: 16, 2: 17, 3: 18, 4: 19, 5: 20}, + 4: {1: 21, 2: 22, 3: 23, 4: 24, 5: 25, }, + 5: {1: 26, 2: 27, 3: 28, 4: 29, 5: 30, 6: 31}, + 6: {1: 32, 2: 33, 3: 34, 4: 35}, + 7: {1: 36, 2: 37, 3: 38}, + 8: {1: 39, 2: 40, 3: 41}, + 9: {1: 42, 2: 43}, + 10: {1: 44}, + 11: {1: 45, 2: 46}, + 12: {1: 47, 2: 117}, + 13: {1: 48, 2: 49, 3: 50}, + 14: {1: 51, 2: 110}, + 15: {1: 52, 2: 53, 3: 107, 4: 108}, + 16: {1: 19, 2: 11, 3: 111, 4: 112}, + 17: {1: 56, 2: 113}, + 18: {1: 57, 2: 58}, + 19: {1: 59, 2: 60, 3: 61, 4: 62, 5: 63}, + 20: {1: 64, 2: 65, 3: 66}, + 21: {1: 67, 2: 68}, + 22: {1: 69, 2: 118}, + 23: {1: 70, 2: 71, 3: 72}, + 24: {1: 73, 2: 74}, + 25: {1: 75}, + 26: {1: 76, 2: 77, 3: 105}, + 27: {1: 78, 2: 106}, + 28: {1: 79}, + 29: {1: 80, 2: 119}, + 30: {1: 126}, + 31: {1: 81, 2: 82, 3: 83}, + 32: {1: 84}, + 33: {1: 85}, + 34: {1: 86}, + 35: {1: 127, 2: 128}, + 36: {1: 87}, + 37: {1: 88, 2: 89}, + 38: {1: 90, 2: 91}, + 39: {1: 92}, + 40: {1: 93, 2: 94}, + 41: {1: 95}, + 42: {1: 96}, + 43: {1: 116}, + 44: {1: 109}, + 45: {1: 103, 2: 115}, + 46: {1: 97, 2: 98, 3: 99, 4: 100}, + 47: {1: 114}, + 48: {1: 123}, + 49: {1: 124, 2: 125}, + 901: {1: 901}} + +COLOR_LIST = [(1, 1, 1), + (160/255, 60/255, 60/255), + (1, 127/255, 42/255), + (.67, .78, .21), + (85/255, 1, 153/255), + (85/255, 153/255, 1), + (153/255, 85/255, 1), + (0, 212/255, 0)] + +VERSION = utils.VERSION + +MOLECULE_ID = {'h2o': 1, 'co2': 2, 'o3': 3, 'n2o': 4, 'co': 5, + 'ch4': 6, 'o2': 7, 'no': 8, 'so2': 9, + 'no2': 10, 'nh3': 11, 'hno3': 12, 'oh': 13, + 'hf': 14, 'hcl': 15, 'hbr': 16, 'hi': 17, + 'clo': 18, 'ocs': 19, 'h2co': 20, 'hocl': 21, + 'n2': 22, 'hcn': 23, 'ch3cl': 24, 'h2o2': 25, + 'c2h2': 26, 'c2h6': 27, 'ph3': 28, 'cof2': 29, + 'sf6': 30, 'h2s': 31, 'hcooh': 32, 'ho2': 33, + 'o': 34, 'clono2': 35, 'no+': 36, 'hobr': 37, + 'c2h4': 38, 'ch3oh': 39, 'ch3br': 40, 'ch3cn': 41, + 'cf4': 42, 'c4h2': 43, 'hc3n': 44, 'h2': 45, + 'cs': 46, 'so3': 47, 'c2n2': 48, 'cocl2': 49, + 'ar': 901} + +INERT_MOL_DATA = {901: {'mass': 39.948}} + diff --git a/pyradInteractive.py b/pyradInteractive.py deleted file mode 100644 index 1ca18ab..0000000 --- a/pyradInteractive.py +++ /dev/null @@ -1,625 +0,0 @@ -import pyrad -import pyradUtilities as util -import re -import pyradPlanck - -existingAtmosphere = False -validValueAndUnits = re.compile('([-])?(\d+)?([.])?(\d+)?(\S+)?') -genericAtmosphere = pyrad.Atmosphere('holding atm for pyrad interactive') - - -class Menu: - def __init__(self, title, entries, previousMenu=None, menuParams=None): - self.title = title - self.entries = entries - self.previousMenu = previousMenu - self.menuParams = menuParams - - def displayMenu(self): - titleStr = '\t' + self.title - while len(titleStr) < 60: - titleStr += ' ' - print('\n%s' % util.underlineCyan(titleStr)) - i = 1 - validEntry = ['x'] - for entry in self.entries: - validEntry.append(str(i)) - print(' %s) %s' % (util.magentaText(i), entry.name)) - i += 1 - if 'Main' not in self.title: - print(' %s Previous menu' % util.magentaText('B)')) - validEntry.append('b') - print(' %s Exit' % util.magentaText('X)')) - validChoice = False - while not validChoice: - userInput = input('Choose an option: ') - if userInput.lower() == 'x': - print('Goodbye') - exit(1) - elif userInput.lower() == 'b' and 'Main' not in self.title: - return - elif userInput in validEntry: - userChoice = self.entries[int(userInput) - 1] - if userChoice.nextFunction: - userChoice.nextFunction(userChoice.functionParams) - validChoice = True - elif userChoice.nextMenu: - userChoice.nextMenu.displayMenu() - validChoice = True - else: - print('Invalid entry. Try again.') - - -class Entry: - def __init__(self, text, nextMenu=None, nextFunction=None, functionParams=None, previousMenu=None): - self.name = text - self.nextMenu = nextMenu - self.nextFunction = nextFunction - self.functionParams = functionParams - self.previousMenu = previousMenu - - -def createPlot(params): - plotList = params['plots'] - plotType = params['plotType'] - plotTitle = params['title'] - pyrad.plot(plotType, plotTitle, plotList) - return - - -def createLayer(atmosphere): - defaultLayerName = atmosphere.nextLayerName() - getLayerName = '\n%s\n' \ - 'If no value given, default will be %s : ' \ - % (util.underlineCyan('Enter the name of the layer.\t\t'), - util.limeText(defaultLayerName)) - depth = inputLayerDepth() - pressure = inputLayerPressure() - temperature = inputLayerTemperature() - rangeMin, rangeMax = inputLayerRange() - validName = False - while not validName: - layerName = input(getLayerName) - if layerName not in genericAtmosphere: - validName = True - else: - print('Name already taken. Please try again.') - layer = atmosphere.addLayer(depth, temperature, pressure, rangeMin, rangeMax, name=layerName) - createMolecule(layer) - return - - -def createMolecule(layer): - addMoleculeLoop = True - while addMoleculeLoop: - moleculeName = inputMoleculeName() - concentration, units = inputMoleculeComposition() - tempdict = {units: concentration} - molecule = layer.addMolecule(moleculeName, **tempdict) - while pyrad.totalConcentration(layer) > 1: - print("%s total concentration exceeds 100%%" % util.magentaText('***\tWARNING\t***')) - menuEditComposition(layer) - validInput = False - while not validInput: - ask = input("Add another molecule to the layer %s " % util.magentaText('(y/n) :')) - if ask.strip().lower() == 'y': - validInput = True - elif ask.strip().lower() == 'n': - return - - -def menuEditLayerParam(layer): - editDepth = Entry('Depth', nextFunction=editLayerDepth, functionParams=layer) - editRange = Entry('Min or max range', nextFunction=editLayerRange, functionParams=layer) - editTemperature = Entry('Temperature',nextFunction=editLayerTemperature, functionParams=layer) - editPressure = Entry('Pressure', nextFunction=editLayerPressure, functionParams=layer) - entryList = [editDepth, editRange, editTemperature, editPressure] - menu = Menu('Choose the parameter to edit for %s' % layer.name, entryList, - previousMenu=menuEditParamsOrComp, menuParams=layer) - menu.displayMenu() - return - - -def editLayerDepth(layer): - print('Current %s for %s is : %s\n' - % (util.limeText('depth'), util.limeText(layer.name), util.cyanText('%scm' % layer.depth))) - depth = inputLayerDepth(default=layer.depth) - layer.changeDepth(depth) - menuEditLayerParam(layer) - - -def editLayerTemperature(layer): - print('Current %s for %s is : %s\n' - % (util.limeText('temperature'), util.limeText(layer.name), util.cyanText('%sK' % layer.T))) - temperature = inputLayerTemperature(default=layer.T) - layer.changeTemperature(temperature) - menuEditLayerParam(layer) - - -def editLayerPressure(layer): - print('Current %s for %s is : %s\n' - % (util.limeText('pressure'), util.limeText(layer.name), util.cyanText('%smbar' % layer.P))) - pressure = inputLayerPressure(default=layer.P) - layer.changePressure(pressure) - menuEditLayerParam(layer) - - -def editLayerRange(layer): - print('Current %s for %s is %s\n' - % (util.limeText('range'), util.limeText(layer.name), - util.cyanText('%s-%scm-1' % (layer.rangeMin, layer.rangeMax)))) - rangeMin, rangeMax = inputLayerRange(defaultMin=layer.rangeMin, defaultMax=layer.rangeMax) - layer.changeRange(rangeMin, rangeMax) - menuEditLayerParam(layer) - - -def editComposition(molecule): - print('Current concentration for %s is %s\n' % (util.limeText(molecule.name), util.limeText(molecule.concText))) - return inputMoleculeComposition(molecule, default=molecule.concText) - - -def inputLayerDepth(default=None): - if not default: - default = 10 - text = 'Enter the thickness of the layer.\t\t\t' - getDepth = '%s\n' \ - 'If no units are specified, %s will be assumed.\n' \ - 'Other valid units are %s . If no value given, default will be %s: ' % \ - (util.underlineCyan(text), - util.limeText('cm'), - util.limeText('m, in, ft.'), - util.limeText('%scm' % default)) - depth = receiveInput(getDepth, validDepth, default=default) - return depth - - -def inputLayerTemperature(default=None): - if not default: - default = 300 - text = 'Enter the temperature of the layer.\t\t\t' - getTemperature = '%s\n' \ - 'If no units are specified, %s will be assumed.\n' \ - 'Other valid units are %s . If no value given, default will be %s: ' % \ - (util.underlineCyan(text), - util.limeText('K'), - util.limeText('C or F'), - util.limeText('%sK' % default)) - temperature = receiveInput(getTemperature, validTemperature, default=default) - return temperature - - -def inputLayerPressure(default=None): - if not default: - default = 1013.25 - text = 'Enter the pressure of the layer.\t\t\t' - getPressure = '%s\n' \ - 'If no units are specified, %s will be assumed.\n' \ - 'Other valid units are %s . If no value given, default will be %s: ' % \ - (util.underlineCyan(text), - util.limeText('mBar'), - util.limeText('pa, bar, and atm.'), - util.limeText('%smbar' % default)) - pressure = receiveInput(getPressure, validPressure, default=default) - return pressure - - -def inputLayerRange(defaultMin=None, defaultMax=None): - if not defaultMin: - defaultMin = 600 - if not defaultMax: - defaultMax = 700 - rangeMin = -1 - rangeMax = -1 - text = 'Enter the minimum range of the layer.\t\t\t' - getRangeMin = '%s\n' \ - 'If no units are specified, %s will be assumed.\n' \ - 'Other valid units are %s . If no value given, default will be %s: ' % \ - (util.underlineCyan(text), - util.limeText('cm-1'), - util.limeText('um'), - util.limeText('%scm' % defaultMin)) - while rangeMin < 0: - rangeMin = receiveInput(getRangeMin, validRange, default=defaultMin) - if rangeMin < 0: - print('Range min must be %s than zero' % util.magentaText('greater')) - text = 'Enter the maximum range of the layer.\t\t\t' - getRangeMax = '%s\n' \ - 'If no units are specified, %s will be assumed.\n' \ - 'Other valid units are %s . If no value given, default will be %s: ' % \ - (util.underlineCyan(text), - util.limeText('cm-1'), - util.limeText('um'), - util.limeText('%scm' % defaultMax)) - while rangeMax <= rangeMin: - rangeMax = receiveInput(getRangeMax, validRange, default=defaultMax) - if rangeMax <= rangeMin: - print('Range min must be %s than range min of %s' % (util.magentaText('greater'), util.cyanText(rangeMin))) - return rangeMin, rangeMax - - -def validNumber(userInput): - try: - return float(userInput) - except ValueError: - return False - - -def inputPlanckRange(units): - rangeMin = -1 - rangeMax = -1 - text = '%s\nUnits are %s. Scientific notation is accepted (1e14):' \ - % (util.underlineCyan('Enter the minimum range of the planck spectrum.'),util.limeText(units)) - while rangeMin < 0: - rangeMin = receiveInput(text, validNumber) - if rangeMin < 0: - print('Range min must be %s than zero' % util.magentaText('greater')) - text = '%s\nUnits are %s. Scientific notation is accepted (1e14):' \ - % (util.underlineCyan('Enter the maximum range of the planck spectrum.'), util.limeText(units)) - while rangeMax <= rangeMin: - rangeMax = receiveInput(text, validNumber) - if rangeMax <= rangeMin: - print('Range min must be %s than range min of %s' % (util.magentaText('greater'), util.cyanText(rangeMin))) - return rangeMin, rangeMax - - -def inputMoleculeName(default=None): - if not default: - default = 'co2' - text = 'Enter the short molecule name.\t\t\t' - moleculeName = receiveInput('%s\n' - 'For a full list of options, type %s . If no value given, %s will be used: ' - % (util.underlineCyan(text), - util.magentaText('help'), - util.limeText(default)), validMoleculeName, default=default) - return moleculeName - - -def inputMoleculeComposition(obj=None, default=None): - if not default: - default = '400ppm' - text = 'Enter the molecule composition.\t\t\t' - composition, units = receiveInput('%s\n' - 'If no units entered, composition will be assumed %s.\n' - 'Other valid units are %s . If no value given, %s will be used: ' - % (util.underlineCyan(text), - util.limeText('parts per 1'), - util.limeText('ppm, ppb, or percentage'), - util.limeText(default)), validComposition, default=default) - if obj: - if units == 'ppm': - obj.setPPM(composition) - elif units == 'ppb': - obj.setPPB(composition) - elif 'perc' in units or units == '%': - obj.setPercentage(composition) - else: - obj.setConcentrationPercentage(composition) - return - else: - return composition, units - - -def inputPlanckTemps(): - text = 'Enter the temperature of the planck curves.\t\t\t' - tempList = receiveMultiInput('%s\n' - 'If no units entered, temperature will be assumed %s.\n' - 'Other valid units are %s .Multiple temperatures can be separated with a comma: ' - % (util.underlineCyan(text), - util.limeText('K'), - util.limeText('C and F')), validTemperature) - return tempList - - -def menuChooseLayerToEdit(empty=None): - entryList = [] - for layer in genericAtmosphere: - nextEntry = Entry(layer.name, nextFunction=menuEditParamsOrComp, functionParams=layer) - entryList.append(nextEntry) - editLayerMenu = Menu('Edit layer', entryList) - editLayerMenu.displayMenu() - return - - -def menuChooseTransmission(plotType): - entryList = [] - for layer in genericAtmosphere: - params = {'plots': [layer], 'plotType': plotType, 'title': layer.title} - nextEntry = Entry(layer.name, nextFunction=createTransmission, functionParams=params) - entryList.append(nextEntry) - plotList, title = createObjAndComponents(layer) - params = {'plots': plotList, 'plotType': plotType, 'title': title} - nextEntry = Entry('%s and components' % layer.name, nextFunction=createTransmission, functionParams=params) - entryList.append(nextEntry) - transmissionMenu = Menu('Choose which layers to plot transmission', entryList) - transmissionMenu.displayMenu() - return - - -def createPlanckCurves(plotType): - plotList = inputPlanckTemps() - rangeMin, rangeMax = inputPlanckRange(plotType) - pyrad.plotSpectrum(title='Planck spectrums', rangeMin=rangeMin, rangeMax=rangeMax, planckTemperatureList=plotList, planckType=plotType) - return - - -def menuPlanckType(empty=None): - entryList = [] - wavenumber = 'wavenumber' - hertz = 'Hz' - wavelength = 'wavelength' - entryList.append(Entry('By %s (cm-1)' % wavenumber, nextFunction=createPlanckCurves, functionParams=wavenumber)) - entryList.append(Entry('By %s (um)' % wavelength, nextFunction=createPlanckCurves, functionParams=wavelength)) - entryList.append(Entry('By %s (s-1)' % hertz, nextFunction=createPlanckCurves, functionParams=hertz)) - planckTypeMenu = Menu('Choose planck type', entryList) - planckTypeMenu.displayMenu() - return - - -def createTransmission(params): - layer = params['plots'][0] - text = 'A plot for transmission requires an initial surface temperature.\n'\ - 'Please choose a temperature different from the layer temperature of %sK:' % util.limeText(layer.T) - temperature = receiveMultiInput(text, validTemperature) - objList = [] - for item in params['plots']: - objList.append(item) - temperature.append(layer.T) - pyrad.plotSpectrum(layer, objList=objList, - surfaceSpectrum=pyradPlanck.planckWavenumber(layer.xAxis, temperature[0]), - planckTemperatureList=temperature) - return - - -def menuChoosePlotType(empty=None): - entryList = [] - entryList.append(Entry('transmittance', nextFunction=menuChooseLayerToPlot, functionParams='transmittance')) - entryList.append(Entry('absorption coefficient', nextFunction=menuChooseLayerToPlot, functionParams='absorption coefficient')) - entryList.append(Entry('cross section', nextFunction=menuChooseLayerToPlot, functionParams='cross section')) - entryList.append(Entry('absorbance', nextFunction=menuChooseLayerToPlot, functionParams='absorbance')) - entryList.append(Entry('optical depth', nextFunction=menuChooseLayerToPlot, functionParams='optical depth')) - entryList.append(Entry('line survey', nextFunction=menuChooseLayerToPlot, functionParams='line survey')) - entryList.append(Entry('transmission', nextFunction=menuChooseTransmission, functionParams='transmission')) - choosePlotTypeMenu = Menu('Choose plot type', entryList) - choosePlotTypeMenu.displayMenu() - return - - -def menuChooseLayerToPlot(plotType): - entryList = [] - for layer in genericAtmosphere: - params = {'plots': [layer], 'plotType': plotType, 'title': layer.title} - nextEntry = Entry(layer.name, nextFunction=createPlot, functionParams=params) - entryList.append(nextEntry) - plotList, title = createObjAndComponents(layer) - params = {'plots': plotList, 'plotType': plotType, 'title': title} - nextEntry = Entry('%s and components' % layer.name, nextFunction=createPlot, functionParams=params) - entryList.append(nextEntry) - plotLayerMenu = Menu('Plot layer', entryList) - plotLayerMenu.displayMenu() - return - - -def createObjAndComponents(obj): - plotList = [obj] - for item in obj: - plotList.append(item) - return plotList, obj.title - - -def menuEditComposition(layer): - moleculeList = layer.returnMoleculeObjects() - entryList = [] - for molecule in moleculeList: - newEntry = Entry('%s : %s' % (molecule.name, molecule.concText), - functionParams=molecule, nextFunction=inputMoleculeComposition) - entryList.append(newEntry) - entryList.append(Entry('Add a new molecule(s)', nextFunction=createMolecule, functionParams=layer)) - editCompMenu = Menu('Choose a molecule to edit', entryList, previousMenu=menuEditParamsOrComp) - editCompMenu.displayMenu() - return - - -def menuEditParamsOrComp(layer): - entryList = [] - editLayerParamsEntry = Entry('Edit layer parameters', nextFunction=menuEditLayerParam, functionParams=layer) - entryList.append(editLayerParamsEntry) - duplicateLayerEntry = Entry('Duplicate layer', nextFunction=duplicateObj, functionParams=layer) - entryList.append(duplicateLayerEntry) - editCompositionEntry = Entry('Edit composition', nextFunction=menuEditComposition, functionParams=layer) - entryList.append(editCompositionEntry) - chooseParamsMenu = Menu('Edit or duplicate', entryList, previousMenu=menuChooseLayerToEdit) - chooseParamsMenu.displayMenu() - return - - -def menuMain(): - createLayerEntry = Entry("Create new gas cell", nextFunction=createLayer, functionParams=genericAtmosphere) - editLayerEntry = Entry("Edit/duplicate gas cell", nextFunction=menuChooseLayerToEdit) - plotLayerEntry = Entry("Plot gas cell", nextFunction=menuChoosePlotType) - planckPlotEntry = (Entry('Plot planck curves', nextFunction=menuPlanckType)) - mainMenu = Menu('Main menu', [createLayerEntry, editLayerEntry, plotLayerEntry, planckPlotEntry]) - mainMenu.displayMenu() - return - - -def duplicateObj(obj): - newObj = obj.returnCopy() - if isinstance(newObj, pyrad.Layer): - genericAtmosphere.append(newObj) - else: - print('Unknown object %s, type %s' % (obj.name, type(obj))) - return - - -def receiveInput(inputText, validInputFunction, default=None): - validInput = False - while validInput is False: - userInput = input('\n%s' % inputText) - if userInput == '': - return validInputFunction(str(default)) - validInput = validInputFunction(userInput) - return validInput - - -def receiveMultiInput(inputText, validInputFunction, default=None): - validInput = False - while not validInput: - userInput = input(inputText) - inputList = userInput.replace(' ', '').split(',') - testInput = True - for item in inputList: - if not validInputFunction(item): - print('%s not recognized as valid. Please try again.') - testInput = False - if testInput: - return inputList - - -def validMoleculeName(userInput): - if not userInput: - return False - if userInput.strip().lower() == 'help': - util.displayAllMolecules() - return False - elif userInput in pyrad.MOLECULE_ID: - return userInput - else: - print('Invalid molecule name. %s' % (util.underlineMagenta('Please try again.'))) - return False - - -def validPressure(userInput): - if not userInput: - return False - try: - splitInput = validValueAndUnits.match(userInput) - except AttributeError: - print('Invalid input for pressure. Example: %s. %s' - % (util.limeText('1.35atm'), util.underlineMagenta('Please try again.'))) - return False - unit = splitInput.group(5) - if not unit: - unit = 'mbar' - unit = unit.lower() - if unit not in PRESSURE_UNITS: - print('Invalid units. Accepted units are %s.' % ', '.join(PRESSURE_UNITS)) - return False - textNumber = '' - for i in range(1, 5): - if splitInput.group(i): - textNumber += splitInput.group(i) - - value = float(textNumber) - return pyrad.convertPressure(value, unit) - - -def validComposition(userInput): - if not userInput: - return False - try: - splitInput = validValueAndUnits.match(userInput) - except AttributeError: - print('Invalid input for concentration. Example: %s. %s' - % (util.limeText('15ppb'), util.underlineMagenta('Please try again.'))) - return False - unit = splitInput.group(5) - if not unit: - unit = 'concentration' - if unit not in COMPOSITION_UNITS: - print('Invalid units. Accepted units are %s.' - % (util.limeText(', '.join(COMPOSITION_UNITS)))) - return False - textNumber = '' - for i in range(1, 5): - if splitInput.group(i): - textNumber += splitInput.group(i) - value = float(textNumber) - if value <= 0: - print('Concentration must be greater than 0') - return False - return value, unit - - -def validTemperature(userInput): - if not userInput: - return False - try: - splitInput = validValueAndUnits.match(userInput) - except AttributeError: - print('Invalid input for temperature. Example: %s. %s' - % (util.limeText('20C'), util.underlineMagenta('Please try again.'))) - return False - unit = splitInput.group(5) - if not unit: - unit = 'K' - unit = unit.upper()[0] - if unit not in TEMPERATURE_UNITS: - print('Invalid units. Accepted units are %s.' - % (util.limeText(', '.join(TEMPERATURE_UNITS)))) - return False - textNumber = '' - for i in range(1, 5): - if splitInput.group(i): - textNumber += splitInput.group(i) - value = float(textNumber) - return pyrad.convertTemperature(value, unit) - - -def validRange(userInput): - if not userInput: - return False - try: - splitInput = validValueAndUnits.match(userInput) - except AttributeError: - print('Invalid input for range. Example: %s. %s' - % (util.limeText('150cm-1'), util.underlineMagenta('Please try again.'))) - return False - unit = splitInput.group(5) - if not unit: - unit = 'cm-1' - unit = unit.lower() - if unit not in RANGE_UNITS: - print('Invalid units. Accepted units are %s' - % (util.limeText(', '.join(RANGE_UNITS)))) - return False - textNumber = '' - for i in range(1, 5): - if splitInput.group(i): - textNumber += splitInput.group(i) - value = float(textNumber) - return pyrad.convertRange(value, unit) - - -def validDepth(userInput): - if not userInput: - return False - try: - splitInput = validValueAndUnits.match(userInput) - except AttributeError: - print('Invalid input for depth. Example: %s. %s' - % (util.limeText('10cm'), util.underlineMagenta('Please try again.'))) - return False - unit = splitInput.group(5) - if not unit: - unit = 'cm' - unit = unit.lower() - if unit not in DEPTH_UNITS: - print('Invalid units. Accepted units are %s' - % (util.limeText(', '.join(DEPTH_UNITS)))) - return False - textNumber = '' - for i in range(1, 5): - if splitInput.group(i): - textNumber += splitInput.group(i) - value = float(textNumber) - return pyrad.convertLength(value, unit) - - -DEPTH_UNITS = ['cm', 'in', 'inches', 'ft', 'feet', 'meter', 'm'] -PRESSURE_UNITS = ['atm', 'bar', 'mbar', 'pa'] -TEMPERATURE_UNITS = ['K', 'C', 'F'] -RANGE_UNITS = ['um', 'cm-1'] -COMPOSITION_UNITS = ['ppm', 'ppb', '%', 'percentage', 'perc', 'concentration'] - -while True: - menuMain() diff --git a/pyradLineshape.py b/pyradLineshape.py index 5523e13..58cf0de 100644 --- a/pyradLineshape.py +++ b/pyradLineshape.py @@ -5,10 +5,10 @@ #cachedVoigt = utils.getCurves('voigt', utils.BASE_RESOLUTION) #cachedLorentz = utils.getCurves('lorentz', utils.BASE_RESOLUTION) #cachedGaussian = utils.getCurves('gaussian', utils.BASE_RESOLUTION) -cachedLorentz = {} -cachedGaussian = {} -newLorentz = {} -newGaussian = {} +#cachedLorentz = {} +#cachedGaussian = {} +#newLorentz = {} +#newGaussian = {} print('\n', end='\r') h = 6.62607004e-34 @@ -30,28 +30,28 @@ def lorentzHW(airHalfWidth, selfHalfWidth, P, T, q, tExponent): def gaussianLineShape(halfWidth, xValue): - if isinstance(xValue, np.ndarray) and str(halfWidth) in cachedGaussian: - length = len(xValue) - cachedCurve = cachedGaussian[str(halfWidth)] - if len(cachedCurve) >= length: - return cachedCurve[:length] +# if isinstance(xValue, np.ndarray) and str(halfWidth) in cachedGaussian: +# length = len(xValue) +# cachedCurve = cachedGaussian[str(halfWidth)] +# if len(cachedCurve) >= length: +# return cachedCurve[:length] """Returns the right half of a gaussian curve, used for temp broadening in low pressure scenarios""" lineShape = np.exp(-xValue**2 / halfWidth**2) / halfWidth / np.sqrt(pi) - cachedGaussian[halfWidth] = lineShape - newGaussian[halfWidth] = lineShape + #cachedGaussian[halfWidth] = lineShape + #newGaussian[halfWidth] = lineShape return lineShape def lorentzLineShape(halfWidth, xValue): - if isinstance(xValue, np.ndarray) and str(halfWidth) in cachedLorentz: - length = len(xValue) - cachedCurve = cachedLorentz[str(halfWidth)] - if len(cachedCurve) >= length: - return cachedCurve[:length] +# if isinstance(xValue, np.ndarray) and str(halfWidth) in cachedLorentz: +# length = len(xValue) +# cachedCurve = cachedLorentz[str(halfWidth)] +# if len(cachedCurve) >= length: +# return cachedCurve[:length] """Returns the right half of a lorentzian curve.""" lineShape = halfWidth / pi / (xValue**2 + halfWidth**2) - cachedLorentz[halfWidth] = lineShape - newLorentz[halfWidth] = lineShape + #cachedLorentz[halfWidth] = lineShape + #newLorentz[halfWidth] = lineShape return lineShape diff --git a/pyradPlanck.py b/pyradPlanck.py index d534a52..81391fa 100644 --- a/pyradPlanck.py +++ b/pyradPlanck.py @@ -1,5 +1,5 @@ import numpy as np -np.seterr(divide='ignore', invalid='ignore') +np.seterr(divide='ignore', invalid='ignore', over='ignore') k = 1.38064852E-23 c = 299792458.0 diff --git a/pyradUtilities.py b/pyradUtilities.py index 6689127..8eacb8f 100644 --- a/pyradUtilities.py +++ b/pyradUtilities.py @@ -2,21 +2,107 @@ import sys import urllib.request as urlrequest import urllib.error as urlexception -import datetime -import numpy as np +import gc +from datetime import datetime cwd = os.getcwd() lineSep = os.linesep dataDir = '%s/data' % cwd -curvesDir = '%s/curves' % dataDir molParamsFile = '%s/molparams.txt' % dataDir +profileDir = '/%s/profiles' % dataDir +themeDir = '%s/themes' % cwd debuggerFilePath = '%s/logger.txt' % cwd -now = datetime.datetime.now() +now = datetime.now() debuggerFile = open(debuggerFilePath, 'wb') debuggerFile.write(bytes('%s\n' % now.strftime("%Y-%m-%d %H:%M:%S"), 'utf-8')) debuggerFile.close() +class Theme: + def __init__(self, value='dark'): + self.theme = value + self.faceColor = None + self.textColor = None + self.backingColor = None + self.gridList = [] + self.colorList = [] + self.loadTheme(self.theme) + + def rgbTuple(self, value): + rgb = value.split(',') + return (float(rgb[0]) / 255, float(rgb[1]) / 255, float(rgb[2]) / 255) + + def loadTheme(self, value): + fullPath = '%s/%s.pyr' % (themeDir, value) + lines = openReturnLines(fullPath) + self.colorList = [] + self.gridList = [] + for line in lines: + cells = line.split(':') + if cells[0] == 'colorList': + self.colorList.append(self.rgbTuple(cells[1])) + elif cells[0] == 'textColor': + self.textColor = self.rgbTuple(cells[1]) + elif cells[0] == 'faceColor': + self.faceColor = self.rgbTuple(cells[1]) + elif cells[0] == 'gridList': + self.gridList.append(self.rgbTuple(cells[1])) + elif cells[0] == 'backingColor': + self.backingColor = self.rgbTuple(cells[1]) + + @property + def listOfThemes(self): + themeList = [] + fileList = getPyrFileList(themeDir) + for file in fileList: + themeList.append(file.split('.')[0]) + return themeList + + +class Settings: + + userName = "@bradschrag" + + def __init__(self, setting, userName='@bradschrag'): + self.setting = setting + self.reduceRes = True + self.userName = userName + Settings.userName = userName + + def changeSetting(self, value): + self.setting = value + + def changeResReduce(self, bool): + self.reduceRes = bool + + + @property + def baseRes(self): + if self.setting == 'low': + return .01 + elif self.setting == 'mid': + return .01 + elif self.setting == 'high' or self.setting == 'hi': + return .01 + + @property + def lineIntensityCutoff(self): + if self.setting == 'low': + return 1E-21 + elif self.setting == 'mid': + return 1E-24 + elif self.setting == 'high' or self.setting == 'hi': + return 0.0 + + @property + def smoothing(self): + if self.setting == 'low': + return 1 + elif self.setting == 'mid': + return 50 + elif self.setting == 'high' or self.setting == 'hi': + return 100 + def magentaText(text): return '%s%s%s' % (TEXT_COLORS['regularMagenta'], text, TEXT_COLORS['colorEnd']) @@ -55,7 +141,7 @@ def logToFile(text): def setupDir(): print('Verifying data structure...', end='') sys.stdout.flush() - directoryList = [dataDir, curvesDir] + directoryList = [dataDir, profileDir, themeDir] fileList = [] directoryCheck = True fileCheck = True @@ -75,23 +161,632 @@ def setupDir(): if not os.path.isfile(molParamsFile): downloadMolParam() getMolParamsFromHitranFile() + # check theme + filePath = '%s/dark.pyr' % themeDir + if not os.path.isfile(filePath): + writeTheme(filePath) print('files checked.') return directoryCheck and fileCheck +def csvToPYR(filePath): + fullPath = cwd + '/afgl/' + filePath + lines = openReturnLines(fullPath) + name = lines[0].split(',')[0] + height_position = 0 + pressure_position = 1 + temp_position = 2 + h2o_position = 4 + o3_posiiton = 5 + n2o_position = 6 + co_posiiton = 7 + ch4_position = 8 + heightList = [] + pressureList = [] + tempList = [] + h2oList = [] + o3List = [] + n2oList = [] + coList = [] + ch4List = [] + for line in lines[2:]: + cells = line.strip().split(',') + heightList.append(cells[height_position]) + pressureList.append(cells[pressure_position]) + tempList.append(cells[temp_position]) + h2oList.append(float(cells[h2o_position]) * 10**-6) + o3List.append(float(cells[o3_posiiton]) * 10**-6) + n2oList.append(float(cells[n2o_position]) * 10**-6) + coList.append(float(cells[co_posiiton]) * 10**-6) + ch4List.append(float(cells[ch4_position]) * 10**-6) + + pyrFilePath = '%s/%s.pyr' % (cwd, name) + + openFile = open(pyrFilePath, 'wb') + + # write comments + text = "# atm profile for %s\n\n" \ + "# surface values (pressure, temperature, final height, initial layer thickness, " \ + "acceleration of gravity, range min, range max)\n" \ + "surface: %s, %s, 120, 100, 9.8, 100, 2500\n" % (name, float(pressureList[0]), tempList[0]) + openFile.write(text.encode('utf-8')) + + # write initial file values + text = "\n# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile\n" \ + "# except for co2, o2, n2, and ar\n" \ + "molecule: co2, .000287\n" \ + "molecule: h2o, %s\n" \ + "molecule: o2, .20\n" \ + "molecule: n2, .77\n" \ + "molecule: ar, .009\n" \ + "molecule: ch4, %s\n" \ + "molecule: o3, %s\n" \ + "molecule: n2o, %s\n" \ + "molecule: co, %s\n" % (float(h2oList[0]), float(ch4List[0]), + float(o3List[0]), float(n2oList[0]), float(coList[0])) + openFile.write(text.encode('utf-8')) + + # write lapse rate + text = "\n# lapse rate profile\n" \ + "# rules are: name, final height, final value\n" \ + "# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule)\n" + openFile.write(text.encode('utf-8')) + i = 0 + for temp, height in zip(tempList[1:], heightList[1:]): + text = 'lapse rate: lapse rule %s, %s, %s\n' % (i, height, temp) + openFile.write(text.encode('utf-8')) + i += 1 + i = 0 + text = "\n# h2o composition profile\n" \ + "# composition rules are: name, final height, final value ppmv, molecule the rule applies to\n" + openFile.write(text.encode('utf-8')) + for h2o, height in zip(h2oList[1:], heightList[1:]): + text = 'composition rate: h2o rule %s, %s, %s, h2o\n' % (i, height, float(h2o)) + openFile.write(text.encode('utf-8')) + i += 1 + i = 0 + text = "\n# ch4 composition profile\n" \ + "# composition rules are: name, final height, final value ppmv, molecule the rule applies to\n" + openFile.write(text.encode('utf-8')) + for ch4, height in zip(ch4List[1:], heightList[1:]): + text = 'composition rate: ch4 rule %s, %s, %s, ch4\n' % (i, height, float(ch4)) + openFile.write(text.encode('utf-8')) + i += 1 + i = 0 + text = "\n# o3 composition profile\n" \ + "# composition rules are: name, final height, final value ppmv, molecule the rule applies to\n" + openFile.write(text.encode('utf-8')) + for o3, height in zip(o3List[1:], heightList[1:]): + text = 'composition rate: o3 rule %s, %s, %s, o3\n' % (i, height, float(o3)) + openFile.write(text.encode('utf-8')) + i += 1 + i = 0 + text = "\n# n2o composition profile\n" \ + "# composition rules are: name, final height, final value ppmv, molecule the rule applies to\n" + openFile.write(text.encode('utf-8')) + for n2o, height in zip(n2oList[1:], heightList[1:]): + text = 'composition rate: n2o rule %s, %s, %s, n2o\n' % (i, height, float(n2o)) + openFile.write(text.encode('utf-8')) + i += 1 + i = 0 + text = "\n# co composition profile\n" \ + "# composition rules are: name, final height, final value ppmv, molecule the rule applies to\n" + openFile.write(text.encode('utf-8')) + for co, height in zip(coList[1:], heightList[1:]): + text = 'composition rate: co rule %s, %s, %s, co\n' % (i, height, float(co)) + openFile.write(text.encode('utf-8')) + i += 1 + openFile.close() + + +def writeTheme(fullPath): + openFile = open(fullPath, 'wb') + text = '# created by PyRad v%s on %s.\n' \ + '# values are (r, g, b) [0-255]\n' % (VERSION, now.strftime("%Y-%m-%d %H:%M:%S")) + properties = THEME['dark'] + value = 'faceColor' + r,g,b = properties[value] + text += '%s: %s, %s, %s\n' % (value, r, g, b) + value = 'gridColor' + r, g, b = properties[value] + text += '%s: %s, %s, %s\n' % (value, r, g, b) + value = 'textColor' + r, g, b = properties[value] + text += '%s: %s, %s, %s\n' % (value, r, g, b) + for color in properties['colorList']: + r,g,b = color + text += '%s: %s, %s, %s\n' % ('colorList', r,g,b) + openFile.write(text.encode('utf-8')) + openFile.close() + return + + def openReturnLines(fullPath): if not os.path.isfile(fullPath): return False - openFile = open(fullPath) - lineList = openFile.readlines() - openFile.close() + with open(fullPath, 'r') as data: + lineList = data.readlines() + if not lineList or NULL_TAG in lineList[0]: return False while lineList[0][0] == '#' and len(lineList) > 1: lineList.pop(0) + gc.collect() return lineList - + +def writePlanetProfile(name, layer, processingTime, moleculeList, moleculeSpecific=False): + folderPath = '%s/%s' % (profileDir, name) + if not os.path.isdir(folderPath): + os.mkdir(folderPath) + filePath = '%s/%s.pyr' % (folderPath, layer.name) + now = datetime.now() + with open(filePath, 'wb') as openFile: + text = '# created by PyRad v%s on %s.\n' % (VERSION, now.strftime("%Y-%m-%d %H:%M:%S")) + openFile.write(text.encode('utf-8')) + text = ('time: %ssecs\n' + 'depth: %s\n' + 'T: %s\n' + 'P: %s\n' + 'rangeMin: %s\n' + 'rangeMax: %s\n' + 'height: %s\n' + 'name: %s\n' + 'molecule list: %s\n' + '# layer abs coef\n' + 'layer absCoef: %s\n' + % (int(processingTime), layer.depth, int(layer.T), layer.P, layer.rangeMin, layer.rangeMax, layer.height, + layer.name, ','.join(moleculeList), ','.join(map(str, layer.absCoef.tolist())))) + openFile.write(text.encode('utf-8')) + if moleculeSpecific: + for molecule in layer: + text1 = '# %s abs coef\n' % molecule.name + text2 = '%s absCoef: %s\n' % (molecule.name, ','.join(map(str, molecule.absCoef.tolist()))) + text3 = '%s concentration: %s\n' % (molecule.name, molecule.concentration) + openFile.write(text1.encode('utf-8')) + openFile.write(text2.encode('utf-8')) + openFile.write(text3.encode('utf-8')) + print('\t\t\t\t\t\t ||> %s.pyr' % layer.name, end='\r', flush=True) + return + + +def writePlanetTransmission(name, height, values, direction, number, mode='wb'): + folderPath = '%s/%s' % (profileDir, name) + filePath = '%s/%s.pyr' % (folderPath, 'trans looking %s-%s' % (direction, number)) + with open(filePath, mode) as openFile: + if mode == 'wb': + text = '# PyRad v%s transmission file\n' \ + '# layer height for this file is %s\n' % (VERSION, height) + openFile.write(text.encode('utf-8')) + text = '# general layer data is listed below this line. Other data contained within this file is\n' \ + '# the reduced transmission for the layer and each molecule that is part of the atmosphere.\n' \ + '# Effective emissivity for is the avg emissivity\n#\n' + openFile.write(text.encode('utf-8')) + for item in values: + try: + iter(values[item]) + value = ','.join(map(str, values[item])) + except TypeError: + value = values[item] + text = '%s: %s\n' % (item, value) + openFile.write(text.encode('utf-8')) + openFile.write('#\n'.encode('utf-8')) + gc.collect() + return + + +def clearAbsData(folderPath): + fullPath = '%s/%s' % (profileDir, folderPath) + fileList = os.listdir(fullPath) + for file in fileList: + if 'layer' in file: + filePath = '%s/%s' % (fullPath, file) + print('removing %s' % file, end='\r', flush=True) + os.remove(filePath) + return + + +def emptyFile(filePath): + fullPath = '%s/%s' % (cwd, filePath) + openfile = open(fullPath, 'wb') + openfile.close() + return + + +def getPyrFileList(folder=cwd): + fileList = os.listdir(folder) + profileFiles = [] + for file in fileList: + if '.pyr' in file: + profileFiles.append(file) + return profileFiles + + +def getCompletedProfileList(): + fileList = os.listdir(profileDir) + dirList = [] + completedList = [] + for file in fileList: + if os.path.isdir('%s/%s' % (profileDir, file)): + dirList.append('%s/%s' % (profileDir, file)) + for dir in dirList: + if os.path.isfile('%s/profileComplete.pyr' % dir): + completedList.append(dir.split('/')[-1]) + return completedList + + +def getCompletedTransmissionList(): + fileList = os.listdir(profileDir) + dirList = [] + completedList = [] + for file in fileList: + if os.path.isdir('%s/%s' % (profileDir, file)): + dirList.append('%s/%s' % (profileDir, file)) + for dir in dirList: + if os.path.isfile('%s/transmissionComplete.pyr' % dir): + completedList.append(dir.split('/')[-1]) + return completedList + + +def readCompleteProfile(folderPath): + fullPath = '%s/%s/profileComplete.pyr' % (profileDir, folderPath) + lines = openReturnLines(fullPath) + values = {} + for line in lines: + if line[0] == '#': + pass + else: + cells = line.split(':') + values[cells[0].strip()] = cells[1].strip() + return values + + +def readHeightFile(folderPath): + fullPath = '%s/%s/profileHeights.pyr' % (profileDir, folderPath) + lines = openReturnLines(fullPath) + heights = [] + for line in lines: + heights.append(float(line)) + return heights + + +def readCompleteTransmission(folderPath): + fullPath = '%s/%s/transmissionComplete.pyr' % (profileDir, folderPath) + lines = openReturnLines(fullPath) + values = {} + for line in lines: + if line[0] == '#': + pass + else: + cells = line.split(':') + values[cells[0].strip()] = cells[1].strip() + values['heightList'] = readHeightFile(folderPath) + return values + + +def readTransmissionValues(fileName, folderPath): + fullPath = '%s/%s/%s' % (profileDir, folderPath, fileName) + lines = openReturnLines(fullPath) + values = {} + for line in lines: + if line[0] == '#': + pass + else: + cells = line.split(':') + transmission = [] + for t in cells[1].split(','): + transmission.append(float(t)) + values[cells[0]] = transmission + return values + + +def molSpecProfileList(): + completedProfileDirList = getCompletedProfileList() + completeList = [] + for completeDir in completedProfileDirList: + folderPath = '%s/%s' % (profileDir, completeDir) + fullPath = '%s/profileComplete.pyr' % folderPath + lines = openReturnLines(fullPath) + for line in lines: + if line[0] == '#': + pass + elif line.split(':')[0] == 'molSpecific': + if 'true' in line.split(':')[1].lower(): + completeList.append(completeDir) + return completeList + + +def checkPlanetProfile(name): + folderPath = '%s/%s' % (profileDir, name) + if not os.path.isdir(folderPath): + os.mkdir(folderPath) + return False + else: + fileName = 'profileComplete.pyr' + filePath = '%s/%s' % (folderPath, fileName) + if os.path.isfile(filePath): + return True + else: + return False + + +def checkPlanetTransmission(name): + folderPath = '%s/%s' % (profileDir, name) + if not os.path.isdir(folderPath): + os.mkdir(folderPath) + return False + else: + fileName = 'transmissionComplete.pyr' + filePath = '%s/%s' % (folderPath, fileName) + if os.path.isfile(filePath): + return True + else: + return False + + +def parseCustomProfile(name): + filePath = '%s/%s.pyr' % (cwd, name) + lines = openReturnLines(filePath) + params = {'compositionRules': [], + 'temperatureRules': [], + 'molecules': [], + 'name': name, + 'molSpecific': False} + for line in lines: + if line[0] == '#' or line == '': + pass + elif 'composition' in line.lower() or 'lapse' in line.lower(): + tempDict = {} + values = line.split(':')[1].split(',') + tempDict['name'] = values[0].strip() + tempDict['finalHeight'] = float(values[1]) + tempDict['finalValue'] = float(values[2]) + if len(values) > 3: + tempDict['moleculeName'] = values[3].strip() + if 'composition' in line.lower(): + params['compositionRules'].append(tempDict) + elif 'lapse' in line.lower(): + params['temperatureRules'].append(tempDict) + elif 'surface' in line.lower(): + tempDict = {'rangeMin': 0, + 'rangeMax': 2000} + values = line.split(':')[1].split(',') + tempDict['surfacePressure'] = float(values[0]) + tempDict['surfaceTemperature'] = float(values[1]) + tempDict['maxHeight'] = float(values[2]) + tempDict['initialDepth'] = float(values[3]) + tempDict['gravity'] = float(values[4]) + if len(values) > 5: + tempDict['rangeMin'] = int(values[5]) + if len(values) > 6: + tempDict['rangeMax'] = int(values[6]) + params['initialValues'] = tempDict + elif 'molecule' in line.lower(): + values = line.split(':')[1].split(',') + try: + concentration = float(values[1]) + tempDict = {'name': values[0].lower().strip(), + 'concentration': concentration} + except ValueError: + print('invalid concentration %s in %s' % (values[1], filePath)) + exit() + params['molecules'].append(tempDict) + elif 'molspecific' in line.lower(): + if line.split(':')[1].lower().strip() == 'true': + value = True + else: + value = False + params['molSpecific'] = value + return params + + +def profileLength(name): + folderPath = '%s/%s' % (profileDir, name) + filePath = '%s/profileComplete.pyr' % folderPath + lines = openReturnLines(filePath) + for line in lines: + if line[0] == '#': + pass + else: + values = line.split(':') + if values[0].lower().strip() == 'completed': + return int(values[1]) + + +def profileWriteProgress(name, completed, expected, processingTime, moleculeSpecific, moleculeList, res): + folderPath = '%s/%s' % (profileDir, name) + fileName = 'profileProgress' + filePath = '%s/%s.pyr' % (folderPath, fileName) + text = '# profile for %s\n' \ + '# PyRad v%s\n' \ + '# total processing time: %ssecs\n' \ + 'molSpecific: %s\n' \ + 'molList: %s\n' \ + 'res: %s\n' \ + 'expected: %s\n' \ + 'completed: %s' % (name, VERSION, int(processingTime), + moleculeSpecific, ','.join(moleculeList), res, expected, completed) + openFile = open(filePath, 'wb') + openFile.write(text.encode('utf-8')) + openFile.close() + return + + +def profileProgress(name): + folderPath = '%s/%s' % (profileDir, name) + fileName = 'profileProgress' + filePath = '%s/%s.pyr' % (folderPath, fileName) + startTime = 0 + if not os.path.isfile(filePath): + return False, startTime + lines = openReturnLines(filePath) + for line in lines: + if line[0] == '#': + pass + else: + cells = line.split(':') + if cells[0] == 'completed': + completed = int(cells[1]) - 1 + elif cells[0] == 'time': + startTime = int(cells[1].strip()) + return completed, startTime + + +def emptyProfileDirectory(name): + folderPath = '%s/%s' % (profileDir, name) + if not os.path.isdir(folderPath): + return + fileList = os.listdir(folderPath) + for file in fileList: + filePath = '%s/%s' % (folderPath, file) + os.remove(filePath) + os.removedirs(folderPath) + return + + +def profileComplete(name): + folderPath = '%s/%s' % (profileDir, name) + fileName = 'profileComplete' + filePath = '%s/%s.pyr' % (folderPath, fileName) + if os.path.isfile(filePath): + return True + return False + + +def writeHeightList(folderPath, heightList): + path = '%s/%s' % (profileDir, folderPath) + fileName = 'profileHeights' + filePath = '%s/%s.pyr' % (path, fileName) + openFile = open(filePath, 'wb') + for height in heightList: + text = "%s\n" % height + openFile.write(text.encode('utf-8')) + return + + +def profileWriteTransmissionComplete(folderPath, heightList): + path = '%s/%s' % (profileDir, folderPath) + fileName = 'profileComplete' + filePath = '%s/%s.pyr' % (path, fileName) + completeProfileData = openReturnLines(filePath) + transmissionPath = '%s/transmissionComplete.pyr' % path + openFile = open(transmissionPath, 'wb') + for line in completeProfileData: + openFile.write(line.encode('utf-8')) + openFile.close() + writeHeightList(folderPath, heightList) + return + + +def profileWriteComplete(planet, completed, expected, processingTime, res, moleculeSpecific=False): + folderPath = '%s/%s' % (profileDir, planet.folderPath) + fileName = 'profileComplete' + filePath = '%s/%s.pyr' % (folderPath, fileName) + time = datetime.now() + text = '# profile for %s completed on %s\n' \ + '# PyRad v%s\n' \ + '# total processing time: %ssecs\n' \ + 'name: %s\n' \ + 'molSpecific: %s\n' \ + 'surfacePressure: %s\n' \ + 'surfaceTemperature: %s\n' \ + 'maxHeight: %s\n' \ + 'initialDepth: %s\n' \ + 'gravity: %s\n' \ + 'surfaceEffEmissivity: %s\n'\ + 'surfacePower: %s\n'\ + 'rangeMin: %s\n' \ + 'rangeMax: %s\n' \ + 'molList: %s\n' \ + 'res: %s\n' \ + 'expected: %s\n' \ + 'completed: %s' % (planet.folderPath, time.strftime("%Y-%m-%d %H:%M:%S"), VERSION, int(processingTime), + planet.folderPath, moleculeSpecific, planet.surfacePressure, planet.surfaceTemperature, + int(planet.maxHeight / 100000), planet.heightList[1], planet.gravity, + planet.effEmissivity, planet.surfacePower, planet.rangeMin, planet.rangeMax, + ','.join(planet.moleculeList), res, expected, completed) + openFile = open(filePath, 'wb') + openFile.write(text.encode('utf-8')) + openFile.close() + fileName = 'profileProgress' + filePath = '%s/%s.pyr' % (folderPath, fileName) + os.remove(filePath) + return + + +def readPlanetProfileMolecule(name, layerNumber, length, moleculeName): + folderPath = '%s/%s' % (profileDir, name) + fileName = 'Layer %s:%s' % (layerNumber, length) + filePath = '%s/%s.pyr' % (folderPath, fileName) + layerDict = {'molecule list': []} + lines = openReturnLines(filePath) + if not lines: + fileName = 'layer %s_%s' % (layerNumber, length) + filePath = '%s/%s.pyr' % (folderPath, fileName) + lines = openReturnLines(filePath) + if not lines: + print('cant find layer file %s' % filePath) + exit() + print('Reading %s profile from %s... ' % (moleculeName, fileName), end='\r', + flush=True) + for line in lines: + keyValue = line.split(':') + if line[0] == '#': + pass + elif keyValue[0].strip() == 'name': + layerDict[keyValue[0]] = keyValue[1].strip() + elif keyValue[0].strip() == '%s absCoef' % moleculeName: + absList = keyValue[1].split(',') + absCoefList = [] + for value in absList: + absCoefList.append(float(value)) + layerDict['absCoef'] = absCoefList + elif keyValue[0].strip() == 'T' or keyValue[0] == 'rangeMin' or keyValue[0] == 'rangeMax': + layerDict[keyValue[0]] = int(keyValue[1]) + elif keyValue[0].strip() == 'P' or keyValue[0].strip() == 'height' or keyValue[0].strip() == 'depth' \ + or keyValue[0].strip() == '%s concentration' % moleculeName: + layerDict[keyValue[0]] = float(keyValue[1]) + else: + pass + return layerDict + + +def readPlanetProfile(name, layerNumber, length): + folderPath = '%s/%s' % (profileDir, name) + fileName = 'Layer %s:%s' % (layerNumber, length) + filePath = '%s/%s.pyr' % (folderPath, fileName) + lines = openReturnLines(filePath) + if not lines: + fileName = 'layer %s_%s' % (layerNumber, length) + filePath = '%s/%s.pyr' % (folderPath, fileName) + lines = openReturnLines(filePath) + if not lines: + print('cant find layer file %s' % filePath) + exit() + print('Reading profile from %s... ' % fileName, end='\r', flush=True) + layerDict = {'molecule list': []} + for line in lines: + keyValue = line.split(':') + if line[0] == '#': + pass + elif keyValue[0].strip() == 'name': + layerDict[keyValue[0]] = keyValue[1].strip() + elif 'absCoef' in keyValue[0].strip(): + absList = keyValue[1].split(',') + absCoefList = [] + for value in absList: + absCoefList.append(float(value)) + layerDict[keyValue[0].strip()] = absCoefList + elif keyValue[0].strip() == 'T' or keyValue[0] == 'rangeMin' or keyValue[0] == 'rangeMax': + layerDict[keyValue[0]] = int(keyValue[1]) + elif keyValue[0].strip() == 'P' or keyValue[0].strip() == 'height' or keyValue[0].strip() == 'depth' \ + or 'concentration' in keyValue[0]: + layerDict[keyValue[0]] = float(keyValue[1]) + else: + pass + return layerDict + + def writeDictListToFile(dictionary, fullPath, comments=None, mode='wb'): openFile = open(fullPath, mode) if comments: @@ -102,35 +797,6 @@ def writeDictListToFile(dictionary, fullPath, comments=None, mode='wb'): openFile.close() -def getCurves(curveType, res): - curveDict = {} - resDirectory = '%s/res%s' % (curvesDir, res) - print('Retrieving %s curves...' % curveType, end='', flush=True) - if not os.path.isdir(resDirectory): - os.mkdir(resDirectory) - if curveType == 'voigt': - curveFilePath = '%s/voigt.pyr' % resDirectory - elif curveType == 'lorentz': - curveFilePath = '%s/lorentz.pyr' % resDirectory - elif curveType == 'gaussian': - curveFilePath = '%s/gaussian.pyr' % resDirectory - rows = openReturnLines(curveFilePath) - if rows: - for row in rows: - cells = row.strip().split(',') - key = cells.pop(0) - for i in range(0, len(cells) - 1): - if cells[i]: - try: - cells[i] = float(cells[i]) - except ValueError: - print(cells[i]) - cells.pop() - curveDict[key] = np.asarray(cells) - print('%s built from cache.' % len(curveDict)) - return curveDict - - def getMolParamsFromHitranFile(): rows = openReturnLines(molParamsFile) isotopeInfo = {} @@ -186,6 +852,7 @@ def getQData(isotope): downloadQData(isotope) return readQFile(isotope) + # downloads a table of isotopes and data from hitran def downloadMolParam(): print('Missing molecule parameters file. Downloading from http://hitran.org') @@ -208,6 +875,7 @@ def downloadMolParam(): openFile.write(chunk) openFile.close() + # downloads q table from hitran def downloadQData(isotope): url = 'http://hitran.org/data/Q/q%s.txt' % str(isotope) @@ -223,6 +891,7 @@ def downloadQData(isotope): openFile.write(chunk) openFile.close() + # downloads data from hitran using a function found in hapi that's been slightly modified def downloadHitran(path, globalID, waveMin, waveMax): params = 'molec_id,local_iso_id,nu,sw,a,elower,gamma_air,gamma_self,delta_air,n_air' @@ -233,18 +902,7 @@ def downloadHitran(path, globalID, waveMin, waveMax): '&request_params=%s' % params try: request = urlrequest.urlopen(url) - except urlexception.HTTPError: - print('Can not retrieve data for given parameters.') - openFile = open(path, 'wb') - openFile.write(bytes('%s no data available for %s, range %s-%s' % - (NULL_TAG, globalID, waveMin, waveMax), 'utf-8')) - openFile.close() - request = False - except urlexception.URLError: - print('Can not connect to %s' % str(url)) - request = False - dirLength = len(cwd) - if request: + dirLength = len(cwd) i = 0 openFile = open(path, 'wb') chunkSize = 1024 * 64 @@ -259,6 +917,14 @@ def downloadHitran(path, globalID, waveMin, waveMax): print(outputText, end='\r', flush=True) print('%s%s downloaded.\n' % (outputText, i * chunkSize), end='\r') openFile.close() + except urlexception.HTTPError: + print('Can not retrieve data for given parameters.') + openFile = open(path, 'wb') + openFile.write(bytes('%s no data available for %s, range %s-%s' % + (NULL_TAG, globalID, waveMin, waveMax), 'utf-8')) + openFile.close() + except urlexception.URLError: + print('Can not connect to %s' % str(url)) def readQ(ID, isotopeDepth): @@ -336,18 +1002,6 @@ def readMolParams(globalIso): return [globalIso, shortName, moleculeNum, isoN, abundance, q296, gj, molMass] -def writeCurveToFile(curveDict, curveName, res): - resDirectory = '%s/res%s' % (curvesDir, res) - resFile = '%s/%s.pyr' % (resDirectory, curveName) - openFile = open(resFile, 'ab') - for key in curveDict: - openFile.write(bytes('%s,' % key, 'utf-8')) - for value in curveDict[key]: - openFile.write(bytes('%s,' % value, 'utf-8')) - openFile.write(bytes('\n', 'utf-8')) - openFile.close() - - def displayAllMolecules(): newLineIter = 0 for molecule in MOLECULE_ID.keys(): @@ -357,6 +1011,7 @@ def displayAllMolecules(): newLineIter = 0 print('\n') + RES_MULTIPLIER = 1 BASE_RESOLUTION = .01 * RES_MULTIPLIER @@ -394,8 +1049,8 @@ def displayAllMolecules(): 'regularCyan': '\x1b[0;36;48m', 'colorEnd': '\x1b[0m'} -VERSION = '1.71' -titleLine = "%s*********************** PyRad v%s ***********************%s" \ +VERSION = '3.01' +titleLine = "%s****************** PyRad v%s ******************%s" \ % (TEXT_COLORS['underlineCyan'], VERSION, TEXT_COLORS['colorEnd']) messageGap = int((len(titleLine) - len(VERSION) - 1) / 2) GREETING = "%s\n\n" \ @@ -556,6 +1211,18 @@ def displayAllMolecules(): 'cf4': 42, 'c4h2': 43, 'hc3n': 44, 'h2': 45, 'cs': 46, 'so3': 47, 'c2n2': 48, 'cocl2': 49} +THEME = {'dark': {'faceColor': (29, 29, 29), + 'colorList': [(239, 244, 255), + (0, 163, 0), + (126,56, 120), + (0, 171, 169), + (185, 29,171), + (30, 113, 69), + (227, 162, 26)], + 'textColor': (239, 244, 255), + 'gridColor': (204, 204, 204)}} + +CREDIT = credit = 'PyRad v%s\n%s' % (VERSION, Settings.userName) print(GREETING) setupDir() diff --git a/sample.py b/sample.py new file mode 100644 index 0000000..b762bbf --- /dev/null +++ b/sample.py @@ -0,0 +1,9 @@ +import pyradClasses + +planet = pyradClasses.loadEmptyPlanet2('earthsimplemolspec narrow low') + + +#planet2 = pyradClasses.createCustomPlanet('marssimple') + +pyradClasses.plotPlanetAndComponents(planet, verify=True) +#pyradClasses.plotPlanetSpectrum([planet], verify=True) \ No newline at end of file diff --git a/subarctic summer.pyr b/subarctic summer.pyr new file mode 100644 index 0000000..70b5cc1 --- /dev/null +++ b/subarctic summer.pyr @@ -0,0 +1,329 @@ +# atm profile for subarctic summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 287.2, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.011899999999999999 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 2.4099999999999997e-08 +molecule: n2o, 3.1e-07 +molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 281.7 +lapse rate: lapse rule 1, 2, 276.3 +lapse rate: lapse rule 2, 3, 270.9 +lapse rate: lapse rule 3, 4, 265.5 +lapse rate: lapse rule 4, 5, 260.1 +lapse rate: lapse rule 5, 6, 253.1 +lapse rate: lapse rule 6, 7, 246.1 +lapse rate: lapse rule 7, 8, 239.2 +lapse rate: lapse rule 8, 9, 232.2 +lapse rate: lapse rule 9, 10, 225.2 +lapse rate: lapse rule 10, 11, 225.2 +lapse rate: lapse rule 11, 12, 225.2 +lapse rate: lapse rule 12, 13, 225.2 +lapse rate: lapse rule 13, 14, 225.2 +lapse rate: lapse rule 14, 15, 225.2 +lapse rate: lapse rule 15, 16, 225.2 +lapse rate: lapse rule 16, 17, 225.2 +lapse rate: lapse rule 17, 18, 225.2 +lapse rate: lapse rule 18, 19, 225.2 +lapse rate: lapse rule 19, 20, 225.2 +lapse rate: lapse rule 20, 21, 225.2 +lapse rate: lapse rule 21, 22, 225.2 +lapse rate: lapse rule 22, 23, 225.2 +lapse rate: lapse rule 23, 24, 226.6 +lapse rate: lapse rule 24, 25, 228.1 +lapse rate: lapse rule 25, 27.6, 231 +lapse rate: lapse rule 26, 30, 235.1 +lapse rate: lapse rule 27, 32.6, 240 +lapse rate: lapse rule 28, 35, 247.2 +lapse rate: lapse rule 29, 37.5, 254.6 +lapse rate: lapse rule 30, 40, 262.1 +lapse rate: lapse rule 31, 42.5, 269.5 +lapse rate: lapse rule 32, 45, 273.6 +lapse rate: lapse rule 33, 47.5, 276.2 +lapse rate: lapse rule 34, 50, 277.2 +lapse rate: lapse rule 35, 55, 274 +lapse rate: lapse rule 36, 60, 262.7 +lapse rate: lapse rule 37, 65, 239.7 +lapse rate: lapse rule 38, 70, 216.6 +lapse rate: lapse rule 39, 75, 193.6 +lapse rate: lapse rule 40, 80, 170.6 +lapse rate: lapse rule 41, 85, 161.7 +lapse rate: lapse rule 42, 90, 161.6 +lapse rate: lapse rule 43, 95, 176.8 +lapse rate: lapse rule 44, 100, 190.4 +lapse rate: lapse rule 45, 105, 226 +lapse rate: lapse rule 46, 110, 270.1 +lapse rate: lapse rule 47, 115, 322.7 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0087, h2o +composition rate: h2o rule 1, 2, 0.00675, h2o +composition rate: h2o rule 2, 3, 0.00482, h2o +composition rate: h2o rule 3, 4, 0.0033799999999999998, h2o +composition rate: h2o rule 4, 5, 0.0022199999999999998, h2o +composition rate: h2o rule 5, 6, 0.00133, h2o +composition rate: h2o rule 6, 7, 0.000797, h2o +composition rate: h2o rule 7, 8, 0.00039999999999999996, h2o +composition rate: h2o rule 8, 9, 0.00013, h2o +composition rate: h2o rule 9, 10, 4.2399999999999994e-05, h2o +composition rate: h2o rule 10, 11, 1.33e-05, h2o +composition rate: h2o rule 11, 12, 6e-06, h2o +composition rate: h2o rule 12, 13, 4.45e-06, h2o +composition rate: h2o rule 13, 14, 4e-06, h2o +composition rate: h2o rule 14, 15, 4e-06, h2o +composition rate: h2o rule 15, 16, 4e-06, h2o +composition rate: h2o rule 16, 17, 4.049999999999999e-06, h2o +composition rate: h2o rule 17, 18, 4.2999999999999995e-06, h2o +composition rate: h2o rule 18, 19, 4.5e-06, h2o +composition rate: h2o rule 19, 20, 4.599999999999999e-06, h2o +composition rate: h2o rule 20, 21, 4.7e-06, h2o +composition rate: h2o rule 21, 22, 4.8e-06, h2o +composition rate: h2o rule 22, 23, 4.8299999999999995e-06, h2o +composition rate: h2o rule 23, 24, 4.849999999999999e-06, h2o +composition rate: h2o rule 24, 25, 4.9000000000000005e-06, h2o +composition rate: h2o rule 25, 27.6, 4.95e-06, h2o +composition rate: h2o rule 26, 30, 4.9999999999999996e-06, h2o +composition rate: h2o rule 27, 32.6, 4.9999999999999996e-06, h2o +composition rate: h2o rule 28, 35, 4.9999999999999996e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 4.9999999999999996e-06, h2o +composition rate: h2o rule 31, 42.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 32, 45, 4.9999999999999996e-06, h2o +composition rate: h2o rule 33, 47.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 34, 50, 4.95e-06, h2o +composition rate: h2o rule 35, 55, 4.849999999999999e-06, h2o +composition rate: h2o rule 36, 60, 4.5e-06, h2o +composition rate: h2o rule 37, 65, 4e-06, h2o +composition rate: h2o rule 38, 70, 3.2999999999999997e-06, h2o +composition rate: h2o rule 39, 75, 2.7e-06, h2o +composition rate: h2o rule 40, 80, 2e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.69e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6699999999999999e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 7, 8, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 8, 9, 1.62e-06, ch4 +composition rate: ch4 rule 9, 10, 1.58e-06, ch4 +composition rate: ch4 rule 10, 11, 1.5399999999999999e-06, ch4 +composition rate: ch4 rule 11, 12, 1.51e-06, ch4 +composition rate: ch4 rule 12, 13, 1.47e-06, ch4 +composition rate: ch4 rule 13, 14, 1.4299999999999999e-06, ch4 +composition rate: ch4 rule 14, 15, 1.3899999999999998e-06, ch4 +composition rate: ch4 rule 15, 16, 1.34e-06, ch4 +composition rate: ch4 rule 16, 17, 1.29e-06, ch4 +composition rate: ch4 rule 17, 18, 1.2299999999999999e-06, ch4 +composition rate: ch4 rule 18, 19, 1.16e-06, ch4 +composition rate: ch4 rule 19, 20, 1.07e-06, ch4 +composition rate: ch4 rule 20, 21, 9.9e-07, ch4 +composition rate: ch4 rule 21, 22, 9.17e-07, ch4 +composition rate: ch4 rule 22, 23, 8.569999999999999e-07, ch4 +composition rate: ch4 rule 23, 24, 8.01e-07, ch4 +composition rate: ch4 rule 24, 25, 7.48e-07, ch4 +composition rate: ch4 rule 25, 27.6, 6.959999999999999e-07, ch4 +composition rate: ch4 rule 26, 30, 6.44e-07, ch4 +composition rate: ch4 rule 27, 32.6, 5.89e-07, ch4 +composition rate: ch4 rule 28, 35, 5.24e-07, ch4 +composition rate: ch4 rule 29, 37.5, 4.51e-07, ch4 +composition rate: ch4 rule 30, 40, 3.71e-07, ch4 +composition rate: ch4 rule 31, 42.5, 2.9899999999999996e-07, ch4 +composition rate: ch4 rule 32, 45, 2.45e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2e-07, ch4 +composition rate: ch4 rule 34, 50, 1.66e-07, ch4 +composition rate: ch4 rule 35, 55, 1.5e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 2.94e-08, o3 +composition rate: o3 rule 1, 2, 3.38e-08, o3 +composition rate: o3 rule 2, 3, 3.89e-08, o3 +composition rate: o3 rule 3, 4, 4.48e-08, o3 +composition rate: o3 rule 4, 5, 5.33e-08, o3 +composition rate: o3 rule 5, 6, 6.56e-08, o3 +composition rate: o3 rule 6, 7, 7.739999999999999e-08, o3 +composition rate: o3 rule 7, 8, 9.11e-08, o3 +composition rate: o3 rule 8, 9, 1.4199999999999997e-07, o3 +composition rate: o3 rule 9, 10, 1.8899999999999999e-07, o3 +composition rate: o3 rule 10, 11, 3.05e-07, o3 +composition rate: o3 rule 11, 12, 4.0999999999999994e-07, o3 +composition rate: o3 rule 12, 13, 5e-07, o3 +composition rate: o3 rule 13, 14, 6e-07, o3 +composition rate: o3 rule 14, 15, 7e-07, o3 +composition rate: o3 rule 15, 16, 8e-07, o3 +composition rate: o3 rule 16, 17, 1e-06, o3 +composition rate: o3 rule 17, 18, 1.3e-06, o3 +composition rate: o3 rule 18, 19, 1.6999999999999998e-06, o3 +composition rate: o3 rule 19, 20, 2.1e-06, o3 +composition rate: o3 rule 20, 21, 2.7e-06, o3 +composition rate: o3 rule 21, 22, 3.2999999999999997e-06, o3 +composition rate: o3 rule 22, 23, 3.7e-06, o3 +composition rate: o3 rule 23, 24, 4.2e-06, o3 +composition rate: o3 rule 24, 25, 4.5e-06, o3 +composition rate: o3 rule 25, 27.6, 5.299999999999999e-06, o3 +composition rate: o3 rule 26, 30, 5.7e-06, o3 +composition rate: o3 rule 27, 32.6, 6.9e-06, o3 +composition rate: o3 rule 28, 35, 7.699999999999999e-06, o3 +composition rate: o3 rule 29, 37.5, 7.8e-06, o3 +composition rate: o3 rule 30, 40, 7e-06, o3 +composition rate: o3 rule 31, 42.5, 5.4e-06, o3 +composition rate: o3 rule 32, 45, 4.2e-06, o3 +composition rate: o3 rule 33, 47.5, 3.2e-06, o3 +composition rate: o3 rule 34, 50, 2.4999999999999998e-06, o3 +composition rate: o3 rule 35, 55, 1.6999999999999998e-06, o3 +composition rate: o3 rule 36, 60, 1.2e-06, o3 +composition rate: o3 rule 37, 65, 8e-07, o3 +composition rate: o3 rule 38, 70, 4e-07, o3 +composition rate: o3 rule 39, 75, 2e-07, o3 +composition rate: o3 rule 40, 80, 1.8e-07, o3 +composition rate: o3 rule 41, 85, 6.5e-07, o3 +composition rate: o3 rule 42, 90, 9e-07, o3 +composition rate: o3 rule 43, 95, 8e-07, o3 +composition rate: o3 rule 44, 100, 4e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.1e-07, n2o +composition rate: n2o rule 1, 2, 3.1e-07, n2o +composition rate: n2o rule 2, 3, 3.1e-07, n2o +composition rate: n2o rule 3, 4, 3.08e-07, n2o +composition rate: n2o rule 4, 5, 3.02e-07, n2o +composition rate: n2o rule 5, 6, 2.9099999999999995e-07, n2o +composition rate: n2o rule 6, 7, 2.8199999999999996e-07, n2o +composition rate: n2o rule 7, 8, 2.7600000000000004e-07, n2o +composition rate: n2o rule 8, 9, 2.7e-07, n2o +composition rate: n2o rule 9, 10, 2.65e-07, n2o +composition rate: n2o rule 10, 11, 2.6e-07, n2o +composition rate: n2o rule 11, 12, 2.55e-07, n2o +composition rate: n2o rule 12, 13, 2.4899999999999997e-07, n2o +composition rate: n2o rule 13, 14, 2.43e-07, n2o +composition rate: n2o rule 14, 15, 2.3599999999999997e-07, n2o +composition rate: n2o rule 15, 16, 2.28e-07, n2o +composition rate: n2o rule 16, 17, 2.18e-07, n2o +composition rate: n2o rule 17, 18, 2.0399999999999997e-07, n2o +composition rate: n2o rule 18, 19, 1.82e-07, n2o +composition rate: n2o rule 19, 20, 1.57e-07, n2o +composition rate: n2o rule 20, 21, 1.35e-07, n2o +composition rate: n2o rule 21, 22, 1.2199999999999998e-07, n2o +composition rate: n2o rule 22, 23, 1.0999999999999999e-07, n2o +composition rate: n2o rule 23, 24, 9.889999999999999e-08, n2o +composition rate: n2o rule 24, 25, 8.78e-08, n2o +composition rate: n2o rule 25, 27.6, 7.33e-08, n2o +composition rate: n2o rule 26, 30, 5.9399999999999996e-08, n2o +composition rate: n2o rule 27, 32.6, 4.15e-08, n2o +composition rate: n2o rule 28, 35, 3.03e-08, n2o +composition rate: n2o rule 29, 37.5, 1.95e-08, n2o +composition rate: n2o rule 30, 40, 1.27e-08, n2o +composition rate: n2o rule 31, 42.5, 9e-09, n2o +composition rate: n2o rule 32, 45, 6.2899999999999996e-09, n2o +composition rate: n2o rule 33, 47.5, 4.56e-09, n2o +composition rate: n2o rule 34, 50, 2.8e-09, n2o +composition rate: n2o rule 35, 55, 1.77e-09, n2o +composition rate: n2o rule 36, 60, 1.21e-09, n2o +composition rate: n2o rule 37, 65, 8.869999999999999e-10, n2o +composition rate: n2o rule 38, 70, 6.759999999999999e-10, n2o +composition rate: n2o rule 39, 75, 5.539999999999999e-10, n2o +composition rate: n2o rule 40, 80, 4.65e-10, n2o +composition rate: n2o rule 41, 85, 3.98e-10, n2o +composition rate: n2o rule 42, 90, 3.05e-10, n2o +composition rate: n2o rule 43, 95, 2.7099999999999994e-10, n2o +composition rate: n2o rule 44, 100, 2.44e-10, n2o +composition rate: n2o rule 45, 105, 2.2099999999999999e-10, n2o +composition rate: n2o rule 46, 110, 2.02e-10, n2o +composition rate: n2o rule 47, 115, 1.8399999999999998e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 1.45e-07, co +composition rate: co rule 1, 2, 1.4e-07, co +composition rate: co rule 2, 3, 1.35e-07, co +composition rate: co rule 3, 4, 1.31e-07, co +composition rate: co rule 4, 5, 1.3e-07, co +composition rate: co rule 5, 6, 1.29e-07, co +composition rate: co rule 6, 7, 1.25e-07, co +composition rate: co rule 7, 8, 1.19e-07, co +composition rate: co rule 8, 9, 1.09e-07, co +composition rate: co rule 9, 10, 9.959999999999999e-08, co +composition rate: co rule 10, 11, 8.96e-08, co +composition rate: co rule 11, 12, 7.81e-08, co +composition rate: co rule 12, 13, 6.370000000000001e-08, co +composition rate: co rule 13, 14, 5.0299999999999994e-08, co +composition rate: co rule 14, 15, 3.9399999999999995e-08, co +composition rate: co rule 15, 16, 3.07e-08, co +composition rate: co rule 16, 17, 2.4899999999999998e-08, co +composition rate: co rule 17, 18, 1.9699999999999998e-08, co +composition rate: co rule 18, 19, 1.55e-08, co +composition rate: co rule 19, 20, 1.3299999999999998e-08, co +composition rate: co rule 20, 21, 1.23e-08, co +composition rate: co rule 21, 22, 1.23e-08, co +composition rate: co rule 22, 23, 1.31e-08, co +composition rate: co rule 23, 24, 1.4e-08, co +composition rate: co rule 24, 25, 1.51e-08, co +composition rate: co rule 25, 27.6, 1.65e-08, co +composition rate: co rule 26, 30, 1.81e-08, co +composition rate: co rule 27, 32.6, 2e-08, co +composition rate: co rule 28, 35, 2.18e-08, co +composition rate: co rule 29, 37.5, 2.34e-08, co +composition rate: co rule 30, 40, 2.5e-08, co +composition rate: co rule 31, 42.5, 2.65e-08, co +composition rate: co rule 32, 45, 2.81e-08, co +composition rate: co rule 33, 47.5, 3e-08, co +composition rate: co rule 34, 50, 3.22e-08, co +composition rate: co rule 35, 55, 3.6499999999999996e-08, co +composition rate: co rule 36, 60, 4.59e-08, co +composition rate: co rule 37, 65, 8.38e-08, co +composition rate: co rule 38, 70, 1.1799999999999998e-07, co +composition rate: co rule 39, 75, 3.03e-07, co +composition rate: co rule 40, 80, 7.89e-07, co +composition rate: co rule 41, 85, 1.82e-06, co +composition rate: co rule 42, 90, 3.3999999999999996e-06, co +composition rate: co rule 43, 95, 5.92e-06, co +composition rate: co rule 44, 100, 1.04e-05, co +composition rate: co rule 45, 105, 1.88e-05, co +composition rate: co rule 46, 110, 2.87e-05, co +composition rate: co rule 47, 115, 3.89e-05, co +composition rate: co rule 48, 120, 4.9999999999999996e-05, co diff --git a/subarctic winter.pyr b/subarctic winter.pyr new file mode 100644 index 0000000..05df492 --- /dev/null +++ b/subarctic winter.pyr @@ -0,0 +1,329 @@ +# atm profile for subarctic winter + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 257.2, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.00141 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 1.8e-08 +molecule: n2o, 3.1e-07 +molecule: co, 3.2e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 239.1 +lapse rate: lapse rule 1, 2, 255.9 +lapse rate: lapse rule 2, 3, 252.7 +lapse rate: lapse rule 3, 4, 247.7 +lapse rate: lapse rule 4, 5, 240.9 +lapse rate: lapse rule 5, 6, 234.1 +lapse rate: lapse rule 6, 7, 227.3 +lapse rate: lapse rule 7, 8, 220.6 +lapse rate: lapse rule 8, 9, 217.2 +lapse rate: lapse rule 9, 10, 217.2 +lapse rate: lapse rule 10, 11, 217.2 +lapse rate: lapse rule 11, 12, 217.2 +lapse rate: lapse rule 12, 13, 217.2 +lapse rate: lapse rule 13, 14, 217.2 +lapse rate: lapse rule 14, 15, 217.2 +lapse rate: lapse rule 15, 16, 216.6 +lapse rate: lapse rule 16, 17, 216 +lapse rate: lapse rule 17, 18, 215.4 +lapse rate: lapse rule 18, 19, 214.8 +lapse rate: lapse rule 19, 20, 214.2 +lapse rate: lapse rule 20, 21, 213.6 +lapse rate: lapse rule 21, 22, 213 +lapse rate: lapse rule 22, 23, 212.4 +lapse rate: lapse rule 23, 24, 211.8 +lapse rate: lapse rule 24, 25, 211.2 +lapse rate: lapse rule 25, 27.6, 213.6 +lapse rate: lapse rule 26, 30, 216 +lapse rate: lapse rule 27, 32.6, 218.5 +lapse rate: lapse rule 28, 35, 222.3 +lapse rate: lapse rule 29, 37.5, 228.5 +lapse rate: lapse rule 30, 40, 234.7 +lapse rate: lapse rule 31, 42.5, 240.8 +lapse rate: lapse rule 32, 45, 247 +lapse rate: lapse rule 33, 47.5, 253.2 +lapse rate: lapse rule 34, 50, 259.3 +lapse rate: lapse rule 35, 55, 259.1 +lapse rate: lapse rule 36, 60, 250.9 +lapse rate: lapse rule 37, 65, 248.4 +lapse rate: lapse rule 38, 70, 245.4 +lapse rate: lapse rule 39, 75, 234.7 +lapse rate: lapse rule 40, 80, 223.9 +lapse rate: lapse rule 41, 85, 213.1 +lapse rate: lapse rule 42, 90, 202.3 +lapse rate: lapse rule 43, 95, 211 +lapse rate: lapse rule 44, 100, 218.5 +lapse rate: lapse rule 45, 105, 234 +lapse rate: lapse rule 46, 110, 252.6 +lapse rate: lapse rule 47, 115, 288.5 +lapse rate: lapse rule 48, 120, 333 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.00162, h2o +composition rate: h2o rule 1, 2, 0.0014299999999999998, h2o +composition rate: h2o rule 2, 3, 0.00117, h2o +composition rate: h2o rule 3, 4, 0.007899999999999999, h2o +composition rate: h2o rule 4, 5, 0.00043099999999999996, h2o +composition rate: h2o rule 5, 6, 0.00027, h2o +composition rate: h2o rule 6, 7, 0.000147, h2o +composition rate: h2o rule 7, 8, 3.3799999999999995e-05, h2o +composition rate: h2o rule 8, 9, 2.98e-05, h2o +composition rate: h2o rule 9, 10, 1.9999999999999998e-05, h2o +composition rate: h2o rule 10, 11, 9.999999999999999e-06, h2o +composition rate: h2o rule 11, 12, 6e-06, h2o +composition rate: h2o rule 12, 13, 4.45e-06, h2o +composition rate: h2o rule 13, 14, 4.5e-06, h2o +composition rate: h2o rule 14, 15, 4.55e-06, h2o +composition rate: h2o rule 15, 16, 4.65e-06, h2o +composition rate: h2o rule 16, 17, 4.65e-06, h2o +composition rate: h2o rule 17, 18, 4.749999999999999e-06, h2o +composition rate: h2o rule 18, 19, 4.749999999999999e-06, h2o +composition rate: h2o rule 19, 20, 4.849999999999999e-06, h2o +composition rate: h2o rule 20, 21, 4.849999999999999e-06, h2o +composition rate: h2o rule 21, 22, 4.9000000000000005e-06, h2o +composition rate: h2o rule 22, 23, 4.95e-06, h2o +composition rate: h2o rule 23, 24, 4.9999999999999996e-06, h2o +composition rate: h2o rule 24, 25, 4.9999999999999996e-06, h2o +composition rate: h2o rule 25, 27.6, 4.9999999999999996e-06, h2o +composition rate: h2o rule 26, 30, 4.9999999999999996e-06, h2o +composition rate: h2o rule 27, 32.6, 4.9999999999999996e-06, h2o +composition rate: h2o rule 28, 35, 4.9999999999999996e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 4.9999999999999996e-06, h2o +composition rate: h2o rule 31, 42.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 32, 45, 4.9999999999999996e-06, h2o +composition rate: h2o rule 33, 47.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 34, 50, 4.95e-06, h2o +composition rate: h2o rule 35, 55, 4.849999999999999e-06, h2o +composition rate: h2o rule 36, 60, 4.5e-06, h2o +composition rate: h2o rule 37, 65, 4e-06, h2o +composition rate: h2o rule 38, 70, 3.2999999999999997e-06, h2o +composition rate: h2o rule 39, 75, 2.7e-06, h2o +composition rate: h2o rule 40, 80, 2e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.69e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6699999999999999e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 7, 8, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 8, 9, 1.62e-06, ch4 +composition rate: ch4 rule 9, 10, 1.58e-06, ch4 +composition rate: ch4 rule 10, 11, 1.5399999999999999e-06, ch4 +composition rate: ch4 rule 11, 12, 1.51e-06, ch4 +composition rate: ch4 rule 12, 13, 1.47e-06, ch4 +composition rate: ch4 rule 13, 14, 1.4299999999999999e-06, ch4 +composition rate: ch4 rule 14, 15, 1.3899999999999998e-06, ch4 +composition rate: ch4 rule 15, 16, 1.34e-06, ch4 +composition rate: ch4 rule 16, 17, 1.29e-06, ch4 +composition rate: ch4 rule 17, 18, 1.2299999999999999e-06, ch4 +composition rate: ch4 rule 18, 19, 1.16e-06, ch4 +composition rate: ch4 rule 19, 20, 1.08e-06, ch4 +composition rate: ch4 rule 20, 21, 1.0099999999999999e-06, ch4 +composition rate: ch4 rule 21, 22, 9.559999999999998e-07, ch4 +composition rate: ch4 rule 22, 23, 9.01e-07, ch4 +composition rate: ch4 rule 23, 24, 8.48e-07, ch4 +composition rate: ch4 rule 24, 25, 7.96e-07, ch4 +composition rate: ch4 rule 25, 27.6, 7.45e-07, ch4 +composition rate: ch4 rule 26, 30, 6.939999999999999e-07, ch4 +composition rate: ch4 rule 27, 32.6, 6.43e-07, ch4 +composition rate: ch4 rule 28, 35, 5.879999999999999e-07, ch4 +composition rate: ch4 rule 29, 37.5, 5.24e-07, ch4 +composition rate: ch4 rule 30, 40, 4.51e-07, ch4 +composition rate: ch4 rule 31, 42.5, 3.71e-07, ch4 +composition rate: ch4 rule 32, 45, 3e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2.45e-07, ch4 +composition rate: ch4 rule 34, 50, 1.98e-07, ch4 +composition rate: ch4 rule 35, 55, 1.59e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 2e-08, o3 +composition rate: o3 rule 1, 2, 2.34e-08, o3 +composition rate: o3 rule 2, 3, 2.7699999999999997e-08, o3 +composition rate: o3 rule 3, 4, 3.25e-08, o3 +composition rate: o3 rule 4, 5, 3.7999999999999996e-08, o3 +composition rate: o3 rule 5, 6, 4.4499999999999995e-08, o3 +composition rate: o3 rule 6, 7, 7.25e-08, o3 +composition rate: o3 rule 7, 8, 1.0399999999999999e-07, o3 +composition rate: o3 rule 8, 9, 2.0999999999999997e-07, o3 +composition rate: o3 rule 9, 10, 3e-07, o3 +composition rate: o3 rule 10, 11, 3.5e-07, o3 +composition rate: o3 rule 11, 12, 4e-07, o3 +composition rate: o3 rule 12, 13, 6.5e-07, o3 +composition rate: o3 rule 13, 14, 9e-07, o3 +composition rate: o3 rule 14, 15, 1.2e-06, o3 +composition rate: o3 rule 15, 16, 1.5e-06, o3 +composition rate: o3 rule 16, 17, 1.8999999999999998e-06, o3 +composition rate: o3 rule 17, 18, 2.4500000000000003e-06, o3 +composition rate: o3 rule 18, 19, 3.1e-06, o3 +composition rate: o3 rule 19, 20, 3.7e-06, o3 +composition rate: o3 rule 20, 21, 4e-06, o3 +composition rate: o3 rule 21, 22, 4.2e-06, o3 +composition rate: o3 rule 22, 23, 4.5e-06, o3 +composition rate: o3 rule 23, 24, 4.599999999999999e-06, o3 +composition rate: o3 rule 24, 25, 4.7e-06, o3 +composition rate: o3 rule 25, 27.6, 4.9000000000000005e-06, o3 +composition rate: o3 rule 26, 30, 5.4e-06, o3 +composition rate: o3 rule 27, 32.6, 5.9e-06, o3 +composition rate: o3 rule 28, 35, 6.2e-06, o3 +composition rate: o3 rule 29, 37.5, 6.2499999999999995e-06, o3 +composition rate: o3 rule 30, 40, 5.9e-06, o3 +composition rate: o3 rule 31, 42.5, 5.0999999999999995e-06, o3 +composition rate: o3 rule 32, 45, 4.1e-06, o3 +composition rate: o3 rule 33, 47.5, 3e-06, o3 +composition rate: o3 rule 34, 50, 2.6e-06, o3 +composition rate: o3 rule 35, 55, 1.6e-06, o3 +composition rate: o3 rule 36, 60, 9.499999999999999e-07, o3 +composition rate: o3 rule 37, 65, 6.5e-07, o3 +composition rate: o3 rule 38, 70, 5e-07, o3 +composition rate: o3 rule 39, 75, 3.3e-07, o3 +composition rate: o3 rule 40, 80, 1.3e-07, o3 +composition rate: o3 rule 41, 85, 7.5e-07, o3 +composition rate: o3 rule 42, 90, 8e-07, o3 +composition rate: o3 rule 43, 95, 8e-07, o3 +composition rate: o3 rule 44, 100, 4e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.1e-07, n2o +composition rate: n2o rule 1, 2, 3.1e-07, n2o +composition rate: n2o rule 2, 3, 3.1e-07, n2o +composition rate: n2o rule 3, 4, 3.08e-07, n2o +composition rate: n2o rule 4, 5, 3.02e-07, n2o +composition rate: n2o rule 5, 6, 2.9099999999999995e-07, n2o +composition rate: n2o rule 6, 7, 2.8199999999999996e-07, n2o +composition rate: n2o rule 7, 8, 2.7600000000000004e-07, n2o +composition rate: n2o rule 8, 9, 2.7e-07, n2o +composition rate: n2o rule 9, 10, 2.65e-07, n2o +composition rate: n2o rule 10, 11, 2.6e-07, n2o +composition rate: n2o rule 11, 12, 2.55e-07, n2o +composition rate: n2o rule 12, 13, 2.4899999999999997e-07, n2o +composition rate: n2o rule 13, 14, 2.43e-07, n2o +composition rate: n2o rule 14, 15, 2.3599999999999997e-07, n2o +composition rate: n2o rule 15, 16, 2.28e-07, n2o +composition rate: n2o rule 16, 17, 2.18e-07, n2o +composition rate: n2o rule 17, 18, 2.0399999999999997e-07, n2o +composition rate: n2o rule 18, 19, 1.82e-07, n2o +composition rate: n2o rule 19, 20, 1.57e-07, n2o +composition rate: n2o rule 20, 21, 1.35e-07, n2o +composition rate: n2o rule 21, 22, 1.2199999999999998e-07, n2o +composition rate: n2o rule 22, 23, 1.0999999999999999e-07, n2o +composition rate: n2o rule 23, 24, 9.889999999999999e-08, n2o +composition rate: n2o rule 24, 25, 8.78e-08, n2o +composition rate: n2o rule 25, 27.6, 7.33e-08, n2o +composition rate: n2o rule 26, 30, 5.9399999999999996e-08, n2o +composition rate: n2o rule 27, 32.6, 4.15e-08, n2o +composition rate: n2o rule 28, 35, 3.03e-08, n2o +composition rate: n2o rule 29, 37.5, 1.95e-08, n2o +composition rate: n2o rule 30, 40, 1.27e-08, n2o +composition rate: n2o rule 31, 42.5, 9e-09, n2o +composition rate: n2o rule 32, 45, 6.2899999999999996e-09, n2o +composition rate: n2o rule 33, 47.5, 4.56e-09, n2o +composition rate: n2o rule 34, 50, 2.8e-09, n2o +composition rate: n2o rule 35, 55, 1.77e-09, n2o +composition rate: n2o rule 36, 60, 1.21e-09, n2o +composition rate: n2o rule 37, 65, 8.869999999999999e-10, n2o +composition rate: n2o rule 38, 70, 6.759999999999999e-10, n2o +composition rate: n2o rule 39, 75, 5.539999999999999e-10, n2o +composition rate: n2o rule 40, 80, 4.65e-10, n2o +composition rate: n2o rule 41, 85, 3.98e-10, n2o +composition rate: n2o rule 42, 90, 3.05e-10, n2o +composition rate: n2o rule 43, 95, 2.7099999999999994e-10, n2o +composition rate: n2o rule 44, 100, 2.44e-10, n2o +composition rate: n2o rule 45, 105, 2.2099999999999999e-10, n2o +composition rate: n2o rule 46, 110, 2.02e-10, n2o +composition rate: n2o rule 47, 115, 1.8399999999999998e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 3.2e-07, co +composition rate: co rule 1, 2, 3.2e-07, co +composition rate: co rule 2, 3, 3.2e-07, co +composition rate: co rule 3, 4, 3.2e-07, co +composition rate: co rule 4, 5, 3.2e-07, co +composition rate: co rule 5, 6, 3.2e-07, co +composition rate: co rule 6, 7, 3.2e-07, co +composition rate: co rule 7, 8, 3.2e-07, co +composition rate: co rule 8, 9, 3.1599999999999997e-07, co +composition rate: co rule 9, 10, 3.1e-07, co +composition rate: co rule 10, 11, 2.9e-07, co +composition rate: co rule 11, 12, 2.9399999999999996e-07, co +composition rate: co rule 12, 13, 2.8599999999999994e-07, co +composition rate: co rule 13, 14, 2.8e-07, co +composition rate: co rule 14, 15, 2.7e-07, co +composition rate: co rule 15, 16, 2.61e-07, co +composition rate: co rule 16, 17, 2.4199999999999997e-07, co +composition rate: co rule 17, 18, 2.17e-07, co +composition rate: co rule 18, 19, 1.8399999999999998e-07, co +composition rate: co rule 19, 20, 1.62e-07, co +composition rate: co rule 20, 21, 1.36e-07, co +composition rate: co rule 21, 22, 1.23e-07, co +composition rate: co rule 22, 23, 1.12e-07, co +composition rate: co rule 23, 24, 1.0399999999999999e-07, co +composition rate: co rule 24, 25, 9.569999999999999e-08, co +composition rate: co rule 25, 27.6, 6.6e-08, co +composition rate: co rule 26, 30, 7.31e-08, co +composition rate: co rule 27, 32.6, 5.7099999999999995e-08, co +composition rate: co rule 28, 35, 4.6699999999999995e-08, co +composition rate: co rule 29, 37.5, 3.44e-08, co +composition rate: co rule 30, 40, 2.47e-08, co +composition rate: co rule 31, 42.5, 1.6299999999999997e-08, co +composition rate: co rule 32, 45, 1.0699999999999998e-08, co +composition rate: co rule 33, 47.5, 7.06e-09, co +composition rate: co rule 34, 50, 3.969999999999999e-09, co +composition rate: co rule 35, 55, 2.51e-09, co +composition rate: co rule 36, 60, 1.7299999999999998e-09, co +composition rate: co rule 37, 65, 1.26e-09, co +composition rate: co rule 38, 70, 9.6e-10, co +composition rate: co rule 39, 75, 7.55e-10, co +composition rate: co rule 40, 80, 6.1e-10, co +composition rate: co rule 41, 85, 5.019999999999999e-10, co +composition rate: co rule 42, 90, 4.21e-10, co +composition rate: co rule 43, 95, 3.5799999999999995e-10, co +composition rate: co rule 44, 100, 3.0799999999999997e-10, co +composition rate: co rule 45, 105, 2.68e-10, co +composition rate: co rule 46, 110, 2.3499999999999996e-10, co +composition rate: co rule 47, 115, 2.0799999999999998e-10, co +composition rate: co rule 48, 120, 1.8499999999999998e-10, co diff --git a/themes/dark.pyr b/themes/dark.pyr new file mode 100644 index 0000000..7244948 --- /dev/null +++ b/themes/dark.pyr @@ -0,0 +1,48 @@ +# created by PyRad v3.0 on 2018-10-27 09:53:17. +# values are (r, g, b) [0-255] +# placing color names next to them isn't necessary, just helps correct a color if you don't like it later +# don't put comments after the color values + +# dark grey +faceColor: 29, 29, 29 + +# light grey +gridList: 240, 240, 240 +gridList: 210, 210, 210 +gridList: 170, 170, 170 +gridList: 130, 130, 130 +gridList: 90, 90, 90 + +# backingcolor used for backing the composite plots. For composite plots, the other colors alphas will be adjusted down, +# so they will become a tint of the backingcolor. backingColor should be an grayscale/white/black that will stand out +# on the faceColor well. + +backingColor: 200, 200, 200 + +# light grey +textColor: 240, 240, 240 + +# mint green +colorList: 120, 255, 120 + +# dark blue +colorList: 0, 125, 255 + +# dark purple +colorList: 180, 65, 180 + +# dark red +colorList: 255, 50, 50 + +# dark teal +colorList: 60, 170, 170 + +# orange +colorList: 255, 95, 0 + +# yellow +colorList: 255, 255, 0 + +colorList: 120, 205, 120 +colorList: 0, 95, 255 +colorList: 180, 95, 180 \ No newline at end of file diff --git a/themes/light.pyr b/themes/light.pyr new file mode 100644 index 0000000..ccb7ddb --- /dev/null +++ b/themes/light.pyr @@ -0,0 +1,39 @@ +# created by PyRad v3.0 on 2018-10-27 09:53:17. +# values are (r, g, b) [0-255] + +# dark grey +textColor: 50, 50, 50 + +# greys +gridList: 30, 30, 30 +gridList: 70, 70, 70 +gridList: 110, 110, 110 +gridList: 150, 150, 150 +gridList: 190, 190, 190 + +# lighter gray +faceColor: 215, 215, 215 + +# mid gray +colorList: 140, 140, 140 + +# light green +colorList: 60, 255, 130 + +# orange +colorList: 227, 162, 26 + +# light blue +colorList: 120, 120, 255 + +# teal +colorList: 50, 170, 170 + +# light red/pink +colorList: 255, 100, 100 + +# light purple +colorList: 190, 160, 190 + +# yellow +colorList: 255, 255, 100 diff --git a/trace gas ch4 0.pyr b/trace gas ch4 0.pyr new file mode 100644 index 0000000..67016f6 --- /dev/null +++ b/trace gas ch4 0.pyr @@ -0,0 +1,120 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +#molecule: ch4, 0.000000806 +#molecule: o3, 3.02e-08 +#molecule: n2o, 0.000000275 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o diff --git a/trace gas ch4 8e-7.pyr b/trace gas ch4 8e-7.pyr new file mode 100644 index 0000000..791dc06 --- /dev/null +++ b/trace gas ch4 8e-7.pyr @@ -0,0 +1,120 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 0.000000806 +#molecule: o3, 3.02e-08 +#molecule: n2o, 0.000000275 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o diff --git a/trace gas ch4 8e-8.pyr b/trace gas ch4 8e-8.pyr new file mode 100644 index 0000000..a1f7f70 --- /dev/null +++ b/trace gas ch4 8e-8.pyr @@ -0,0 +1,120 @@ +# atm profile for midlatitude summer + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 294.2, 120, 250, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0186 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 0.0000000806 +#molecule: o3, 3.02e-08 +#molecule: n2o, 0.000000275 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 289.7 +lapse rate: lapse rule 1, 2, 295.2 +lapse rate: lapse rule 2, 3, 279.2 +lapse rate: lapse rule 3, 4, 273.2 +lapse rate: lapse rule 4, 5, 287.2 +lapse rate: lapse rule 5, 6, 261.2 +lapse rate: lapse rule 6, 7, 254.7 +lapse rate: lapse rule 7, 8, 248.2 +lapse rate: lapse rule 8, 9, 241.7 +lapse rate: lapse rule 9, 10, 235.3 +lapse rate: lapse rule 10, 11, 228.8 +lapse rate: lapse rule 11, 12, 222.3 +lapse rate: lapse rule 12, 13, 215.8 +lapse rate: lapse rule 13, 14, 215.7 +lapse rate: lapse rule 14, 15, 215.7 +lapse rate: lapse rule 15, 16, 215.7 +lapse rate: lapse rule 16, 17, 215.7 +lapse rate: lapse rule 17, 18, 216.8 +lapse rate: lapse rule 18, 19, 217.9 +lapse rate: lapse rule 19, 20, 219.2 +lapse rate: lapse rule 20, 21, 220.4 +lapse rate: lapse rule 21, 22, 221.6 +lapse rate: lapse rule 22, 23, 222.8 +lapse rate: lapse rule 23, 24, 223.9 +lapse rate: lapse rule 24, 25, 225.1 +lapse rate: lapse rule 25, 27.6, 228.5 +lapse rate: lapse rule 26, 30, 233.7 +lapse rate: lapse rule 27, 32.6, 239 +lapse rate: lapse rule 28, 35, 245.2 +lapse rate: lapse rule 29, 37.5, 251.3 +lapse rate: lapse rule 30, 40, 257.5 +lapse rate: lapse rule 31, 42.5, 263.7 +lapse rate: lapse rule 32, 45, 269.9 +lapse rate: lapse rule 33, 47.5, 275.2 +lapse rate: lapse rule 34, 50, 275.7 +lapse rate: lapse rule 35, 55, 269.3 +lapse rate: lapse rule 36, 60, 257.1 +lapse rate: lapse rule 37, 65, 240.1 +lapse rate: lapse rule 38, 70, 218 +lapse rate: lapse rule 39, 75, 196.1 +lapse rate: lapse rule 40, 80, 174.1 +lapse rate: lapse rule 41, 85, 165.1 +lapse rate: lapse rule 42, 90, 165 +lapse rate: lapse rule 43, 95, 178.3 +lapse rate: lapse rule 44, 100, 190.5 +lapse rate: lapse rule 45, 105, 222.2 +lapse rate: lapse rule 46, 110, 262.4 +lapse rate: lapse rule 47, 115, 316.8 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.0138, h2o +composition rate: h2o rule 1, 2, 0.00968, h2o +composition rate: h2o rule 2, 3, 0.00598, h2o +composition rate: h2o rule 3, 4, 0.00381, h2o +composition rate: h2o rule 4, 5, 0.0022299999999999998, h2o +composition rate: h2o rule 5, 6, 0.0015099999999999998, h2o +composition rate: h2o rule 6, 7, 0.0010199999999999999, h2o +composition rate: h2o rule 7, 8, 0.000646, h2o +composition rate: h2o rule 8, 9, 0.00041299999999999996, h2o +composition rate: h2o rule 9, 10, 0.000247, h2o +composition rate: h2o rule 10, 11, 9.559999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.9399999999999996e-05, h2o +composition rate: h2o rule 12, 13, 8e-06, h2o +composition rate: h2o rule 13, 14, 4.9999999999999996e-06, h2o +composition rate: h2o rule 14, 15, 3.3999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.2999999999999997e-06, h2o +composition rate: h2o rule 16, 17, 3.2e-06, h2o +composition rate: h2o rule 17, 18, 3.15e-06, h2o +composition rate: h2o rule 18, 19, 3.2e-06, h2o +composition rate: h2o rule 19, 20, 3.2999999999999997e-06, h2o +composition rate: h2o rule 20, 21, 3.45e-06, h2o +composition rate: h2o rule 21, 22, 3.6e-06, h2o +composition rate: h2o rule 22, 23, 3.8499999999999996e-06, h2o +composition rate: h2o rule 23, 24, 4e-06, h2o +composition rate: h2o rule 24, 25, 4.2e-06, h2o +composition rate: h2o rule 25, 27.6, 4.45e-06, h2o +composition rate: h2o rule 26, 30, 4.7e-06, h2o +composition rate: h2o rule 27, 32.6, 4.87e-06, h2o +composition rate: h2o rule 28, 35, 4.95e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9999999999999996e-06, h2o +composition rate: h2o rule 30, 40, 5.0999999999999995e-06, h2o +composition rate: h2o rule 31, 42.5, 5.299999999999999e-06, h2o +composition rate: h2o rule 32, 45, 5.45e-06, h2o +composition rate: h2o rule 33, 47.5, 5.5e-06, h2o +composition rate: h2o rule 34, 50, 5.5e-06, h2o +composition rate: h2o rule 35, 55, 5.35e-06, h2o +composition rate: h2o rule 36, 60, 4.9999999999999996e-06, h2o +composition rate: h2o rule 37, 65, 4.4e-06, h2o +composition rate: h2o rule 38, 70, 3.7e-06, h2o +composition rate: h2o rule 39, 75, 2.95e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o diff --git a/tropical.pyr b/tropical.pyr new file mode 100644 index 0000000..b0128b9 --- /dev/null +++ b/tropical.pyr @@ -0,0 +1,329 @@ +# atm profile for tropical + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 299.7, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.0259 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 2.9699999999999998e-08 +molecule: n2o, 3.2e-07 +molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 293.7 +lapse rate: lapse rule 1, 2, 287.7 +lapse rate: lapse rule 2, 3, 283.7 +lapse rate: lapse rule 3, 4, 277 +lapse rate: lapse rule 4, 5, 270.3 +lapse rate: lapse rule 5, 6, 263.6 +lapse rate: lapse rule 6, 7, 257 +lapse rate: lapse rule 7, 8, 250.3 +lapse rate: lapse rule 8, 9, 243.6 +lapse rate: lapse rule 9, 10, 237 +lapse rate: lapse rule 10, 11, 230.1 +lapse rate: lapse rule 11, 12, 223.6 +lapse rate: lapse rule 12, 13, 217 +lapse rate: lapse rule 13, 14, 210.3 +lapse rate: lapse rule 14, 15, 203.7 +lapse rate: lapse rule 15, 16, 197 +lapse rate: lapse rule 16, 17, 164.8 +lapse rate: lapse rule 17, 18, 168.8 +lapse rate: lapse rule 18, 19, 202.7 +lapse rate: lapse rule 19, 20, 206.7 +lapse rate: lapse rule 20, 21, 210.7 +lapse rate: lapse rule 21, 22, 214.6 +lapse rate: lapse rule 22, 23, 217 +lapse rate: lapse rule 23, 24, 219.2 +lapse rate: lapse rule 24, 25, 221.4 +lapse rate: lapse rule 25, 27.6, 227 +lapse rate: lapse rule 26, 30, 232.3 +lapse rate: lapse rule 27, 32.6, 237.7 +lapse rate: lapse rule 28, 35, 243.1 +lapse rate: lapse rule 29, 37.5, 248.5 +lapse rate: lapse rule 30, 40, 254 +lapse rate: lapse rule 31, 42.5, 259.4 +lapse rate: lapse rule 32, 45, 264.8 +lapse rate: lapse rule 33, 47.5, 269.6 +lapse rate: lapse rule 34, 50, 270.2 +lapse rate: lapse rule 35, 55, 263.4 +lapse rate: lapse rule 36, 60, 253.1 +lapse rate: lapse rule 37, 65, 236 +lapse rate: lapse rule 38, 70, 218.9 +lapse rate: lapse rule 39, 75, 201.8 +lapse rate: lapse rule 40, 80, 184.8 +lapse rate: lapse rule 41, 85, 177.1 +lapse rate: lapse rule 42, 90, 177 +lapse rate: lapse rule 43, 95, 184.3 +lapse rate: lapse rule 44, 100, 190.7 +lapse rate: lapse rule 45, 105, 212 +lapse rate: lapse rule 46, 110, 241.6 +lapse rate: lapse rule 47, 115, 299.7 +lapse rate: lapse rule 48, 120, 380 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.012499999999999999, h2o +composition rate: h2o rule 1, 2, 0.0153, h2o +composition rate: h2o rule 2, 3, 0.0086, h2o +composition rate: h2o rule 3, 4, 0.0044399999999999995, h2o +composition rate: h2o rule 4, 5, 0.0033499999999999997, h2o +composition rate: h2o rule 5, 6, 0.0021, h2o +composition rate: h2o rule 6, 7, 0.00129, h2o +composition rate: h2o rule 7, 8, 0.0007639999999999999, h2o +composition rate: h2o rule 8, 9, 0.00041, h2o +composition rate: h2o rule 9, 10, 0.00019099999999999998, h2o +composition rate: h2o rule 10, 11, 7.309999999999999e-05, h2o +composition rate: h2o rule 11, 12, 2.91e-05, h2o +composition rate: h2o rule 12, 13, 9e-06, h2o +composition rate: h2o rule 13, 14, 6.22e-06, h2o +composition rate: h2o rule 14, 15, 4e-06, h2o +composition rate: h2o rule 15, 16, 3e-06, h2o +composition rate: h2o rule 16, 17, 2.8999999999999998e-06, h2o +composition rate: h2o rule 17, 18, 2.75e-06, h2o +composition rate: h2o rule 18, 19, 2.6e-06, h2o +composition rate: h2o rule 19, 20, 2.6e-06, h2o +composition rate: h2o rule 20, 21, 2.6499999999999996e-06, h2o +composition rate: h2o rule 21, 22, 2.8e-06, h2o +composition rate: h2o rule 22, 23, 2.8999999999999998e-06, h2o +composition rate: h2o rule 23, 24, 3.2e-06, h2o +composition rate: h2o rule 24, 25, 3.25e-06, h2o +composition rate: h2o rule 25, 27.6, 3.6e-06, h2o +composition rate: h2o rule 26, 30, 4e-06, h2o +composition rate: h2o rule 27, 32.6, 4.2999999999999995e-06, h2o +composition rate: h2o rule 28, 35, 4.599999999999999e-06, h2o +composition rate: h2o rule 29, 37.5, 4.9000000000000005e-06, h2o +composition rate: h2o rule 30, 40, 5.2e-06, h2o +composition rate: h2o rule 31, 42.5, 5.5e-06, h2o +composition rate: h2o rule 32, 45, 5.7e-06, h2o +composition rate: h2o rule 33, 47.5, 5.9e-06, h2o +composition rate: h2o rule 34, 50, 6e-06, h2o +composition rate: h2o rule 35, 55, 6e-06, h2o +composition rate: h2o rule 36, 60, 6e-06, h2o +composition rate: h2o rule 37, 65, 5.4e-06, h2o +composition rate: h2o rule 38, 70, 4.5e-06, h2o +composition rate: h2o rule 39, 75, 3.2999999999999997e-06, h2o +composition rate: h2o rule 40, 80, 2.1e-06, h2o +composition rate: h2o rule 41, 85, 1.3e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 7, 8, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 8, 9, 1.69e-06, ch4 +composition rate: ch4 rule 9, 10, 1.69e-06, ch4 +composition rate: ch4 rule 10, 11, 1.6799999999999998e-06, ch4 +composition rate: ch4 rule 11, 12, 1.6599999999999998e-06, ch4 +composition rate: ch4 rule 12, 13, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 13, 14, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 14, 15, 1.61e-06, ch4 +composition rate: ch4 rule 15, 16, 1.58e-06, ch4 +composition rate: ch4 rule 16, 17, 1.55e-06, ch4 +composition rate: ch4 rule 17, 18, 1.5199999999999998e-06, ch4 +composition rate: ch4 rule 18, 19, 1.48e-06, ch4 +composition rate: ch4 rule 19, 20, 1.42e-06, ch4 +composition rate: ch4 rule 20, 21, 1.3600000000000001e-06, ch4 +composition rate: ch4 rule 21, 22, 1.27e-06, ch4 +composition rate: ch4 rule 22, 23, 1.1899999999999998e-06, ch4 +composition rate: ch4 rule 23, 24, 1.12e-06, ch4 +composition rate: ch4 rule 24, 25, 1.06e-06, ch4 +composition rate: ch4 rule 25, 27.6, 9.87e-07, ch4 +composition rate: ch4 rule 26, 30, 9.14e-07, ch4 +composition rate: ch4 rule 27, 32.6, 8.299999999999999e-07, ch4 +composition rate: ch4 rule 28, 35, 7.459999999999999e-07, ch4 +composition rate: ch4 rule 29, 37.5, 6.62e-07, ch4 +composition rate: ch4 rule 30, 40, 5.639999999999999e-07, ch4 +composition rate: ch4 rule 31, 42.5, 4.61e-07, ch4 +composition rate: ch4 rule 32, 45, 3.6299999999999995e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2.77e-07, ch4 +composition rate: ch4 rule 34, 50, 2.0999999999999997e-07, ch4 +composition rate: ch4 rule 35, 55, 1.65e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 3.15e-08, o3 +composition rate: o3 rule 1, 2, 3.3399999999999995e-08, o3 +composition rate: o3 rule 2, 3, 3.5e-08, o3 +composition rate: o3 rule 3, 4, 3.56e-08, o3 +composition rate: o3 rule 4, 5, 3.7699999999999993e-08, o3 +composition rate: o3 rule 5, 6, 3.9899999999999993e-08, o3 +composition rate: o3 rule 6, 7, 4.22e-08, o3 +composition rate: o3 rule 7, 8, 4.4699999999999997e-08, o3 +composition rate: o3 rule 8, 9, 5e-08, o3 +composition rate: o3 rule 9, 10, 5.6e-08, o3 +composition rate: o3 rule 10, 11, 6.61e-08, o3 +composition rate: o3 rule 11, 12, 7.82e-08, o3 +composition rate: o3 rule 12, 13, 9.289999999999999e-08, o3 +composition rate: o3 rule 13, 14, 1.0499999999999999e-07, o3 +composition rate: o3 rule 14, 15, 1.26e-07, o3 +composition rate: o3 rule 15, 16, 1.44e-07, o3 +composition rate: o3 rule 16, 17, 2.5e-07, o3 +composition rate: o3 rule 17, 18, 5e-07, o3 +composition rate: o3 rule 18, 19, 9.499999999999999e-07, o3 +composition rate: o3 rule 19, 20, 1.4e-06, o3 +composition rate: o3 rule 20, 21, 1.8e-06, o3 +composition rate: o3 rule 21, 22, 2.4e-06, o3 +composition rate: o3 rule 22, 23, 3.3999999999999996e-06, o3 +composition rate: o3 rule 23, 24, 4.2999999999999995e-06, o3 +composition rate: o3 rule 24, 25, 5.4e-06, o3 +composition rate: o3 rule 25, 27.6, 7.8e-06, o3 +composition rate: o3 rule 26, 30, 9.3e-06, o3 +composition rate: o3 rule 27, 32.6, 9.849999999999999e-06, o3 +composition rate: o3 rule 28, 35, 9.699999999999999e-06, o3 +composition rate: o3 rule 29, 37.5, 8.8e-06, o3 +composition rate: o3 rule 30, 40, 7.499999999999999e-06, o3 +composition rate: o3 rule 31, 42.5, 5.9e-06, o3 +composition rate: o3 rule 32, 45, 4.5e-06, o3 +composition rate: o3 rule 33, 47.5, 3.45e-06, o3 +composition rate: o3 rule 34, 50, 2.8e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.1e-06, o3 +composition rate: o3 rule 37, 65, 6.5e-07, o3 +composition rate: o3 rule 38, 70, 3e-07, o3 +composition rate: o3 rule 39, 75, 1.8e-07, o3 +composition rate: o3 rule 40, 80, 3.3e-07, o3 +composition rate: o3 rule 41, 85, 5e-07, o3 +composition rate: o3 rule 42, 90, 5.2e-07, o3 +composition rate: o3 rule 43, 95, 5e-07, o3 +composition rate: o3 rule 44, 100, 4e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.2e-07, n2o +composition rate: n2o rule 1, 2, 3.2e-07, n2o +composition rate: n2o rule 2, 3, 3.2e-07, n2o +composition rate: n2o rule 3, 4, 3.2e-07, n2o +composition rate: n2o rule 4, 5, 3.2e-07, n2o +composition rate: n2o rule 5, 6, 3.2e-07, n2o +composition rate: n2o rule 6, 7, 3.2e-07, n2o +composition rate: n2o rule 7, 8, 3.2e-07, n2o +composition rate: n2o rule 8, 9, 3.2e-07, n2o +composition rate: n2o rule 9, 10, 3.18e-07, n2o +composition rate: n2o rule 10, 11, 3.14e-07, n2o +composition rate: n2o rule 11, 12, 3.1e-07, n2o +composition rate: n2o rule 12, 13, 3.05e-07, n2o +composition rate: n2o rule 13, 14, 3e-07, n2o +composition rate: n2o rule 14, 15, 2.9399999999999996e-07, n2o +composition rate: n2o rule 15, 16, 2.88e-07, n2o +composition rate: n2o rule 16, 17, 2.7800000000000003e-07, n2o +composition rate: n2o rule 17, 18, 2.67e-07, n2o +composition rate: n2o rule 18, 19, 2.53e-07, n2o +composition rate: n2o rule 19, 20, 2.3699999999999996e-07, n2o +composition rate: n2o rule 20, 21, 2.19e-07, n2o +composition rate: n2o rule 21, 22, 2.0499999999999997e-07, n2o +composition rate: n2o rule 22, 23, 1.97e-07, n2o +composition rate: n2o rule 23, 24, 1.88e-07, n2o +composition rate: n2o rule 24, 25, 1.76e-07, n2o +composition rate: n2o rule 25, 27.6, 1.59e-07, n2o +composition rate: n2o rule 26, 30, 1.4199999999999997e-07, n2o +composition rate: n2o rule 27, 32.6, 1.17e-07, n2o +composition rate: n2o rule 28, 35, 9.279999999999998e-08, n2o +composition rate: n2o rule 29, 37.5, 6.69e-08, n2o +composition rate: n2o rule 30, 40, 4.51e-08, n2o +composition rate: n2o rule 31, 42.5, 2.7499999999999998e-08, n2o +composition rate: n2o rule 32, 45, 1.59e-08, n2o +composition rate: n2o rule 33, 47.5, 9.379999999999999e-09, n2o +composition rate: n2o rule 34, 50, 4.7499999999999995e-09, n2o +composition rate: n2o rule 35, 55, 3e-09, n2o +composition rate: n2o rule 36, 60, 2.0699999999999997e-09, n2o +composition rate: n2o rule 37, 65, 1.51e-09, n2o +composition rate: n2o rule 38, 70, 1.15e-09, n2o +composition rate: n2o rule 39, 75, 8.89e-10, n2o +composition rate: n2o rule 40, 80, 7.06e-10, n2o +composition rate: n2o rule 41, 85, 5.72e-10, n2o +composition rate: n2o rule 42, 90, 4.71e-10, n2o +composition rate: n2o rule 43, 95, 3.93e-10, n2o +composition rate: n2o rule 44, 100, 3.32e-10, n2o +composition rate: n2o rule 45, 105, 2.84e-10, n2o +composition rate: n2o rule 46, 110, 2.44e-10, n2o +composition rate: n2o rule 47, 115, 2.12e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 1.45e-07, co +composition rate: co rule 1, 2, 1.4e-07, co +composition rate: co rule 2, 3, 1.35e-07, co +composition rate: co rule 3, 4, 1.31e-07, co +composition rate: co rule 4, 5, 1.3e-07, co +composition rate: co rule 5, 6, 1.29e-07, co +composition rate: co rule 6, 7, 1.25e-07, co +composition rate: co rule 7, 8, 1.19e-07, co +composition rate: co rule 8, 9, 1.09e-07, co +composition rate: co rule 9, 10, 9.959999999999999e-08, co +composition rate: co rule 10, 11, 8.96e-08, co +composition rate: co rule 11, 12, 7.81e-08, co +composition rate: co rule 12, 13, 6.370000000000001e-08, co +composition rate: co rule 13, 14, 5.0299999999999994e-08, co +composition rate: co rule 14, 15, 3.9399999999999995e-08, co +composition rate: co rule 15, 16, 3.07e-08, co +composition rate: co rule 16, 17, 2.4899999999999998e-08, co +composition rate: co rule 17, 18, 1.9699999999999998e-08, co +composition rate: co rule 18, 19, 1.55e-08, co +composition rate: co rule 19, 20, 1.3299999999999998e-08, co +composition rate: co rule 20, 21, 1.23e-08, co +composition rate: co rule 21, 22, 1.23e-08, co +composition rate: co rule 22, 23, 1.31e-08, co +composition rate: co rule 23, 24, 1.4e-08, co +composition rate: co rule 24, 25, 1.5e-08, co +composition rate: co rule 25, 27.6, 1.6e-08, co +composition rate: co rule 26, 30, 1.71e-08, co +composition rate: co rule 27, 32.6, 1.8499999999999997e-08, co +composition rate: co rule 28, 35, 2e-08, co +composition rate: co rule 29, 37.5, 2.1499999999999997e-08, co +composition rate: co rule 30, 40, 2.33e-08, co +composition rate: co rule 31, 42.5, 2.63e-08, co +composition rate: co rule 32, 45, 3.0599999999999996e-08, co +composition rate: co rule 33, 47.5, 3.7999999999999996e-08, co +composition rate: co rule 34, 50, 6.25e-08, co +composition rate: co rule 35, 55, 1.4799999999999998e-07, co +composition rate: co rule 36, 60, 2.93e-07, co +composition rate: co rule 37, 65, 5.590000000000001e-07, co +composition rate: co rule 38, 70, 1.08e-06, co +composition rate: co rule 39, 75, 1.8999999999999998e-06, co +composition rate: co rule 40, 80, 2.96e-06, co +composition rate: co rule 41, 85, 4.53e-06, co +composition rate: co rule 42, 90, 6.86e-06, co +composition rate: co rule 43, 95, 1.05e-05, co +composition rate: co rule 44, 100, 1.7100000000000002e-05, co +composition rate: co rule 45, 105, 2.4699999999999997e-05, co +composition rate: co rule 46, 110, 3.36e-05, co +composition rate: co rule 47, 115, 4.15e-05, co +composition rate: co rule 48, 120, 4.9999999999999996e-05, co diff --git a/us standard.pyr b/us standard.pyr new file mode 100644 index 0000000..0a8e91e --- /dev/null +++ b/us standard.pyr @@ -0,0 +1,329 @@ +# atm profile for us standard + +# surface values (pressure, temperature, final height, initial layer thickness, acceleration of gravity, range min, range max) +surface: 1010.0, 288.2, 120, 100, 9.8, 100, 2500 + +# initial molecule ppmv. All values are taken from line 0 of their respective AFGL profile +# except for co2, o2, n2, and ar +molecule: co2, .000287 +molecule: h2o, 0.00775 +molecule: o2, .20 +molecule: n2, .77 +molecule: ar, .009 +molecule: ch4, 1.6999999999999998e-06 +molecule: o3, 2.6599999999999997e-08 +molecule: n2o, 3.1e-07 +molecule: co, 1.5e-07 + +# lapse rate profile +# rules are: name, final height, final value +# initial values for a rule are defined by the final value of the previous rule (or surface for the first rule) +lapse rate: lapse rule 0, 1, 281.7 +lapse rate: lapse rule 1, 2, 275.2 +lapse rate: lapse rule 2, 3, 268.7 +lapse rate: lapse rule 3, 4, 262.2 +lapse rate: lapse rule 4, 5, 255.7 +lapse rate: lapse rule 5, 6, 249.2 +lapse rate: lapse rule 6, 7, 242.7 +lapse rate: lapse rule 7, 8, 236.2 +lapse rate: lapse rule 8, 9, 229.7 +lapse rate: lapse rule 9, 10, 223.3 +lapse rate: lapse rule 10, 11, 216.8 +lapse rate: lapse rule 11, 12, 216.7 +lapse rate: lapse rule 12, 13, 216.7 +lapse rate: lapse rule 13, 14, 216.7 +lapse rate: lapse rule 14, 15, 216.7 +lapse rate: lapse rule 15, 16, 216.7 +lapse rate: lapse rule 16, 17, 216.7 +lapse rate: lapse rule 17, 18, 216.7 +lapse rate: lapse rule 18, 19, 216.7 +lapse rate: lapse rule 19, 20, 216.7 +lapse rate: lapse rule 20, 21, 217.6 +lapse rate: lapse rule 21, 22, 218.6 +lapse rate: lapse rule 22, 23, 219.6 +lapse rate: lapse rule 23, 24, 220.6 +lapse rate: lapse rule 24, 25, 221.6 +lapse rate: lapse rule 25, 27.6, 224 +lapse rate: lapse rule 26, 30, 226.5 +lapse rate: lapse rule 27, 32.6, 230 +lapse rate: lapse rule 28, 35, 236.5 +lapse rate: lapse rule 29, 37.5, 242.9 +lapse rate: lapse rule 30, 40, 250.4 +lapse rate: lapse rule 31, 42.5, 257.3 +lapse rate: lapse rule 32, 45, 264.2 +lapse rate: lapse rule 33, 47.5, 270.6 +lapse rate: lapse rule 34, 50, 270.7 +lapse rate: lapse rule 35, 55, 260.8 +lapse rate: lapse rule 36, 60, 247 +lapse rate: lapse rule 37, 65, 233.3 +lapse rate: lapse rule 38, 70, 219.6 +lapse rate: lapse rule 39, 75, 208.4 +lapse rate: lapse rule 40, 80, 198.6 +lapse rate: lapse rule 41, 85, 188.9 +lapse rate: lapse rule 42, 90, 186.9 +lapse rate: lapse rule 43, 95, 188.4 +lapse rate: lapse rule 44, 100, 195.1 +lapse rate: lapse rule 45, 105, 208.8 +lapse rate: lapse rule 46, 110, 240 +lapse rate: lapse rule 47, 115, 300 +lapse rate: lapse rule 48, 120, 360 + +# h2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: h2o rule 0, 1, 0.00507, h2o +composition rate: h2o rule 1, 2, 0.00463, h2o +composition rate: h2o rule 2, 3, 0.0031799999999999997, h2o +composition rate: h2o rule 3, 4, 0.00216, h2o +composition rate: h2o rule 4, 5, 0.0014, h2o +composition rate: h2o rule 5, 6, 0.0009249999999999999, h2o +composition rate: h2o rule 6, 7, 0.000572, h2o +composition rate: h2o rule 7, 8, 0.000367, h2o +composition rate: h2o rule 8, 9, 0.000158, h2o +composition rate: h2o rule 9, 10, 7e-05, h2o +composition rate: h2o rule 10, 11, 3.6099999999999997e-05, h2o +composition rate: h2o rule 11, 12, 1.91e-05, h2o +composition rate: h2o rule 12, 13, 1.09e-05, h2o +composition rate: h2o rule 13, 14, 5.929999999999999e-06, h2o +composition rate: h2o rule 14, 15, 4.9999999999999996e-06, h2o +composition rate: h2o rule 15, 16, 3.95e-06, h2o +composition rate: h2o rule 16, 17, 3.8499999999999996e-06, h2o +composition rate: h2o rule 17, 18, 3.83e-06, h2o +composition rate: h2o rule 18, 19, 3.8499999999999996e-06, h2o +composition rate: h2o rule 19, 20, 3.9e-06, h2o +composition rate: h2o rule 20, 21, 3.98e-06, h2o +composition rate: h2o rule 21, 22, 4.07e-06, h2o +composition rate: h2o rule 22, 23, 4.2e-06, h2o +composition rate: h2o rule 23, 24, 4.2999999999999995e-06, h2o +composition rate: h2o rule 24, 25, 4.43e-06, h2o +composition rate: h2o rule 25, 27.6, 4.58e-06, h2o +composition rate: h2o rule 26, 30, 4.7300000000000005e-06, h2o +composition rate: h2o rule 27, 32.6, 4.8299999999999995e-06, h2o +composition rate: h2o rule 28, 35, 4.9000000000000005e-06, h2o +composition rate: h2o rule 29, 37.5, 4.95e-06, h2o +composition rate: h2o rule 30, 40, 5.03e-06, h2o +composition rate: h2o rule 31, 42.5, 5.15e-06, h2o +composition rate: h2o rule 32, 45, 5.23e-06, h2o +composition rate: h2o rule 33, 47.5, 5.25e-06, h2o +composition rate: h2o rule 34, 50, 5.23e-06, h2o +composition rate: h2o rule 35, 55, 5.0999999999999995e-06, h2o +composition rate: h2o rule 36, 60, 4.749999999999999e-06, h2o +composition rate: h2o rule 37, 65, 4.2e-06, h2o +composition rate: h2o rule 38, 70, 3.5e-06, h2o +composition rate: h2o rule 39, 75, 2.83e-06, h2o +composition rate: h2o rule 40, 80, 2.05e-06, h2o +composition rate: h2o rule 41, 85, 1.33e-06, h2o +composition rate: h2o rule 42, 90, 8.499999999999999e-07, h2o +composition rate: h2o rule 43, 95, 5.4e-07, h2o +composition rate: h2o rule 44, 100, 4e-07, h2o +composition rate: h2o rule 45, 105, 3.4000000000000003e-07, h2o +composition rate: h2o rule 46, 110, 2.8e-07, h2o +composition rate: h2o rule 47, 115, 2.4e-07, h2o +composition rate: h2o rule 48, 120, 2e-07, h2o + +# ch4 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: ch4 rule 0, 1, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 1, 2, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 2, 3, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 3, 4, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 4, 5, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 5, 6, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 6, 7, 1.6999999999999998e-06, ch4 +composition rate: ch4 rule 7, 8, 1.69e-06, ch4 +composition rate: ch4 rule 8, 9, 1.69e-06, ch4 +composition rate: ch4 rule 9, 10, 1.6799999999999998e-06, ch4 +composition rate: ch4 rule 10, 11, 1.6599999999999998e-06, ch4 +composition rate: ch4 rule 11, 12, 1.6499999999999999e-06, ch4 +composition rate: ch4 rule 12, 13, 1.6299999999999999e-06, ch4 +composition rate: ch4 rule 13, 14, 1.61e-06, ch4 +composition rate: ch4 rule 14, 15, 1.58e-06, ch4 +composition rate: ch4 rule 15, 16, 1.55e-06, ch4 +composition rate: ch4 rule 16, 17, 1.5199999999999998e-06, ch4 +composition rate: ch4 rule 17, 18, 1.48e-06, ch4 +composition rate: ch4 rule 18, 19, 1.42e-06, ch4 +composition rate: ch4 rule 19, 20, 1.3600000000000001e-06, ch4 +composition rate: ch4 rule 20, 21, 1.27e-06, ch4 +composition rate: ch4 rule 21, 22, 1.1899999999999998e-06, ch4 +composition rate: ch4 rule 22, 23, 1.12e-06, ch4 +composition rate: ch4 rule 23, 24, 1.06e-06, ch4 +composition rate: ch4 rule 24, 25, 9.87e-07, ch4 +composition rate: ch4 rule 25, 27.6, 9.14e-07, ch4 +composition rate: ch4 rule 26, 30, 8.299999999999999e-07, ch4 +composition rate: ch4 rule 27, 32.6, 7.459999999999999e-07, ch4 +composition rate: ch4 rule 28, 35, 6.62e-07, ch4 +composition rate: ch4 rule 29, 37.5, 5.639999999999999e-07, ch4 +composition rate: ch4 rule 30, 40, 4.61e-07, ch4 +composition rate: ch4 rule 31, 42.5, 3.6299999999999995e-07, ch4 +composition rate: ch4 rule 32, 45, 2.77e-07, ch4 +composition rate: ch4 rule 33, 47.5, 2.0999999999999997e-07, ch4 +composition rate: ch4 rule 34, 50, 1.65e-07, ch4 +composition rate: ch4 rule 35, 55, 1.5e-07, ch4 +composition rate: ch4 rule 36, 60, 1.5e-07, ch4 +composition rate: ch4 rule 37, 65, 1.5e-07, ch4 +composition rate: ch4 rule 38, 70, 1.5e-07, ch4 +composition rate: ch4 rule 39, 75, 1.5e-07, ch4 +composition rate: ch4 rule 40, 80, 1.5e-07, ch4 +composition rate: ch4 rule 41, 85, 1.5e-07, ch4 +composition rate: ch4 rule 42, 90, 1.4e-07, ch4 +composition rate: ch4 rule 43, 95, 1.3e-07, ch4 +composition rate: ch4 rule 44, 100, 1.2e-07, ch4 +composition rate: ch4 rule 45, 105, 1.0999999999999999e-07, ch4 +composition rate: ch4 rule 46, 110, 9.499999999999999e-08, ch4 +composition rate: ch4 rule 47, 115, 6e-08, ch4 +composition rate: ch4 rule 48, 120, 3e-08, ch4 + +# o3 composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: o3 rule 0, 1, 2.9299999999999998e-08, o3 +composition rate: o3 rule 1, 2, 3.24e-08, o3 +composition rate: o3 rule 2, 3, 3.32e-08, o3 +composition rate: o3 rule 3, 4, 3.39e-08, o3 +composition rate: o3 rule 4, 5, 3.7699999999999993e-08, o3 +composition rate: o3 rule 5, 6, 4.11e-08, o3 +composition rate: o3 rule 6, 7, 5.01e-08, o3 +composition rate: o3 rule 7, 8, 5.97e-08, o3 +composition rate: o3 rule 8, 9, 9.17e-08, o3 +composition rate: o3 rule 9, 10, 1.31e-07, o3 +composition rate: o3 rule 10, 11, 2.1499999999999998e-07, o3 +composition rate: o3 rule 11, 12, 3.1e-07, o3 +composition rate: o3 rule 12, 13, 3.8499999999999997e-07, o3 +composition rate: o3 rule 13, 14, 5.03e-07, o3 +composition rate: o3 rule 14, 15, 6.51e-07, o3 +composition rate: o3 rule 15, 16, 8.699999999999999e-07, o3 +composition rate: o3 rule 16, 17, 1.1899999999999998e-06, o3 +composition rate: o3 rule 17, 18, 1.59e-06, o3 +composition rate: o3 rule 18, 19, 2.0299999999999996e-06, o3 +composition rate: o3 rule 19, 20, 2.58e-06, o3 +composition rate: o3 rule 20, 21, 3.03e-06, o3 +composition rate: o3 rule 21, 22, 3.6499999999999998e-06, o3 +composition rate: o3 rule 22, 23, 4.17e-06, o3 +composition rate: o3 rule 23, 24, 4.63e-06, o3 +composition rate: o3 rule 24, 25, 5.12e-06, o3 +composition rate: o3 rule 25, 27.6, 5.7999999999999995e-06, o3 +composition rate: o3 rule 26, 30, 6.549999999999999e-06, o3 +composition rate: o3 rule 27, 32.6, 7.37e-06, o3 +composition rate: o3 rule 28, 35, 7.84e-06, o3 +composition rate: o3 rule 29, 37.5, 7.8e-06, o3 +composition rate: o3 rule 30, 40, 7.2999999999999996e-06, o3 +composition rate: o3 rule 31, 42.5, 6.2e-06, o3 +composition rate: o3 rule 32, 45, 5.25e-06, o3 +composition rate: o3 rule 33, 47.5, 4.1e-06, o3 +composition rate: o3 rule 34, 50, 3.1e-06, o3 +composition rate: o3 rule 35, 55, 1.8e-06, o3 +composition rate: o3 rule 36, 60, 1.1e-06, o3 +composition rate: o3 rule 37, 65, 7e-07, o3 +composition rate: o3 rule 38, 70, 3e-07, o3 +composition rate: o3 rule 39, 75, 2.5e-07, o3 +composition rate: o3 rule 40, 80, 3e-07, o3 +composition rate: o3 rule 41, 85, 5e-07, o3 +composition rate: o3 rule 42, 90, 7e-07, o3 +composition rate: o3 rule 43, 95, 7e-07, o3 +composition rate: o3 rule 44, 100, 4e-07, o3 +composition rate: o3 rule 45, 105, 2e-07, o3 +composition rate: o3 rule 46, 110, 5e-08, o3 +composition rate: o3 rule 47, 115, 5e-09, o3 +composition rate: o3 rule 48, 120, 5e-10, o3 + +# n2o composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: n2o rule 0, 1, 3.1e-07, n2o +composition rate: n2o rule 1, 2, 3.1e-07, n2o +composition rate: n2o rule 2, 3, 3.1e-07, n2o +composition rate: n2o rule 3, 4, 3.08e-07, n2o +composition rate: n2o rule 4, 5, 3.02e-07, n2o +composition rate: n2o rule 5, 6, 2.9099999999999995e-07, n2o +composition rate: n2o rule 6, 7, 2.8199999999999996e-07, n2o +composition rate: n2o rule 7, 8, 2.7600000000000004e-07, n2o +composition rate: n2o rule 8, 9, 2.7e-07, n2o +composition rate: n2o rule 9, 10, 2.65e-07, n2o +composition rate: n2o rule 10, 11, 2.6e-07, n2o +composition rate: n2o rule 11, 12, 2.55e-07, n2o +composition rate: n2o rule 12, 13, 2.4899999999999997e-07, n2o +composition rate: n2o rule 13, 14, 2.43e-07, n2o +composition rate: n2o rule 14, 15, 2.3599999999999997e-07, n2o +composition rate: n2o rule 15, 16, 2.28e-07, n2o +composition rate: n2o rule 16, 17, 2.18e-07, n2o +composition rate: n2o rule 17, 18, 2.0399999999999997e-07, n2o +composition rate: n2o rule 18, 19, 1.82e-07, n2o +composition rate: n2o rule 19, 20, 1.57e-07, n2o +composition rate: n2o rule 20, 21, 1.35e-07, n2o +composition rate: n2o rule 21, 22, 1.2199999999999998e-07, n2o +composition rate: n2o rule 22, 23, 1.0999999999999999e-07, n2o +composition rate: n2o rule 23, 24, 9.889999999999999e-08, n2o +composition rate: n2o rule 24, 25, 8.78e-08, n2o +composition rate: n2o rule 25, 27.6, 7.33e-08, n2o +composition rate: n2o rule 26, 30, 5.9399999999999996e-08, n2o +composition rate: n2o rule 27, 32.6, 4.15e-08, n2o +composition rate: n2o rule 28, 35, 3.03e-08, n2o +composition rate: n2o rule 29, 37.5, 1.95e-08, n2o +composition rate: n2o rule 30, 40, 1.27e-08, n2o +composition rate: n2o rule 31, 42.5, 9e-09, n2o +composition rate: n2o rule 32, 45, 6.2899999999999996e-09, n2o +composition rate: n2o rule 33, 47.5, 4.56e-09, n2o +composition rate: n2o rule 34, 50, 2.8e-09, n2o +composition rate: n2o rule 35, 55, 1.77e-09, n2o +composition rate: n2o rule 36, 60, 1.21e-09, n2o +composition rate: n2o rule 37, 65, 8.869999999999999e-10, n2o +composition rate: n2o rule 38, 70, 6.759999999999999e-10, n2o +composition rate: n2o rule 39, 75, 5.539999999999999e-10, n2o +composition rate: n2o rule 40, 80, 4.65e-10, n2o +composition rate: n2o rule 41, 85, 3.98e-10, n2o +composition rate: n2o rule 42, 90, 3.05e-10, n2o +composition rate: n2o rule 43, 95, 2.7099999999999994e-10, n2o +composition rate: n2o rule 44, 100, 2.44e-10, n2o +composition rate: n2o rule 45, 105, 2.2099999999999999e-10, n2o +composition rate: n2o rule 46, 110, 2.02e-10, n2o +composition rate: n2o rule 47, 115, 1.8399999999999998e-10, n2o +composition rate: n2o rule 48, 120, 1.8499999999999998e-10, n2o + +# co composition profile +# composition rules are: name, final height, final value ppmv, molecule the rule applies to +composition rate: co rule 0, 1, 1.45e-07, co +composition rate: co rule 1, 2, 1.4e-07, co +composition rate: co rule 2, 3, 1.35e-07, co +composition rate: co rule 3, 4, 1.31e-07, co +composition rate: co rule 4, 5, 1.3e-07, co +composition rate: co rule 5, 6, 1.29e-07, co +composition rate: co rule 6, 7, 1.25e-07, co +composition rate: co rule 7, 8, 1.19e-07, co +composition rate: co rule 8, 9, 1.09e-07, co +composition rate: co rule 9, 10, 9.959999999999999e-08, co +composition rate: co rule 10, 11, 8.96e-08, co +composition rate: co rule 11, 12, 7.81e-08, co +composition rate: co rule 12, 13, 6.370000000000001e-08, co +composition rate: co rule 13, 14, 5.0299999999999994e-08, co +composition rate: co rule 14, 15, 3.9399999999999995e-08, co +composition rate: co rule 15, 16, 3.07e-08, co +composition rate: co rule 16, 17, 2.4899999999999998e-08, co +composition rate: co rule 17, 18, 1.9699999999999998e-08, co +composition rate: co rule 18, 19, 1.55e-08, co +composition rate: co rule 19, 20, 1.3299999999999998e-08, co +composition rate: co rule 20, 21, 1.23e-08, co +composition rate: co rule 21, 22, 1.23e-08, co +composition rate: co rule 22, 23, 1.31e-08, co +composition rate: co rule 23, 24, 1.4e-08, co +composition rate: co rule 24, 25, 1.5e-08, co +composition rate: co rule 25, 27.6, 1.6e-08, co +composition rate: co rule 26, 30, 1.71e-08, co +composition rate: co rule 27, 32.6, 1.8499999999999997e-08, co +composition rate: co rule 28, 35, 2.0099999999999998e-08, co +composition rate: co rule 29, 37.5, 2.22e-08, co +composition rate: co rule 30, 40, 2.5e-08, co +composition rate: co rule 31, 42.5, 2.8199999999999998e-08, co +composition rate: co rule 32, 45, 3.24e-08, co +composition rate: co rule 33, 47.5, 3.7199999999999996e-08, co +composition rate: co rule 34, 50, 4.5999999999999995e-08, co +composition rate: co rule 35, 55, 6.64e-08, co +composition rate: co rule 36, 60, 1.0699999999999999e-07, co +composition rate: co rule 37, 65, 1.86e-07, co +composition rate: co rule 38, 70, 3.0599999999999996e-07, co +composition rate: co rule 39, 75, 6.38e-07, co +composition rate: co rule 40, 80, 1.5e-06, co +composition rate: co rule 41, 85, 3.24e-06, co +composition rate: co rule 42, 90, 5.84e-06, co +composition rate: co rule 43, 95, 1.01e-05, co +composition rate: co rule 44, 100, 1.6899999999999997e-05, co +composition rate: co rule 45, 105, 2.4699999999999997e-05, co +composition rate: co rule 46, 110, 3.36e-05, co +composition rate: co rule 47, 115, 4.15e-05, co +composition rate: co rule 48, 120, 4.9999999999999996e-05, co