diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index dc2d5595..5485d7b3 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - python-version: ["3.9"] + python-version: ["3.11"] env: FC: gfortran @@ -31,7 +31,7 @@ jobs: run: | pip install build python -m build . - pip install -r docs/requirements.txt + pip install .[doc] - name: Check documentation build run: sphinx-build -E -b html docs dist/docs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9aafc183..bf50388f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,16 +17,30 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest", "windows-latest"] - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12"] + numpy_ver: ["latest"] + test_config: ["latest"] include: + # Support different GA Mac environmnets - python-version: "3.9" os: "macos-13" + numpy_ver: "latest" - python-version: "3.10" os: "macos-13" + numpy_ver: "latest" - python-version: "3.11" os: "macos-latest" + numpy_ver: "latest" + - python-version: "3.12" + os: "macos-latest" + numpy_ver: "latest" + # NEP29 compliance settings + - python-version: "3.10" + numpy_ver: "1.25" + os: "ubuntu-latest" + test_config: "NEP29" - name: Python ${{ matrix.python-version }} on ${{ matrix.os }} + name: Python ${{ matrix.python-version }} on ${{ matrix.os }} with Numpy ${{ matrix.numpy_ver }} runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -44,23 +58,28 @@ jobs: echo "c:\rtools40\ucrt64\bin;" >> $env:GITHUB_PATH gfortran --version pip install flake8 meson-python pytest pytest-cov pytest-xdist scipy - pip install "numpy>=1.19.5,<2" + pip install "numpy>=1.19.5" + + - name: Install NEP29 dependencies + if: ${{ matrix.test_config == 'NEP29'}} + run: | + pip install numpy==${{ matrix.numpy_ver }} - name: Install on Linux if: ${{ matrix.os == 'ubuntu-latest' }} - run: pip install .[test] + run: pip install --upgrade-strategy only-if-needed .[test] - name: Install on MacOS-13 if: ${{ matrix.os == 'macos-13' }} run: | brew reinstall gcc@14 - CC=/usr/local/bin/gcc-14 pip install .[test] + CC=/usr/local/bin/gcc-14 pip install --upgrade-strategy only-if-needed .[test] - name: Install on MacOS-Latest if: ${{ matrix.os == 'macos-latest' }} run: | brew reinstall gcc@14 - CC=/opt/homebrew/bin/gcc-14 pip install .[test] + CC=/opt/homebrew/bin/gcc-14 pip install --upgrade-strategy only-if-needed .[test] - name: Install on Windows if: ${{ matrix.os == 'windows-latest' }} diff --git a/.zenodo.json b/.zenodo.json index bd50446d..49051aa2 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,28 +1,28 @@ { "license": { "id": "MIT" - }, + }, "notes": "When referencing this package, please cite both the package DOI and the Apex Coordinates journal article: Emmert, J. T., A. D. Richmond, and D. P. Drob (2010), A computationally compact representation of Magnetic-Apex and Quasi-Dipole coordinates with smooth base vectors, J. Geophys. Res., 115(A8), A08322, doi:10.1029/2010JA015326.", "references": [ "Emmert, J. T., A. D. Richmond, and D. P. Drob (2010), A computationally compact representation of Magnetic-Apex and Quasi-Dipole coordinates with smooth base vectors, J. Geophys. Res., 115(A8), A08322, doi:10.1029/2010JA015326.", "Richmond, A. D. (1995), Ionospheric Electrodynamics Using Magnetic Apex Coordinates, Journal of geomagnetism and geoelectricity, 47(2), 191–212, doi:10.5636/jgg.47.191." - ], + ], "keywords": [ "Magnetic Apex Coordinates", "Quasi Dipole Coordinates", - "MLT", - "Magnetic Local Time", - "Conversion", - "Coordinate Conversion", - "Converting", - "Ionosphere", - "Magnetic Field", - "Space Physics", + "MLT", + "Magnetic Local Time", + "Conversion", + "Coordinate Conversion", + "Converting", + "Ionosphere", + "Magnetic Field", + "Space Physics", "Heliophysics" - ], + ], "creators": [ { - "orcid": "0000-0002-8043-0953", + "orcid": "0000-0002-8043-0953", "name": "van der Meeren, Christer" }, { @@ -30,8 +30,8 @@ "name": "Laundal, Karl M." }, { - "orcid": "0000-0001-8875-9326", - "affiliation": "Naval Research Laboratory", + "orcid": "0000-0001-8875-9326", + "affiliation": "Naval Research Laboratory", "name": "Burrell, Angeline G." }, { @@ -50,6 +50,16 @@ "orcid": "0000-0001-7955-4441", "affiliation": "GFZ German Research Centre for Geosciences", "name": "Morschhauser, Achim" + }, + { + "orcid": "0000-0001-9741-4063", + "affiliation": "GFZ German Research Centre for Geosciences", + "name": "Michaelis, Ingo" + }, + { + "orcid": "0000-0001-8321-6074", + "affiliation": "Goddard Space Flight Center", + "name": "Klenzing, Jeff" } ] } diff --git a/AUTHORS.rst b/AUTHORS.rst index ff49fa7a..37791a04 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -11,10 +11,15 @@ This python wrapper is made by: * Gregory Starr * Ashton Reimer * Achim Morschhauser +* Ingo Michaelis +* Jeff Klenzing Fortran code by Emmert et al. [2010] [1]_. Quasi-dipole and modified apex coordinates are defined by Richmond [1995] [2]_. The code uses -IGRF-12 with coefficients valid through 2020 [Thébault et al., 2015] [3]_. +IGRF-14 with coefficients valid through 2030. A special issue on IGRF-14 is +currently accepting +`submissions `_. A reference +for IGRF-12 is [Thébault et al., 2015] [3]_. .. [1] Emmert, J. T., A. D. Richmond, and D. P. Drob (2010), A computationally compact representation of Magnetic-Apex diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b9a40db9..f11127bc 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,19 @@ Changelog ========= +2.1.0 (2024-12-31) +------------------ +* Adapted codebase to read IRGF coefficients from a file (updated to IGRF-14) +* Updated package to be compliant and installable with numpy 2.0+ +* Added tests for Python 3.12 and NEP29 +* Fixed link to logo in the README +* Updated pyproject.toml to include most metadata instead of setup.cfg +* Added a citation section to the docs +* Fixed the command-line executable +* Updated code to address deprecation warnings around np.float64 use +* Updated code to remove use of datetime `utcnow` +* Updated meson build requirements to include ninja for Windows builds instead of python-dev-tools + 2.0.2 (2024-11-12) ------------------ * Updated supported Python versions (3.9-3.11) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 1ff0f634..77b6f669 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,10 +55,10 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at angeline.burrell@nrl.navy.mil. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an +reported by contacting the project team at angeline.g.burrell.civ@us.navy.mil. +All complaints will be reviewed and investigated and will result in a response +that is deemed necessary and appropriate to the circumstances. The project team +is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. diff --git a/MANIFEST.in b/MANIFEST.in index ed533e15..d5274d60 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,7 +2,7 @@ graft docs graft fortranapex graft .github -recursive-include apexpy *.txt meson.build +recursive-include apexpy *.txt apexsh.dat meson.build include *.rst include *.md diff --git a/README.rst b/README.rst index b79a961d..47e59293 100644 --- a/README.rst +++ b/README.rst @@ -143,5 +143,5 @@ Badges .. |doi| image:: https://www.zenodo.org/badge/doi/10.5281/zenodo.4585641.svg :target: https://doi.org/10.5281/zenodo.1214206 -.. |logo| image:: docs/apexpy.png +.. |logo| image:: https://github.com/aburrell/apexpy/blob/main/docs/apexpy.png?raw=true :alt: ApexPy logo: yellow magnetic field lines surrounding the Earth's surface, which is blue diff --git a/apexpy/__init__.py b/apexpy/__init__.py index 1895213f..942918db 100644 --- a/apexpy/__init__.py +++ b/apexpy/__init__.py @@ -1,3 +1,5 @@ +"""Conversion functions between geodetic and apex magnetic coordinates.""" +from importlib import metadata from sys import stderr # Below try..catch required for autodoc to work on readthedocs @@ -12,5 +14,9 @@ from apexpy import helpers # noqa F401 # Define the global variables -__version__ = "2.0.1" +try: + __version__ = metadata.version('apexpy') +except metadata.PackageNotFoundError: + # Windows installation is not finding the version automatically + __version__ = "2.1.0" __all__ = ['Apex', 'fortranapex', 'helpers', 'ApexHeightError'] diff --git a/apexpy/__main__.py b/apexpy/__main__.py index 45b5e2e0..24f8a0d2 100644 --- a/apexpy/__main__.py +++ b/apexpy/__main__.py @@ -63,8 +63,12 @@ def main(): lats, lons = apex_obj.convert(arg_array[:, 0], arg_array[:, 1], args.source, args.dest, args.height, datetime=in_time) - # Save the output to a file - np.savetxt(args.file_out, np.column_stack((lats, lons)), fmt='%.8f') + # Save the output to a file. Use the name for non-stdout inputs + if args.file_out.name.lower().find('stdout') >= 0: + fout_name = args.file_out + else: + fout_name = args.file_out.name + np.savetxt(fout_name, np.column_stack((lats, lons)), fmt='%.8f') return diff --git a/apexpy/apex.py b/apexpy/apex.py index d7c3bc9c..37b3e362 100644 --- a/apexpy/apex.py +++ b/apexpy/apex.py @@ -65,7 +65,7 @@ class Apex(object): Notes ----- - The calculations use IGRF-13 with coefficients from 1900 to 2025 [1]_. + The calculations use IGRF-14 with coefficients from 1900 to 2030 [1]_. The geodetic reference ellipsoid is WGS84. @@ -87,7 +87,8 @@ def __init__(self, date=None, refh=0, datafile=None, fortranlib=None): self.set_refh(refh) # Reference height in km if date is None: - self.year = helpers.toYearFraction(dt.datetime.utcnow()) + self.year = helpers.toYearFraction(dt.datetime.now( + tz=dt.timezone.utc)) else: try: # Convert date/datetime object to decimal year @@ -100,8 +101,7 @@ def __init__(self, date=None, refh=0, datafile=None, fortranlib=None): # If datafile is not specified, use the package default, otherwise # check that the provided file exists if datafile is None: - datafile = str(resources.path(__package__, - 'apexsh.dat').__enter__()) + datafile = os.path.join(resources.files(__package__), 'apexsh.dat') else: if not os.path.isfile(datafile): raise IOError('Data file does not exist: {}'.format(datafile)) @@ -119,8 +119,8 @@ def __init__(self, date=None, refh=0, datafile=None, fortranlib=None): self.fortranlib = fortranlib # Set the IGRF coefficient text file name - self.igrf_fn = str(resources.path(__package__, - 'igrf13coeffs.txt').__enter__()) + self.igrf_fn = os.path.join(resources.files(__package__), + 'igrf14coeffs.txt') # Update the Fortran epoch using the year defined above self.set_epoch(self.year) @@ -564,7 +564,10 @@ def geo2apex(self, glat, glon, height): alat[alat == -9999] = np.nan # If array is returned, dtype is object, so convert to float - return np.float64(alat), np.float64(alon) + alat = helpers.set_array_float(alat) + alon = helpers.set_array_float(alon) + + return alat, alon def apex2geo(self, alat, alon, height, precision=1e-10): """Converts modified apex to geodetic coordinates. @@ -633,7 +636,10 @@ def geo2qd(self, glat, glon, height): qlat, qlon = self._geo2qd(glat, glon, height) # If array is returned, dtype is object, so convert to float - return np.float64(qlat), np.float64(qlon) + qlat = helpers.set_array_float(qlat) + qlon = helpers.set_array_float(qlon) + + return qlat, qlon def qd2geo(self, qlat, qlon, height, precision=1e-10): """Converts quasi-dipole to geodetic coordinates. @@ -673,7 +679,11 @@ def qd2geo(self, qlat, qlon, height, precision=1e-10): glat, glon, error = self._qd2geo(qlat, qlon, height, precision) # If array is returned, dtype is object, so convert to float - return np.float64(glat), np.float64(glon), np.float64(error) + glat = helpers.set_array_float(glat) + glon = helpers.set_array_float(glon) + error = helpers.set_array_float(error) + + return glat, glon, error def apex2qd(self, alat, alon, height): """Converts modified apex to quasi-dipole coordinates. @@ -705,7 +715,10 @@ def apex2qd(self, alat, alon, height): qlat, qlon = self._apex2qd(alat, alon, height) # If array is returned, the dtype is object, so convert to float - return np.float64(qlat), np.float64(qlon) + qlat = helpers.set_array_float(qlat) + qlon = helpers.set_array_float(qlon) + + return qlat, qlon def qd2apex(self, qlat, qlon, height): """Converts quasi-dipole to modified apex coordinates. @@ -736,7 +749,10 @@ def qd2apex(self, qlat, qlon, height): alat, alon = self._qd2apex(qlat, qlon, height) # If array is returned, the dtype is object, so convert to float - return np.float64(alat), np.float64(alon) + alat = helpers.set_array_float(alat) + alon = helpers.set_array_float(alon) + + return alat, alon def mlon2mlt(self, mlon, dtime, ssheight=318550): """Computes the magnetic local time at the specified magnetic longitude @@ -776,8 +792,11 @@ def mlon2mlt(self, mlon, dtime, ssheight=318550): _, ssalon = self.geo2apex(ssglat, ssglon, ssheight) # Calculate the magnetic local time (0-24 h range) from apex longitude. - # np.float64 will ensure lists are converted to arrays - mlt = (180 + np.float64(mlon) - ssalon) / 15 % 24 + # Ensure lists are converted to arrays + mlt = (180 + np.asarray(mlon) - ssalon) / 15 % 24 + + if mlt.shape == (): + mlt = np.float64(mlt) return mlt @@ -817,8 +836,11 @@ def mlt2mlon(self, mlt, dtime, ssheight=318550): _, ssalon = self.geo2apex(ssglat, ssglon, ssheight) # Calculate the magnetic longitude (0-360 h range) from MLT. - # np.float64 will ensure lists are converted to arrays - mlon = (15 * np.float64(mlt) - 180 + ssalon + 360) % 360 + # Ensure lists are converted to arrays + mlon = (15 * np.asarray(mlt) - 180 + ssalon + 360) % 360 + + if mlon.shape == (): + mlon = np.float64(mlon) return mlon @@ -1129,10 +1151,10 @@ def basevectors_apex(self, lat, lon, height, coords='geo', precision=1e-10): k_unit = np.array([0, 0, 1], dtype=np.float64).reshape((3, 1)) # Calculate the remaining quasi-dipole base vectors - g1 = ((self.RE + np.float64(height)) + g1 = ((self.RE + np.asarray(height)) / (self.RE + self.refh)) ** (3 / 2) * d1 / F_scalar g2 = -1.0 / (2.0 * F_scalar * np.tan(np.radians(qlat))) * ( - k_unit + ((self.RE + np.float64(height)) + k_unit + ((self.RE + np.asarray(height)) / (self.RE + self.refh)) * d2 / cos_mag_inc) g3 = k_unit * F_scalar f3 = np.cross(g1.T, g2.T).T @@ -1153,7 +1175,7 @@ def basevectors_apex(self, lat, lon, height, coords='geo', precision=1e-10): return out def get_apex(self, lat, height=None): - """ Calculate apex height + """Calculate the apex height along a field line. Parameters ---------- @@ -1263,7 +1285,9 @@ def get_babs(self, glat, glon, height): babs = self._get_babs(glat, glon, height) # If array is returned, the dtype is object, so convert to float - return np.float64(babs) + babs = helpers.set_array_float(babs) + + return babs def bvectors_apex(self, lat, lon, height, coords='geo', precision=1e-10): """Returns the magnetic field vectors in apex coordinates. diff --git a/apexpy/apexsh.dat b/apexpy/apexsh.dat index 36e86fb0..17dce448 100644 Binary files a/apexpy/apexsh.dat and b/apexpy/apexsh.dat differ diff --git a/apexpy/helpers.py b/apexpy/helpers.py index e67cac5e..ca60a2c8 100644 --- a/apexpy/helpers.py +++ b/apexpy/helpers.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- - """This module contains helper functions used by :class:`~apexpy.Apex`.""" import datetime as dt @@ -7,6 +6,30 @@ import time +def set_array_float(in_val): + """Set array data type to float. + + Parameters + ---------- + in_val : any + Input value, only modified if it is a np.ndarray + + Returns + ------- + out_val : any + Output value, if `in_val` was an array, `out_val` will be an array of + type `np.float64`. + + """ + + if isinstance(in_val, np.ndarray): + out_val = in_val.astype(np.float64) + else: + out_val = in_val + + return out_val + + def checklat(lat, name='lat'): """Makes sure the latitude is inside [-90, 90], clipping close values (tolerance 1e-4). diff --git a/apexpy/igrf13coeffs.txt b/apexpy/igrf14coeffs.txt similarity index 88% rename from apexpy/igrf13coeffs.txt rename to apexpy/igrf14coeffs.txt index 9b362e06..13e71226 100644 --- a/apexpy/igrf13coeffs.txt +++ b/apexpy/igrf14coeffs.txt @@ -1,199 +1,199 @@ -# 13th Generation International Geomagnetic Reference Field Schmidt semi-normalised spherical harmonic coefficients, degree n=1,13 +# 14th Generation International Geomagnetic Reference Field Schmidt semi-normalised spherical harmonic coefficients, degree n=1,13 # in units nanoTesla for IGRF and definitive DGRF main-field models (degree n=1,8 nanoTesla/year for secular variation (SV)) -c/s deg ord IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF IGRF SV -g/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 2015.0 2020.0 2020-25 -g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.57 -29441.46 -29404.8 5.7 -g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1586.42 -1501.77 -1450.9 7.4 -h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4944.26 4795.99 4652.5 -25.9 -g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.06 -2445.88 -2499.6 -11.0 -g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.34 3012.20 2982.0 -7.0 -h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2708.54 -2845.41 -2991.6 -30.2 -g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.17 1676.35 1677.0 -2.1 -h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.73 -642.17 -734.6 -22.4 -g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.85 1350.33 1363.2 2.2 -g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.54 -2352.26 -2381.2 -5.9 -h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.40 -115.29 -82.1 6.0 -g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1232.10 1225.85 1236.2 3.1 -h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.75 245.04 241.9 -1.1 -g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 633.73 581.69 525.7 -12.0 -h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -537.03 -538.70 -543.4 0.5 -g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.66 907.42 903.0 -1.2 -g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 808.97 813.68 809.5 -1.6 -h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.48 283.54 281.9 -0.1 -g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.58 120.49 86.3 -5.9 -h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.03 -188.43 -158.4 6.5 -g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -356.83 -334.85 -309.4 5.2 -h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.46 180.95 199.7 3.6 -g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.40 70.38 48.0 -5.1 -h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.72 -329.23 -349.7 -5.0 -g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -230.87 -232.91 -234.3 -0.3 -g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.29 360.14 363.2 0.5 -h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.58 46.98 47.7 0.0 -g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.26 192.35 187.8 -0.6 -h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 189.01 196.98 208.3 2.5 -g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.05 -140.94 -140.7 0.2 -h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.06 -119.14 -121.2 -0.6 -g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.17 -157.40 -151.2 1.3 -h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 -0.01 15.98 32.3 3.0 -g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -8.03 4.30 13.5 0.9 -h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 101.04 100.12 98.9 0.3 -g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.78 69.55 66.0 -0.5 -g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.69 67.57 65.5 -0.3 -h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.90 -20.61 -19.1 0.0 -g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 75.92 72.79 72.9 0.4 -h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.18 33.30 25.1 -1.6 -g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.40 -129.85 -121.5 1.3 -h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.54 58.74 52.8 -1.3 -g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.83 -28.93 -36.2 -1.4 -h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.26 -66.64 -64.5 0.8 -g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.10 13.14 13.5 0.0 -h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.02 7.35 8.9 0.0 -g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -78.09 -70.85 -64.7 0.9 -h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 55.40 62.41 68.1 1.0 -g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.44 81.29 80.6 -0.1 -g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.00 -75.99 -76.7 -0.2 -h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.80 -54.27 -51.5 0.6 -g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.55 -6.79 -8.2 0.0 -h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.20 -19.53 -16.9 0.6 -g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.24 51.82 56.5 0.7 -h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.54 5.59 2.2 -0.8 -g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.00 15.07 15.8 0.1 -h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.96 24.45 23.5 -0.2 -g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.46 9.32 6.4 -0.5 -h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.03 3.27 -2.2 -1.1 -g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.64 -2.88 -7.2 -0.8 -h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.61 -27.50 -27.2 0.1 -g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.92 6.61 9.8 0.8 -h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.28 -2.32 -1.8 0.3 -g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.41 23.98 23.7 0.0 -g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.21 8.89 9.7 0.1 -h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.84 10.04 8.4 -0.2 -g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.50 -16.78 -17.6 -0.1 -h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.03 -18.26 -15.3 0.6 -g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.59 -3.16 -0.5 0.4 -h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.83 13.18 12.8 -0.2 -g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.34 -20.56 -21.1 -0.1 -h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.41 -14.60 -11.7 0.5 -g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.61 13.33 15.3 0.4 -h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.71 16.16 14.9 -0.3 -g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.85 11.76 13.7 0.3 -h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 6.96 5.69 3.6 -0.4 -g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.05 -15.98 -16.5 -0.1 -h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.74 -9.10 -6.9 0.5 -g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.54 -2.02 -0.3 0.4 -h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.64 2.26 2.8 0.0 -g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.50 5.33 5.0 0.0 -g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.45 8.83 8.4 0.0 -h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.54 -21.77 -23.4 0.0 -g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.45 3.02 2.9 0.0 -h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.51 10.76 11.0 0.0 -g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.27 -3.22 -1.5 0.0 -h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.75 11.74 9.8 0.0 -g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.13 0.67 -1.1 0.0 -h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.14 -6.74 -5.1 0.0 -g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.38 -13.20 -13.2 0.0 -h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.42 -6.88 -6.3 0.0 -g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.76 -0.10 1.1 0.0 -h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 7.97 7.79 7.8 0.0 -g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.43 8.68 8.8 0.0 -h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.14 1.04 0.4 0.0 -g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.42 -9.06 -9.3 0.0 -h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.08 -3.89 -1.4 0.0 -g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.08 -10.54 -11.9 0.0 -h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.01 8.44 9.6 0.0 -g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -1.94 -2.01 -1.9 0.0 -g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.24 -6.26 -6.2 0.0 -h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.73 3.28 3.4 0.0 -g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.89 0.17 -0.1 0.0 -h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.10 -0.40 -0.2 0.0 -g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.07 0.55 1.7 0.0 -h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.71 4.55 3.6 0.0 -g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.16 -0.55 -0.9 0.0 -h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.44 4.40 4.8 0.0 -g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.45 1.70 0.7 0.0 -h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.22 -7.92 -8.6 0.0 -g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.33 -0.67 -0.9 0.0 -h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -0.96 -0.61 -0.1 0.0 -g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.13 2.13 1.9 0.0 -h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -3.95 -4.16 -4.3 0.0 -g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.09 2.33 1.4 0.0 -h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -1.99 -2.85 -3.4 0.0 -g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.03 -1.80 -2.4 0.0 -h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -1.97 -1.12 -0.1 0.0 -g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.80 -3.59 -3.8 0.0 -h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.31 -8.72 -8.8 0.0 -g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.05 3.00 3.0 0.0 -g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.48 -1.40 -1.4 0.0 -h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.13 0.00 0.0 0.0 -g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.03 -2.30 -2.5 0.0 -h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.67 2.11 2.5 0.0 -g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.65 2.08 2.3 0.0 -h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.66 -0.60 -0.6 0.0 -g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.51 -0.79 -0.9 0.0 -h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.76 -1.05 -0.4 0.0 -g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.54 0.58 0.3 0.0 -h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.85 0.76 0.6 0.0 -g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.79 -0.70 -0.7 0.0 -h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.39 -0.20 -0.2 0.0 -g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.37 0.14 -0.1 0.0 -h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.51 -2.12 -1.7 0.0 -g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.79 1.70 1.4 0.0 -h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.27 -1.44 -1.6 0.0 -g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.12 -0.22 -0.6 0.0 -h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.11 -2.57 -3.0 0.0 -g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.75 0.44 0.2 0.0 -h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.94 -2.01 -2.0 0.0 -g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.75 3.49 3.1 0.0 -h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.86 -2.34 -2.6 0.0 -g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.12 -2.09 -2.0 0.0 -g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.21 -0.16 -0.1 0.0 -h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.87 -1.08 -1.2 0.0 -g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.30 0.46 0.5 0.0 -h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.27 0.37 0.5 0.0 -g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.04 1.23 1.3 0.0 -h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.13 1.75 1.4 0.0 -g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.63 -0.89 -1.2 0.0 -h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.49 -2.19 -1.8 0.0 -g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.95 0.85 0.7 0.0 -h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.49 0.27 0.1 0.0 -g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.11 0.10 0.3 0.0 -h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.59 0.72 0.8 0.0 -g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.52 0.54 0.5 0.0 -h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.00 -0.09 -0.2 0.0 -g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.39 -0.37 -0.3 0.0 -h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.13 0.29 0.6 0.0 -g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.37 -0.43 -0.5 0.0 -h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.27 0.23 0.2 0.0 -g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.21 0.22 0.1 0.0 -h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.86 -0.89 -0.9 0.0 -g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.77 -0.94 -1.1 0.0 -h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.23 -0.16 0.0 0.0 -g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.04 -0.03 -0.3 0.0 -h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.87 0.72 0.5 0.0 -g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.09 -0.02 0.1 0.0 -g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.89 -0.92 -0.9 0.0 -h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.87 -0.88 -0.9 0.0 -g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.31 0.42 0.5 0.0 -h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.30 0.49 0.6 0.0 -g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.42 0.63 0.7 0.0 -h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.66 1.56 1.4 0.0 -g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.45 -0.42 -0.3 0.0 -h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.59 -0.50 -0.4 0.0 -g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.08 0.96 0.8 0.0 -h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.14 -1.24 -1.3 0.0 -g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.31 -0.19 0.0 0.0 -h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.07 -0.10 -0.1 0.0 -g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.78 0.81 0.8 0.0 -h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.54 0.42 0.3 0.0 -g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.18 -0.13 0.0 0.0 -h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.10 -0.04 -0.1 0.0 -g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.38 0.38 0.4 0.0 -h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.49 0.48 0.5 0.0 -g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.02 0.08 0.1 0.0 -h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.44 0.48 0.5 0.0 -g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.42 0.46 0.5 0.0 -h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.25 -0.30 -0.4 0.0 -g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.26 -0.35 -0.5 0.0 -h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.53 -0.43 -0.4 0.0 -g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.26 -0.36 -0.4 0.0 -h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.79 -0.71 -0.6 0.0 +c/s deg ord IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF IGRF SV +g/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 2015.0 2020.0 2025.0 2025-30 +g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.57 -29441.46 -29403.41 -29350.0 12.6 +g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1586.42 -1501.77 -1451.37 -1410.3 10.0 +h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4944.26 4795.99 4653.35 4545.5 -21.5 +g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.06 -2445.88 -2499.78 -2556.2 -11.2 +g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.34 3012.20 2981.96 2950.9 -5.3 +h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2708.54 -2845.41 -2991.72 -3133.6 -27.3 +g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.17 1676.35 1676.85 1648.7 -8.3 +h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.73 -642.17 -734.62 -814.2 -11.1 +g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.85 1350.33 1363.00 1360.9 -1.5 +g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.54 -2352.26 -2380.80 -2404.2 -4.4 +h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.40 -115.29 -81.96 -56.9 3.8 +g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1232.10 1225.85 1236.06 1243.8 0.4 +h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.75 245.04 241.80 237.6 -0.2 +g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 633.73 581.69 525.60 453.4 -15.6 +h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -537.03 -538.70 -542.52 -549.6 -3.9 +g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.66 907.42 902.82 894.7 -1.7 +g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 808.97 813.68 809.47 799.6 -2.3 +h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.48 283.54 282.10 278.6 -1.3 +g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.58 120.49 86.18 55.8 -5.8 +h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.03 -188.43 -158.50 -134.0 4.1 +g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -356.83 -334.85 -309.47 -281.1 5.4 +h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.46 180.95 199.75 212.0 1.6 +g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.40 70.38 47.44 12.0 -6.8 +h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.72 -329.23 -350.30 -375.4 -4.1 +g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -230.87 -232.91 -234.42 -232.9 0.6 +g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.29 360.14 363.26 369.0 1.3 +h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.58 46.98 47.52 45.3 -0.5 +g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.26 192.35 187.86 187.2 0.0 +h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 189.01 196.98 208.36 220.0 2.1 +g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.05 -140.94 -140.73 -138.7 0.7 +h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.06 -119.14 -121.43 -122.9 0.5 +g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.17 -157.40 -151.16 -141.9 2.3 +h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 -0.01 15.98 32.09 42.9 1.7 +g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -8.03 4.30 13.98 20.9 1.0 +h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 101.04 100.12 99.14 106.2 1.9 +g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.78 69.55 65.97 64.3 -0.2 +g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.69 67.57 65.56 63.8 -0.3 +h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.90 -20.61 -19.22 -18.4 0.3 +g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 75.92 72.79 72.96 76.7 0.8 +h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.18 33.30 25.02 16.8 -1.6 +g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.40 -129.85 -121.57 -115.7 1.2 +h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.54 58.74 52.76 48.9 -0.4 +g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.83 -28.93 -36.06 -40.9 -0.8 +h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.26 -66.64 -64.40 -59.8 0.8 +g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.10 13.14 13.60 14.9 0.4 +h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.02 7.35 8.96 10.9 0.7 +g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -78.09 -70.85 -64.80 -60.8 0.9 +h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 55.40 62.41 68.04 72.8 0.9 +g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.44 81.29 80.54 79.6 -0.1 +g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.00 -75.99 -76.63 -76.9 -0.1 +h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.80 -54.27 -51.50 -48.9 0.6 +g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.55 -6.79 -8.23 -8.8 -0.1 +h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.20 -19.53 -16.85 -14.4 0.5 +g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.24 51.82 56.45 59.3 0.5 +h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.54 5.59 2.36 -1.0 -0.7 +g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.00 15.07 15.80 15.8 -0.1 +h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.96 24.45 23.56 23.5 0.0 +g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.46 9.32 6.30 2.5 -0.8 +h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.03 3.27 -2.19 -7.4 -0.9 +g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.64 -2.88 -7.21 -11.2 -0.8 +h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.61 -27.50 -27.19 -25.1 0.5 +g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.92 6.61 9.77 14.3 0.9 +h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.28 -2.32 -1.90 -2.2 -0.3 +g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.41 23.98 23.66 23.1 -0.1 +g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.21 8.89 9.74 10.9 0.2 +h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.84 10.04 8.43 7.2 -0.3 +g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.50 -16.78 -17.49 -17.5 0.0 +h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.03 -18.26 -15.23 -12.6 0.4 +g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.59 -3.16 -0.49 2.0 0.4 +h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.83 13.18 12.83 11.5 -0.3 +g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.34 -20.56 -21.07 -21.8 -0.1 +h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.41 -14.60 -11.76 -9.7 0.4 +g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.61 13.33 15.28 16.9 0.3 +h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.71 16.16 14.94 12.7 -0.5 +g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.85 11.76 13.65 14.9 0.1 +h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 6.96 5.69 3.62 0.7 -0.6 +g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.05 -15.98 -16.59 -16.8 0.0 +h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.74 -9.10 -6.90 -5.2 0.3 +g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.54 -2.02 -0.34 1.0 0.3 +h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.64 2.26 2.90 3.9 0.2 +g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.50 5.33 5.03 4.7 0.0 +g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.45 8.83 8.36 8.0 0.0 +h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.54 -21.77 -23.44 -24.8 0.0 +g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.45 3.02 2.84 3.0 0.0 +h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.51 10.76 11.04 12.1 0.0 +g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.27 -3.22 -1.48 -0.2 0.0 +h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.75 11.74 9.86 8.3 0.0 +g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.13 0.67 -1.14 -2.5 0.0 +h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.14 -6.74 -5.13 -3.4 0.0 +g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.38 -13.20 -13.22 -13.1 0.0 +h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.42 -6.88 -6.20 -5.3 0.0 +g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.76 -0.10 1.08 2.4 0.0 +h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 7.97 7.79 7.79 7.2 0.0 +g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.43 8.68 8.82 8.6 0.0 +h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.14 1.04 0.40 -0.6 0.0 +g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.42 -9.06 -9.23 -8.7 0.0 +h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.08 -3.89 -1.44 0.8 0.0 +g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.08 -10.54 -11.86 -12.8 0.0 +h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.01 8.44 9.60 9.8 0.0 +g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -1.94 -2.01 -1.84 -1.3 0.0 +g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.24 -6.26 -6.25 -6.4 0.0 +h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.73 3.28 3.38 3.3 0.0 +g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.89 0.17 -0.11 0.2 0.0 +h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.10 -0.40 -0.18 0.1 0.0 +g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.07 0.55 1.66 2.0 0.0 +h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.71 4.55 3.50 2.5 0.0 +g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.16 -0.55 -0.86 -1.0 0.0 +h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.44 4.40 4.86 5.4 0.0 +g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.45 1.70 0.65 -0.5 0.0 +h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.22 -7.92 -8.62 -9.0 0.0 +g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.33 -0.67 -0.88 -0.9 0.0 +h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -0.96 -0.61 -0.11 0.4 0.0 +g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.13 2.13 1.88 1.5 0.0 +h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -3.95 -4.16 -4.26 -4.2 0.0 +g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.09 2.33 1.44 0.9 0.0 +h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -1.99 -2.85 -3.43 -3.8 0.0 +g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.03 -1.80 -2.38 -2.6 0.0 +h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -1.97 -1.12 -0.10 0.9 0.0 +g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.80 -3.59 -3.84 -3.9 0.0 +h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.31 -8.72 -8.84 -9.0 0.0 +g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.05 3.00 2.96 3.0 0.0 +g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.48 -1.40 -1.36 -1.4 0.0 +h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.13 0.00 -0.02 0.0 0.0 +g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.03 -2.30 -2.51 -2.5 0.0 +h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.67 2.11 2.50 2.8 0.0 +g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.65 2.08 2.31 2.4 0.0 +h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.66 -0.60 -0.55 -0.6 0.0 +g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.51 -0.79 -0.85 -0.6 0.0 +h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.76 -1.05 -0.39 0.1 0.0 +g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.54 0.58 0.28 0.0 0.0 +h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.85 0.76 0.62 0.5 0.0 +g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.79 -0.70 -0.66 -0.6 0.0 +h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.39 -0.20 -0.21 -0.3 0.0 +g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.37 0.14 -0.07 -0.1 0.0 +h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.51 -2.12 -1.66 -1.2 0.0 +g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.79 1.70 1.44 1.1 0.0 +h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.27 -1.44 -1.60 -1.7 0.0 +g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.12 -0.22 -0.59 -1.0 0.0 +h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.11 -2.57 -2.98 -2.9 0.0 +g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.75 0.44 0.18 -0.1 0.0 +h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.94 -2.01 -1.97 -1.8 0.0 +g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.75 3.49 3.09 2.6 0.0 +h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.86 -2.34 -2.51 -2.3 0.0 +g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.12 -2.09 -2.00 -2.0 0.0 +g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.21 -0.16 -0.13 -0.1 0.0 +h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.87 -1.08 -1.15 -1.2 0.0 +g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.30 0.46 0.43 0.4 0.0 +h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.27 0.37 0.52 0.6 0.0 +g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.04 1.23 1.28 1.2 0.0 +h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.13 1.75 1.37 1.0 0.0 +g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.63 -0.89 -1.14 -1.2 0.0 +h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.49 -2.19 -1.81 -1.5 0.0 +g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.95 0.85 0.71 0.6 0.0 +h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.49 0.27 0.08 0.0 0.0 +g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.11 0.10 0.31 0.5 0.0 +h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.59 0.72 0.71 0.6 0.0 +g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.52 0.54 0.49 0.5 0.0 +h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.00 -0.09 -0.15 -0.2 0.0 +g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.39 -0.37 -0.26 -0.1 0.0 +h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.13 0.29 0.55 0.8 0.0 +g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.37 -0.43 -0.47 -0.5 0.0 +h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.27 0.23 0.16 0.1 0.0 +g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.21 0.22 0.09 -0.2 0.0 +h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.86 -0.89 -0.93 -0.9 0.0 +g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.77 -0.94 -1.13 -1.2 0.0 +h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.23 -0.16 -0.04 0.1 0.0 +g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.04 -0.03 -0.33 -0.7 0.0 +h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.87 0.72 0.52 0.2 0.0 +g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.09 -0.02 0.08 0.2 0.0 +g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.89 -0.92 -0.93 -0.9 0.0 +h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.87 -0.88 -0.88 -0.9 0.0 +g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.31 0.42 0.53 0.6 0.0 +h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.30 0.49 0.64 0.7 0.0 +g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.42 0.63 0.72 0.7 0.0 +h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.66 1.56 1.40 1.2 0.0 +g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.45 -0.42 -0.30 -0.2 0.0 +h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.59 -0.50 -0.38 -0.3 0.0 +g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.08 0.96 0.75 0.5 0.0 +h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.14 -1.24 -1.31 -1.3 0.0 +g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.31 -0.19 -0.01 0.1 0.0 +h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.07 -0.10 -0.09 -0.1 0.0 +g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.78 0.81 0.76 0.7 0.0 +h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.54 0.42 0.29 0.2 0.0 +g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.18 -0.13 -0.05 0.0 0.0 +h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.10 -0.04 -0.11 -0.2 0.0 +g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.38 0.38 0.37 0.3 0.0 +h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.49 0.48 0.47 0.5 0.0 +g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.02 0.08 0.13 0.2 0.0 +h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.44 0.48 0.54 0.6 0.0 +g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.42 0.46 0.45 0.4 0.0 +h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.25 -0.30 -0.41 -0.6 0.0 +g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.26 -0.35 -0.46 -0.5 0.0 +h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.53 -0.43 -0.36 -0.3 0.0 +g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.26 -0.36 -0.40 -0.4 0.0 +h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.79 -0.71 -0.60 -0.5 0.0 diff --git a/apexpy/tests/test_Apex.py b/apexpy/tests/test_Apex.py index 3c120ce1..0bb0b3b1 100644 --- a/apexpy/tests/test_Apex.py +++ b/apexpy/tests/test_Apex.py @@ -28,7 +28,7 @@ class TestApexInit(object): def setup_method(self): """Initialize all tests.""" self.apex_out = None - self.test_date = dt.datetime.utcnow() + self.test_date = dt.datetime.now(tz=dt.timezone.utc) self.test_refh = 0 self.bad_file = 'foo/path/to/datafile.blah' self.temp_file = None @@ -345,7 +345,8 @@ def get_input_args(self, method_name, precision=0.0): def test_apex_conversion_today(self): """Test Apex class conversion with today's date.""" - self.apex_out = apexpy.Apex(date=dt.datetime.utcnow(), refh=300) + self.apex_out = apexpy.Apex(date=dt.datetime.now(tz=dt.timezone.utc), + refh=300) assert not np.isnan(self.apex_out.geo2apex(self.in_lat, self.in_lon, self.in_alt)).any() return @@ -1333,7 +1334,7 @@ def test_map_EV_to_height_array_location(self, ev_flag, test_mapped, # Set the base input and output values eshape = list(arr_shape) eshape.insert(0, 3) - edata = np.array([[1, 2, 3]] * np.product(arr_shape)).transpose() + edata = np.array([[1, 2, 3]] * np.prod(arr_shape)).transpose() in_args = [60, 15, 100, 500, edata.reshape(tuple(eshape))] # Update inputs for one vectorized value if this is a location input @@ -1809,11 +1810,11 @@ class TestApexMethodExtrapolateIGRF(object): def setup_method(self): """Initialize all tests.""" - self.apex_out = apexpy.Apex(date=2025, refh=300) + self.apex_out = apexpy.Apex(date=2030, refh=300) self.in_lat = 60 self.in_lon = 15 self.in_alt = 100 - self.in_time = dt.datetime(2024, 2, 3, 4, 5, 6) + self.in_time = dt.datetime(2029, 2, 3, 4, 5, 6) return def teardown_method(self): @@ -1823,12 +1824,12 @@ def teardown_method(self): @pytest.mark.parametrize("method_name, out_comp", [("geo2apex", - (56.25343704223633, 92.04932403564453)), + (56.30344009399414, 91.99834442138672)), ("apex2geo", - (53.84184265136719, -66.93045806884766, - 3.6222547805664362e-06)), + (54.22148513793945, -67.09271240234375, + 4.268868451617891e-06)), ("geo2qd", - (56.82968521118164, 92.04932403564453)), + (56.87860870361328, 91.99834442138672)), ("apex2qd", (60.498401178276744, 15.0)), ("qd2apex", (59.49138097045895, 15.0))]) def test_method_scalar_input(self, method_name, out_comp): @@ -1862,7 +1863,7 @@ def test_convert_to_mlt(self): user_out = self.apex_out.mlon2mlt(self.in_lon, self.in_time) # Set comparison values - out_comp = 23.955474853515625 + out_comp = 23.933631388346353 # Evaluate user output np.testing.assert_allclose(user_out, out_comp, rtol=1e-5, atol=1e-5) diff --git a/apexpy/tests/test_fortranapex.py b/apexpy/tests/test_fortranapex.py index 33fc97de..d3c503ca 100644 --- a/apexpy/tests/test_fortranapex.py +++ b/apexpy/tests/test_fortranapex.py @@ -14,6 +14,7 @@ from numpy.testing import assert_allclose from importlib import resources +import os import pytest import apexpy @@ -25,7 +26,7 @@ class TestFortranApex(object): def setup_method(self): """Initialize each test.""" - datafile = str(resources.path(apexpy, 'apexsh.dat').__enter__()) + datafile = os.path.join(resources.files(apexpy), 'apexsh.dat') fa.loadapxsh(datafile, 2000) # Set the inputs diff --git a/apexpy/tests/test_helpers.py b/apexpy/tests/test_helpers.py index b270810f..68ded850 100644 --- a/apexpy/tests/test_helpers.py +++ b/apexpy/tests/test_helpers.py @@ -61,13 +61,54 @@ def teardown_method(self): del self.in_shape, self.calc_val, self.test_val def eval_output(self, rtol=1e-7, atol=0.0): - """Evaluate the values and shape of the calculated and expected output. - """ + """Evaluate the values and shape of the calced and expected output.""" np.testing.assert_allclose(self.calc_val, self.test_val, rtol=rtol, atol=atol) assert np.asarray(self.calc_val).shape == self.in_shape return + @pytest.mark.parametrize('val', [90, np.nan, None, [20.0], True]) + def test_check_set_array_float_no_modify(self, val): + """Test `set_array_float` with inputs that won't be modified. + + Parameters + ---------- + val : any but np.array + Value without a 'dtype' attribute + + """ + self.calc_val = helpers.set_array_float(val) + + if val is None: + assert self.calc_val is None + elif np.isnan(val): + assert np.isnan(self.calc_val) + else: + assert self.calc_val == val + return + + @pytest.mark.parametrize('dtype', [int, float, bool, object]) + def test_check_set_array_float_success(self, dtype): + """Test `set_array_float` modifies array inputs. + + Parameters + ---------- + dtype : dtype + Data type to use when creating input array + + """ + self.in_shape = (2,) + self.calc_val = helpers.set_array_float( + np.ones(shape=self.in_shape, dtype=dtype)) + + # Test that the output dtype is as expected + assert self.calc_val.dtype == np.float64 + + # Ensure values are unity + self.test_val = np.ones(shape=self.in_shape, dtype=np.float64) + self.eval_output() + return + @pytest.mark.parametrize('lat', [90, 0, -90, np.nan]) def test_checklat_scalar(self, lat): """Test good latitude check with scalars. diff --git a/docs/api.rst b/docs/api.rst index 3fc8568e..26cab95c 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,5 +1,5 @@ -Reference -========= +Package Structure +================= The :py:class:`apexpy.Apex` class is used for all the main functionality (converting between coordinate systems, field line mapping, and calculating @@ -29,12 +29,15 @@ Command-line interface .. highlight:: none -When you install this package you will get a command called ``apexpy``, which -is an interface to the :py:meth:`~apexpy.Apex.convert` method. See the -documentation for this method for a more thorough explanation of arguments and -behaviour. +When you install this package you used to get a command called ``apexpy``, which +is an interface to the :py:meth:`~apexpy.Apex.convert` method. If this +interface is missing (may be caused by the installation path not being a part +of your path), you may use ``python -m apexpy`` instead. -You can get help on the command by running ``apexpy -h``. +See the documentation for this method for a more thorough explanation of +arguments and behaviour. + +You can get help on the command by running ``python -m apexpy -h``. .. code:: diff --git a/docs/authors.rst b/docs/authors.rst index e122f914..a887eee3 100644 --- a/docs/authors.rst +++ b/docs/authors.rst @@ -1 +1,3 @@ +.. _authors: + .. include:: ../AUTHORS.rst diff --git a/docs/citing.rst b/docs/citing.rst new file mode 100644 index 00000000..9c3aad4d --- /dev/null +++ b/docs/citing.rst @@ -0,0 +1,29 @@ +Citations +========= + +When referring to this software package, please be sure to include the package +and specify which version you used ``_. +Note that this DOI will always point to the latest version of the code. A list +of DOIs for all versions can be found at the Zenodo page above. The version can +by found by printing :py:attr:`apexpy.__version__`. We also recommend citing a +reference to the coordinate system you use. More relevant references can be +found in :ref:`authors`. + +Example for citation in BibTex for a generalized version: + +.. code:: + + @misc{apexpy, + author = {van der Meeren, Christer and + Laundal, Karl M. and + Burrell, Angeline G. and + Lamarche, Leslie and + Starr, Gregory and + Reimer, Ashton and + Morschhauser, Achim and + Michaelis, Ingo}, + title = {ApexPy vX.Y.Z}, + year = 2024, + doi = {10.5281/zenodo.1214206}, + url = {https://github.com/aburrell/apexpy} + } diff --git a/docs/conf.py b/docs/conf.py index 2994989d..7df53ae2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- - +"""Configuration for apexpy documentation.""" import json import os -import re +from pyproject_parser import PyProject extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', @@ -13,22 +13,18 @@ 'sphinx.ext.extlinks', 'autoapi.extension'] -# Define common elements +# General information about the project. +info = PyProject.load("../pyproject.toml") +# Define common elements source_suffix = '.rst' master_doc = 'index' project = 'ApexPy' -year = '2022' +year = '2024' zenodo = json.loads(open('../.zenodo.json').read()) author = ' and '.join([zcreator['name'] for zcreator in zenodo['creators']]) copyright = ', '.join([year, author]) - -# Get version number from __init__.py -regex = r"(?<=__version__..\s)\S+" -with open('../apexpy/__init__.py', 'r') as fin: - text = fin.read() -match = re.findall(regex, text) -version = release = match[0].strip("'") +version = release = info.project['version'].base_version # Configure autoapi autoapi_type = 'python' diff --git a/docs/index.rst b/docs/index.rst index 7357dcb7..f7733ea3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,6 +12,7 @@ Contents contributing maintenance authors + citing changelog Indices and tables diff --git a/docs/installation.rst b/docs/installation.rst index 6df4497e..1f041969 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -26,10 +26,7 @@ Tested environments The package has been tested with the following setups (others might work, too): * Windows (64 bit Python), Linux (64 bit), and Mac (64 bit) -* Python 3.9, 3.10, 3.11 - -Note that :py:mod:`apexpy` is NOT currently compatable with Python 3.12 or -`NumPy 2.0 `_. +* Python 3.9, 3.10, 3.11, and 3.12 Advanced Installation diff --git a/docs/maintenance.rst b/docs/maintenance.rst index beba5c1b..9745a374 100644 --- a/docs/maintenance.rst +++ b/docs/maintenance.rst @@ -15,30 +15,31 @@ Updating IGRF The `International Geomagnetic Reference Field `_ is regularly updated to reflect the most recent changes to the Terrestrial -magnetic field. apexpy currently uses IRGF-13 coefficients, which are provided -in the ``apexpy/apexpy/igrf13coeff.txt`` file. To change or update the +magnetic field. apexpy currently uses IRGF-14 coefficients, which are provided +in the ``apexpy/apexpy/igrf14coeff.txt`` file. To change or update the magnetic field coefficients used by apexpy, you need to update the python code, then rerun the fortran program that builds ``apexpy/apexpy/apexsh.dat``. This -is what makes apexpy performant. For more details, see Emmert et al. [2010] [1]_. +is what makes apexpy performant. For more details, see Emmert et al. [2010] [1]_. Assuming your new coefficient file has the same format, the process is simple: 1. Clone the repository or your fork of the repository (see :ref:`contributing`). 2. Update ``apexpy/apexpy/apex.py`` variable ``igrf_fn`` by setting - it equal to the new IGRF coefficient filename (``igrf13coeff.txt``, for example). + it equal to the new IGRF coefficient filename (``igrf14coeff.txt``, for + example). 3. In ``apexpy/fortranapex/checkapexsh.f90``, update the variable ``igrffilein`` to the new IGRF coefficent filename. Relative paths are allowed. 4. Modify ``checkapexsh.f90`` by adding the next 5 year epoch to the ``epochgrid`` variable and updating the ``nepochgrid`` variable as - necessary. For example, if the newest IGRF coefficients are good up to 2025 - and ``epochgrid`` only has up to the year 2020, then add 2025 to + necessary. For example, if the newest IGRF coefficients are good up to 2030 + and ``epochgrid`` only has up to the year 2025, then add 2030 to ``epochgrid`` and then increment ``nepochgrid`` by 1. 5. Execute the ``apextest`` binary to generate the new ``apexsh.dat`` file. 6. Update the unit tests in the class ``TestApexMethodExtrapolateIGRF`` in - ``apexpy/apexpy/tests/test_Apex.py`` so that they check the methods are working - correctly with dates after the latest IGRF epoch (i.e., if the latest epoch is - 2020, set the test to initialize with the year 2025). You will have to update - the hard-coded confirmation values used by these tests. + ``apexpy/apexpy/tests/test_Apex.py`` so that they check the methods are + working correctly with dates after the latest IGRF epoch (i.e., if the + latest epoch is 2025, set the test to initialize with the year 2030). You + will have to update the hard-coded confirmation values used by these tests. 7. Commit all changes and create a pull request on GitHub to integrate your branch with updated IGRF into the main repository. @@ -52,12 +53,13 @@ be done within the ``apexpy/fortranapex`` directory. 2. Build the ``apextest`` binary by running the ``make`` command. 3. Execute the ``apextext`` binary. 4. Confirm the output printed to the screen matches the test output shown in - the comment block at the bottom of ``checkapexsh.f90``. The output may not match - the test output exactly due to floating point errors and improvements in the - precision of the calculation. -5. If the modifications involved adding or removing fortran source files, modify the - list of extension sources in ``setup.cfg``. -6. Rebuild and install apexpy following the instructions in :ref:`installation-build`. + the comment block at the bottom of ``checkapexsh.f90``. The output may not + match the test output exactly due to floating point errors and improvements + in the precision of the calculation. +5. If the modifications involved adding or removing fortran source files, modify + the list of extension sources in ``setup.cfg``. +6. Rebuild and install apexpy following the instructions in + :ref:`installation-build`. Updating tests and style standards ----------------------------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index 470e42f3..7abacb21 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ +pyproject_parser sphinx>=1.3 sphinx-autoapi sphinx_rtd_theme diff --git a/fortranapex/checkapexsh.f90 b/fortranapex/checkapexsh.f90 index a590bc30..bdbee556 100644 --- a/fortranapex/checkapexsh.f90 +++ b/fortranapex/checkapexsh.f90 @@ -24,11 +24,11 @@ program checkapexsh implicit none - integer(4), parameter :: nepochgrid=26 + integer(4), parameter :: nepochgrid=27 ! integer(4), parameter :: nepochgrid=3 ! For testing/debugging integer(4) :: lmax=3, nmmax=6 character(1000) :: apexshfile='../apexpy/apexsh.dat' - character(len=1000) :: igrffilein='../apexpy/igrf13coeffs.txt' + character(len=1000) :: igrffilein='../apexpy/igrf14coeffs.txt' real(8) :: epochgrid(0:nepochgrid - 1) real(8) :: epoch real(8) :: glat, glon, alt, hr, prec, error @@ -44,7 +44,7 @@ program checkapexsh epochgrid = (/ 1900.0, 1905.0, 1910.0, 1915.0, 1920.0, 1925.0, 1930.0, & 1935.0, 1940.0, 1945.0, 1950.0, 1955.0, 1960.0, 1965.0, & 1970.0, 1975.0, 1980.0, 1985.0, 1990.0, 1995.0, 2000.0, & - 2005.0, 2010.0, 2015.0, 2020.0, 2025.0 /) + 2005.0, 2010.0, 2015.0, 2020.0, 2025.0, 2030.0 /) ! epochgrid = (/1995.0,2000.0,2005.0/) ! For testing/debugging call makeapxsh(apexshfile, igrffilein, epochgrid, nepochgrid, lmax, nmmax, nmmax) diff --git a/fortranapex/fortranapex.pyf b/fortranapex/fortranapex.pyf index d1e2a17c..23f1709d 100644 --- a/fortranapex/fortranapex.pyf +++ b/fortranapex/fortranapex.pyf @@ -135,9 +135,9 @@ python module fortranapex ! in integer(kind=4) intent(in) :: nmax integer(kind=4) intent(in) :: mmax real(kind=8) intent(in) :: theta - real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(nmax,mmax) :: p - real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(nmax,mmax) :: v - real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(nmax,mmax) :: w + real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(mmax,nmax) :: p + real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(mmax,nmax) :: v + real(kind=8) dimension(1 + nmax,1 + mmax),intent(out),depend(mmax,nmax) :: w end subroutine alfbasis module igrf ! in :fortranapex:igrf.f90 real(kind=8) :: datel @@ -320,7 +320,7 @@ python module fortranapex ! in use magcof character*128 intent(in) :: datafilein character*1000 intent(in) :: igrffilein - real(kind=8) dimension(31),intent(in) :: epochgridin + real(kind=8) dimension(32),intent(in) :: epochgridin integer(kind=4) intent(in) :: nepochin integer(kind=4) intent(in) :: lmaxin integer(kind=4) intent(in) :: mmaxin @@ -343,6 +343,6 @@ python module fortranapex ! in end interface end python module fortranapex -! This file was auto-generated with f2py (version:1.23.0). +! This file was auto-generated with f2py (version:1.26.4). ! See: ! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e diff --git a/fortranapex/makeapexsh.f90 b/fortranapex/makeapexsh.f90 index 309675c4..5bae160d 100644 --- a/fortranapex/makeapexsh.f90 +++ b/fortranapex/makeapexsh.f90 @@ -53,7 +53,7 @@ subroutine makeapxsh(datafilein, igrffilein, epochgridin, nepochin, lmaxin, mmax character(128), intent(in) :: datafilein character(len=1000), intent(in) :: igrffilein - real(8), intent(in) :: epochgridin(0:30) + real(8), intent(in) :: epochgridin(0:31) integer(4), intent(in) :: nmaxin, mmaxin, lmaxin, nepochin integer(4), parameter :: sampfact=4, iun=12 diff --git a/fortranapex/readme.txt b/fortranapex/readme.txt index 25b7c988..14502917 100644 --- a/fortranapex/readme.txt +++ b/fortranapex/readme.txt @@ -73,7 +73,7 @@ file. This is done by: 2020 and the newest IGRF coefficients are good up to 2025, we should add 2025 to epochgrid and then increment nepochgrid by 1. 2) checkapexsh.f90 also expects the IGRF coefficient file to be in the same - directory with the name "igrf13coeffs.txt", so you may also need to update + directory with the name "igrf14coeffs.txt", so you may also need to update the "igrffilein" variable as well. 3) Building the "apextest" binary using the "make" command. 4) Copying the resulting "apexsh.dat" file to the apexpy/src/apexpy directory. diff --git a/meson.build b/meson.build index 2e8fb328..0c616536 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project( 'apexpy', 'c', # Note that the git commit hash cannot be added dynamically here - version: '2.0.2', + version: '2.1.0', license: 'MIT', meson_version: '>= 0.63.0', default_options: [ @@ -20,6 +20,23 @@ add_languages('fortran', native: false) fc = meson.get_compiler('fortran') cc = meson.get_compiler('c') +# https://mesonbuild.com/Python-module.html +py_mod = import('python') +py3 = py_mod.find_installation() +py3_dep = py3.dependency() +message(py3.full_path()) +message(py3.get_install_dir()) + +# Determine whether this is being compiled with numpy 1.X or 2.X +numpy_ver = run_command(py3, + ['-c', 'import numpy; print(numpy.__version__.split(".")[0])'], + check : true +).stdout().strip() +is_numpytwo = numpy_ver.to_int() >= 2 + +message('The Numpy major version is: ', numpy_ver) + + # Don't use the deprecated NumPy C API. Define this to a fixed version instead # of NPY_API_VERSION in order not to break compilation for released versions # when NumPy introduces a new deprecation. Use in a meson.build file:: @@ -28,7 +45,12 @@ cc = meson.get_compiler('c') # 'source_fname', # numpy_nodepr_api) # -numpy_nodepr_api = '-DNPY_NO_DEPRECATED_API=NPY_1_9_API_VERSION' +if is_numpytwo + numpy_nodepr_api = '-DNPY_NO_DEPRECATED_API=NPY_2_0_API_VERSION' +else + numpy_nodepr_api = '-DNPY_NO_DEPRECATED_API=NPY_1_9_API_VERSION' +endif + # This argument is called -Wno-unused-but-set-variable by GCC, however Clang # doesn't recognize that. @@ -45,13 +67,6 @@ endif # Add more link arguments add_project_link_arguments('-lquadmath', language: ['c', 'fortran']) -# https://mesonbuild.com/Python-module.html -py_mod = import('python') -py3 = py_mod.find_installation() -py3_dep = py3.dependency() -message(py3.full_path()) -message(py3.get_install_dir()) - incdir_numpy = run_command(py3, ['-c', 'import os; os.chdir(".."); import numpy; print(numpy.get_include())'], check : true @@ -64,15 +79,19 @@ incdir_f2py = run_command(py3, inc_dirs = include_directories(incdir_numpy, incdir_f2py) -# Don't use the deprecated NumPy C API. Define this to a fixed version instead of -# NPY_API_VERSION in order not to break compilation for released SciPy versions -# when NumPy introduces a new deprecation. Use in a meson.build file:: +# Don't use the deprecated NumPy C API. Define this to a fixed version instead +# of NPY_API_VERSION in order not to break compilation for released SciPy +# versions when NumPy introduces a new deprecation. Use in a meson.build file:: # # py3.extension_module('_name', # 'source_fname', # numpy_nodepr_api) # -c_flags = ['-DNPY_NO_DEPRECATED_API=NPY_1_9_API_VERSION'] +if is_numpytwo + c_flags = ['-DNPY_NO_DEPRECATED_API=NPY_2_0_API_VERSION'] +else + c_flags = ['-DNPY_NO_DEPRECATED_API=NPY_1_9_API_VERSION'] +endif # Platform detection to set more flags for Windows systems is_windows = host_machine.system() == 'windows' @@ -178,6 +197,6 @@ py3.install_sources([ 'apexpy/apex.py', 'apexpy/apexsh.dat', 'apexpy/helpers.py', - 'apexpy/igrf13coeffs.txt'], + 'apexpy/igrf14coeffs.txt'], pure: false, subdir: 'apexpy') diff --git a/pyproject.toml b/pyproject.toml index db23a597..80eec3b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,23 +5,23 @@ requires = [ "meson-python>=0.12.0", "setuptools<60.0", # Do not increase, 60.0 enables vendored distutils "Cython>=0.29.21", - "python-dev-tools", - "oldest-supported-numpy; python_version>'3.9'", - "numpy; python_version<='3.9'" + "ninja", + "numpy" ] [project] name = "apexpy" +version = "2.1.0" license = {file = "LICENSE"} description = "A Python wrapper for Apex coordinates" maintainers = [ {name = "Angeline Burrell", email = "angeline.g.burrell.civ@us.navy.mil"}, ] -requires-python = ">=3.9,<3.12" +requires-python = ">=3.9" dependencies = [ # TODO: update to "pin-compatible" once possible, see - # https://github.com/FFY00/meson-python/issues/29 - "numpy>=1.19.5,<2", + # https://github.com/mesonbuild/meson-python/issues/29 + "numpy>=1.19.5", ] readme = "README.rst" keywords = [ @@ -46,6 +46,7 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries", "Topic :: Scientific/Engineering :: Physics", @@ -56,10 +57,9 @@ classifiers = [ "Operating System :: Unix", "Operating System :: MacOS", ] -dynamic = ['version'] -[tool.project.scripts] -apexpy = {reference = 'apexpy.__main__:main', type = 'console'} +[project.scripts] +apexpy = 'apexpy.__main__:main' [project.optional-dependencies] test = [ @@ -69,10 +69,31 @@ test = [ "pytest-cov", "pytest-xdist" ] -doc = ["sphinx>=1.3", "sphinx-rtd-theme"] +doc = [ + "pyproject_parser", + "sphinx>=1.3", + "sphinx-autoapi", + "sphinx-rtd-theme" +] [project.urls] source = "https://github.com/aburrell/apexpy" documentation = "https://apexpy.readthedocs.io/en/latest/" tracker = "https://github.com/aburrell/apexpy/issues" download = "https://github.com/aburrell/apexpy/releases" + +[tool.setuptools.package-data] +mypkg = [ + "apexsh.dat", + "igrf14coeffs.txt" +] + +[tool.coverage.run] +branch = true +relative_files = true +parallel = true +include = "*/site-packages/apexpy/*" + +[tool.coverage.report] +show_missing = true +precision = 2 diff --git a/setup.cfg b/setup.cfg index 5587fb2a..f9ef6760 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,67 +1,6 @@ [metadata] name = apexpy -version = 2.0.2 -license = MIT -description = "A Python wrapper for Apex coordinates" -long_description = file: README.rst, CHANGELOG.rst -long_description_content_type = text/x-rst -url = https://github.com/aburrell/apexpy -keywords = - apex - modified apex - quasi-dipole - quasi dipole - coordinates - magnetic coordinates - mlt - magnetic local time - conversion - converting -classifiers = - Development Status :: 5 - Production/Stable - Intended Audience :: Science/Research - License :: OSI Approved :: MIT License - Operating System :: Unix - Operating System :: POSIX - Operating System :: Microsoft :: Windows - Operating System :: MacOS :: MacOS X - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - Programming Language :: Python :: Implementation :: CPython - Topic :: Scientific/Engineering :: Physics - Topic :: Utilities - -[options] -zip_safe = False -install_requires = numpy -include_package_data = True -include_entry_points = True - -[options.entry_points] -console_scripts = - apexpy = apexpy.__main__:main - -[options.package_data] -apexpy = - apexsh.dat - igrf13coeffs.txt - -[aliases] -release = register clean --all sdist - -[coverage:run] -branch = True -relative_files = True -parallel = True -include = */site-packages/apexpy/* - -[coverage:report] -show_missing = True -precision = 2 -omit = *migrations* +version = 2.1.0 [flake8] max-line-length = 80