diff --git a/astropy-4.1.tar.gz b/astropy-4.1.tar.gz deleted file mode 100644 index b2b83ed..0000000 --- a/astropy-4.1.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3bad6e1c2619135ad33e4d80452866eb9468f610bf00754da4001c63c1f7049 -size 7835617 diff --git a/astropy-4.2.tar.gz b/astropy-4.2.tar.gz new file mode 100644 index 0000000..048d5ea --- /dev/null +++ b/astropy-4.2.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c194f8a429b8399de64a413a06881ea49f0525cabaa2d78fc132b9e970adc6a +size 7462293 diff --git a/astropy-pr10329-unbundle-erfa_4.1.patch b/astropy-pr10329-unbundle-erfa_4.1.patch deleted file mode 100644 index 6cf1182..0000000 --- a/astropy-pr10329-unbundle-erfa_4.1.patch +++ /dev/null @@ -1,38122 +0,0 @@ -Index: astropy-4.1/astropy/conftest.py -=================================================================== ---- astropy-4.1.orig/astropy/conftest.py -+++ astropy-4.1/astropy/conftest.py -@@ -79,7 +79,7 @@ def pytest_configure(config): - os.mkdir(os.path.join(os.environ['XDG_CACHE_HOME'], 'astropy')) - - config.option.astropy_header = True -- -+ PYTEST_HEADER_MODULES['PyERFA'] = 'erfa' - PYTEST_HEADER_MODULES['Cython'] = 'cython' - PYTEST_HEADER_MODULES['Scikit-image'] = 'skimage' - PYTEST_HEADER_MODULES['asdf'] = 'asdf' -Index: astropy-4.1/astropy/coordinates/builtin_frames/cirs_observed_transforms.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/builtin_frames/cirs_observed_transforms.py -+++ astropy-4.1/astropy/coordinates/builtin_frames/cirs_observed_transforms.py -@@ -6,13 +6,13 @@ Currently that just means AltAz. - """ - - import numpy as np -+import erfa - - from astropy import units as u - from astropy.coordinates.baseframe import frame_transform_graph - from astropy.coordinates.transformations import FunctionTransformWithFiniteDifference - from astropy.coordinates.representation import (SphericalRepresentation, - UnitSphericalRepresentation) --from astropy import _erfa as erfa - - from .cirs import CIRS - from .altaz import AltAz -Index: astropy-4.1/astropy/coordinates/builtin_frames/ecliptic_transforms.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/builtin_frames/ecliptic_transforms.py -+++ astropy-4.1/astropy/coordinates/builtin_frames/ecliptic_transforms.py -@@ -3,6 +3,7 @@ - """ - Contains the transformation functions for getting to/from ecliptic systems. - """ -+import erfa - - from astropy import units as u - from astropy.coordinates.baseframe import frame_transform_graph -@@ -13,7 +14,6 @@ from astropy.coordinates.transformations - from astropy.coordinates.matrix_utilities import (rotation_matrix, - matrix_product, - matrix_transpose) --from astropy import _erfa as erfa - - from .icrs import ICRS - from .gcrs import GCRS -@@ -54,7 +54,7 @@ def _obliquity_only_rotation_matrix(obl= - # The default value is the IAU 1980 value for J2000, - # which is computed using obl80 from ERFA: - # -- # obl = _erfa.obl80(EQUINOX_J2000.jd1, EQUINOX_J2000.jd2) * u.radian -+ # obl = erfa.obl80(EQUINOX_J2000.jd1, EQUINOX_J2000.jd2) * u.radian - return rotation_matrix(obl, "x") - - -Index: astropy-4.1/astropy/coordinates/builtin_frames/icrs_cirs_transforms.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/builtin_frames/icrs_cirs_transforms.py -+++ astropy-4.1/astropy/coordinates/builtin_frames/icrs_cirs_transforms.py -@@ -6,6 +6,7 @@ anything in between (currently that mean - """ - - import numpy as np -+import erfa - - from astropy import units as u - from astropy.coordinates.baseframe import frame_transform_graph -@@ -14,13 +15,12 @@ from astropy.coordinates.representation - CartesianRepresentation, - UnitSphericalRepresentation, - CartesianDifferential) --from astropy import _erfa as erfa - - from .icrs import ICRS - from .gcrs import GCRS - from .cirs import CIRS - from .hcrs import HCRS --from .utils import get_jd12, aticq, atciqz, get_cip, prepare_earth_position_vel -+from .utils import get_jd12, aticq, atciqz, pav2pv, get_cip, prepare_earth_position_vel - - - # First the ICRS/CIRS related transforms -@@ -117,7 +117,7 @@ def icrs_to_gcrs(icrs_coo, gcrs_frame): - # get the position and velocity arrays for the observatory. Need to - # have xyz in last dimension, and pos/vel in one-but-last. - # (Note could use np.stack once our minimum numpy version is >=1.10.) -- obs_pv = erfa.pav2pv( -+ obs_pv = pav2pv( - gcrs_frame.obsgeoloc.get_xyz(xyz_axis=-1).to_value(u.m), - gcrs_frame.obsgeovel.get_xyz(xyz_axis=-1).to_value(u.m/u.s)) - -@@ -160,7 +160,7 @@ def icrs_to_gcrs(icrs_coo, gcrs_frame): - def gcrs_to_icrs(gcrs_coo, icrs_frame): - # set up the astrometry context for ICRS<->GCRS and then convert to BCRS - # coordinate direction -- obs_pv = erfa.pav2pv( -+ obs_pv = pav2pv( - gcrs_coo.obsgeoloc.get_xyz(xyz_axis=-1).to_value(u.m), - gcrs_coo.obsgeovel.get_xyz(xyz_axis=-1).to_value(u.m/u.s)) - -@@ -218,7 +218,7 @@ def gcrs_to_hcrs(gcrs_coo, hcrs_frame): - - # set up the astrometry context for ICRS<->GCRS and then convert to ICRS - # coordinate direction -- obs_pv = erfa.pav2pv( -+ obs_pv = pav2pv( - gcrs_coo.obsgeoloc.get_xyz(xyz_axis=-1).to_value(u.m), - gcrs_coo.obsgeovel.get_xyz(xyz_axis=-1).to_value(u.m/u.s)) - -Index: astropy-4.1/astropy/coordinates/builtin_frames/intermediate_rotation_transforms.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/builtin_frames/intermediate_rotation_transforms.py -+++ astropy-4.1/astropy/coordinates/builtin_frames/intermediate_rotation_transforms.py -@@ -7,11 +7,11 @@ rotations without aberration corrections - """ - - import numpy as np -+import erfa - - from astropy.coordinates.baseframe import frame_transform_graph - from astropy.coordinates.transformations import FunctionTransformWithFiniteDifference - from astropy.coordinates.matrix_utilities import matrix_transpose --from astropy import _erfa as erfa - - from .gcrs import GCRS, PrecessedGeocentric - from .cirs import CIRS -Index: astropy-4.1/astropy/coordinates/builtin_frames/utils.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/builtin_frames/utils.py -+++ astropy-4.1/astropy/coordinates/builtin_frames/utils.py -@@ -7,10 +7,10 @@ the ``builtin_frames`` package. - - import warnings - -+import erfa - import numpy as np - - from astropy import units as u --from astropy import _erfa as erfa - from astropy.time import Time - from astropy.utils import iers - from astropy.utils.exceptions import AstropyWarning -@@ -125,6 +125,16 @@ def norm(p): - return p / np.sqrt(np.einsum('...i,...i', p, p))[..., np.newaxis] - - -+def pav2pv(p, v): -+ """ -+ Combine p- and v- vectors into a pv-vector. -+ """ -+ pv = np.empty(np.broadcast(p, v).shape[:-1], erfa.dt_pv) -+ pv['p'] = p -+ pv['v'] = v -+ return pv -+ -+ - def get_cip(jd1, jd2): - """ - Find the X, Y coordinates of the CIP and the CIO locator, s. -@@ -344,7 +354,7 @@ def prepare_earth_position_vel(time): - - # Also prepare earth_pv for passing to erfa, which wants it as - # a structured dtype. -- earth_pv = erfa.pav2pv( -+ earth_pv = pav2pv( - earth_p.get_xyz(xyz_axis=-1).to_value(u.au), - earth_v.get_xyz(xyz_axis=-1).to_value(u.au/u.d)) - return earth_pv, earth_heliocentric -Index: astropy-4.1/astropy/coordinates/earth.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/earth.py -+++ astropy-4.1/astropy/coordinates/earth.py -@@ -9,6 +9,8 @@ import urllib.error - import urllib.parse - - import numpy as np -+import erfa -+ - from astropy import units as u - from astropy import constants as consts - from astropy.units.quantity import QuantityInfoBase -@@ -17,7 +19,7 @@ from .angles import Angle, Longitude, La - from .representation import CartesianRepresentation, CartesianDifferential - from .errors import UnknownSiteException - from astropy.utils import data --from astropy import _erfa as erfa -+ - - __all__ = ['EarthLocation'] - -Index: astropy-4.1/astropy/coordinates/funcs.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/funcs.py -+++ astropy-4.1/astropy/coordinates/funcs.py -@@ -12,10 +12,10 @@ import warnings - from collections.abc import Sequence - - import numpy as np -+import erfa - - from astropy import units as u - from astropy.constants import c --from astropy import _erfa as erfa - from astropy.io import ascii - from astropy.utils import isiterable, data - from .sky_coordinate import SkyCoord -Index: astropy-4.1/astropy/coordinates/orbital_elements.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/orbital_elements.py -+++ astropy-4.1/astropy/coordinates/orbital_elements.py -@@ -7,9 +7,9 @@ second edition, 1998, Willmann-Bell. - - import numpy as np - from numpy.polynomial.polynomial import polyval -+import erfa - - from astropy import units as u --from astropy import _erfa as erfa - from . import ICRS, SkyCoord, GeocentricTrueEcliptic - from .builtin_frames.utils import get_jd12 - -Index: astropy-4.1/astropy/coordinates/representation.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/representation.py -+++ astropy-4.1/astropy/coordinates/representation.py -@@ -13,10 +13,10 @@ import warnings - - import numpy as np - import astropy.units as u -+from erfa import ufunc as erfa_ufunc - - from .angles import Angle, Longitude, Latitude - from .distances import Distance --from astropy._erfa import ufunc as erfa_ufunc - from astropy.utils import ShapedLikeNDArray, classproperty - from astropy.utils.data_info import MixinInfo - from astropy.utils.exceptions import DuplicateRepresentationWarning -Index: astropy-4.1/astropy/coordinates/sky_coordinate.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/sky_coordinate.py -+++ astropy-4.1/astropy/coordinates/sky_coordinate.py -@@ -5,8 +5,8 @@ import contextlib - import operator - - import numpy as np -+import erfa - --from astropy import _erfa as erfa - from astropy.utils.compat.misc import override__dir__ - from astropy import units as u - from astropy.constants import c as speed_of_light -Index: astropy-4.1/astropy/coordinates/solar_system.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/solar_system.py -+++ astropy-4.1/astropy/coordinates/solar_system.py -@@ -6,9 +6,10 @@ ephemerides from jplephem. - - from urllib.parse import urlparse - from collections import OrderedDict -+import os.path - - import numpy as np --import os.path -+import erfa - - from .sky_coordinate import SkyCoord - from astropy.utils.data import download_file -@@ -16,7 +17,6 @@ from astropy.utils.decorators import cla - from astropy.utils.state import ScienceState - from astropy.utils import indent - from astropy import units as u --from astropy import _erfa as erfa - from astropy.constants import c as speed_of_light - from .representation import CartesianRepresentation - from .orbital_elements import calc_moon -Index: astropy-4.1/astropy/coordinates/tests/test_atc_replacements.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/tests/test_atc_replacements.py -+++ astropy-4.1/astropy/coordinates/tests/test_atc_replacements.py -@@ -6,10 +6,10 @@ - from itertools import product - - import pytest -+import erfa - - from astropy.tests.helper import assert_quantity_allclose as assert_allclose - from astropy.time import Time --from astropy import _erfa as erfa - from .utils import randomly_sample_sphere - from astropy.coordinates.builtin_frames.utils import get_jd12, atciqz, aticq - from astropy.coordinates import SphericalRepresentation -Index: astropy-4.1/astropy/coordinates/tests/test_funcs.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/tests/test_funcs.py -+++ astropy-4.1/astropy/coordinates/tests/test_funcs.py -@@ -10,10 +10,8 @@ import pytest - import numpy as np - from numpy import testing as npt - -- - from astropy import units as u - from astropy.time import Time --from astropy._erfa import ErfaWarning - - - def test_sun(): -Index: astropy-4.1/astropy/coordinates/tests/test_iau_fullstack.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/tests/test_iau_fullstack.py -+++ astropy-4.1/astropy/coordinates/tests/test_iau_fullstack.py -@@ -6,6 +6,7 @@ import warnings - import pytest - import numpy as np - from numpy import testing as npt -+import erfa - - from astropy import units as u - from astropy.time import Time -@@ -14,7 +15,6 @@ from astropy.coordinates.builtin_frames. - from astropy.coordinates import EarthLocation - from astropy.coordinates import SkyCoord - from astropy.tests.helper import catch_warnings --from astropy import _erfa as erfa - from astropy.utils import iers - from .utils import randomly_sample_sphere - -Index: astropy-4.1/astropy/coordinates/tests/test_intermediate_transformations.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/tests/test_intermediate_transformations.py -+++ astropy-4.1/astropy/coordinates/tests/test_intermediate_transformations.py -@@ -5,6 +5,7 @@ - - import pytest - import numpy as np -+import erfa - - from astropy import units as u - from astropy.tests.helper import (assert_quantity_allclose as assert_allclose, -@@ -16,9 +17,6 @@ from astropy.coordinates import (EarthLo - HCRS, HeliocentricMeanEcliptic, TEME) - from astropy.utils import iers - -- --from astropy._erfa import epv00 -- - from .utils import randomly_sample_sphere - from astropy.coordinates.builtin_frames.utils import get_jd12 - from astropy.coordinates import solar_system_ephemeris -@@ -449,7 +447,7 @@ def test_icrs_altaz_moonish(testframe): - right AltAz distance - """ - # we use epv00 instead of get_sun because get_sun includes aberration -- earth_pv_helio, earth_pv_bary = epv00(*get_jd12(testframe.obstime, 'tdb')) -+ earth_pv_helio, earth_pv_bary = erfa.epv00(*get_jd12(testframe.obstime, 'tdb')) - earth_icrs_xyz = earth_pv_bary[0]*u.au - moonoffset = [0, 0, MOONDIST.value]*MOONDIST.unit - moonish_icrs = ICRS(CartesianRepresentation(earth_icrs_xyz + moonoffset)) -Index: astropy-4.1/astropy/coordinates/tests/test_regression.py -=================================================================== ---- astropy-4.1.orig/astropy/coordinates/tests/test_regression.py -+++ astropy-4.1/astropy/coordinates/tests/test_regression.py -@@ -615,9 +615,9 @@ def test_regression_8276(): - - - def test_regression_8615(): -- # note this is a "higher-level" symptom of the problem -- # _erfa/tests/test_erfa:test_float32_input is testing for, but is kept here -- # due to being a more practical version of the issue. -+ # note this is a "higher-level" symptom of the problem that a test now moved -+ # to pyerfa (erfa/tests/test_erfa:test_float32_input) is testing for, but we keep -+ # it here as well due to being a more practical version of the issue. - - crf = CartesianRepresentation(np.array([3, 0, 4], dtype=float) * u.pc) - srf = SphericalRepresentation.from_cartesian(crf) # does not error in 8615 -Index: astropy-4.1/astropy/_erfa/core.py.templ -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/core.py.templ -+++ /dev/null -@@ -1,230 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst -- --# "core.py" is auto-generated by erfa_generator.py from the template --# "core.py.templ". Do *not* edit "core.py" directly, instead edit --# "core.py.templ" and run erfa_generator.py from the source directory to --# update it. -- --""" --Python wrappers for the ufunc wrappers of the ERFA library. -- --..warning:: -- This is currently *not* part of the public Astropy API, and may change in -- the future. -- --The key idea is that any function can be called with inputs that are arrays, --and the ufuncs will automatically vectorize and call the ERFA functions for --each item using broadcasting rules for numpy. So the return values are always --numpy arrays of some sort. -- --For ERFA functions that take/return vectors or matrices, the vector/matrix --dimension(s) are always the *last* dimension(s). For example, if you --want to give ten matrices (i.e., the ERFA input type is double[3][3]), --you would pass in a (10, 3, 3) numpy array. If the output of the ERFA --function is scalar, you'll get back a length-10 1D array. --(Note that the ufuncs take this into account using structured dtypes.) -- --Note that the ufunc part of these functions are implemented in a separate --module (compiled as ``ufunc``), derived from the ``ufunc.c`` file. --""" -- --import warnings -- --import numpy -- --# we import these exceptions from astropy locations instead of defining them --# in this file because otherwise there are circular dependencies --from astropy.utils.exceptions import ErfaError, ErfaWarning --from astropy.utils.misc import check_broadcast -- --from . import ufunc -- --__all__ = ['ErfaError', 'ErfaWarning', -- {{ funcs|map(attribute='pyname')|surround("'","'")|join(", ") }}, -- {{ constants|map(attribute='name')|surround("'","'")|join(", ") }}, -- # TODO: delete the functions below when they can get auto-generated -- 'version', 'version_major', 'version_minor', 'version_micro', 'sofa_version'] -- -- --# <---------------------------------Error-handling----------------------------> -- -- --STATUS_CODES = {} # populated below before each function that returns an int -- --# This is a hard-coded list of status codes that need to be remapped, --# such as to turn errors into warnings. --STATUS_CODES_REMAP = { -- 'cal2jd': {-3: 3} --} -- -- --def check_errwarn(statcodes, func_name): -- if not numpy.any(statcodes): -- return -- # Remap any errors into warnings in the STATUS_CODES_REMAP dict. -- if func_name in STATUS_CODES_REMAP: -- for before, after in STATUS_CODES_REMAP[func_name].items(): -- statcodes[statcodes == before] = after -- STATUS_CODES[func_name][after] = STATUS_CODES[func_name][before] -- -- if numpy.any(statcodes<0): -- # errors present - only report the errors. -- if statcodes.shape: -- statcodes = statcodes[statcodes<0] -- -- errcodes = numpy.unique(statcodes) -- -- errcounts = dict([(e, numpy.sum(statcodes==e)) for e in errcodes]) -- -- elsemsg = STATUS_CODES[func_name].get('else', None) -- if elsemsg is None: -- errmsgs = dict([(e, STATUS_CODES[func_name].get(e, 'Return code ' + str(e))) for e in errcodes]) -- else: -- errmsgs = dict([(e, STATUS_CODES[func_name].get(e, elsemsg)) for e in errcodes]) -- -- emsg = ', '.join(['{0} of "{1}"'.format(errcounts[e], errmsgs[e]) for e in errcodes]) -- raise ErfaError('ERFA function "' + func_name + '" yielded ' + emsg) -- -- elif numpy.any(statcodes>0): -- #only warnings present -- if statcodes.shape: -- statcodes = statcodes[statcodes>0] -- -- warncodes = numpy.unique(statcodes) -- -- warncounts = dict([(w, numpy.sum(statcodes==w)) for w in warncodes]) -- -- elsemsg = STATUS_CODES[func_name].get('else', None) -- if elsemsg is None: -- warnmsgs = dict([(w, STATUS_CODES[func_name].get(w, 'Return code ' + str(w))) for w in warncodes]) -- else: -- warnmsgs = dict([(w, STATUS_CODES[func_name].get(w, elsemsg)) for w in warncodes]) -- -- wmsg = ', '.join(['{0} of "{1}"'.format(warncounts[w], warnmsgs[w]) for w in warncodes]) -- warnings.warn('ERFA function "' + func_name + '" yielded ' + wmsg, ErfaWarning) -- -- --# <------------------------structured dtype conversion------------------------> -- --dt_bytes1 = numpy.dtype('S1') --dt_bytes12 = numpy.dtype('S12') -- --# <--------------------------Actual ERFA-wrapping code------------------------> -- --{% for constant in constants %} --{{ constant.name }} = {{ constant.value }} --"""{{ constant.doc|join(' ') }}""" --{%- endfor %} -- -- --{% for func in funcs -%} --def {{ func.pyname }}({{ func.args_by_inout('in|inout')|map(attribute='name')|join(', ') }}): -- """ -- Wrapper for ERFA function ``{{ func.name }}``. -- -- Parameters -- ---------- -- {%- for arg in func.args_by_inout('in|inout') %} -- {{ arg.name }} : {{ arg.ctype }} array -- {%- endfor %} -- -- Returns -- ------- -- {%- for arg in func.args_by_inout('inout|out|ret') %} -- {{ arg.name }} : {{ arg.ctype }} array -- {%- endfor %} -- -- Notes -- ----- -- The ERFA documentation is below. {% if func.args_by_inout('inout') -%} -- Note that, unlike the erfa routine, -- the python wrapper does not change {{ func.args_by_inout('inout') -- | map(attribute='name')|join(', ') }} in-place. -- {%- endif %} -- --{{ func.doc }} -- """ -- -- {#- -- # Call the ufunc. Note that we pass inout twice, once as input -- # and once as output, so that changes are done in-place -- #} -- {{ func.python_call }} -- {#- -- # Check whether any warnings or errors occurred. -- #} -- {%- for arg in func.args_by_inout('stat') %} -- check_errwarn({{ arg.name }}, '{{ func.pyname }}') -- {%- endfor %} -- {#- -- # Any string outputs will be in structs; view them as their base type. -- #} -- {%- for arg in func.args_by_inout('out') -%} -- {%- if 'char' in arg.ctype %} -- {{ arg.name }} = {{ arg.name }}.view({{ arg.view_dtype }}) -- {%- endif %} -- {%- endfor %} -- {#- -- # Return the output arguments (including the inplace ones) -- #} -- return {{ func.args_by_inout('inout|out|ret')|map(attribute='name')|join(', ') }} -- -- --{# -- # Define the status codes that this function returns. -- #} --{%- if func.args_by_inout('stat') -%} --{%- for stat in func.args_by_inout('stat') -%} --{%- if stat.doc_info.statuscodes -%} --STATUS_CODES['{{ func.pyname }}'] = {{ stat.doc_info.statuscodes|string }} --{% endif %} --{% endfor %} --{% endif -%} --{% endfor -%} -- -- --# TODO: delete the functions below when they can get auto-generated --# (current machinery doesn't support returning strings or non-status-codes) --def version(): -- """ -- Returns the package version -- as defined in configure.ac -- in string format -- """ -- return "1.6.0" -- -- --def version_major(): -- """ -- Returns the package major version -- as defined in configure.ac -- as integer -- """ -- return 1 -- -- --def version_minor(): -- """ -- Returns the package minor version -- as defined in configure.ac -- as integer -- """ -- return 6 -- -- --def version_micro(): -- """ -- Returns the package micro version -- as defined in configure.ac -- as integer -- """ -- return 0 -- -- --def sofa_version(): -- """ -- Returns the corresponding SOFA version -- as defined in configure.ac -- in string format -- """ -- return "20190722" -Index: astropy-4.1/astropy/_erfa/erfa_additions.h -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/erfa_additions.h -+++ /dev/null -@@ -1,21 +0,0 @@ --#ifndef ERFAADDITIONSDEF --#define ERFAADDITIONSDEF -- --/* --** - - - - - - - - - - - - - - - - - --** e r f a _ a d d i t i o n s . h --** - - - - - - - - - - - - - - - - - --** --** A few extra routines which are particularly handy for constructing --** pv vectors inside the coordinate transforms. --** --** MHvK proposed these to Catherine Hohenkerk for inclusion in SOFA --** on 2018-05-24, with the response suggesting this was reasonable and --** might thus be done. --*/ -- --/* Extra/PVMergeExtract */ --void eraPav2pv(double p[3], double v[3], double pv[2][3]); --void eraPv2pav(double pv[2][3], double p[3], double v[3]); -- --#endif -Index: astropy-4.1/astropy/_erfa/erfa_generator.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/erfa_generator.py -+++ /dev/null -@@ -1,699 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst --""" --This module's main purpose is to act as a script to create new versions --of ufunc.c when ERFA is updated (or this generator is enhanced). -- --`Jinja2 `_ must be installed for this --module/script to function. -- --Note that this does *not* currently automate the process of creating structs --or dtypes for those structs. They should be added manually in the template file. --""" -- --import re --import os.path --from collections import OrderedDict -- --DEFAULT_ERFA_LOC = os.path.join(os.path.split(__file__)[0], -- '../../cextern/erfa') --DEFAULT_TEMPLATE_LOC = os.path.split(__file__)[0] -- --NDIMS_REX = re.compile(re.escape("numpy.dtype([('fi0', '.*', <(.*)>)])").replace(r'\.\*', '.*').replace(r'\<', '(').replace(r'\>', ')')) -- -- --class FunctionDoc: -- -- def __init__(self, doc): -- self.doc = doc.replace("**", " ").replace("/*\n", "").replace("*/", "") -- self.__input = None -- self.__output = None -- self.__ret_info = None -- -- def _get_arg_doc_list(self, doc_lines): -- """Parse input/output doc section lines, getting arguments from them. -- -- Ensure all elements of eraASTROM and eraLDBODY are left out, as those -- are not input or output arguments themselves. Also remove the nb -- argument in from of eraLDBODY, as we infer nb from the python array. -- """ -- doc_list = [] -- skip = [] -- for d in doc_lines: -- arg_doc = ArgumentDoc(d) -- if arg_doc.name is not None: -- if skip: -- if skip[0] == arg_doc.name: -- skip.pop(0) -- continue -- else: -- raise RuntimeError("We whould be skipping {} " -- "but {} encountered." -- .format(skip[0], arg_doc.name)) -- -- if arg_doc.type.startswith('eraLDBODY'): -- # Special-case LDBODY: for those, the previous argument -- # is always the number of bodies, but we don't need it -- # as an input argument for the ufunc since we're going -- # to determine this from the array itself. Also skip -- # the description of its contents; those are not arguments. -- doc_list.pop() -- skip = ['bm', 'dl', 'pv'] -- elif arg_doc.type.startswith('eraASTROM'): -- # Special-case ASTROM: need to skip the description -- # of its contents; those are not arguments. -- skip = ['pmt', 'eb', 'eh', 'em', 'v', 'bm1', -- 'bpn', 'along', 'xpl', 'ypl', 'sphi', -- 'cphi', 'diurab', 'eral', 'refa', 'refb'] -- -- doc_list.append(arg_doc) -- -- return doc_list -- -- @property -- def input(self): -- if self.__input is None: -- self.__input = [] -- for regex in ("Given([^\n]*):.*?\n(.+?) \n", -- "Given and returned([^\n]*):\n(.+?) \n"): -- result = re.search(regex, self.doc, re.DOTALL) -- if result is not None: -- doc_lines = result.group(2).split("\n") -- self.__input += self._get_arg_doc_list(doc_lines) -- -- return self.__input -- -- @property -- def output(self): -- if self.__output is None: -- self.__output = [] -- for regex in ("Given and returned([^\n]*):\n(.+?) \n", -- "Returned([^\n]*):.*?\n(.+?) \n"): -- result = re.search(regex, self.doc, re.DOTALL) -- if result is not None: -- doc_lines = result.group(2).split("\n") -- self.__output += self._get_arg_doc_list(doc_lines) -- -- return self.__output -- -- @property -- def ret_info(self): -- if self.__ret_info is None: -- ret_info = [] -- result = re.search("Returned \\(function value\\)([^\n]*):\n(.+?) \n", self.doc, re.DOTALL) -- if result is not None: -- ret_info.append(ReturnDoc(result.group(2))) -- -- if len(ret_info) == 0: -- self.__ret_info = '' -- elif len(ret_info) == 1: -- self.__ret_info = ret_info[0] -- else: -- raise ValueError("Multiple C return sections found in this doc:\n" + self.doc) -- -- return self.__ret_info -- -- def __repr__(self): -- return self.doc.replace(" \n", "\n") -- -- --class ArgumentDoc: -- -- def __init__(self, doc): -- match = re.search("^ +([^ ]+)[ ]+([^ ]+)[ ]+(.+)", doc) -- if match is not None: -- self.name = match.group(1) -- if self.name.startswith('*'): # easier than getting the regex to behave... -- self.name = self.name.replace('*', '') -- self.type = match.group(2) -- self.doc = match.group(3) -- else: -- self.name = None -- self.type = None -- self.doc = None -- -- def __repr__(self): -- return f" {self.name:15} {self.type:15} {self.doc}" -- -- --class Variable: -- """Properties shared by Argument and Return.""" -- @property -- def npy_type(self): -- """Predefined type used by numpy ufuncs to indicate a given ctype. -- -- Eg., NPY_DOUBLE for double. -- """ -- return "NPY_" + self.ctype.upper() -- -- @property -- def dtype(self): -- """Name of dtype corresponding to the ctype. -- -- Specifically, -- double : dt_double -- int : dt_int -- double[3]: dt_vector -- double[2][3] : dt_pv -- double[2] : dt_pvdpv -- double[3][3] : dt_matrix -- int[4] : dt_ymdf | dt_hmsf | dt_dmsf, depding on name -- eraASTROM: dt_eraASTROM -- eraLDBODY: dt_eraLDBODY -- char : dt_sign -- char[] : dt_type -- -- The corresponding dtypes are defined in ufunc.c, where they are -- used for the loop definitions. In core.py, they are also used -- to view-cast regular arrays to these structured dtypes. -- """ -- if self.ctype == 'const char': -- return 'dt_type' -- elif self.ctype == 'char': -- return 'dt_sign' -- elif self.ctype == 'int' and self.shape == (4,): -- return 'dt_' + self.name[1:] -- elif self.ctype == 'double' and self.shape == (3,): -- return 'dt_double' -- elif self.ctype == 'double' and self.shape == (2, 3): -- return 'dt_pv' -- elif self.ctype == 'double' and self.shape == (2,): -- return 'dt_pvdpv' -- elif self.ctype == 'double' and self.shape == (3, 3): -- return 'dt_double' -- elif not self.shape: -- return 'dt_' + self.ctype -- else: -- raise ValueError("ctype {} with shape {} not recognized." -- .format(self.ctype, self.shape)) -- -- @property -- def view_dtype(self): -- """Name of dtype corresponding to the ctype for viewing back as array. -- -- E.g., dt_double for double, dt_double33 for double[3][3]. -- -- The types are defined in core.py, where they are used for view-casts -- of structured results as regular arrays. -- """ -- if self.ctype == 'const char': -- return 'dt_bytes12' -- elif self.ctype == 'char': -- return 'dt_bytes1' -- else: -- raise ValueError('Only char ctype should need view back!') -- -- @property -- def ndim(self): -- return len(self.shape) -- -- @property -- def size(self): -- size = 1 -- for s in self.shape: -- size *= s -- return size -- -- @property -- def cshape(self): -- return ''.join([f'[{s}]' for s in self.shape]) -- -- @property -- def signature_shape(self): -- if self.ctype == 'eraLDBODY': -- return '(n)' -- elif self.ctype == 'double' and self.shape == (3,): -- return '(3)' -- elif self.ctype == 'double' and self.shape == (3, 3): -- return '(3, 3)' -- else: -- return '()' -- -- --class Argument(Variable): -- -- def __init__(self, definition, doc): -- self.definition = definition -- self.doc = doc -- self.__inout_state = None -- self.ctype, ptr_name_arr = definition.strip().rsplit(" ", 1) -- if "*" == ptr_name_arr[0]: -- self.is_ptr = True -- name_arr = ptr_name_arr[1:] -- else: -- self.is_ptr = False -- name_arr = ptr_name_arr -- if "[]" in ptr_name_arr: -- self.is_ptr = True -- name_arr = name_arr[:-2] -- if "[" in name_arr: -- self.name, arr = name_arr.split("[", 1) -- self.shape = tuple([int(size) for size in arr[:-1].split("][")]) -- else: -- self.name = name_arr -- self.shape = () -- -- @property -- def inout_state(self): -- if self.__inout_state is None: -- self.__inout_state = '' -- for i in self.doc.input: -- if self.name in i.name.split(','): -- self.__inout_state = 'in' -- for o in self.doc.output: -- if self.name in o.name.split(','): -- if self.__inout_state == 'in': -- self.__inout_state = 'inout' -- else: -- self.__inout_state = 'out' -- return self.__inout_state -- -- @property -- def name_for_call(self): -- """How the argument should be used in the call to the ERFA function. -- -- This takes care of ensuring that inputs are passed by value, -- as well as adding back the number of bodies for any LDBODY argument. -- The latter presumes that in the ufunc inner loops, that number is -- called 'nb'. -- """ -- if self.ctype == 'eraLDBODY': -- assert self.name == 'b' -- return 'nb, _' + self.name -- elif self.is_ptr: -- return '_'+self.name -- else: -- return '*_'+self.name -- -- def __repr__(self): -- return f"Argument('{self.definition}', name='{self.name}', ctype='{self.ctype}', inout_state='{self.inout_state}')" -- -- --class ReturnDoc: -- -- def __init__(self, doc): -- self.doc = doc -- -- self.infoline = doc.split('\n')[0].strip() -- self.type = self.infoline.split()[0] -- self.descr = self.infoline.split()[1] -- -- if self.descr.startswith('status'): -- self.statuscodes = statuscodes = {} -- -- code = None -- for line in doc[doc.index(':')+1:].split('\n'): -- ls = line.strip() -- if ls != '': -- if ' = ' in ls: -- code, msg = ls.split(' = ') -- if code != 'else': -- code = int(code) -- statuscodes[code] = msg -- elif code is not None: -- statuscodes[code] += ls -- else: -- self.statuscodes = None -- -- def __repr__(self): -- return f"Return value, type={self.type:15}, {self.descr}, {self.doc}" -- -- --class Return(Variable): -- -- def __init__(self, ctype, doc): -- self.name = 'c_retval' -- self.inout_state = 'stat' if ctype == 'int' else 'ret' -- self.ctype = ctype -- self.shape = () -- self.doc = doc -- -- def __repr__(self): -- return f"Return(name='{self.name}', ctype='{self.ctype}', inout_state='{self.inout_state}')" -- -- @property -- def doc_info(self): -- return self.doc.ret_info -- -- --class Function: -- """ -- A class representing a C function. -- -- Parameters -- ---------- -- name : str -- The name of the function -- source_path : str -- Either a directory, which means look for the function in a -- stand-alone file (like for the standard ERFA distribution), or a -- file, which means look for the function in that file (as for the -- astropy-packaged single-file erfa.c). -- match_line : str, optional -- If given, searching of the source file will skip until it finds -- a line matching this string, and start from there. -- """ -- -- def __init__(self, name, source_path, match_line=None): -- self.name = name -- self.pyname = name.split('era')[-1].lower() -- self.filename = self.pyname+".c" -- if os.path.isdir(source_path): -- self.filepath = os.path.join(os.path.normpath(source_path), self.filename) -- else: -- self.filepath = source_path -- -- with open(self.filepath) as f: -- if match_line: -- line = f.readline() -- while line != '': -- if line.startswith(match_line): -- filecontents = '\n' + line + f.read() -- break -- line = f.readline() -- else: -- msg = ('Could not find the match_line "{0}" in ' -- 'the source file "{1}"') -- raise ValueError(msg.format(match_line, self.filepath)) -- else: -- filecontents = f.read() -- -- pattern = fr"\n([^\n]+{name} ?\([^)]+\)).+?(/\*.+?\*/)" -- p = re.compile(pattern, flags=re.DOTALL | re.MULTILINE) -- -- search = p.search(filecontents) -- self.cfunc = " ".join(search.group(1).split()) -- self.doc = FunctionDoc(search.group(2)) -- -- self.args = [] -- for arg in re.search(r"\(([^)]+)\)", self.cfunc).group(1).split(', '): -- self.args.append(Argument(arg, self.doc)) -- self.ret = re.search(f"^(.*){name}", self.cfunc).group(1).strip() -- if self.ret != 'void': -- self.args.append(Return(self.ret, self.doc)) -- -- def args_by_inout(self, inout_filter, prop=None, join=None): -- """ -- Gives all of the arguments and/or returned values, depending on whether -- they are inputs, outputs, etc. -- -- The value for `inout_filter` should be a string containing anything -- that arguments' `inout_state` attribute produces. Currently, that can be: -- -- * "in" : input -- * "out" : output -- * "inout" : something that's could be input or output (e.g. a struct) -- * "ret" : the return value of the C function -- * "stat" : the return value of the C function if it is a status code -- -- It can also be a "|"-separated string giving inout states to OR -- together. -- """ -- result = [] -- for arg in self.args: -- if arg.inout_state in inout_filter.split('|'): -- if prop is None: -- result.append(arg) -- else: -- result.append(getattr(arg, prop)) -- if join is not None: -- return join.join(result) -- else: -- return result -- -- @property -- def user_dtype(self): -- """The non-standard dtype, if any, needed by this function's ufunc. -- -- This would be any structured array for any input or output, but -- we give preference to LDBODY, since that also decides that the ufunc -- should be a generalized ufunc. -- """ -- user_dtype = None -- for arg in self.args_by_inout('in|inout|out'): -- if arg.ctype == 'eraLDBODY': -- return arg.dtype -- elif user_dtype is None and arg.dtype not in ('dt_double', -- 'dt_int'): -- user_dtype = arg.dtype -- -- return user_dtype -- -- @property -- def signature(self): -- """Possible signature, if this function should be a gufunc.""" -- if all(arg.signature_shape == '()' -- for arg in self.args_by_inout('in|inout|out')): -- return None -- -- return '->'.join( -- [','.join([arg.signature_shape for arg in args]) -- for args in (self.args_by_inout('in|inout'), -- self.args_by_inout('inout|out|ret|stat'))]) -- -- @property -- def python_call(self): -- outnames = [arg.name for arg in self.args_by_inout('inout|out|stat|ret')] -- argnames = [arg.name for arg in self.args_by_inout('in|inout')] -- return '{out} = {func}({args})'.format(out=', '.join(outnames), -- func='ufunc.' + self.pyname, -- args=', '.join(argnames)) -- -- def __repr__(self): -- return f"Function(name='{self.name}', pyname='{self.pyname}', filename='{self.filename}', filepath='{self.filepath}')" -- -- --class Constant: -- -- def __init__(self, name, value, doc): -- self.name = name.replace("ERFA_", "") -- self.value = value.replace("ERFA_", "") -- self.doc = doc -- -- --class ExtraFunction(Function): -- """ -- An "extra" function - e.g. one not following the SOFA/ERFA standard format. -- -- Parameters -- ---------- -- cname : str -- The name of the function in C -- prototype : str -- The prototype for the function (usually derived from the header) -- pathfordoc : str -- The path to a file that contains the prototype, with the documentation -- as a multiline string *before* it. -- """ -- -- def __init__(self, cname, prototype, pathfordoc): -- self.name = cname -- self.pyname = cname.split('era')[-1].lower() -- self.filepath, self.filename = os.path.split(pathfordoc) -- -- self.prototype = prototype.strip() -- if prototype.endswith('{') or prototype.endswith(';'): -- self.prototype = prototype[:-1].strip() -- -- incomment = False -- lastcomment = None -- with open(pathfordoc, 'r') as f: -- for l in f: -- if incomment: -- if l.lstrip().startswith('*/'): -- incomment = False -- lastcomment = ''.join(lastcomment) -- else: -- if l.startswith('**'): -- l = l[2:] -- lastcomment.append(l) -- else: -- if l.lstrip().startswith('/*'): -- incomment = True -- lastcomment = [] -- if l.startswith(self.prototype): -- self.doc = lastcomment -- break -- else: -- raise ValueError('Did not find prototype {} in file ' -- '{}'.format(self.prototype, pathfordoc)) -- -- self.args = [] -- argset = re.search(fr"{self.name}\(([^)]+)?\)", -- self.prototype).group(1) -- if argset is not None: -- for arg in argset.split(', '): -- self.args.append(Argument(arg, self.doc)) -- self.ret = re.match(f"^(.*){self.name}", -- self.prototype).group(1).strip() -- if self.ret != 'void': -- self.args.append(Return(self.ret, self.doc)) -- -- def __repr__(self): -- r = super().__repr__() -- if r.startswith('Function'): -- r = 'Extra' + r -- return r -- -- --def main(srcdir=DEFAULT_ERFA_LOC, outfn='core.py', ufuncfn='ufunc.c', -- templateloc=DEFAULT_TEMPLATE_LOC, extra='erfa_additions.h', -- verbose=True): -- from jinja2 import Environment, FileSystemLoader -- -- if verbose: -- print_ = lambda *args, **kwargs: print(*args, **kwargs) -- else: -- print_ = lambda *args, **kwargs: None -- -- # Prepare the jinja2 templating environment -- env = Environment(loader=FileSystemLoader(templateloc)) -- -- def prefix(a_list, pre): -- return [pre+f'{an_element}' for an_element in a_list] -- -- def postfix(a_list, post): -- return [f'{an_element}'+post for an_element in a_list] -- -- def surround(a_list, pre, post): -- return [pre+f'{an_element}'+post for an_element in a_list] -- env.filters['prefix'] = prefix -- env.filters['postfix'] = postfix -- env.filters['surround'] = surround -- -- erfa_c_in = env.get_template(ufuncfn + '.templ') -- erfa_py_in = env.get_template(outfn + '.templ') -- -- # Extract all the ERFA function names from erfa.h -- if os.path.isdir(srcdir): -- erfahfn = os.path.join(srcdir, 'erfa.h') -- multifilserc = True -- else: -- erfahfn = os.path.join(os.path.split(srcdir)[0], 'erfa.h') -- multifilserc = False -- -- with open(erfahfn, "r") as f: -- erfa_h = f.read() -- print_("read erfa header") -- if extra: -- with open(os.path.join(templateloc or '.', extra), "r") as f: -- erfa_h += f.read() -- print_("read extra header") -- -- funcs = OrderedDict() -- section_subsection_functions = re.findall( -- r'/\* (\w*)/(\w*) \*/\n(.*?)\n\n', erfa_h, -- flags=re.DOTALL | re.MULTILINE) -- for section, subsection, functions in section_subsection_functions: -- print_(f"{section}.{subsection}") -- # Right now, we compile everything, but one could be more selective. -- # In particular, at the time of writing (2018-06-11), what was -- # actually require for astropy was not quite everything, but: -- # ((section == 'Extra') -- # or (section == "Astronomy") -- # or (subsection == "AngleOps") -- # or (subsection == "SphericalCartesian") -- # or (subsection == "MatrixVectorProducts") -- # or (subsection == 'VectorOps')) -- if True: -- -- func_names = re.findall(r' (\w+)\(.*?\);', functions, -- flags=re.DOTALL) -- for name in func_names: -- print_(f"{section}.{subsection}.{name}...") -- if multifilserc: -- # easy because it just looks in the file itself -- cdir = (srcdir if section != 'Extra' else -- templateloc or '.') -- funcs[name] = Function(name, cdir) -- else: -- # Have to tell it to look for a declaration matching -- # the start of the header declaration, otherwise it -- # might find a *call* of the function instead of the -- # definition -- for line in functions.split(r'\n'): -- if name in line: -- # [:-1] is to remove trailing semicolon, and -- # splitting on '(' is because the header and -- # C files don't necessarily have to match -- # argument names and line-breaking or -- # whitespace -- match_line = line[:-1].split('(')[0] -- funcs[name] = Function(name, cdir, match_line) -- break -- else: -- raise ValueError("A name for a C file wasn't " -- "found in the string that " -- "spawned it. This should be " -- "impossible!") -- -- funcs = funcs.values() -- -- # Extract all the ERFA constants from erfam.h -- erfamhfn = os.path.join(srcdir, 'erfam.h') -- with open(erfamhfn, 'r') as f: -- erfa_m_h = f.read() -- constants = [] -- for chunk in erfa_m_h.split("\n\n"): -- result = re.findall(r"#define (ERFA_\w+?) (.+?)$", chunk, -- flags=re.DOTALL | re.MULTILINE) -- if result: -- doc = re.findall(r"/\* (.+?) \*/\n", chunk, flags=re.DOTALL) -- for (name, value) in result: -- constants.append(Constant(name, value, doc)) -- -- # TODO: re-enable this when const char* return values and -- # non-status code integer rets are possible -- # #Add in any "extra" functions from erfaextra.h -- # erfaextrahfn = os.path.join(srcdir, 'erfaextra.h') -- # with open(erfaextrahfn, 'r') as f: -- # for l in f: -- # ls = l.strip() -- # match = re.match('.* (era.*)\(', ls) -- # if match: -- # print_("Extra: {0} ...".format(match.group(1))) -- # funcs.append(ExtraFunction(match.group(1), ls, erfaextrahfn)) -- -- print_("Rendering template") -- erfa_c = erfa_c_in.render(funcs=funcs) -- erfa_py = erfa_py_in.render(funcs=funcs, constants=constants) -- -- if outfn is not None: -- print_("Saving to", outfn, 'and', ufuncfn) -- with open(os.path.join(templateloc, outfn), "w") as f: -- f.write(erfa_py) -- with open(os.path.join(templateloc, ufuncfn), "w") as f: -- f.write(erfa_c) -- -- print_("Done!") -- -- return erfa_c, erfa_py, funcs -- -- --if __name__ == '__main__': -- from argparse import ArgumentParser -- -- ap = ArgumentParser() -- ap.add_argument('srcdir', default=DEFAULT_ERFA_LOC, nargs='?', -- help='Directory where the ERFA c and header files ' -- 'can be found or to a single erfa.c file ' -- '(which must be in the same directory as ' -- 'erfa.h). Defaults to the builtin astropy ' -- 'erfa: "{}"'.format(DEFAULT_ERFA_LOC)) -- ap.add_argument('-o', '--output', default='core.py', -- help='The output filename for the pure-python output.') -- ap.add_argument('-u', '--ufunc', default='ufunc.c', -- help='The output filename for the ufunc .c output') -- ap.add_argument('-t', '--template-loc', -- default=DEFAULT_TEMPLATE_LOC, -- help='the location where the "core.py.templ" and ' -- '"ufunc.c.templ templates can be found.') -- ap.add_argument('-x', '--extra', -- default='erfa_additions.h', -- help='header file for any extra files in the template ' -- 'location that should be included.') -- ap.add_argument('-q', '--quiet', action='store_false', dest='verbose', -- help='Suppress output normally printed to stdout.') -- -- args = ap.parse_args() -- main(args.srcdir, args.output, args.ufunc, args.template_loc, -- args.extra) -Index: astropy-4.1/astropy/_erfa/helpers.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/helpers.py -+++ /dev/null -@@ -1,216 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst --""" --Helpers to interact with the ERFA library, in particular for leap seconds. --""" --from datetime import datetime, timedelta --from warnings import warn -- --import numpy as np -- --from astropy.utils.decorators import classproperty --from astropy.utils.exceptions import ErfaWarning -- --from .ufunc import get_leap_seconds, set_leap_seconds, dt_eraLEAPSECOND -- -- --class leap_seconds: -- """Leap second management. -- -- This singleton class allows access to ERFA's leap second table, -- using the methods 'get', 'set', and 'update'. -- -- One can also check expiration with 'expires' and 'expired'. -- -- Note that usage of the class is similar to a ``ScienceState`` class, -- but it cannot be used as a context manager. -- """ -- _expires = None -- """Explicit expiration date inferred from leap-second table.""" -- _expiration_days = 180 -- """Number of days beyond last leap second at which table expires.""" -- -- def __init__(self): -- raise RuntimeError("This class is a singleton. Do not instantiate.") -- -- @classmethod -- def get(cls): -- """Get the current leap-second table used internally.""" -- return get_leap_seconds() -- -- @classmethod -- def validate(cls, table): -- """Validate a leap-second table. -- -- Parameters -- ---------- -- table : array_like -- Must have 'year', 'month', and 'tai_utc' entries. If a 'day' -- entry is present, it will be checked that it is always 1. -- If ``table`` has an 'expires' attribute, it will be interpreted -- as an expiration date. -- -- Returns -- ------- -- array : `~numpy.ndarray` -- Structures array with 'year', 'month', 'tai_utc'. -- expires: `~datetime.datetime` or None -- Possible expiration date inferred from the table. `None` if not -- present or if not a `~datetime.datetime` or `~astropy.time.Time` -- instance and not parsable as a 'dd month yyyy' string. -- -- Raises -- ------ -- ValueError -- If the leap seconds in the table are not on the 1st of January or -- July, or if the sorted TAI-UTC do not increase in increments of 1. -- """ -- try: -- day = table['day'] -- except Exception: -- day = 1 -- -- expires = getattr(table, 'expires', None) -- if expires is not None and not isinstance(expires, datetime): -- # Maybe astropy Time? Cannot go via strftime, since that -- # might need leap-seconds. If not, try standard string -- # format from leap_seconds.dat and leap_seconds.list -- isot = getattr(expires, 'isot', None) -- try: -- if isot is not None: -- expires = datetime.strptime(isot.partition('T')[0], -- '%Y-%m-%d') -- else: -- expires = datetime.strptime(expires, '%d %B %Y') -- -- except Exception as exc: -- warn(f"ignoring non-datetime expiration {expires}; " -- f"parsing it raised {exc!r}", ErfaWarning) -- expires = None -- -- # Take care of astropy Table. -- if hasattr(table, '__array__'): -- table = table.__array__()[list(dt_eraLEAPSECOND.names)] -- -- table = np.array(table, dtype=dt_eraLEAPSECOND, copy=False, -- ndmin=1) -- -- # Simple sanity checks. -- if table.ndim > 1: -- raise ValueError("can only pass in one-dimensional tables.") -- -- if not np.all(((day == 1) & -- (table['month'] == 1) | (table['month'] == 7)) | -- (table['year'] < 1972)): -- raise ValueError("leap seconds inferred that are not on " -- "1st of January or 1st of July.") -- -- if np.any((table['year'][:-1] > 1970) & -- (np.diff(table['tai_utc']) != 1)): -- raise ValueError("jump in TAI-UTC by something else than one.") -- -- return table, expires -- -- @classmethod -- def set(cls, table=None): -- """Set the ERFA leap second table. -- -- Note that it is generally safer to update the leap-second table than -- to set it directly, since most tables do not have the pre-1970 changes -- in TAI-UTC that are part of the built-in ERFA table. -- -- Parameters -- ---------- -- table : array_like or `None` -- Leap-second table that should at least hold columns of 'year', -- 'month', and 'tai_utc'. Only simple validation is done before it -- is being used, so care need to be taken that entries are correct. -- If `None`, reset the ERFA table to its built-in values. -- -- Raises -- ------ -- ValueError -- If the leap seconds in the table are not on the 1st of January or -- July, or if the sorted TAI-UTC do not increase in increments of 1. -- """ -- if table is None: -- expires = None -- else: -- table, expires = cls.validate(table) -- -- set_leap_seconds(table) -- cls._expires = expires -- -- @classproperty -- def expires(cls): -- """The expiration date of the current ERFA table. -- -- This is either a date inferred from the last table used to update or -- set the leap-second array, or a number of days beyond the last leap -- second. -- """ -- if cls._expires is None: -- last = cls.get()[-1] -- return (datetime(last['year'], last['month'], 1) + -- timedelta(cls._expiration_days)) -- else: -- return cls._expires -- -- @classproperty -- def expired(cls): -- """Whether the leap second table is valid beyond the present.""" -- return cls.expires < datetime.now() -- -- @classmethod -- def update(cls, table): -- """Add any leap seconds not already present to the ERFA table. -- -- This method matches leap seconds with those present in the ERFA table, -- and extends the latter as necessary. -- -- If the ERFA leap seconds file was corrupted, it will be reset. -- -- If the table is corrupted, the ERFA file will be unchanged. -- -- Parameters -- ---------- -- table : array_like or `~astropy.utils.iers.LeapSeconds` -- Array or table with TAI-UTC from leap seconds. Should have -- 'year', 'month', and 'tai_utc' columns. -- -- Returns -- ------- -- n_update : int -- Number of items updated. -- -- Raises -- ------ -- ValueError -- If the leap seconds in the table are not on the 1st of January or -- July, or if the sorted TAI-UTC do not increase in increments of 1. -- """ -- table, expires = cls.validate(table) -- -- # Get erfa table and check it is OK; if not, reset it. -- try: -- erfa_ls, _ = cls.validate(cls.get()) -- except Exception: -- cls.set() -- erfa_ls = cls.get() -- -- # Create the combined array and use it (validating the combination). -- ls = np.union1d(erfa_ls, table) -- cls.set(ls) -- -- # If the update table has an expiration beyond that inferred from -- # the new leap second second array, use it (but, now that the new -- # array is set, do not allow exceptions due to misformed expires). -- try: -- if expires is not None and expires > cls.expires: -- cls._expires = expires -- -- except Exception as exc: -- warn("table 'expires' attribute ignored as comparing it " -- "with a datetime raised an error:\n" + str(exc), -- ErfaWarning) -- -- return len(ls) - len(erfa_ls) -Index: astropy-4.1/astropy/_erfa/__init__.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/__init__.py -+++ astropy-4.1/astropy/_erfa/__init__.py -@@ -1,6 +1,16 @@ - # Licensed under a 3-clause BSD style license - see LICENSE.rst -+import warnings - --from .core import * --from .ufunc import (dt_eraASTROM, dt_eraLDBODY, dt_eraLEAPSECOND, dt_pv, -- dt_sign, dt_type, dt_ymdf, dt_hmsf, dt_dmsf) --from .helpers import leap_seconds -+from erfa import core, ufunc, helpers # noqa -+from erfa.core import * # noqa -+from erfa.ufunc import (dt_eraASTROM, dt_eraLDBODY, dt_eraLEAPSECOND, dt_pv, # noqa -+ dt_sign, dt_type, dt_ymdf, dt_hmsf, dt_dmsf) -+from erfa.helpers import leap_seconds # noqa -+ -+from astropy.utils.exceptions import AstropyDeprecationWarning -+ -+ -+warnings.warn('The private astropy._erfa module has been made into its ' -+ 'own package, pyerfa, which is a dependency of ' -+ 'astropy and can be imported directly using "import erfa"', -+ AstropyDeprecationWarning) -Index: astropy-4.1/astropy/_erfa/pav2pv.c -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/pav2pv.c -+++ /dev/null -@@ -1,30 +0,0 @@ --#include "erfa.h" -- --void eraPav2pv(double p[3], double v[3], double pv[2][3]) --/* --** - - - - - - - - - - --** e r a P a v 2 p v --** - - - - - - - - - - --** --** Extend a p-vector to a pv-vector by appending a zero velocity. --** --** Given: --** p double[3] p-vector --** v double[3] v-vector --** --** Returned: --** pv double[2][3] pv-vector --** --** Called: --** eraCp copy p-vector --** --** Copyright (C) 2013-2017, NumFOCUS Foundation. --** Derived, with permission, from the SOFA library. See notes at end of file. --*/ --{ -- eraCp(p, pv[0]); -- eraCp(v, pv[1]); -- -- return; -- --} -Index: astropy-4.1/astropy/_erfa/pv2pav.c -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/pv2pav.c -+++ /dev/null -@@ -1,30 +0,0 @@ --#include "erfa.h" -- --void eraPv2pav(double pv[2][3], double p[3], double v[3]) --/* --** - - - - - - - - - --** e r a P v 2 p a v --** - - - - - - - - - --** --** Extend a p-vector to a pv-vector by appending a zero velocity. --** --** Given: --** pv double[2][3] pv-vector --** --** Returned: --** p double[3] p-vector --** v double[3] v-vector --** --** Called: --** eraCp copy p-vector --** --** Copyright (C) 2013-2017, NumFOCUS Foundation. --** Derived, with permission, from the SOFA library. See notes at end of file. --*/ --{ -- eraCp(pv[0], p); -- eraCp(pv[1], v); -- -- return; -- --} -Index: astropy-4.1/astropy/_erfa/setup_package.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/setup_package.py -+++ /dev/null -@@ -1,72 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst -- --import os --import glob -- --from distutils.extension import Extension --from distutils.dep_util import newer -- --import numpy --from extension_helpers import import_file -- --ERFAPKGDIR = os.path.relpath(os.path.dirname(__file__)) -- --ERFA_SRC = os.path.abspath(os.path.join(ERFAPKGDIR, '..', '..', -- 'cextern', 'erfa')) -- --SRC_FILES = glob.glob(os.path.join(ERFA_SRC, '*')) --SRC_FILES += [os.path.join(ERFAPKGDIR, filename) -- for filename in ['pav2pv.c', 'pv2pav.c', 'erfa_additions.h', -- 'ufunc.c.templ', 'core.py.templ', -- 'erfa_generator.py']] -- --GEN_FILES = [os.path.join(ERFAPKGDIR, 'core.py'), -- os.path.join(ERFAPKGDIR, 'ufunc.c')] -- -- --def get_extensions(): -- gen_files_exist = all(os.path.isfile(fn) for fn in GEN_FILES) -- gen_files_outdated = False -- if os.path.isdir(ERFA_SRC): -- # assume thet 'erfaversion.c' is updated at each release at least -- src = os.path.join(ERFA_SRC, 'erfaversion.c') -- gen_files_outdated = any(newer(src, fn) for fn in GEN_FILES) -- elif not gen_files_exist: -- raise RuntimeError( -- 'Missing "liberfa" source files, unable to generate ' -- '"erfa/ufunc.c" and "erfa/core.py". ' -- 'Please check your source tree. ' -- 'Maybe "git submodule update" could help.') -- -- if not gen_files_exist or gen_files_outdated: -- print('Run "erfa_generator.py"') -- #cmd = [sys.executable, 'erfa_generator.py', ERFA_SRC, '--quiet'] -- #subprocess.run(cmd, check=True) -- -- gen = import_file(os.path.join(ERFAPKGDIR, 'erfa_generator.py')) -- gen.main(verbose=False) -- -- sources = [os.path.join(ERFAPKGDIR, fn) -- for fn in ("ufunc.c", "pav2pv.c", "pv2pav.c")] -- include_dirs = [numpy.get_include()] -- libraries = [] -- -- if (int(os.environ.get('ASTROPY_USE_SYSTEM_ERFA', 0)) or -- int(os.environ.get('ASTROPY_USE_SYSTEM_ALL', 0))): -- libraries.append('erfa') -- else: -- # get all of the .c files in the cextern/erfa directory -- erfafns = os.listdir(ERFA_SRC) -- sources.extend(['cextern/erfa/' + fn -- for fn in erfafns if fn.endswith('.c')]) -- -- include_dirs.append('cextern/erfa') -- -- erfa_ext = Extension( -- name="astropy._erfa.ufunc", -- sources=sources, -- include_dirs=include_dirs, -- libraries=libraries, -- language="c",) -- -- return [erfa_ext] -Index: astropy-4.1/astropy/_erfa/tests/__init__.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/tests/__init__.py -+++ /dev/null -@@ -1 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst -Index: astropy-4.1/astropy/_erfa/tests/test_erfa.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/tests/test_erfa.py -+++ /dev/null -@@ -1,416 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst --from datetime import datetime -- --import pytest --import numpy as np --from numpy.testing import assert_array_equal -- --from astropy import _erfa as erfa --from astropy.time import Time --from astropy.tests.helper import catch_warnings -- -- --def test_erfa_wrapper(): -- """ -- Runs a set of tests that mostly make sure vectorization is -- working as expected -- """ -- -- jd = np.linspace(2456855.5, 2456855.5+1.0/24.0/60.0, 60*2+1) -- ra = np.linspace(0.0, np.pi*2.0, 5) -- dec = np.linspace(-np.pi/2.0, np.pi/2.0, 4) -- -- aob, zob, hob, dob, rob, eo = erfa.atco13(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, jd, 0.0, 0.0, 0.0, np.pi/4.0, 0.0, 0.0, 0.0, 1014.0, 0.0, 0.0, 0.5) -- assert aob.shape == (121,) -- -- aob, zob, hob, dob, rob, eo = erfa.atco13(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, jd[0], 0.0, 0.0, 0.0, np.pi/4.0, 0.0, 0.0, 0.0, 1014.0, 0.0, 0.0, 0.5) -- assert aob.shape == () -- -- aob, zob, hob, dob, rob, eo = erfa.atco13(ra[:, None, None], dec[None, :, None], 0.0, 0.0, 0.0, 0.0, jd[None, None, :], 0.0, 0.0, 0.0, np.pi/4.0, 0.0, 0.0, 0.0, 1014.0, 0.0, 0.0, 0.5) -- (aob.shape) == (5, 4, 121) -- -- iy, im, id, ihmsf = erfa.d2dtf("UTC", 3, jd, 0.0) -- assert iy.shape == (121,) -- assert ihmsf.shape == (121,) -- assert ihmsf.dtype == erfa.dt_hmsf -- -- iy, im, id, ihmsf = erfa.d2dtf("UTC", 3, jd[0], 0.0) -- assert iy.shape == () -- assert ihmsf.shape == () -- assert ihmsf.dtype == erfa.dt_hmsf -- -- --def test_angle_ops(): -- -- sign, idmsf = erfa.a2af(6, -np.pi) -- assert sign == b'-' -- assert idmsf.item() == (180, 0, 0, 0) -- -- sign, ihmsf = erfa.a2tf(6, np.pi) -- assert sign == b'+' -- assert ihmsf.item() == (12, 0, 0, 0) -- -- rad = erfa.af2a('-', 180, 0, 0.0) -- np.testing.assert_allclose(rad, -np.pi) -- -- rad = erfa.tf2a('+', 12, 0, 0.0) -- np.testing.assert_allclose(rad, np.pi) -- -- rad = erfa.anp(3.*np.pi) -- np.testing.assert_allclose(rad, np.pi) -- -- rad = erfa.anpm(3.*np.pi) -- np.testing.assert_allclose(rad, -np.pi) -- -- sign, ihmsf = erfa.d2tf(1, -1.5) -- assert sign == b'-' -- assert ihmsf.item() == (36, 0, 0, 0) -- -- days = erfa.tf2d('+', 3, 0, 0.0) -- np.testing.assert_allclose(days, 0.125) -- -- --def test_spherical_cartesian(): -- -- theta, phi = erfa.c2s([0.0, np.sqrt(2.0), np.sqrt(2.0)]) -- np.testing.assert_allclose(theta, np.pi/2.0) -- np.testing.assert_allclose(phi, np.pi/4.0) -- -- theta, phi, r = erfa.p2s([0.0, np.sqrt(2.0), np.sqrt(2.0)]) -- np.testing.assert_allclose(theta, np.pi/2.0) -- np.testing.assert_allclose(phi, np.pi/4.0) -- np.testing.assert_allclose(r, 2.0) -- -- pv = np.array(([0.0, np.sqrt(2.0), np.sqrt(2.0)], [1.0, 0.0, 0.0]), -- dtype=erfa.dt_pv) -- theta, phi, r, td, pd, rd = erfa.pv2s(pv) -- np.testing.assert_allclose(theta, np.pi/2.0) -- np.testing.assert_allclose(phi, np.pi/4.0) -- np.testing.assert_allclose(r, 2.0) -- np.testing.assert_allclose(td, -np.sqrt(2.0)/2.0) -- np.testing.assert_allclose(pd, 0.0) -- np.testing.assert_allclose(rd, 0.0) -- -- c = erfa.s2c(np.pi/2.0, np.pi/4.0) -- np.testing.assert_allclose(c, [0.0, np.sqrt(2.0)/2.0, np.sqrt(2.0)/2.0], atol=1e-14) -- -- c = erfa.s2p(np.pi/2.0, np.pi/4.0, 1.0) -- np.testing.assert_allclose(c, [0.0, np.sqrt(2.0)/2.0, np.sqrt(2.0)/2.0], atol=1e-14) -- -- pv = erfa.s2pv(np.pi/2.0, np.pi/4.0, 2.0, np.sqrt(2.0)/2.0, 0.0, 0.0) -- np.testing.assert_allclose(pv['p'], [0.0, np.sqrt(2.0), np.sqrt(2.0)], atol=1e-14) -- np.testing.assert_allclose(pv['v'], [-1.0, 0.0, 0.0], atol=1e-14) -- -- --def test_errwarn_reporting(): -- """ -- Test that the ERFA error reporting mechanism works as it should -- """ -- -- # no warning -- erfa.dat(1990, 1, 1, 0.5) -- -- # check warning is raised for a scalar -- with catch_warnings() as w: -- erfa.dat(100, 1, 1, 0.5) -- assert len(w) == 1 -- assert w[0].category == erfa.ErfaWarning -- assert '1 of "dubious year (Note 1)"' in str(w[0].message) -- -- # and that the count is right for a vector. -- with catch_warnings() as w: -- erfa.dat([100, 200, 1990], 1, 1, 0.5) -- assert len(w) == 1 -- assert w[0].category == erfa.ErfaWarning -- assert '2 of "dubious year (Note 1)"' in str(w[0].message) -- -- try: -- erfa.dat(1990, [1, 34, 2], [1, 1, 43], 0.5) -- except erfa.ErfaError as e: -- if '1 of "bad day (Note 3)", 1 of "bad month"' not in e.args[0]: -- assert False, 'Raised the correct type of error, but wrong message: ' + e.args[0] -- -- try: -- erfa.dat(200, [1, 34, 2], [1, 1, 43], 0.5) -- except erfa.ErfaError as e: -- if 'warning' in e.args[0]: -- assert False, 'Raised the correct type of error, but there were warnings mixed in: ' + e.args[0] -- -- --def test_vector_inouts(): -- """ -- Tests that ERFA functions working with vectors are correctly consumed and spit out -- """ -- -- # values are from test_erfa.c t_ab function -- pnat = [-0.76321968546737951, -- -0.60869453983060384, -- -0.21676408580639883] -- v = [2.1044018893653786e-5, -- -8.9108923304429319e-5, -- -3.8633714797716569e-5] -- s = 0.99980921395708788 -- bm1 = 0.99999999506209258 -- -- expected = [-0.7631631094219556269, -- -0.6087553082505590832, -- -0.2167926269368471279] -- -- res = erfa.ab(pnat, v, s, bm1) -- assert res.shape == (3,) -- -- np.testing.assert_allclose(res, expected) -- -- res2 = erfa.ab([pnat]*4, v, s, bm1) -- assert res2.shape == (4, 3) -- np.testing.assert_allclose(res2, [expected]*4) -- -- # here we stride an array and also do it Fortran-order to make sure -- # it all still works correctly with non-contig arrays -- pnata = np.array(pnat) -- arrin = np.array([pnata, pnata/2, pnata/3, pnata/4, pnata/5]*4, order='F') -- res3 = erfa.ab(arrin[::5], v, s, bm1) -- assert res3.shape == (4, 3) -- np.testing.assert_allclose(res3, [expected]*4) -- -- --def test_pv_in(): -- jd1 = 2456165.5 -- jd2 = 0.401182685 -- -- pv = np.empty((), dtype=erfa.dt_pv) -- pv['p'] = [-6241497.16, -- 401346.896, -- -1251136.04] -- pv['v'] = [-29.264597, -- -455.021831, -- 0.0266151194] -- -- astrom = erfa.apcs13(jd1, jd2, pv) -- assert astrom.shape == () -- -- # values from t_erfa_c -- np.testing.assert_allclose(astrom['pmt'], 12.65133794027378508) -- np.testing.assert_allclose(astrom['em'], 1.010428384373318379) -- np.testing.assert_allclose(astrom['eb'], [0.9012691529023298391, -- -.4173999812023068781, -- -.1809906511146821008]) -- np.testing.assert_allclose(astrom['bpn'], np.eye(3)) -- -- # first make sure it *fails* if we mess with the input orders -- pvbad = np.empty_like(pv) -- pvbad['p'], pvbad['v'] = pv['v'], pv['p'] -- astrombad = erfa.apcs13(jd1, jd2, pvbad) -- assert not np.allclose(astrombad['em'], 1.010428384373318379) -- -- pvarr = np.array([pv]*3) -- astrom2 = erfa.apcs13(jd1, jd2, pvarr) -- assert astrom2.shape == (3,) -- np.testing.assert_allclose(astrom2['em'], 1.010428384373318379) -- -- # try striding of the input array to make non-contiguous -- pvmatarr = np.array([pv]*9)[::3] -- astrom3 = erfa.apcs13(jd1, jd2, pvmatarr) -- assert astrom3.shape == (3,) -- np.testing.assert_allclose(astrom3['em'], 1.010428384373318379) -- -- --def test_structs(): -- """ -- Checks producing and consuming of ERFA c structs -- """ -- -- am, eo = erfa.apci13(2456165.5, [0.401182685, 1]) -- assert am.shape == (2, ) -- assert am.dtype == erfa.dt_eraASTROM -- assert eo.shape == (2, ) -- -- # a few spotchecks from test_erfa.c -- np.testing.assert_allclose(am[0]['pmt'], 12.65133794027378508) -- np.testing.assert_allclose(am[0]['v'], [0.4289638897157027528e-4, -- 0.8115034002544663526e-4, -- 0.3517555122593144633e-4]) -- -- ri, di = erfa.atciqz(2.71, 0.174, am[0]) -- np.testing.assert_allclose(ri, 2.709994899247599271) -- np.testing.assert_allclose(di, 0.1728740720983623469) -- -- --def test_float32_input(): -- # Regression test for gh-8615 -- xyz = np.array([[1, 0, 0], [0.9, 0.1, 0]]) -- out64 = erfa.p2s(xyz) -- out32 = erfa.p2s(xyz.astype('f4')) -- np.testing.assert_allclose(out32, out64, rtol=1.e-5) -- -- --class TestAstromNotInplace: -- def setup(self): -- self.mjd_array = np.array( -- [58827.15925499, 58827.15925499, 58827.15925499, -- 58827.15925499, 58827.15925499]) -- self.mjd_scalar = self.mjd_array[0].item() -- self.utc2mjd = 2400000.5 -- paranal_long = -1.228798 -- paranal_lat = -0.42982 -- paranal_height = 2669. -- self.astrom_scalar, _ = erfa.apco13( -- self.utc2mjd, self.mjd_scalar, 0.0, paranal_long, paranal_lat, -- paranal_height, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5) -- self.astrom_array, _ = erfa.apco13( -- self.utc2mjd, self.mjd_array, 0.0, paranal_long, paranal_lat, -- paranal_height, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5) -- -- def test_scalar_input(self): -- # Regression test for gh-9799, where astrom0 being a void -- # caused a TypeError, as it was trying to change it in-place. -- assert type(self.astrom_scalar) is np.void -- astrom = erfa.aper13(self.utc2mjd, self.mjd_scalar, self.astrom_scalar) -- assert astrom is not self.astrom_scalar -- assert type(astrom) is np.void -- -- def test_array_input(self): -- # Trying to fix gh-9799, it became clear that doing things in-place was -- # a bad idea generally (and didn't work), so also for array input we -- # now return a copy. -- assert type(self.astrom_array) is np.ndarray -- astrom = erfa.aper13(self.utc2mjd, self.mjd_array, self.astrom_array) -- assert astrom is not self.astrom_array -- assert type(astrom) is np.ndarray -- -- --class TestLeapSecondsBasics: -- def test_get_leap_seconds(self): -- leap_seconds = erfa.leap_seconds.get() -- assert isinstance(leap_seconds, np.ndarray) -- assert leap_seconds.dtype is erfa.dt_eraLEAPSECOND -- # Very basic sanity checks. -- assert np.all((leap_seconds['year'] >= 1960) & -- (leap_seconds['year'] < 3000)) -- assert np.all((leap_seconds['month'] >= 1) & -- (leap_seconds['month'] <= 12)) -- assert np.all(abs(leap_seconds['tai_utc'] < 1000.)) -- -- def test_leap_seconds_expires(self): -- expires = erfa.leap_seconds.expires -- assert isinstance(expires, datetime) -- last_ls = erfa.leap_seconds.get()[-1] -- dt_last = datetime(last_ls['year'], last_ls['month'], 1) -- assert expires > dt_last -- -- --class TestLeapSeconds: -- """Test basic methods to control the ERFA leap-second table.""" -- def setup(self): -- self.erfa_ls = erfa.leap_seconds.get() -- self.expires = erfa.leap_seconds.expires -- self._expires = erfa.leap_seconds._expires -- -- def teardown(self): -- erfa.leap_seconds.set(self.erfa_ls) -- erfa.leap_seconds._expires = self._expires -- -- def test_set_reset_leap_seconds(self): -- erfa.leap_seconds.set() -- leap_seconds = erfa.leap_seconds.get() -- -- erfa.leap_seconds.set(leap_seconds[:-2]) -- new_leap_seconds = erfa.leap_seconds.get() -- assert_array_equal(new_leap_seconds, leap_seconds[:-2]) -- -- erfa.leap_seconds.set() -- reset_leap_seconds = erfa.leap_seconds.get() -- assert_array_equal(reset_leap_seconds, leap_seconds) -- -- def test_set_leap_seconds(self): -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- leap_seconds = erfa.leap_seconds.get() -- # Set to a table that misses the 2017 leap second. -- part_leap_seconds = leap_seconds[leap_seconds['year'] < 2017] -- erfa.leap_seconds.set(part_leap_seconds) -- new_leap_seconds = erfa.leap_seconds.get() -- assert_array_equal(new_leap_seconds, part_leap_seconds) -- # Check the 2017 leap second is indeed missing. -- assert erfa.dat(2018, 1, 1, 0.) == 36.0 -- # And that this would be expected from the expiration date. -- assert erfa.leap_seconds.expires < datetime(2018, 1, 1) -- assert erfa.leap_seconds.expired -- # Reset and check it is back. -- erfa.leap_seconds.set() -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- -- @pytest.mark.parametrize('table,match', [ -- ([(2017, 3, 10.)], 'January'), -- ([(2017, 1, 1.), -- (2017, 7, 3.)], 'jump'), -- ([[(2017, 1, 1.)], -- [(2017, 7, 2.)]], 'dimension')]) -- def test_validation(self, table, match): -- with pytest.raises(ValueError, match=match): -- erfa.leap_seconds.set(table) -- # Check leap-second table is not corrupted. -- assert_array_equal(erfa.leap_seconds.get(), self.erfa_ls) -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- -- def test_update_leap_seconds(self): -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- leap_seconds = erfa.leap_seconds.get() -- # Get old and new leap seconds -- old_leap_seconds = leap_seconds[leap_seconds['year'] < 2017] -- new_leap_seconds = leap_seconds[leap_seconds['year'] >= 2017] -- # Updating with either of these should do nothing. -- n_update = erfa.leap_seconds.update(new_leap_seconds) -- assert n_update == 0 -- assert_array_equal(erfa.leap_seconds.get(), self.erfa_ls) -- n_update = erfa.leap_seconds.update(old_leap_seconds) -- assert n_update == 0 -- assert_array_equal(erfa.leap_seconds.get(), self.erfa_ls) -- -- # But after setting to older part, update with newer should work. -- erfa.leap_seconds.set(old_leap_seconds) -- # Check the 2017 leap second is indeed missing. -- assert erfa.dat(2018, 1, 1, 0.) == 36.0 -- # Update with missing leap seconds. -- n_update = erfa.leap_seconds.update(new_leap_seconds) -- assert n_update == len(new_leap_seconds) -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- -- # Also a final try with overlapping data. -- erfa.leap_seconds.set(old_leap_seconds) -- n_update = erfa.leap_seconds.update(leap_seconds) -- assert n_update == len(new_leap_seconds) -- assert erfa.dat(2018, 1, 1, 0.) == 37.0 -- -- @pytest.mark.parametrize('expiration', [ -- datetime(2345, 1, 1), -- '1 January 2345', -- Time('2345-01-01', scale='tai')]) -- def test_with_expiration(self, expiration): -- class ExpiringArray(np.ndarray): -- expires = expiration -- -- leap_seconds = erfa.leap_seconds.get() -- erfa.leap_seconds.set(leap_seconds.view(ExpiringArray)) -- assert erfa.leap_seconds.expires == datetime(2345, 1, 1) -- -- # Get old and new leap seconds -- old_leap_seconds = leap_seconds[:-10] -- new_leap_seconds = leap_seconds[-10:] -- -- erfa.leap_seconds.set(old_leap_seconds) -- # Check expiration is reset -- assert erfa.leap_seconds.expires != datetime(2345, 1, 1) -- # Update with missing leap seconds. -- n_update = erfa.leap_seconds.update( -- new_leap_seconds.view(ExpiringArray)) -- assert n_update == len(new_leap_seconds) -- assert erfa.leap_seconds.expires == datetime(2345, 1, 1) -- -- def test_with_expiration_warning(self): -- class ExpiringArray(np.ndarray): -- expires = 'incomprehensible' -- -- leap_seconds = erfa.leap_seconds.get() -- with pytest.warns(erfa.ErfaWarning, -- match='non-datetime.*parsing it raised'): -- erfa.leap_seconds.set(leap_seconds.view(ExpiringArray)) -Index: astropy-4.1/astropy/_erfa/ufunc.c.templ -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/ufunc.c.templ -+++ /dev/null -@@ -1,921 +0,0 @@ --/* -*- mode: c -*- */ -- --/* Licensed under a 3-clause BSD style license - see LICENSE.rst */ -- --/* -- * "ufunc.c" is auto-generated by erfa_generator.py from the template -- * "ufunc.c.templ". Do *not* edit "ufunc.c" directly, instead edit -- * "ufunc.c.templ" and run ufunc_generator.py from the source directory -- * to update it. -- */ -- --#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION --#include "Python.h" --#include "numpy/arrayobject.h" --#include "numpy/ufuncobject.h" --#include "erfa.h" --#include "erfaextra.h" --#include "erfa_additions.h" -- --#define MODULE_DOCSTRING \ -- "Ufunc wrappers of the ERFA routines.\n\n" \ -- "These ufuncs vectorize the ERFA functions assuming structured dtypes\n" \ -- "for vector and matrix arguments. Status codes are vectors as well.\n" \ -- "Python wrappers are also provided, which convert between\n" \ -- "trailing dimensions and structured dtypes where necessary,\n" \ -- "and combine status codes." --#define GET_LEAP_SECONDS_DOCSTRING \ -- "get_leap_seconds()\n\n" \ -- "Access the leap second table used in ERFA.\n\n" \ -- "Returns\n" \ -- "-------\n" \ -- "leap_seconds : `~numpy.ndarray`\n" \ -- " With structured dtype `~astropy._erfa.dt_eraLEAPSECOND`,\n" \ -- " containing items 'year', 'month', and 'tai_utc'." --#define SET_LEAP_SECONDS_DOCSTRING \ -- "set_leap_seconds([table])\n\n" \ -- "Set the leap second table used in ERFA.\n\n" \ -- "Parameters\n" \ -- "----------\n" \ -- "leap_seconds : array_like, optional\n" \ -- " With structured dtype `~astropy._erfa.dt_eraLEAPSECOND`,\n" \ -- " containing items 'year', 'month', and 'tai_utc'.\n" \ -- " If not given, reset to the ERFA built-in table.\n\n" \ -- "Notes\n" \ -- "-----\n" \ -- "No sanity checks are done on the input; it is simply coerced\n" \ -- "to the correct dtype." -- -- --static inline void copy_to_double3(char *ptr, npy_intp s, double d[3]) { -- char *p = ptr; -- int j; -- for (j = 0; j < 3; j++, p += s) { -- d[j] = *(double *)p; -- } --} -- --static inline void copy_from_double3(char *ptr, npy_intp s, double d[3]) { -- char *p = ptr; -- int j; -- for (j = 0; j < 3; j++, p += s) { -- *(double *)p = d[j]; -- } --} -- --static inline void copy_to_double33(char *ptr, npy_intp s0, npy_intp s1, -- double d[3][3]) { -- char *p0 = ptr; -- int j0, j1; -- for (j0 = 0; j0 < 3; j0++, p0 += s0) { -- char *p1 = p0; -- for (j1 = 0; j1 < 3; j1++, p1 += s1) { -- d[j0][j1] = *(double *)p1; -- } -- } --} -- --static inline void copy_from_double33(char *ptr, npy_intp s0, npy_intp s1, -- double d[3][3]) { -- char *p = ptr; -- char *p0 = ptr; -- int j0, j1; -- for (j0 = 0; j0 < 3; j0++, p0 += s0) { -- char *p1 = p0; -- for (j1 = 0; j1 < 3; j1++, p1 += s1) { -- *(double *)p = d[j0][j1]; -- } -- } --} -- --/* eraLDBODY is never returned, so we do not need a copy_from */ --static inline void copy_to_eraLDBODY(char *ptr, npy_intp s, npy_intp n, -- eraLDBODY b[]) { -- char *p = ptr; -- npy_intp j; -- for (j = 0; j < n; j++, p += s) { -- b[j] = *(eraLDBODY *)p; -- } --} -- --/* -- * INNER LOOPS - iteratively call the erfa function for a chunk of data. -- * -- * For each argument: -- * char * is the pointer to the data in memory; -- * npy_intp s_ is the number of bytes between successive elements; -- * *_ is a correctly cast pointer to the current element; -- * ( _, i.e., not a pointer, for status codes and return values) -- * -- * Notes: -- * 1. Some erfa function change elements in-place; in the ufunc, these "inout" -- * arguments are treated as separate: data is copied from the input to the -- * output, and the output is changed in-place by the erfa function. -- * To reproduce the in-place behaviour, the input to the ufunc can be passed -- * in as output as well -- as is done in the python wrapper (the copy will -- * be omitted for this case). -- * 2. Any erfa function involving light deflection requires an struct -- * eraLDBODY argument with a dimension that is user-defined. Those function -- * are implemented as generalized ufuncs, with a signature in which the -- * relevant variable is marked (i.e., '(),...,(n), (), ... -> (),...'). -- * In the inner loops, an appropriate copy is done if in the numpy array -- * the n elements are not contiguous. -- * 3. Similar copies are done for erfa functions that require vectors or -- * matrices, if the corresponding axes in the input or output operands are -- * not contiguous. -- */ -- --{%- macro inner_loop_steps_and_copy(arg, arg_name) %} -- {%- for i in range(arg.ndim or 1) %} -- npy_intp is_{{ arg_name }}{{ i }} = *steps++; -- {%- endfor %} -- {#- /* copy should be made if buffer not contiguous; -- note: one can only have 1 or 2 dimensions */ #} -- {%- if arg.ndim == 2 %} -- int copy_{{ arg_name -- }} = (is_{{ arg_name }}1 != sizeof({{ arg.ctype }}) && -- is_{{ arg_name }}0 != {{ arg.shape[1] }} * sizeof({{ arg.ctype }})); -- {%- else %} -- int copy_{{ arg_name }} = (is_{{ arg_name }}0 != sizeof({{ arg.ctype }})); -- {%- endif %} --{%- endmacro %} -- --{%- for func in funcs %} -- --static void ufunc_loop_{{ func.pyname }}( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- {#- /* index and length of loop */ #} -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- {#- /* -- * Pointers to each argument, required step size -- */ #} -- {#- /* normal input arguments */ #} -- {%- for arg in func.args_by_inout('in') %} -- char *{{ arg.name }} = *args++; -- npy_intp s_{{ arg.name }} = *steps++; -- {%- endfor -%} -- {#- /* for in part of in-place arguments, we need a different name */ #} -- {%- for arg in func.args_by_inout('inout') %} -- char *{{ arg.name }}_in = *args++; -- npy_intp s_{{ arg.name }}_in = *steps++; -- {%- endfor -%} -- {#- /* out part of input, and output arguments, including status */ #} -- {%- for arg in func.args_by_inout('inout|out|stat|ret') %} -- char *{{ arg.name }} = *args++; -- npy_intp s_{{ arg.name }} = *steps++; -- {%- endfor -%} -- {#- /* -- * Cast pointers and possible contiguous buffers (for gufuncs) -- */ #} -- {%- for arg in func.args_by_inout('in|inout|out') %} -- {%- if arg.signature_shape == '()' or arg.ctype == 'eraLDBODY' %} -- {{ arg.ctype }} (*_{{ arg.name }}){{ arg.cshape }}; -- {%- else %} -- double b_{{ arg.name }}{{ arg.cshape }}; -- {{ arg.ctype }} (*_{{ arg.name }}){{ arg.cshape }} = &b_{{ arg.name }}; -- {%- endif %} -- {%- endfor %} -- {#- /* variables to hold status and return values */ #} -- {%- for arg in func.args_by_inout('stat|ret') %} -- {{ arg.ctype }} _{{ arg.name }}; -- {%- endfor %} -- {#- /* -- * For GENERALIZED UFUNCS - inner loop steps, needs for copying. -- */ #} -- {%- if func.signature %} -- {#- /* loop step sizes and whether copies are needed */ #} -- {%- for arg in func.args_by_inout('in') %} -- {#- /* only LDBODY has non-fixed dimension; it is always first */ #} -- {%- if arg.ctype == 'eraLDBODY' %} -- npy_intp nb = dimensions[0]; -- {%- endif %} -- {%- if arg.signature_shape != '()' -%} -- {{ inner_loop_steps_and_copy(arg, arg.name) }} -- {%- endif %} -- {%- endfor %} -- {%- for arg in func.args_by_inout('inout') %} -- {%- if arg.signature_shape != '()' -%} -- {{ inner_loop_steps_and_copy(arg, arg.name + '_in') }} -- {%- endif %} -- {%- endfor %} -- {%- for arg in func.args_by_inout('inout|out') %} -- {%- if arg.signature_shape != '()' -%} -- {{ inner_loop_steps_and_copy(arg, arg.name) }} -- {%- endif %} -- {%- endfor %} -- {#- /* if needed, allocate memory for contiguous eraLDBODY copies */ #} -- {%- if func.user_dtype == 'dt_eraLDBODY' %} -- if (copy_b) { -- _b = PyArray_malloc(nb * sizeof(eraLDBODY)); -- if (_b == NULL) { -- PyErr_NoMemory(); -- return; -- } -- } -- else { {#- /* just to keep compiler happy */ #} -- _b = NULL; -- } -- {%- endif %} -- {%- endif %} {#- /* end of GUFUNC inner loop definitions */ #} -- {#- /* -- * Actual inner loop, increasing all pointers by their steps -- */ #} -- for (i_o = 0; i_o < n_o; -- i_o++ {%- for arg in func.args_by_inout('in|inout|out|stat|ret') -%} -- , {{ arg.name }} += s_{{ arg.name }} -- {%- endfor -%} -- {%- for arg in func.args_by_inout('inout') -%} -- , {{ arg.name }}_in += s_{{ arg.name }}_in -- {%- endfor -%}) { -- {%- if func.signature %} -- {#- /* -- * GENERALIZED UFUNC, prepare for call. -- */ #} -- {#- /* copy input arguments to buffer if needed */ #} -- {%- for arg in func.args_by_inout('in') %} -- {%- if arg.signature_shape != '()' %} -- if (copy_{{ arg.name }}) { -- copy_to_{{ arg.ctype }}{{ arg.shape|join('') }}({{ arg.name }} -- {%- for i in range(arg.ndim or 1) -%} -- , is_{{ arg.name }}{{ i }} -- {%- endfor %}, {{ arg.name_for_call}}); -- } -- else { -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- } -- {%- else %} -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- {%- endif %} -- {%- endfor %} {#- end of loop over 'in' #} -- {#- /* for inout arguments, set up output first, -- and then copy to it if needed */ #} -- {%- for arg in func.args_by_inout('inout') %} -- {%- if arg.signature_shape != '()' %} -- if (!copy_{{ arg.name }}) { -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- } -- if (copy_{{ arg.name }}_in || {{ arg.name }} != {{ arg.name }}_in) { -- copy_to_{{ arg.ctype }}{{ arg.shape|join('') }}({{ arg.name }}_in -- {%- for i in range(arg.ndim or 1) -%} -- , is_{{ arg.name }}_in{{ i }} -- {%- endfor %}, {{ arg.name_for_call}}); -- } -- {%- else %} -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- if ({{ arg.name }}_in != {{ arg.name }}) { -- memcpy({{ arg.name }}, {{ arg.name }}_in, {{ arg.size }}*sizeof({{ arg.ctype }})); -- } -- {%- endif %} -- {%- endfor %} {#- end of loop over 'inout' #} -- {#- /* set up gufunc outputs */ #} -- {%- for arg in func.args_by_inout('out') %} -- {%- if arg.signature_shape != '()' %} -- if (!copy_{{ arg.name }}) { -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- } -- {%- else %} -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- {%- endif %} -- {%- endfor %} {#- end of loop over 'out' #} -- {%- else %} -- {#- /* -- * NORMAL UFUNC, prepare for call -- */ #} -- {#- /* set up pointers to input/output arguments */ #} -- {%- for arg in func.args_by_inout('in|inout|out') %} -- _{{ arg.name }} = (({{ arg.ctype }} (*){{ arg.cshape }}){{ arg.name }}); -- {%- endfor %} -- {#- /* copy from in to out for arugments changed in-place */ #} -- {%- for arg in func.args_by_inout('inout') %} -- if ({{ arg.name }}_in != {{ arg.name }}) { -- memcpy({{ arg.name }}, {{ arg.name }}_in, {{ arg.size }}*sizeof({{ arg.ctype }})); -- } -- {%- endfor %} -- {%- endif %} {#- end of gufunc/ufunc preparation #} -- {#- /* -- * call the actual erfa function -- */ #} -- {{ func.args_by_inout('ret|stat') | -- map(attribute='name') | -- surround('_', ' = ') | -- join -- }}{{ func.name -- }}({{ func.args_by_inout('in|inout|out') | -- map(attribute='name_for_call') | -- join(', ') }}); -- {#- /* store any return values */ #} -- {%- for arg in func.args_by_inout('ret|stat') %} -- *(({{ arg.ctype }} *){{ arg.name }}) = _{{ arg.name }}; -- {%- endfor %} -- {%- if func.signature %} -- {#- /* for generalized ufunc, copy output from buffer if needed */ #} -- {%- for arg in func.args_by_inout('inout|out') %} -- {%- if arg.signature_shape != '()' %} -- if (copy_{{ arg.name }}) { -- copy_from_{{ arg.ctype }}{{ arg.shape|join('') }}({{ arg.name }} -- {%- for i in range(arg.ndim or 1) -%} -- , is_{{ arg.name }}{{ i }} -- {%- endfor %}, {{ arg.name_for_call}}); -- } -- {%- endif %} -- {%- endfor %} -- {%- endif %} -- } -- {%- if func.user_dtype == 'dt_eraLBODY' %} -- if (copy_b) { -- PyArray_free(_b); -- } -- {%- endif %} --} -- --{%- endfor %} -- --/* -- * UFUNC LOOP MATCHING HELPERS -- * All but ufunc_loop_matches are copies of code needed but not exported. -- */ -- --/* -- * Adjusted version of ufunc_loop_matches from -- * numpy/core/src/umath/ufunc_type_resolution.c. -- * Here, we special-case the structured dtype check, only allowing -- * casting of the same dtype or string. We also do not distinguish -- * between input and output arguments for casting. -- */ --static int --ufunc_loop_matches(PyUFuncObject *self, -- PyArrayObject **op, -- NPY_CASTING casting, -- int *types, PyArray_Descr **dtypes) --{ -- npy_intp i, nin = self->nin, nop = nin + self->nout; -- /* -- * Check if all the inputs can be cast to the types used by this function. -- */ -- for (i = 0; i < nin; ++i) { -- PyArray_Descr *op_descr = PyArray_DESCR(op[i]); -- /* -- * Check for NPY_VOID with an associated struct dtype. -- */ -- if (types[i] == NPY_VOID && dtypes != NULL) { -- int op_descr_type_num = op_descr->type_num; -- int dtype_elsize = dtypes[i]->elsize; -- /* -- * MHvK: we do our own check on casting, since by default -- * all items can cast to structured dtypes (see gh-11114), -- * which is not OK. So, we only allow VOID->same VOID, -- * and STRING -> VOID-of-STRING (which works well; we -- * recognize VOID-of-STRING by the dtype element size; -- * it would be rather costly to go look at dtype->fields). -- */ -- if (op_descr_type_num == NPY_VOID) { -- /* allow only the same structured to structured */ -- if (!PyArray_EquivTypes(op_descr, dtypes[i])) { -- return 0; -- } -- } -- else if (dtypes[i]->elsize == 1 || dtypes[i]->elsize == 12) { -- /* string structured array; string argument is OK */ -- if (!((op_descr_type_num == NPY_STRING && -- op_descr->elsize <= dtype_elsize) || -- (op_descr_type_num == NPY_UNICODE && -- op_descr->elsize >> 2 <= dtype_elsize))) { -- return 0; -- } -- } -- else { -- return 0; -- } -- } -- else { /* non-void function argument */ -- PyArray_Descr *tmp = PyArray_DescrFromType(types[i]); -- if (tmp == NULL) { -- return -1; -- } -- if (!PyArray_CanCastTypeTo(op_descr, tmp, casting)) { -- Py_DECREF(tmp); -- return 0; -- } -- Py_DECREF(tmp); -- } -- } -- /* -- * All inputs were ok; now check casting back to the outputs. -- * MHvK: Since no casting from structured to non-structured is -- * possible, no changes needed here. -- */ -- for (i = nin; i < nop; ++i) { -- if (op[i] != NULL) { -- PyArray_Descr *tmp = PyArray_DescrFromType(types[i]); -- if (tmp == NULL) { -- return -1; -- } -- if (!PyArray_CanCastTypeTo(tmp, PyArray_DESCR(op[i]), -- casting)) { -- Py_DECREF(tmp); -- return 0; -- } -- Py_DECREF(tmp); -- } -- } -- return 1; --} --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since this translation function is not exported. -- */ --static const char * --npy_casting_to_string(NPY_CASTING casting) --{ -- switch (casting) { -- case NPY_NO_CASTING: -- return "'no'"; -- case NPY_EQUIV_CASTING: -- return "'equiv'"; -- case NPY_SAFE_CASTING: -- return "'safe'"; -- case NPY_SAME_KIND_CASTING: -- return "'same_kind'"; -- case NPY_UNSAFE_CASTING: -- return "'unsafe'"; -- default: -- return ""; -- } --} -- --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since not exported. -- */ --static PyArray_Descr * --ensure_dtype_nbo(PyArray_Descr *type) --{ -- if (PyArray_ISNBO(type->byteorder)) { -- Py_INCREF(type); -- return type; -- } -- else { -- return PyArray_DescrNewByteorder(type, NPY_NATIVE); -- } --} -- --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since not exported. -- */ --static int --set_ufunc_loop_data_types(PyUFuncObject *self, PyArrayObject **op, -- PyArray_Descr **out_dtypes, -- int *type_nums, PyArray_Descr **dtypes) --{ -- int i, nin = self->nin, nop = nin + self->nout; -- -- /* -- * Fill the dtypes array. -- * For outputs, -- * also search the inputs for a matching type_num to copy -- * instead of creating a new one, similarly to preserve metadata. -- **/ -- for (i = 0; i < nop; ++i) { -- if (dtypes != NULL) { -- out_dtypes[i] = dtypes[i]; -- Py_XINCREF(out_dtypes[i]); -- /* -- * Copy the dtype from 'op' if the type_num matches, -- * to preserve metadata. -- */ -- } -- else if (op[i] != NULL && -- PyArray_DESCR(op[i])->type_num == type_nums[i]) { -- out_dtypes[i] = ensure_dtype_nbo(PyArray_DESCR(op[i])); -- } -- /* -- * For outputs, copy the dtype from op[0] if the type_num -- * matches, similarly to preserve metdata. -- */ -- else if (i >= nin && op[0] != NULL && -- PyArray_DESCR(op[0])->type_num == type_nums[i]) { -- out_dtypes[i] = ensure_dtype_nbo(PyArray_DESCR(op[0])); -- } -- /* Otherwise create a plain descr from the type number */ -- else { -- out_dtypes[i] = PyArray_DescrFromType(type_nums[i]); -- } -- -- if (out_dtypes[i] == NULL) { -- goto fail; -- } -- } -- -- return 0; -- --fail: -- while (--i >= 0) { -- Py_DECREF(out_dtypes[i]); -- out_dtypes[i] = NULL; -- } -- return -1; --} -- --/* -- * UFUNC TYPE RESOLVER -- * -- * We provide our own type resolver, since the default one, -- * PyUFunc_DefaultTypeResolver from -- * numpy/core/src/umath/ufunc_type_resolution.c, has problems: -- * 1. It only looks for userloops if any of the operands have a user -- * type, which does not work if the inputs are normal and no explicit -- * output is given (see https://github.com/numpy/numpy/issues/11109). -- * 2. It only allows "safe" casting of inputs, which annoyingly prevents -- * passing in a python int for int32 input. -- * The resolver below solves both, and speeds up the process by -- * explicitly assuming that a ufunc has only one function built in, -- * either a regular one or a userloop (for structured dtype). -- * -- * Combines code from linear_search_type_resolver and -- * linear_search_userloop_type_resolver from -- * numpy/core/src/umath/ufunc_type_resolution.c -- */ --static int ErfaUFuncTypeResolver(PyUFuncObject *ufunc, -- NPY_CASTING casting, -- PyArrayObject **operands, -- PyObject *type_tup, -- PyArray_Descr **out_dtypes) --{ -- int *types; -- PyArray_Descr **dtypes; -- -- if (ufunc->userloops) { -- Py_ssize_t unused_pos = 0; -- PyObject *userloop; -- PyUFunc_Loop1d *funcdata; -- -- if (ufunc->ntypes > 0 || PyDict_Size(ufunc->userloops) != 1) { -- goto fail; -- } -- /* No iteration needed; only one entry in dict */ -- PyDict_Next(ufunc->userloops, &unused_pos, NULL, &userloop); -- funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(userloop, NULL); -- /* There should be only one function */ -- if (funcdata->next != NULL) { -- goto fail; -- } -- types = funcdata->arg_types; -- dtypes = funcdata->arg_dtypes; -- } -- else { -- npy_intp j; -- int types_array[NPY_MAXARGS]; -- -- if (ufunc->ntypes != 1) { -- goto fail; -- } -- /* Copy the types into an int array for matching */ -- for (j = 0; j < ufunc->nargs; ++j) { -- types_array[j] = ufunc->types[j]; -- } -- types = types_array; -- dtypes = NULL; -- } -- switch (ufunc_loop_matches(ufunc, operands, casting, types, dtypes)) { -- case 1: /* Matching types */ -- return set_ufunc_loop_data_types(ufunc, operands, out_dtypes, -- types, dtypes); -- case -1: /* Error */ -- return -1; -- } -- /* No match */ -- PyErr_Format(PyExc_TypeError, -- "ufunc '%s' not supported for the input types, and the " -- "inputs could not be safely coerced to any supported " -- "types according to the casting rule '%s'", -- ufunc->name, npy_casting_to_string(casting)); -- return -1; -- --fail: -- /* More than one loop or function */ -- PyErr_Format(PyExc_RuntimeError, -- "Unexpected internal error: ufunc '%s' wraps an ERFA " -- "function and should have only a single loop with a " -- "single function, yet has more.", -- ufunc->name); -- return -1; --} -- --/* -- * LEAP SECOND ACCESS -- * -- * Getting/Setting ERFAs built-in TAI-UTC table. -- * -- * TODO: the whole procedure is not sub-interpreter safe. -- * In this module, one might get dt_eraLEAPSECOND out of the module dict, -- * and store the leap_second array in a per-module struct (see PEP 3121). -- * But one then would also have to adapt erfa/dat.c to not use a -- * static leap second table. Possibly best might be to copy dat.c here -- * and put the table into the per-module struct as well. -- */ --static PyArray_Descr *dt_eraLEAPSECOND = NULL; /* Set in PyInit_ufunc */ -- --static PyObject * --get_leap_seconds(PyObject *NPY_UNUSED(module), PyObject *NPY_UNUSED(args)) { -- eraLEAPSECOND *leapseconds; -- npy_intp count; -- PyArrayObject *array; -- /* Get the leap seconds from ERFA */ -- count = (npy_intp)eraGetLeapSeconds(&leapseconds); -- if (count < 0) { -- PyErr_SetString(PyExc_RuntimeError, -- "Unpexected failure to get ERFA leap seconds."); -- return NULL; -- } -- /* Allocate an array to hold them */ -- Py_INCREF(dt_eraLEAPSECOND); -- array = (PyArrayObject *)PyArray_NewFromDescr( -- &PyArray_Type, dt_eraLEAPSECOND, 1, &count, NULL, NULL, 0, NULL); -- if (array == NULL) { -- return NULL; -- } -- /* Copy the leap seconds over into the array */ -- memcpy(PyArray_DATA(array), leapseconds, count*sizeof(eraLEAPSECOND)); -- return (PyObject *)array; --} -- --static PyObject * --set_leap_seconds(PyObject *NPY_UNUSED(module), PyObject *args) { -- PyObject *leap_seconds = NULL; -- PyArrayObject *array; -- static PyArrayObject *leap_second_array = NULL; -- -- if (!PyArg_ParseTuple(args, "|O:set_leap_seconds", &leap_seconds)) { -- return NULL; -- } -- if (leap_seconds != NULL && leap_seconds != Py_None) { -- /* -- * Convert the input to an array with the proper dtype; -- * Ensure a copy is made so one cannot change the data by changing -- * the input array. -- */ -- Py_INCREF(dt_eraLEAPSECOND); -- array = (PyArrayObject *)PyArray_FromAny(leap_seconds, dt_eraLEAPSECOND, -- 1, 1, (NPY_ARRAY_CARRAY | NPY_ARRAY_ENSURECOPY), NULL); -- if (array == NULL) { -- return NULL; -- } -- if (PyArray_SIZE(array) == 0) { -- PyErr_SetString(PyExc_ValueError, -- "Leap second array must have at least one entry."); -- } -- /* -- * Use the array for the new leap seconds. -- */ -- eraSetLeapSeconds(PyArray_DATA(array), PyArray_SIZE(array)); -- } -- else { -- /* -- * If no input is given, reset leap second table. -- */ -- array = NULL; -- eraSetLeapSeconds(NULL, 0); -- } -- /* -- * If we allocated a leap second array before, deallocate it, -- * and set it to remember any allocation from PyArray_FromAny. -- */ -- if (leap_second_array != NULL) { -- Py_DECREF(leap_second_array); -- } -- leap_second_array = array; -- Py_RETURN_NONE; --} -- --/* -- * UFUNC MODULE DEFINITIONS AND INITIALIZATION -- */ --static PyMethodDef ErfaUFuncMethods[] = { -- {"get_leap_seconds", (PyCFunction)get_leap_seconds, -- METH_NOARGS, GET_LEAP_SECONDS_DOCSTRING}, -- {"set_leap_seconds", (PyCFunction)set_leap_seconds, -- METH_VARARGS, SET_LEAP_SECONDS_DOCSTRING}, -- {NULL, NULL, 0, NULL} --}; -- --static struct PyModuleDef moduledef = { -- PyModuleDef_HEAD_INIT, -- "ufunc", -- MODULE_DOCSTRING, -- -1, -- ErfaUFuncMethods, -- NULL, -- NULL, -- NULL, -- NULL --}; -- --PyMODINIT_FUNC PyInit_ufunc(void) --{ -- /* module and its dict */ -- PyObject *m, *d; -- /* structured dtypes and their definition */ -- PyObject *dtype_def; -- PyArray_Descr *dt_double = NULL, *dt_int = NULL; -- PyArray_Descr *dt_pv = NULL, *dt_pvdpv = NULL; -- PyArray_Descr *dt_ymdf = NULL, *dt_hmsf = NULL, *dt_dmsf = NULL; -- PyArray_Descr *dt_sign = NULL, *dt_type = NULL; -- PyArray_Descr *dt_eraASTROM = NULL, *dt_eraLDBODY = NULL; -- PyArray_Descr *dtypes[NPY_MAXARGS]; -- /* ufuncs and their definitions */ -- int status; -- PyUFuncObject *ufunc; -- static void *data[1] = {NULL}; -- {#- /* for non-structured functions, define there types and functions -- as these do not get copied */ #} -- {%- for func in funcs %} -- {%- if not func.user_dtype %} -- static char types_{{ func.pyname }}[{{ func.args_by_inout('in|inout|out|ret|stat')|count }}] = { {{ func.args_by_inout('in|inout|out|ret|stat')|map(attribute='npy_type')|join(', ') }} }; -- static PyUFuncGenericFunction funcs_{{ func.pyname }}[1] = { &ufunc_loop_{{ func.pyname }} }; -- {%- endif %} -- {%- endfor %} -- -- m = PyModule_Create(&moduledef); -- if (m == NULL) { -- return NULL; -- } -- d = PyModule_GetDict(m); /* borrowed ref. */ -- if (d == NULL) { -- goto fail; -- } -- -- import_array(); -- import_umath(); -- /* -- * Define the basic and structured types used in erfa so that -- * we can use them for definitions of userloops below. -- */ -- dt_double = PyArray_DescrFromType(NPY_DOUBLE); -- dt_int = PyArray_DescrFromType(NPY_INT); -- /* double[2][3] = pv */ -- dtype_def = Py_BuildValue("[(s, s), (s, s)]", -- "p", "(3,)f8", "v", "(3,)f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_pv); -- Py_DECREF(dtype_def); -- /* double[2] = pvdpv */ -- dtype_def = Py_BuildValue("[(s, s), (s, s)]", -- "pdp", "f8", "pdv", "f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_pvdpv); -- Py_DECREF(dtype_def); -- /* int[4] = ymdf, hmsf, dmsf */ -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "y", "i4", "m", "i4", "d", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_ymdf); -- Py_DECREF(dtype_def); -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "h", "i4", "m", "i4", "s", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_hmsf); -- Py_DECREF(dtype_def); -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "h", "i4", "m", "i4", "s", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_dmsf); -- Py_DECREF(dtype_def); -- /* char1 (have to use structured, otherwise it cannot be a user type) */ -- dtype_def = Py_BuildValue("[(s, s)]", "sign", "S1"); -- PyArray_DescrAlignConverter(dtype_def, &dt_sign); -- Py_DECREF(dtype_def); -- /* char12 */ -- dtype_def = Py_BuildValue("[(s, s)]", "type", "S12"); -- PyArray_DescrAlignConverter(dtype_def, &dt_type); -- Py_DECREF(dtype_def); -- /* eraLDBODY */ -- dtype_def = Py_BuildValue( -- "[(s, s), (s, s), (s, s)]", -- "bm", "f8", /* mass of the body (solar masses) */ -- "dl", "f8", /* deflection limiter (radians^2/2) */ -- "pv", "(2,3)f8" /* barycentric PV of the body (au, au/day) */ -- ); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraLDBODY); -- Py_DECREF(dtype_def); -- /* eraASTROM */ -- dtype_def = Py_BuildValue( -- "[(s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s), (s, s)]", -- "pmt", "f8", /* PM time interval (SSB, Julian years) */ -- "eb", "(3,)f8", /* SSB to observer (vector, au) */ -- "eh", "(3,)f8", /* Sun to observer (unit vector) */ -- "em", "f8", /* distance from Sun to observer (au) */ -- "v", "(3,)f8", /* barycentric observer velocity (vector, c) */ -- "bm1", "f8", /* sqrt(1-|v|^2): reciprocal of Lorenz factor */ -- "bpn", "(3,3)f8", /* bias-precession-nutation matrix */ -- "along", "f8", /* longitude + s' + dERA(DUT) (radians) */ -- "phi", "f8", /* geodetic latitude (radians) */ -- "xpl", "f8", /* polar motion xp wrt local meridian (radians) */ -- "ypl", "f8", /* polar motion yp wrt local meridian (radians) */ -- "sphi", "f8", /* sine of geodetic latitude */ -- "cphi", "f8", /* cosine of geodetic latitude */ -- "diurab", "f8", /* magnitude of diurnal aberration vector */ -- "eral", "f8", /* "local" Earth rotation angle (radians) */ -- "refa", "f8", /* refraction constant A (radians) */ -- "refb", "f8" /* refraction constant B (radians) */ -- ); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraASTROM); -- Py_DECREF(dtype_def); -- /* eraLEAPSECOND */ -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s)]", -- "year", "i4", "month", "i4", "tai_utc", "f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraLEAPSECOND); -- Py_DECREF(dtype_def); -- -- if (dt_double == NULL || dt_int == NULL || -- dt_pv == NULL || dt_pvdpv == NULL || -- dt_ymdf == NULL || dt_hmsf == NULL || dt_dmsf == NULL || -- dt_sign == NULL || dt_type == NULL || -- dt_eraLDBODY == NULL || dt_eraASTROM == NULL || -- dt_eraLEAPSECOND == NULL) { -- goto fail; -- } -- /* Make the structured dtypes available in the module */ -- PyDict_SetItemString(d, "dt_pv", (PyObject *)dt_pv); -- PyDict_SetItemString(d, "dt_pvdpv", (PyObject *)dt_pvdpv); -- PyDict_SetItemString(d, "dt_ymdf", (PyObject *)dt_ymdf); -- PyDict_SetItemString(d, "dt_hmsf", (PyObject *)dt_hmsf); -- PyDict_SetItemString(d, "dt_dmsf", (PyObject *)dt_dmsf); -- PyDict_SetItemString(d, "dt_sign", (PyObject *)dt_sign); -- PyDict_SetItemString(d, "dt_type", (PyObject *)dt_type); -- PyDict_SetItemString(d, "dt_eraLDBODY", (PyObject *)dt_eraLDBODY); -- PyDict_SetItemString(d, "dt_eraASTROM", (PyObject *)dt_eraASTROM); -- PyDict_SetItemString(d, "dt_eraLEAPSECOND", (PyObject *)dt_eraLEAPSECOND); -- /* -- * Define the ufuncs. For those without structured dtypes, -- * the ufunc creation uses the static variables defined above; -- * for those with structured dtypes, an empty ufunc is created, -- * and then a userloop is added. For both, we set the type -- * resolver to our own, and then add the ufunc to the module. -- * -- * Note that for the arguments, any inout arguments, i.e., those -- * that are changed in-place in the ERFA function, are repeated, -- * since we want the ufuncs not to do in-place changes (unless -- * explicitly requested with ufunc(..., in,..., out=in)) -- */ -- {%- for func in funcs %} -- {%- if not func.user_dtype %} -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_{{ func.pyname }}, data, types_{{ func.pyname }}, -- 1, {{ func.args_by_inout('in|inout')|count }}, {{ func.args_by_inout('inout|out|ret|stat')|count }}, PyUFunc_None, -- "{{ func.pyname }}", -- "UFunc wrapper for {{ func.name }}", -- 0, {% if func.signature -%} "{{ func.signature }}" {%- else -%} NULL {%- endif -%}); -- if (ufunc == NULL) { -- goto fail; -- } -- {%- else %} -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, {{ func.args_by_inout('in|inout')|count }}, {{ func.args_by_inout('inout|out|ret|stat')|count }}, PyUFunc_None, -- "{{ func.pyname }}", -- "UFunc wrapper for {{ func.name }}", -- 0, {% if func.signature -%} "{{ func.signature }}" {%- else -%} NULL {%- endif -%}); -- if (ufunc == NULL) { -- goto fail; -- } -- {%- for arg in func.args_by_inout('in|inout') %} -- dtypes[{{ loop.index - 1 }}] = {{ arg.dtype }}; -- {%- endfor %} -- {%- for arg in func.args_by_inout('inout|out|ret|stat') %} -- dtypes[{{ loop.index - 1 + func.args_by_inout('in|inout')|count }}] = {{ arg.dtype }}; -- {%- endfor %} -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, {{ func.user_dtype }}, -- ufunc_loop_{{ func.pyname }}, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- {%- endif %} -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "{{ func.pyname }}", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- {%- endfor %} -- -- goto decref; -- --fail: -- Py_XDECREF(m); -- m = NULL; -- --decref: -- Py_XDECREF(dt_double); -- Py_XDECREF(dt_int); -- Py_XDECREF(dt_pv); -- Py_XDECREF(dt_pvdpv); -- Py_XDECREF(dt_ymdf); -- Py_XDECREF(dt_hmsf); -- Py_XDECREF(dt_dmsf); -- Py_XDECREF(dt_sign); -- Py_XDECREF(dt_type); -- Py_XDECREF(dt_eraASTROM); -- Py_XDECREF(dt_eraLDBODY); -- Py_XDECREF(dt_eraLEAPSECOND); -- return m; --} -Index: astropy-4.1/astropy/__init__.py -=================================================================== ---- astropy-4.1.orig/astropy/__init__.py -+++ astropy-4.1/astropy/__init__.py -@@ -14,6 +14,7 @@ from .version import version as __versio - - __minimum_python_version__ = '3.6' - __minimum_numpy_version__ = '1.16.0' -+__minimum_erfa_version__ = '1.7' - __minimum_scipy_version__ = '0.18' - # ASDF is an optional dependency, but this is the minimum version that is - # compatible with Astropy when it is installed. -@@ -73,32 +74,34 @@ else: - online_docs_root = f'https://docs.astropy.org/en/{__version__}/' - - --def _check_numpy(): -+def _check_requirement(name, minimum_version): - """ - Check that Numpy is installed and it is of the minimum version we - require. - """ - # Note: We could have used distutils.version for this comparison, -- # but it seems like overkill to import distutils at runtime. -+ # but it seems like overkill to import distutils at runtime, and -+ # our own utils.introspection.minversion indirectly needs requirements. - requirement_met = False - import_fail = '' - try: -- import numpy -+ module = __import__(name) - except ImportError: -- import_fail = 'Numpy is not installed.' -+ import_fail = f'{name} is not installed.' - else: -- from .utils import minversion -- requirement_met = minversion(numpy, __minimum_numpy_version__) -+ version = getattr(module, '__version__') -+ requirement_met = version.split('.') >= minimum_version.split('.') - - if not requirement_met: -- msg = (f"Numpy version {__minimum_numpy_version__} or later must " -+ msg = (f"{name} version {__minimum_numpy_version__} or later must " - f"be installed to use Astropy. {import_fail}") - raise ImportError(msg) - -- return numpy -+ return module - - --_check_numpy() -+_check_requirement('numpy', __minimum_numpy_version__) -+_check_requirement('erfa', __minimum_erfa_version__) - - - from . import config as _config -Index: astropy-4.1/astropy/tests/tests/test_imports.py -=================================================================== ---- astropy-4.1.orig/astropy/tests/tests/test_imports.py -+++ astropy-4.1/astropy/tests/tests/test_imports.py -@@ -1,8 +1,6 @@ - # Licensed under a 3-clause BSD style license - see LICENSE.rst - - import pkgutil --import os --import types - - - def test_imports(): -@@ -10,35 +8,16 @@ def test_imports(): - This just imports all modules in astropy, making sure they don't have any - dependencies that sneak through - """ -- -- from astropy.utils import find_current_module -- -- pkgornm = find_current_module(1).__name__.split('.')[0] -- -- if isinstance(pkgornm, str): -- package = pkgutil.get_loader(pkgornm).load_module(pkgornm) -- elif (isinstance(pkgornm, types.ModuleType) and -- '__init__' in pkgornm.__file__): -- package = pkgornm -- else: -- msg = 'test_imports is not determining a valid package/package name' -- raise TypeError(msg) -- -- if hasattr(package, '__path__'): -- pkgpath = package.__path__ -- elif hasattr(package, '__file__'): -- pkgpath = os.path.split(package.__file__)[0] -- else: -- raise AttributeError('package to generate config items for does not ' -- 'have __file__ or __path__') -- -- prefix = package.__name__ + '.' -- - def onerror(name): -- # A legitimate error occurred in a module that wasn't excluded -- raise -+ # We should raise any legitimate error that occurred, but not -+ # any warnings which happen to be caught because of our pytest -+ # settings (e.g., DeprecationWarning). -+ try: -+ raise -+ except Warning: -+ pass - -- for imper, nm, ispkg in pkgutil.walk_packages(pkgpath, prefix, -+ for imper, nm, ispkg in pkgutil.walk_packages(['astropy'], 'astropy.', - onerror=onerror): - imper.find_module(nm) - -Index: astropy-4.1/astropy/time/core.py -=================================================================== ---- astropy-4.1.orig/astropy/time/core.py -+++ astropy-4.1/astropy/time/core.py -@@ -15,9 +15,9 @@ from time import strftime - from warnings import warn - - import numpy as np -+import erfa - - from astropy import units as u, constants as const --from astropy import _erfa as erfa - from astropy.units import UnitConversionError - from astropy.utils import ShapedLikeNDArray - from astropy.utils.compat.misc import override__dir__ -Index: astropy-4.1/astropy/time/formats.py -=================================================================== ---- astropy-4.1.orig/astropy/time/formats.py -+++ astropy-4.1/astropy/time/formats.py -@@ -9,11 +9,11 @@ from decimal import Decimal - from collections import OrderedDict, defaultdict - - import numpy as np -+import erfa - - from astropy.utils.decorators import lazyproperty - from astropy.utils.exceptions import AstropyDeprecationWarning - from astropy import units as u --from astropy import _erfa as erfa - - from . import utils - from .utils import day_frac, quantity_day_frac, two_sum, two_product -Index: astropy-4.1/astropy/time/tests/test_basic.py -=================================================================== ---- astropy-4.1.orig/astropy/time/tests/test_basic.py -+++ astropy-4.1/astropy/time/tests/test_basic.py -@@ -9,6 +9,7 @@ from decimal import Decimal, localcontex - - import numpy as np - from numpy.testing import assert_allclose -+import erfa - - from astropy.tests.helper import catch_warnings, pytest - from astropy.utils.exceptions import AstropyDeprecationWarning, ErfaWarning -@@ -17,7 +18,6 @@ from astropy.time import (Time, TimeDelt - TimeString, TimezoneInfo, TIME_FORMATS) - from astropy.coordinates import EarthLocation - from astropy import units as u --from astropy import _erfa as erfa - from astropy.table import Column, Table - - try: -Index: astropy-4.1/astropy/time/tests/test_custom_formats.py -=================================================================== ---- astropy-4.1.orig/astropy/time/tests/test_custom_formats.py -+++ astropy-4.1/astropy/time/tests/test_custom_formats.py -@@ -6,8 +6,8 @@ from itertools import count - import pytest - - import numpy as np -+from erfa import DJM0 - --from astropy._erfa import DJM0 - from astropy.time import Time, TimeFormat - from astropy.time.utils import day_frac - -Index: astropy-4.1/astropy/time/tests/test_precision.py -=================================================================== ---- astropy-4.1.orig/astropy/time/tests/test_precision.py -+++ astropy-4.1/astropy/time/tests/test_precision.py -@@ -2,6 +2,7 @@ import decimal - import warnings - import functools - import contextlib -+import erfa - from decimal import Decimal - from datetime import datetime, timedelta - -@@ -13,7 +14,6 @@ from hypothesis.strategies import (compo - - import numpy as np - --import astropy._erfa as erfa - import astropy.units as u - from astropy.tests.helper import assert_quantity_allclose - from astropy.time import STANDARD_TIME_SCALES, Time, TimeDelta -Index: astropy-4.1/astropy/time/tests/test_update_leap_seconds.py -=================================================================== ---- astropy-4.1.orig/astropy/time/tests/test_update_leap_seconds.py -+++ astropy-4.1/astropy/time/tests/test_update_leap_seconds.py -@@ -2,8 +2,8 @@ - from datetime import datetime, timedelta - - import pytest -+import erfa - --from astropy import _erfa as erfa - from astropy.utils import iers - from astropy.utils.exceptions import AstropyWarning - -Index: astropy-4.1/astropy/units/quantity_helper/erfa.py -=================================================================== ---- astropy-4.1.orig/astropy/units/quantity_helper/erfa.py -+++ astropy-4.1/astropy/units/quantity_helper/erfa.py -@@ -2,6 +2,7 @@ - # Licensed under a 3-clause BSD style license - see LICENSE.rst - """Quantity helpers for the ERFA ufuncs.""" - -+from erfa import ufunc as erfa_ufunc - - from astropy.units.core import UnitsError, UnitTypeError, dimensionless_unscaled - from . import UFUNC_HELPERS -@@ -44,8 +45,6 @@ def helper_p2s(f, unit1): - - - def get_erfa_helpers(): -- from astropy._erfa import ufunc as erfa_ufunc -- - ERFA_HELPERS = {} - ERFA_HELPERS[erfa_ufunc.s2c] = helper_s2c - ERFA_HELPERS[erfa_ufunc.s2p] = helper_s2p -@@ -58,5 +57,5 @@ def get_erfa_helpers(): - return ERFA_HELPERS - - --UFUNC_HELPERS.register_module('astropy._erfa.ufunc', erfa_ufuncs, -+UFUNC_HELPERS.register_module('erfa.ufunc', erfa_ufuncs, - get_erfa_helpers) -Index: astropy-4.1/astropy/units/tests/test_quantity_ufuncs.py -=================================================================== ---- astropy-4.1.orig/astropy/units/tests/test_quantity_ufuncs.py -+++ astropy-4.1/astropy/units/tests/test_quantity_ufuncs.py -@@ -8,10 +8,10 @@ from collections import namedtuple - import pytest - import numpy as np - from numpy.testing import assert_allclose -+from erfa import ufunc as erfa_ufunc - - from astropy import units as u - from astropy.units import quantity_helper as qh --from astropy._erfa import ufunc as erfa_ufunc - from astropy.tests.helper import raises, catch_warnings - from astropy.utils.compat.context import nullcontext - -Index: astropy-4.1/astropy/utils/exceptions.py -=================================================================== ---- astropy-4.1.orig/astropy/utils/exceptions.py -+++ astropy-4.1/astropy/utils/exceptions.py -@@ -2,10 +2,24 @@ - """ - This module contains errors/exceptions and warnings of general use for - astropy. Exceptions that are specific to a given subpackage should *not* be --here, but rather in the particular subpackage. Exception is the _erfa module --as we rather have the users import those exceptions from here. -+here, but rather in the particular subpackage. - """ - -+# TODO: deprecate these. This cannot be trivially done with -+# astropy.utils.decorators.deprecate, since that module needs the exceptions -+# here, leading to circular import problems. -+from erfa import ErfaError, ErfaWarning # noqa -+ -+ -+__all__ = [ -+ 'AstropyWarning', -+ 'AstropyUserWarning', -+ 'AstropyDeprecationWarning', -+ 'AstropyPendingDeprecationWarning', -+ 'AstropyBackwardsIncompatibleChangeWarning', -+ 'DuplicateRepresentationWarning', -+ 'NoValue'] -+ - - class AstropyWarning(Warning): - """ -@@ -51,28 +65,6 @@ class DuplicateRepresentationWarning(Ast - """ - - --class ErfaError(ValueError): -- """ -- A class for errors triggered by ERFA functions (status codes < 0) -- -- Note: this class should *not* be referenced by fully-qualified name, because -- it may move to ERFA in a future version. In a future such move it will -- still be imported here as an alias, but the true namespace of the class may -- change. -- """ -- -- --class ErfaWarning(AstropyUserWarning): -- """ -- A class for warnings triggered by ERFA functions (status codes > 0) -- -- Note: this class should *not* be referenced by fully-qualified name, because -- it may move to ERFA in a future version. In a future such move it will -- still be imported here as an alias, but the true namespace of the class may -- change. -- """ -- -- - class _NoValue: - """Special keyword value. - -Index: astropy-4.1/astropy/utils/iers/iers.py -=================================================================== ---- astropy-4.1.orig/astropy/utils/iers/iers.py -+++ astropy-4.1/astropy/utils/iers/iers.py -@@ -15,9 +15,9 @@ from warnings import warn - from urllib.parse import urlparse - - import numpy as np -+import erfa - - from astropy.time import Time, TimeDelta --from astropy import _erfa as erfa - from astropy import config as _config - from astropy import units as u - from astropy.table import QTable, MaskedColumn -Index: astropy-4.1/astropy/utils/iers/tests/test_leap_second.py -=================================================================== ---- astropy-4.1.orig/astropy/utils/iers/tests/test_leap_second.py -+++ astropy-4.1/astropy/utils/iers/tests/test_leap_second.py -@@ -5,8 +5,8 @@ import os - import pytest - import numpy as np - from numpy.testing import assert_array_equal -+import erfa - --from astropy import _erfa as erfa - from astropy.time import Time, TimeDelta - from astropy.utils.iers import iers - from astropy.utils.data import get_pkg_data_filename -Index: astropy-4.1/conftest.py -=================================================================== ---- astropy-4.1.orig/conftest.py -+++ astropy-4.1/conftest.py -@@ -10,6 +10,7 @@ import hypothesis - - try: - from pytest_astropy_header.display import PYTEST_HEADER_MODULES -+ PYTEST_HEADER_MODULES['PyERFA'] = 'erfa' - except ImportError: - PYTEST_HEADER_MODULES = {} - -Index: astropy-4.1/docs/conf.py -=================================================================== ---- astropy-4.1.orig/docs/conf.py -+++ astropy-4.1/docs/conf.py -@@ -68,6 +68,7 @@ check_sphinx_version("1.2.1") - del intersphinx_mapping['astropy'] - - # add any custom intersphinx for astropy -+intersphinx_mapping['pyerfa'] = ('https://pyerfa.readthedocs.io/en/stable/', None) - intersphinx_mapping['pytest'] = ('https://pytest.readthedocs.io/en/stable/', None) - intersphinx_mapping['ipython'] = ('https://ipython.readthedocs.io/en/stable/', None) - intersphinx_mapping['pandas'] = ('https://pandas.pydata.org/pandas-docs/stable/', None) -@@ -91,6 +92,7 @@ templates_path.append('_templates') - rst_epilog += """ - .. |minimum_python_version| replace:: {0.__minimum_python_version__} - .. |minimum_numpy_version| replace:: {0.__minimum_numpy_version__} -+.. |minimum_erfa_version| replace:: {0.__minimum_erfa_version__} - .. |minimum_scipy_version| replace:: {0.__minimum_scipy_version__} - .. |minimum_yaml_version| replace:: {0.__minimum_yaml_version__} - .. |minimum_asdf_version| replace:: {0.__minimum_asdf_version__} -Index: astropy-4.1/docs/coordinates/references.txt -=================================================================== ---- astropy-4.1.orig/docs/coordinates/references.txt -+++ astropy-4.1/docs/coordinates/references.txt -@@ -6,3 +6,5 @@ - .. |Latitude| replace:: `~astropy.coordinates.Latitude` - .. |baseframe| replace:: `~astropy.coordinates.BaseCoordinateFrame` - .. |earthlocation| replace:: `~astropy.coordinates.EarthLocation` -+.. _ERFA: https://github.com/liberfa/erfa -+.. _PyERFA: https://github.com/liberfa/pyerfa -Index: astropy-4.1/docs/coordinates/solarsystem.rst -=================================================================== ---- astropy-4.1.orig/docs/coordinates/solarsystem.rst -+++ astropy-4.1/docs/coordinates/solarsystem.rst -@@ -7,7 +7,7 @@ Solar System Ephemerides - - `astropy.coordinates` can calculate the |SkyCoord| of some of the major solar - system objects. By default, it uses approximate orbital elements calculated --using built-in `ERFA `_ routines, but it can -+using PyERFA_ routines, but it can - also use more precise ones using the JPL ephemerides (which are derived from - dynamical models). The default JPL ephemerides (DE430) provide predictions - valid roughly for the years between 1550 and 2650. The file is 115 MB and will -@@ -137,15 +137,12 @@ Precision of the Built-In Ephemeris - =================================== - - The algorithm for calculating positions and velocities for planets other than --Earth used by ERFA_ is due to J.L. Simon, P. Bretagnon, J. Chapront, -+Earth used by ERFA is due to J.L. Simon, P. Bretagnon, J. Chapront, - M. Chapront-Touze, G. Francou and J. Laskar (Bureau des Longitudes, Paris, - France). From comparisons with JPL ephemeris DE102, they quote the maximum --errors over the interval 1800-2050 below. For more details see --`cextern/erfa/plan94.c --`_. -+errors over the interval 1800-2050 below. For more details see `erfa.plan94` - For the Earth, the rms errors in position and velocity are about 4.6 km and --1.4 mm/s, respectively (see `cextern/erfa/epv00.c --`_). -+1.4 mm/s, respectively `erfa.epv00`. - - .. list-table:: - -Index: astropy-4.1/docs/development/workflow/known_projects.inc -=================================================================== ---- astropy-4.1.orig/docs/development/workflow/known_projects.inc -+++ astropy-4.1/docs/development/workflow/known_projects.inc -@@ -10,6 +10,10 @@ - .. _`numpy github`: https://github.com/numpy/numpy - .. _`numpy mailing list`: http://mail.python.org/mailman/listinfo/numpy-discussion - -+.. pyerfa -+.. _pyerfa: http://pyerfa.readthedocs.org/ -+.. _`pyerfa github`: https://github.com/liberfa/pyerfa/ -+ - .. scipy - .. _scipy: https://www.scipy.org/ - .. _`scipy github`: https://github.com/scipy/scipy -Index: astropy-4.1/docs/install.rst -=================================================================== ---- astropy-4.1.orig/docs/install.rst -+++ astropy-4.1/docs/install.rst -@@ -13,6 +13,8 @@ Requirements - - - `Numpy`_ |minimum_numpy_version| or later - -+- `PyERFA`_ |minimum_erfa_version| or later -+ - ``astropy`` also depends on other packages for optional features: - - - `scipy`_ |minimum_scipy_version| or later: To power a variety of features -@@ -343,9 +345,6 @@ The C libraries currently bundled with ` - ``cextern/cfitsio/changes.txt`` for the bundled version. To use the - system version, set ``ASTROPY_USE_SYSTEM_CFITSIO=1``. - --- `erfa `_ see ``cextern/erfa/README.rst`` for the -- bundled version. To use the system version, set ``ASTROPY_USE_SYSTEM_ERFA=1``. -- - - `expat `_ see ``cextern/expat/README`` for the - bundled version. To use the system version, set ``ASTROPY_USE_SYSTEM_EXPAT=1``. - -Index: astropy-4.1/docs/known_issues.rst -=================================================================== ---- astropy-4.1.orig/docs/known_issues.rst -+++ astropy-4.1/docs/known_issues.rst -@@ -319,42 +319,6 @@ If so, you can go ahead and try running - terminal). - - --Creating a Time Object Fails with ValueError After Upgrading ``astropy`` -------------------------------------------------------------------------- -- --In some cases, when users have upgraded ``astropy`` from an older version to v1.0 --or greater, they have run into the following crash when trying to create an --`~astropy.time.Time` object:: -- -- >>> from astropy.time import Time -- >>> datetime = Time('2012-03-01T13:08:00', scale='utc') # doctest: +SKIP -- Traceback (most recent call last): -- ... -- ValueError: Input values did not match any of the formats where -- the format keyword is optional [u'astropy_time', u'datetime', -- u'jyear_str', u'iso', u'isot', u'yday', u'byear_str'] -- --This problem can occur when there is a version mismatch between the compiled --ERFA library (included as part of ``astropy`` in most distributions), and --the version of the ``astropy`` Python source. -- --This can be from a number of causes. The most likely is that when installing the --new ``astropy`` version, your previous ``astropy`` version was not fully uninstalled --first, resulting in a mishmash of versions. Your best bet is to fully remove --``astropy`` from its installation path and reinstall from scratch using your --preferred installation method. Removing the old version may be achieved by --removing the entire ``astropy/`` directory from within the --``site-packages`` directory it is installed in. However, if in doubt, ask --how best to uninstall packages from your preferred Python distribution. -- --Another possible cause of this error, in particular for people developing on --Astropy and installing from a source checkout, is that your Astropy build --directory is unclean. To fix this, run ``git clean -dfx``. This removes --*all* build artifacts from the repository that aren't normally tracked by git. --Make sure before running this that there are no untracked files in the --repository you intend to save. Then rebuild/reinstall from the clean repo. -- -- - Failing Logging Tests When Running the Tests in IPython - ------------------------------------------------------- - -Index: astropy-4.1/docs/time/index.rst -=================================================================== ---- astropy-4.1.orig/docs/time/index.rst -+++ astropy-4.1/docs/time/index.rst -@@ -19,7 +19,7 @@ dates. Specific emphasis is placed on su - UT1, TDB) and time representations (e.g., JD, MJD, ISO 8601) that are used in - astronomy and required to calculate, for example, sidereal times and barycentric - corrections. The `astropy.time` package is based on fast and memory efficient --wrappers around the `ERFA`_ time and calendar routines. -+PyERFA_ wrappers around the ERFA_ time and calendar routines. - - All time manipulations and arithmetic operations are done internally using two - 64-bit floats to represent time. Floating point algorithms from [#]_ are used so -@@ -362,7 +362,7 @@ local Local Time Scale (LOCAL) - ====== ================================= - - .. [#] Wikipedia `time standard `_ article --.. [#] SOFA Time Scale and Calendar Tools -+.. [#] SOFA_ Time Scale and Calendar Tools - `(PDF) `_ - .. [#] ``_ - -@@ -506,7 +506,7 @@ requiring no better than microsecond pre - years) can safely ignore the internal representation details and skip this - section. - --This representation is driven by the underlying ERFA C-library implementation. -+This representation is driven by the underlying ERFA_ C-library implementation. - The ERFA routines take care throughout to maintain overall precision of the - double pair. Users are free to choose the way in which total JD is - provided, though internally one part contains integer days and the -@@ -606,7 +606,7 @@ precision - The ``precision`` setting affects string formats when outputting a value that - includes seconds. It must be an integer between 0 and 9. There is no effect - when inputting time values from strings. The default precision is 3. Note --that the limit of 9 digits is driven by the way that ERFA handles fractional -+that the limit of 9 digits is driven by the way that ERFA_ handles fractional - seconds. In practice this should should not be an issue. :: - - >>> t = Time('B1950.0', precision=3) -@@ -670,7 +670,7 @@ This optional parameter specifies the ob - either a tuple with geocentric coordinates (X, Y, Z), or a tuple with geodetic - coordinates (longitude, latitude, height; with height defaulting to zero). - They are used for time scales that are sensitive to observer location --(currently, only TDB, which relies on the ERFA routine ``eraDtdb`` to -+(currently, only TDB, which relies on the PyERFA_ routine `erfa.dtdb` to - determine the time offset between TDB and TT), as well as for sidereal time if - no explicit longitude is given. - -@@ -964,7 +964,7 @@ Transformation Offsets - - Time scale transformations that cross one of the orange circles in the image - above require an additional offset time value that is model or --observation dependent. See `SOFA Time Scale and Calendar Tools -+observation dependent. See SOFA_ `Time Scale and Calendar Tools - `_ for further details. - - The two attributes :attr:`~astropy.time.Time.delta_ut1_utc` and -@@ -1010,7 +1010,7 @@ scale along with the auto-download featu - In the case of the TDB to TT offset, most users need only provide the ``lon`` - and ``lat`` values when creating the |Time| object. If the - :attr:`~astropy.time.Time.delta_tdb_tt` attribute is not explicitly set, then --the ERFA C-library routine ``eraDtdb`` will be used to compute the TDB to TT -+the PyERFA_ routine `erfa.dtdb` will be used to compute the TDB to TT - offset. Note that if ``lon`` and ``lat`` are not explicitly initialized, - values of 0.0 degrees for both will be used. - -@@ -1019,7 +1019,7 @@ Example - - .. EXAMPLE START: Transformation Offsets in Time Objects - --The following code replicates an example in the `SOFA Time Scale and Calendar -+The following code replicates an example in the SOFA_ `Time Scale and Calendar - Tools `_ document. It does the transform - from UTC to all supported time scales (TAI, TCB, TCG, TDB, TT, UT1, UTC). This - requires an observer location (here, latitude and longitude). -@@ -1082,7 +1082,7 @@ Apparent or mean sidereal time can be ca - :meth:`~astropy.time.Time.sidereal_time`. The method returns a |Longitude| - with units of hour angle, which by default is for the longitude corresponding to - the location with which the |Time| object is initialized. Like the scale --transformations, ERFA C-library routines are used under the hood, which support -+transformations, ERFA_ C-library routines are used under the hood, which support - calculations following different IAU resolutions. - - Example -@@ -1311,7 +1311,7 @@ the TDB timescale:: - .. EXAMPLE START: Calculating Light Travel Time Using JPL Ephemerides - - By default, the light travel time is calculated using the position and velocity --of Earth and the Sun from built-in `ERFA `_ -+of Earth and the Sun from ERFA_ - routines, but you can also get more precise calculations using the JPL - ephemerides (which are derived from dynamical models). An example using the JPL - ephemerides is: -@@ -1588,11 +1588,10 @@ Reference/API - Acknowledgments and Licenses - ============================ - --This package makes use of the `ERFA Software --`_ ANSI C library. The copyright of the ERFA -+This package makes use of the PyERFA_ wrappers of the ERFA_ ANSI C library. The copyright of the ERFA_ - software belongs to the NumFOCUS Foundation. The library is made available - under the terms of the "BSD-three clauses" license. - --The ERFA library is derived, with permission, from the International --Astronomical Union's "Standards of Fundamental Astronomy" library, -+The ERFA_ library is derived, with permission, from the International -+Astronomical Union's "Standards of Fundamental Astronomy" (SOFA_) library, - available from http://www.iausofa.org. -Index: astropy-4.1/docs/time/references.txt -=================================================================== ---- astropy-4.1.orig/docs/time/references.txt -+++ astropy-4.1/docs/time/references.txt -@@ -2,3 +2,4 @@ - .. |TimeDelta| replace:: :class:`~astropy.time.TimeDelta` - .. _SOFA: http://www.iausofa.org/index.html - .. _ERFA: https://github.com/liberfa/erfa -+.. _PyERFA: https://github.com/liberfa/pyerfa -Index: astropy-4.1/setup.cfg -=================================================================== ---- astropy-4.1.orig/setup.cfg -+++ astropy-4.1/setup.cfg -@@ -21,11 +21,15 @@ classifiers = - - [options] - packages = find: --requires = numpy -+requires = -+ numpy -+ pyerfa - zip_safe = False - tests_require = pytest-astropy - setup_requires = setuptools_scm --install_requires = numpy>=1.16 -+install_requires = -+ numpy>=1.16 -+ pyerfa - python_requires = >=3.6 - - [options.packages.find] -Index: astropy-4.1/astropy/_erfa/core.py -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/core.py -+++ /dev/null -@@ -1,20342 +0,0 @@ --# Licensed under a 3-clause BSD style license - see LICENSE.rst -- --# "core.py" is auto-generated by erfa_generator.py from the template --# "core.py.templ". Do *not* edit "core.py" directly, instead edit --# "core.py.templ" and run erfa_generator.py from the source directory to --# update it. -- --""" --Python wrappers for the ufunc wrappers of the ERFA library. -- --..warning:: -- This is currently *not* part of the public Astropy API, and may change in -- the future. -- --The key idea is that any function can be called with inputs that are arrays, --and the ufuncs will automatically vectorize and call the ERFA functions for --each item using broadcasting rules for numpy. So the return values are always --numpy arrays of some sort. -- --For ERFA functions that take/return vectors or matrices, the vector/matrix --dimension(s) are always the *last* dimension(s). For example, if you --want to give ten matrices (i.e., the ERFA input type is double[3][3]), --you would pass in a (10, 3, 3) numpy array. If the output of the ERFA --function is scalar, you'll get back a length-10 1D array. --(Note that the ufuncs take this into account using structured dtypes.) -- --Note that the ufunc part of these functions are implemented in a separate --module (compiled as ``ufunc``), derived from the ``ufunc.c`` file. --""" -- --import warnings -- --import numpy -- --# we import these exceptions from astropy locations instead of defining them --# in this file because otherwise there are circular dependencies --from astropy.utils.exceptions import ErfaError, ErfaWarning --from astropy.utils.misc import check_broadcast -- --from . import ufunc -- --__all__ = ['ErfaError', 'ErfaWarning', -- 'cal2jd', 'epb', 'epb2jd', 'epj', 'epj2jd', 'jd2cal', 'jdcalf', 'ab', 'apcg', 'apcg13', 'apci', 'apci13', 'apco', 'apco13', 'apcs', 'apcs13', 'aper', 'aper13', 'apio', 'apio13', 'atci13', 'atciq', 'atciqn', 'atciqz', 'atco13', 'atic13', 'aticq', 'aticqn', 'atio13', 'atioq', 'atoc13', 'atoi13', 'atoiq', 'ld', 'ldn', 'ldsun', 'pmpx', 'pmsafe', 'pvtob', 'refco', 'epv00', 'plan94', 'fad03', 'fae03', 'faf03', 'faju03', 'fal03', 'falp03', 'fama03', 'fame03', 'fane03', 'faom03', 'fapa03', 'fasa03', 'faur03', 'fave03', 'bi00', 'bp00', 'bp06', 'bpn2xy', 'c2i00a', 'c2i00b', 'c2i06a', 'c2ibpn', 'c2ixy', 'c2ixys', 'c2t00a', 'c2t00b', 'c2t06a', 'c2tcio', 'c2teqx', 'c2tpe', 'c2txy', 'eo06a', 'eors', 'fw2m', 'fw2xy', 'ltp', 'ltpb', 'ltpecl', 'ltpequ', 'num00a', 'num00b', 'num06a', 'numat', 'nut00a', 'nut00b', 'nut06a', 'nut80', 'nutm80', 'obl06', 'obl80', 'p06e', 'pb06', 'pfw06', 'pmat00', 'pmat06', 'pmat76', 'pn00', 'pn00a', 'pn00b', 'pn06', 'pn06a', 'pnm00a', 'pnm00b', 'pnm06a', 'pnm80', 'pom00', 'pr00', 'prec76', 's00', 's00a', 's00b', 's06', 's06a', 'sp00', 'xy06', 'xys00a', 'xys00b', 'xys06a', 'ee00', 'ee00a', 'ee00b', 'ee06a', 'eect00', 'eqeq94', 'era00', 'gmst00', 'gmst06', 'gmst82', 'gst00a', 'gst00b', 'gst06', 'gst06a', 'gst94', 'pvstar', 'starpv', 'fk425', 'fk45z', 'fk524', 'fk52h', 'fk54z', 'fk5hip', 'fk5hz', 'h2fk5', 'hfk5z', 'starpm', 'eceq06', 'ecm06', 'eqec06', 'lteceq', 'ltecm', 'lteqec', 'g2icrs', 'icrs2g', 'eform', 'gc2gd', 'gc2gde', 'gd2gc', 'gd2gce', 'd2dtf', 'dat', 'dtdb', 'dtf2d', 'taitt', 'taiut1', 'taiutc', 'tcbtdb', 'tcgtt', 'tdbtcb', 'tdbtt', 'tttai', 'tttcg', 'tttdb', 'ttut1', 'ut1tai', 'ut1tt', 'ut1utc', 'utctai', 'utcut1', 'ae2hd', 'hd2ae', 'hd2pa', 'tpors', 'tporv', 'tpsts', 'tpstv', 'tpxes', 'tpxev', 'a2af', 'a2tf', 'af2a', 'anp', 'anpm', 'd2tf', 'tf2a', 'tf2d', 'rx', 'ry', 'rz', 'cp', 'cpv', 'cr', 'p2pv', 'pv2p', 'ir', 'zp', 'zpv', 'zr', 'rxr', 'tr', 'rxp', 'rxpv', 'trxp', 'trxpv', 'rm2v', 'rv2m', 'pap', 'pas', 'sepp', 'seps', 'c2s', 'p2s', 'pv2s', 's2c', 's2p', 's2pv', 'pdp', 'pm', 'pmp', 'pn', 'ppp', 'ppsp', 'pvdpv', 'pvm', 'pvmpv', 'pvppv', 'pvu', 'pvup', 'pvxpv', 'pxp', 's2xpv', 'sxp', 'sxpv', 'pav2pv', 'pv2pav', -- 'DPI', 'D2PI', 'DR2D', 'DD2R', 'DR2AS', 'DAS2R', 'DS2R', 'TURNAS', 'DMAS2R', 'DTY', 'DAYSEC', 'DJY', 'DJC', 'DJM', 'DJ00', 'DJM0', 'DJM00', 'DJM77', 'TTMTAI', 'DAU', 'CMPS', 'AULT', 'DC', 'ELG', 'ELB', 'TDB0', 'SRS', 'WGS84', 'GRS80', 'WGS72', -- # TODO: delete the functions below when they can get auto-generated -- 'version', 'version_major', 'version_minor', 'version_micro', 'sofa_version'] -- -- --# <---------------------------------Error-handling----------------------------> -- -- --STATUS_CODES = {} # populated below before each function that returns an int -- --# This is a hard-coded list of status codes that need to be remapped, --# such as to turn errors into warnings. --STATUS_CODES_REMAP = { -- 'cal2jd': {-3: 3} --} -- -- --def check_errwarn(statcodes, func_name): -- if not numpy.any(statcodes): -- return -- # Remap any errors into warnings in the STATUS_CODES_REMAP dict. -- if func_name in STATUS_CODES_REMAP: -- for before, after in STATUS_CODES_REMAP[func_name].items(): -- statcodes[statcodes == before] = after -- STATUS_CODES[func_name][after] = STATUS_CODES[func_name][before] -- -- if numpy.any(statcodes<0): -- # errors present - only report the errors. -- if statcodes.shape: -- statcodes = statcodes[statcodes<0] -- -- errcodes = numpy.unique(statcodes) -- -- errcounts = dict([(e, numpy.sum(statcodes==e)) for e in errcodes]) -- -- elsemsg = STATUS_CODES[func_name].get('else', None) -- if elsemsg is None: -- errmsgs = dict([(e, STATUS_CODES[func_name].get(e, 'Return code ' + str(e))) for e in errcodes]) -- else: -- errmsgs = dict([(e, STATUS_CODES[func_name].get(e, elsemsg)) for e in errcodes]) -- -- emsg = ', '.join(['{0} of "{1}"'.format(errcounts[e], errmsgs[e]) for e in errcodes]) -- raise ErfaError('ERFA function "' + func_name + '" yielded ' + emsg) -- -- elif numpy.any(statcodes>0): -- #only warnings present -- if statcodes.shape: -- statcodes = statcodes[statcodes>0] -- -- warncodes = numpy.unique(statcodes) -- -- warncounts = dict([(w, numpy.sum(statcodes==w)) for w in warncodes]) -- -- elsemsg = STATUS_CODES[func_name].get('else', None) -- if elsemsg is None: -- warnmsgs = dict([(w, STATUS_CODES[func_name].get(w, 'Return code ' + str(w))) for w in warncodes]) -- else: -- warnmsgs = dict([(w, STATUS_CODES[func_name].get(w, elsemsg)) for w in warncodes]) -- -- wmsg = ', '.join(['{0} of "{1}"'.format(warncounts[w], warnmsgs[w]) for w in warncodes]) -- warnings.warn('ERFA function "' + func_name + '" yielded ' + wmsg, ErfaWarning) -- -- --# <------------------------structured dtype conversion------------------------> -- --dt_bytes1 = numpy.dtype('S1') --dt_bytes12 = numpy.dtype('S12') -- --# <--------------------------Actual ERFA-wrapping code------------------------> -- -- --DPI = (3.141592653589793238462643) --"""Pi""" --D2PI = (6.283185307179586476925287) --"""2Pi""" --DR2D = (57.29577951308232087679815) --"""Radians to degrees""" --DD2R = (1.745329251994329576923691e-2) --"""Degrees to radians""" --DR2AS = (206264.8062470963551564734) --"""Radians to arcseconds""" --DAS2R = (4.848136811095359935899141e-6) --"""Arcseconds to radians""" --DS2R = (7.272205216643039903848712e-5) --"""Seconds of time to radians""" --TURNAS = (1296000.0) --"""Arcseconds in a full circle""" --DMAS2R = (DAS2R / 1e3) --"""Milliarcseconds to radians""" --DTY = (365.242198781) --"""Length of tropical year B1900 (days)""" --DAYSEC = (86400.0) --"""Seconds per day.""" --DJY = (365.25) --"""Days per Julian year""" --DJC = (36525.0) --"""Days per Julian century""" --DJM = (365250.0) --"""Days per Julian millennium""" --DJ00 = (2451545.0) --"""Reference epoch (J2000.0), Julian Date""" --DJM0 = (2400000.5) --"""Julian Date of Modified Julian Date zero""" --DJM00 = (51544.5) --"""Reference epoch (J2000.0), Modified Julian Date""" --DJM77 = (43144.0) --"""1977 Jan 1.0 as MJD""" --TTMTAI = (32.184) --"""TT minus TAI (s)""" --DAU = (149597870.7e3) --"""Astronomical unit (m, IAU 2012)""" --CMPS = 299792458.0 --"""Speed of light (m/s)""" --AULT = (DAU/CMPS) --"""Light time for 1 au (s)""" --DC = (DAYSEC/AULT) --"""Speed of light (au per day)""" --ELG = (6.969290134e-10) --"""L_G = 1 - d(TT)/d(TCG)""" --ELB = (1.550519768e-8) --"""L_B = 1 - d(TDB)/d(TCB), and TDB (s) at TAI 1977/1/1.0""" --TDB0 = (-6.55e-5) --"""L_B = 1 - d(TDB)/d(TCB), and TDB (s) at TAI 1977/1/1.0""" --SRS = 1.97412574336e-8 --"""Schwarzschild radius of the Sun (au) = 2 * 1.32712440041e20 / (2.99792458e8)^2 / 1.49597870700e11""" --WGS84 = 1 --"""Reference ellipsoids""" --GRS80 = 2 --"""Reference ellipsoids""" --WGS72 = 3 --"""Reference ellipsoids""" -- -- --def cal2jd(iy, im, id): -- """ -- Wrapper for ERFA function ``eraCal2jd``. -- -- Parameters -- ---------- -- iy : int array -- im : int array -- id : int array -- -- Returns -- ------- -- djm0 : double array -- djm : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C a l 2 j d -- - - - - - - - - - - -- -- Gregorian Calendar to Julian Date. -- -- Given: -- iy,im,id int year, month, day in Gregorian calendar (Note 1) -- -- Returned: -- djm0 double MJD zero-point: always 2400000.5 -- djm double Modified Julian Date for 0 hrs -- -- Returned (function value): -- int status: -- 0 = OK -- -1 = bad year (Note 3: JD not computed) -- -2 = bad month (JD not computed) -- -3 = bad day (JD computed) -- -- Notes: -- -- 1) The algorithm used is valid from -4800 March 1, but this -- implementation rejects dates before -4799 January 1. -- -- 2) The Julian Date is returned in two pieces, in the usual ERFA -- manner, which is designed to preserve time resolution. The -- Julian Date is available as a single number by adding djm0 and -- djm. -- -- 3) In early eras the conversion is from the "Proleptic Gregorian -- Calendar"; no account is taken of the date(s) of adoption of -- the Gregorian Calendar, nor is the AD/BC numbering convention -- observed. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 12.92 (p604). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- djm0, djm, c_retval = ufunc.cal2jd(iy, im, id) -- check_errwarn(c_retval, 'cal2jd') -- return djm0, djm -- -- --STATUS_CODES['cal2jd'] = {0: 'OK', -1: 'bad year (Note 3: JD not computed)', -2: 'bad month (JD not computed)', -3: 'bad day (JD computed)'} -- -- --def epb(dj1, dj2): -- """ -- Wrapper for ERFA function ``eraEpb``. -- -- Parameters -- ---------- -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a E p b -- - - - - - - - -- -- Julian Date to Besselian Epoch. -- -- Given: -- dj1,dj2 double Julian Date (see note) -- -- Returned (function value): -- double Besselian Epoch. -- -- Note: -- -- The Julian Date is supplied in two pieces, in the usual ERFA -- manner, which is designed to preserve time resolution. The -- Julian Date is available as a single number by adding dj1 and -- dj2. The maximum resolution is achieved if dj1 is 2451545.0 -- (J2000.0). -- -- Reference: -- -- Lieske, J.H., 1979. Astron.Astrophys., 73, 282. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.epb(dj1, dj2) -- return c_retval -- -- --def epb2jd(epb): -- """ -- Wrapper for ERFA function ``eraEpb2jd``. -- -- Parameters -- ---------- -- epb : double array -- -- Returns -- ------- -- djm0 : double array -- djm : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E p b 2 j d -- - - - - - - - - - - -- -- Besselian Epoch to Julian Date. -- -- Given: -- epb double Besselian Epoch (e.g. 1957.3) -- -- Returned: -- djm0 double MJD zero-point: always 2400000.5 -- djm double Modified Julian Date -- -- Note: -- -- The Julian Date is returned in two pieces, in the usual ERFA -- manner, which is designed to preserve time resolution. The -- Julian Date is available as a single number by adding djm0 and -- djm. -- -- Reference: -- -- Lieske, J.H., 1979, Astron.Astrophys. 73, 282. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- djm0, djm = ufunc.epb2jd(epb) -- return djm0, djm -- -- --def epj(dj1, dj2): -- """ -- Wrapper for ERFA function ``eraEpj``. -- -- Parameters -- ---------- -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a E p j -- - - - - - - - -- -- Julian Date to Julian Epoch. -- -- Given: -- dj1,dj2 double Julian Date (see note) -- -- Returned (function value): -- double Julian Epoch -- -- Note: -- -- The Julian Date is supplied in two pieces, in the usual ERFA -- manner, which is designed to preserve time resolution. The -- Julian Date is available as a single number by adding dj1 and -- dj2. The maximum resolution is achieved if dj1 is 2451545.0 -- (J2000.0). -- -- Reference: -- -- Lieske, J.H., 1979, Astron.Astrophys. 73, 282. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.epj(dj1, dj2) -- return c_retval -- -- --def epj2jd(epj): -- """ -- Wrapper for ERFA function ``eraEpj2jd``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- djm0 : double array -- djm : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E p j 2 j d -- - - - - - - - - - - -- -- Julian Epoch to Julian Date. -- -- Given: -- epj double Julian Epoch (e.g. 1996.8) -- -- Returned: -- djm0 double MJD zero-point: always 2400000.5 -- djm double Modified Julian Date -- -- Note: -- -- The Julian Date is returned in two pieces, in the usual ERFA -- manner, which is designed to preserve time resolution. The -- Julian Date is available as a single number by adding djm0 and -- djm. -- -- Reference: -- -- Lieske, J.H., 1979, Astron.Astrophys. 73, 282. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- djm0, djm = ufunc.epj2jd(epj) -- return djm0, djm -- -- --def jd2cal(dj1, dj2): -- """ -- Wrapper for ERFA function ``eraJd2cal``. -- -- Parameters -- ---------- -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- iy : int array -- im : int array -- id : int array -- fd : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a J d 2 c a l -- - - - - - - - - - - -- -- Julian Date to Gregorian year, month, day, and fraction of a day. -- -- Given: -- dj1,dj2 double Julian Date (Notes 1, 2) -- -- Returned (arguments): -- iy int year -- im int month -- id int day -- fd double fraction of day -- -- Returned (function value): -- int status: -- 0 = OK -- -1 = unacceptable date (Note 1) -- -- Notes: -- -- 1) The earliest valid date is -68569.5 (-4900 March 1). The -- largest value accepted is 1e9. -- -- 2) The Julian Date is apportioned in any convenient way between -- the arguments dj1 and dj2. For example, JD=2450123.7 could -- be expressed in any of these ways, among others: -- -- dj1 dj2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- 3) In early eras the conversion is from the "proleptic Gregorian -- calendar"; no account is taken of the date(s) of adoption of -- the Gregorian calendar, nor is the AD/BC numbering convention -- observed. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 12.92 (p604). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- iy, im, id, fd, c_retval = ufunc.jd2cal(dj1, dj2) -- check_errwarn(c_retval, 'jd2cal') -- return iy, im, id, fd -- -- --STATUS_CODES['jd2cal'] = {0: 'OK', -1: 'unacceptable date (Note 1)'} -- -- --def jdcalf(ndp, dj1, dj2): -- """ -- Wrapper for ERFA function ``eraJdcalf``. -- -- Parameters -- ---------- -- ndp : int array -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- iymdf : int array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a J d c a l f -- - - - - - - - - - - -- -- Julian Date to Gregorian Calendar, expressed in a form convenient -- for formatting messages: rounded to a specified precision. -- -- Given: -- ndp int number of decimal places of days in fraction -- dj1,dj2 double dj1+dj2 = Julian Date (Note 1) -- -- Returned: -- iymdf int[4] year, month, day, fraction in Gregorian -- calendar -- -- Returned (function value): -- int status: -- -1 = date out of range -- 0 = OK -- +1 = NDP not 0-9 (interpreted as 0) -- -- Notes: -- -- 1) The Julian Date is apportioned in any convenient way between -- the arguments dj1 and dj2. For example, JD=2450123.7 could -- be expressed in any of these ways, among others: -- -- dj1 dj2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- 2) In early eras the conversion is from the "Proleptic Gregorian -- Calendar"; no account is taken of the date(s) of adoption of -- the Gregorian Calendar, nor is the AD/BC numbering convention -- observed. -- -- 3) Refer to the function eraJd2cal. -- -- 4) NDP should be 4 or less if internal overflows are to be -- avoided on machines which use 16-bit integers. -- -- Called: -- eraJd2cal JD to Gregorian calendar -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 12.92 (p604). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- iymdf, c_retval = ufunc.jdcalf(ndp, dj1, dj2) -- check_errwarn(c_retval, 'jdcalf') -- return iymdf -- -- --STATUS_CODES['jdcalf'] = {-1: 'date out of range', 0: 'OK', 1: 'NDP not 0-9 (interpreted as 0)'} -- -- --def ab(pnat, v, s, bm1): -- """ -- Wrapper for ERFA function ``eraAb``. -- -- Parameters -- ---------- -- pnat : double array -- v : double array -- s : double array -- bm1 : double array -- -- Returns -- ------- -- ppr : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a A b -- - - - - - - -- -- Apply aberration to transform natural direction into proper -- direction. -- -- Given: -- pnat double[3] natural direction to the source (unit vector) -- v double[3] observer barycentric velocity in units of c -- s double distance between the Sun and the observer (au) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- -- Returned: -- ppr double[3] proper direction to source (unit vector) -- -- Notes: -- -- 1) The algorithm is based on Expr. (7.40) in the Explanatory -- Supplement (Urban & Seidelmann 2013), but with the following -- changes: -- -- o Rigorous rather than approximate normalization is applied. -- -- o The gravitational potential term from Expr. (7) in -- Klioner (2003) is added, taking into account only the Sun's -- contribution. This has a maximum effect of about -- 0.4 microarcsecond. -- -- 2) In almost all cases, the maximum accuracy will be limited by the -- supplied velocity. For example, if the ERFA eraEpv00 function is -- used, errors of up to 5 microarcseconds could occur. -- -- References: -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013). -- -- Klioner, Sergei A., "A practical relativistic model for micro- -- arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). -- -- Called: -- eraPdp scalar product of two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ppr = ufunc.ab(pnat, v, s, bm1) -- return ppr -- -- --def apcg(date1, date2, ebpv, ehp): -- """ -- Wrapper for ERFA function ``eraApcg``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- ebpv : double array -- ehp : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A p c g -- - - - - - - - - -- -- For a geocentric observer, prepare star-independent astrometry -- parameters for transformations between ICRS and GCRS coordinates. -- The Earth ephemeris is supplied by the caller. -- -- The parameters produced by this function are required in the -- parallax, light deflection and aberration parts of the astrometric -- transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- ebpv double[2][3] Earth barycentric pos/vel (au, au/day) -- ehp double[3] Earth heliocentric position (au) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 4) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraApcs astrometry parameters, ICRS-GCRS, space observer -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apcg(date1, date2, ebpv, ehp) -- return astrom -- -- --def apcg13(date1, date2): -- """ -- Wrapper for ERFA function ``eraApcg13``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A p c g 1 3 -- - - - - - - - - - - -- -- For a geocentric observer, prepare star-independent astrometry -- parameters for transformations between ICRS and GCRS coordinates. -- The caller supplies the date, and ERFA models are used to predict -- the Earth ephemeris. -- -- The parameters produced by this function are required in the -- parallax, light deflection and aberration parts of the astrometric -- transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) In cases where the caller wishes to supply his own Earth -- ephemeris, the function eraApcg can be used instead of the present -- function. -- -- 4) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 5) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraEpv00 Earth position and velocity -- eraApcg astrometry parameters, ICRS-GCRS, geocenter -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apcg13(date1, date2) -- return astrom -- -- --def apci(date1, date2, ebpv, ehp, x, y, s): -- """ -- Wrapper for ERFA function ``eraApci``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- ebpv : double array -- ehp : double array -- x : double array -- y : double array -- s : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A p c i -- - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between ICRS and geocentric CIRS -- coordinates. The Earth ephemeris and CIP/CIO are supplied by the -- caller. -- -- The parameters produced by this function are required in the -- parallax, light deflection, aberration, and bias-precession-nutation -- parts of the astrometric transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- ebpv double[2][3] Earth barycentric position/velocity (au, au/day) -- ehp double[3] Earth heliocentric position (au) -- x,y double CIP X,Y (components of unit vector) -- s double the CIO locator s (radians) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) In cases where the caller does not wish to provide the Earth -- ephemeris and CIP/CIO, the function eraApci13 can be used instead -- of the present function. This computes the required quantities -- using other ERFA functions. -- -- 4) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 5) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraApcg astrometry parameters, ICRS-GCRS, geocenter -- eraC2ixys celestial-to-intermediate matrix, given X,Y and s -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apci(date1, date2, ebpv, ehp, x, y, s) -- return astrom -- -- --def apci13(date1, date2): -- """ -- Wrapper for ERFA function ``eraApci13``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- eo : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A p c i 1 3 -- - - - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between ICRS and geocentric CIRS -- coordinates. The caller supplies the date, and ERFA models are used -- to predict the Earth ephemeris and CIP/CIO. -- -- The parameters produced by this function are required in the -- parallax, light deflection, aberration, and bias-precession-nutation -- parts of the astrometric transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- eo double* equation of the origins (ERA-GST) -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) In cases where the caller wishes to supply his own Earth -- ephemeris and CIP/CIO, the function eraApci can be used instead -- of the present function. -- -- 4) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 5) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraEpv00 Earth position and velocity -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- eraApci astrometry parameters, ICRS-CIRS -- eraEors equation of the origins, given NPB matrix and s -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom, eo = ufunc.apci13(date1, date2) -- return astrom, eo -- -- --def apco(date1, date2, ebpv, ehp, x, y, s, theta, elong, phi, hm, xp, yp, sp, refa, refb): -- """ -- Wrapper for ERFA function ``eraApco``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- ebpv : double array -- ehp : double array -- x : double array -- y : double array -- s : double array -- theta : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- sp : double array -- refa : double array -- refb : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A p c o -- - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between ICRS and observed -- coordinates. The caller supplies the Earth ephemeris, the Earth -- rotation information and the refraction constants as well as the -- site coordinates. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- ebpv double[2][3] Earth barycentric PV (au, au/day, Note 2) -- ehp double[3] Earth heliocentric P (au, Note 2) -- x,y double CIP X,Y (components of unit vector) -- s double the CIO locator s (radians) -- theta double Earth rotation angle (radians) -- elong double longitude (radians, east +ve, Note 3) -- phi double latitude (geodetic, radians, Note 3) -- hm double height above ellipsoid (m, geodetic, Note 3) -- xp,yp double polar motion coordinates (radians, Note 4) -- sp double the TIO locator s' (radians, Note 4) -- refa double refraction constant A (radians, Note 5) -- refb double refraction constant B (radians, Note 5) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) The vectors eb, eh, and all the astrom vectors, are with respect -- to BCRS axes. -- -- 3) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN -- CONVENTION: the longitude required by the present function is -- right-handed, i.e. east-positive, in accordance with geographical -- convention. -- -- 4) xp and yp are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions), measured along the -- meridians 0 and 90 deg west respectively. sp is the TIO locator -- s', in radians, which positions the Terrestrial Intermediate -- Origin on the equator. For many applications, xp, yp and -- (especially) sp can be set to zero. -- -- Internally, the polar motion is stored in a form rotated onto the -- local meridian. -- -- 5) The refraction constants refa and refb are for use in a -- dZ = A*tan(Z)+B*tan^3(Z) model, where Z is the observed -- (i.e. refracted) zenith distance and dZ is the amount of -- refraction. -- -- 6) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- 7) In cases where the caller does not wish to provide the Earth -- Ephemeris, the Earth rotation information and refraction -- constants, the function eraApco13 can be used instead of the -- present function. This starts from UTC and weather readings etc. -- and computes suitable values using other ERFA functions. -- -- 8) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 9) The context structure astrom produced by this function is used by -- eraAtioq, eraAtoiq, eraAtciq* and eraAticq*. -- -- Called: -- eraAper astrometry parameters: update ERA -- eraC2ixys celestial-to-intermediate matrix, given X,Y and s -- eraPvtob position/velocity of terrestrial station -- eraTrxpv product of transpose of r-matrix and pv-vector -- eraApcs astrometry parameters, ICRS-GCRS, space observer -- eraCr copy r-matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apco(date1, date2, ebpv, ehp, x, y, s, theta, elong, phi, hm, xp, yp, sp, refa, refb) -- return astrom -- -- --def apco13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraApco13``. -- -- Parameters -- ---------- -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- eo : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A p c o 1 3 -- - - - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between ICRS and observed -- coordinates. The caller supplies UTC, site coordinates, ambient air -- conditions and observing wavelength, and ERFA models are used to -- obtain the Earth ephemeris, CIP/CIO and refraction constants. -- -- The parameters produced by this function are required in the -- parallax, light deflection, aberration, and bias-precession-nutation -- parts of the ICRS/CIRS transformations. -- -- Given: -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 1,2) -- dut1 double UT1-UTC (seconds, Note 3) -- elong double longitude (radians, east +ve, Note 4) -- phi double latitude (geodetic, radians, Note 4) -- hm double height above ellipsoid (m, geodetic, Notes 4,6) -- xp,yp double polar motion coordinates (radians, Note 5) -- phpa double pressure at the observer (hPa = mB, Note 6) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 7) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- eo double* equation of the origins (ERA-GST) -- -- Returned (function value): -- int status: +1 = dubious year (Note 2) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 2) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the -- future to be trusted. See eraDat for further details. -- -- 3) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 4) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 5) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many -- applications, xp and yp can be set to zero. -- -- Internally, the polar motion is stored in a form rotated onto -- the local meridian. -- -- 6) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), is -- available, an adequate estimate of hm can be obtained from the -- expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to -- the pressure and that an accurate phpa value is important for -- precise work. -- -- 7) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 8) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- 9) In cases where the caller wishes to supply his own Earth -- ephemeris, Earth rotation information and refraction constants, -- the function eraApco can be used instead of the present function. -- -- 10) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 11) The context structure astrom produced by this function is used -- by eraAtioq, eraAtoiq, eraAtciq* and eraAticq*. -- -- Called: -- eraUtctai UTC to TAI -- eraTaitt TAI to TT -- eraUtcut1 UTC to UT1 -- eraEpv00 Earth position and velocity -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- eraEra00 Earth rotation angle, IAU 2000 -- eraSp00 the TIO locator s', IERS 2000 -- eraRefco refraction constants for given ambient conditions -- eraApco astrometry parameters, ICRS-observed -- eraEors equation of the origins, given NPB matrix and s -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom, eo, c_retval = ufunc.apco13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'apco13') -- return astrom, eo -- -- --STATUS_CODES['apco13'] = {1: 'dubious year (Note 2)', 0: 'OK', -1: 'unacceptable date'} -- -- --def apcs(date1, date2, pv, ebpv, ehp): -- """ -- Wrapper for ERFA function ``eraApcs``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- pv : double array -- ebpv : double array -- ehp : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A p c s -- - - - - - - - - -- -- For an observer whose geocentric position and velocity are known, -- prepare star-independent astrometry parameters for transformations -- between ICRS and GCRS. The Earth ephemeris is supplied by the -- caller. -- -- The parameters produced by this function are required in the space -- motion, parallax, light deflection and aberration parts of the -- astrometric transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- pv double[2][3] observer's geocentric pos/vel (m, m/s) -- ebpv double[2][3] Earth barycentric PV (au, au/day) -- ehp double[3] Earth heliocentric P (au) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) Providing separate arguments for (i) the observer's geocentric -- position and velocity and (ii) the Earth ephemeris is done for -- convenience in the geocentric, terrestrial and Earth orbit cases. -- For deep space applications it maybe more convenient to specify -- zero geocentric position and velocity and to supply the -- observer's position and velocity information directly instead of -- with respect to the Earth. However, note the different units: -- m and m/s for the geocentric vectors, au and au/day for the -- heliocentric and barycentric vectors. -- -- 4) In cases where the caller does not wish to provide the Earth -- ephemeris, the function eraApcs13 can be used instead of the -- present function. This computes the Earth ephemeris using the -- ERFA function eraEpv00. -- -- 5) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 6) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraCp copy p-vector -- eraPm modulus of p-vector -- eraPn decompose p-vector into modulus and direction -- eraIr initialize r-matrix to identity -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apcs(date1, date2, pv, ebpv, ehp) -- return astrom -- -- --def apcs13(date1, date2, pv): -- """ -- Wrapper for ERFA function ``eraApcs13``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- pv : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A p c s 1 3 -- - - - - - - - - - - -- -- For an observer whose geocentric position and velocity are known, -- prepare star-independent astrometry parameters for transformations -- between ICRS and GCRS. The Earth ephemeris is from ERFA models. -- -- The parameters produced by this function are required in the space -- motion, parallax, light deflection and aberration parts of the -- astrometric transformation chain. -- -- Given: -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- pv double[2][3] observer's geocentric pos/vel (Note 3) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double unchanged -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) All the vectors are with respect to BCRS axes. -- -- 3) The observer's position and velocity pv are geocentric but with -- respect to BCRS axes, and in units of m and m/s. No assumptions -- are made about proximity to the Earth, and the function can be -- used for deep space applications as well as Earth orbit and -- terrestrial. -- -- 4) In cases where the caller wishes to supply his own Earth -- ephemeris, the function eraApcs can be used instead of the present -- function. -- -- 5) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 6) The context structure astrom produced by this function is used by -- eraAtciq* and eraAticq*. -- -- Called: -- eraEpv00 Earth position and velocity -- eraApcs astrometry parameters, ICRS-GCRS, space observer -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apcs13(date1, date2, pv) -- return astrom -- -- --def aper(theta, astrom): -- """ -- Wrapper for ERFA function ``eraAper``. -- -- Parameters -- ---------- -- theta : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. Note that, unlike the erfa routine, -- the python wrapper does not change astrom in-place. -- -- - - - - - - - - -- e r a A p e r -- - - - - - - - - -- -- In the star-independent astrometry parameters, update only the -- Earth rotation angle, supplied by the caller explicitly. -- -- Given: -- theta double Earth rotation angle (radians, Note 2) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double not used -- eb double[3] not used -- eh double[3] not used -- em double not used -- v double[3] not used -- bm1 double not used -- bpn double[3][3] not used -- along double longitude + s' (radians) -- xpl double not used -- ypl double not used -- sphi double not used -- cphi double not used -- diurab double not used -- eral double not used -- refa double not used -- refb double not used -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double unchanged -- eb double[3] unchanged -- eh double[3] unchanged -- em double unchanged -- v double[3] unchanged -- bm1 double unchanged -- bpn double[3][3] unchanged -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double "local" Earth rotation angle (radians) -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) This function exists to enable sidereal-tracking applications to -- avoid wasteful recomputation of the bulk of the astrometry -- parameters: only the Earth rotation is updated. -- -- 2) For targets expressed as equinox based positions, such as -- classical geocentric apparent (RA,Dec), the supplied theta can be -- Greenwich apparent sidereal time rather than Earth rotation -- angle. -- -- 3) The function eraAper13 can be used instead of the present -- function, and starts from UT1 rather than ERA itself. -- -- 4) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.aper(theta, astrom) -- return astrom -- -- --def aper13(ut11, ut12, astrom): -- """ -- Wrapper for ERFA function ``eraAper13``. -- -- Parameters -- ---------- -- ut11 : double array -- ut12 : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. Note that, unlike the erfa routine, -- the python wrapper does not change astrom in-place. -- -- - - - - - - - - - - -- e r a A p e r 1 3 -- - - - - - - - - - - -- -- In the star-independent astrometry parameters, update only the -- Earth rotation angle. The caller provides UT1, (n.b. not UTC). -- -- Given: -- ut11 double UT1 as a 2-part... -- ut12 double ...Julian Date (Note 1) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double not used -- eb double[3] not used -- eh double[3] not used -- em double not used -- v double[3] not used -- bm1 double not used -- bpn double[3][3] not used -- along double longitude + s' (radians) -- xpl double not used -- ypl double not used -- sphi double not used -- cphi double not used -- diurab double not used -- eral double not used -- refa double not used -- refb double not used -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double unchanged -- eb double[3] unchanged -- eh double[3] unchanged -- em double unchanged -- v double[3] unchanged -- bm1 double unchanged -- bpn double[3][3] unchanged -- along double unchanged -- xpl double unchanged -- ypl double unchanged -- sphi double unchanged -- cphi double unchanged -- diurab double unchanged -- eral double "local" Earth rotation angle (radians) -- refa double unchanged -- refb double unchanged -- -- Notes: -- -- 1) The UT1 date (n.b. not UTC) ut11+ut12 is a Julian Date, -- apportioned in any convenient way between the arguments ut11 and -- ut12. For example, JD(UT1)=2450123.7 could be expressed in any -- of these ways, among others: -- -- ut11 ut12 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. The date & time method is -- best matched to the algorithm used: maximum precision is -- delivered when the ut11 argument is for 0hrs UT1 on the day in -- question and the ut12 argument lies in the range 0 to 1, or vice -- versa. -- -- 2) If the caller wishes to provide the Earth rotation angle itself, -- the function eraAper can be used instead. One use of this -- technique is to substitute Greenwich apparent sidereal time and -- thereby to support equinox based transformations directly. -- -- 3) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- Called: -- eraAper astrometry parameters: update ERA -- eraEra00 Earth rotation angle, IAU 2000 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.aper13(ut11, ut12, astrom) -- return astrom -- -- --def apio(sp, theta, elong, phi, hm, xp, yp, refa, refb): -- """ -- Wrapper for ERFA function ``eraApio``. -- -- Parameters -- ---------- -- sp : double array -- theta : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- refa : double array -- refb : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A p i o -- - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between CIRS and observed -- coordinates. The caller supplies the Earth orientation information -- and the refraction constants as well as the site coordinates. -- -- Given: -- sp double the TIO locator s' (radians, Note 1) -- theta double Earth rotation angle (radians) -- elong double longitude (radians, east +ve, Note 2) -- phi double geodetic latitude (radians, Note 2) -- hm double height above ellipsoid (m, geodetic Note 2) -- xp,yp double polar motion coordinates (radians, Note 3) -- refa double refraction constant A (radians, Note 4) -- refb double refraction constant B (radians, Note 4) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double unchanged -- eb double[3] unchanged -- eh double[3] unchanged -- em double unchanged -- v double[3] unchanged -- bm1 double unchanged -- bpn double[3][3] unchanged -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Notes: -- -- 1) sp, the TIO locator s', is a tiny quantity needed only by the -- most precise applications. It can either be set to zero or -- predicted using the ERFA function eraSp00. -- -- 2) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 3) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many applications, -- xp and yp can be set to zero. -- -- Internally, the polar motion is stored in a form rotated onto the -- local meridian. -- -- 4) The refraction constants refa and refb are for use in a -- dZ = A*tan(Z)+B*tan^3(Z) model, where Z is the observed -- (i.e. refracted) zenith distance and dZ is the amount of -- refraction. -- -- 5) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- 6) In cases where the caller does not wish to provide the Earth -- rotation information and refraction constants, the function -- eraApio13 can be used instead of the present function. This -- starts from UTC and weather readings etc. and computes suitable -- values using other ERFA functions. -- -- 7) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 8) The context structure astrom produced by this function is used by -- eraAtioq and eraAtoiq. -- -- Called: -- eraPvtob position/velocity of terrestrial station -- eraAper astrometry parameters: update ERA -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom = ufunc.apio(sp, theta, elong, phi, hm, xp, yp, refa, refb) -- return astrom -- -- --def apio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraApio13``. -- -- Parameters -- ---------- -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- astrom : eraASTROM array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A p i o 1 3 -- - - - - - - - - - - -- -- For a terrestrial observer, prepare star-independent astrometry -- parameters for transformations between CIRS and observed -- coordinates. The caller supplies UTC, site coordinates, ambient air -- conditions and observing wavelength. -- -- Given: -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 1,2) -- dut1 double UT1-UTC (seconds) -- elong double longitude (radians, east +ve, Note 3) -- phi double geodetic latitude (radians, Note 3) -- hm double height above ellipsoid (m, geodetic Notes 4,6) -- xp,yp double polar motion coordinates (radians, Note 5) -- phpa double pressure at the observer (hPa = mB, Note 6) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 7) -- -- Returned: -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double unchanged -- eb double[3] unchanged -- eh double[3] unchanged -- em double unchanged -- v double[3] unchanged -- bm1 double unchanged -- bpn double[3][3] unchanged -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned (function value): -- int status: +1 = dubious year (Note 2) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 2) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- 3) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 4) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 5) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many applications, -- xp and yp can be set to zero. -- -- Internally, the polar motion is stored in a form rotated onto -- the local meridian. -- -- 6) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), is -- available, an adequate estimate of hm can be obtained from the -- expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to the -- pressure and that an accurate phpa value is important for -- precise work. -- -- 7) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 8) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- 9) In cases where the caller wishes to supply his own Earth -- rotation information and refraction constants, the function -- eraApc can be used instead of the present function. -- -- 10) This is one of several functions that inserts into the astrom -- structure star-independent parameters needed for the chain of -- astrometric transformations ICRS <-> GCRS <-> CIRS <-> observed. -- -- The various functions support different classes of observer and -- portions of the transformation chain: -- -- functions observer transformation -- -- eraApcg eraApcg13 geocentric ICRS <-> GCRS -- eraApci eraApci13 terrestrial ICRS <-> CIRS -- eraApco eraApco13 terrestrial ICRS <-> observed -- eraApcs eraApcs13 space ICRS <-> GCRS -- eraAper eraAper13 terrestrial update Earth rotation -- eraApio eraApio13 terrestrial CIRS <-> observed -- -- Those with names ending in "13" use contemporary ERFA models to -- compute the various ephemerides. The others accept ephemerides -- supplied by the caller. -- -- The transformation from ICRS to GCRS covers space motion, -- parallax, light deflection, and aberration. From GCRS to CIRS -- comprises frame bias and precession-nutation. From CIRS to -- observed takes account of Earth rotation, polar motion, diurnal -- aberration and parallax (unless subsumed into the ICRS <-> GCRS -- transformation), and atmospheric refraction. -- -- 11) The context structure astrom produced by this function is used -- by eraAtioq and eraAtoiq. -- -- Called: -- eraUtctai UTC to TAI -- eraTaitt TAI to TT -- eraUtcut1 UTC to UT1 -- eraSp00 the TIO locator s', IERS 2000 -- eraEra00 Earth rotation angle, IAU 2000 -- eraRefco refraction constants for given ambient conditions -- eraApio astrometry parameters, CIRS-observed -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- astrom, c_retval = ufunc.apio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'apio13') -- return astrom -- -- --STATUS_CODES['apio13'] = {1: 'dubious year (Note 2)', 0: 'OK', -1: 'unacceptable date'} -- -- --def atci13(rc, dc, pr, pd, px, rv, date1, date2): -- """ -- Wrapper for ERFA function ``eraAtci13``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- pr : double array -- pd : double array -- px : double array -- rv : double array -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- ri : double array -- di : double array -- eo : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t c i 1 3 -- - - - - - - - - - - -- -- Transform ICRS star data, epoch J2000.0, to CIRS. -- -- Given: -- rc double ICRS right ascension at J2000.0 (radians, Note 1) -- dc double ICRS declination at J2000.0 (radians, Note 1) -- pr double RA proper motion (radians/year; Note 2) -- pd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, +ve if receding) -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 3) -- -- Returned: -- ri,di double* CIRS geocentric RA,Dec (radians) -- eo double* equation of the origins (ERA-GST, Note 5) -- -- Notes: -- -- 1) Star data for an epoch other than J2000.0 (for example from the -- Hipparcos catalog, which has an epoch of J1991.25) will require a -- preliminary call to eraPmsafe before use. -- -- 2) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- 3) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 4) The available accuracy is better than 1 milliarcsecond, limited -- mainly by the precession-nutation model that is used, namely -- IAU 2000A/2006. Very close to solar system bodies, additional -- errors of up to several milliarcseconds can occur because of -- unmodeled light deflection; however, the Sun's contribution is -- taken into account, to first order. The accuracy limitations of -- the ERFA function eraEpv00 (used to compute Earth position and -- velocity) can contribute aberration errors of up to -- 5 microarcseconds. Light deflection at the Sun's limb is -- uncertain at the 0.4 mas level. -- -- 5) Should the transformation to (equinox based) apparent place be -- required rather than (CIO based) intermediate place, subtract the -- equation of the origins from the returned right ascension: -- RA = RI - EO. (The eraAnp function can then be applied, as -- required, to keep the result in the conventional 0-2pi range.) -- -- Called: -- eraApci13 astrometry parameters, ICRS-CIRS, 2013 -- eraAtciq quick ICRS to CIRS -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di, eo = ufunc.atci13(rc, dc, pr, pd, px, rv, date1, date2) -- return ri, di, eo -- -- --def atciq(rc, dc, pr, pd, px, rv, astrom): -- """ -- Wrapper for ERFA function ``eraAtciq``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- pr : double array -- pd : double array -- px : double array -- rv : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- ri : double array -- di : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a A t c i q -- - - - - - - - - - -- -- Quick ICRS, epoch J2000.0, to CIRS transformation, given precomputed -- star-independent astrometry parameters. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are to be transformed for one date. The -- star-independent parameters can be obtained by calling one of the -- functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. -- -- If the parallax and proper motions are zero the eraAtciqz function -- can be used instead. -- -- Given: -- rc,dc double ICRS RA,Dec at J2000.0 (radians) -- pr double RA proper motion (radians/year; Note 3) -- pd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, +ve if receding) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned: -- ri,di double CIRS RA,Dec (radians) -- -- Notes: -- -- 1) All the vectors are with respect to BCRS axes. -- -- 2) Star data for an epoch other than J2000.0 (for example from the -- Hipparcos catalog, which has an epoch of J1991.25) will require a -- preliminary call to eraPmsafe before use. -- -- 3) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- Called: -- eraPmpx proper motion and parallax -- eraLdsun light deflection by the Sun -- eraAb stellar aberration -- eraRxp product of r-matrix and pv-vector -- eraC2s p-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di = ufunc.atciq(rc, dc, pr, pd, px, rv, astrom) -- return ri, di -- -- --def atciqn(rc, dc, pr, pd, px, rv, astrom, b): -- """ -- Wrapper for ERFA function ``eraAtciqn``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- pr : double array -- pd : double array -- px : double array -- rv : double array -- astrom : eraASTROM array -- b : eraLDBODY array -- -- Returns -- ------- -- ri : double array -- di : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t c i q n -- - - - - - - - - - - -- -- Quick ICRS, epoch J2000.0, to CIRS transformation, given precomputed -- star-independent astrometry parameters plus a list of light- -- deflecting bodies. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are to be transformed for one date. The -- star-independent parameters can be obtained by calling one of the -- functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. -- -- -- If the only light-deflecting body to be taken into account is the -- Sun, the eraAtciq function can be used instead. If in addition the -- parallax and proper motions are zero, the eraAtciqz function can be -- used. -- -- Given: -- rc,dc double ICRS RA,Dec at J2000.0 (radians) -- pr double RA proper motion (radians/year; Note 3) -- pd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, +ve if receding) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- n int number of bodies (Note 3) -- b eraLDBODY[n] data for each of the n bodies (Notes 3,4): -- bm double mass of the body (solar masses, Note 5) -- dl double deflection limiter (Note 6) -- pv [2][3] barycentric PV of the body (au, au/day) -- -- Returned: -- ri,di double CIRS RA,Dec (radians) -- -- Notes: -- -- 1) Star data for an epoch other than J2000.0 (for example from the -- Hipparcos catalog, which has an epoch of J1991.25) will require a -- preliminary call to eraPmsafe before use. -- -- 2) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- 3) The struct b contains n entries, one for each body to be -- considered. If n = 0, no gravitational light deflection will be -- applied, not even for the Sun. -- -- 4) The struct b should include an entry for the Sun as well as for -- any planet or other body to be taken into account. The entries -- should be in the order in which the light passes the body. -- -- 5) In the entry in the b struct for body i, the mass parameter -- b[i].bm can, as required, be adjusted in order to allow for such -- effects as quadrupole field. -- -- 6) The deflection limiter parameter b[i].dl is phi^2/2, where phi is -- the angular separation (in radians) between star and body at -- which limiting is applied. As phi shrinks below the chosen -- threshold, the deflection is artificially reduced, reaching zero -- for phi = 0. Example values suitable for a terrestrial -- observer, together with masses, are as follows: -- -- body i b[i].bm b[i].dl -- -- Sun 1.0 6e-6 -- Jupiter 0.00095435 3e-9 -- Saturn 0.00028574 3e-10 -- -- 7) For efficiency, validation of the contents of the b array is -- omitted. The supplied masses must be greater than zero, the -- position and velocity vectors must be right, and the deflection -- limiter greater than zero. -- -- Called: -- eraPmpx proper motion and parallax -- eraLdn light deflection by n bodies -- eraAb stellar aberration -- eraRxp product of r-matrix and pv-vector -- eraC2s p-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di = ufunc.atciqn(rc, dc, pr, pd, px, rv, astrom, b) -- return ri, di -- -- --def atciqz(rc, dc, astrom): -- """ -- Wrapper for ERFA function ``eraAtciqz``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- ri : double array -- di : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t c i q z -- - - - - - - - - - - -- -- Quick ICRS to CIRS transformation, given precomputed star- -- independent astrometry parameters, and assuming zero parallax and -- proper motion. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are to be transformed for one date. The -- star-independent parameters can be obtained by calling one of the -- functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. -- -- The corresponding function for the case of non-zero parallax and -- proper motion is eraAtciq. -- -- Given: -- rc,dc double ICRS astrometric RA,Dec (radians) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned: -- ri,di double CIRS RA,Dec (radians) -- -- Note: -- -- All the vectors are with respect to BCRS axes. -- -- References: -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013). -- -- Klioner, Sergei A., "A practical relativistic model for micro- -- arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraLdsun light deflection due to Sun -- eraAb stellar aberration -- eraRxp product of r-matrix and p-vector -- eraC2s p-vector to spherical -- eraAnp normalize angle into range +/- pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di = ufunc.atciqz(rc, dc, astrom) -- return ri, di -- -- --def atco13(rc, dc, pr, pd, px, rv, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraAtco13``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- pr : double array -- pd : double array -- px : double array -- rv : double array -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- aob : double array -- zob : double array -- hob : double array -- dob : double array -- rob : double array -- eo : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t c o 1 3 -- - - - - - - - - - - -- -- ICRS RA,Dec to observed place. The caller supplies UTC, site -- coordinates, ambient air conditions and observing wavelength. -- -- ERFA models are used for the Earth ephemeris, bias-precession- -- nutation, Earth orientation and refraction. -- -- Given: -- rc,dc double ICRS right ascension at J2000.0 (radians, Note 1) -- pr double RA proper motion (radians/year; Note 2) -- pd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, +ve if receding) -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 3-4) -- dut1 double UT1-UTC (seconds, Note 5) -- elong double longitude (radians, east +ve, Note 6) -- phi double latitude (geodetic, radians, Note 6) -- hm double height above ellipsoid (m, geodetic, Notes 6,8) -- xp,yp double polar motion coordinates (radians, Note 7) -- phpa double pressure at the observer (hPa = mB, Note 8) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 9) -- -- Returned: -- aob double* observed azimuth (radians: N=0,E=90) -- zob double* observed zenith distance (radians) -- hob double* observed hour angle (radians) -- dob double* observed declination (radians) -- rob double* observed right ascension (CIO-based, radians) -- eo double* equation of the origins (ERA-GST) -- -- Returned (function value): -- int status: +1 = dubious year (Note 4) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) Star data for an epoch other than J2000.0 (for example from the -- Hipparcos catalog, which has an epoch of J1991.25) will require -- a preliminary call to eraPmsafe before use. -- -- 2) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- 3) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 4) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the -- future to be trusted. See eraDat for further details. -- -- 5) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 6) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 7) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many -- applications, xp and yp can be set to zero. -- -- 8) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), -- is available, an adequate estimate of hm can be obtained from -- the expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to -- the pressure and that an accurate phpa value is important for -- precise work. -- -- 9) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 10) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted observed -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better -- than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- Without refraction, the complementary functions eraAtco13 and -- eraAtoc13 are self-consistent to better than 1 microarcsecond -- all over the celestial sphere. With refraction included, -- consistency falls off at high zenith distances, but is still -- better than 0.05 arcsec at 85 degrees. -- -- 11) "Observed" Az,ZD means the position that would be seen by a -- perfect geodetically aligned theodolite. (Zenith distance is -- used rather than altitude in order to reflect the fact that no -- allowance is made for depression of the horizon.) This is -- related to the observed HA,Dec via the standard rotation, using -- the geodetic latitude (corrected for polar motion), while the -- observed HA and RA are related simply through the Earth rotation -- angle and the site longitude. "Observed" RA,Dec or HA,Dec thus -- means the position that would be seen by a perfect equatorial -- with its polar axis aligned to the Earth's axis of rotation. -- -- 12) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- Called: -- eraApco13 astrometry parameters, ICRS-observed, 2013 -- eraAtciq quick ICRS to CIRS -- eraAtioq quick CIRS to observed -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- aob, zob, hob, dob, rob, eo, c_retval = ufunc.atco13(rc, dc, pr, pd, px, rv, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'atco13') -- return aob, zob, hob, dob, rob, eo -- -- --STATUS_CODES['atco13'] = {1: 'dubious year (Note 4)', 0: 'OK', -1: 'unacceptable date'} -- -- --def atic13(ri, di, date1, date2): -- """ -- Wrapper for ERFA function ``eraAtic13``. -- -- Parameters -- ---------- -- ri : double array -- di : double array -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rc : double array -- dc : double array -- eo : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t i c 1 3 -- - - - - - - - - - - -- -- Transform star RA,Dec from geocentric CIRS to ICRS astrometric. -- -- Given: -- ri,di double CIRS geocentric RA,Dec (radians) -- date1 double TDB as a 2-part... -- date2 double ...Julian Date (Note 1) -- -- Returned: -- rc,dc double ICRS astrometric RA,Dec (radians) -- eo double equation of the origins (ERA-GST, Note 4) -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. For most -- applications of this function the choice will not be at all -- critical. -- -- TT can be used instead of TDB without any significant impact on -- accuracy. -- -- 2) Iterative techniques are used for the aberration and light -- deflection corrections so that the functions eraAtic13 (or -- eraAticq) and eraAtci13 (or eraAtciq) are accurate inverses; -- even at the edge of the Sun's disk the discrepancy is only about -- 1 nanoarcsecond. -- -- 3) The available accuracy is better than 1 milliarcsecond, limited -- mainly by the precession-nutation model that is used, namely -- IAU 2000A/2006. Very close to solar system bodies, additional -- errors of up to several milliarcseconds can occur because of -- unmodeled light deflection; however, the Sun's contribution is -- taken into account, to first order. The accuracy limitations of -- the ERFA function eraEpv00 (used to compute Earth position and -- velocity) can contribute aberration errors of up to -- 5 microarcseconds. Light deflection at the Sun's limb is -- uncertain at the 0.4 mas level. -- -- 4) Should the transformation to (equinox based) J2000.0 mean place -- be required rather than (CIO based) ICRS coordinates, subtract the -- equation of the origins from the returned right ascension: -- RA = RI - EO. (The eraAnp function can then be applied, as -- required, to keep the result in the conventional 0-2pi range.) -- -- Called: -- eraApci13 astrometry parameters, ICRS-CIRS, 2013 -- eraAticq quick CIRS to ICRS astrometric -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc, dc, eo = ufunc.atic13(ri, di, date1, date2) -- return rc, dc, eo -- -- --def aticq(ri, di, astrom): -- """ -- Wrapper for ERFA function ``eraAticq``. -- -- Parameters -- ---------- -- ri : double array -- di : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- rc : double array -- dc : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a A t i c q -- - - - - - - - - - -- -- Quick CIRS RA,Dec to ICRS astrometric place, given the star- -- independent astrometry parameters. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are all to be transformed for one date. -- The star-independent astrometry parameters can be obtained by -- calling one of the functions eraApci[13], eraApcg[13], eraApco[13] -- or eraApcs[13]. -- -- Given: -- ri,di double CIRS RA,Dec (radians) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned: -- rc,dc double ICRS astrometric RA,Dec (radians) -- -- Notes: -- -- 1) Only the Sun is taken into account in the light deflection -- correction. -- -- 2) Iterative techniques are used for the aberration and light -- deflection corrections so that the functions eraAtic13 (or -- eraAticq) and eraAtci13 (or eraAtciq) are accurate inverses; -- even at the edge of the Sun's disk the discrepancy is only about -- 1 nanoarcsecond. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraTrxp product of transpose of r-matrix and p-vector -- eraZp zero p-vector -- eraAb stellar aberration -- eraLdsun light deflection by the Sun -- eraC2s p-vector to spherical -- eraAnp normalize angle into range +/- pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc, dc = ufunc.aticq(ri, di, astrom) -- return rc, dc -- -- --def aticqn(ri, di, astrom, b): -- """ -- Wrapper for ERFA function ``eraAticqn``. -- -- Parameters -- ---------- -- ri : double array -- di : double array -- astrom : eraASTROM array -- b : eraLDBODY array -- -- Returns -- ------- -- rc : double array -- dc : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t i c q n -- - - - - - - - - - - -- -- Quick CIRS to ICRS astrometric place transformation, given the star- -- independent astrometry parameters plus a list of light-deflecting -- bodies. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are all to be transformed for one date. -- The star-independent astrometry parameters can be obtained by -- calling one of the functions eraApci[13], eraApcg[13], eraApco[13] -- or eraApcs[13]. --* --* If the only light-deflecting body to be taken into account is the --* Sun, the eraAticq function can be used instead. -- -- Given: -- ri,di double CIRS RA,Dec (radians) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- n int number of bodies (Note 3) -- b eraLDBODY[n] data for each of the n bodies (Notes 3,4): -- bm double mass of the body (solar masses, Note 5) -- dl double deflection limiter (Note 6) -- pv [2][3] barycentric PV of the body (au, au/day) -- -- Returned: -- rc,dc double ICRS astrometric RA,Dec (radians) -- -- Notes: -- -- 1) Iterative techniques are used for the aberration and light -- deflection corrections so that the functions eraAticqn and -- eraAtciqn are accurate inverses; even at the edge of the Sun's -- disk the discrepancy is only about 1 nanoarcsecond. -- -- 2) If the only light-deflecting body to be taken into account is the -- Sun, the eraAticq function can be used instead. -- -- 3) The struct b contains n entries, one for each body to be -- considered. If n = 0, no gravitational light deflection will be -- applied, not even for the Sun. -- -- 4) The struct b should include an entry for the Sun as well as for -- any planet or other body to be taken into account. The entries -- should be in the order in which the light passes the body. -- -- 5) In the entry in the b struct for body i, the mass parameter -- b[i].bm can, as required, be adjusted in order to allow for such -- effects as quadrupole field. -- -- 6) The deflection limiter parameter b[i].dl is phi^2/2, where phi is -- the angular separation (in radians) between star and body at -- which limiting is applied. As phi shrinks below the chosen -- threshold, the deflection is artificially reduced, reaching zero -- for phi = 0. Example values suitable for a terrestrial -- observer, together with masses, are as follows: -- -- body i b[i].bm b[i].dl -- -- Sun 1.0 6e-6 -- Jupiter 0.00095435 3e-9 -- Saturn 0.00028574 3e-10 -- -- 7) For efficiency, validation of the contents of the b array is -- omitted. The supplied masses must be greater than zero, the -- position and velocity vectors must be right, and the deflection -- limiter greater than zero. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraTrxp product of transpose of r-matrix and p-vector -- eraZp zero p-vector -- eraAb stellar aberration -- eraLdn light deflection by n bodies -- eraC2s p-vector to spherical -- eraAnp normalize angle into range +/- pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc, dc = ufunc.aticqn(ri, di, astrom, b) -- return rc, dc -- -- --def atio13(ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraAtio13``. -- -- Parameters -- ---------- -- ri : double array -- di : double array -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- aob : double array -- zob : double array -- hob : double array -- dob : double array -- rob : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t i o 1 3 -- - - - - - - - - - - -- -- CIRS RA,Dec to observed place. The caller supplies UTC, site -- coordinates, ambient air conditions and observing wavelength. -- -- Given: -- ri double CIRS right ascension (CIO-based, radians) -- di double CIRS declination (radians) -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 1,2) -- dut1 double UT1-UTC (seconds, Note 3) -- elong double longitude (radians, east +ve, Note 4) -- phi double geodetic latitude (radians, Note 4) -- hm double height above ellipsoid (m, geodetic Notes 4,6) -- xp,yp double polar motion coordinates (radians, Note 5) -- phpa double pressure at the observer (hPa = mB, Note 6) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 7) -- -- Returned: -- aob double* observed azimuth (radians: N=0,E=90) -- zob double* observed zenith distance (radians) -- hob double* observed hour angle (radians) -- dob double* observed declination (radians) -- rob double* observed right ascension (CIO-based, radians) -- -- Returned (function value): -- int status: +1 = dubious year (Note 2) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 2) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the -- future to be trusted. See eraDat for further details. -- -- 3) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 4) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 5) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many -- applications, xp and yp can be set to zero. -- -- 6) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), is -- available, an adequate estimate of hm can be obtained from the -- expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to -- the pressure and that an accurate phpa value is important for -- precise work. -- -- 7) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 8) "Observed" Az,ZD means the position that would be seen by a -- perfect geodetically aligned theodolite. (Zenith distance is -- used rather than altitude in order to reflect the fact that no -- allowance is made for depression of the horizon.) This is -- related to the observed HA,Dec via the standard rotation, using -- the geodetic latitude (corrected for polar motion), while the -- observed HA and RA are related simply through the Earth rotation -- angle and the site longitude. "Observed" RA,Dec or HA,Dec thus -- means the position that would be seen by a perfect equatorial -- with its polar axis aligned to the Earth's axis of rotation. -- -- 9) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted astrometric -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better -- than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- 10) The complementary functions eraAtio13 and eraAtoi13 are self- -- consistent to better than 1 microarcsecond all over the -- celestial sphere. -- -- 11) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- Called: -- eraApio13 astrometry parameters, CIRS-observed, 2013 -- eraAtioq quick CIRS to observed -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- aob, zob, hob, dob, rob, c_retval = ufunc.atio13(ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'atio13') -- return aob, zob, hob, dob, rob -- -- --STATUS_CODES['atio13'] = {1: 'dubious year (Note 2)', 0: 'OK', -1: 'unacceptable date'} -- -- --def atioq(ri, di, astrom): -- """ -- Wrapper for ERFA function ``eraAtioq``. -- -- Parameters -- ---------- -- ri : double array -- di : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- aob : double array -- zob : double array -- hob : double array -- dob : double array -- rob : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a A t i o q -- - - - - - - - - - -- -- Quick CIRS to observed place transformation. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are all to be transformed for one date. -- The star-independent astrometry parameters can be obtained by -- calling eraApio[13] or eraApco[13]. -- -- Given: -- ri double CIRS right ascension -- di double CIRS declination -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned: -- aob double* observed azimuth (radians: N=0,E=90) -- zob double* observed zenith distance (radians) -- hob double* observed hour angle (radians) -- dob double* observed declination (radians) -- rob double* observed right ascension (CIO-based, radians) -- -- Notes: -- -- 1) This function returns zenith distance rather than altitude in -- order to reflect the fact that no allowance is made for -- depression of the horizon. -- -- 2) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted observed -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better -- than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- Without refraction, the complementary functions eraAtioq and -- eraAtoiq are self-consistent to better than 1 microarcsecond all -- over the celestial sphere. With refraction included, consistency -- falls off at high zenith distances, but is still better than -- 0.05 arcsec at 85 degrees. -- -- 3) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- 4) The CIRS RA,Dec is obtained from a star catalog mean place by -- allowing for space motion, parallax, the Sun's gravitational lens -- effect, annual aberration and precession-nutation. For star -- positions in the ICRS, these effects can be applied by means of -- the eraAtci13 (etc.) functions. Starting from classical "mean -- place" systems, additional transformations will be needed first. -- -- 5) "Observed" Az,El means the position that would be seen by a -- perfect geodetically aligned theodolite. This is obtained from -- the CIRS RA,Dec by allowing for Earth orientation and diurnal -- aberration, rotating from equator to horizon coordinates, and -- then adjusting for refraction. The HA,Dec is obtained by -- rotating back into equatorial coordinates, and is the position -- that would be seen by a perfect equatorial with its polar axis -- aligned to the Earth's axis of rotation. Finally, the RA is -- obtained by subtracting the HA from the local ERA. -- -- 6) The star-independent CIRS-to-observed-place parameters in ASTROM -- may be computed with eraApio[13] or eraApco[13]. If nothing has -- changed significantly except the time, eraAper[13] may be used to -- perform the requisite adjustment to the astrom structure. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraC2s p-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- aob, zob, hob, dob, rob = ufunc.atioq(ri, di, astrom) -- return aob, zob, hob, dob, rob -- -- --def atoc13(type, ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraAtoc13``. -- -- Parameters -- ---------- -- type : const char array -- ob1 : double array -- ob2 : double array -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- rc : double array -- dc : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t o c 1 3 -- - - - - - - - - - - -- -- Observed place at a groundbased site to to ICRS astrometric RA,Dec. -- The caller supplies UTC, site coordinates, ambient air conditions -- and observing wavelength. -- -- Given: -- type char[] type of coordinates - "R", "H" or "A" (Notes 1,2) -- ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) -- ob2 double observed ZD or Dec (radians) -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 3,4) -- dut1 double UT1-UTC (seconds, Note 5) -- elong double longitude (radians, east +ve, Note 6) -- phi double geodetic latitude (radians, Note 6) -- hm double height above ellipsoid (m, geodetic Notes 6,8) -- xp,yp double polar motion coordinates (radians, Note 7) -- phpa double pressure at the observer (hPa = mB, Note 8) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 9) -- -- Returned: -- rc,dc double ICRS astrometric RA,Dec (radians) -- -- Returned (function value): -- int status: +1 = dubious year (Note 4) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) "Observed" Az,ZD means the position that would be seen by a -- perfect geodetically aligned theodolite. (Zenith distance is -- used rather than altitude in order to reflect the fact that no -- allowance is made for depression of the horizon.) This is -- related to the observed HA,Dec via the standard rotation, using -- the geodetic latitude (corrected for polar motion), while the -- observed HA and RA are related simply through the Earth rotation -- angle and the site longitude. "Observed" RA,Dec or HA,Dec thus -- means the position that would be seen by a perfect equatorial -- with its polar axis aligned to the Earth's axis of rotation. -- -- 2) Only the first character of the type argument is significant. -- "R" or "r" indicates that ob1 and ob2 are the observed right -- ascension and declination; "H" or "h" indicates that they are -- hour angle (west +ve) and declination; anything else ("A" or -- "a" is recommended) indicates that ob1 and ob2 are azimuth -- (north zero, east 90 deg) and zenith distance. -- -- 3) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 4) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the -- future to be trusted. See eraDat for further details. -- -- 5) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 6) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 7) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many -- applications, xp and yp can be set to zero. -- -- 8) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), is -- available, an adequate estimate of hm can be obtained from the -- expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to -- the pressure and that an accurate phpa value is important for -- precise work. -- -- 9) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 10) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted astrometric -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better -- than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- Without refraction, the complementary functions eraAtco13 and -- eraAtoc13 are self-consistent to better than 1 microarcsecond -- all over the celestial sphere. With refraction included, -- consistency falls off at high zenith distances, but is still -- better than 0.05 arcsec at 85 degrees. -- -- 11) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- Called: -- eraApco13 astrometry parameters, ICRS-observed -- eraAtoiq quick observed to CIRS -- eraAticq quick CIRS to ICRS -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc, dc, c_retval = ufunc.atoc13(type, ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'atoc13') -- return rc, dc -- -- --STATUS_CODES['atoc13'] = {1: 'dubious year (Note 4)', 0: 'OK', -1: 'unacceptable date'} -- -- --def atoi13(type, ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraAtoi13``. -- -- Parameters -- ---------- -- type : const char array -- ob1 : double array -- ob2 : double array -- utc1 : double array -- utc2 : double array -- dut1 : double array -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- ri : double array -- di : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a A t o i 1 3 -- - - - - - - - - - - -- -- Observed place to CIRS. The caller supplies UTC, site coordinates, -- ambient air conditions and observing wavelength. -- -- Given: -- type char[] type of coordinates - "R", "H" or "A" (Notes 1,2) -- ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) -- ob2 double observed ZD or Dec (radians) -- utc1 double UTC as a 2-part... -- utc2 double ...quasi Julian Date (Notes 3,4) -- dut1 double UT1-UTC (seconds, Note 5) -- elong double longitude (radians, east +ve, Note 6) -- phi double geodetic latitude (radians, Note 6) -- hm double height above the ellipsoid (meters, Notes 6,8) -- xp,yp double polar motion coordinates (radians, Note 7) -- phpa double pressure at the observer (hPa = mB, Note 8) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers, Note 9) -- -- Returned: -- ri double* CIRS right ascension (CIO-based, radians) -- di double* CIRS declination (radians) -- -- Returned (function value): -- int status: +1 = dubious year (Note 2) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) "Observed" Az,ZD means the position that would be seen by a -- perfect geodetically aligned theodolite. (Zenith distance is -- used rather than altitude in order to reflect the fact that no -- allowance is made for depression of the horizon.) This is -- related to the observed HA,Dec via the standard rotation, using -- the geodetic latitude (corrected for polar motion), while the -- observed HA and RA are related simply through the Earth rotation -- angle and the site longitude. "Observed" RA,Dec or HA,Dec thus -- means the position that would be seen by a perfect equatorial -- with its polar axis aligned to the Earth's axis of rotation. -- -- 2) Only the first character of the type argument is significant. -- "R" or "r" indicates that ob1 and ob2 are the observed right -- ascension and declination; "H" or "h" indicates that they are -- hour angle (west +ve) and declination; anything else ("A" or -- "a" is recommended) indicates that ob1 and ob2 are azimuth -- (north zero, east 90 deg) and zenith distance. -- -- 3) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- However, JD cannot unambiguously represent UTC during a leap -- second unless special measures are taken. The convention in the -- present function is that the JD day represents UTC days whether -- the length is 86399, 86400 or 86401 SI seconds. -- -- Applications should use the function eraDtf2d to convert from -- calendar date and time of day into 2-part quasi Julian Date, as -- it implements the leap-second-ambiguity convention just -- described. -- -- 4) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the -- future to be trusted. See eraDat for further details. -- -- 5) UT1-UTC is tabulated in IERS bulletins. It increases by exactly -- one second at the end of each positive UTC leap second, -- introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This -- practice is under review, and in the future UT1-UTC may grow -- essentially without limit. -- -- 6) The geographical coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the -- longitude required by the present function is east-positive -- (i.e. right-handed), in accordance with geographical convention. -- -- 7) The polar motion xp,yp can be obtained from IERS bulletins. The -- values are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions 2003), measured along the -- meridians 0 and 90 deg west respectively. For many -- applications, xp and yp can be set to zero. -- -- 8) If hm, the height above the ellipsoid of the observing station -- in meters, is not known but phpa, the pressure in hPa (=mB), is -- available, an adequate estimate of hm can be obtained from the -- expression -- -- hm = -29.3 * tsl * log ( phpa / 1013.25 ); -- -- where tsl is the approximate sea-level air temperature in K -- (See Astrophysical Quantities, C.W.Allen, 3rd edition, section -- 52). Similarly, if the pressure phpa is not known, it can be -- estimated from the height of the observing station, hm, as -- follows: -- -- phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); -- -- Note, however, that the refraction is nearly proportional to -- the pressure and that an accurate phpa value is important for -- precise work. -- -- 9) The argument wl specifies the observing wavelength in -- micrometers. The transition from optical to radio is assumed to -- occur at 100 micrometers (about 3000 GHz). -- -- 10) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted astrometric -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better -- than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- Without refraction, the complementary functions eraAtio13 and -- eraAtoi13 are self-consistent to better than 1 microarcsecond -- all over the celestial sphere. With refraction included, -- consistency falls off at high zenith distances, but is still -- better than 0.05 arcsec at 85 degrees. -- -- 12) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- Called: -- eraApio13 astrometry parameters, CIRS-observed, 2013 -- eraAtoiq quick observed to CIRS -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di, c_retval = ufunc.atoi13(type, ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl) -- check_errwarn(c_retval, 'atoi13') -- return ri, di -- -- --STATUS_CODES['atoi13'] = {1: 'dubious year (Note 2)', 0: 'OK', -1: 'unacceptable date'} -- -- --def atoiq(type, ob1, ob2, astrom): -- """ -- Wrapper for ERFA function ``eraAtoiq``. -- -- Parameters -- ---------- -- type : const char array -- ob1 : double array -- ob2 : double array -- astrom : eraASTROM array -- -- Returns -- ------- -- ri : double array -- di : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a A t o i q -- - - - - - - - - - -- -- Quick observed place to CIRS, given the star-independent astrometry -- parameters. -- -- Use of this function is appropriate when efficiency is important and -- where many star positions are all to be transformed for one date. -- The star-independent astrometry parameters can be obtained by -- calling eraApio[13] or eraApco[13]. -- -- Given: -- type char[] type of coordinates: "R", "H" or "A" (Note 1) -- ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) -- ob2 double observed ZD or Dec (radians) -- astrom eraASTROM* star-independent astrometry parameters: -- pmt double PM time interval (SSB, Julian years) -- eb double[3] SSB to observer (vector, au) -- eh double[3] Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- v double[3] barycentric observer velocity (vector, c) -- bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor -- bpn double[3][3] bias-precession-nutation matrix -- along double longitude + s' (radians) -- xpl double polar motion xp wrt local meridian (radians) -- ypl double polar motion yp wrt local meridian (radians) -- sphi double sine of geodetic latitude -- cphi double cosine of geodetic latitude -- diurab double magnitude of diurnal aberration vector -- eral double "local" Earth rotation angle (radians) -- refa double refraction constant A (radians) -- refb double refraction constant B (radians) -- -- Returned: -- ri double* CIRS right ascension (CIO-based, radians) -- di double* CIRS declination (radians) -- -- Notes: -- -- 1) "Observed" Az,El means the position that would be seen by a -- perfect geodetically aligned theodolite. This is related to -- the observed HA,Dec via the standard rotation, using the geodetic -- latitude (corrected for polar motion), while the observed HA and -- RA are related simply through the Earth rotation angle and the -- site longitude. "Observed" RA,Dec or HA,Dec thus means the -- position that would be seen by a perfect equatorial with its -- polar axis aligned to the Earth's axis of rotation. By removing -- from the observed place the effects of atmospheric refraction and -- diurnal aberration, the CIRS RA,Dec is obtained. -- -- 2) Only the first character of the type argument is significant. -- "R" or "r" indicates that ob1 and ob2 are the observed right -- ascension and declination; "H" or "h" indicates that they are -- hour angle (west +ve) and declination; anything else ("A" or -- "a" is recommended) indicates that ob1 and ob2 are azimuth (north -- zero, east 90 deg) and zenith distance. (Zenith distance is used -- rather than altitude in order to reflect the fact that no -- allowance is made for depression of the horizon.) -- -- 3) The accuracy of the result is limited by the corrections for -- refraction, which use a simple A*tan(z) + B*tan^3(z) model. -- Providing the meteorological parameters are known accurately and -- there are no gross local effects, the predicted observed -- coordinates should be within 0.05 arcsec (optical) or 1 arcsec -- (radio) for a zenith distance of less than 70 degrees, better -- than 30 arcsec (optical or radio) at 85 degrees and better than -- 20 arcmin (optical) or 30 arcmin (radio) at the horizon. -- -- Without refraction, the complementary functions eraAtioq and -- eraAtoiq are self-consistent to better than 1 microarcsecond all -- over the celestial sphere. With refraction included, consistency -- falls off at high zenith distances, but is still better than -- 0.05 arcsec at 85 degrees. -- -- 4) It is advisable to take great care with units, as even unlikely -- values of the input parameters are accepted and processed in -- accordance with the models used. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraC2s p-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ri, di = ufunc.atoiq(type, ob1, ob2, astrom) -- return ri, di -- -- --def ld(bm, p, q, e, em, dlim): -- """ -- Wrapper for ERFA function ``eraLd``. -- -- Parameters -- ---------- -- bm : double array -- p : double array -- q : double array -- e : double array -- em : double array -- dlim : double array -- -- Returns -- ------- -- p1 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a L d -- - - - - - - -- -- Apply light deflection by a solar-system body, as part of -- transforming coordinate direction into natural direction. -- -- Given: -- bm double mass of the gravitating body (solar masses) -- p double[3] direction from observer to source (unit vector) -- q double[3] direction from body to source (unit vector) -- e double[3] direction from body to observer (unit vector) -- em double distance from body to observer (au) -- dlim double deflection limiter (Note 4) -- -- Returned: -- p1 double[3] observer to deflected source (unit vector) -- -- Notes: -- -- 1) The algorithm is based on Expr. (70) in Klioner (2003) and -- Expr. (7.63) in the Explanatory Supplement (Urban & Seidelmann -- 2013), with some rearrangement to minimize the effects of machine -- precision. -- -- 2) The mass parameter bm can, as required, be adjusted in order to -- allow for such effects as quadrupole field. -- -- 3) The barycentric position of the deflecting body should ideally -- correspond to the time of closest approach of the light ray to -- the body. -- -- 4) The deflection limiter parameter dlim is phi^2/2, where phi is -- the angular separation (in radians) between source and body at -- which limiting is applied. As phi shrinks below the chosen -- threshold, the deflection is artificially reduced, reaching zero -- for phi = 0. -- -- 5) The returned vector p1 is not normalized, but the consequential -- departure from unit magnitude is always negligible. -- -- 6) The arguments p and p1 can be the same array. -- -- 7) To accumulate total light deflection taking into account the -- contributions from several bodies, call the present function for -- each body in succession, in decreasing order of distance from the -- observer. -- -- 8) For efficiency, validation is omitted. The supplied vectors must -- be of unit magnitude, and the deflection limiter non-zero and -- positive. -- -- References: -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013). -- -- Klioner, Sergei A., "A practical relativistic model for micro- -- arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). -- -- Called: -- eraPdp scalar product of two p-vectors -- eraPxp vector product of two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p1 = ufunc.ld(bm, p, q, e, em, dlim) -- return p1 -- -- --def ldn(b, ob, sc): -- """ -- Wrapper for ERFA function ``eraLdn``. -- -- Parameters -- ---------- -- b : eraLDBODY array -- ob : double array -- sc : double array -- -- Returns -- ------- -- sn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- --/*+ -- - - - - - - - -- e r a L d n -- - - - - - - - -- -- For a star, apply light deflection by multiple solar-system bodies, -- as part of transforming coordinate direction into natural direction. -- -- Given: -- n int number of bodies (note 1) -- b eraLDBODY[n] data for each of the n bodies (Notes 1,2): -- bm double mass of the body (solar masses, Note 3) -- dl double deflection limiter (Note 4) -- pv [2][3] barycentric PV of the body (au, au/day) -- ob double[3] barycentric position of the observer (au) -- sc double[3] observer to star coord direction (unit vector) -- -- Returned: -- sn double[3] observer to deflected star (unit vector) -- -- 1) The array b contains n entries, one for each body to be -- considered. If n = 0, no gravitational light deflection will be -- applied, not even for the Sun. -- -- 2) The array b should include an entry for the Sun as well as for -- any planet or other body to be taken into account. The entries -- should be in the order in which the light passes the body. -- -- 3) In the entry in the b array for body i, the mass parameter -- b[i].bm can, as required, be adjusted in order to allow for such -- effects as quadrupole field. -- -- 4) The deflection limiter parameter b[i].dl is phi^2/2, where phi is -- the angular separation (in radians) between star and body at -- which limiting is applied. As phi shrinks below the chosen -- threshold, the deflection is artificially reduced, reaching zero -- for phi = 0. Example values suitable for a terrestrial -- observer, together with masses, are as follows: -- -- body i b[i].bm b[i].dl -- -- Sun 1.0 6e-6 -- Jupiter 0.00095435 3e-9 -- Saturn 0.00028574 3e-10 -- -- 5) For cases where the starlight passes the body before reaching the -- observer, the body is placed back along its barycentric track by -- the light time from that point to the observer. For cases where -- the body is "behind" the observer no such shift is applied. If -- a different treatment is preferred, the user has the option of -- instead using the eraLd function. Similarly, eraLd can be used -- for cases where the source is nearby, not a star. -- -- 6) The returned vector sn is not normalized, but the consequential -- departure from unit magnitude is always negligible. -- -- 7) The arguments sc and sn can be the same array. -- -- 8) For efficiency, validation is omitted. The supplied masses must -- be greater than zero, the position and velocity vectors must be -- right, and the deflection limiter greater than zero. -- -- Reference: -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013), Section 7.2.4. -- -- Called: -- eraCp copy p-vector -- eraPdp scalar product of two p-vectors -- eraPmp p-vector minus p-vector -- eraPpsp p-vector plus scaled p-vector -- eraPn decompose p-vector into modulus and direction -- eraLd light deflection by a solar-system body -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- sn = ufunc.ldn(b, ob, sc) -- return sn -- -- --def ldsun(p, e, em): -- """ -- Wrapper for ERFA function ``eraLdsun``. -- -- Parameters -- ---------- -- p : double array -- e : double array -- em : double array -- -- Returns -- ------- -- p1 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a L d s u n -- - - - - - - - - - -- -- Deflection of starlight by the Sun. -- -- Given: -- p double[3] direction from observer to star (unit vector) -- e double[3] direction from Sun to observer (unit vector) -- em double distance from Sun to observer (au) -- -- Returned: -- p1 double[3] observer to deflected star (unit vector) -- -- Notes: -- -- 1) The source is presumed to be sufficiently distant that its -- directions seen from the Sun and the observer are essentially -- the same. -- -- 2) The deflection is restrained when the angle between the star and -- the center of the Sun is less than a threshold value, falling to -- zero deflection for zero separation. The chosen threshold value -- is within the solar limb for all solar-system applications, and -- is about 5 arcminutes for the case of a terrestrial observer. -- -- 3) The arguments p and p1 can be the same array. -- -- Called: -- eraLd light deflection by a solar-system body -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p1 = ufunc.ldsun(p, e, em) -- return p1 -- -- --def pmpx(rc, dc, pr, pd, px, rv, pmt, pob): -- """ -- Wrapper for ERFA function ``eraPmpx``. -- -- Parameters -- ---------- -- rc : double array -- dc : double array -- pr : double array -- pd : double array -- px : double array -- rv : double array -- pmt : double array -- pob : double array -- -- Returns -- ------- -- pco : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P m p x -- - - - - - - - - -- -- Proper motion and parallax. -- -- Given: -- rc,dc double ICRS RA,Dec at catalog epoch (radians) -- pr double RA proper motion (radians/year; Note 1) -- pd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, +ve if receding) -- pmt double proper motion time interval (SSB, Julian years) -- pob double[3] SSB to observer vector (au) -- -- Returned: -- pco double[3] coordinate direction (BCRS unit vector) -- -- Notes: -- -- 1) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- 2) The proper motion time interval is for when the starlight -- reaches the solar system barycenter. -- -- 3) To avoid the need for iteration, the Roemer effect (i.e. the -- small annual modulation of the proper motion coming from the -- changing light time) is applied approximately, using the -- direction of the star at the catalog epoch. -- -- References: -- -- 1984 Astronomical Almanac, pp B39-B41. -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013), Section 7.2. -- -- Called: -- eraPdp scalar product of two p-vectors -- eraPn decompose p-vector into modulus and direction -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pco = ufunc.pmpx(rc, dc, pr, pd, px, rv, pmt, pob) -- return pco -- -- --def pmsafe(ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b): -- """ -- Wrapper for ERFA function ``eraPmsafe``. -- -- Parameters -- ---------- -- ra1 : double array -- dec1 : double array -- pmr1 : double array -- pmd1 : double array -- px1 : double array -- rv1 : double array -- ep1a : double array -- ep1b : double array -- ep2a : double array -- ep2b : double array -- -- Returns -- ------- -- ra2 : double array -- dec2 : double array -- pmr2 : double array -- pmd2 : double array -- px2 : double array -- rv2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P m s a f e -- - - - - - - - - - - -- -- Star proper motion: update star catalog data for space motion, with -- special handling to handle the zero parallax case. -- -- Given: -- ra1 double right ascension (radians), before -- dec1 double declination (radians), before -- pmr1 double RA proper motion (radians/year), before -- pmd1 double Dec proper motion (radians/year), before -- px1 double parallax (arcseconds), before -- rv1 double radial velocity (km/s, +ve = receding), before -- ep1a double "before" epoch, part A (Note 1) -- ep1b double "before" epoch, part B (Note 1) -- ep2a double "after" epoch, part A (Note 1) -- ep2b double "after" epoch, part B (Note 1) -- -- Returned: -- ra2 double right ascension (radians), after -- dec2 double declination (radians), after -- pmr2 double RA proper motion (radians/year), after -- pmd2 double Dec proper motion (radians/year), after -- px2 double parallax (arcseconds), after -- rv2 double radial velocity (km/s, +ve = receding), after -- -- Returned (function value): -- int status: -- -1 = system error (should not occur) -- 0 = no warnings or errors -- 1 = distance overridden (Note 6) -- 2 = excessive velocity (Note 7) -- 4 = solution didn't converge (Note 8) -- else = binary logical OR of the above warnings -- -- Notes: -- -- 1) The starting and ending TDB epochs ep1a+ep1b and ep2a+ep2b are -- Julian Dates, apportioned in any convenient way between the two -- parts (A and B). For example, JD(TDB)=2450123.7 could be -- expressed in any of these ways, among others: -- -- epNa epNb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. -- -- 2) In accordance with normal star-catalog conventions, the object's -- right ascension and declination are freed from the effects of -- secular aberration. The frame, which is aligned to the catalog -- equator and equinox, is Lorentzian and centered on the SSB. -- -- The proper motions are the rate of change of the right ascension -- and declination at the catalog epoch and are in radians per TDB -- Julian year. -- -- The parallax and radial velocity are in the same frame. -- -- 3) Care is needed with units. The star coordinates are in radians -- and the proper motions in radians per Julian year, but the -- parallax is in arcseconds. -- -- 4) The RA proper motion is in terms of coordinate angle, not true -- angle. If the catalog uses arcseconds for both RA and Dec proper -- motions, the RA proper motion will need to be divided by cos(Dec) -- before use. -- -- 5) Straight-line motion at constant speed, in the inertial frame, is -- assumed. -- -- 6) An extremely small (or zero or negative) parallax is overridden -- to ensure that the object is at a finite but very large distance, -- but not so large that the proper motion is equivalent to a large -- but safe speed (about 0.1c using the chosen constant). A warning -- status of 1 is added to the status if this action has been taken. -- -- 7) If the space velocity is a significant fraction of c (see the -- constant VMAX in the function eraStarpv), it is arbitrarily set -- to zero. When this action occurs, 2 is added to the status. -- -- 8) The relativistic adjustment carried out in the eraStarpv function -- involves an iterative calculation. If the process fails to -- converge within a set number of iterations, 4 is added to the -- status. -- -- Called: -- eraSeps angle between two points -- eraStarpm update star catalog data for space motion -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ra2, dec2, pmr2, pmd2, px2, rv2, c_retval = ufunc.pmsafe(ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b) -- check_errwarn(c_retval, 'pmsafe') -- return ra2, dec2, pmr2, pmd2, px2, rv2 -- -- --STATUS_CODES['pmsafe'] = {-1: 'system error (should not occur)', 0: 'no warnings or errors', 1: 'distance overridden (Note 6)', 2: 'excessive velocity (Note 7)', 4: "solution didn't converge (Note 8)", 'else': 'binary logical OR of the above warnings'} -- -- --def pvtob(elong, phi, hm, xp, yp, sp, theta): -- """ -- Wrapper for ERFA function ``eraPvtob``. -- -- Parameters -- ---------- -- elong : double array -- phi : double array -- hm : double array -- xp : double array -- yp : double array -- sp : double array -- theta : double array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v t o b -- - - - - - - - - - -- -- Position and velocity of a terrestrial observing station. -- -- Given: -- elong double longitude (radians, east +ve, Note 1) -- phi double latitude (geodetic, radians, Note 1) -- hm double height above ref. ellipsoid (geodetic, m) -- xp,yp double coordinates of the pole (radians, Note 2) -- sp double the TIO locator s' (radians, Note 2) -- theta double Earth rotation angle (radians, Note 3) -- -- Returned: -- pv double[2][3] position/velocity vector (m, m/s, CIRS) -- -- Notes: -- -- 1) The terrestrial coordinates are with respect to the ERFA_WGS84 -- reference ellipsoid. -- -- 2) xp and yp are the coordinates (in radians) of the Celestial -- Intermediate Pole with respect to the International Terrestrial -- Reference System (see IERS Conventions), measured along the -- meridians 0 and 90 deg west respectively. sp is the TIO locator -- s', in radians, which positions the Terrestrial Intermediate -- Origin on the equator. For many applications, xp, yp and -- (especially) sp can be set to zero. -- -- 3) If theta is Greenwich apparent sidereal time instead of Earth -- rotation angle, the result is with respect to the true equator -- and equinox of date, i.e. with the x-axis at the equinox rather -- than the celestial intermediate origin. -- -- 4) The velocity units are meters per UT1 second, not per SI second. -- This is unlikely to have any practical consequences in the modern -- era. -- -- 5) No validation is performed on the arguments. Error cases that -- could lead to arithmetic exceptions are trapped by the eraGd2gc -- function, and the result set to zeros. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to -- the Astronomical Almanac, 3rd ed., University Science Books -- (2013), Section 7.4.3.3. -- -- Called: -- eraGd2gc geodetic to geocentric transformation -- eraPom00 polar motion matrix -- eraTrxp product of transpose of r-matrix and p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv = ufunc.pvtob(elong, phi, hm, xp, yp, sp, theta) -- return pv -- -- --def refco(phpa, tc, rh, wl): -- """ -- Wrapper for ERFA function ``eraRefco``. -- -- Parameters -- ---------- -- phpa : double array -- tc : double array -- rh : double array -- wl : double array -- -- Returns -- ------- -- refa : double array -- refb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a R e f c o -- - - - - - - - - - -- -- Determine the constants A and B in the atmospheric refraction model -- dZ = A tan Z + B tan^3 Z. -- -- Z is the "observed" zenith distance (i.e. affected by refraction) -- and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo) -- zenith distance. -- -- Given: -- phpa double pressure at the observer (hPa = millibar) -- tc double ambient temperature at the observer (deg C) -- rh double relative humidity at the observer (range 0-1) -- wl double wavelength (micrometers) -- -- Returned: -- refa double* tan Z coefficient (radians) -- refb double* tan^3 Z coefficient (radians) -- -- Notes: -- -- 1) The model balances speed and accuracy to give good results in -- applications where performance at low altitudes is not paramount. -- Performance is maintained across a range of conditions, and -- applies to both optical/IR and radio. -- -- 2) The model omits the effects of (i) height above sea level (apart -- from the reduced pressure itself), (ii) latitude (i.e. the -- flattening of the Earth), (iii) variations in tropospheric lapse -- rate and (iv) dispersive effects in the radio. -- -- The model was tested using the following range of conditions: -- -- lapse rates 0.0055, 0.0065, 0.0075 deg/meter -- latitudes 0, 25, 50, 75 degrees -- heights 0, 2500, 5000 meters ASL -- pressures mean for height -10% to +5% in steps of 5% -- temperatures -10 deg to +20 deg with respect to 280 deg at SL -- relative humidity 0, 0.5, 1 -- wavelengths 0.4, 0.6, ... 2 micron, + radio -- zenith distances 15, 45, 75 degrees -- -- The accuracy with respect to raytracing through a model -- atmosphere was as follows: -- -- worst RMS -- -- optical/IR 62 mas 8 mas -- radio 319 mas 49 mas -- -- For this particular set of conditions: -- -- lapse rate 0.0065 K/meter -- latitude 50 degrees -- sea level -- pressure 1005 mb -- temperature 280.15 K -- humidity 80% -- wavelength 5740 Angstroms -- -- the results were as follows: -- -- ZD raytrace eraRefco Saastamoinen -- -- 10 10.27 10.27 10.27 -- 20 21.19 21.20 21.19 -- 30 33.61 33.61 33.60 -- 40 48.82 48.83 48.81 -- 45 58.16 58.18 58.16 -- 50 69.28 69.30 69.27 -- 55 82.97 82.99 82.95 -- 60 100.51 100.54 100.50 -- 65 124.23 124.26 124.20 -- 70 158.63 158.68 158.61 -- 72 177.32 177.37 177.31 -- 74 200.35 200.38 200.32 -- 76 229.45 229.43 229.42 -- 78 267.44 267.29 267.41 -- 80 319.13 318.55 319.10 -- -- deg arcsec arcsec arcsec -- -- The values for Saastamoinen's formula (which includes terms -- up to tan^5) are taken from Hohenkerk and Sinclair (1985). -- -- 3) A wl value in the range 0-100 selects the optical/IR case and is -- wavelength in micrometers. Any value outside this range selects -- the radio case. -- -- 4) Outlandish input parameters are silently limited to -- mathematically safe values. Zero pressure is permissible, and -- causes zeroes to be returned. -- -- 5) The algorithm draws on several sources, as follows: -- -- a) The formula for the saturation vapour pressure of water as -- a function of temperature and temperature is taken from -- Equations (A4.5-A4.7) of Gill (1982). -- -- b) The formula for the water vapour pressure, given the -- saturation pressure and the relative humidity, is from -- Crane (1976), Equation (2.5.5). -- -- c) The refractivity of air is a function of temperature, -- total pressure, water-vapour pressure and, in the case -- of optical/IR, wavelength. The formulae for the two cases are -- developed from Hohenkerk & Sinclair (1985) and Rueger (2002). -- -- d) The formula for beta, the ratio of the scale height of the -- atmosphere to the geocentric distance of the observer, is -- an adaption of Equation (9) from Stone (1996). The -- adaptations, arrived at empirically, consist of (i) a small -- adjustment to the coefficient and (ii) a humidity term for the -- radio case only. -- -- e) The formulae for the refraction constants as a function of -- n-1 and beta are from Green (1987), Equation (4.31). -- -- References: -- -- Crane, R.K., Meeks, M.L. (ed), "Refraction Effects in the Neutral -- Atmosphere", Methods of Experimental Physics: Astrophysics 12B, -- Academic Press, 1976. -- -- Gill, Adrian E., "Atmosphere-Ocean Dynamics", Academic Press, -- 1982. -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987. -- -- Hohenkerk, C.Y., & Sinclair, A.T., NAO Technical Note No. 63, -- 1985. -- -- Rueger, J.M., "Refractive Index Formulae for Electronic Distance -- Measurement with Radio and Millimetre Waves", in Unisurv Report -- S-68, School of Surveying and Spatial Information Systems, -- University of New South Wales, Sydney, Australia, 2002. -- -- Stone, Ronald C., P.A.S.P. 108, 1051-1058, 1996. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- refa, refb = ufunc.refco(phpa, tc, rh, wl) -- return refa, refb -- -- --def epv00(date1, date2): -- """ -- Wrapper for ERFA function ``eraEpv00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- pvh : double array -- pvb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E p v 0 0 -- - - - - - - - - - -- -- Earth position and velocity, heliocentric and barycentric, with -- respect to the Barycentric Celestial Reference System. -- -- Given: -- date1,date2 double TDB date (Note 1) -- -- Returned: -- pvh double[2][3] heliocentric Earth position/velocity -- pvb double[2][3] barycentric Earth position/velocity -- -- Returned (function value): -- int status: 0 = OK -- +1 = warning: date outside -- the range 1900-2100 AD -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, among -- others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. However, -- the accuracy of the result is more likely to be limited by the -- algorithm itself than the way the date has been expressed. -- -- n.b. TT can be used instead of TDB in most applications. -- -- 2) On return, the arrays pvh and pvb contain the following: -- -- pvh[0][0] x } -- pvh[0][1] y } heliocentric position, au -- pvh[0][2] z } -- -- pvh[1][0] xdot } -- pvh[1][1] ydot } heliocentric velocity, au/d -- pvh[1][2] zdot } -- -- pvb[0][0] x } -- pvb[0][1] y } barycentric position, au -- pvb[0][2] z } -- -- pvb[1][0] xdot } -- pvb[1][1] ydot } barycentric velocity, au/d -- pvb[1][2] zdot } -- -- The vectors are with respect to the Barycentric Celestial -- Reference System. The time unit is one day in TDB. -- -- 3) The function is a SIMPLIFIED SOLUTION from the planetary theory -- VSOP2000 (X. Moisson, P. Bretagnon, 2001, Celes. Mechanics & -- Dyn. Astron., 80, 3/4, 205-213) and is an adaptation of original -- Fortran code supplied by P. Bretagnon (private comm., 2000). -- -- 4) Comparisons over the time span 1900-2100 with this simplified -- solution and the JPL DE405 ephemeris give the following results: -- -- RMS max -- Heliocentric: -- position error 3.7 11.2 km -- velocity error 1.4 5.0 mm/s -- -- Barycentric: -- position error 4.6 13.4 km -- velocity error 1.4 4.9 mm/s -- -- Comparisons with the JPL DE406 ephemeris show that by 1800 and -- 2200 the position errors are approximately double their 1900-2100 -- size. By 1500 and 2500 the deterioration is a factor of 10 and -- by 1000 and 3000 a factor of 60. The velocity accuracy falls off -- at about half that rate. -- -- 5) It is permissible to use the same array for pvh and pvb, which -- will receive the barycentric values. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pvh, pvb, c_retval = ufunc.epv00(date1, date2) -- check_errwarn(c_retval, 'epv00') -- return pvh, pvb -- -- --STATUS_CODES['epv00'] = {0: 'OK', 1: 'warning: date outsidethe range 1900-2100 AD'} -- -- --def plan94(date1, date2, np): -- """ -- Wrapper for ERFA function ``eraPlan94``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- np : int array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P l a n 9 4 -- - - - - - - - - - - -- -- Approximate heliocentric position and velocity of a nominated major -- planet: Mercury, Venus, EMB, Mars, Jupiter, Saturn, Uranus or -- Neptune (but not the Earth itself). -- -- Given: -- date1 double TDB date part A (Note 1) -- date2 double TDB date part B (Note 1) -- np int planet (1=Mercury, 2=Venus, 3=EMB, 4=Mars, -- 5=Jupiter, 6=Saturn, 7=Uranus, 8=Neptune) -- -- Returned (argument): -- pv double[2][3] planet p,v (heliocentric, J2000.0, au,au/d) -- -- Returned (function value): -- int status: -1 = illegal NP (outside 1-8) -- 0 = OK -- +1 = warning: year outside 1000-3000 -- +2 = warning: failed to converge -- -- Notes: -- -- 1) The date date1+date2 is in the TDB time scale (in practice TT can -- be used) and is a Julian Date, apportioned in any convenient way -- between the two arguments. For example, JD(TDB)=2450123.7 could -- be expressed in any of these ways, among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- resolution. The MJD method and the date & time methods are both -- good compromises between resolution and convenience. The limited -- accuracy of the present algorithm is such that any of the methods -- is satisfactory. -- -- 2) If an np value outside the range 1-8 is supplied, an error status -- (function value -1) is returned and the pv vector set to zeroes. -- -- 3) For np=3 the result is for the Earth-Moon Barycenter. To obtain -- the heliocentric position and velocity of the Earth, use instead -- the ERFA function eraEpv00. -- -- 4) On successful return, the array pv contains the following: -- -- pv[0][0] x } -- pv[0][1] y } heliocentric position, au -- pv[0][2] z } -- -- pv[1][0] xdot } -- pv[1][1] ydot } heliocentric velocity, au/d -- pv[1][2] zdot } -- -- The reference frame is equatorial and is with respect to the -- mean equator and equinox of epoch J2000.0. -- -- 5) The algorithm is due to J.L. Simon, P. Bretagnon, J. Chapront, -- M. Chapront-Touze, G. Francou and J. Laskar (Bureau des -- Longitudes, Paris, France). From comparisons with JPL -- ephemeris DE102, they quote the following maximum errors -- over the interval 1800-2050: -- -- L (arcsec) B (arcsec) R (km) -- -- Mercury 4 1 300 -- Venus 5 1 800 -- EMB 6 1 1000 -- Mars 17 1 7700 -- Jupiter 71 5 76000 -- Saturn 81 13 267000 -- Uranus 86 7 712000 -- Neptune 11 1 253000 -- -- Over the interval 1000-3000, they report that the accuracy is no -- worse than 1.5 times that over 1800-2050. Outside 1000-3000 the -- accuracy declines. -- -- Comparisons of the present function with the JPL DE200 ephemeris -- give the following RMS errors over the interval 1960-2025: -- -- position (km) velocity (m/s) -- -- Mercury 334 0.437 -- Venus 1060 0.855 -- EMB 2010 0.815 -- Mars 7690 1.98 -- Jupiter 71700 7.70 -- Saturn 199000 19.4 -- Uranus 564000 16.4 -- Neptune 158000 14.4 -- -- Comparisons against DE200 over the interval 1800-2100 gave the -- following maximum absolute differences. (The results using -- DE406 were essentially the same.) -- -- L (arcsec) B (arcsec) R (km) Rdot (m/s) -- -- Mercury 7 1 500 0.7 -- Venus 7 1 1100 0.9 -- EMB 9 1 1300 1.0 -- Mars 26 1 9000 2.5 -- Jupiter 78 6 82000 8.2 -- Saturn 87 14 263000 24.6 -- Uranus 86 7 661000 27.4 -- Neptune 11 2 248000 21.4 -- -- 6) The present ERFA re-implementation of the original Simon et al. -- Fortran code differs from the original in the following respects: -- -- * C instead of Fortran. -- -- * The date is supplied in two parts. -- -- * The result is returned only in equatorial Cartesian form; -- the ecliptic longitude, latitude and radius vector are not -- returned. -- -- * The result is in the J2000.0 equatorial frame, not ecliptic. -- -- * More is done in-line: there are fewer calls to subroutines. -- -- * Different error/warning status values are used. -- -- * A different Kepler's-equation-solver is used (avoiding -- use of double precision complex). -- -- * Polynomials in t are nested to minimize rounding errors. -- -- * Explicit double constants are used to avoid mixed-mode -- expressions. -- -- None of the above changes affects the result significantly. -- -- 7) The returned status indicates the most serious condition -- encountered during execution of the function. Illegal np is -- considered the most serious, overriding failure to converge, -- which in turn takes precedence over the remote date warning. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- -- Reference: Simon, J.L, Bretagnon, P., Chapront, J., -- Chapront-Touze, M., Francou, G., and Laskar, J., -- Astron.Astrophys., 282, 663 (1994). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv, c_retval = ufunc.plan94(date1, date2, np) -- check_errwarn(c_retval, 'plan94') -- return pv -- -- --STATUS_CODES['plan94'] = {-1: 'illegal NP (outside 1-8)', 0: 'OK', 1: 'warning: year outside 1000-3000', 2: 'warning: failed to converge'} -- -- --def fad03(t): -- """ -- Wrapper for ERFA function ``eraFad03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F a d 0 3 -- - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean elongation of the Moon from the Sun. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double D, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fad03(t) -- return c_retval -- -- --def fae03(t): -- """ -- Wrapper for ERFA function ``eraFae03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F a e 0 3 -- - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Earth. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Earth, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fae03(t) -- return c_retval -- -- --def faf03(t): -- """ -- Wrapper for ERFA function ``eraFaf03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F a f 0 3 -- - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of the Moon minus mean longitude of the ascending -- node. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double F, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.faf03(t) -- return c_retval -- -- --def faju03(t): -- """ -- Wrapper for ERFA function ``eraFaju03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a j u 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Jupiter. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Jupiter, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.faju03(t) -- return c_retval -- -- --def fal03(t): -- """ -- Wrapper for ERFA function ``eraFal03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F a l 0 3 -- - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean anomaly of the Moon. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double l, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fal03(t) -- return c_retval -- -- --def falp03(t): -- """ -- Wrapper for ERFA function ``eraFalp03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a l p 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean anomaly of the Sun. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double l', radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.falp03(t) -- return c_retval -- -- --def fama03(t): -- """ -- Wrapper for ERFA function ``eraFama03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a m a 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Mars. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Mars, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fama03(t) -- return c_retval -- -- --def fame03(t): -- """ -- Wrapper for ERFA function ``eraFame03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a m e 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Mercury. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Mercury, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fame03(t) -- return c_retval -- -- --def fane03(t): -- """ -- Wrapper for ERFA function ``eraFane03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a n e 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Neptune. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Neptune, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is adapted from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fane03(t) -- return c_retval -- -- --def faom03(t): -- """ -- Wrapper for ERFA function ``eraFaom03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a o m 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of the Moon's ascending node. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double Omega, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.faom03(t) -- return c_retval -- -- --def fapa03(t): -- """ -- Wrapper for ERFA function ``eraFapa03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a p a 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- general accumulated precession in longitude. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double general precession in longitude, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003). It -- is taken from Kinoshita & Souchay (1990) and comes originally -- from Lieske et al. (1977). -- -- References: -- -- Kinoshita, H. and Souchay J. 1990, Celest.Mech. and Dyn.Astron. -- 48, 187 -- -- Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, -- Astron.Astrophys. 58, 1-16 -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fapa03(t) -- return c_retval -- -- --def fasa03(t): -- """ -- Wrapper for ERFA function ``eraFasa03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a s a 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Saturn. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Saturn, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fasa03(t) -- return c_retval -- -- --def faur03(t): -- """ -- Wrapper for ERFA function ``eraFaur03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a u r 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Uranus. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Uranus, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- is adapted from Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.faur03(t) -- return c_retval -- -- --def fave03(t): -- """ -- Wrapper for ERFA function ``eraFave03``. -- -- Parameters -- ---------- -- t : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F a v e 0 3 -- - - - - - - - - - - -- -- Fundamental argument, IERS Conventions (2003): -- mean longitude of Venus. -- -- Given: -- t double TDB, Julian centuries since J2000.0 (Note 1) -- -- Returned (function value): -- double mean longitude of Venus, radians (Note 2) -- -- Notes: -- -- 1) Though t is strictly TDB, it is usually more convenient to use -- TT, which makes no significant difference. -- -- 2) The expression used is as adopted in IERS Conventions (2003) and -- comes from Souchay et al. (1999) after Simon et al. (1994). -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.fave03(t) -- return c_retval -- -- --def bi00(): -- """ -- Wrapper for ERFA function ``eraBi00``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- dpsibi : double array -- depsbi : double array -- dra : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a B i 0 0 -- - - - - - - - - -- -- Frame bias components of IAU 2000 precession-nutation models (part -- of MHB2000 with additions). -- -- Returned: -- dpsibi,depsbi double longitude and obliquity corrections -- dra double the ICRS RA of the J2000.0 mean equinox -- -- Notes: -- -- 1) The frame bias corrections in longitude and obliquity (radians) -- are required in order to correct for the offset between the GCRS -- pole and the mean J2000.0 pole. They define, with respect to the -- GCRS frame, a J2000.0 mean pole that is consistent with the rest -- of the IAU 2000A precession-nutation model. -- -- 2) In addition to the displacement of the pole, the complete -- description of the frame bias requires also an offset in right -- ascension. This is not part of the IAU 2000A model, and is from -- Chapront et al. (2002). It is returned in radians. -- -- 3) This is a supplemented implementation of one aspect of the IAU -- 2000A nutation model, formally adopted by the IAU General -- Assembly in 2000, namely MHB2000 (Mathews et al. 2002). -- -- References: -- -- Chapront, J., Chapront-Touze, M. & Francou, G., Astron. -- Astrophys., 387, 700, 2002. -- -- Mathews, P.M., Herring, T.A., Buffet, B.A., "Modeling of nutation -- and precession New nutation series for nonrigid Earth and -- insights into the Earth's interior", J.Geophys.Res., 107, B4, -- 2002. The MHB2000 code itself was obtained on 9th September 2002 -- from ftp://maia.usno.navy.mil/conv2000/chapter5/IAU2000A. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsibi, depsbi, dra = ufunc.bi00() -- return dpsibi, depsbi, dra -- -- --def bp00(date1, date2): -- """ -- Wrapper for ERFA function ``eraBp00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rb : double array -- rp : double array -- rbp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a B p 0 0 -- - - - - - - - - -- -- Frame bias and precession, IAU 2000. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rb double[3][3] frame bias matrix (Note 2) -- rp double[3][3] precession matrix (Note 3) -- rbp double[3][3] bias-precession matrix (Note 4) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rb transforms vectors from GCRS to mean J2000.0 by -- applying frame bias. -- -- 3) The matrix rp transforms vectors from J2000.0 mean equator and -- equinox to mean equator and equinox of date by applying -- precession. -- -- 4) The matrix rbp transforms vectors from GCRS to mean equator and -- equinox of date by applying frame bias then precession. It is -- the product rp x rb. -- -- 5) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the order given. -- -- Called: -- eraBi00 frame bias components, IAU 2000 -- eraPr00 IAU 2000 precession adjustments -- eraIr initialize r-matrix to identity -- eraRx rotate around X-axis -- eraRy rotate around Y-axis -- eraRz rotate around Z-axis -- eraCr copy r-matrix -- eraRxr product of two r-matrices -- -- Reference: -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rb, rp, rbp = ufunc.bp00(date1, date2) -- return rb, rp, rbp -- -- --def bp06(date1, date2): -- """ -- Wrapper for ERFA function ``eraBp06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rb : double array -- rp : double array -- rbp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a B p 0 6 -- - - - - - - - - -- -- Frame bias and precession, IAU 2006. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rb double[3][3] frame bias matrix (Note 2) -- rp double[3][3] precession matrix (Note 3) -- rbp double[3][3] bias-precession matrix (Note 4) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rb transforms vectors from GCRS to mean J2000.0 by -- applying frame bias. -- -- 3) The matrix rp transforms vectors from mean J2000.0 to mean of -- date by applying precession. -- -- 4) The matrix rbp transforms vectors from GCRS to mean of date by -- applying frame bias then precession. It is the product rp x rb. -- -- 5) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the order given. -- -- Called: -- eraPfw06 bias-precession F-W angles, IAU 2006 -- eraFw2m F-W angles to r-matrix -- eraPmat06 PB matrix, IAU 2006 -- eraTr transpose r-matrix -- eraRxr product of two r-matrices -- eraCr copy r-matrix -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rb, rp, rbp = ufunc.bp06(date1, date2) -- return rb, rp, rbp -- -- --def bpn2xy(rbpn): -- """ -- Wrapper for ERFA function ``eraBpn2xy``. -- -- Parameters -- ---------- -- rbpn : double array -- -- Returns -- ------- -- x : double array -- y : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a B p n 2 x y -- - - - - - - - - - - -- -- Extract from the bias-precession-nutation matrix the X,Y coordinates -- of the Celestial Intermediate Pole. -- -- Given: -- rbpn double[3][3] celestial-to-true matrix (Note 1) -- -- Returned: -- x,y double Celestial Intermediate Pole (Note 2) -- -- Notes: -- -- 1) The matrix rbpn transforms vectors from GCRS to true equator (and -- CIO or equinox) of date, and therefore the Celestial Intermediate -- Pole unit vector is the bottom row of the matrix. -- -- 2) The arguments x,y are components of the Celestial Intermediate -- Pole unit vector in the Geocentric Celestial Reference System. -- -- Reference: -- -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 -- (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y = ufunc.bpn2xy(rbpn) -- return x, y -- -- --def c2i00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraC2i00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 i 0 0 a -- - - - - - - - - - - -- -- Form the celestial-to-intermediate matrix for a given date using the -- IAU 2000A precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- 3) A faster, but slightly less accurate result (about 1 mas), can be -- obtained by using instead the eraC2i00b function. -- -- Called: -- eraPnm00a classical NPB matrix, IAU 2000A -- eraC2ibpn celestial-to-intermediate matrix, given NPB matrix -- -- References: -- -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 -- (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2i00a(date1, date2) -- return rc2i -- -- --def c2i00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraC2i00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 i 0 0 b -- - - - - - - - - - - -- -- Form the celestial-to-intermediate matrix for a given date using the -- IAU 2000B precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- 3) The present function is faster, but slightly less accurate (about -- 1 mas), than the eraC2i00a function. -- -- Called: -- eraPnm00b classical NPB matrix, IAU 2000B -- eraC2ibpn celestial-to-intermediate matrix, given NPB matrix -- -- References: -- -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 -- (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2i00b(date1, date2) -- return rc2i -- -- --def c2i06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraC2i06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 i 0 6 a -- - - - - - - - - - - -- -- Form the celestial-to-intermediate matrix for a given date using the -- IAU 2006 precession and IAU 2000A nutation models. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = RC2T * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- Called: -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- eraC2ixys celestial-to-intermediate matrix, given X,Y and s -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2i06a(date1, date2) -- return rc2i -- -- --def c2ibpn(date1, date2, rbpn): -- """ -- Wrapper for ERFA function ``eraC2ibpn``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- rbpn : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 i b p n -- - - - - - - - - - - -- -- Form the celestial-to-intermediate matrix for a given date given -- the bias-precession-nutation matrix. IAU 2000. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- rbpn double[3][3] celestial-to-true matrix (Note 2) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 3) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix rbpn transforms vectors from GCRS to true equator (and -- CIO or equinox) of date. Only the CIP (bottom row) is used. -- -- 3) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = RC2T * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- 4) Although its name does not include "00", This function is in fact -- specific to the IAU 2000 models. -- -- Called: -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraC2ixy celestial-to-intermediate matrix, given X,Y -- -- References: -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2ibpn(date1, date2, rbpn) -- return rc2i -- -- --def c2ixy(date1, date2, x, y): -- """ -- Wrapper for ERFA function ``eraC2ixy``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- x : double array -- y : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a C 2 i x y -- - - - - - - - - - -- -- Form the celestial to intermediate-frame-of-date matrix for a given -- date when the CIP X,Y coordinates are known. IAU 2000. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- x,y double Celestial Intermediate Pole (Note 2) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 3) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The Celestial Intermediate Pole coordinates are the x,y components -- of the unit vector in the Geocentric Celestial Reference System. -- -- 3) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = RC2T * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- 4) Although its name does not include "00", This function is in fact -- specific to the IAU 2000 models. -- -- Called: -- eraC2ixys celestial-to-intermediate matrix, given X,Y and s -- eraS00 the CIO locator s, given X,Y, IAU 2000A -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2ixy(date1, date2, x, y) -- return rc2i -- -- --def c2ixys(x, y, s): -- """ -- Wrapper for ERFA function ``eraC2ixys``. -- -- Parameters -- ---------- -- x : double array -- y : double array -- s : double array -- -- Returns -- ------- -- rc2i : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 i x y s -- - - - - - - - - - - -- -- Form the celestial to intermediate-frame-of-date matrix given the CIP -- X,Y and the CIO locator s. -- -- Given: -- x,y double Celestial Intermediate Pole (Note 1) -- s double the CIO locator s (Note 2) -- -- Returned: -- rc2i double[3][3] celestial-to-intermediate matrix (Note 3) -- -- Notes: -- -- 1) The Celestial Intermediate Pole coordinates are the x,y -- components of the unit vector in the Geocentric Celestial -- Reference System. -- -- 2) The CIO locator s (in radians) positions the Celestial -- Intermediate Origin on the equator of the CIP. -- -- 3) The matrix rc2i is the first stage in the transformation from -- celestial to terrestrial coordinates: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = RC2T * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- Called: -- eraIr initialize r-matrix to identity -- eraRz rotate around Z-axis -- eraRy rotate around Y-axis -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2i = ufunc.c2ixys(x, y, s) -- return rc2i -- -- --def c2t00a(tta, ttb, uta, utb, xp, yp): -- """ -- Wrapper for ERFA function ``eraC2t00a``. -- -- Parameters -- ---------- -- tta : double array -- ttb : double array -- uta : double array -- utb : double array -- xp : double array -- yp : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 t 0 0 a -- - - - - - - - - - - -- -- Form the celestial to terrestrial matrix given the date, the UT1 and -- the polar motion, using the IAU 2000A nutation model. -- -- Given: -- tta,ttb double TT as a 2-part Julian Date (Note 1) -- uta,utb double UT1 as a 2-part Julian Date (Note 1) -- xp,yp double coordinates of the pole (radians, Note 2) -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 3) -- -- Notes: -- -- 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, -- apportioned in any convenient way between the arguments uta and -- utb. For example, JD(UT1)=2450123.7 could be expressed in any of -- these ways, among others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. In the case of uta,utb, the -- date & time method is best matched to the Earth rotation angle -- algorithm used: maximum precision is delivered when the uta -- argument is for 0hrs UT1 on the day in question and the utb -- argument lies in the range 0 to 1, or vice versa. -- -- 2) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 3) The matrix rc2t transforms from celestial to terrestrial -- coordinates: -- -- [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), RC2I is the -- celestial-to-intermediate matrix, ERA is the Earth rotation -- angle and RPOM is the polar motion matrix. -- -- 4) A faster, but slightly less accurate result (about 1 mas), can -- be obtained by using instead the eraC2t00b function. -- -- Called: -- eraC2i00a celestial-to-intermediate matrix, IAU 2000A -- eraEra00 Earth rotation angle, IAU 2000 -- eraSp00 the TIO locator s', IERS 2000 -- eraPom00 polar motion matrix -- eraC2tcio form CIO-based celestial-to-terrestrial matrix -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2t00a(tta, ttb, uta, utb, xp, yp) -- return rc2t -- -- --def c2t00b(tta, ttb, uta, utb, xp, yp): -- """ -- Wrapper for ERFA function ``eraC2t00b``. -- -- Parameters -- ---------- -- tta : double array -- ttb : double array -- uta : double array -- utb : double array -- xp : double array -- yp : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 t 0 0 b -- - - - - - - - - - - -- -- Form the celestial to terrestrial matrix given the date, the UT1 and -- the polar motion, using the IAU 2000B nutation model. -- -- Given: -- tta,ttb double TT as a 2-part Julian Date (Note 1) -- uta,utb double UT1 as a 2-part Julian Date (Note 1) -- xp,yp double coordinates of the pole (radians, Note 2) -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 3) -- -- Notes: -- -- 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, -- apportioned in any convenient way between the arguments uta and -- utb. For example, JD(UT1)=2450123.7 could be expressed in any of -- these ways, among others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. In the case of uta,utb, the -- date & time method is best matched to the Earth rotation angle -- algorithm used: maximum precision is delivered when the uta -- argument is for 0hrs UT1 on the day in question and the utb -- argument lies in the range 0 to 1, or vice versa. -- -- 2) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 3) The matrix rc2t transforms from celestial to terrestrial -- coordinates: -- -- [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), RC2I is the -- celestial-to-intermediate matrix, ERA is the Earth rotation -- angle and RPOM is the polar motion matrix. -- -- 4) The present function is faster, but slightly less accurate (about -- 1 mas), than the eraC2t00a function. -- -- Called: -- eraC2i00b celestial-to-intermediate matrix, IAU 2000B -- eraEra00 Earth rotation angle, IAU 2000 -- eraPom00 polar motion matrix -- eraC2tcio form CIO-based celestial-to-terrestrial matrix -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2t00b(tta, ttb, uta, utb, xp, yp) -- return rc2t -- -- --def c2t06a(tta, ttb, uta, utb, xp, yp): -- """ -- Wrapper for ERFA function ``eraC2t06a``. -- -- Parameters -- ---------- -- tta : double array -- ttb : double array -- uta : double array -- utb : double array -- xp : double array -- yp : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 t 0 6 a -- - - - - - - - - - - -- -- Form the celestial to terrestrial matrix given the date, the UT1 and -- the polar motion, using the IAU 2006 precession and IAU 2000A -- nutation models. -- -- Given: -- tta,ttb double TT as a 2-part Julian Date (Note 1) -- uta,utb double UT1 as a 2-part Julian Date (Note 1) -- xp,yp double coordinates of the pole (radians, Note 2) -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 3) -- -- Notes: -- -- 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, -- apportioned in any convenient way between the arguments uta and -- utb. For example, JD(UT1)=2450123.7 could be expressed in any of -- these ways, among others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. In the case of uta,utb, the -- date & time method is best matched to the Earth rotation angle -- algorithm used: maximum precision is delivered when the uta -- argument is for 0hrs UT1 on the day in question and the utb -- argument lies in the range 0 to 1, or vice versa. -- -- 2) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 3) The matrix rc2t transforms from celestial to terrestrial -- coordinates: -- -- [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), RC2I is the -- celestial-to-intermediate matrix, ERA is the Earth rotation -- angle and RPOM is the polar motion matrix. -- -- Called: -- eraC2i06a celestial-to-intermediate matrix, IAU 2006/2000A -- eraEra00 Earth rotation angle, IAU 2000 -- eraSp00 the TIO locator s', IERS 2000 -- eraPom00 polar motion matrix -- eraC2tcio form CIO-based celestial-to-terrestrial matrix -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2t06a(tta, ttb, uta, utb, xp, yp) -- return rc2t -- -- --def c2tcio(rc2i, era, rpom): -- """ -- Wrapper for ERFA function ``eraC2tcio``. -- -- Parameters -- ---------- -- rc2i : double array -- era : double array -- rpom : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 t c i o -- - - - - - - - - - - -- -- Assemble the celestial to terrestrial matrix from CIO-based -- components (the celestial-to-intermediate matrix, the Earth Rotation -- Angle and the polar motion matrix). -- -- Given: -- rc2i double[3][3] celestial-to-intermediate matrix -- era double Earth rotation angle (radians) -- rpom double[3][3] polar-motion matrix -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix -- -- Notes: -- -- 1) This function constructs the rotation matrix that transforms -- vectors in the celestial system into vectors in the terrestrial -- system. It does so starting from precomputed components, namely -- the matrix which rotates from celestial coordinates to the -- intermediate frame, the Earth rotation angle and the polar motion -- matrix. One use of the present function is when generating a -- series of celestial-to-terrestrial matrices where only the Earth -- Rotation Angle changes, avoiding the considerable overhead of -- recomputing the precession-nutation more often than necessary to -- achieve given accuracy objectives. -- -- 2) The relationship between the arguments is as follows: -- -- [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003). -- -- Called: -- eraCr copy r-matrix -- eraRz rotate around Z-axis -- eraRxr product of two r-matrices -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2tcio(rc2i, era, rpom) -- return rc2t -- -- --def c2teqx(rbpn, gst, rpom): -- """ -- Wrapper for ERFA function ``eraC2teqx``. -- -- Parameters -- ---------- -- rbpn : double array -- gst : double array -- rpom : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a C 2 t e q x -- - - - - - - - - - - -- -- Assemble the celestial to terrestrial matrix from equinox-based -- components (the celestial-to-true matrix, the Greenwich Apparent -- Sidereal Time and the polar motion matrix). -- -- Given: -- rbpn double[3][3] celestial-to-true matrix -- gst double Greenwich (apparent) Sidereal Time (radians) -- rpom double[3][3] polar-motion matrix -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 2) -- -- Notes: -- -- 1) This function constructs the rotation matrix that transforms -- vectors in the celestial system into vectors in the terrestrial -- system. It does so starting from precomputed components, namely -- the matrix which rotates from celestial coordinates to the -- true equator and equinox of date, the Greenwich Apparent Sidereal -- Time and the polar motion matrix. One use of the present function -- is when generating a series of celestial-to-terrestrial matrices -- where only the Sidereal Time changes, avoiding the considerable -- overhead of recomputing the precession-nutation more often than -- necessary to achieve given accuracy objectives. -- -- 2) The relationship between the arguments is as follows: -- -- [TRS] = rpom * R_3(gst) * rbpn * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003). -- -- Called: -- eraCr copy r-matrix -- eraRz rotate around Z-axis -- eraRxr product of two r-matrices -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2teqx(rbpn, gst, rpom) -- return rc2t -- -- --def c2tpe(tta, ttb, uta, utb, dpsi, deps, xp, yp): -- """ -- Wrapper for ERFA function ``eraC2tpe``. -- -- Parameters -- ---------- -- tta : double array -- ttb : double array -- uta : double array -- utb : double array -- dpsi : double array -- deps : double array -- xp : double array -- yp : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a C 2 t p e -- - - - - - - - - - -- -- Form the celestial to terrestrial matrix given the date, the UT1, -- the nutation and the polar motion. IAU 2000. -- -- Given: -- tta,ttb double TT as a 2-part Julian Date (Note 1) -- uta,utb double UT1 as a 2-part Julian Date (Note 1) -- dpsi,deps double nutation (Note 2) -- xp,yp double coordinates of the pole (radians, Note 3) -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 4) -- -- Notes: -- -- 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, -- apportioned in any convenient way between the arguments uta and -- utb. For example, JD(UT1)=2450123.7 could be expressed in any of -- these ways, among others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. In the case of uta,utb, the -- date & time method is best matched to the Earth rotation angle -- algorithm used: maximum precision is delivered when the uta -- argument is for 0hrs UT1 on the day in question and the utb -- argument lies in the range 0 to 1, or vice versa. -- -- 2) The caller is responsible for providing the nutation components; -- they are in longitude and obliquity, in radians and are with -- respect to the equinox and ecliptic of date. For high-accuracy -- applications, free core nutation should be included as well as -- any other relevant corrections to the position of the CIP. -- -- 3) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 4) The matrix rc2t transforms from celestial to terrestrial -- coordinates: -- -- [TRS] = RPOM * R_3(GST) * RBPN * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), RBPN is the -- bias-precession-nutation matrix, GST is the Greenwich (apparent) -- Sidereal Time and RPOM is the polar motion matrix. -- -- 5) Although its name does not include "00", This function is in fact -- specific to the IAU 2000 models. -- -- Called: -- eraPn00 bias/precession/nutation results, IAU 2000 -- eraGmst00 Greenwich mean sidereal time, IAU 2000 -- eraSp00 the TIO locator s', IERS 2000 -- eraEe00 equation of the equinoxes, IAU 2000 -- eraPom00 polar motion matrix -- eraC2teqx form equinox-based celestial-to-terrestrial matrix -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2tpe(tta, ttb, uta, utb, dpsi, deps, xp, yp) -- return rc2t -- -- --def c2txy(tta, ttb, uta, utb, x, y, xp, yp): -- """ -- Wrapper for ERFA function ``eraC2txy``. -- -- Parameters -- ---------- -- tta : double array -- ttb : double array -- uta : double array -- utb : double array -- x : double array -- y : double array -- xp : double array -- yp : double array -- -- Returns -- ------- -- rc2t : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a C 2 t x y -- - - - - - - - - - -- -- Form the celestial to terrestrial matrix given the date, the UT1, -- the CIP coordinates and the polar motion. IAU 2000. -- -- Given: -- tta,ttb double TT as a 2-part Julian Date (Note 1) -- uta,utb double UT1 as a 2-part Julian Date (Note 1) -- x,y double Celestial Intermediate Pole (Note 2) -- xp,yp double coordinates of the pole (radians, Note 3) -- -- Returned: -- rc2t double[3][3] celestial-to-terrestrial matrix (Note 4) -- -- Notes: -- -- 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, -- apportioned in any convenient way between the arguments uta and -- utb. For example, JD(UT1)=2450123.7 could be expressed in any o -- these ways, among others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. In the case of uta,utb, the -- date & time method is best matched to the Earth rotation angle -- algorithm used: maximum precision is delivered when the uta -- argument is for 0hrs UT1 on the day in question and the utb -- argument lies in the range 0 to 1, or vice versa. -- -- 2) The Celestial Intermediate Pole coordinates are the x,y -- components of the unit vector in the Geocentric Celestial -- Reference System. -- -- 3) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 4) The matrix rc2t transforms from celestial to terrestrial -- coordinates: -- -- [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] -- -- = rc2t * [CRS] -- -- where [CRS] is a vector in the Geocentric Celestial Reference -- System and [TRS] is a vector in the International Terrestrial -- Reference System (see IERS Conventions 2003), ERA is the Earth -- Rotation Angle and RPOM is the polar motion matrix. -- -- 5) Although its name does not include "00", This function is in fact -- specific to the IAU 2000 models. -- -- Called: -- eraC2ixy celestial-to-intermediate matrix, given X,Y -- eraEra00 Earth rotation angle, IAU 2000 -- eraSp00 the TIO locator s', IERS 2000 -- eraPom00 polar motion matrix -- eraC2tcio form CIO-based celestial-to-terrestrial matrix -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rc2t = ufunc.c2txy(tta, ttb, uta, utb, x, y, xp, yp) -- return rc2t -- -- --def eo06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraEo06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E o 0 6 a -- - - - - - - - - - -- -- Equation of the origins, IAU 2006 precession and IAU 2000A nutation. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double equation of the origins in radians -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The equation of the origins is the distance between the true -- equinox and the celestial intermediate origin and, equivalently, -- the difference between Earth rotation angle and Greenwich -- apparent sidereal time (ERA-GST). It comprises the precession -- (since J2000.0) in right ascension plus the equation of the -- equinoxes (including the small correction terms). -- -- Called: -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- eraEors equation of the origins, given NPB matrix and s -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.eo06a(date1, date2) -- return c_retval -- -- --def eors(rnpb, s): -- """ -- Wrapper for ERFA function ``eraEors``. -- -- Parameters -- ---------- -- rnpb : double array -- s : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a E o r s -- - - - - - - - - -- -- Equation of the origins, given the classical NPB matrix and the -- quantity s. -- -- Given: -- rnpb double[3][3] classical nutation x precession x bias matrix -- s double the quantity s (the CIO locator) -- -- Returned (function value): -- double the equation of the origins in radians. -- -- Notes: -- -- 1) The equation of the origins is the distance between the true -- equinox and the celestial intermediate origin and, equivalently, -- the difference between Earth rotation angle and Greenwich -- apparent sidereal time (ERA-GST). It comprises the precession -- (since J2000.0) in right ascension plus the equation of the -- equinoxes (including the small correction terms). -- -- 2) The algorithm is from Wallace & Capitaine (2006). -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.eors(rnpb, s) -- return c_retval -- -- --def fw2m(gamb, phib, psi, eps): -- """ -- Wrapper for ERFA function ``eraFw2m``. -- -- Parameters -- ---------- -- gamb : double array -- phib : double array -- psi : double array -- eps : double array -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a F w 2 m -- - - - - - - - - -- -- Form rotation matrix given the Fukushima-Williams angles. -- -- Given: -- gamb double F-W angle gamma_bar (radians) -- phib double F-W angle phi_bar (radians) -- psi double F-W angle psi (radians) -- eps double F-W angle epsilon (radians) -- -- Returned: -- r double[3][3] rotation matrix -- -- Notes: -- -- 1) Naming the following points: -- -- e = J2000.0 ecliptic pole, -- p = GCRS pole, -- E = ecliptic pole of date, -- and P = CIP, -- -- the four Fukushima-Williams angles are as follows: -- -- gamb = gamma = epE -- phib = phi = pE -- psi = psi = pEP -- eps = epsilon = EP -- -- 2) The matrix representing the combined effects of frame bias, -- precession and nutation is: -- -- NxPxB = R_1(-eps).R_3(-psi).R_1(phib).R_3(gamb) -- -- 3) Three different matrices can be constructed, depending on the -- supplied angles: -- -- o To obtain the nutation x precession x frame bias matrix, -- generate the four precession angles, generate the nutation -- components and add them to the psi_bar and epsilon_A angles, -- and call the present function. -- -- o To obtain the precession x frame bias matrix, generate the -- four precession angles and call the present function. -- -- o To obtain the frame bias matrix, generate the four precession -- angles for date J2000.0 and call the present function. -- -- The nutation-only and precession-only matrices can if necessary -- be obtained by combining these three appropriately. -- -- Called: -- eraIr initialize r-matrix to identity -- eraRz rotate around Z-axis -- eraRx rotate around X-axis -- -- Reference: -- -- Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.fw2m(gamb, phib, psi, eps) -- return r -- -- --def fw2xy(gamb, phib, psi, eps): -- """ -- Wrapper for ERFA function ``eraFw2xy``. -- -- Parameters -- ---------- -- gamb : double array -- phib : double array -- psi : double array -- eps : double array -- -- Returns -- ------- -- x : double array -- y : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F w 2 x y -- - - - - - - - - - -- -- CIP X,Y given Fukushima-Williams bias-precession-nutation angles. -- -- Given: -- gamb double F-W angle gamma_bar (radians) -- phib double F-W angle phi_bar (radians) -- psi double F-W angle psi (radians) -- eps double F-W angle epsilon (radians) -- -- Returned: -- x,y double CIP unit vector X,Y -- -- Notes: -- -- 1) Naming the following points: -- -- e = J2000.0 ecliptic pole, -- p = GCRS pole -- E = ecliptic pole of date, -- and P = CIP, -- -- the four Fukushima-Williams angles are as follows: -- -- gamb = gamma = epE -- phib = phi = pE -- psi = psi = pEP -- eps = epsilon = EP -- -- 2) The matrix representing the combined effects of frame bias, -- precession and nutation is: -- -- NxPxB = R_1(-epsA).R_3(-psi).R_1(phib).R_3(gamb) -- -- The returned values x,y are elements [2][0] and [2][1] of the -- matrix. Near J2000.0, they are essentially angles in radians. -- -- Called: -- eraFw2m F-W angles to r-matrix -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- -- Reference: -- -- Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y = ufunc.fw2xy(gamb, phib, psi, eps) -- return x, y -- -- --def ltp(epj): -- """ -- Wrapper for ERFA function ``eraLtp``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- rp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a L t p -- - - - - - - - -- -- Long-term precession matrix. -- -- Given: -- epj double Julian epoch (TT) -- -- Returned: -- rp double[3][3] precession matrix, J2000.0 to date -- -- Notes: -- -- 1) The matrix is in the sense -- -- P_date = rp x P_J2000, -- -- where P_J2000 is a vector with respect to the J2000.0 mean -- equator and equinox and P_date is the same vector with respect to -- the equator and equinox of epoch epj. -- -- 2) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- Called: -- eraLtpequ equator pole, long term -- eraLtpecl ecliptic pole, long term -- eraPxp vector product -- eraPn normalize vector -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rp = ufunc.ltp(epj) -- return rp -- -- --def ltpb(epj): -- """ -- Wrapper for ERFA function ``eraLtpb``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- rpb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a L t p b -- - - - - - - - - -- -- Long-term precession matrix, including ICRS frame bias. -- -- Given: -- epj double Julian epoch (TT) -- -- Returned: -- rpb double[3][3] precession-bias matrix, J2000.0 to date -- -- Notes: -- -- 1) The matrix is in the sense -- -- P_date = rpb x P_ICRS, -- -- where P_ICRS is a vector in the Geocentric Celestial Reference -- System, and P_date is the vector with respect to the Celestial -- Intermediate Reference System at that date but with nutation -- neglected. -- -- 2) A first order frame bias formulation is used, of sub- -- microarcsecond accuracy compared with a full 3D rotation. -- -- 3) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rpb = ufunc.ltpb(epj) -- return rpb -- -- --def ltpecl(epj): -- """ -- Wrapper for ERFA function ``eraLtpecl``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- vec : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a L t p e c l -- - - - - - - - - - - -- -- Long-term precession of the ecliptic. -- -- Given: -- epj double Julian epoch (TT) -- -- Returned: -- vec double[3] ecliptic pole unit vector -- -- Notes: -- -- 1) The returned vector is with respect to the J2000.0 mean equator -- and equinox. -- -- 2) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- vec = ufunc.ltpecl(epj) -- return vec -- -- --def ltpequ(epj): -- """ -- Wrapper for ERFA function ``eraLtpequ``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- veq : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a L t p e q u -- - - - - - - - - - - -- -- Long-term precession of the equator. -- -- Given: -- epj double Julian epoch (TT) -- -- Returned: -- veq double[3] equator pole unit vector -- -- Notes: -- -- 1) The returned vector is with respect to the J2000.0 mean equator -- and equinox. -- -- 2) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- veq = ufunc.ltpequ(epj) -- return veq -- -- --def num00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraNum00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u m 0 0 a -- - - - - - - - - - - -- -- Form the matrix of nutation for a given date, IAU 2000A model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rmatn double[3][3] nutation matrix -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(true) = rmatn * V(mean), where -- the p-vector V(true) is with respect to the true equatorial triad -- of date and the p-vector V(mean) is with respect to the mean -- equatorial triad of date. -- -- 3) A faster, but slightly less accurate result (about 1 mas), can be -- obtained by using instead the eraNum00b function. -- -- Called: -- eraPn00a bias/precession/nutation, IAU 2000A -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.222-3 (p114). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatn = ufunc.num00a(date1, date2) -- return rmatn -- -- --def num00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraNum00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u m 0 0 b -- - - - - - - - - - - -- -- Form the matrix of nutation for a given date, IAU 2000B model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rmatn double[3][3] nutation matrix -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(true) = rmatn * V(mean), where -- the p-vector V(true) is with respect to the true equatorial triad -- of date and the p-vector V(mean) is with respect to the mean -- equatorial triad of date. -- -- 3) The present function is faster, but slightly less accurate (about -- 1 mas), than the eraNum00a function. -- -- Called: -- eraPn00b bias/precession/nutation, IAU 2000B -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.222-3 (p114). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatn = ufunc.num00b(date1, date2) -- return rmatn -- -- --def num06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraNum06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u m 0 6 a -- - - - - - - - - - - -- -- Form the matrix of nutation for a given date, IAU 2006/2000A model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rmatn double[3][3] nutation matrix -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(true) = rmatn * V(mean), where -- the p-vector V(true) is with respect to the true equatorial triad -- of date and the p-vector V(mean) is with respect to the mean -- equatorial triad of date. -- -- Called: -- eraObl06 mean obliquity, IAU 2006 -- eraNut06a nutation, IAU 2006/2000A -- eraNumat form nutation matrix -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.222-3 (p114). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatn = ufunc.num06a(date1, date2) -- return rmatn -- -- --def numat(epsa, dpsi, deps): -- """ -- Wrapper for ERFA function ``eraNumat``. -- -- Parameters -- ---------- -- epsa : double array -- dpsi : double array -- deps : double array -- -- Returns -- ------- -- rmatn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a N u m a t -- - - - - - - - - - -- -- Form the matrix of nutation. -- -- Given: -- epsa double mean obliquity of date (Note 1) -- dpsi,deps double nutation (Note 2) -- -- Returned: -- rmatn double[3][3] nutation matrix (Note 3) -- -- Notes: -- -- -- 1) The supplied mean obliquity epsa, must be consistent with the -- precession-nutation models from which dpsi and deps were obtained. -- -- 2) The caller is responsible for providing the nutation components; -- they are in longitude and obliquity, in radians and are with -- respect to the equinox and ecliptic of date. -- -- 3) The matrix operates in the sense V(true) = rmatn * V(mean), -- where the p-vector V(true) is with respect to the true -- equatorial triad of date and the p-vector V(mean) is with -- respect to the mean equatorial triad of date. -- -- Called: -- eraIr initialize r-matrix to identity -- eraRx rotate around X-axis -- eraRz rotate around Z-axis -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.222-3 (p114). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatn = ufunc.numat(epsa, dpsi, deps) -- return rmatn -- -- --def nut00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraNut00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u t 0 0 a -- - - - - - - - - - - -- -- Nutation, IAU 2000A model (MHB2000 luni-solar and planetary nutation -- with free core nutation omitted). -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation, luni-solar + planetary (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components in longitude and obliquity are in radians -- and with respect to the equinox and ecliptic of date. The -- obliquity at J2000.0 is assumed to be the Lieske et al. (1977) -- value of 84381.448 arcsec. -- -- Both the luni-solar and planetary nutations are included. The -- latter are due to direct planetary nutations and the -- perturbations of the lunar and terrestrial orbits. -- -- 3) The function computes the MHB2000 nutation series with the -- associated corrections for planetary nutations. It is an -- implementation of the nutation part of the IAU 2000A precession- -- nutation model, formally adopted by the IAU General Assembly in -- 2000, namely MHB2000 (Mathews et al. 2002), but with the free -- core nutation (FCN - see Note 4) omitted. -- -- 4) The full MHB2000 model also contains contributions to the -- nutations in longitude and obliquity due to the free-excitation -- of the free-core-nutation during the period 1979-2000. These FCN -- terms, which are time-dependent and unpredictable, are NOT -- included in the present function and, if required, must be -- independently computed. With the FCN corrections included, the -- present function delivers a pole which is at current epochs -- accurate to a few hundred microarcseconds. The omission of FCN -- introduces further errors of about that size. -- -- 5) The present function provides classical nutation. The MHB2000 -- algorithm, from which it is adapted, deals also with (i) the -- offsets between the GCRS and mean poles and (ii) the adjustments -- in longitude and obliquity due to the changed precession rates. -- These additional functions, namely frame bias and precession -- adjustments, are supported by the ERFA functions eraBi00 and -- eraPr00. -- -- 6) The MHB2000 algorithm also provides "total" nutations, comprising -- the arithmetic sum of the frame bias, precession adjustments, -- luni-solar nutation and planetary nutation. These total -- nutations can be used in combination with an existing IAU 1976 -- precession implementation, such as eraPmat76, to deliver GCRS- -- to-true predictions of sub-mas accuracy at current dates. -- However, there are three shortcomings in the MHB2000 model that -- must be taken into account if more accurate or definitive results -- are required (see Wallace 2002): -- -- (i) The MHB2000 total nutations are simply arithmetic sums, -- yet in reality the various components are successive Euler -- rotations. This slight lack of rigor leads to cross terms -- that exceed 1 mas after a century. The rigorous procedure -- is to form the GCRS-to-true rotation matrix by applying the -- bias, precession and nutation in that order. -- -- (ii) Although the precession adjustments are stated to be with -- respect to Lieske et al. (1977), the MHB2000 model does -- not specify which set of Euler angles are to be used and -- how the adjustments are to be applied. The most literal -- and straightforward procedure is to adopt the 4-rotation -- epsilon_0, psi_A, omega_A, xi_A option, and to add DPSIPR -- to psi_A and DEPSPR to both omega_A and eps_A. -- -- (iii) The MHB2000 model predates the determination by Chapront -- et al. (2002) of a 14.6 mas displacement between the -- J2000.0 mean equinox and the origin of the ICRS frame. It -- should, however, be noted that neglecting this displacement -- when calculating star coordinates does not lead to a -- 14.6 mas change in right ascension, only a small second- -- order distortion in the pattern of the precession-nutation -- effect. -- -- For these reasons, the ERFA functions do not generate the "total -- nutations" directly, though they can of course easily be -- generated by calling eraBi00, eraPr00 and the present function -- and adding the results. -- -- 7) The MHB2000 model contains 41 instances where the same frequency -- appears multiple times, of which 38 are duplicates and three are -- triplicates. To keep the present code close to the original MHB -- algorithm, this small inefficiency has not been corrected. -- -- Called: -- eraFal03 mean anomaly of the Moon -- eraFaf03 mean argument of the latitude of the Moon -- eraFaom03 mean longitude of the Moon's ascending node -- eraFame03 mean longitude of Mercury -- eraFave03 mean longitude of Venus -- eraFae03 mean longitude of Earth -- eraFama03 mean longitude of Mars -- eraFaju03 mean longitude of Jupiter -- eraFasa03 mean longitude of Saturn -- eraFaur03 mean longitude of Uranus -- eraFapa03 general accumulated precession in longitude -- -- References: -- -- Chapront, J., Chapront-Touze, M. & Francou, G. 2002, -- Astron.Astrophys. 387, 700 -- -- Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, -- Astron.Astrophys. 58, 1-16 -- -- Mathews, P.M., Herring, T.A., Buffet, B.A. 2002, J.Geophys.Res. -- 107, B4. The MHB_2000 code itself was obtained on 9th September -- 2002 from ftp//maia.usno.navy.mil/conv2000/chapter5/IAU2000A. -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Wallace, P.T., "Software for Implementing the IAU 2000 -- Resolutions", in IERS Workshop 5.1 (2002) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps = ufunc.nut00a(date1, date2) -- return dpsi, deps -- -- --def nut00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraNut00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u t 0 0 b -- - - - - - - - - - - -- -- Nutation, IAU 2000B model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation, luni-solar + planetary (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components in longitude and obliquity are in radians -- and with respect to the equinox and ecliptic of date. The -- obliquity at J2000.0 is assumed to be the Lieske et al. (1977) -- value of 84381.448 arcsec. (The errors that result from using -- this function with the IAU 2006 value of 84381.406 arcsec can be -- neglected.) -- -- The nutation model consists only of luni-solar terms, but -- includes also a fixed offset which compensates for certain long- -- period planetary terms (Note 7). -- -- 3) This function is an implementation of the IAU 2000B abridged -- nutation model formally adopted by the IAU General Assembly in -- 2000. The function computes the MHB_2000_SHORT luni-solar -- nutation series (Luzum 2001), but without the associated -- corrections for the precession rate adjustments and the offset -- between the GCRS and J2000.0 mean poles. -- -- 4) The full IAU 2000A (MHB2000) nutation model contains nearly 1400 -- terms. The IAU 2000B model (McCarthy & Luzum 2003) contains only -- 77 terms, plus additional simplifications, yet still delivers -- results of 1 mas accuracy at present epochs. This combination of -- accuracy and size makes the IAU 2000B abridged nutation model -- suitable for most practical applications. -- -- The function delivers a pole accurate to 1 mas from 1900 to 2100 -- (usually better than 1 mas, very occasionally just outside -- 1 mas). The full IAU 2000A model, which is implemented in the -- function eraNut00a (q.v.), delivers considerably greater accuracy -- at current dates; however, to realize this improved accuracy, -- corrections for the essentially unpredictable free-core-nutation -- (FCN) must also be included. -- -- 5) The present function provides classical nutation. The -- MHB_2000_SHORT algorithm, from which it is adapted, deals also -- with (i) the offsets between the GCRS and mean poles and (ii) the -- adjustments in longitude and obliquity due to the changed -- precession rates. These additional functions, namely frame bias -- and precession adjustments, are supported by the ERFA functions -- eraBi00 and eraPr00. -- -- 6) The MHB_2000_SHORT algorithm also provides "total" nutations, -- comprising the arithmetic sum of the frame bias, precession -- adjustments, and nutation (luni-solar + planetary). These total -- nutations can be used in combination with an existing IAU 1976 -- precession implementation, such as eraPmat76, to deliver GCRS- -- to-true predictions of mas accuracy at current epochs. However, -- for symmetry with the eraNut00a function (q.v. for the reasons), -- the ERFA functions do not generate the "total nutations" -- directly. Should they be required, they could of course easily -- be generated by calling eraBi00, eraPr00 and the present function -- and adding the results. -- -- 7) The IAU 2000B model includes "planetary bias" terms that are -- fixed in size but compensate for long-period nutations. The -- amplitudes quoted in McCarthy & Luzum (2003), namely -- Dpsi = -1.5835 mas and Depsilon = +1.6339 mas, are optimized for -- the "total nutations" method described in Note 6. The Luzum -- (2001) values used in this ERFA implementation, namely -0.135 mas -- and +0.388 mas, are optimized for the "rigorous" method, where -- frame bias, precession and nutation are applied separately and in -- that order. During the interval 1995-2050, the ERFA -- implementation delivers a maximum error of 1.001 mas (not -- including FCN). -- -- References: -- -- Lieske, J.H., Lederle, T., Fricke, W., Morando, B., "Expressions -- for the precession quantities based upon the IAU /1976/ system of -- astronomical constants", Astron.Astrophys. 58, 1-2, 1-16. (1977) -- -- Luzum, B., private communication, 2001 (Fortran code -- MHB_2000_SHORT) -- -- McCarthy, D.D. & Luzum, B.J., "An abridged model of the -- precession-nutation of the celestial pole", Cel.Mech.Dyn.Astron. -- 85, 37-49 (2003) -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J., Astron.Astrophys. 282, 663-683 (1994) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps = ufunc.nut00b(date1, date2) -- return dpsi, deps -- -- --def nut06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraNut06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u t 0 6 a -- - - - - - - - - - - -- -- IAU 2000A nutation with adjustments to match the IAU 2006 -- precession. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation, luni-solar + planetary (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components in longitude and obliquity are in radians -- and with respect to the mean equinox and ecliptic of date, -- IAU 2006 precession model (Hilton et al. 2006, Capitaine et al. -- 2005). -- -- 3) The function first computes the IAU 2000A nutation, then applies -- adjustments for (i) the consequences of the change in obliquity -- from the IAU 1980 ecliptic to the IAU 2006 ecliptic and (ii) the -- secular variation in the Earth's dynamical form factor J2. -- -- 4) The present function provides classical nutation, complementing -- the IAU 2000 frame bias and IAU 2006 precession. It delivers a -- pole which is at current epochs accurate to a few tens of -- microarcseconds, apart from the free core nutation. -- -- Called: -- eraNut00a nutation, IAU 2000A -- -- References: -- -- Chapront, J., Chapront-Touze, M. & Francou, G. 2002, -- Astron.Astrophys. 387, 700 -- -- Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, -- Astron.Astrophys. 58, 1-16 -- -- Mathews, P.M., Herring, T.A., Buffet, B.A. 2002, J.Geophys.Res. -- 107, B4. The MHB_2000 code itself was obtained on 9th September -- 2002 from ftp//maia.usno.navy.mil/conv2000/chapter5/IAU2000A. -- -- Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Wallace, P.T., "Software for Implementing the IAU 2000 -- Resolutions", in IERS Workshop 5.1 (2002) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps = ufunc.nut06a(date1, date2) -- return dpsi, deps -- -- --def nut80(date1, date2): -- """ -- Wrapper for ERFA function ``eraNut80``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a N u t 8 0 -- - - - - - - - - - -- -- Nutation, IAU 1980 model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi double nutation in longitude (radians) -- deps double nutation in obliquity (radians) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components are with respect to the ecliptic of -- date. -- -- Called: -- eraAnpm normalize angle into range +/- pi -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.222 (p111). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps = ufunc.nut80(date1, date2) -- return dpsi, deps -- -- --def nutm80(date1, date2): -- """ -- Wrapper for ERFA function ``eraNutm80``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a N u t m 8 0 -- - - - - - - - - - - -- -- Form the matrix of nutation for a given date, IAU 1980 model. -- -- Given: -- date1,date2 double TDB date (Note 1) -- -- Returned: -- rmatn double[3][3] nutation matrix -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(true) = rmatn * V(mean), -- where the p-vector V(true) is with respect to the true -- equatorial triad of date and the p-vector V(mean) is with -- respect to the mean equatorial triad of date. -- -- Called: -- eraNut80 nutation, IAU 1980 -- eraObl80 mean obliquity, IAU 1980 -- eraNumat form nutation matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatn = ufunc.nutm80(date1, date2) -- return rmatn -- -- --def obl06(date1, date2): -- """ -- Wrapper for ERFA function ``eraObl06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a O b l 0 6 -- - - - - - - - - - -- -- Mean obliquity of the ecliptic, IAU 2006 precession model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double obliquity of the ecliptic (radians, Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result is the angle between the ecliptic and mean equator of -- date date1+date2. -- -- Reference: -- -- Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.obl06(date1, date2) -- return c_retval -- -- --def obl80(date1, date2): -- """ -- Wrapper for ERFA function ``eraObl80``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a O b l 8 0 -- - - - - - - - - - -- -- Mean obliquity of the ecliptic, IAU 1980 model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double obliquity of the ecliptic (radians, Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result is the angle between the ecliptic and mean equator of -- date date1+date2. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Expression 3.222-1 (p114). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.obl80(date1, date2) -- return c_retval -- -- --def p06e(date1, date2): -- """ -- Wrapper for ERFA function ``eraP06e``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- eps0 : double array -- psia : double array -- oma : double array -- bpa : double array -- bqa : double array -- pia : double array -- bpia : double array -- epsa : double array -- chia : double array -- za : double array -- zetaa : double array -- thetaa : double array -- pa : double array -- gam : double array -- phi : double array -- psi : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P 0 6 e -- - - - - - - - - -- -- Precession angles, IAU 2006, equinox based. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (see Note 2): -- eps0 double epsilon_0 -- psia double psi_A -- oma double omega_A -- bpa double P_A -- bqa double Q_A -- pia double pi_A -- bpia double Pi_A -- epsa double obliquity epsilon_A -- chia double chi_A -- za double z_A -- zetaa double zeta_A -- thetaa double theta_A -- pa double p_A -- gam double F-W angle gamma_J2000 -- phi double F-W angle phi_J2000 -- psi double F-W angle psi_J2000 -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) This function returns the set of equinox based angles for the -- Capitaine et al. "P03" precession theory, adopted by the IAU in -- 2006. The angles are set out in Table 1 of Hilton et al. (2006): -- -- eps0 epsilon_0 obliquity at J2000.0 -- psia psi_A luni-solar precession -- oma omega_A inclination of equator wrt J2000.0 ecliptic -- bpa P_A ecliptic pole x, J2000.0 ecliptic triad -- bqa Q_A ecliptic pole -y, J2000.0 ecliptic triad -- pia pi_A angle between moving and J2000.0 ecliptics -- bpia Pi_A longitude of ascending node of the ecliptic -- epsa epsilon_A obliquity of the ecliptic -- chia chi_A planetary precession -- za z_A equatorial precession: -3rd 323 Euler angle -- zetaa zeta_A equatorial precession: -1st 323 Euler angle -- thetaa theta_A equatorial precession: 2nd 323 Euler angle -- pa p_A general precession -- gam gamma_J2000 J2000.0 RA difference of ecliptic poles -- phi phi_J2000 J2000.0 codeclination of ecliptic pole -- psi psi_J2000 longitude difference of equator poles, J2000.0 -- -- The returned values are all radians. -- -- 3) Hilton et al. (2006) Table 1 also contains angles that depend on -- models distinct from the P03 precession theory itself, namely the -- IAU 2000A frame bias and nutation. The quoted polynomials are -- used in other ERFA functions: -- -- . eraXy06 contains the polynomial parts of the X and Y series. -- -- . eraS06 contains the polynomial part of the s+XY/2 series. -- -- . eraPfw06 implements the series for the Fukushima-Williams -- angles that are with respect to the GCRS pole (i.e. the variants -- that include frame bias). -- -- 4) The IAU resolution stipulated that the choice of parameterization -- was left to the user, and so an IAU compliant precession -- implementation can be constructed using various combinations of -- the angles returned by the present function. -- -- 5) The parameterization used by ERFA is the version of the Fukushima- -- Williams angles that refers directly to the GCRS pole. These -- angles may be calculated by calling the function eraPfw06. ERFA -- also supports the direct computation of the CIP GCRS X,Y by -- series, available by calling eraXy06. -- -- 6) The agreement between the different parameterizations is at the -- 1 microarcsecond level in the present era. -- -- 7) When constructing a precession formulation that refers to the GCRS -- pole rather than the dynamical pole, it may (depending on the -- choice of angles) be necessary to introduce the frame bias -- explicitly. -- -- 8) It is permissible to re-use the same variable in the returned -- arguments. The quantities are stored in the stated order. -- -- Reference: -- -- Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 -- -- Called: -- eraObl06 mean obliquity, IAU 2006 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- eps0, psia, oma, bpa, bqa, pia, bpia, epsa, chia, za, zetaa, thetaa, pa, gam, phi, psi = ufunc.p06e(date1, date2) -- return eps0, psia, oma, bpa, bqa, pia, bpia, epsa, chia, za, zetaa, thetaa, pa, gam, phi, psi -- -- --def pb06(date1, date2): -- """ -- Wrapper for ERFA function ``eraPb06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- bzeta : double array -- bz : double array -- btheta : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P b 0 6 -- - - - - - - - - -- -- This function forms three Euler angles which implement general -- precession from epoch J2000.0, using the IAU 2006 model. Frame -- bias (the offset between ICRS and mean J2000.0) is included. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- bzeta double 1st rotation: radians cw around z -- bz double 3rd rotation: radians cw around z -- btheta double 2nd rotation: radians ccw around y -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The traditional accumulated precession angles zeta_A, z_A, -- theta_A cannot be obtained in the usual way, namely through -- polynomial expressions, because of the frame bias. The latter -- means that two of the angles undergo rapid changes near this -- date. They are instead the results of decomposing the -- precession-bias matrix obtained by using the Fukushima-Williams -- method, which does not suffer from the problem. The -- decomposition returns values which can be used in the -- conventional formulation and which include frame bias. -- -- 3) The three angles are returned in the conventional order, which -- is not the same as the order of the corresponding Euler -- rotations. The precession-bias matrix is -- R_3(-z) x R_2(+theta) x R_3(-zeta). -- -- 4) Should zeta_A, z_A, theta_A angles be required that do not -- contain frame bias, they are available by calling the ERFA -- function eraP06e. -- -- Called: -- eraPmat06 PB matrix, IAU 2006 -- eraRz rotate around Z-axis -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- bzeta, bz, btheta = ufunc.pb06(date1, date2) -- return bzeta, bz, btheta -- -- --def pfw06(date1, date2): -- """ -- Wrapper for ERFA function ``eraPfw06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- gamb : double array -- phib : double array -- psib : double array -- epsa : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P f w 0 6 -- - - - - - - - - - -- -- Precession angles, IAU 2006 (Fukushima-Williams 4-angle formulation). -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- gamb double F-W angle gamma_bar (radians) -- phib double F-W angle phi_bar (radians) -- psib double F-W angle psi_bar (radians) -- epsa double F-W angle epsilon_A (radians) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) Naming the following points: -- -- e = J2000.0 ecliptic pole, -- p = GCRS pole, -- E = mean ecliptic pole of date, -- and P = mean pole of date, -- -- the four Fukushima-Williams angles are as follows: -- -- gamb = gamma_bar = epE -- phib = phi_bar = pE -- psib = psi_bar = pEP -- epsa = epsilon_A = EP -- -- 3) The matrix representing the combined effects of frame bias and -- precession is: -- -- PxB = R_1(-epsa).R_3(-psib).R_1(phib).R_3(gamb) -- -- 4) The matrix representing the combined effects of frame bias, -- precession and nutation is simply: -- -- NxPxB = R_1(-epsa-dE).R_3(-psib-dP).R_1(phib).R_3(gamb) -- -- where dP and dE are the nutation components with respect to the -- ecliptic of date. -- -- Reference: -- -- Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 -- -- Called: -- eraObl06 mean obliquity, IAU 2006 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- gamb, phib, psib, epsa = ufunc.pfw06(date1, date2) -- return gamb, phib, psib, epsa -- -- --def pmat00(date1, date2): -- """ -- Wrapper for ERFA function ``eraPmat00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rbp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P m a t 0 0 -- - - - - - - - - - - -- -- Precession matrix (including frame bias) from GCRS to a specified -- date, IAU 2000 model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rbp double[3][3] bias-precession matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rbp * V(GCRS), where -- the p-vector V(GCRS) is with respect to the Geocentric Celestial -- Reference System (IAU, 2000) and the p-vector V(date) is with -- respect to the mean equatorial triad of the given date. -- -- Called: -- eraBp00 frame bias and precession matrices, IAU 2000 -- -- Reference: -- -- IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. -- 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. -- (2000) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rbp = ufunc.pmat00(date1, date2) -- return rbp -- -- --def pmat06(date1, date2): -- """ -- Wrapper for ERFA function ``eraPmat06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rbp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P m a t 0 6 -- - - - - - - - - - - -- -- Precession matrix (including frame bias) from GCRS to a specified -- date, IAU 2006 model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rbp double[3][3] bias-precession matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rbp * V(GCRS), where -- the p-vector V(GCRS) is with respect to the Geocentric Celestial -- Reference System (IAU, 2000) and the p-vector V(date) is with -- respect to the mean equatorial triad of the given date. -- -- Called: -- eraPfw06 bias-precession F-W angles, IAU 2006 -- eraFw2m F-W angles to r-matrix -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rbp = ufunc.pmat06(date1, date2) -- return rbp -- -- --def pmat76(date1, date2): -- """ -- Wrapper for ERFA function ``eraPmat76``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P m a t 7 6 -- - - - - - - - - - - -- -- Precession matrix from J2000.0 to a specified date, IAU 1976 model. -- -- Given: -- date1,date2 double ending date, TT (Note 1) -- -- Returned: -- rmatp double[3][3] precession matrix, J2000.0 -> date1+date2 -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = RMATP * V(J2000), -- where the p-vector V(J2000) is with respect to the mean -- equatorial triad of epoch J2000.0 and the p-vector V(date) -- is with respect to the mean equatorial triad of the given -- date. -- -- 3) Though the matrix method itself is rigorous, the precession -- angles are expressed through canonical polynomials which are -- valid only for a limited time span. In addition, the IAU 1976 -- precession rate is known to be imperfect. The absolute accuracy -- of the present formulation is better than 0.1 arcsec from -- 1960AD to 2040AD, better than 1 arcsec from 1640AD to 2360AD, -- and remains below 3 arcsec for the whole of the period -- 500BC to 3000AD. The errors exceed 10 arcsec outside the -- range 1200BC to 3900AD, exceed 100 arcsec outside 4200BC to -- 5600AD and exceed 1000 arcsec outside 6800BC to 8200AD. -- -- Called: -- eraPrec76 accumulated precession angles, IAU 1976 -- eraIr initialize r-matrix to identity -- eraRz rotate around Z-axis -- eraRy rotate around Y-axis -- eraCr copy r-matrix -- -- References: -- -- Lieske, J.H., 1979, Astron.Astrophys. 73, 282. -- equations (6) & (7), p283. -- -- Kaplan,G.H., 1981. USNO circular no. 163, pA2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatp = ufunc.pmat76(date1, date2) -- return rmatp -- -- --def pn00(date1, date2, dpsi, deps): -- """ -- Wrapper for ERFA function ``eraPn00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- dpsi : double array -- deps : double array -- -- Returns -- ------- -- epsa : double array -- rb : double array -- rp : double array -- rbp : double array -- rn : double array -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P n 0 0 -- - - - - - - - - -- -- Precession-nutation, IAU 2000 model: a multi-purpose function, -- supporting classical (equinox-based) use directly and CIO-based -- use indirectly. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- dpsi,deps double nutation (Note 2) -- -- Returned: -- epsa double mean obliquity (Note 3) -- rb double[3][3] frame bias matrix (Note 4) -- rp double[3][3] precession matrix (Note 5) -- rbp double[3][3] bias-precession matrix (Note 6) -- rn double[3][3] nutation matrix (Note 7) -- rbpn double[3][3] GCRS-to-true matrix (Note 8) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The caller is responsible for providing the nutation components; -- they are in longitude and obliquity, in radians and are with -- respect to the equinox and ecliptic of date. For high-accuracy -- applications, free core nutation should be included as well as -- any other relevant corrections to the position of the CIP. -- -- 3) The returned mean obliquity is consistent with the IAU 2000 -- precession-nutation models. -- -- 4) The matrix rb transforms vectors from GCRS to J2000.0 mean -- equator and equinox by applying frame bias. -- -- 5) The matrix rp transforms vectors from J2000.0 mean equator and -- equinox to mean equator and equinox of date by applying -- precession. -- -- 6) The matrix rbp transforms vectors from GCRS to mean equator and -- equinox of date by applying frame bias then precession. It is -- the product rp x rb. -- -- 7) The matrix rn transforms vectors from mean equator and equinox of -- date to true equator and equinox of date by applying the nutation -- (luni-solar + planetary). -- -- 8) The matrix rbpn transforms vectors from GCRS to true equator and -- equinox of date. It is the product rn x rbp, applying frame -- bias, precession and nutation in that order. -- -- 9) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the order given. -- -- Called: -- eraPr00 IAU 2000 precession adjustments -- eraObl80 mean obliquity, IAU 1980 -- eraBp00 frame bias and precession matrices, IAU 2000 -- eraCr copy r-matrix -- eraNumat form nutation matrix -- eraRxr product of two r-matrices -- -- Reference: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- epsa, rb, rp, rbp, rn, rbpn = ufunc.pn00(date1, date2, dpsi, deps) -- return epsa, rb, rp, rbp, rn, rbpn -- -- --def pn00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraPn00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- epsa : double array -- rb : double array -- rp : double array -- rbp : double array -- rn : double array -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P n 0 0 a -- - - - - - - - - - -- -- Precession-nutation, IAU 2000A model: a multi-purpose function, -- supporting classical (equinox-based) use directly and CIO-based -- use indirectly. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation (Note 2) -- epsa double mean obliquity (Note 3) -- rb double[3][3] frame bias matrix (Note 4) -- rp double[3][3] precession matrix (Note 5) -- rbp double[3][3] bias-precession matrix (Note 6) -- rn double[3][3] nutation matrix (Note 7) -- rbpn double[3][3] GCRS-to-true matrix (Notes 8,9) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components (luni-solar + planetary, IAU 2000A) in -- longitude and obliquity are in radians and with respect to the -- equinox and ecliptic of date. Free core nutation is omitted; -- for the utmost accuracy, use the eraPn00 function, where the -- nutation components are caller-specified. For faster but -- slightly less accurate results, use the eraPn00b function. -- -- 3) The mean obliquity is consistent with the IAU 2000 precession. -- -- 4) The matrix rb transforms vectors from GCRS to J2000.0 mean -- equator and equinox by applying frame bias. -- -- 5) The matrix rp transforms vectors from J2000.0 mean equator and -- equinox to mean equator and equinox of date by applying -- precession. -- -- 6) The matrix rbp transforms vectors from GCRS to mean equator and -- equinox of date by applying frame bias then precession. It is -- the product rp x rb. -- -- 7) The matrix rn transforms vectors from mean equator and equinox -- of date to true equator and equinox of date by applying the -- nutation (luni-solar + planetary). -- -- 8) The matrix rbpn transforms vectors from GCRS to true equator and -- equinox of date. It is the product rn x rbp, applying frame -- bias, precession and nutation in that order. -- -- 9) The X,Y,Z coordinates of the IAU 2000A Celestial Intermediate -- Pole are elements (3,1-3) of the GCRS-to-true matrix, -- i.e. rbpn[2][0-2]. -- -- 10) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the order given. -- -- Called: -- eraNut00a nutation, IAU 2000A -- eraPn00 bias/precession/nutation results, IAU 2000 -- -- Reference: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps, epsa, rb, rp, rbp, rn, rbpn = ufunc.pn00a(date1, date2) -- return dpsi, deps, epsa, rb, rp, rbp, rn, rbpn -- -- --def pn00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraPn00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- epsa : double array -- rb : double array -- rp : double array -- rbp : double array -- rn : double array -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P n 0 0 b -- - - - - - - - - - -- -- Precession-nutation, IAU 2000B model: a multi-purpose function, -- supporting classical (equinox-based) use directly and CIO-based -- use indirectly. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation (Note 2) -- epsa double mean obliquity (Note 3) -- rb double[3][3] frame bias matrix (Note 4) -- rp double[3][3] precession matrix (Note 5) -- rbp double[3][3] bias-precession matrix (Note 6) -- rn double[3][3] nutation matrix (Note 7) -- rbpn double[3][3] GCRS-to-true matrix (Notes 8,9) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components (luni-solar + planetary, IAU 2000B) in -- longitude and obliquity are in radians and with respect to the -- equinox and ecliptic of date. For more accurate results, but -- at the cost of increased computation, use the eraPn00a function. -- For the utmost accuracy, use the eraPn00 function, where the -- nutation components are caller-specified. -- -- 3) The mean obliquity is consistent with the IAU 2000 precession. -- -- 4) The matrix rb transforms vectors from GCRS to J2000.0 mean -- equator and equinox by applying frame bias. -- -- 5) The matrix rp transforms vectors from J2000.0 mean equator and -- equinox to mean equator and equinox of date by applying -- precession. -- -- 6) The matrix rbp transforms vectors from GCRS to mean equator and -- equinox of date by applying frame bias then precession. It is -- the product rp x rb. -- -- 7) The matrix rn transforms vectors from mean equator and equinox -- of date to true equator and equinox of date by applying the -- nutation (luni-solar + planetary). -- -- 8) The matrix rbpn transforms vectors from GCRS to true equator and -- equinox of date. It is the product rn x rbp, applying frame -- bias, precession and nutation in that order. -- -- 9) The X,Y,Z coordinates of the IAU 2000B Celestial Intermediate -- Pole are elements (3,1-3) of the GCRS-to-true matrix, -- i.e. rbpn[2][0-2]. -- -- 10) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the stated order. -- -- Called: -- eraNut00b nutation, IAU 2000B -- eraPn00 bias/precession/nutation results, IAU 2000 -- -- Reference: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003). -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps, epsa, rb, rp, rbp, rn, rbpn = ufunc.pn00b(date1, date2) -- return dpsi, deps, epsa, rb, rp, rbp, rn, rbpn -- -- --def pn06(date1, date2, dpsi, deps): -- """ -- Wrapper for ERFA function ``eraPn06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- dpsi : double array -- deps : double array -- -- Returns -- ------- -- epsa : double array -- rb : double array -- rp : double array -- rbp : double array -- rn : double array -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P n 0 6 -- - - - - - - - - -- -- Precession-nutation, IAU 2006 model: a multi-purpose function, -- supporting classical (equinox-based) use directly and CIO-based use -- indirectly. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- dpsi,deps double nutation (Note 2) -- -- Returned: -- epsa double mean obliquity (Note 3) -- rb double[3][3] frame bias matrix (Note 4) -- rp double[3][3] precession matrix (Note 5) -- rbp double[3][3] bias-precession matrix (Note 6) -- rn double[3][3] nutation matrix (Note 7) -- rbpn double[3][3] GCRS-to-true matrix (Note 8) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The caller is responsible for providing the nutation components; -- they are in longitude and obliquity, in radians and are with -- respect to the equinox and ecliptic of date. For high-accuracy -- applications, free core nutation should be included as well as -- any other relevant corrections to the position of the CIP. -- -- 3) The returned mean obliquity is consistent with the IAU 2006 -- precession. -- -- 4) The matrix rb transforms vectors from GCRS to J2000.0 mean -- equator and equinox by applying frame bias. -- -- 5) The matrix rp transforms vectors from J2000.0 mean equator and -- equinox to mean equator and equinox of date by applying -- precession. -- -- 6) The matrix rbp transforms vectors from GCRS to mean equator and -- equinox of date by applying frame bias then precession. It is -- the product rp x rb. -- -- 7) The matrix rn transforms vectors from mean equator and equinox -- of date to true equator and equinox of date by applying the -- nutation (luni-solar + planetary). -- -- 8) The matrix rbpn transforms vectors from GCRS to true equator and -- equinox of date. It is the product rn x rbp, applying frame -- bias, precession and nutation in that order. -- -- 9) The X,Y,Z coordinates of the Celestial Intermediate Pole are -- elements (3,1-3) of the GCRS-to-true matrix, i.e. rbpn[2][0-2]. -- -- 10) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the stated order. -- -- Called: -- eraPfw06 bias-precession F-W angles, IAU 2006 -- eraFw2m F-W angles to r-matrix -- eraCr copy r-matrix -- eraTr transpose r-matrix -- eraRxr product of two r-matrices -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- epsa, rb, rp, rbp, rn, rbpn = ufunc.pn06(date1, date2, dpsi, deps) -- return epsa, rb, rp, rbp, rn, rbpn -- -- --def pn06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraPn06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsi : double array -- deps : double array -- epsa : double array -- rb : double array -- rp : double array -- rbp : double array -- rn : double array -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P n 0 6 a -- - - - - - - - - - -- -- Precession-nutation, IAU 2006/2000A models: a multi-purpose function, -- supporting classical (equinox-based) use directly and CIO-based use -- indirectly. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsi,deps double nutation (Note 2) -- epsa double mean obliquity (Note 3) -- rb double[3][3] frame bias matrix (Note 4) -- rp double[3][3] precession matrix (Note 5) -- rbp double[3][3] bias-precession matrix (Note 6) -- rn double[3][3] nutation matrix (Note 7) -- rbpn double[3][3] GCRS-to-true matrix (Notes 8,9) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The nutation components (luni-solar + planetary, IAU 2000A) in -- longitude and obliquity are in radians and with respect to the -- equinox and ecliptic of date. Free core nutation is omitted; -- for the utmost accuracy, use the eraPn06 function, where the -- nutation components are caller-specified. -- -- 3) The mean obliquity is consistent with the IAU 2006 precession. -- -- 4) The matrix rb transforms vectors from GCRS to mean J2000.0 by -- applying frame bias. -- -- 5) The matrix rp transforms vectors from mean J2000.0 to mean of -- date by applying precession. -- -- 6) The matrix rbp transforms vectors from GCRS to mean of date by -- applying frame bias then precession. It is the product rp x rb. -- -- 7) The matrix rn transforms vectors from mean of date to true of -- date by applying the nutation (luni-solar + planetary). -- -- 8) The matrix rbpn transforms vectors from GCRS to true of date -- (CIP/equinox). It is the product rn x rbp, applying frame bias, -- precession and nutation in that order. -- -- 9) The X,Y,Z coordinates of the IAU 2006/2000A Celestial -- Intermediate Pole are elements (3,1-3) of the GCRS-to-true -- matrix, i.e. rbpn[2][0-2]. -- -- 10) It is permissible to re-use the same array in the returned -- arguments. The arrays are filled in the stated order. -- -- Called: -- eraNut06a nutation, IAU 2006/2000A -- eraPn06 bias/precession/nutation results, IAU 2006 -- -- Reference: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsi, deps, epsa, rb, rp, rbp, rn, rbpn = ufunc.pn06a(date1, date2) -- return dpsi, deps, epsa, rb, rp, rbp, rn, rbpn -- -- --def pnm00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraPnm00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P n m 0 0 a -- - - - - - - - - - - -- -- Form the matrix of precession-nutation for a given date (including -- frame bias), equinox-based, IAU 2000A model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rbpn double[3][3] classical NPB matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rbpn * V(GCRS), where -- the p-vector V(date) is with respect to the true equatorial triad -- of date date1+date2 and the p-vector V(GCRS) is with respect to -- the Geocentric Celestial Reference System (IAU, 2000). -- -- 3) A faster, but slightly less accurate result (about 1 mas), can be -- obtained by using instead the eraPnm00b function. -- -- Called: -- eraPn00a bias/precession/nutation, IAU 2000A -- -- Reference: -- -- IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. -- 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. -- (2000) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rbpn = ufunc.pnm00a(date1, date2) -- return rbpn -- -- --def pnm00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraPnm00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rbpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P n m 0 0 b -- - - - - - - - - - - -- -- Form the matrix of precession-nutation for a given date (including -- frame bias), equinox-based, IAU 2000B model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rbpn double[3][3] bias-precession-nutation matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rbpn * V(GCRS), where -- the p-vector V(date) is with respect to the true equatorial triad -- of date date1+date2 and the p-vector V(GCRS) is with respect to -- the Geocentric Celestial Reference System (IAU, 2000). -- -- 3) The present function is faster, but slightly less accurate (about -- 1 mas), than the eraPnm00a function. -- -- Called: -- eraPn00b bias/precession/nutation, IAU 2000B -- -- Reference: -- -- IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. -- 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. -- (2000) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rbpn = ufunc.pnm00b(date1, date2) -- return rbpn -- -- --def pnm06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraPnm06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rnpb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P n m 0 6 a -- - - - - - - - - - - -- -- Form the matrix of precession-nutation for a given date (including -- frame bias), IAU 2006 precession and IAU 2000A nutation models. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- rnpb double[3][3] bias-precession-nutation matrix (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rnpb * V(GCRS), where -- the p-vector V(date) is with respect to the true equatorial triad -- of date date1+date2 and the p-vector V(GCRS) is with respect to -- the Geocentric Celestial Reference System (IAU, 2000). -- -- Called: -- eraPfw06 bias-precession F-W angles, IAU 2006 -- eraNut06a nutation, IAU 2006/2000A -- eraFw2m F-W angles to r-matrix -- -- Reference: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rnpb = ufunc.pnm06a(date1, date2) -- return rnpb -- -- --def pnm80(date1, date2): -- """ -- Wrapper for ERFA function ``eraPnm80``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rmatpn : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P n m 8 0 -- - - - - - - - - - -- -- Form the matrix of precession/nutation for a given date, IAU 1976 -- precession model, IAU 1980 nutation model. -- -- Given: -- date1,date2 double TDB date (Note 1) -- -- Returned: -- rmatpn double[3][3] combined precession/nutation matrix -- -- Notes: -- -- 1) The TDB date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TDB)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The matrix operates in the sense V(date) = rmatpn * V(J2000), -- where the p-vector V(date) is with respect to the true equatorial -- triad of date date1+date2 and the p-vector V(J2000) is with -- respect to the mean equatorial triad of epoch J2000.0. -- -- Called: -- eraPmat76 precession matrix, IAU 1976 -- eraNutm80 nutation matrix, IAU 1980 -- eraRxr product of two r-matrices -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 3.3 (p145). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rmatpn = ufunc.pnm80(date1, date2) -- return rmatpn -- -- --def pom00(xp, yp, sp): -- """ -- Wrapper for ERFA function ``eraPom00``. -- -- Parameters -- ---------- -- xp : double array -- yp : double array -- sp : double array -- -- Returns -- ------- -- rpom : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P o m 0 0 -- - - - - - - - - - - -- -- Form the matrix of polar motion for a given date, IAU 2000. -- -- Given: -- xp,yp double coordinates of the pole (radians, Note 1) -- sp double the TIO locator s' (radians, Note 2) -- -- Returned: -- rpom double[3][3] polar-motion matrix (Note 3) -- -- Notes: -- -- 1) The arguments xp and yp are the coordinates (in radians) of the -- Celestial Intermediate Pole with respect to the International -- Terrestrial Reference System (see IERS Conventions 2003), -- measured along the meridians to 0 and 90 deg west respectively. -- -- 2) The argument sp is the TIO locator s', in radians, which -- positions the Terrestrial Intermediate Origin on the equator. It -- is obtained from polar motion observations by numerical -- integration, and so is in essence unpredictable. However, it is -- dominated by a secular drift of about 47 microarcseconds per -- century, and so can be taken into account by using s' = -47*t, -- where t is centuries since J2000.0. The function eraSp00 -- implements this approximation. -- -- 3) The matrix operates in the sense V(TRS) = rpom * V(CIP), meaning -- that it is the final rotation when computing the pointing -- direction to a celestial source. -- -- Called: -- eraIr initialize r-matrix to identity -- eraRz rotate around Z-axis -- eraRy rotate around Y-axis -- eraRx rotate around X-axis -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rpom = ufunc.pom00(xp, yp, sp) -- return rpom -- -- --def pr00(date1, date2): -- """ -- Wrapper for ERFA function ``eraPr00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- dpsipr : double array -- depspr : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P r 0 0 -- - - - - - - - - -- -- Precession-rate part of the IAU 2000 precession-nutation models -- (part of MHB2000). -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- dpsipr,depspr double precession corrections (Notes 2,3) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The precession adjustments are expressed as "nutation -- components", corrections in longitude and obliquity with respect -- to the J2000.0 equinox and ecliptic. -- -- 3) Although the precession adjustments are stated to be with respect -- to Lieske et al. (1977), the MHB2000 model does not specify which -- set of Euler angles are to be used and how the adjustments are to -- be applied. The most literal and straightforward procedure is to -- adopt the 4-rotation epsilon_0, psi_A, omega_A, xi_A option, and -- to add dpsipr to psi_A and depspr to both omega_A and eps_A. -- -- 4) This is an implementation of one aspect of the IAU 2000A nutation -- model, formally adopted by the IAU General Assembly in 2000, -- namely MHB2000 (Mathews et al. 2002). -- -- References: -- -- Lieske, J.H., Lederle, T., Fricke, W. & Morando, B., "Expressions -- for the precession quantities based upon the IAU (1976) System of -- Astronomical Constants", Astron.Astrophys., 58, 1-16 (1977) -- -- Mathews, P.M., Herring, T.A., Buffet, B.A., "Modeling of nutation -- and precession New nutation series for nonrigid Earth and -- insights into the Earth's interior", J.Geophys.Res., 107, B4, -- 2002. The MHB2000 code itself was obtained on 9th September 2002 -- from ftp://maia.usno.navy.mil/conv2000/chapter5/IAU2000A. -- -- Wallace, P.T., "Software for Implementing the IAU 2000 -- Resolutions", in IERS Workshop 5.1 (2002). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dpsipr, depspr = ufunc.pr00(date1, date2) -- return dpsipr, depspr -- -- --def prec76(date01, date02, date11, date12): -- """ -- Wrapper for ERFA function ``eraPrec76``. -- -- Parameters -- ---------- -- date01 : double array -- date02 : double array -- date11 : double array -- date12 : double array -- -- Returns -- ------- -- zeta : double array -- z : double array -- theta : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P r e c 7 6 -- - - - - - - - - - - -- -- IAU 1976 precession model. -- -- This function forms the three Euler angles which implement general -- precession between two dates, using the IAU 1976 model (as for the -- FK5 catalog). -- -- Given: -- date01,date02 double TDB starting date (Note 1) -- date11,date12 double TDB ending date (Note 1) -- -- Returned: -- zeta double 1st rotation: radians cw around z -- z double 3rd rotation: radians cw around z -- theta double 2nd rotation: radians ccw around y -- -- Notes: -- -- 1) The dates date01+date02 and date11+date12 are Julian Dates, -- apportioned in any convenient way between the arguments daten1 -- and daten2. For example, JD(TDB)=2450123.7 could be expressed in -- any of these ways, among others: -- -- daten1 daten2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 method is best matched to the way the -- argument is handled internally and will deliver the optimum -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- The two dates may be expressed using different methods, but at -- the risk of losing some resolution. -- -- 2) The accumulated precession angles zeta, z, theta are expressed -- through canonical polynomials which are valid only for a limited -- time span. In addition, the IAU 1976 precession rate is known to -- be imperfect. The absolute accuracy of the present formulation -- is better than 0.1 arcsec from 1960AD to 2040AD, better than -- 1 arcsec from 1640AD to 2360AD, and remains below 3 arcsec for -- the whole of the period 500BC to 3000AD. The errors exceed -- 10 arcsec outside the range 1200BC to 3900AD, exceed 100 arcsec -- outside 4200BC to 5600AD and exceed 1000 arcsec outside 6800BC to -- 8200AD. -- -- 3) The three angles are returned in the conventional order, which -- is not the same as the order of the corresponding Euler -- rotations. The precession matrix is -- R_3(-z) x R_2(+theta) x R_3(-zeta). -- -- Reference: -- -- Lieske, J.H., 1979, Astron.Astrophys. 73, 282, equations -- (6) & (7), p283. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- zeta, z, theta = ufunc.prec76(date01, date02, date11, date12) -- return zeta, z, theta -- -- --def s00(date1, date2, x, y): -- """ -- Wrapper for ERFA function ``eraS00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- x : double array -- y : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a S 0 0 -- - - - - - - - -- -- The CIO locator s, positioning the Celestial Intermediate Origin on -- the equator of the Celestial Intermediate Pole, given the CIP's X,Y -- coordinates. Compatible with IAU 2000A precession-nutation. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- x,y double CIP coordinates (Note 3) -- -- Returned (function value): -- double the CIO locator s in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The CIO locator s is the difference between the right ascensions -- of the same point in two systems: the two systems are the GCRS -- and the CIP,CIO, and the point is the ascending node of the -- CIP equator. The quantity s remains below 0.1 arcsecond -- throughout 1900-2100. -- -- 3) The series used to compute s is in fact for s+XY/2, where X and Y -- are the x and y components of the CIP unit vector; this series -- is more compact than a direct series for s would be. This -- function requires X,Y to be supplied by the caller, who is -- responsible for providing values that are consistent with the -- supplied date. -- -- 4) The model is consistent with the IAU 2000A precession-nutation. -- -- Called: -- eraFal03 mean anomaly of the Moon -- eraFalp03 mean anomaly of the Sun -- eraFaf03 mean argument of the latitude of the Moon -- eraFad03 mean elongation of the Moon from the Sun -- eraFaom03 mean longitude of the Moon's ascending node -- eraFave03 mean longitude of Venus -- eraFae03 mean longitude of Earth -- eraFapa03 general accumulated precession in longitude -- -- References: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.s00(date1, date2, x, y) -- return c_retval -- -- --def s00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraS00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S 0 0 a -- - - - - - - - - -- -- The CIO locator s, positioning the Celestial Intermediate Origin on -- the equator of the Celestial Intermediate Pole, using the IAU 2000A -- precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double the CIO locator s in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The CIO locator s is the difference between the right ascensions -- of the same point in two systems. The two systems are the GCRS -- and the CIP,CIO, and the point is the ascending node of the -- CIP equator. The CIO locator s remains a small fraction of -- 1 arcsecond throughout 1900-2100. -- -- 3) The series used to compute s is in fact for s+XY/2, where X and Y -- are the x and y components of the CIP unit vector; this series -- is more compact than a direct series for s would be. The present -- function uses the full IAU 2000A nutation model when predicting -- the CIP position. Faster results, with no significant loss of -- accuracy, can be obtained via the function eraS00b, which uses -- instead the IAU 2000B truncated model. -- -- Called: -- eraPnm00a classical NPB matrix, IAU 2000A -- eraBnp2xy extract CIP X,Y from the BPN matrix -- eraS00 the CIO locator s, given X,Y, IAU 2000A -- -- References: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.s00a(date1, date2) -- return c_retval -- -- --def s00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraS00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S 0 0 b -- - - - - - - - - -- -- The CIO locator s, positioning the Celestial Intermediate Origin on -- the equator of the Celestial Intermediate Pole, using the IAU 2000B -- precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double the CIO locator s in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The CIO locator s is the difference between the right ascensions -- of the same point in two systems. The two systems are the GCRS -- and the CIP,CIO, and the point is the ascending node of the -- CIP equator. The CIO locator s remains a small fraction of -- 1 arcsecond throughout 1900-2100. -- -- 3) The series used to compute s is in fact for s+XY/2, where X and Y -- are the x and y components of the CIP unit vector; this series -- is more compact than a direct series for s would be. The present -- function uses the IAU 2000B truncated nutation model when -- predicting the CIP position. The function eraS00a uses instead -- the full IAU 2000A model, but with no significant increase in -- accuracy and at some cost in speed. -- -- Called: -- eraPnm00b classical NPB matrix, IAU 2000B -- eraBnp2xy extract CIP X,Y from the BPN matrix -- eraS00 the CIO locator s, given X,Y, IAU 2000A -- -- References: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.s00b(date1, date2) -- return c_retval -- -- --def s06(date1, date2, x, y): -- """ -- Wrapper for ERFA function ``eraS06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- x : double array -- y : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a S 0 6 -- - - - - - - - -- -- The CIO locator s, positioning the Celestial Intermediate Origin on -- the equator of the Celestial Intermediate Pole, given the CIP's X,Y -- coordinates. Compatible with IAU 2006/2000A precession-nutation. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- x,y double CIP coordinates (Note 3) -- -- Returned (function value): -- double the CIO locator s in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The CIO locator s is the difference between the right ascensions -- of the same point in two systems: the two systems are the GCRS -- and the CIP,CIO, and the point is the ascending node of the -- CIP equator. The quantity s remains below 0.1 arcsecond -- throughout 1900-2100. -- -- 3) The series used to compute s is in fact for s+XY/2, where X and Y -- are the x and y components of the CIP unit vector; this series -- is more compact than a direct series for s would be. This -- function requires X,Y to be supplied by the caller, who is -- responsible for providing values that are consistent with the -- supplied date. -- -- 4) The model is consistent with the "P03" precession (Capitaine et -- al. 2003), adopted by IAU 2006 Resolution 1, 2006, and the -- IAU 2000A nutation (with P03 adjustments). -- -- Called: -- eraFal03 mean anomaly of the Moon -- eraFalp03 mean anomaly of the Sun -- eraFaf03 mean argument of the latitude of the Moon -- eraFad03 mean elongation of the Moon from the Sun -- eraFaom03 mean longitude of the Moon's ascending node -- eraFave03 mean longitude of Venus -- eraFae03 mean longitude of Earth -- eraFapa03 general accumulated precession in longitude -- -- References: -- -- Capitaine, N., Wallace, P.T. & Chapront, J., 2003, Astron. -- Astrophys. 432, 355 -- -- McCarthy, D.D., Petit, G. (eds.) 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.s06(date1, date2, x, y) -- return c_retval -- -- --def s06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraS06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S 0 6 a -- - - - - - - - - -- -- The CIO locator s, positioning the Celestial Intermediate Origin on -- the equator of the Celestial Intermediate Pole, using the IAU 2006 -- precession and IAU 2000A nutation models. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double the CIO locator s in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The CIO locator s is the difference between the right ascensions -- of the same point in two systems. The two systems are the GCRS -- and the CIP,CIO, and the point is the ascending node of the -- CIP equator. The CIO locator s remains a small fraction of -- 1 arcsecond throughout 1900-2100. -- -- 3) The series used to compute s is in fact for s+XY/2, where X and Y -- are the x and y components of the CIP unit vector; this series is -- more compact than a direct series for s would be. The present -- function uses the full IAU 2000A nutation model when predicting -- the CIP position. -- -- Called: -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- -- References: -- -- Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., -- "Expressions for the Celestial Intermediate Pole and Celestial -- Ephemeris Origin consistent with the IAU 2000A precession- -- nutation model", Astron.Astrophys. 400, 1145-1154 (2003) -- -- n.b. The celestial ephemeris origin (CEO) was renamed "celestial -- intermediate origin" (CIO) by IAU 2006 Resolution 2. -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.s06a(date1, date2) -- return c_retval -- -- --def sp00(date1, date2): -- """ -- Wrapper for ERFA function ``eraSp00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S p 0 0 -- - - - - - - - - -- -- The TIO locator s', positioning the Terrestrial Intermediate Origin -- on the equator of the Celestial Intermediate Pole. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double the TIO locator s' in radians (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The TIO locator s' is obtained from polar motion observations by -- numerical integration, and so is in essence unpredictable. -- However, it is dominated by a secular drift of about -- 47 microarcseconds per century, which is the approximation -- evaluated by the present function. -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.sp00(date1, date2) -- return c_retval -- -- --def xy06(date1, date2): -- """ -- Wrapper for ERFA function ``eraXy06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- x : double array -- y : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a X y 0 6 -- - - - - - - - - -- -- X,Y coordinates of celestial intermediate pole from series based -- on IAU 2006 precession and IAU 2000A nutation. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- x,y double CIP X,Y coordinates (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The X,Y coordinates are those of the unit vector towards the -- celestial intermediate pole. They represent the combined effects -- of frame bias, precession and nutation. -- -- 3) The fundamental arguments used are as adopted in IERS Conventions -- (2003) and are from Simon et al. (1994) and Souchay et al. -- (1999). -- -- 4) This is an alternative to the angles-based method, via the ERFA -- function eraFw2xy and as used in eraXys06a for example. The two -- methods agree at the 1 microarcsecond level (at present), a -- negligible amount compared with the intrinsic accuracy of the -- models. However, it would be unwise to mix the two methods -- (angles-based and series-based) in a single application. -- -- Called: -- eraFal03 mean anomaly of the Moon -- eraFalp03 mean anomaly of the Sun -- eraFaf03 mean argument of the latitude of the Moon -- eraFad03 mean elongation of the Moon from the Sun -- eraFaom03 mean longitude of the Moon's ascending node -- eraFame03 mean longitude of Mercury -- eraFave03 mean longitude of Venus -- eraFae03 mean longitude of Earth -- eraFama03 mean longitude of Mars -- eraFaju03 mean longitude of Jupiter -- eraFasa03 mean longitude of Saturn -- eraFaur03 mean longitude of Uranus -- eraFane03 mean longitude of Neptune -- eraFapa03 general accumulated precession in longitude -- -- References: -- -- Capitaine, N., Wallace, P.T. & Chapront, J., 2003, -- Astron.Astrophys., 412, 567 -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G. & Laskar, J., Astron.Astrophys., 1994, 282, 663 -- -- Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M., 1999, -- Astron.Astrophys.Supp.Ser. 135, 111 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y = ufunc.xy06(date1, date2) -- return x, y -- -- --def xys00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraXys00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- x : double array -- y : double array -- s : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a X y s 0 0 a -- - - - - - - - - - - -- -- For a given TT date, compute the X,Y coordinates of the Celestial -- Intermediate Pole and the CIO locator s, using the IAU 2000A -- precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- x,y double Celestial Intermediate Pole (Note 2) -- s double the CIO locator s (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The Celestial Intermediate Pole coordinates are the x,y -- components of the unit vector in the Geocentric Celestial -- Reference System. -- -- 3) The CIO locator s (in radians) positions the Celestial -- Intermediate Origin on the equator of the CIP. -- -- 4) A faster, but slightly less accurate result (about 1 mas for -- X,Y), can be obtained by using instead the eraXys00b function. -- -- Called: -- eraPnm00a classical NPB matrix, IAU 2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS00 the CIO locator s, given X,Y, IAU 2000A -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y, s = ufunc.xys00a(date1, date2) -- return x, y, s -- -- --def xys00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraXys00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- x : double array -- y : double array -- s : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a X y s 0 0 b -- - - - - - - - - - - -- -- For a given TT date, compute the X,Y coordinates of the Celestial -- Intermediate Pole and the CIO locator s, using the IAU 2000B -- precession-nutation model. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- x,y double Celestial Intermediate Pole (Note 2) -- s double the CIO locator s (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The Celestial Intermediate Pole coordinates are the x,y -- components of the unit vector in the Geocentric Celestial -- Reference System. -- -- 3) The CIO locator s (in radians) positions the Celestial -- Intermediate Origin on the equator of the CIP. -- -- 4) The present function is faster, but slightly less accurate (about -- 1 mas in X,Y), than the eraXys00a function. -- -- Called: -- eraPnm00b classical NPB matrix, IAU 2000B -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS00 the CIO locator s, given X,Y, IAU 2000A -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y, s = ufunc.xys00b(date1, date2) -- return x, y, s -- -- --def xys06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraXys06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- x : double array -- y : double array -- s : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a X y s 0 6 a -- - - - - - - - - - - -- -- For a given TT date, compute the X,Y coordinates of the Celestial -- Intermediate Pole and the CIO locator s, using the IAU 2006 -- precession and IAU 2000A nutation models. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned: -- x,y double Celestial Intermediate Pole (Note 2) -- s double the CIO locator s (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The Celestial Intermediate Pole coordinates are the x,y components -- of the unit vector in the Geocentric Celestial Reference System. -- -- 3) The CIO locator s (in radians) positions the Celestial -- Intermediate Origin on the equator of the CIP. -- -- 4) Series-based solutions for generating X and Y are also available: -- see Capitaine & Wallace (2006) and eraXy06. -- -- Called: -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- -- References: -- -- Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- x, y, s = ufunc.xys06a(date1, date2) -- return x, y, s -- -- --def ee00(date1, date2, epsa, dpsi): -- """ -- Wrapper for ERFA function ``eraEe00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- epsa : double array -- dpsi : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a E e 0 0 -- - - - - - - - - -- -- The equation of the equinoxes, compatible with IAU 2000 resolutions, -- given the nutation in longitude and the mean obliquity. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- epsa double mean obliquity (Note 2) -- dpsi double nutation in longitude (Note 3) -- -- Returned (function value): -- double equation of the equinoxes (Note 4) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The obliquity, in radians, is mean of date. -- -- 3) The result, which is in radians, operates in the following sense: -- -- Greenwich apparent ST = GMST + equation of the equinoxes -- -- 4) The result is compatible with the IAU 2000 resolutions. For -- further details, see IERS Conventions 2003 and Capitaine et al. -- (2002). -- -- Called: -- eraEect00 equation of the equinoxes complementary terms -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.ee00(date1, date2, epsa, dpsi) -- return c_retval -- -- --def ee00a(date1, date2): -- """ -- Wrapper for ERFA function ``eraEe00a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E e 0 0 a -- - - - - - - - - - -- -- Equation of the equinoxes, compatible with IAU 2000 resolutions. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double equation of the equinoxes (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result, which is in radians, operates in the following sense: -- -- Greenwich apparent ST = GMST + equation of the equinoxes -- -- 3) The result is compatible with the IAU 2000 resolutions. For -- further details, see IERS Conventions 2003 and Capitaine et al. -- (2002). -- -- Called: -- eraPr00 IAU 2000 precession adjustments -- eraObl80 mean obliquity, IAU 1980 -- eraNut00a nutation, IAU 2000A -- eraEe00 equation of the equinoxes, IAU 2000 -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003). -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.ee00a(date1, date2) -- return c_retval -- -- --def ee00b(date1, date2): -- """ -- Wrapper for ERFA function ``eraEe00b``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E e 0 0 b -- - - - - - - - - - -- -- Equation of the equinoxes, compatible with IAU 2000 resolutions but -- using the truncated nutation model IAU 2000B. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double equation of the equinoxes (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result, which is in radians, operates in the following sense: -- -- Greenwich apparent ST = GMST + equation of the equinoxes -- -- 3) The result is compatible with the IAU 2000 resolutions except -- that accuracy has been compromised for the sake of speed. For -- further details, see McCarthy & Luzum (2001), IERS Conventions -- 2003 and Capitaine et al. (2003). -- -- Called: -- eraPr00 IAU 2000 precession adjustments -- eraObl80 mean obliquity, IAU 1980 -- eraNut00b nutation, IAU 2000B -- eraEe00 equation of the equinoxes, IAU 2000 -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003) -- -- McCarthy, D.D. & Luzum, B.J., "An abridged model of the -- precession-nutation of the celestial pole", Celestial Mechanics & -- Dynamical Astronomy, 85, 37-49 (2003) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.ee00b(date1, date2) -- return c_retval -- -- --def ee06a(date1, date2): -- """ -- Wrapper for ERFA function ``eraEe06a``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E e 0 6 a -- - - - - - - - - - -- -- Equation of the equinoxes, compatible with IAU 2000 resolutions and -- IAU 2006/2000A precession-nutation. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double equation of the equinoxes (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result, which is in radians, operates in the following sense: -- -- Greenwich apparent ST = GMST + equation of the equinoxes -- -- Called: -- eraAnpm normalize angle into range +/- pi -- eraGst06a Greenwich apparent sidereal time, IAU 2006/2000A -- eraGmst06 Greenwich mean sidereal time, IAU 2006 -- -- Reference: -- -- McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), -- IERS Technical Note No. 32, BKG -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.ee06a(date1, date2) -- return c_retval -- -- --def eect00(date1, date2): -- """ -- Wrapper for ERFA function ``eraEect00``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E e c t 0 0 -- - - - - - - - - - - -- -- Equation of the equinoxes complementary terms, consistent with -- IAU 2000 resolutions. -- -- Given: -- date1,date2 double TT as a 2-part Julian Date (Note 1) -- -- Returned (function value): -- double complementary terms (Note 2) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The "complementary terms" are part of the equation of the -- equinoxes (EE), classically the difference between apparent and -- mean Sidereal Time: -- -- GAST = GMST + EE -- -- with: -- -- EE = dpsi * cos(eps) -- -- where dpsi is the nutation in longitude and eps is the obliquity -- of date. However, if the rotation of the Earth were constant in -- an inertial frame the classical formulation would lead to -- apparent irregularities in the UT1 timescale traceable to side- -- effects of precession-nutation. In order to eliminate these -- effects from UT1, "complementary terms" were introduced in 1994 -- (IAU, 1994) and took effect from 1997 (Capitaine and Gontier, -- 1993): -- -- GAST = GMST + CT + EE -- -- By convention, the complementary terms are included as part of -- the equation of the equinoxes rather than as part of the mean -- Sidereal Time. This slightly compromises the "geometrical" -- interpretation of mean sidereal time but is otherwise -- inconsequential. -- -- The present function computes CT in the above expression, -- compatible with IAU 2000 resolutions (Capitaine et al., 2002, and -- IERS Conventions 2003). -- -- Called: -- eraFal03 mean anomaly of the Moon -- eraFalp03 mean anomaly of the Sun -- eraFaf03 mean argument of the latitude of the Moon -- eraFad03 mean elongation of the Moon from the Sun -- eraFaom03 mean longitude of the Moon's ascending node -- eraFave03 mean longitude of Venus -- eraFae03 mean longitude of Earth -- eraFapa03 general accumulated precession in longitude -- -- References: -- -- Capitaine, N. & Gontier, A.-M., Astron.Astrophys., 275, -- 645-650 (1993) -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astron.Astrophys., 406, -- 1135-1149 (2003) -- -- IAU Resolution C7, Recommendation 3 (1994) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.eect00(date1, date2) -- return c_retval -- -- --def eqeq94(date1, date2): -- """ -- Wrapper for ERFA function ``eraEqeq94``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E q e q 9 4 -- - - - - - - - - - - -- -- Equation of the equinoxes, IAU 1994 model. -- -- Given: -- date1,date2 double TDB date (Note 1) -- -- Returned (function value): -- double equation of the equinoxes (Note 2) -- -- Notes: -- -- 1) The date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The result, which is in radians, operates in the following sense: -- -- Greenwich apparent ST = GMST + equation of the equinoxes -- -- Called: -- eraAnpm normalize angle into range +/- pi -- eraNut80 nutation, IAU 1980 -- eraObl80 mean obliquity, IAU 1980 -- -- References: -- -- IAU Resolution C7, Recommendation 3 (1994). -- -- Capitaine, N. & Gontier, A.-M., 1993, Astron.Astrophys., 275, -- 645-650. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.eqeq94(date1, date2) -- return c_retval -- -- --def era00(dj1, dj2): -- """ -- Wrapper for ERFA function ``eraEra00``. -- -- Parameters -- ---------- -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E r a 0 0 -- - - - - - - - - - -- -- Earth rotation angle (IAU 2000 model). -- -- Given: -- dj1,dj2 double UT1 as a 2-part Julian Date (see note) -- -- Returned (function value): -- double Earth rotation angle (radians), range 0-2pi -- -- Notes: -- -- 1) The UT1 date dj1+dj2 is a Julian Date, apportioned in any -- convenient way between the arguments dj1 and dj2. For example, -- JD(UT1)=2450123.7 could be expressed in any of these ways, -- among others: -- -- dj1 dj2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. The date & time method is -- best matched to the algorithm used: maximum precision is -- delivered when the dj1 argument is for 0hrs UT1 on the day in -- question and the dj2 argument lies in the range 0 to 1, or vice -- versa. -- -- 2) The algorithm is adapted from Expression 22 of Capitaine et al. -- 2000. The time argument has been expressed in days directly, -- and, to retain precision, integer contributions have been -- eliminated. The same formulation is given in IERS Conventions -- (2003), Chap. 5, Eq. 14. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Capitaine N., Guinot B. and McCarthy D.D, 2000, Astron. -- Astrophys., 355, 398-405. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.era00(dj1, dj2) -- return c_retval -- -- --def gmst00(uta, utb, tta, ttb): -- """ -- Wrapper for ERFA function ``eraGmst00``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- tta : double array -- ttb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G m s t 0 0 -- - - - - - - - - - - -- -- Greenwich mean sidereal time (model consistent with IAU 2000 -- resolutions). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- tta,ttb double TT as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich mean sidereal time (radians) -- -- Notes: -- -- 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both -- Julian Dates, apportioned in any convenient way between the -- argument pairs. For example, JD=2450123.7 could be expressed in -- any of these ways, among others: -- -- Part A Part B -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable (in the case of UT; the TT is not at all critical -- in this respect). The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- Rotation Angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) Both UT1 and TT are required, UT1 to predict the Earth rotation -- and TT to predict the effects of precession. If UT1 is used for -- both purposes, errors of order 100 microarcseconds result. -- -- 3) This GMST is compatible with the IAU 2000 resolutions and must be -- used only in conjunction with other IAU 2000 compatible -- components such as precession-nutation and equation of the -- equinoxes. -- -- 4) The result is returned in the range 0 to 2pi. -- -- 5) The algorithm is from Capitaine et al. (2003) and IERS -- Conventions 2003. -- -- Called: -- eraEra00 Earth rotation angle, IAU 2000 -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gmst00(uta, utb, tta, ttb) -- return c_retval -- -- --def gmst06(uta, utb, tta, ttb): -- """ -- Wrapper for ERFA function ``eraGmst06``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- tta : double array -- ttb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G m s t 0 6 -- - - - - - - - - - - -- -- Greenwich mean sidereal time (consistent with IAU 2006 precession). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- tta,ttb double TT as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich mean sidereal time (radians) -- -- Notes: -- -- 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both -- Julian Dates, apportioned in any convenient way between the -- argument pairs. For example, JD=2450123.7 could be expressed in -- any of these ways, among others: -- -- Part A Part B -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable (in the case of UT; the TT is not at all critical -- in this respect). The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- rotation angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) Both UT1 and TT are required, UT1 to predict the Earth rotation -- and TT to predict the effects of precession. If UT1 is used for -- both purposes, errors of order 100 microarcseconds result. -- -- 3) This GMST is compatible with the IAU 2006 precession and must not -- be used with other precession models. -- -- 4) The result is returned in the range 0 to 2pi. -- -- Called: -- eraEra00 Earth rotation angle, IAU 2000 -- eraAnp normalize angle into range 0 to 2pi -- -- Reference: -- -- Capitaine, N., Wallace, P.T. & Chapront, J., 2005, -- Astron.Astrophys. 432, 355 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gmst06(uta, utb, tta, ttb) -- return c_retval -- -- --def gmst82(dj1, dj2): -- """ -- Wrapper for ERFA function ``eraGmst82``. -- -- Parameters -- ---------- -- dj1 : double array -- dj2 : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G m s t 8 2 -- - - - - - - - - - - -- -- Universal Time to Greenwich mean sidereal time (IAU 1982 model). -- -- Given: -- dj1,dj2 double UT1 Julian Date (see note) -- -- Returned (function value): -- double Greenwich mean sidereal time (radians) -- -- Notes: -- -- 1) The UT1 date dj1+dj2 is a Julian Date, apportioned in any -- convenient way between the arguments dj1 and dj2. For example, -- JD(UT1)=2450123.7 could be expressed in any of these ways, -- among others: -- -- dj1 dj2 -- -- 2450123.7 0 (JD method) -- 2451545 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. The date & time method is -- best matched to the algorithm used: maximum accuracy (or, at -- least, minimum noise) is delivered when the dj1 argument is for -- 0hrs UT1 on the day in question and the dj2 argument lies in the -- range 0 to 1, or vice versa. -- -- 2) The algorithm is based on the IAU 1982 expression. This is -- always described as giving the GMST at 0 hours UT1. In fact, it -- gives the difference between the GMST and the UT, the steady -- 4-minutes-per-day drawing-ahead of ST with respect to UT. When -- whole days are ignored, the expression happens to equal the GMST -- at 0 hours UT1 each day. -- -- 3) In this function, the entire UT1 (the sum of the two arguments -- dj1 and dj2) is used directly as the argument for the standard -- formula, the constant term of which is adjusted by 12 hours to -- take account of the noon phasing of Julian Date. The UT1 is then -- added, but omitting whole days to conserve accuracy. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Transactions of the International Astronomical Union, -- XVIII B, 67 (1983). -- -- Aoki et al., Astron.Astrophys., 105, 359-361 (1982). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gmst82(dj1, dj2) -- return c_retval -- -- --def gst00a(uta, utb, tta, ttb): -- """ -- Wrapper for ERFA function ``eraGst00a``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- tta : double array -- ttb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G s t 0 0 a -- - - - - - - - - - - -- -- Greenwich apparent sidereal time (consistent with IAU 2000 -- resolutions). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- tta,ttb double TT as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich apparent sidereal time (radians) -- -- Notes: -- -- 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both -- Julian Dates, apportioned in any convenient way between the -- argument pairs. For example, JD=2450123.7 could be expressed in -- any of these ways, among others: -- -- Part A Part B -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable (in the case of UT; the TT is not at all critical -- in this respect). The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- Rotation Angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) Both UT1 and TT are required, UT1 to predict the Earth rotation -- and TT to predict the effects of precession-nutation. If UT1 is -- used for both purposes, errors of order 100 microarcseconds -- result. -- -- 3) This GAST is compatible with the IAU 2000 resolutions and must be -- used only in conjunction with other IAU 2000 compatible -- components such as precession-nutation. -- -- 4) The result is returned in the range 0 to 2pi. -- -- 5) The algorithm is from Capitaine et al. (2003) and IERS -- Conventions 2003. -- -- Called: -- eraGmst00 Greenwich mean sidereal time, IAU 2000 -- eraEe00a equation of the equinoxes, IAU 2000A -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gst00a(uta, utb, tta, ttb) -- return c_retval -- -- --def gst00b(uta, utb): -- """ -- Wrapper for ERFA function ``eraGst00b``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G s t 0 0 b -- - - - - - - - - - - -- -- Greenwich apparent sidereal time (consistent with IAU 2000 -- resolutions but using the truncated nutation model IAU 2000B). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich apparent sidereal time (radians) -- -- Notes: -- -- 1) The UT1 date uta+utb is a Julian Date, apportioned in any -- convenient way between the argument pair. For example, -- JD=2450123.7 could be expressed in any of these ways, among -- others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- Rotation Angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) The result is compatible with the IAU 2000 resolutions, except -- that accuracy has been compromised for the sake of speed and -- convenience in two respects: -- -- . UT is used instead of TDB (or TT) to compute the precession -- component of GMST and the equation of the equinoxes. This -- results in errors of order 0.1 mas at present. -- -- . The IAU 2000B abridged nutation model (McCarthy & Luzum, 2001) -- is used, introducing errors of up to 1 mas. -- -- 3) This GAST is compatible with the IAU 2000 resolutions and must be -- used only in conjunction with other IAU 2000 compatible -- components such as precession-nutation. -- -- 4) The result is returned in the range 0 to 2pi. -- -- 5) The algorithm is from Capitaine et al. (2003) and IERS -- Conventions 2003. -- -- Called: -- eraGmst00 Greenwich mean sidereal time, IAU 2000 -- eraEe00b equation of the equinoxes, IAU 2000B -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to -- implement the IAU 2000 definition of UT1", Astronomy & -- Astrophysics, 406, 1135-1149 (2003) -- -- McCarthy, D.D. & Luzum, B.J., "An abridged model of the -- precession-nutation of the celestial pole", Celestial Mechanics & -- Dynamical Astronomy, 85, 37-49 (2003) -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gst00b(uta, utb) -- return c_retval -- -- --def gst06(uta, utb, tta, ttb, rnpb): -- """ -- Wrapper for ERFA function ``eraGst06``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- tta : double array -- ttb : double array -- rnpb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a G s t 0 6 -- - - - - - - - - - -- -- Greenwich apparent sidereal time, IAU 2006, given the NPB matrix. -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- tta,ttb double TT as a 2-part Julian Date (Notes 1,2) -- rnpb double[3][3] nutation x precession x bias matrix -- -- Returned (function value): -- double Greenwich apparent sidereal time (radians) -- -- Notes: -- -- 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both -- Julian Dates, apportioned in any convenient way between the -- argument pairs. For example, JD=2450123.7 could be expressed in -- any of these ways, among others: -- -- Part A Part B -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable (in the case of UT; the TT is not at all critical -- in this respect). The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- rotation angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) Both UT1 and TT are required, UT1 to predict the Earth rotation -- and TT to predict the effects of precession-nutation. If UT1 is -- used for both purposes, errors of order 100 microarcseconds -- result. -- -- 3) Although the function uses the IAU 2006 series for s+XY/2, it is -- otherwise independent of the precession-nutation model and can in -- practice be used with any equinox-based NPB matrix. -- -- 4) The result is returned in the range 0 to 2pi. -- -- Called: -- eraBpn2xy extract CIP X,Y coordinates from NPB matrix -- eraS06 the CIO locator s, given X,Y, IAU 2006 -- eraAnp normalize angle into range 0 to 2pi -- eraEra00 Earth rotation angle, IAU 2000 -- eraEors equation of the origins, given NPB matrix and s -- -- Reference: -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gst06(uta, utb, tta, ttb, rnpb) -- return c_retval -- -- --def gst06a(uta, utb, tta, ttb): -- """ -- Wrapper for ERFA function ``eraGst06a``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- tta : double array -- ttb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G s t 0 6 a -- - - - - - - - - - - -- -- Greenwich apparent sidereal time (consistent with IAU 2000 and 2006 -- resolutions). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- tta,ttb double TT as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich apparent sidereal time (radians) -- -- Notes: -- -- 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both -- Julian Dates, apportioned in any convenient way between the -- argument pairs. For example, JD=2450123.7 could be expressed in -- any of these ways, among others: -- -- Part A Part B -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable (in the case of UT; the TT is not at all critical -- in this respect). The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- rotation angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) Both UT1 and TT are required, UT1 to predict the Earth rotation -- and TT to predict the effects of precession-nutation. If UT1 is -- used for both purposes, errors of order 100 microarcseconds -- result. -- -- 3) This GAST is compatible with the IAU 2000/2006 resolutions and -- must be used only in conjunction with IAU 2006 precession and -- IAU 2000A nutation. -- -- 4) The result is returned in the range 0 to 2pi. -- -- Called: -- eraPnm06a classical NPB matrix, IAU 2006/2000A -- eraGst06 Greenwich apparent ST, IAU 2006, given NPB matrix -- -- Reference: -- -- Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gst06a(uta, utb, tta, ttb) -- return c_retval -- -- --def gst94(uta, utb): -- """ -- Wrapper for ERFA function ``eraGst94``. -- -- Parameters -- ---------- -- uta : double array -- utb : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a G s t 9 4 -- - - - - - - - - - -- -- Greenwich apparent sidereal time (consistent with IAU 1982/94 -- resolutions). -- -- Given: -- uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) -- -- Returned (function value): -- double Greenwich apparent sidereal time (radians) -- -- Notes: -- -- 1) The UT1 date uta+utb is a Julian Date, apportioned in any -- convenient way between the argument pair. For example, -- JD=2450123.7 could be expressed in any of these ways, among -- others: -- -- uta utb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in cases -- where the loss of several decimal digits of resolution is -- acceptable. The J2000 and MJD methods are good compromises -- between resolution and convenience. For UT, the date & time -- method is best matched to the algorithm that is used by the Earth -- Rotation Angle function, called internally: maximum precision is -- delivered when the uta argument is for 0hrs UT1 on the day in -- question and the utb argument lies in the range 0 to 1, or vice -- versa. -- -- 2) The result is compatible with the IAU 1982 and 1994 resolutions, -- except that accuracy has been compromised for the sake of -- convenience in that UT is used instead of TDB (or TT) to compute -- the equation of the equinoxes. -- -- 3) This GAST must be used only in conjunction with contemporaneous -- IAU standards such as 1976 precession, 1980 obliquity and 1982 -- nutation. It is not compatible with the IAU 2000 resolutions. -- -- 4) The result is returned in the range 0 to 2pi. -- -- Called: -- eraGmst82 Greenwich mean sidereal time, IAU 1982 -- eraEqeq94 equation of the equinoxes, IAU 1994 -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- IAU Resolution C7, Recommendation 3 (1994) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.gst94(uta, utb) -- return c_retval -- -- --def pvstar(pv): -- """ -- Wrapper for ERFA function ``eraPvstar``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- ra : double array -- dec : double array -- pmr : double array -- pmd : double array -- px : double array -- rv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P v s t a r -- - - - - - - - - - - -- -- Convert star position+velocity vector to catalog coordinates. -- -- Given (Note 1): -- pv double[2][3] pv-vector (au, au/day) -- -- Returned (Note 2): -- ra double right ascension (radians) -- dec double declination (radians) -- pmr double RA proper motion (radians/year) -- pmd double Dec proper motion (radians/year) -- px double parallax (arcsec) -- rv double radial velocity (km/s, positive = receding) -- -- Returned (function value): -- int status: -- 0 = OK -- -1 = superluminal speed (Note 5) -- -2 = null position vector -- -- Notes: -- -- 1) The specified pv-vector is the coordinate direction (and its rate -- of change) for the date at which the light leaving the star -- reached the solar-system barycenter. -- -- 2) The star data returned by this function are "observables" for an -- imaginary observer at the solar-system barycenter. Proper motion -- and radial velocity are, strictly, in terms of barycentric -- coordinate time, TCB. For most practical applications, it is -- permissible to neglect the distinction between TCB and ordinary -- "proper" time on Earth (TT/TAI). The result will, as a rule, be -- limited by the intrinsic accuracy of the proper-motion and -- radial-velocity data; moreover, the supplied pv-vector is likely -- to be merely an intermediate result (for example generated by the -- function eraStarpv), so that a change of time unit will cancel -- out overall. -- -- In accordance with normal star-catalog conventions, the object's -- right ascension and declination are freed from the effects of -- secular aberration. The frame, which is aligned to the catalog -- equator and equinox, is Lorentzian and centered on the SSB. -- -- Summarizing, the specified pv-vector is for most stars almost -- identical to the result of applying the standard geometrical -- "space motion" transformation to the catalog data. The -- differences, which are the subject of the Stumpff paper cited -- below, are: -- -- (i) In stars with significant radial velocity and proper motion, -- the constantly changing light-time distorts the apparent proper -- motion. Note that this is a classical, not a relativistic, -- effect. -- -- (ii) The transformation complies with special relativity. -- -- 3) Care is needed with units. The star coordinates are in radians -- and the proper motions in radians per Julian year, but the -- parallax is in arcseconds; the radial velocity is in km/s, but -- the pv-vector result is in au and au/day. -- -- 4) The proper motions are the rate of change of the right ascension -- and declination at the catalog epoch and are in radians per Julian -- year. The RA proper motion is in terms of coordinate angle, not -- true angle, and will thus be numerically larger at high -- declinations. -- -- 5) Straight-line motion at constant speed in the inertial frame is -- assumed. If the speed is greater than or equal to the speed of -- light, the function aborts with an error status. -- -- 6) The inverse transformation is performed by the function eraStarpv. -- -- Called: -- eraPn decompose p-vector into modulus and direction -- eraPdp scalar product of two p-vectors -- eraSxp multiply p-vector by scalar -- eraPmp p-vector minus p-vector -- eraPm modulus of p-vector -- eraPpp p-vector plus p-vector -- eraPv2s pv-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Reference: -- -- Stumpff, P., 1985, Astron.Astrophys. 144, 232-240. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ra, dec, pmr, pmd, px, rv, c_retval = ufunc.pvstar(pv) -- check_errwarn(c_retval, 'pvstar') -- return ra, dec, pmr, pmd, px, rv -- -- --STATUS_CODES['pvstar'] = {0: 'OK', -1: 'superluminal speed (Note 5)', -2: 'null position vector'} -- -- --def starpv(ra, dec, pmr, pmd, px, rv): -- """ -- Wrapper for ERFA function ``eraStarpv``. -- -- Parameters -- ---------- -- ra : double array -- dec : double array -- pmr : double array -- pmd : double array -- px : double array -- rv : double array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a S t a r p v -- - - - - - - - - - - -- -- Convert star catalog coordinates to position+velocity vector. -- -- Given (Note 1): -- ra double right ascension (radians) -- dec double declination (radians) -- pmr double RA proper motion (radians/year) -- pmd double Dec proper motion (radians/year) -- px double parallax (arcseconds) -- rv double radial velocity (km/s, positive = receding) -- -- Returned (Note 2): -- pv double[2][3] pv-vector (au, au/day) -- -- Returned (function value): -- int status: -- 0 = no warnings -- 1 = distance overridden (Note 6) -- 2 = excessive speed (Note 7) -- 4 = solution didn't converge (Note 8) -- else = binary logical OR of the above -- -- Notes: -- -- 1) The star data accepted by this function are "observables" for an -- imaginary observer at the solar-system barycenter. Proper motion -- and radial velocity are, strictly, in terms of barycentric -- coordinate time, TCB. For most practical applications, it is -- permissible to neglect the distinction between TCB and ordinary -- "proper" time on Earth (TT/TAI). The result will, as a rule, be -- limited by the intrinsic accuracy of the proper-motion and -- radial-velocity data; moreover, the pv-vector is likely to be -- merely an intermediate result, so that a change of time unit -- would cancel out overall. -- -- In accordance with normal star-catalog conventions, the object's -- right ascension and declination are freed from the effects of -- secular aberration. The frame, which is aligned to the catalog -- equator and equinox, is Lorentzian and centered on the SSB. -- -- 2) The resulting position and velocity pv-vector is with respect to -- the same frame and, like the catalog coordinates, is freed from -- the effects of secular aberration. Should the "coordinate -- direction", where the object was located at the catalog epoch, be -- required, it may be obtained by calculating the magnitude of the -- position vector pv[0][0-2] dividing by the speed of light in -- au/day to give the light-time, and then multiplying the space -- velocity pv[1][0-2] by this light-time and adding the result to -- pv[0][0-2]. -- -- Summarizing, the pv-vector returned is for most stars almost -- identical to the result of applying the standard geometrical -- "space motion" transformation. The differences, which are the -- subject of the Stumpff paper referenced below, are: -- -- (i) In stars with significant radial velocity and proper motion, -- the constantly changing light-time distorts the apparent proper -- motion. Note that this is a classical, not a relativistic, -- effect. -- -- (ii) The transformation complies with special relativity. -- -- 3) Care is needed with units. The star coordinates are in radians -- and the proper motions in radians per Julian year, but the -- parallax is in arcseconds; the radial velocity is in km/s, but -- the pv-vector result is in au and au/day. -- -- 4) The RA proper motion is in terms of coordinate angle, not true -- angle. If the catalog uses arcseconds for both RA and Dec proper -- motions, the RA proper motion will need to be divided by cos(Dec) -- before use. -- -- 5) Straight-line motion at constant speed, in the inertial frame, -- is assumed. -- -- 6) An extremely small (or zero or negative) parallax is interpreted -- to mean that the object is on the "celestial sphere", the radius -- of which is an arbitrary (large) value (see the constant PXMIN). -- When the distance is overridden in this way, the status, -- initially zero, has 1 added to it. -- -- 7) If the space velocity is a significant fraction of c (see the -- constant VMAX), it is arbitrarily set to zero. When this action -- occurs, 2 is added to the status. -- -- 8) The relativistic adjustment involves an iterative calculation. -- If the process fails to converge within a set number (IMAX) of -- iterations, 4 is added to the status. -- -- 9) The inverse transformation is performed by the function -- eraPvstar. -- -- Called: -- eraS2pv spherical coordinates to pv-vector -- eraPm modulus of p-vector -- eraZp zero p-vector -- eraPn decompose p-vector into modulus and direction -- eraPdp scalar product of two p-vectors -- eraSxp multiply p-vector by scalar -- eraPmp p-vector minus p-vector -- eraPpp p-vector plus p-vector -- -- Reference: -- -- Stumpff, P., 1985, Astron.Astrophys. 144, 232-240. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv, c_retval = ufunc.starpv(ra, dec, pmr, pmd, px, rv) -- check_errwarn(c_retval, 'starpv') -- return pv -- -- --STATUS_CODES['starpv'] = {0: 'no warnings', 1: 'distance overridden (Note 6)', 2: 'excessive speed (Note 7)', 4: "solution didn't converge (Note 8)", 'else': 'binary logical OR of the above'} -- -- --def fk425(r1950, d1950, dr1950, dd1950, p1950, v1950): -- """ -- Wrapper for ERFA function ``eraFk425``. -- -- Parameters -- ---------- -- r1950 : double array -- d1950 : double array -- dr1950 : double array -- dd1950 : double array -- p1950 : double array -- v1950 : double array -- -- Returns -- ------- -- r2000 : double array -- d2000 : double array -- dr2000 : double array -- dd2000 : double array -- p2000 : double array -- v2000 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 4 2 5 -- - - - - - - - - - -- -- Convert B1950.0 FK4 star catalog data to J2000.0 FK5. -- -- This function converts a star's catalog data from the old FK4 -- (Bessel-Newcomb) system to the later IAU 1976 FK5 (Fricke) system. -- -- Given: (all B1950.0, FK4) -- r1950,d1950 double B1950.0 RA,Dec (rad) -- dr1950,dd1950 double B1950.0 proper motions (rad/trop.yr) -- p1950 double parallax (arcsec) -- v1950 double radial velocity (km/s, +ve = moving away) -- -- Returned: (all J2000.0, FK5) -- r2000,d2000 double J2000.0 RA,Dec (rad) -- dr2000,dd2000 double J2000.0 proper motions (rad/Jul.yr) -- p2000 double parallax (arcsec) -- v2000 double radial velocity (km/s, +ve = moving away) -- -- Notes: -- -- 1) The proper motions in RA are dRA/dt rather than cos(Dec)*dRA/dt, -- and are per year rather than per century. -- -- 2) The conversion is somewhat complicated, for several reasons: -- -- . Change of standard epoch from B1950.0 to J2000.0. -- -- . An intermediate transition date of 1984 January 1.0 TT. -- -- . A change of precession model. -- -- . Change of time unit for proper motion (tropical to Julian). -- -- . FK4 positions include the E-terms of aberration, to simplify -- the hand computation of annual aberration. FK5 positions -- assume a rigorous aberration computation based on the Earth's -- barycentric velocity. -- -- . The E-terms also affect proper motions, and in particular cause -- objects at large distances to exhibit fictitious proper -- motions. -- -- The algorithm is based on Smith et al. (1989) and Yallop et al. -- (1989), which presented a matrix method due to Standish (1982) as -- developed by Aoki et al. (1983), using Kinoshita's development of -- Andoyer's post-Newcomb precession. The numerical constants from -- Seidelmann (1992) are used canonically. -- -- 3) Conversion from B1950.0 FK4 to J2000.0 FK5 only is provided for. -- Conversions for different epochs and equinoxes would require -- additional treatment for precession, proper motion and E-terms. -- -- 4) In the FK4 catalog the proper motions of stars within 10 degrees -- of the poles do not embody differential E-terms effects and -- should, strictly speaking, be handled in a different manner from -- stars outside these regions. However, given the general lack of -- homogeneity of the star data available for routine astrometry, -- the difficulties of handling positions that may have been -- determined from astrometric fields spanning the polar and non- -- polar regions, the likelihood that the differential E-terms -- effect was not taken into account when allowing for proper motion -- in past astrometry, and the undesirability of a discontinuity in -- the algorithm, the decision has been made in this ERFA algorithm -- to include the effects of differential E-terms on the proper -- motions for all stars, whether polar or not. At epoch J2000.0, -- and measuring "on the sky" rather than in terms of RA change, the -- errors resulting from this simplification are less than -- 1 milliarcsecond in position and 1 milliarcsecond per century in -- proper motion. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraPv2s pv-vector to spherical coordinates -- eraPdp scalar product of two p-vectors -- eraPvmpv pv-vector minus pv_vector -- eraPvppv pv-vector plus pv_vector -- eraS2pv spherical coordinates to pv-vector -- eraSxp multiply p-vector by scalar -- -- References: -- -- Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 -- FK4-based positions of stars to epoch J2000.0 positions in -- accordance with the new IAU resolutions". Astron.Astrophys. -- 128, 263-267. -- -- Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the -- Astronomical Almanac", ISBN 0-935702-68-7. -- -- Smith, C.A. et al., 1989, "The transformation of astrometric -- catalog systems to the equinox J2000.0". Astron.J. 97, 265. -- -- Standish, E.M., 1982, "Conversion of positions and proper motions -- from B1950.0 to the IAU system at J2000.0". Astron.Astrophys., -- 115, 1, 20-22. -- -- Yallop, B.D. et al., 1989, "Transformation of mean star places -- from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". -- Astron.J. 97, 274. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r2000, d2000, dr2000, dd2000, p2000, v2000 = ufunc.fk425(r1950, d1950, dr1950, dd1950, p1950, v1950) -- return r2000, d2000, dr2000, dd2000, p2000, v2000 -- -- --def fk45z(r1950, d1950, bepoch): -- """ -- Wrapper for ERFA function ``eraFk45z``. -- -- Parameters -- ---------- -- r1950 : double array -- d1950 : double array -- bepoch : double array -- -- Returns -- ------- -- r2000 : double array -- d2000 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 4 5 z -- - - - - - - - - - -- -- Convert a B1950.0 FK4 star position to J2000.0 FK5, assuming zero -- proper motion in the FK5 system. -- -- This function converts a star's catalog data from the old FK4 -- (Bessel-Newcomb) system to the later IAU 1976 FK5 (Fricke) system, -- in such a way that the FK5 proper motion is zero. Because such a -- star has, in general, a non-zero proper motion in the FK4 system, -- the routine requires the epoch at which the position in the FK4 -- system was determined. -- -- Given: -- r1950,d1950 double B1950.0 FK4 RA,Dec at epoch (rad) -- bepoch double Besselian epoch (e.g. 1979.3D0) -- -- Returned: -- r2000,d2000 double J2000.0 FK5 RA,Dec (rad) -- -- Notes: -- -- 1) The epoch bepoch is strictly speaking Besselian, but if a -- Julian epoch is supplied the result will be affected only to a -- negligible extent. -- -- 2) The method is from Appendix 2 of Aoki et al. (1983), but using -- the constants of Seidelmann (1992). See the routine eraFk425 -- for a general introduction to the FK4 to FK5 conversion. -- -- 3) Conversion from equinox B1950.0 FK4 to equinox J2000.0 FK5 only -- is provided for. Conversions for different starting and/or -- ending epochs would require additional treatment for precession, -- proper motion and E-terms. -- -- 4) In the FK4 catalog the proper motions of stars within 10 degrees -- of the poles do not embody differential E-terms effects and -- should, strictly speaking, be handled in a different manner from -- stars outside these regions. However, given the general lack of -- homogeneity of the star data available for routine astrometry, -- the difficulties of handling positions that may have been -- determined from astrometric fields spanning the polar and non- -- polar regions, the likelihood that the differential E-terms -- effect was not taken into account when allowing for proper motion -- in past astrometry, and the undesirability of a discontinuity in -- the algorithm, the decision has been made in this ERFA algorithm -- to include the effects of differential E-terms on the proper -- motions for all stars, whether polar or not. At epoch 2000.0, -- and measuring "on the sky" rather than in terms of RA change, the -- errors resulting from this simplification are less than -- 1 milliarcsecond in position and 1 milliarcsecond per century in -- proper motion. -- -- References: -- -- Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 -- FK4-based positions of stars to epoch J2000.0 positions in -- accordance with the new IAU resolutions". Astron.Astrophys. -- 128, 263-267. -- -- Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the -- Astronomical Almanac", ISBN 0-935702-68-7. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraC2s p-vector to spherical -- eraEpb2jd Besselian epoch to Julian date -- eraEpj Julian date to Julian epoch -- eraPdp scalar product of two p-vectors -- eraPmp p-vector minus p-vector -- eraPpsp p-vector plus scaled p-vector -- eraPvu update a pv-vector -- eraS2c spherical to p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r2000, d2000 = ufunc.fk45z(r1950, d1950, bepoch) -- return r2000, d2000 -- -- --def fk524(r2000, d2000, dr2000, dd2000, p2000, v2000): -- """ -- Wrapper for ERFA function ``eraFk524``. -- -- Parameters -- ---------- -- r2000 : double array -- d2000 : double array -- dr2000 : double array -- dd2000 : double array -- p2000 : double array -- v2000 : double array -- -- Returns -- ------- -- r1950 : double array -- d1950 : double array -- dr1950 : double array -- dd1950 : double array -- p1950 : double array -- v1950 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 5 2 4 -- - - - - - - - - - -- -- Convert J2000.0 FK5 star catalog data to B1950.0 FK4. -- -- Given: (all J2000.0, FK5) -- r2000,d2000 double J2000.0 RA,Dec (rad) -- dr2000,dd2000 double J2000.0 proper motions (rad/Jul.yr) -- p2000 double parallax (arcsec) -- v2000 double radial velocity (km/s, +ve = moving away) -- -- Returned: (all B1950.0, FK4) -- r1950,d1950 double B1950.0 RA,Dec (rad) -- dr1950,dd1950 double B1950.0 proper motions (rad/trop.yr) -- p1950 double parallax (arcsec) -- v1950 double radial velocity (km/s, +ve = moving away) -- -- Notes: -- -- 1) The proper motions in RA are dRA/dt rather than cos(Dec)*dRA/dt, -- and are per year rather than per century. -- -- 2) The conversion is somewhat complicated, for several reasons: -- -- . Change of standard epoch from J2000.0 to B1950.0. -- -- . An intermediate transition date of 1984 January 1.0 TT. -- -- . A change of precession model. -- -- . Change of time unit for proper motion (Julian to tropical). -- -- . FK4 positions include the E-terms of aberration, to simplify -- the hand computation of annual aberration. FK5 positions -- assume a rigorous aberration computation based on the Earth's -- barycentric velocity. -- -- . The E-terms also affect proper motions, and in particular cause -- objects at large distances to exhibit fictitious proper -- motions. -- -- The algorithm is based on Smith et al. (1989) and Yallop et al. -- (1989), which presented a matrix method due to Standish (1982) as -- developed by Aoki et al. (1983), using Kinoshita's development of -- Andoyer's post-Newcomb precession. The numerical constants from -- Seidelmann (1992) are used canonically. -- -- 4) In the FK4 catalog the proper motions of stars within 10 degrees -- of the poles do not embody differential E-terms effects and -- should, strictly speaking, be handled in a different manner from -- stars outside these regions. However, given the general lack of -- homogeneity of the star data available for routine astrometry, -- the difficulties of handling positions that may have been -- determined from astrometric fields spanning the polar and non- -- polar regions, the likelihood that the differential E-terms -- effect was not taken into account when allowing for proper motion -- in past astrometry, and the undesirability of a discontinuity in -- the algorithm, the decision has been made in this ERFA algorithm -- to include the effects of differential E-terms on the proper -- motions for all stars, whether polar or not. At epoch J2000.0, -- and measuring "on the sky" rather than in terms of RA change, the -- errors resulting from this simplification are less than -- 1 milliarcsecond in position and 1 milliarcsecond per century in -- proper motion. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraPdp scalar product of two p-vectors -- eraPm modulus of p-vector -- eraPmp p-vector minus p-vector -- eraPpp p-vector pluus p-vector -- eraPv2s pv-vector to spherical coordinates -- eraS2pv spherical coordinates to pv-vector -- eraSxp multiply p-vector by scalar -- -- References: -- -- Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 -- FK4-based positions of stars to epoch J2000.0 positions in -- accordance with the new IAU resolutions". Astron.Astrophys. -- 128, 263-267. -- -- Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the -- Astronomical Almanac", ISBN 0-935702-68-7. -- -- Smith, C.A. et al., 1989, "The transformation of astrometric -- catalog systems to the equinox J2000.0". Astron.J. 97, 265. -- -- Standish, E.M., 1982, "Conversion of positions and proper motions -- from B1950.0 to the IAU system at J2000.0". Astron.Astrophys., -- 115, 1, 20-22. -- -- Yallop, B.D. et al., 1989, "Transformation of mean star places -- from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". -- Astron.J. 97, 274. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r1950, d1950, dr1950, dd1950, p1950, v1950 = ufunc.fk524(r2000, d2000, dr2000, dd2000, p2000, v2000) -- return r1950, d1950, dr1950, dd1950, p1950, v1950 -- -- --def fk52h(r5, d5, dr5, dd5, px5, rv5): -- """ -- Wrapper for ERFA function ``eraFk52h``. -- -- Parameters -- ---------- -- r5 : double array -- d5 : double array -- dr5 : double array -- dd5 : double array -- px5 : double array -- rv5 : double array -- -- Returns -- ------- -- rh : double array -- dh : double array -- drh : double array -- ddh : double array -- pxh : double array -- rvh : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 5 2 h -- - - - - - - - - - -- -- Transform FK5 (J2000.0) star data into the Hipparcos system. -- -- Given (all FK5, equinox J2000.0, epoch J2000.0): -- r5 double RA (radians) -- d5 double Dec (radians) -- dr5 double proper motion in RA (dRA/dt, rad/Jyear) -- dd5 double proper motion in Dec (dDec/dt, rad/Jyear) -- px5 double parallax (arcsec) -- rv5 double radial velocity (km/s, positive = receding) -- -- Returned (all Hipparcos, epoch J2000.0): -- rh double RA (radians) -- dh double Dec (radians) -- drh double proper motion in RA (dRA/dt, rad/Jyear) -- ddh double proper motion in Dec (dDec/dt, rad/Jyear) -- pxh double parallax (arcsec) -- rvh double radial velocity (km/s, positive = receding) -- -- Notes: -- -- 1) This function transforms FK5 star positions and proper motions -- into the system of the Hipparcos catalog. -- -- 2) The proper motions in RA are dRA/dt rather than -- cos(Dec)*dRA/dt, and are per year rather than per century. -- -- 3) The FK5 to Hipparcos transformation is modeled as a pure -- rotation and spin; zonal errors in the FK5 catalog are not -- taken into account. -- -- 4) See also eraH2fk5, eraFk5hz, eraHfk5z. -- -- Called: -- eraStarpv star catalog data to space motion pv-vector -- eraFk5hip FK5 to Hipparcos rotation and spin -- eraRxp product of r-matrix and p-vector -- eraPxp vector product of two p-vectors -- eraPpp p-vector plus p-vector -- eraPvstar space motion pv-vector to star catalog data -- -- Reference: -- -- F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rh, dh, drh, ddh, pxh, rvh = ufunc.fk52h(r5, d5, dr5, dd5, px5, rv5) -- return rh, dh, drh, ddh, pxh, rvh -- -- --def fk54z(r2000, d2000, bepoch): -- """ -- Wrapper for ERFA function ``eraFk54z``. -- -- Parameters -- ---------- -- r2000 : double array -- d2000 : double array -- bepoch : double array -- -- Returns -- ------- -- r1950 : double array -- d1950 : double array -- dr1950 : double array -- dd1950 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 5 4 z -- - - - - - - - - - -- -- Convert a J2000.0 FK5 star position to B1950.0 FK4, assuming zero -- proper motion in FK5 and parallax. -- -- Given: -- r2000,d2000 double J2000.0 FK5 RA,Dec (rad) -- bepoch double Besselian epoch (e.g. 1950.0) -- -- Returned: -- r1950,d1950 double B1950.0 FK4 RA,Dec (rad) at epoch BEPOCH -- dr1950,dd1950 double B1950.0 FK4 proper motions (rad/trop.yr) -- -- Notes: -- -- 1) In contrast to the eraFk524 routine, here the FK5 proper -- motions, the parallax and the radial velocity are presumed zero. -- -- 2) This function converts a star position from the IAU 1976 FK5 -- (Fricke) system to the former FK4 (Bessel-Newcomb) system, for -- cases such as distant radio sources where it is presumed there is -- zero parallax and no proper motion. Because of the E-terms of -- aberration, such objects have (in general) non-zero proper motion -- in FK4, and the present routine returns those fictitious proper -- motions. -- -- 3) Conversion from B1950.0 FK4 to J2000.0 FK5 only is provided for. -- Conversions involving other equinoxes would require additional -- treatment for precession. -- -- 4) The position returned by this routine is in the B1950.0 FK4 -- reference system but at Besselian epoch BEPOCH. For comparison -- with catalogs the BEPOCH argument will frequently be 1950.0. (In -- this context the distinction between Besselian and Julian epoch -- is insignificant.) -- -- 5) The RA component of the returned (fictitious) proper motion is -- dRA/dt rather than cos(Dec)*dRA/dt. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraC2s p-vector to spherical -- eraFk524 FK4 to FK5 -- eraS2c spherical to p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r1950, d1950, dr1950, dd1950 = ufunc.fk54z(r2000, d2000, bepoch) -- return r1950, d1950, dr1950, dd1950 -- -- --def fk5hip(): -- """ -- Wrapper for ERFA function ``eraFk5hip``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- r5h : double array -- s5h : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a F k 5 h i p -- - - - - - - - - - - -- -- FK5 to Hipparcos rotation and spin. -- -- Returned: -- r5h double[3][3] r-matrix: FK5 rotation wrt Hipparcos (Note 2) -- s5h double[3] r-vector: FK5 spin wrt Hipparcos (Note 3) -- -- Notes: -- -- 1) This function models the FK5 to Hipparcos transformation as a -- pure rotation and spin; zonal errors in the FK5 catalogue are -- not taken into account. -- -- 2) The r-matrix r5h operates in the sense: -- -- P_Hipparcos = r5h x P_FK5 -- -- where P_FK5 is a p-vector in the FK5 frame, and P_Hipparcos is -- the equivalent Hipparcos p-vector. -- -- 3) The r-vector s5h represents the time derivative of the FK5 to -- Hipparcos rotation. The units are radians per year (Julian, -- TDB). -- -- Called: -- eraRv2m r-vector to r-matrix -- -- Reference: -- -- F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r5h, s5h = ufunc.fk5hip() -- return r5h, s5h -- -- --def fk5hz(r5, d5, date1, date2): -- """ -- Wrapper for ERFA function ``eraFk5hz``. -- -- Parameters -- ---------- -- r5 : double array -- d5 : double array -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rh : double array -- dh : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a F k 5 h z -- - - - - - - - - - -- -- Transform an FK5 (J2000.0) star position into the system of the -- Hipparcos catalogue, assuming zero Hipparcos proper motion. -- -- Given: -- r5 double FK5 RA (radians), equinox J2000.0, at date -- d5 double FK5 Dec (radians), equinox J2000.0, at date -- date1,date2 double TDB date (Notes 1,2) -- -- Returned: -- rh double Hipparcos RA (radians) -- dh double Hipparcos Dec (radians) -- -- Notes: -- -- 1) This function converts a star position from the FK5 system to -- the Hipparcos system, in such a way that the Hipparcos proper -- motion is zero. Because such a star has, in general, a non-zero -- proper motion in the FK5 system, the function requires the date -- at which the position in the FK5 system was determined. -- -- 2) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 3) The FK5 to Hipparcos transformation is modeled as a pure -- rotation and spin; zonal errors in the FK5 catalogue are not -- taken into account. -- -- 4) The position returned by this function is in the Hipparcos -- reference system but at date date1+date2. -- -- 5) See also eraFk52h, eraH2fk5, eraHfk5z. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraFk5hip FK5 to Hipparcos rotation and spin -- eraSxp multiply p-vector by scalar -- eraRv2m r-vector to r-matrix -- eraTrxp product of transpose of r-matrix and p-vector -- eraPxp vector product of two p-vectors -- eraC2s p-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Reference: -- -- F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rh, dh = ufunc.fk5hz(r5, d5, date1, date2) -- return rh, dh -- -- --def h2fk5(rh, dh, drh, ddh, pxh, rvh): -- """ -- Wrapper for ERFA function ``eraH2fk5``. -- -- Parameters -- ---------- -- rh : double array -- dh : double array -- drh : double array -- ddh : double array -- pxh : double array -- rvh : double array -- -- Returns -- ------- -- r5 : double array -- d5 : double array -- dr5 : double array -- dd5 : double array -- px5 : double array -- rv5 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a H 2 f k 5 -- - - - - - - - - - -- -- Transform Hipparcos star data into the FK5 (J2000.0) system. -- -- Given (all Hipparcos, epoch J2000.0): -- rh double RA (radians) -- dh double Dec (radians) -- drh double proper motion in RA (dRA/dt, rad/Jyear) -- ddh double proper motion in Dec (dDec/dt, rad/Jyear) -- pxh double parallax (arcsec) -- rvh double radial velocity (km/s, positive = receding) -- -- Returned (all FK5, equinox J2000.0, epoch J2000.0): -- r5 double RA (radians) -- d5 double Dec (radians) -- dr5 double proper motion in RA (dRA/dt, rad/Jyear) -- dd5 double proper motion in Dec (dDec/dt, rad/Jyear) -- px5 double parallax (arcsec) -- rv5 double radial velocity (km/s, positive = receding) -- -- Notes: -- -- 1) This function transforms Hipparcos star positions and proper -- motions into FK5 J2000.0. -- -- 2) The proper motions in RA are dRA/dt rather than -- cos(Dec)*dRA/dt, and are per year rather than per century. -- -- 3) The FK5 to Hipparcos transformation is modeled as a pure -- rotation and spin; zonal errors in the FK5 catalog are not -- taken into account. -- -- 4) See also eraFk52h, eraFk5hz, eraHfk5z. -- -- Called: -- eraStarpv star catalog data to space motion pv-vector -- eraFk5hip FK5 to Hipparcos rotation and spin -- eraRv2m r-vector to r-matrix -- eraRxp product of r-matrix and p-vector -- eraTrxp product of transpose of r-matrix and p-vector -- eraPxp vector product of two p-vectors -- eraPmp p-vector minus p-vector -- eraPvstar space motion pv-vector to star catalog data -- -- Reference: -- -- F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r5, d5, dr5, dd5, px5, rv5 = ufunc.h2fk5(rh, dh, drh, ddh, pxh, rvh) -- return r5, d5, dr5, dd5, px5, rv5 -- -- --def hfk5z(rh, dh, date1, date2): -- """ -- Wrapper for ERFA function ``eraHfk5z``. -- -- Parameters -- ---------- -- rh : double array -- dh : double array -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- r5 : double array -- d5 : double array -- dr5 : double array -- dd5 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a H f k 5 z -- - - - - - - - - - -- -- Transform a Hipparcos star position into FK5 J2000.0, assuming -- zero Hipparcos proper motion. -- -- Given: -- rh double Hipparcos RA (radians) -- dh double Hipparcos Dec (radians) -- date1,date2 double TDB date (Note 1) -- -- Returned (all FK5, equinox J2000.0, date date1+date2): -- r5 double RA (radians) -- d5 double Dec (radians) -- dr5 double FK5 RA proper motion (rad/year, Note 4) -- dd5 double Dec proper motion (rad/year, Note 4) -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. -- -- 3) The FK5 to Hipparcos transformation is modeled as a pure rotation -- and spin; zonal errors in the FK5 catalogue are not taken into -- account. -- -- 4) It was the intention that Hipparcos should be a close -- approximation to an inertial frame, so that distant objects have -- zero proper motion; such objects have (in general) non-zero -- proper motion in FK5, and this function returns those fictitious -- proper motions. -- -- 5) The position returned by this function is in the FK5 J2000.0 -- reference system but at date date1+date2. -- -- 6) See also eraFk52h, eraH2fk5, eraFk5zhz. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraFk5hip FK5 to Hipparcos rotation and spin -- eraRxp product of r-matrix and p-vector -- eraSxp multiply p-vector by scalar -- eraRxr product of two r-matrices -- eraTrxp product of transpose of r-matrix and p-vector -- eraPxp vector product of two p-vectors -- eraPv2s pv-vector to spherical -- eraAnp normalize angle into range 0 to 2pi -- -- Reference: -- -- F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r5, d5, dr5, dd5 = ufunc.hfk5z(rh, dh, date1, date2) -- return r5, d5, dr5, dd5 -- -- --def starpm(ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b): -- """ -- Wrapper for ERFA function ``eraStarpm``. -- -- Parameters -- ---------- -- ra1 : double array -- dec1 : double array -- pmr1 : double array -- pmd1 : double array -- px1 : double array -- rv1 : double array -- ep1a : double array -- ep1b : double array -- ep2a : double array -- ep2b : double array -- -- Returns -- ------- -- ra2 : double array -- dec2 : double array -- pmr2 : double array -- pmd2 : double array -- px2 : double array -- rv2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a S t a r p m -- - - - - - - - - - - -- -- Star proper motion: update star catalog data for space motion. -- -- Given: -- ra1 double right ascension (radians), before -- dec1 double declination (radians), before -- pmr1 double RA proper motion (radians/year), before -- pmd1 double Dec proper motion (radians/year), before -- px1 double parallax (arcseconds), before -- rv1 double radial velocity (km/s, +ve = receding), before -- ep1a double "before" epoch, part A (Note 1) -- ep1b double "before" epoch, part B (Note 1) -- ep2a double "after" epoch, part A (Note 1) -- ep2b double "after" epoch, part B (Note 1) -- -- Returned: -- ra2 double right ascension (radians), after -- dec2 double declination (radians), after -- pmr2 double RA proper motion (radians/year), after -- pmd2 double Dec proper motion (radians/year), after -- px2 double parallax (arcseconds), after -- rv2 double radial velocity (km/s, +ve = receding), after -- -- Returned (function value): -- int status: -- -1 = system error (should not occur) -- 0 = no warnings or errors -- 1 = distance overridden (Note 6) -- 2 = excessive velocity (Note 7) -- 4 = solution didn't converge (Note 8) -- else = binary logical OR of the above warnings -- -- Notes: -- -- 1) The starting and ending TDB dates ep1a+ep1b and ep2a+ep2b are -- Julian Dates, apportioned in any convenient way between the two -- parts (A and B). For example, JD(TDB)=2450123.7 could be -- expressed in any of these ways, among others: -- -- epna epnb -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) In accordance with normal star-catalog conventions, the object's -- right ascension and declination are freed from the effects of -- secular aberration. The frame, which is aligned to the catalog -- equator and equinox, is Lorentzian and centered on the SSB. -- -- The proper motions are the rate of change of the right ascension -- and declination at the catalog epoch and are in radians per TDB -- Julian year. -- -- The parallax and radial velocity are in the same frame. -- -- 3) Care is needed with units. The star coordinates are in radians -- and the proper motions in radians per Julian year, but the -- parallax is in arcseconds. -- -- 4) The RA proper motion is in terms of coordinate angle, not true -- angle. If the catalog uses arcseconds for both RA and Dec proper -- motions, the RA proper motion will need to be divided by cos(Dec) -- before use. -- -- 5) Straight-line motion at constant speed, in the inertial frame, -- is assumed. -- -- 6) An extremely small (or zero or negative) parallax is interpreted -- to mean that the object is on the "celestial sphere", the radius -- of which is an arbitrary (large) value (see the eraStarpv -- function for the value used). When the distance is overridden in -- this way, the status, initially zero, has 1 added to it. -- -- 7) If the space velocity is a significant fraction of c (see the -- constant VMAX in the function eraStarpv), it is arbitrarily set -- to zero. When this action occurs, 2 is added to the status. -- -- 8) The relativistic adjustment carried out in the eraStarpv function -- involves an iterative calculation. If the process fails to -- converge within a set number of iterations, 4 is added to the -- status. -- -- Called: -- eraStarpv star catalog data to space motion pv-vector -- eraPvu update a pv-vector -- eraPdp scalar product of two p-vectors -- eraPvstar space motion pv-vector to star catalog data -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ra2, dec2, pmr2, pmd2, px2, rv2, c_retval = ufunc.starpm(ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b) -- check_errwarn(c_retval, 'starpm') -- return ra2, dec2, pmr2, pmd2, px2, rv2 -- -- --STATUS_CODES['starpm'] = {-1: 'system error (should not occur)', 0: 'no warnings or errors', 1: 'distance overridden (Note 6)', 2: 'excessive velocity (Note 7)', 4: "solution didn't converge (Note 8)", 'else': 'binary logical OR of the above warnings'} -- -- --def eceq06(date1, date2, dl, db): -- """ -- Wrapper for ERFA function ``eraEceq06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- dl : double array -- db : double array -- -- Returns -- ------- -- dr : double array -- dd : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E c e q 0 6 -- - - - - - - - - - - -- -- Transformation from ecliptic coordinates (mean equinox and ecliptic -- of date) to ICRS RA,Dec, using the IAU 2006 precession model. -- -- Given: -- date1,date2 double TT as a 2-part Julian date (Note 1) -- dl,db double ecliptic longitude and latitude (radians) -- -- Returned: -- dr,dd double ICRS right ascension and declination (radians) -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) No assumptions are made about whether the coordinates represent -- starlight and embody astrometric effects such as parallax or -- aberration. -- -- 3) The transformation is approximately that from ecliptic longitude -- and latitude (mean equinox and ecliptic of date) to mean J2000.0 -- right ascension and declination, with only frame bias (always -- less than 25 mas) to disturb this classical picture. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraEcm06 J2000.0 to ecliptic rotation matrix, IAU 2006 -- eraTrxp product of transpose of r-matrix and p-vector -- eraC2s unit vector to spherical coordinates -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dr, dd = ufunc.eceq06(date1, date2, dl, db) -- return dr, dd -- -- --def ecm06(date1, date2): -- """ -- Wrapper for ERFA function ``eraEcm06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- -- Returns -- ------- -- rm : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E c m 0 6 -- - - - - - - - - - -- -- ICRS equatorial to ecliptic rotation matrix, IAU 2006. -- -- Given: -- date1,date2 double TT as a 2-part Julian date (Note 1) -- -- Returned: -- rm double[3][3] ICRS to ecliptic rotation matrix -- -- Notes: -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 1) The matrix is in the sense -- -- E_ep = rm x P_ICRS, -- -- where P_ICRS is a vector with respect to ICRS right ascension -- and declination axes and E_ep is the same vector with respect to -- the (inertial) ecliptic and equinox of date. -- -- 2) P_ICRS is a free vector, merely a direction, typically of unit -- magnitude, and not bound to any particular spatial origin, such -- as the Earth, Sun or SSB. No assumptions are made about whether -- it represents starlight and embodies astrometric effects such as -- parallax or aberration. The transformation is approximately that -- between mean J2000.0 right ascension and declination and ecliptic -- longitude and latitude, with only frame bias (always less than -- 25 mas) to disturb this classical picture. -- -- Called: -- eraObl06 mean obliquity, IAU 2006 -- eraPmat06 PB matrix, IAU 2006 -- eraIr initialize r-matrix to identity -- eraRx rotate around X-axis -- eraRxr product of two r-matrices -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rm = ufunc.ecm06(date1, date2) -- return rm -- -- --def eqec06(date1, date2, dr, dd): -- """ -- Wrapper for ERFA function ``eraEqec06``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- dr : double array -- dd : double array -- -- Returns -- ------- -- dl : double array -- db : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a E q e c 0 6 -- - - - - - - - - - - -- -- Transformation from ICRS equatorial coordinates to ecliptic -- coordinates (mean equinox and ecliptic of date) using IAU 2006 -- precession model. -- -- Given: -- date1,date2 double TT as a 2-part Julian date (Note 1) -- dr,dd double ICRS right ascension and declination (radians) -- -- Returned: -- dl,db double ecliptic longitude and latitude (radians) -- -- 1) The TT date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- 2) No assumptions are made about whether the coordinates represent -- starlight and embody astrometric effects such as parallax or -- aberration. -- -- 3) The transformation is approximately that from mean J2000.0 right -- ascension and declination to ecliptic longitude and latitude -- (mean equinox and ecliptic of date), with only frame bias (always -- less than 25 mas) to disturb this classical picture. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraEcm06 J2000.0 to ecliptic rotation matrix, IAU 2006 -- eraRxp product of r-matrix and p-vector -- eraC2s unit vector to spherical coordinates -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dl, db = ufunc.eqec06(date1, date2, dr, dd) -- return dl, db -- -- --def lteceq(epj, dl, db): -- """ -- Wrapper for ERFA function ``eraLteceq``. -- -- Parameters -- ---------- -- epj : double array -- dl : double array -- db : double array -- -- Returns -- ------- -- dr : double array -- dd : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a L t e c e q -- - - - - - - - - - - -- -- Transformation from ecliptic coordinates (mean equinox and ecliptic -- of date) to ICRS RA,Dec, using a long-term precession model. -- -- Given: -- epj double Julian epoch (TT) -- dl,db double ecliptic longitude and latitude (radians) -- -- Returned: -- dr,dd double ICRS right ascension and declination (radians) -- -- 1) No assumptions are made about whether the coordinates represent -- starlight and embody astrometric effects such as parallax or -- aberration. -- -- 2) The transformation is approximately that from ecliptic longitude -- and latitude (mean equinox and ecliptic of date) to mean J2000.0 -- right ascension and declination, with only frame bias (always -- less than 25 mas) to disturb this classical picture. -- -- 3) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraLtecm J2000.0 to ecliptic rotation matrix, long term -- eraTrxp product of transpose of r-matrix and p-vector -- eraC2s unit vector to spherical coordinates -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dr, dd = ufunc.lteceq(epj, dl, db) -- return dr, dd -- -- --def ltecm(epj): -- """ -- Wrapper for ERFA function ``eraLtecm``. -- -- Parameters -- ---------- -- epj : double array -- -- Returns -- ------- -- rm : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a L t e c m -- - - - - - - - - - -- -- ICRS equatorial to ecliptic rotation matrix, long-term. -- -- Given: -- epj double Julian epoch (TT) -- -- Returned: -- rm double[3][3] ICRS to ecliptic rotation matrix -- -- Notes: -- -- 1) The matrix is in the sense -- -- E_ep = rm x P_ICRS, -- -- where P_ICRS is a vector with respect to ICRS right ascension -- and declination axes and E_ep is the same vector with respect to -- the (inertial) ecliptic and equinox of epoch epj. -- -- 2) P_ICRS is a free vector, merely a direction, typically of unit -- magnitude, and not bound to any particular spatial origin, such -- as the Earth, Sun or SSB. No assumptions are made about whether -- it represents starlight and embodies astrometric effects such as -- parallax or aberration. The transformation is approximately that -- between mean J2000.0 right ascension and declination and ecliptic -- longitude and latitude, with only frame bias (always less than -- 25 mas) to disturb this classical picture. -- -- 3) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- Called: -- eraLtpequ equator pole, long term -- eraLtpecl ecliptic pole, long term -- eraPxp vector product -- eraPn normalize vector -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rm = ufunc.ltecm(epj) -- return rm -- -- --def lteqec(epj, dr, dd): -- """ -- Wrapper for ERFA function ``eraLteqec``. -- -- Parameters -- ---------- -- epj : double array -- dr : double array -- dd : double array -- -- Returns -- ------- -- dl : double array -- db : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a L t e q e c -- - - - - - - - - - - -- -- Transformation from ICRS equatorial coordinates to ecliptic -- coordinates (mean equinox and ecliptic of date) using a long-term -- precession model. -- -- Given: -- epj double Julian epoch (TT) -- dr,dd double ICRS right ascension and declination (radians) -- -- Returned: -- dl,db double ecliptic longitude and latitude (radians) -- -- 1) No assumptions are made about whether the coordinates represent -- starlight and embody astrometric effects such as parallax or -- aberration. -- -- 2) The transformation is approximately that from mean J2000.0 right -- ascension and declination to ecliptic longitude and latitude -- (mean equinox and ecliptic of date), with only frame bias (always -- less than 25 mas) to disturb this classical picture. -- -- 3) The Vondrak et al. (2011, 2012) 400 millennia precession model -- agrees with the IAU 2006 precession at J2000.0 and stays within -- 100 microarcseconds during the 20th and 21st centuries. It is -- accurate to a few arcseconds throughout the historical period, -- worsening to a few tenths of a degree at the end of the -- +/- 200,000 year time span. -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraLtecm J2000.0 to ecliptic rotation matrix, long term -- eraRxp product of r-matrix and p-vector -- eraC2s unit vector to spherical coordinates -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- -- References: -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession -- expressions, valid for long time intervals, Astron.Astrophys. 534, -- A22 -- -- Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession -- expressions, valid for long time intervals (Corrigendum), -- Astron.Astrophys. 541, C1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dl, db = ufunc.lteqec(epj, dr, dd) -- return dl, db -- -- --def g2icrs(dl, db): -- """ -- Wrapper for ERFA function ``eraG2icrs``. -- -- Parameters -- ---------- -- dl : double array -- db : double array -- -- Returns -- ------- -- dr : double array -- dd : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G 2 i c r s -- - - - - - - - - - - -- -- Transformation from Galactic Coordinates to ICRS. -- -- Given: -- dl double galactic longitude (radians) -- db double galactic latitude (radians) -- -- Returned: -- dr double ICRS right ascension (radians) -- dd double ICRS declination (radians) -- -- Notes: -- -- 1) The IAU 1958 system of Galactic coordinates was defined with -- respect to the now obsolete reference system FK4 B1950.0. When -- interpreting the system in a modern context, several factors have -- to be taken into account: -- -- . The inclusion in FK4 positions of the E-terms of aberration. -- -- . The distortion of the FK4 proper motion system by differential -- Galactic rotation. -- -- . The use of the B1950.0 equinox rather than the now-standard -- J2000.0. -- -- . The frame bias between ICRS and the J2000.0 mean place system. -- -- The Hipparcos Catalogue (Perryman & ESA 1997) provides a rotation -- matrix that transforms directly between ICRS and Galactic -- coordinates with the above factors taken into account. The -- matrix is derived from three angles, namely the ICRS coordinates -- of the Galactic pole and the longitude of the ascending node of -- the galactic equator on the ICRS equator. They are given in -- degrees to five decimal places and for canonical purposes are -- regarded as exact. In the Hipparcos Catalogue the matrix -- elements are given to 10 decimal places (about 20 microarcsec). -- In the present ERFA function the matrix elements have been -- recomputed from the canonical three angles and are given to 30 -- decimal places. -- -- 2) The inverse transformation is performed by the function eraIcrs2g. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- eraS2c spherical coordinates to unit vector -- eraTrxp product of transpose of r-matrix and p-vector -- eraC2s p-vector to spherical -- -- Reference: -- Perryman M.A.C. & ESA, 1997, ESA SP-1200, The Hipparcos and Tycho -- catalogues. Astrometric and photometric star catalogues -- derived from the ESA Hipparcos Space Astrometry Mission. ESA -- Publications Division, Noordwijk, Netherlands. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dr, dd = ufunc.g2icrs(dl, db) -- return dr, dd -- -- --def icrs2g(dr, dd): -- """ -- Wrapper for ERFA function ``eraIcrs2g``. -- -- Parameters -- ---------- -- dr : double array -- dd : double array -- -- Returns -- ------- -- dl : double array -- db : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a I c r s 2 g -- - - - - - - - - - - -- -- Transformation from ICRS to Galactic Coordinates. -- -- Given: -- dr double ICRS right ascension (radians) -- dd double ICRS declination (radians) -- -- Returned: -- dl double galactic longitude (radians) -- db double galactic latitude (radians) -- -- Notes: -- -- 1) The IAU 1958 system of Galactic coordinates was defined with -- respect to the now obsolete reference system FK4 B1950.0. When -- interpreting the system in a modern context, several factors have -- to be taken into account: -- -- . The inclusion in FK4 positions of the E-terms of aberration. -- -- . The distortion of the FK4 proper motion system by differential -- Galactic rotation. -- -- . The use of the B1950.0 equinox rather than the now-standard -- J2000.0. -- -- . The frame bias between ICRS and the J2000.0 mean place system. -- -- The Hipparcos Catalogue (Perryman & ESA 1997) provides a rotation -- matrix that transforms directly between ICRS and Galactic -- coordinates with the above factors taken into account. The -- matrix is derived from three angles, namely the ICRS coordinates -- of the Galactic pole and the longitude of the ascending node of -- the galactic equator on the ICRS equator. They are given in -- degrees to five decimal places and for canonical purposes are -- regarded as exact. In the Hipparcos Catalogue the matrix -- elements are given to 10 decimal places (about 20 microarcsec). -- In the present ERFA function the matrix elements have been -- recomputed from the canonical three angles and are given to 30 -- decimal places. -- -- 2) The inverse transformation is performed by the function eraG2icrs. -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- eraAnpm normalize angle into range +/- pi -- eraS2c spherical coordinates to unit vector -- eraRxp product of r-matrix and p-vector -- eraC2s p-vector to spherical -- -- Reference: -- Perryman M.A.C. & ESA, 1997, ESA SP-1200, The Hipparcos and Tycho -- catalogues. Astrometric and photometric star catalogues -- derived from the ESA Hipparcos Space Astrometry Mission. ESA -- Publications Division, Noordwijk, Netherlands. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- dl, db = ufunc.icrs2g(dr, dd) -- return dl, db -- -- --def eform(n): -- """ -- Wrapper for ERFA function ``eraEform``. -- -- Parameters -- ---------- -- n : int array -- -- Returns -- ------- -- a : double array -- f : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a E f o r m -- - - - - - - - - - -- -- Earth reference ellipsoids. -- -- Given: -- n int ellipsoid identifier (Note 1) -- -- Returned: -- a double equatorial radius (meters, Note 2) -- f double flattening (Note 2) -- -- Returned (function value): -- int status: 0 = OK -- -1 = illegal identifier (Note 3) -- -- Notes: -- -- 1) The identifier n is a number that specifies the choice of -- reference ellipsoid. The following are supported: -- -- n ellipsoid -- -- 1 ERFA_WGS84 -- 2 ERFA_GRS80 -- 3 ERFA_WGS72 -- -- The n value has no significance outside the ERFA software. For -- convenience, symbols ERFA_WGS84 etc. are defined in erfam.h. -- -- 2) The ellipsoid parameters are returned in the form of equatorial -- radius in meters (a) and flattening (f). The latter is a number -- around 0.00335, i.e. around 1/298. -- -- 3) For the case where an unsupported n value is supplied, zero a and -- f are returned, as well as error status. -- -- References: -- -- Department of Defense World Geodetic System 1984, National -- Imagery and Mapping Agency Technical Report 8350.2, Third -- Edition, p3-2. -- -- Moritz, H., Bull. Geodesique 66-2, 187 (1992). -- -- The Department of Defense World Geodetic System 1972, World -- Geodetic System Committee, May 1974. -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- p220. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- a, f, c_retval = ufunc.eform(n) -- check_errwarn(c_retval, 'eform') -- return a, f -- -- --STATUS_CODES['eform'] = {0: 'OK', -1: 'illegal identifier (Note 3)'} -- -- --def gc2gd(n, xyz): -- """ -- Wrapper for ERFA function ``eraGc2gd``. -- -- Parameters -- ---------- -- n : int array -- xyz : double array -- -- Returns -- ------- -- elong : double array -- phi : double array -- height : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a G c 2 g d -- - - - - - - - - - -- -- Transform geocentric coordinates to geodetic using the specified -- reference ellipsoid. -- -- Given: -- n int ellipsoid identifier (Note 1) -- xyz double[3] geocentric vector (Note 2) -- -- Returned: -- elong double longitude (radians, east +ve, Note 3) -- phi double latitude (geodetic, radians, Note 3) -- height double height above ellipsoid (geodetic, Notes 2,3) -- -- Returned (function value): -- int status: 0 = OK -- -1 = illegal identifier (Note 3) -- -2 = internal error (Note 3) -- -- Notes: -- -- 1) The identifier n is a number that specifies the choice of -- reference ellipsoid. The following are supported: -- -- n ellipsoid -- -- 1 ERFA_WGS84 -- 2 ERFA_GRS80 -- 3 ERFA_WGS72 -- -- The n value has no significance outside the ERFA software. For -- convenience, symbols ERFA_WGS84 etc. are defined in erfam.h. -- -- 2) The geocentric vector (xyz, given) and height (height, returned) -- are in meters. -- -- 3) An error status -1 means that the identifier n is illegal. An -- error status -2 is theoretically impossible. In all error cases, -- all three results are set to -1e9. -- -- 4) The inverse transformation is performed in the function eraGd2gc. -- -- Called: -- eraEform Earth reference ellipsoids -- eraGc2gde geocentric to geodetic transformation, general -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- elong, phi, height, c_retval = ufunc.gc2gd(n, xyz) -- check_errwarn(c_retval, 'gc2gd') -- return elong, phi, height -- -- --STATUS_CODES['gc2gd'] = {0: 'OK', -1: 'illegal identifier (Note 3)', -2: 'internal error (Note 3)'} -- -- --def gc2gde(a, f, xyz): -- """ -- Wrapper for ERFA function ``eraGc2gde``. -- -- Parameters -- ---------- -- a : double array -- f : double array -- xyz : double array -- -- Returns -- ------- -- elong : double array -- phi : double array -- height : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G c 2 g d e -- - - - - - - - - - - -- -- Transform geocentric coordinates to geodetic for a reference -- ellipsoid of specified form. -- -- Given: -- a double equatorial radius (Notes 2,4) -- f double flattening (Note 3) -- xyz double[3] geocentric vector (Note 4) -- -- Returned: -- elong double longitude (radians, east +ve) -- phi double latitude (geodetic, radians) -- height double height above ellipsoid (geodetic, Note 4) -- -- Returned (function value): -- int status: 0 = OK -- -1 = illegal f -- -2 = illegal a -- -- Notes: -- -- 1) This function is based on the GCONV2H Fortran subroutine by -- Toshio Fukushima (see reference). -- -- 2) The equatorial radius, a, can be in any units, but meters is -- the conventional choice. -- -- 3) The flattening, f, is (for the Earth) a value around 0.00335, -- i.e. around 1/298. -- -- 4) The equatorial radius, a, and the geocentric vector, xyz, -- must be given in the same units, and determine the units of -- the returned height, height. -- -- 5) If an error occurs (status < 0), elong, phi and height are -- unchanged. -- -- 6) The inverse transformation is performed in the function -- eraGd2gce. -- -- 7) The transformation for a standard ellipsoid (such as ERFA_WGS84) can -- more conveniently be performed by calling eraGc2gd, which uses a -- numerical code to identify the required A and F values. -- -- Reference: -- -- Fukushima, T., "Transformation from Cartesian to geodetic -- coordinates accelerated by Halley's method", J.Geodesy (2006) -- 79: 689-693 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- elong, phi, height, c_retval = ufunc.gc2gde(a, f, xyz) -- check_errwarn(c_retval, 'gc2gde') -- return elong, phi, height -- -- --STATUS_CODES['gc2gde'] = {0: 'OK', -1: 'illegal f', -2: 'illegal a'} -- -- --def gd2gc(n, elong, phi, height): -- """ -- Wrapper for ERFA function ``eraGd2gc``. -- -- Parameters -- ---------- -- n : int array -- elong : double array -- phi : double array -- height : double array -- -- Returns -- ------- -- xyz : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a G d 2 g c -- - - - - - - - - - -- -- Transform geodetic coordinates to geocentric using the specified -- reference ellipsoid. -- -- Given: -- n int ellipsoid identifier (Note 1) -- elong double longitude (radians, east +ve) -- phi double latitude (geodetic, radians, Note 3) -- height double height above ellipsoid (geodetic, Notes 2,3) -- -- Returned: -- xyz double[3] geocentric vector (Note 2) -- -- Returned (function value): -- int status: 0 = OK -- -1 = illegal identifier (Note 3) -- -2 = illegal case (Note 3) -- -- Notes: -- -- 1) The identifier n is a number that specifies the choice of -- reference ellipsoid. The following are supported: -- -- n ellipsoid -- -- 1 ERFA_WGS84 -- 2 ERFA_GRS80 -- 3 ERFA_WGS72 -- -- The n value has no significance outside the ERFA software. For -- convenience, symbols ERFA_WGS84 etc. are defined in erfam.h. -- -- 2) The height (height, given) and the geocentric vector (xyz, -- returned) are in meters. -- -- 3) No validation is performed on the arguments elong, phi and -- height. An error status -1 means that the identifier n is -- illegal. An error status -2 protects against cases that would -- lead to arithmetic exceptions. In all error cases, xyz is set -- to zeros. -- -- 4) The inverse transformation is performed in the function eraGc2gd. -- -- Called: -- eraEform Earth reference ellipsoids -- eraGd2gce geodetic to geocentric transformation, general -- eraZp zero p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- xyz, c_retval = ufunc.gd2gc(n, elong, phi, height) -- check_errwarn(c_retval, 'gd2gc') -- return xyz -- -- --STATUS_CODES['gd2gc'] = {0: 'OK', -1: 'illegal identifier (Note 3)', -2: 'illegal case (Note 3)'} -- -- --def gd2gce(a, f, elong, phi, height): -- """ -- Wrapper for ERFA function ``eraGd2gce``. -- -- Parameters -- ---------- -- a : double array -- f : double array -- elong : double array -- phi : double array -- height : double array -- -- Returns -- ------- -- xyz : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a G d 2 g c e -- - - - - - - - - - - -- -- Transform geodetic coordinates to geocentric for a reference -- ellipsoid of specified form. -- -- Given: -- a double equatorial radius (Notes 1,4) -- f double flattening (Notes 2,4) -- elong double longitude (radians, east +ve) -- phi double latitude (geodetic, radians, Note 4) -- height double height above ellipsoid (geodetic, Notes 3,4) -- -- Returned: -- xyz double[3] geocentric vector (Note 3) -- -- Returned (function value): -- int status: 0 = OK -- -1 = illegal case (Note 4) -- Notes: -- -- 1) The equatorial radius, a, can be in any units, but meters is -- the conventional choice. -- -- 2) The flattening, f, is (for the Earth) a value around 0.00335, -- i.e. around 1/298. -- -- 3) The equatorial radius, a, and the height, height, must be -- given in the same units, and determine the units of the -- returned geocentric vector, xyz. -- -- 4) No validation is performed on individual arguments. The error -- status -1 protects against (unrealistic) cases that would lead -- to arithmetic exceptions. If an error occurs, xyz is unchanged. -- -- 5) The inverse transformation is performed in the function -- eraGc2gde. -- -- 6) The transformation for a standard ellipsoid (such as ERFA_WGS84) can -- more conveniently be performed by calling eraGd2gc, which uses a -- numerical code to identify the required a and f values. -- -- References: -- -- Green, R.M., Spherical Astronomy, Cambridge University Press, -- (1985) Section 4.5, p96. -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992), -- Section 4.22, p202. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- xyz, c_retval = ufunc.gd2gce(a, f, elong, phi, height) -- check_errwarn(c_retval, 'gd2gce') -- return xyz -- -- --STATUS_CODES['gd2gce'] = {0: 'OK', -1: 'illegal case (Note 4)Notes:'} -- -- --def d2dtf(scale, ndp, d1, d2): -- """ -- Wrapper for ERFA function ``eraD2dtf``. -- -- Parameters -- ---------- -- scale : const char array -- ndp : int array -- d1 : double array -- d2 : double array -- -- Returns -- ------- -- iy : int array -- im : int array -- id : int array -- ihmsf : int array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a D 2 d t f -- - - - - - - - - - -- -- Format for output a 2-part Julian Date (or in the case of UTC a -- quasi-JD form that includes special provision for leap seconds). -- -- Given: -- scale char[] time scale ID (Note 1) -- ndp int resolution (Note 2) -- d1,d2 double time as a 2-part Julian Date (Notes 3,4) -- -- Returned: -- iy,im,id int year, month, day in Gregorian calendar (Note 5) -- ihmsf int[4] hours, minutes, seconds, fraction (Note 1) -- -- Returned (function value): -- int status: +1 = dubious year (Note 5) -- 0 = OK -- -1 = unacceptable date (Note 6) -- -- Notes: -- -- 1) scale identifies the time scale. Only the value "UTC" (in upper -- case) is significant, and enables handling of leap seconds (see -- Note 4). -- -- 2) ndp is the number of decimal places in the seconds field, and can -- have negative as well as positive values, such as: -- -- ndp resolution -- -4 1 00 00 -- -3 0 10 00 -- -2 0 01 00 -- -1 0 00 10 -- 0 0 00 01 -- 1 0 00 00.1 -- 2 0 00 00.01 -- 3 0 00 00.001 -- -- The limits are platform dependent, but a safe range is -5 to +9. -- -- 3) d1+d2 is Julian Date, apportioned in any convenient way between -- the two arguments, for example where d1 is the Julian Day Number -- and d2 is the fraction of a day. In the case of UTC, where the -- use of JD is problematical, special conventions apply: see the -- next note. -- -- 4) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The ERFA internal convention is that -- the quasi-JD day represents UTC days whether the length is 86399, -- 86400 or 86401 SI seconds. In the 1960-1972 era there were -- smaller jumps (in either direction) each time the linear UTC(TAI) -- expression was changed, and these "mini-leaps" are also included -- in the ERFA convention. -- -- 5) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- 6) For calendar conventions and limitations, see eraCal2jd. -- -- Called: -- eraJd2cal JD to Gregorian calendar -- eraD2tf decompose days to hms -- eraDat delta(AT) = TAI-UTC -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- iy, im, id, ihmsf, c_retval = ufunc.d2dtf(scale, ndp, d1, d2) -- check_errwarn(c_retval, 'd2dtf') -- return iy, im, id, ihmsf -- -- --STATUS_CODES['d2dtf'] = {1: 'dubious year (Note 5)', 0: 'OK', -1: 'unacceptable date (Note 6)'} -- -- --def dat(iy, im, id, fd): -- """ -- Wrapper for ERFA function ``eraDat``. -- -- Parameters -- ---------- -- iy : int array -- im : int array -- id : int array -- fd : double array -- -- Returns -- ------- -- deltat : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a D a t -- - - - - - - - -- -- For a given UTC date, calculate Delta(AT) = TAI-UTC. -- -- :------------------------------------------: -- : : -- : IMPORTANT : -- : : -- : A new version of this function must be : -- : produced whenever a new leap second is : -- : announced. There are four items to : -- : change on each such occasion: : -- : : -- : 1) A new line must be added to the set : -- : of statements that initialize the : -- : array "changes". : -- : : -- : 2) The constant IYV must be set to the : -- : current year. : -- : : -- : 3) The "Latest leap second" comment : -- : below must be set to the new leap : -- : second date. : -- : : -- : 4) The "This revision" comment, later, : -- : must be set to the current date. : -- : : -- : Change (2) must also be carried out : -- : whenever the function is re-issued, : -- : even if no leap seconds have been : -- : added. : -- : : -- : Latest leap second: 2016 December 31 : -- : : -- :__________________________________________: -- -- Given: -- iy int UTC: year (Notes 1 and 2) -- im int month (Note 2) -- id int day (Notes 2 and 3) -- fd double fraction of day (Note 4) -- -- Returned: -- deltat double TAI minus UTC, seconds -- -- Returned (function value): -- int status (Note 5): -- 1 = dubious year (Note 1) -- 0 = OK -- -1 = bad year -- -2 = bad month -- -3 = bad day (Note 3) -- -4 = bad fraction (Note 4) -- -5 = internal error (Note 5) -- -- Notes: -- -- 1) UTC began at 1960 January 1.0 (JD 2436934.5) and it is improper -- to call the function with an earlier date. If this is attempted, -- zero is returned together with a warning status. -- -- Because leap seconds cannot, in principle, be predicted in -- advance, a reliable check for dates beyond the valid range is -- impossible. To guard against gross errors, a year five or more -- after the release year of the present function (see the constant -- IYV) is considered dubious. In this case a warning status is -- returned but the result is computed in the normal way. -- -- For both too-early and too-late years, the warning status is +1. -- This is distinct from the error status -1, which signifies a year -- so early that JD could not be computed. -- -- 2) If the specified date is for a day which ends with a leap second, -- the TAI-UTC value returned is for the period leading up to the -- leap second. If the date is for a day which begins as a leap -- second ends, the TAI-UTC returned is for the period following the -- leap second. -- -- 3) The day number must be in the normal calendar range, for example -- 1 through 30 for April. The "almanac" convention of allowing -- such dates as January 0 and December 32 is not supported in this -- function, in order to avoid confusion near leap seconds. -- -- 4) The fraction of day is used only for dates before the -- introduction of leap seconds, the first of which occurred at the -- end of 1971. It is tested for validity (0 to 1 is the valid -- range) even if not used; if invalid, zero is used and status -4 -- is returned. For many applications, setting fd to zero is -- acceptable; the resulting error is always less than 3 ms (and -- occurs only pre-1972). -- -- 5) The status value returned in the case where there are multiple -- errors refers to the first error detected. For example, if the -- month and day are 13 and 32 respectively, status -2 (bad month) -- will be returned. The "internal error" status refers to a -- case that is impossible but causes some compilers to issue a -- warning. -- -- 6) In cases where a valid result is not available, zero is returned. -- -- References: -- -- 1) For dates from 1961 January 1 onwards, the expressions from the -- file ftp://maia.usno.navy.mil/ser7/tai-utc.dat are used. -- -- 2) The 5ms timestep at 1961 January 1 is taken from 2.58.1 (p87) of -- the 1992 Explanatory Supplement. -- -- Called: -- eraCal2jd Gregorian calendar to JD -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- deltat, c_retval = ufunc.dat(iy, im, id, fd) -- check_errwarn(c_retval, 'dat') -- return deltat -- -- --STATUS_CODES['dat'] = {1: 'dubious year (Note 1)', 0: 'OK', -1: 'bad year', -2: 'bad month', -3: 'bad day (Note 3)', -4: 'bad fraction (Note 4)', -5: 'internal error (Note 5)'} -- -- --def dtdb(date1, date2, ut, elong, u, v): -- """ -- Wrapper for ERFA function ``eraDtdb``. -- -- Parameters -- ---------- -- date1 : double array -- date2 : double array -- ut : double array -- elong : double array -- u : double array -- v : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a D t d b -- - - - - - - - - -- -- An approximation to TDB-TT, the difference between barycentric -- dynamical time and terrestrial time, for an observer on the Earth. -- -- The different time scales - proper, coordinate and realized - are -- related to each other: -- -- TAI <- physically realized -- : -- offset <- observed (nominally +32.184s) -- : -- TT <- terrestrial time -- : -- rate adjustment (L_G) <- definition of TT -- : -- TCG <- time scale for GCRS -- : -- "periodic" terms <- eraDtdb is an implementation -- : -- rate adjustment (L_C) <- function of solar-system ephemeris -- : -- TCB <- time scale for BCRS -- : -- rate adjustment (-L_B) <- definition of TDB -- : -- TDB <- TCB scaled to track TT -- : -- "periodic" terms <- -eraDtdb is an approximation -- : -- TT <- terrestrial time -- -- Adopted values for the various constants can be found in the IERS -- Conventions (McCarthy & Petit 2003). -- -- Given: -- date1,date2 double date, TDB (Notes 1-3) -- ut double universal time (UT1, fraction of one day) -- elong double longitude (east positive, radians) -- u double distance from Earth spin axis (km) -- v double distance north of equatorial plane (km) -- -- Returned (function value): -- double TDB-TT (seconds) -- -- Notes: -- -- 1) The date date1+date2 is a Julian Date, apportioned in any -- convenient way between the two arguments. For example, -- JD(TT)=2450123.7 could be expressed in any of these ways, -- among others: -- -- date1 date2 -- -- 2450123.7 0.0 (JD method) -- 2451545.0 -1421.3 (J2000 method) -- 2400000.5 50123.2 (MJD method) -- 2450123.5 0.2 (date & time method) -- -- The JD method is the most natural and convenient to use in -- cases where the loss of several decimal digits of resolution -- is acceptable. The J2000 method is best matched to the way -- the argument is handled internally and will deliver the -- optimum resolution. The MJD method and the date & time methods -- are both good compromises between resolution and convenience. -- -- Although the date is, formally, barycentric dynamical time (TDB), -- the terrestrial dynamical time (TT) can be used with no practical -- effect on the accuracy of the prediction. -- -- 2) TT can be regarded as a coordinate time that is realized as an -- offset of 32.184s from International Atomic Time, TAI. TT is a -- specific linear transformation of geocentric coordinate time TCG, -- which is the time scale for the Geocentric Celestial Reference -- System, GCRS. -- -- 3) TDB is a coordinate time, and is a specific linear transformation -- of barycentric coordinate time TCB, which is the time scale for -- the Barycentric Celestial Reference System, BCRS. -- -- 4) The difference TCG-TCB depends on the masses and positions of the -- bodies of the solar system and the velocity of the Earth. It is -- dominated by a rate difference, the residual being of a periodic -- character. The latter, which is modeled by the present function, -- comprises a main (annual) sinusoidal term of amplitude -- approximately 0.00166 seconds, plus planetary terms up to about -- 20 microseconds, and lunar and diurnal terms up to 2 microseconds. -- These effects come from the changing transverse Doppler effect -- and gravitational red-shift as the observer (on the Earth's -- surface) experiences variations in speed (with respect to the -- BCRS) and gravitational potential. -- -- 5) TDB can be regarded as the same as TCB but with a rate adjustment -- to keep it close to TT, which is convenient for many applications. -- The history of successive attempts to define TDB is set out in -- Resolution 3 adopted by the IAU General Assembly in 2006, which -- defines a fixed TDB(TCB) transformation that is consistent with -- contemporary solar-system ephemerides. Future ephemerides will -- imply slightly changed transformations between TCG and TCB, which -- could introduce a linear drift between TDB and TT; however, any -- such drift is unlikely to exceed 1 nanosecond per century. -- -- 6) The geocentric TDB-TT model used in the present function is that of -- Fairhead & Bretagnon (1990), in its full form. It was originally -- supplied by Fairhead (private communications with P.T.Wallace, -- 1990) as a Fortran subroutine. The present C function contains an -- adaptation of the Fairhead code. The numerical results are -- essentially unaffected by the changes, the differences with -- respect to the Fairhead & Bretagnon original being at the 1e-20 s -- level. -- -- The topocentric part of the model is from Moyer (1981) and -- Murray (1983), with fundamental arguments adapted from -- Simon et al. 1994. It is an approximation to the expression -- ( v / c ) . ( r / c ), where v is the barycentric velocity of -- the Earth, r is the geocentric position of the observer and -- c is the speed of light. -- -- By supplying zeroes for u and v, the topocentric part of the -- model can be nullified, and the function will return the Fairhead -- & Bretagnon result alone. -- -- 7) During the interval 1950-2050, the absolute accuracy is better -- than +/- 3 nanoseconds relative to time ephemerides obtained by -- direct numerical integrations based on the JPL DE405 solar system -- ephemeris. -- -- 8) It must be stressed that the present function is merely a model, -- and that numerical integration of solar-system ephemerides is the -- definitive method for predicting the relationship between TCG and -- TCB and hence between TT and TDB. -- -- References: -- -- Fairhead, L., & Bretagnon, P., Astron.Astrophys., 229, 240-247 -- (1990). -- -- IAU 2006 Resolution 3. -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Moyer, T.D., Cel.Mech., 23, 33 (1981). -- -- Murray, C.A., Vectorial Astrometry, Adam Hilger (1983). -- -- Seidelmann, P.K. et al., Explanatory Supplement to the -- Astronomical Almanac, Chapter 2, University Science Books (1992). -- -- Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M., -- Francou, G. & Laskar, J., Astron.Astrophys., 282, 663-683 (1994). -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.dtdb(date1, date2, ut, elong, u, v) -- return c_retval -- -- --def dtf2d(scale, iy, im, id, ihr, imn, sec): -- """ -- Wrapper for ERFA function ``eraDtf2d``. -- -- Parameters -- ---------- -- scale : const char array -- iy : int array -- im : int array -- id : int array -- ihr : int array -- imn : int array -- sec : double array -- -- Returns -- ------- -- d1 : double array -- d2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a D t f 2 d -- - - - - - - - - - -- -- Encode date and time fields into 2-part Julian Date (or in the case -- of UTC a quasi-JD form that includes special provision for leap -- seconds). -- -- Given: -- scale char[] time scale ID (Note 1) -- iy,im,id int year, month, day in Gregorian calendar (Note 2) -- ihr,imn int hour, minute -- sec double seconds -- -- Returned: -- d1,d2 double 2-part Julian Date (Notes 3,4) -- -- Returned (function value): -- int status: +3 = both of next two -- +2 = time is after end of day (Note 5) -- +1 = dubious year (Note 6) -- 0 = OK -- -1 = bad year -- -2 = bad month -- -3 = bad day -- -4 = bad hour -- -5 = bad minute -- -6 = bad second (<0) -- -- Notes: -- -- 1) scale identifies the time scale. Only the value "UTC" (in upper -- case) is significant, and enables handling of leap seconds (see -- Note 4). -- -- 2) For calendar conventions and limitations, see eraCal2jd. -- -- 3) The sum of the results, d1+d2, is Julian Date, where normally d1 -- is the Julian Day Number and d2 is the fraction of a day. In the -- case of UTC, where the use of JD is problematical, special -- conventions apply: see the next note. -- -- 4) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The ERFA internal convention is that -- the quasi-JD day represents UTC days whether the length is 86399, -- 86400 or 86401 SI seconds. In the 1960-1972 era there were -- smaller jumps (in either direction) each time the linear UTC(TAI) -- expression was changed, and these "mini-leaps" are also included -- in the ERFA convention. -- -- 5) The warning status "time is after end of day" usually means that -- the sec argument is greater than 60.0. However, in a day ending -- in a leap second the limit changes to 61.0 (or 59.0 in the case -- of a negative leap second). -- -- 6) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- 7) Only in the case of continuous and regular time scales (TAI, TT, -- TCG, TCB and TDB) is the result d1+d2 a Julian Date, strictly -- speaking. In the other cases (UT1 and UTC) the result must be -- used with circumspection; in particular the difference between -- two such results cannot be interpreted as a precise time -- interval. -- -- Called: -- eraCal2jd Gregorian calendar to JD -- eraDat delta(AT) = TAI-UTC -- eraJd2cal JD to Gregorian calendar -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- d1, d2, c_retval = ufunc.dtf2d(scale, iy, im, id, ihr, imn, sec) -- check_errwarn(c_retval, 'dtf2d') -- return d1, d2 -- -- --STATUS_CODES['dtf2d'] = {3: 'both of next two', 2: 'time is after end of day (Note 5)', 1: 'dubious year (Note 6)', 0: 'OK', -1: 'bad year', -2: 'bad month', -3: 'bad day', -4: 'bad hour', -5: 'bad minute', -6: 'bad second (<0)'} -- -- --def taitt(tai1, tai2): -- """ -- Wrapper for ERFA function ``eraTaitt``. -- -- Parameters -- ---------- -- tai1 : double array -- tai2 : double array -- -- Returns -- ------- -- tt1 : double array -- tt2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T a i t t -- - - - - - - - - - -- -- Time scale transformation: International Atomic Time, TAI, to -- Terrestrial Time, TT. -- -- Given: -- tai1,tai2 double TAI as a 2-part Julian Date -- -- Returned: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Note: -- -- tai1+tai2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tai1 is the Julian -- Day Number and tai2 is the fraction of a day. The returned -- tt1,tt2 follow suit. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tt1, tt2, c_retval = ufunc.taitt(tai1, tai2) -- check_errwarn(c_retval, 'taitt') -- return tt1, tt2 -- -- --STATUS_CODES['taitt'] = {0: 'OK'} -- -- --def taiut1(tai1, tai2, dta): -- """ -- Wrapper for ERFA function ``eraTaiut1``. -- -- Parameters -- ---------- -- tai1 : double array -- tai2 : double array -- dta : double array -- -- Returns -- ------- -- ut11 : double array -- ut12 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a T a i u t 1 -- - - - - - - - - - - -- -- Time scale transformation: International Atomic Time, TAI, to -- Universal Time, UT1. -- -- Given: -- tai1,tai2 double TAI as a 2-part Julian Date -- dta double UT1-TAI in seconds -- -- Returned: -- ut11,ut12 double UT1 as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tai1+tai2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tai1 is the Julian -- Day Number and tai2 is the fraction of a day. The returned -- UT11,UT12 follow suit. -- -- 2) The argument dta, i.e. UT1-TAI, is an observed quantity, and is -- available from IERS tabulations. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ut11, ut12, c_retval = ufunc.taiut1(tai1, tai2, dta) -- check_errwarn(c_retval, 'taiut1') -- return ut11, ut12 -- -- --STATUS_CODES['taiut1'] = {0: 'OK'} -- -- --def taiutc(tai1, tai2): -- """ -- Wrapper for ERFA function ``eraTaiutc``. -- -- Parameters -- ---------- -- tai1 : double array -- tai2 : double array -- -- Returns -- ------- -- utc1 : double array -- utc2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a T a i u t c -- - - - - - - - - - - -- -- Time scale transformation: International Atomic Time, TAI, to -- Coordinated Universal Time, UTC. -- -- Given: -- tai1,tai2 double TAI as a 2-part Julian Date (Note 1) -- -- Returned: -- utc1,utc2 double UTC as a 2-part quasi Julian Date (Notes 1-3) -- -- Returned (function value): -- int status: +1 = dubious year (Note 4) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) tai1+tai2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tai1 is the Julian -- Day Number and tai2 is the fraction of a day. The returned utc1 -- and utc2 form an analogous pair, except that a special convention -- is used, to deal with the problem of leap seconds - see the next -- note. -- -- 2) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The convention in the present -- function is that the JD day represents UTC days whether the -- length is 86399, 86400 or 86401 SI seconds. In the 1960-1972 era -- there were smaller jumps (in either direction) each time the -- linear UTC(TAI) expression was changed, and these "mini-leaps" -- are also included in the ERFA convention. -- -- 3) The function eraD2dtf can be used to transform the UTC quasi-JD -- into calendar date and clock time, including UTC leap second -- handling. -- -- 4) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- Called: -- eraUtctai UTC to TAI -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- utc1, utc2, c_retval = ufunc.taiutc(tai1, tai2) -- check_errwarn(c_retval, 'taiutc') -- return utc1, utc2 -- -- --STATUS_CODES['taiutc'] = {1: 'dubious year (Note 4)', 0: 'OK', -1: 'unacceptable date'} -- -- --def tcbtdb(tcb1, tcb2): -- """ -- Wrapper for ERFA function ``eraTcbtdb``. -- -- Parameters -- ---------- -- tcb1 : double array -- tcb2 : double array -- -- Returns -- ------- -- tdb1 : double array -- tdb2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a T c b t d b -- - - - - - - - - - - -- -- Time scale transformation: Barycentric Coordinate Time, TCB, to -- Barycentric Dynamical Time, TDB. -- -- Given: -- tcb1,tcb2 double TCB as a 2-part Julian Date -- -- Returned: -- tdb1,tdb2 double TDB as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tcb1+tcb2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tcb1 is the Julian -- Day Number and tcb2 is the fraction of a day. The returned -- tdb1,tdb2 follow suit. -- -- 2) The 2006 IAU General Assembly introduced a conventional linear -- transformation between TDB and TCB. This transformation -- compensates for the drift between TCB and terrestrial time TT, -- and keeps TDB approximately centered on TT. Because the -- relationship between TT and TCB depends on the adopted solar -- system ephemeris, the degree of alignment between TDB and TT over -- long intervals will vary according to which ephemeris is used. -- Former definitions of TDB attempted to avoid this problem by -- stipulating that TDB and TT should differ only by periodic -- effects. This is a good description of the nature of the -- relationship but eluded precise mathematical formulation. The -- conventional linear relationship adopted in 2006 sidestepped -- these difficulties whilst delivering a TDB that in practice was -- consistent with values before that date. -- -- 3) TDB is essentially the same as Teph, the time argument for the -- JPL solar system ephemerides. -- -- Reference: -- -- IAU 2006 Resolution B3 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tdb1, tdb2, c_retval = ufunc.tcbtdb(tcb1, tcb2) -- check_errwarn(c_retval, 'tcbtdb') -- return tdb1, tdb2 -- -- --STATUS_CODES['tcbtdb'] = {0: 'OK'} -- -- --def tcgtt(tcg1, tcg2): -- """ -- Wrapper for ERFA function ``eraTcgtt``. -- -- Parameters -- ---------- -- tcg1 : double array -- tcg2 : double array -- -- Returns -- ------- -- tt1 : double array -- tt2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T c g t t -- - - - - - - - - - -- -- Time scale transformation: Geocentric Coordinate Time, TCG, to -- Terrestrial Time, TT. -- -- Given: -- tcg1,tcg2 double TCG as a 2-part Julian Date -- -- Returned: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Note: -- -- tcg1+tcg2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tcg1 is the Julian -- Day Number and tcg22 is the fraction of a day. The returned -- tt1,tt2 follow suit. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),. -- IERS Technical Note No. 32, BKG (2004) -- -- IAU 2000 Resolution B1.9 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tt1, tt2, c_retval = ufunc.tcgtt(tcg1, tcg2) -- check_errwarn(c_retval, 'tcgtt') -- return tt1, tt2 -- -- --STATUS_CODES['tcgtt'] = {0: 'OK'} -- -- --def tdbtcb(tdb1, tdb2): -- """ -- Wrapper for ERFA function ``eraTdbtcb``. -- -- Parameters -- ---------- -- tdb1 : double array -- tdb2 : double array -- -- Returns -- ------- -- tcb1 : double array -- tcb2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a T d b t c b -- - - - - - - - - - - -- -- Time scale transformation: Barycentric Dynamical Time, TDB, to -- Barycentric Coordinate Time, TCB. -- -- Given: -- tdb1,tdb2 double TDB as a 2-part Julian Date -- -- Returned: -- tcb1,tcb2 double TCB as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tdb1+tdb2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tdb1 is the Julian -- Day Number and tdb2 is the fraction of a day. The returned -- tcb1,tcb2 follow suit. -- -- 2) The 2006 IAU General Assembly introduced a conventional linear -- transformation between TDB and TCB. This transformation -- compensates for the drift between TCB and terrestrial time TT, -- and keeps TDB approximately centered on TT. Because the -- relationship between TT and TCB depends on the adopted solar -- system ephemeris, the degree of alignment between TDB and TT over -- long intervals will vary according to which ephemeris is used. -- Former definitions of TDB attempted to avoid this problem by -- stipulating that TDB and TT should differ only by periodic -- effects. This is a good description of the nature of the -- relationship but eluded precise mathematical formulation. The -- conventional linear relationship adopted in 2006 sidestepped -- these difficulties whilst delivering a TDB that in practice was -- consistent with values before that date. -- -- 3) TDB is essentially the same as Teph, the time argument for the -- JPL solar system ephemerides. -- -- Reference: -- -- IAU 2006 Resolution B3 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tcb1, tcb2, c_retval = ufunc.tdbtcb(tdb1, tdb2) -- check_errwarn(c_retval, 'tdbtcb') -- return tcb1, tcb2 -- -- --STATUS_CODES['tdbtcb'] = {0: 'OK'} -- -- --def tdbtt(tdb1, tdb2, dtr): -- """ -- Wrapper for ERFA function ``eraTdbtt``. -- -- Parameters -- ---------- -- tdb1 : double array -- tdb2 : double array -- dtr : double array -- -- Returns -- ------- -- tt1 : double array -- tt2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T d b t t -- - - - - - - - - - -- -- Time scale transformation: Barycentric Dynamical Time, TDB, to -- Terrestrial Time, TT. -- -- Given: -- tdb1,tdb2 double TDB as a 2-part Julian Date -- dtr double TDB-TT in seconds -- -- Returned: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tdb1+tdb2 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where tdb1 is the Julian -- Day Number and tdb2 is the fraction of a day. The returned -- tt1,tt2 follow suit. -- -- 2) The argument dtr represents the quasi-periodic component of the -- GR transformation between TT and TCB. It is dependent upon the -- adopted solar-system ephemeris, and can be obtained by numerical -- integration, by interrogating a precomputed time ephemeris or by -- evaluating a model such as that implemented in the ERFA function -- eraDtdb. The quantity is dominated by an annual term of 1.7 ms -- amplitude. -- -- 3) TDB is essentially the same as Teph, the time argument for the -- JPL solar system ephemerides. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- IAU 2006 Resolution 3 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tt1, tt2, c_retval = ufunc.tdbtt(tdb1, tdb2, dtr) -- check_errwarn(c_retval, 'tdbtt') -- return tt1, tt2 -- -- --STATUS_CODES['tdbtt'] = {0: 'OK'} -- -- --def tttai(tt1, tt2): -- """ -- Wrapper for ERFA function ``eraTttai``. -- -- Parameters -- ---------- -- tt1 : double array -- tt2 : double array -- -- Returns -- ------- -- tai1 : double array -- tai2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T t t a i -- - - - - - - - - - -- -- Time scale transformation: Terrestrial Time, TT, to International -- Atomic Time, TAI. -- -- Given: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned: -- tai1,tai2 double TAI as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Note: -- -- tt1+tt2 is Julian Date, apportioned in any convenient way between -- the two arguments, for example where tt1 is the Julian Day Number -- and tt2 is the fraction of a day. The returned tai1,tai2 follow -- suit. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tai1, tai2, c_retval = ufunc.tttai(tt1, tt2) -- check_errwarn(c_retval, 'tttai') -- return tai1, tai2 -- -- --STATUS_CODES['tttai'] = {0: 'OK'} -- -- --def tttcg(tt1, tt2): -- """ -- Wrapper for ERFA function ``eraTttcg``. -- -- Parameters -- ---------- -- tt1 : double array -- tt2 : double array -- -- Returns -- ------- -- tcg1 : double array -- tcg2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T t t c g -- - - - - - - - - - -- -- Time scale transformation: Terrestrial Time, TT, to Geocentric -- Coordinate Time, TCG. -- -- Given: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned: -- tcg1,tcg2 double TCG as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Note: -- -- tt1+tt2 is Julian Date, apportioned in any convenient way between -- the two arguments, for example where tt1 is the Julian Day Number -- and tt2 is the fraction of a day. The returned tcg1,tcg2 follow -- suit. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- IAU 2000 Resolution B1.9 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tcg1, tcg2, c_retval = ufunc.tttcg(tt1, tt2) -- check_errwarn(c_retval, 'tttcg') -- return tcg1, tcg2 -- -- --STATUS_CODES['tttcg'] = {0: 'OK'} -- -- --def tttdb(tt1, tt2, dtr): -- """ -- Wrapper for ERFA function ``eraTttdb``. -- -- Parameters -- ---------- -- tt1 : double array -- tt2 : double array -- dtr : double array -- -- Returns -- ------- -- tdb1 : double array -- tdb2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T t t d b -- - - - - - - - - - -- -- Time scale transformation: Terrestrial Time, TT, to Barycentric -- Dynamical Time, TDB. -- -- Given: -- tt1,tt2 double TT as a 2-part Julian Date -- dtr double TDB-TT in seconds -- -- Returned: -- tdb1,tdb2 double TDB as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tt1+tt2 is Julian Date, apportioned in any convenient way between -- the two arguments, for example where tt1 is the Julian Day Number -- and tt2 is the fraction of a day. The returned tdb1,tdb2 follow -- suit. -- -- 2) The argument dtr represents the quasi-periodic component of the -- GR transformation between TT and TCB. It is dependent upon the -- adopted solar-system ephemeris, and can be obtained by numerical -- integration, by interrogating a precomputed time ephemeris or by -- evaluating a model such as that implemented in the ERFA function -- eraDtdb. The quantity is dominated by an annual term of 1.7 ms -- amplitude. -- -- 3) TDB is essentially the same as Teph, the time argument for the JPL -- solar system ephemerides. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- IAU 2006 Resolution 3 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tdb1, tdb2, c_retval = ufunc.tttdb(tt1, tt2, dtr) -- check_errwarn(c_retval, 'tttdb') -- return tdb1, tdb2 -- -- --STATUS_CODES['tttdb'] = {0: 'OK'} -- -- --def ttut1(tt1, tt2, dt): -- """ -- Wrapper for ERFA function ``eraTtut1``. -- -- Parameters -- ---------- -- tt1 : double array -- tt2 : double array -- dt : double array -- -- Returns -- ------- -- ut11 : double array -- ut12 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T t u t 1 -- - - - - - - - - - -- -- Time scale transformation: Terrestrial Time, TT, to Universal Time, -- UT1. -- -- Given: -- tt1,tt2 double TT as a 2-part Julian Date -- dt double TT-UT1 in seconds -- -- Returned: -- ut11,ut12 double UT1 as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) tt1+tt2 is Julian Date, apportioned in any convenient way between -- the two arguments, for example where tt1 is the Julian Day Number -- and tt2 is the fraction of a day. The returned ut11,ut12 follow -- suit. -- -- 2) The argument dt is classical Delta T. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ut11, ut12, c_retval = ufunc.ttut1(tt1, tt2, dt) -- check_errwarn(c_retval, 'ttut1') -- return ut11, ut12 -- -- --STATUS_CODES['ttut1'] = {0: 'OK'} -- -- --def ut1tai(ut11, ut12, dta): -- """ -- Wrapper for ERFA function ``eraUt1tai``. -- -- Parameters -- ---------- -- ut11 : double array -- ut12 : double array -- dta : double array -- -- Returns -- ------- -- tai1 : double array -- tai2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a U t 1 t a i -- - - - - - - - - - - -- -- Time scale transformation: Universal Time, UT1, to International -- Atomic Time, TAI. -- -- Given: -- ut11,ut12 double UT1 as a 2-part Julian Date -- dta double UT1-TAI in seconds -- -- Returned: -- tai1,tai2 double TAI as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) ut11+ut12 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where ut11 is the Julian -- Day Number and ut12 is the fraction of a day. The returned -- tai1,tai2 follow suit. -- -- 2) The argument dta, i.e. UT1-TAI, is an observed quantity, and is -- available from IERS tabulations. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tai1, tai2, c_retval = ufunc.ut1tai(ut11, ut12, dta) -- check_errwarn(c_retval, 'ut1tai') -- return tai1, tai2 -- -- --STATUS_CODES['ut1tai'] = {0: 'OK'} -- -- --def ut1tt(ut11, ut12, dt): -- """ -- Wrapper for ERFA function ``eraUt1tt``. -- -- Parameters -- ---------- -- ut11 : double array -- ut12 : double array -- dt : double array -- -- Returns -- ------- -- tt1 : double array -- tt2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a U t 1 t t -- - - - - - - - - - -- -- Time scale transformation: Universal Time, UT1, to Terrestrial -- Time, TT. -- -- Given: -- ut11,ut12 double UT1 as a 2-part Julian Date -- dt double TT-UT1 in seconds -- -- Returned: -- tt1,tt2 double TT as a 2-part Julian Date -- -- Returned (function value): -- int status: 0 = OK -- -- Notes: -- -- 1) ut11+ut12 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where ut11 is the Julian -- Day Number and ut12 is the fraction of a day. The returned -- tt1,tt2 follow suit. -- -- 2) The argument dt is classical Delta T. -- -- Reference: -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tt1, tt2, c_retval = ufunc.ut1tt(ut11, ut12, dt) -- check_errwarn(c_retval, 'ut1tt') -- return tt1, tt2 -- -- --STATUS_CODES['ut1tt'] = {0: 'OK'} -- -- --def ut1utc(ut11, ut12, dut1): -- """ -- Wrapper for ERFA function ``eraUt1utc``. -- -- Parameters -- ---------- -- ut11 : double array -- ut12 : double array -- dut1 : double array -- -- Returns -- ------- -- utc1 : double array -- utc2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a U t 1 u t c -- - - - - - - - - - - -- -- Time scale transformation: Universal Time, UT1, to Coordinated -- Universal Time, UTC. -- -- Given: -- ut11,ut12 double UT1 as a 2-part Julian Date (Note 1) -- dut1 double Delta UT1: UT1-UTC in seconds (Note 2) -- -- Returned: -- utc1,utc2 double UTC as a 2-part quasi Julian Date (Notes 3,4) -- -- Returned (function value): -- int status: +1 = dubious year (Note 5) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) ut11+ut12 is Julian Date, apportioned in any convenient way -- between the two arguments, for example where ut11 is the Julian -- Day Number and ut12 is the fraction of a day. The returned utc1 -- and utc2 form an analogous pair, except that a special convention -- is used, to deal with the problem of leap seconds - see Note 3. -- -- 2) Delta UT1 can be obtained from tabulations provided by the -- International Earth Rotation and Reference Systems Service. The -- value changes abruptly by 1s at a leap second; however, close to -- a leap second the algorithm used here is tolerant of the "wrong" -- choice of value being made. -- -- 3) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The convention in the present -- function is that the returned quasi JD day UTC1+UTC2 represents -- UTC days whether the length is 86399, 86400 or 86401 SI seconds. -- -- 4) The function eraD2dtf can be used to transform the UTC quasi-JD -- into calendar date and clock time, including UTC leap second -- handling. -- -- 5) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- Called: -- eraJd2cal JD to Gregorian calendar -- eraDat delta(AT) = TAI-UTC -- eraCal2jd Gregorian calendar to JD -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- utc1, utc2, c_retval = ufunc.ut1utc(ut11, ut12, dut1) -- check_errwarn(c_retval, 'ut1utc') -- return utc1, utc2 -- -- --STATUS_CODES['ut1utc'] = {1: 'dubious year (Note 5)', 0: 'OK', -1: 'unacceptable date'} -- -- --def utctai(utc1, utc2): -- """ -- Wrapper for ERFA function ``eraUtctai``. -- -- Parameters -- ---------- -- utc1 : double array -- utc2 : double array -- -- Returns -- ------- -- tai1 : double array -- tai2 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a U t c t a i -- - - - - - - - - - - -- -- Time scale transformation: Coordinated Universal Time, UTC, to -- International Atomic Time, TAI. -- -- Given: -- utc1,utc2 double UTC as a 2-part quasi Julian Date (Notes 1-4) -- -- Returned: -- tai1,tai2 double TAI as a 2-part Julian Date (Note 5) -- -- Returned (function value): -- int status: +1 = dubious year (Note 3) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- 2) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The convention in the present -- function is that the JD day represents UTC days whether the -- length is 86399, 86400 or 86401 SI seconds. In the 1960-1972 era -- there were smaller jumps (in either direction) each time the -- linear UTC(TAI) expression was changed, and these "mini-leaps" -- are also included in the ERFA convention. -- -- 3) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- 4) The function eraDtf2d converts from calendar date and time of day -- into 2-part Julian Date, and in the case of UTC implements the -- leap-second-ambiguity convention described above. -- -- 5) The returned TAI1,TAI2 are such that their sum is the TAI Julian -- Date. -- -- Called: -- eraJd2cal JD to Gregorian calendar -- eraDat delta(AT) = TAI-UTC -- eraCal2jd Gregorian calendar to JD -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- tai1, tai2, c_retval = ufunc.utctai(utc1, utc2) -- check_errwarn(c_retval, 'utctai') -- return tai1, tai2 -- -- --STATUS_CODES['utctai'] = {1: 'dubious year (Note 3)', 0: 'OK', -1: 'unacceptable date'} -- -- --def utcut1(utc1, utc2, dut1): -- """ -- Wrapper for ERFA function ``eraUtcut1``. -- -- Parameters -- ---------- -- utc1 : double array -- utc2 : double array -- dut1 : double array -- -- Returns -- ------- -- ut11 : double array -- ut12 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a U t c u t 1 -- - - - - - - - - - - -- -- Time scale transformation: Coordinated Universal Time, UTC, to -- Universal Time, UT1. -- -- Given: -- utc1,utc2 double UTC as a 2-part quasi Julian Date (Notes 1-4) -- dut1 double Delta UT1 = UT1-UTC in seconds (Note 5) -- -- Returned: -- ut11,ut12 double UT1 as a 2-part Julian Date (Note 6) -- -- Returned (function value): -- int status: +1 = dubious year (Note 3) -- 0 = OK -- -1 = unacceptable date -- -- Notes: -- -- 1) utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any -- convenient way between the two arguments, for example where utc1 -- is the Julian Day Number and utc2 is the fraction of a day. -- -- 2) JD cannot unambiguously represent UTC during a leap second unless -- special measures are taken. The convention in the present -- function is that the JD day represents UTC days whether the -- length is 86399, 86400 or 86401 SI seconds. -- -- 3) The warning status "dubious year" flags UTCs that predate the -- introduction of the time scale or that are too far in the future -- to be trusted. See eraDat for further details. -- -- 4) The function eraDtf2d converts from calendar date and time of -- day into 2-part Julian Date, and in the case of UTC implements -- the leap-second-ambiguity convention described above. -- -- 5) Delta UT1 can be obtained from tabulations provided by the -- International Earth Rotation and Reference Systems Service. -- It is the caller's responsibility to supply a dut1 argument -- containing the UT1-UTC value that matches the given UTC. -- -- 6) The returned ut11,ut12 are such that their sum is the UT1 Julian -- Date. -- -- References: -- -- McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), -- IERS Technical Note No. 32, BKG (2004) -- -- Explanatory Supplement to the Astronomical Almanac, -- P. Kenneth Seidelmann (ed), University Science Books (1992) -- -- Called: -- eraJd2cal JD to Gregorian calendar -- eraDat delta(AT) = TAI-UTC -- eraUtctai UTC to TAI -- eraTaiut1 TAI to UT1 -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- ut11, ut12, c_retval = ufunc.utcut1(utc1, utc2, dut1) -- check_errwarn(c_retval, 'utcut1') -- return ut11, ut12 -- -- --STATUS_CODES['utcut1'] = {1: 'dubious year (Note 3)', 0: 'OK', -1: 'unacceptable date'} -- -- --def ae2hd(az, el, phi): -- """ -- Wrapper for ERFA function ``eraAe2hd``. -- -- Parameters -- ---------- -- az : double array -- el : double array -- phi : double array -- -- Returns -- ------- -- ha : double array -- dec : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a A e 2 h d -- - - - - - - - - - -- -- Horizon to equatorial coordinates: transform azimuth and altitude -- to hour angle and declination. -- -- Given: -- az double azimuth -- el double altitude (informally, elevation) -- phi double site latitude -- -- Returned: -- ha double hour angle (local) -- dec double declination -- -- Notes: -- -- 1) All the arguments are angles in radians. -- -- 2) The sign convention for azimuth is north zero, east +pi/2. -- -- 3) HA is returned in the range +/-pi. Declination is returned in -- the range +/-pi/2. -- -- 4) The latitude phi is pi/2 minus the angle between the Earth's -- rotation axis and the adopted zenith. In many applications it -- will be sufficient to use the published geodetic latitude of the -- site. In very precise (sub-arcsecond) applications, phi can be -- corrected for polar motion. -- -- 5) The azimuth az must be with respect to the rotational north pole, -- as opposed to the ITRS pole, and an azimuth with respect to north -- on a map of the Earth's surface will need to be adjusted for -- polar motion if sub-arcsecond accuracy is required. -- -- 6) Should the user wish to work with respect to the astronomical -- zenith rather than the geodetic zenith, phi will need to be -- adjusted for deflection of the vertical (often tens of -- arcseconds), and the zero point of ha will also be affected. -- -- 7) The transformation is the same as Ve = Ry(phi-pi/2)*Rz(pi)*Vh, -- where Ve and Vh are lefthanded unit vectors in the (ha,dec) and -- (az,el) systems respectively and Rz and Ry are rotations about -- first the z-axis and then the y-axis. (n.b. Rz(pi) simply -- reverses the signs of the x and y components.) For efficiency, -- the algorithm is written out rather than calling other utility -- functions. For applications that require even greater -- efficiency, additional savings are possible if constant terms -- such as functions of latitude are computed once and for all. -- -- 8) Again for efficiency, no range checking of arguments is carried -- out. -- -- Last revision: 2017 September 12 -- -- ERFA release 2019-07-22 -- -- Copyright (C) 2019 IAU ERFA Board. See notes at end. -- -- """ -- ha, dec = ufunc.ae2hd(az, el, phi) -- return ha, dec -- -- --def hd2ae(ha, dec, phi): -- """ -- Wrapper for ERFA function ``eraHd2ae``. -- -- Parameters -- ---------- -- ha : double array -- dec : double array -- phi : double array -- -- Returns -- ------- -- az : double array -- el : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a H d 2 a e -- - - - - - - - - - -- -- Equatorial to horizon coordinates: transform hour angle and -- declination to azimuth and altitude. -- -- Given: -- ha double hour angle (local) -- dec double declination -- phi double site latitude -- -- Returned: -- *az double azimuth -- *el double altitude (informally, elevation) -- -- Notes: -- -- 1) All the arguments are angles in radians. -- -- 2) Azimuth is returned in the range 0-2pi; north is zero, and east -- is +pi/2. Altitude is returned in the range +/- pi/2. -- -- 3) The latitude phi is pi/2 minus the angle between the Earth's -- rotation axis and the adopted zenith. In many applications it -- will be sufficient to use the published geodetic latitude of the -- site. In very precise (sub-arcsecond) applications, phi can be -- corrected for polar motion. -- -- 4) The returned azimuth az is with respect to the rotational north -- pole, as opposed to the ITRS pole, and for sub-arcsecond -- accuracy will need to be adjusted for polar motion if it is to -- be with respect to north on a map of the Earth's surface. -- -- 5) Should the user wish to work with respect to the astronomical -- zenith rather than the geodetic zenith, phi will need to be -- adjusted for deflection of the vertical (often tens of -- arcseconds), and the zero point of the hour angle ha will also -- be affected. -- -- 6) The transformation is the same as Vh = Rz(pi)*Ry(pi/2-phi)*Ve, -- where Vh and Ve are lefthanded unit vectors in the (az,el) and -- (ha,dec) systems respectively and Ry and Rz are rotations about -- first the y-axis and then the z-axis. (n.b. Rz(pi) simply -- reverses the signs of the x and y components.) For efficiency, -- the algorithm is written out rather than calling other utility -- functions. For applications that require even greater -- efficiency, additional savings are possible if constant terms -- such as functions of latitude are computed once and for all. -- -- 7) Again for efficiency, no range checking of arguments is carried -- out. -- -- Last revision: 2017 September 12 -- -- ERFA release 2019-07-22 -- -- Copyright (C) 2019 IAU ERFA Board. See notes at end. -- -- """ -- az, el = ufunc.hd2ae(ha, dec, phi) -- return az, el -- -- --def hd2pa(ha, dec, phi): -- """ -- Wrapper for ERFA function ``eraHd2pa``. -- -- Parameters -- ---------- -- ha : double array -- dec : double array -- phi : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a H d 2 p a -- - - - - - - - - - -- -- Parallactic angle for a given hour angle and declination. -- -- Given: -- ha double hour angle -- dec double declination -- phi double site latitude -- -- Returned (function value): -- double parallactic angle -- -- Notes: -- -- 1) All the arguments are angles in radians. -- -- 2) The parallactic angle at a point in the sky is the position -- angle of the vertical, i.e. the angle between the directions to -- the north celestial pole and to the zenith respectively. -- -- 3) The result is returned in the range -pi to +pi. -- -- 4) At the pole itself a zero result is returned. -- -- 5) The latitude phi is pi/2 minus the angle between the Earth's -- rotation axis and the adopted zenith. In many applications it -- will be sufficient to use the published geodetic latitude of the -- site. In very precise (sub-arcsecond) applications, phi can be -- corrected for polar motion. -- -- 6) Should the user wish to work with respect to the astronomical -- zenith rather than the geodetic zenith, phi will need to be -- adjusted for deflection of the vertical (often tens of -- arcseconds), and the zero point of the hour angle ha will also -- be affected. -- -- Reference: -- Smart, W.M., "Spherical Astronomy", Cambridge University Press, -- 6th edition (Green, 1977), p49. -- -- Last revision: 2017 September 12 -- -- ERFA release 2019-07-22 -- -- Copyright (C) 2019 IAU ERFA Board. See notes at end. -- -- """ -- c_retval = ufunc.hd2pa(ha, dec, phi) -- return c_retval -- -- --def tpors(xi, eta, a, b): -- """ -- Wrapper for ERFA function ``eraTpors``. -- -- Parameters -- ---------- -- xi : double array -- eta : double array -- a : double array -- b : double array -- -- Returns -- ------- -- a01 : double array -- b01 : double array -- a02 : double array -- b02 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p o r s -- - - - - - - - - - -- -- In the tangent plane projection, given the rectangular coordinates -- of a star and its spherical coordinates, determine the spherical -- coordinates of the tangent point. -- -- Given: -- xi,eta double rectangular coordinates of star image (Note 2) -- a,b double star's spherical coordinates (Note 3) -- -- Returned: -- *a01,*b01 double tangent point's spherical coordinates, Soln. 1 -- *a02,*b02 double tangent point's spherical coordinates, Soln. 2 -- -- Returned (function value): -- int number of solutions: -- 0 = no solutions returned (Note 5) -- 1 = only the first solution is useful (Note 6) -- 2 = both solutions are useful (Note 6) -- -- Notes: -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the spherical coordinates are observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". If the spherical coordinates are with -- respect to a right-handed triad, (xi,eta) are also right-handed. -- The units of (xi,eta) are, effectively, radians at the tangent -- point. -- -- 3) All angular arguments are in radians. -- -- 4) The angles a01 and a02 are returned in the range 0-2pi. The -- angles b01 and b02 are returned in the range +/-pi, but in the -- usual, non-pole-crossing, case, the range is +/-pi/2. -- -- 5) Cases where there is no solution can arise only near the poles. -- For example, it is clearly impossible for a star at the pole -- itself to have a non-zero xi value, and hence it is meaningless -- to ask where the tangent point would have to be to bring about -- this combination of xi and dec. -- -- 6) Also near the poles, cases can arise where there are two useful -- solutions. The return value indicates whether the second of the -- two solutions returned is useful; 1 indicates only one useful -- solution, the usual case. -- -- 7) The basis of the algorithm is to solve the spherical triangle PSC, -- where P is the north celestial pole, S is the star and C is the -- tangent point. The spherical coordinates of the tangent point are -- [a0,b0]; writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), side c -- is then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be -- found) is (pi/2-b0). Angle C is given by sin(C) = xi/rho and -- cos(C) = eta/rho. Angle P (to be found) is the longitude -- difference between star and tangent point (a-a0). -- -- 8) This function is a member of the following set: -- -- spherical vector solve for -- -- eraTpxes eraTpxev xi,eta -- eraTpsts eraTpstv star -- > eraTpors < eraTporv origin -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- a01, b01, a02, b02, c_retval = ufunc.tpors(xi, eta, a, b) -- check_errwarn(c_retval, 'tpors') -- return a01, b01, a02, b02 -- -- -- -- --def tporv(xi, eta, v): -- """ -- Wrapper for ERFA function ``eraTporv``. -- -- Parameters -- ---------- -- xi : double array -- eta : double array -- v : double array -- -- Returns -- ------- -- v01 : double array -- v02 : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p o r v -- - - - - - - - - - -- -- In the tangent plane projection, given the rectangular coordinates -- of a star and its direction cosines, determine the direction -- cosines of the tangent point. -- -- Given: -- xi,eta double rectangular coordinates of star image (Note 2) -- v double[3] star's direction cosines (Note 3) -- -- Returned: -- v01 double[3] tangent point's direction cosines, Solution 1 -- v02 double[3] tangent point's direction cosines, Solution 2 -- -- Returned (function value): -- int number of solutions: -- 0 = no solutions returned (Note 4) -- 1 = only the first solution is useful (Note 5) -- 2 = both solutions are useful (Note 5) -- -- Notes: -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the direction cosines represent observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". If the direction cosines are with -- respect to a right-handed triad, (xi,eta) are also right-handed. -- The units of (xi,eta) are, effectively, radians at the tangent -- point. -- -- 3) The vector v must be of unit length or the result will be wrong. -- -- 4) Cases where there is no solution can arise only near the poles. -- For example, it is clearly impossible for a star at the pole -- itself to have a non-zero xi value, and hence it is meaningless -- to ask where the tangent point would have to be. -- -- 5) Also near the poles, cases can arise where there are two useful -- solutions. The return value indicates whether the second of the -- two solutions returned is useful; 1 indicates only one useful -- solution, the usual case. -- -- 6) The basis of the algorithm is to solve the spherical triangle -- PSC, where P is the north celestial pole, S is the star and C is -- the tangent point. Calling the celestial spherical coordinates -- of the star and tangent point (a,b) and (a0,b0) respectively, and -- writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), and -- transforming the vector v into (a,b) in the normal way, side c is -- then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be -- found) is (pi/2-b0), while angle C is given by sin(C) = xi/rho -- and cos(C) = eta/rho; angle P (to be found) is (a-a0). After -- solving the spherical triangle, the result (a0,b0) can be -- expressed in vector form as v0. -- -- 7) This function is a member of the following set: -- -- spherical vector solve for -- -- eraTpxes eraTpxev xi,eta -- eraTpsts eraTpstv star -- eraTpors > eraTporv < origin -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- v01, v02, c_retval = ufunc.tporv(xi, eta, v) -- check_errwarn(c_retval, 'tporv') -- return v01, v02 -- -- -- -- --def tpsts(xi, eta, a0, b0): -- """ -- Wrapper for ERFA function ``eraTpsts``. -- -- Parameters -- ---------- -- xi : double array -- eta : double array -- a0 : double array -- b0 : double array -- -- Returns -- ------- -- a : double array -- b : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p s t s -- - - - - - - - - - -- -- In the tangent plane projection, given the star's rectangular -- coordinates and the spherical coordinates of the tangent point, -- solve for the spherical coordinates of the star. -- -- Given: -- xi,eta double rectangular coordinates of star image (Note 2) -- a0,b0 double tangent point's spherical coordinates -- -- Returned: -- *a,*b double star's spherical coordinates -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the spherical coordinates are observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". If the spherical coordinates are with -- respect to a right-handed triad, (xi,eta) are also right-handed. -- The units of (xi,eta) are, effectively, radians at the tangent -- point. -- -- 3) All angular arguments are in radians. -- -- 4) This function is a member of the following set: -- -- spherical vector solve for -- -- eraTpxes eraTpxev xi,eta -- > eraTpsts < eraTpstv star -- eraTpors eraTporv origin -- -- Called: -- eraAnp normalize angle into range 0 to 2pi -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- a, b = ufunc.tpsts(xi, eta, a0, b0) -- return a, b -- -- --def tpstv(xi, eta, v0): -- """ -- Wrapper for ERFA function ``eraTpstv``. -- -- Parameters -- ---------- -- xi : double array -- eta : double array -- v0 : double array -- -- Returns -- ------- -- v : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p s t v -- - - - - - - - - - -- -- In the tangent plane projection, given the star's rectangular -- coordinates and the direction cosines of the tangent point, solve -- for the direction cosines of the star. -- -- Given: -- xi,eta double rectangular coordinates of star image (Note 2) -- v0 double[3] tangent point's direction cosines -- -- Returned: -- v double[3] star's direction cosines -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the direction cosines represent observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". If the direction cosines are with -- respect to a right-handed triad, (xi,eta) are also right-handed. -- The units of (xi,eta) are, effectively, radians at the tangent -- point. -- -- 3) The method used is to complete the star vector in the (xi,eta) -- based triad and normalize it, then rotate the triad to put the -- tangent point at the pole with the x-axis aligned to zero -- longitude. Writing (a0,b0) for the celestial spherical -- coordinates of the tangent point, the sequence of rotations is -- (b-pi/2) around the x-axis followed by (-a-pi/2) around the -- z-axis. -- -- 4) If vector v0 is not of unit length, the returned vector v will -- be wrong. -- -- 5) If vector v0 points at a pole, the returned vector v will be -- based on the arbitrary assumption that the longitude coordinate -- of the tangent point is zero. -- -- 6) This function is a member of the following set: -- -- spherical vector solve for -- -- eraTpxes eraTpxev xi,eta -- eraTpsts > eraTpstv < star -- eraTpors eraTporv origin -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- v = ufunc.tpstv(xi, eta, v0) -- return v -- -- --def tpxes(a, b, a0, b0): -- """ -- Wrapper for ERFA function ``eraTpxes``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- a0 : double array -- b0 : double array -- -- Returns -- ------- -- xi : double array -- eta : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p x e s -- - - - - - - - - - -- -- In the tangent plane projection, given celestial spherical -- coordinates for a star and the tangent point, solve for the star's -- rectangular coordinates in the tangent plane. -- -- Given: -- a,b double star's spherical coordinates -- a0,b0 double tangent point's spherical coordinates -- -- Returned: -- *xi,*eta double rectangular coordinates of star image (Note 2) -- -- Returned (function value): -- int status: 0 = OK -- 1 = star too far from axis -- 2 = antistar on tangent plane -- 3 = antistar too far from axis -- -- Notes: -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the spherical coordinates are observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". For right-handed spherical coordinates, -- (xi,eta) are also right-handed. The units of (xi,eta) are, -- effectively, radians at the tangent point. -- -- 3) All angular arguments are in radians. -- -- 4) This function is a member of the following set: -- -- spherical vector solve for -- -- > eraTpxes < eraTpxev xi,eta -- eraTpsts eraTpstv star -- eraTpors eraTporv origin -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- xi, eta, c_retval = ufunc.tpxes(a, b, a0, b0) -- check_errwarn(c_retval, 'tpxes') -- return xi, eta -- -- --STATUS_CODES['tpxes'] = {0: 'OK', 1: 'star too far from axis', 2: 'antistar on tangent plane', 3: 'antistar too far from axis'} -- -- --def tpxev(v, v0): -- """ -- Wrapper for ERFA function ``eraTpxev``. -- -- Parameters -- ---------- -- v : double array -- v0 : double array -- -- Returns -- ------- -- xi : double array -- eta : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T p x e v -- - - - - - - - - - -- -- In the tangent plane projection, given celestial direction cosines -- for a star and the tangent point, solve for the star's rectangular -- coordinates in the tangent plane. -- -- Given: -- v double[3] direction cosines of star (Note 4) -- v0 double[3] direction cosines of tangent point (Note 4) -- -- Returned: -- *xi,*eta double tangent plane coordinates of star -- -- Returned (function value): -- int status: 0 = OK -- 1 = star too far from axis -- 2 = antistar on tangent plane -- 3 = antistar too far from axis -- -- Notes: -- -- 1) The tangent plane projection is also called the "gnomonic -- projection" and the "central projection". -- -- 2) The eta axis points due north in the adopted coordinate system. -- If the direction cosines represent observed (RA,Dec), the tangent -- plane coordinates (xi,eta) are conventionally called the -- "standard coordinates". If the direction cosines are with -- respect to a right-handed triad, (xi,eta) are also right-handed. -- The units of (xi,eta) are, effectively, radians at the tangent -- point. -- -- 3) The method used is to extend the star vector to the tangent -- plane and then rotate the triad so that (x,y) becomes (xi,eta). -- Writing (a,b) for the celestial spherical coordinates of the -- star, the sequence of rotations is (a+pi/2) around the z-axis -- followed by (pi/2-b) around the x-axis. -- -- 4) If vector v0 is not of unit length, or if vector v is of zero -- length, the results will be wrong. -- -- 5) If v0 points at a pole, the returned (xi,eta) will be based on -- the arbitrary assumption that the longitude coordinate of the -- tangent point is zero. -- -- 6) This function is a member of the following set: -- -- spherical vector solve for -- -- eraTpxes > eraTpxev < xi,eta -- eraTpsts eraTpstv star -- eraTpors eraTporv origin -- -- References: -- -- Calabretta M.R. & Greisen, E.W., 2002, "Representations of -- celestial coordinates in FITS", Astron.Astrophys. 395, 1077 -- -- Green, R.M., "Spherical Astronomy", Cambridge University Press, -- 1987, Chapter 13. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- xi, eta, c_retval = ufunc.tpxev(v, v0) -- check_errwarn(c_retval, 'tpxev') -- return xi, eta -- -- --STATUS_CODES['tpxev'] = {0: 'OK', 1: 'star too far from axis', 2: 'antistar on tangent plane', 3: 'antistar too far from axis'} -- -- --def a2af(ndp, angle): -- """ -- Wrapper for ERFA function ``eraA2af``. -- -- Parameters -- ---------- -- ndp : int array -- angle : double array -- -- Returns -- ------- -- sign : char array -- idmsf : int array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A 2 a f -- - - - - - - - - -- -- Decompose radians into degrees, arcminutes, arcseconds, fraction. -- -- Given: -- ndp int resolution (Note 1) -- angle double angle in radians -- -- Returned: -- sign char '+' or '-' -- idmsf int[4] degrees, arcminutes, arcseconds, fraction -- -- Called: -- eraD2tf decompose days to hms -- -- Notes: -- -- 1) The argument ndp is interpreted as follows: -- -- ndp resolution -- : ...0000 00 00 -- -7 1000 00 00 -- -6 100 00 00 -- -5 10 00 00 -- -4 1 00 00 -- -3 0 10 00 -- -2 0 01 00 -- -1 0 00 10 -- 0 0 00 01 -- 1 0 00 00.1 -- 2 0 00 00.01 -- 3 0 00 00.001 -- : 0 00 00.000... -- -- 2) The largest positive useful value for ndp is determined by the -- size of angle, the format of doubles on the target platform, and -- the risk of overflowing idmsf[3]. On a typical platform, for -- angle up to 2pi, the available floating-point precision might -- correspond to ndp=12. However, the practical limit is typically -- ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is -- only 16 bits. -- -- 3) The absolute value of angle may exceed 2pi. In cases where it -- does not, it is up to the caller to test for and handle the -- case where angle is very nearly 2pi and rounds up to 360 degrees, -- by testing for idmsf[0]=360 and setting idmsf[0-3] to zero. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- sign, idmsf = ufunc.a2af(ndp, angle) -- sign = sign.view(dt_bytes1) -- return sign, idmsf -- -- --def a2tf(ndp, angle): -- """ -- Wrapper for ERFA function ``eraA2tf``. -- -- Parameters -- ---------- -- ndp : int array -- angle : double array -- -- Returns -- ------- -- sign : char array -- ihmsf : int array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A 2 t f -- - - - - - - - - -- -- Decompose radians into hours, minutes, seconds, fraction. -- -- Given: -- ndp int resolution (Note 1) -- angle double angle in radians -- -- Returned: -- sign char '+' or '-' -- ihmsf int[4] hours, minutes, seconds, fraction -- -- Called: -- eraD2tf decompose days to hms -- -- Notes: -- -- 1) The argument ndp is interpreted as follows: -- -- ndp resolution -- : ...0000 00 00 -- -7 1000 00 00 -- -6 100 00 00 -- -5 10 00 00 -- -4 1 00 00 -- -3 0 10 00 -- -2 0 01 00 -- -1 0 00 10 -- 0 0 00 01 -- 1 0 00 00.1 -- 2 0 00 00.01 -- 3 0 00 00.001 -- : 0 00 00.000... -- -- 2) The largest positive useful value for ndp is determined by the -- size of angle, the format of doubles on the target platform, and -- the risk of overflowing ihmsf[3]. On a typical platform, for -- angle up to 2pi, the available floating-point precision might -- correspond to ndp=12. However, the practical limit is typically -- ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is -- only 16 bits. -- -- 3) The absolute value of angle may exceed 2pi. In cases where it -- does not, it is up to the caller to test for and handle the -- case where angle is very nearly 2pi and rounds up to 24 hours, -- by testing for ihmsf[0]=24 and setting ihmsf[0-3] to zero. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- sign, ihmsf = ufunc.a2tf(ndp, angle) -- sign = sign.view(dt_bytes1) -- return sign, ihmsf -- -- --def af2a(s, ideg, iamin, asec): -- """ -- Wrapper for ERFA function ``eraAf2a``. -- -- Parameters -- ---------- -- s : char array -- ideg : int array -- iamin : int array -- asec : double array -- -- Returns -- ------- -- rad : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A f 2 a -- - - - - - - - - -- -- Convert degrees, arcminutes, arcseconds to radians. -- -- Given: -- s char sign: '-' = negative, otherwise positive -- ideg int degrees -- iamin int arcminutes -- asec double arcseconds -- -- Returned: -- rad double angle in radians -- -- Returned (function value): -- int status: 0 = OK -- 1 = ideg outside range 0-359 -- 2 = iamin outside range 0-59 -- 3 = asec outside range 0-59.999... -- -- Notes: -- -- 1) The result is computed even if any of the range checks fail. -- -- 2) Negative ideg, iamin and/or asec produce a warning status, but -- the absolute value is used in the conversion. -- -- 3) If there are multiple errors, the status value reflects only the -- first, the smallest taking precedence. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rad, c_retval = ufunc.af2a(s, ideg, iamin, asec) -- check_errwarn(c_retval, 'af2a') -- return rad -- -- --STATUS_CODES['af2a'] = {0: 'OK', 1: 'ideg outside range 0-359', 2: 'iamin outside range 0-59', 3: 'asec outside range 0-59.999...'} -- -- --def anp(a): -- """ -- Wrapper for ERFA function ``eraAnp``. -- -- Parameters -- ---------- -- a : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a A n p -- - - - - - - - -- -- Normalize angle into the range 0 <= a < 2pi. -- -- Given: -- a double angle (radians) -- -- Returned (function value): -- double angle in range 0-2pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.anp(a) -- return c_retval -- -- --def anpm(a): -- """ -- Wrapper for ERFA function ``eraAnpm``. -- -- Parameters -- ---------- -- a : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a A n p m -- - - - - - - - - -- -- Normalize angle into the range -pi <= a < +pi. -- -- Given: -- a double angle (radians) -- -- Returned (function value): -- double angle in range +/-pi -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.anpm(a) -- return c_retval -- -- --def d2tf(ndp, days): -- """ -- Wrapper for ERFA function ``eraD2tf``. -- -- Parameters -- ---------- -- ndp : int array -- days : double array -- -- Returns -- ------- -- sign : char array -- ihmsf : int array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a D 2 t f -- - - - - - - - - -- -- Decompose days to hours, minutes, seconds, fraction. -- -- Given: -- ndp int resolution (Note 1) -- days double interval in days -- -- Returned: -- sign char '+' or '-' -- ihmsf int[4] hours, minutes, seconds, fraction -- -- Notes: -- -- 1) The argument ndp is interpreted as follows: -- -- ndp resolution -- : ...0000 00 00 -- -7 1000 00 00 -- -6 100 00 00 -- -5 10 00 00 -- -4 1 00 00 -- -3 0 10 00 -- -2 0 01 00 -- -1 0 00 10 -- 0 0 00 01 -- 1 0 00 00.1 -- 2 0 00 00.01 -- 3 0 00 00.001 -- : 0 00 00.000... -- -- 2) The largest positive useful value for ndp is determined by the -- size of days, the format of double on the target platform, and -- the risk of overflowing ihmsf[3]. On a typical platform, for -- days up to 1.0, the available floating-point precision might -- correspond to ndp=12. However, the practical limit is typically -- ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is -- only 16 bits. -- -- 3) The absolute value of days may exceed 1.0. In cases where it -- does not, it is up to the caller to test for and handle the -- case where days is very nearly 1.0 and rounds up to 24 hours, -- by testing for ihmsf[0]=24 and setting ihmsf[0-3] to zero. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- sign, ihmsf = ufunc.d2tf(ndp, days) -- sign = sign.view(dt_bytes1) -- return sign, ihmsf -- -- --def tf2a(s, ihour, imin, sec): -- """ -- Wrapper for ERFA function ``eraTf2a``. -- -- Parameters -- ---------- -- s : char array -- ihour : int array -- imin : int array -- sec : double array -- -- Returns -- ------- -- rad : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a T f 2 a -- - - - - - - - - -- -- Convert hours, minutes, seconds to radians. -- -- Given: -- s char sign: '-' = negative, otherwise positive -- ihour int hours -- imin int minutes -- sec double seconds -- -- Returned: -- rad double angle in radians -- -- Returned (function value): -- int status: 0 = OK -- 1 = ihour outside range 0-23 -- 2 = imin outside range 0-59 -- 3 = sec outside range 0-59.999... -- -- Notes: -- -- 1) The result is computed even if any of the range checks fail. -- -- 2) Negative ihour, imin and/or sec produce a warning status, but -- the absolute value is used in the conversion. -- -- 3) If there are multiple errors, the status value reflects only the -- first, the smallest taking precedence. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rad, c_retval = ufunc.tf2a(s, ihour, imin, sec) -- check_errwarn(c_retval, 'tf2a') -- return rad -- -- --STATUS_CODES['tf2a'] = {0: 'OK', 1: 'ihour outside range 0-23', 2: 'imin outside range 0-59', 3: 'sec outside range 0-59.999...'} -- -- --def tf2d(s, ihour, imin, sec): -- """ -- Wrapper for ERFA function ``eraTf2d``. -- -- Parameters -- ---------- -- s : char array -- ihour : int array -- imin : int array -- sec : double array -- -- Returns -- ------- -- days : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a T f 2 d -- - - - - - - - - -- -- Convert hours, minutes, seconds to days. -- -- Given: -- s char sign: '-' = negative, otherwise positive -- ihour int hours -- imin int minutes -- sec double seconds -- -- Returned: -- days double interval in days -- -- Returned (function value): -- int status: 0 = OK -- 1 = ihour outside range 0-23 -- 2 = imin outside range 0-59 -- 3 = sec outside range 0-59.999... -- -- Notes: -- -- 1) The result is computed even if any of the range checks fail. -- -- 2) Negative ihour, imin and/or sec produce a warning status, but -- the absolute value is used in the conversion. -- -- 3) If there are multiple errors, the status value reflects only the -- first, the smallest taking precedence. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- days, c_retval = ufunc.tf2d(s, ihour, imin, sec) -- check_errwarn(c_retval, 'tf2d') -- return days -- -- --STATUS_CODES['tf2d'] = {0: 'OK', 1: 'ihour outside range 0-23', 2: 'imin outside range 0-59', 3: 'sec outside range 0-59.999...'} -- -- --def rx(phi, r): -- """ -- Wrapper for ERFA function ``eraRx``. -- -- Parameters -- ---------- -- phi : double array -- r : double array -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. Note that, unlike the erfa routine, -- the python wrapper does not change r in-place. -- -- - - - - - - -- e r a R x -- - - - - - - -- -- Rotate an r-matrix about the x-axis. -- -- Given: -- phi double angle (radians) -- -- Given and returned: -- r double[3][3] r-matrix, rotated -- -- Notes: -- -- 1) Calling this function with positive phi incorporates in the -- supplied r-matrix r an additional rotation, about the x-axis, -- anticlockwise as seen looking towards the origin from positive x. -- -- 2) The additional rotation can be represented by this matrix: -- -- ( 1 0 0 ) -- ( ) -- ( 0 + cos(phi) + sin(phi) ) -- ( ) -- ( 0 - sin(phi) + cos(phi) ) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.rx(phi, r) -- return r -- -- --def ry(theta, r): -- """ -- Wrapper for ERFA function ``eraRy``. -- -- Parameters -- ---------- -- theta : double array -- r : double array -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. Note that, unlike the erfa routine, -- the python wrapper does not change r in-place. -- -- - - - - - - -- e r a R y -- - - - - - - -- -- Rotate an r-matrix about the y-axis. -- -- Given: -- theta double angle (radians) -- -- Given and returned: -- r double[3][3] r-matrix, rotated -- -- Notes: -- -- 1) Calling this function with positive theta incorporates in the -- supplied r-matrix r an additional rotation, about the y-axis, -- anticlockwise as seen looking towards the origin from positive y. -- -- 2) The additional rotation can be represented by this matrix: -- -- ( + cos(theta) 0 - sin(theta) ) -- ( ) -- ( 0 1 0 ) -- ( ) -- ( + sin(theta) 0 + cos(theta) ) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.ry(theta, r) -- return r -- -- --def rz(psi, r): -- """ -- Wrapper for ERFA function ``eraRz``. -- -- Parameters -- ---------- -- psi : double array -- r : double array -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. Note that, unlike the erfa routine, -- the python wrapper does not change r in-place. -- -- - - - - - - -- e r a R z -- - - - - - - -- -- Rotate an r-matrix about the z-axis. -- -- Given: -- psi double angle (radians) -- -- Given and returned: -- r double[3][3] r-matrix, rotated -- -- Notes: -- -- 1) Calling this function with positive psi incorporates in the -- supplied r-matrix r an additional rotation, about the z-axis, -- anticlockwise as seen looking towards the origin from positive z. -- -- 2) The additional rotation can be represented by this matrix: -- -- ( + cos(psi) + sin(psi) 0 ) -- ( ) -- ( - sin(psi) + cos(psi) 0 ) -- ( ) -- ( 0 0 1 ) -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.rz(psi, r) -- return r -- -- --def cp(p): -- """ -- Wrapper for ERFA function ``eraCp``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- c : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a C p -- - - - - - - -- -- Copy a p-vector. -- -- Given: -- p double[3] p-vector to be copied -- -- Returned: -- c double[3] copy -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c = ufunc.cp(p) -- return c -- -- --def cpv(pv): -- """ -- Wrapper for ERFA function ``eraCpv``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- c : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a C p v -- - - - - - - - -- -- Copy a position/velocity vector. -- -- Given: -- pv double[2][3] position/velocity vector to be copied -- -- Returned: -- c double[2][3] copy -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c = ufunc.cpv(pv) -- return c -- -- --def cr(r): -- """ -- Wrapper for ERFA function ``eraCr``. -- -- Parameters -- ---------- -- r : double array -- -- Returns -- ------- -- c : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a C r -- - - - - - - -- -- Copy an r-matrix. -- -- Given: -- r double[3][3] r-matrix to be copied -- -- Returned: -- c double[3][3] copy -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c = ufunc.cr(r) -- return c -- -- --def p2pv(p): -- """ -- Wrapper for ERFA function ``eraP2pv``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P 2 p v -- - - - - - - - - -- -- Extend a p-vector to a pv-vector by appending a zero velocity. -- -- Given: -- p double[3] p-vector -- -- Returned: -- pv double[2][3] pv-vector -- -- Called: -- eraCp copy p-vector -- eraZp zero p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv = ufunc.p2pv(p) -- return pv -- -- --def pv2p(pv): -- """ -- Wrapper for ERFA function ``eraPv2p``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- p : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P v 2 p -- - - - - - - - - -- -- Discard velocity component of a pv-vector. -- -- Given: -- pv double[2][3] pv-vector -- -- Returned: -- p double[3] p-vector -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p = ufunc.pv2p(pv) -- return p -- -- --def ir(): -- """ -- Wrapper for ERFA function ``eraIr``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a I r -- - - - - - - -- -- Initialize an r-matrix to the identity matrix. -- -- Returned: -- r double[3][3] r-matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.ir() -- return r -- -- --def zp(): -- """ -- Wrapper for ERFA function ``eraZp``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- p : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a Z p -- - - - - - - -- -- Zero a p-vector. -- -- Returned: -- p double[3] p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p = ufunc.zp() -- return p -- -- --def zpv(): -- """ -- Wrapper for ERFA function ``eraZpv``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a Z p v -- - - - - - - - -- -- Zero a pv-vector. -- -- Returned: -- pv double[2][3] pv-vector -- -- Called: -- eraZp zero p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv = ufunc.zpv() -- return pv -- -- --def zr(): -- """ -- Wrapper for ERFA function ``eraZr``. -- -- Parameters -- ---------- -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a Z r -- - - - - - - -- -- Initialize an r-matrix to the null matrix. -- -- Returned: -- r double[3][3] r-matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.zr() -- return r -- -- --def rxr(a, b): -- """ -- Wrapper for ERFA function ``eraRxr``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- atb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a R x r -- - - - - - - - -- -- Multiply two r-matrices. -- -- Given: -- a double[3][3] first r-matrix -- b double[3][3] second r-matrix -- -- Returned: -- atb double[3][3] a * b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Called: -- eraCr copy r-matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- atb = ufunc.rxr(a, b) -- return atb -- -- --def tr(r): -- """ -- Wrapper for ERFA function ``eraTr``. -- -- Parameters -- ---------- -- r : double array -- -- Returns -- ------- -- rt : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a T r -- - - - - - - -- -- Transpose an r-matrix. -- -- Given: -- r double[3][3] r-matrix -- -- Returned: -- rt double[3][3] transpose -- -- Note: -- It is permissible for r and rt to be the same array. -- -- Called: -- eraCr copy r-matrix -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rt = ufunc.tr(r) -- return rt -- -- --def rxp(r, p): -- """ -- Wrapper for ERFA function ``eraRxp``. -- -- Parameters -- ---------- -- r : double array -- p : double array -- -- Returns -- ------- -- rp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a R x p -- - - - - - - - -- -- Multiply a p-vector by an r-matrix. -- -- Given: -- r double[3][3] r-matrix -- p double[3] p-vector -- -- Returned: -- rp double[3] r * p -- -- Note: -- It is permissible for p and rp to be the same array. -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rp = ufunc.rxp(r, p) -- return rp -- -- --def rxpv(r, pv): -- """ -- Wrapper for ERFA function ``eraRxpv``. -- -- Parameters -- ---------- -- r : double array -- pv : double array -- -- Returns -- ------- -- rpv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a R x p v -- - - - - - - - - -- -- Multiply a pv-vector by an r-matrix. -- -- Given: -- r double[3][3] r-matrix -- pv double[2][3] pv-vector -- -- Returned: -- rpv double[2][3] r * pv -- -- Note: -- It is permissible for pv and rpv to be the same array. -- -- Called: -- eraRxp product of r-matrix and p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- rpv = ufunc.rxpv(r, pv) -- return rpv -- -- --def trxp(r, p): -- """ -- Wrapper for ERFA function ``eraTrxp``. -- -- Parameters -- ---------- -- r : double array -- p : double array -- -- Returns -- ------- -- trp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a T r x p -- - - - - - - - - -- -- Multiply a p-vector by the transpose of an r-matrix. -- -- Given: -- r double[3][3] r-matrix -- p double[3] p-vector -- -- Returned: -- trp double[3] r * p -- -- Note: -- It is permissible for p and trp to be the same array. -- -- Called: -- eraTr transpose r-matrix -- eraRxp product of r-matrix and p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- trp = ufunc.trxp(r, p) -- return trp -- -- --def trxpv(r, pv): -- """ -- Wrapper for ERFA function ``eraTrxpv``. -- -- Parameters -- ---------- -- r : double array -- pv : double array -- -- Returns -- ------- -- trpv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a T r x p v -- - - - - - - - - - -- -- Multiply a pv-vector by the transpose of an r-matrix. -- -- Given: -- r double[3][3] r-matrix -- pv double[2][3] pv-vector -- -- Returned: -- trpv double[2][3] r * pv -- -- Note: -- It is permissible for pv and trpv to be the same array. -- -- Called: -- eraTr transpose r-matrix -- eraRxpv product of r-matrix and pv-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- trpv = ufunc.trxpv(r, pv) -- return trpv -- -- --def rm2v(r): -- """ -- Wrapper for ERFA function ``eraRm2v``. -- -- Parameters -- ---------- -- r : double array -- -- Returns -- ------- -- w : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a R m 2 v -- - - - - - - - - -- -- Express an r-matrix as an r-vector. -- -- Given: -- r double[3][3] rotation matrix -- -- Returned: -- w double[3] rotation vector (Note 1) -- -- Notes: -- -- 1) A rotation matrix describes a rotation through some angle about -- some arbitrary axis called the Euler axis. The "rotation vector" -- returned by this function has the same direction as the Euler axis, -- and its magnitude is the angle in radians. (The magnitude and -- direction can be separated by means of the function eraPn.) -- -- 2) If r is null, so is the result. If r is not a rotation matrix -- the result is undefined; r must be proper (i.e. have a positive -- determinant) and real orthogonal (inverse = transpose). -- -- 3) The reference frame rotates clockwise as seen looking along -- the rotation vector from the origin. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- w = ufunc.rm2v(r) -- return w -- -- --def rv2m(w): -- """ -- Wrapper for ERFA function ``eraRv2m``. -- -- Parameters -- ---------- -- w : double array -- -- Returns -- ------- -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a R v 2 m -- - - - - - - - - -- -- Form the r-matrix corresponding to a given r-vector. -- -- Given: -- w double[3] rotation vector (Note 1) -- -- Returned: -- r double[3][3] rotation matrix -- -- Notes: -- -- 1) A rotation matrix describes a rotation through some angle about -- some arbitrary axis called the Euler axis. The "rotation vector" -- supplied to This function has the same direction as the Euler -- axis, and its magnitude is the angle in radians. -- -- 2) If w is null, the unit matrix is returned. -- -- 3) The reference frame rotates clockwise as seen looking along the -- rotation vector from the origin. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r = ufunc.rv2m(w) -- return r -- -- --def pap(a, b): -- """ -- Wrapper for ERFA function ``eraPap``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P a p -- - - - - - - - -- -- Position-angle from two p-vectors. -- -- Given: -- a double[3] direction of reference point -- b double[3] direction of point whose PA is required -- -- Returned (function value): -- double position angle of b with respect to a (radians) -- -- Notes: -- -- 1) The result is the position angle, in radians, of direction b with -- respect to direction a. It is in the range -pi to +pi. The -- sense is such that if b is a small distance "north" of a the -- position angle is approximately zero, and if b is a small -- distance "east" of a the position angle is approximately +pi/2. -- -- 2) The vectors a and b need not be of unit length. -- -- 3) Zero is returned if the two directions are the same or if either -- vector is null. -- -- 4) If vector a is at a pole, the result is ill-defined. -- -- Called: -- eraPn decompose p-vector into modulus and direction -- eraPm modulus of p-vector -- eraPxp vector product of two p-vectors -- eraPmp p-vector minus p-vector -- eraPdp scalar product of two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.pap(a, b) -- return c_retval -- -- --def pas(al, ap, bl, bp): -- """ -- Wrapper for ERFA function ``eraPas``. -- -- Parameters -- ---------- -- al : double array -- ap : double array -- bl : double array -- bp : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P a s -- - - - - - - - -- -- Position-angle from spherical coordinates. -- -- Given: -- al double longitude of point A (e.g. RA) in radians -- ap double latitude of point A (e.g. Dec) in radians -- bl double longitude of point B -- bp double latitude of point B -- -- Returned (function value): -- double position angle of B with respect to A -- -- Notes: -- -- 1) The result is the bearing (position angle), in radians, of point -- B with respect to point A. It is in the range -pi to +pi. The -- sense is such that if B is a small distance "east" of point A, -- the bearing is approximately +pi/2. -- -- 2) Zero is returned if the two points are coincident. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.pas(al, ap, bl, bp) -- return c_retval -- -- --def sepp(a, b): -- """ -- Wrapper for ERFA function ``eraSepp``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S e p p -- - - - - - - - - -- -- Angular separation between two p-vectors. -- -- Given: -- a double[3] first p-vector (not necessarily unit length) -- b double[3] second p-vector (not necessarily unit length) -- -- Returned (function value): -- double angular separation (radians, always positive) -- -- Notes: -- -- 1) If either vector is null, a zero result is returned. -- -- 2) The angular separation is most simply formulated in terms of -- scalar product. However, this gives poor accuracy for angles -- near zero and pi. The present algorithm uses both cross product -- and dot product, to deliver full accuracy whatever the size of -- the angle. -- -- Called: -- eraPxp vector product of two p-vectors -- eraPm modulus of p-vector -- eraPdp scalar product of two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.sepp(a, b) -- return c_retval -- -- --def seps(al, ap, bl, bp): -- """ -- Wrapper for ERFA function ``eraSeps``. -- -- Parameters -- ---------- -- al : double array -- ap : double array -- bl : double array -- bp : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S e p s -- - - - - - - - - -- -- Angular separation between two sets of spherical coordinates. -- -- Given: -- al double first longitude (radians) -- ap double first latitude (radians) -- bl double second longitude (radians) -- bp double second latitude (radians) -- -- Returned (function value): -- double angular separation (radians) -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraSepp angular separation between two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.seps(al, ap, bl, bp) -- return c_retval -- -- --def c2s(p): -- """ -- Wrapper for ERFA function ``eraC2s``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- theta : double array -- phi : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a C 2 s -- - - - - - - - -- -- P-vector to spherical coordinates. -- -- Given: -- p double[3] p-vector -- -- Returned: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- -- Notes: -- -- 1) The vector p can have any magnitude; only its direction is used. -- -- 2) If p is null, zero theta and phi are returned. -- -- 3) At either pole, zero theta is returned. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- theta, phi = ufunc.c2s(p) -- return theta, phi -- -- --def p2s(p): -- """ -- Wrapper for ERFA function ``eraP2s``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- theta : double array -- phi : double array -- r : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P 2 s -- - - - - - - - -- -- P-vector to spherical polar coordinates. -- -- Given: -- p double[3] p-vector -- -- Returned: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- r double radial distance -- -- Notes: -- -- 1) If P is null, zero theta, phi and r are returned. -- -- 2) At either pole, zero theta is returned. -- -- Called: -- eraC2s p-vector to spherical -- eraPm modulus of p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- theta, phi, r = ufunc.p2s(p) -- return theta, phi, r -- -- --def pv2s(pv): -- """ -- Wrapper for ERFA function ``eraPv2s``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- theta : double array -- phi : double array -- r : double array -- td : double array -- pd : double array -- rd : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P v 2 s -- - - - - - - - - -- -- Convert position/velocity from Cartesian to spherical coordinates. -- -- Given: -- pv double[2][3] pv-vector -- -- Returned: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- r double radial distance -- td double rate of change of theta -- pd double rate of change of phi -- rd double rate of change of r -- -- Notes: -- -- 1) If the position part of pv is null, theta, phi, td and pd -- are indeterminate. This is handled by extrapolating the -- position through unit time by using the velocity part of -- pv. This moves the origin without changing the direction -- of the velocity component. If the position and velocity -- components of pv are both null, zeroes are returned for all -- six results. -- -- 2) If the position is a pole, theta, td and pd are indeterminate. -- In such cases zeroes are returned for all three. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- theta, phi, r, td, pd, rd = ufunc.pv2s(pv) -- return theta, phi, r, td, pd, rd -- -- --def s2c(theta, phi): -- """ -- Wrapper for ERFA function ``eraS2c``. -- -- Parameters -- ---------- -- theta : double array -- phi : double array -- -- Returns -- ------- -- c : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a S 2 c -- - - - - - - - -- -- Convert spherical coordinates to Cartesian. -- -- Given: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- -- Returned: -- c double[3] direction cosines -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c = ufunc.s2c(theta, phi) -- return c -- -- --def s2p(theta, phi, r): -- """ -- Wrapper for ERFA function ``eraS2p``. -- -- Parameters -- ---------- -- theta : double array -- phi : double array -- r : double array -- -- Returns -- ------- -- p : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a S 2 p -- - - - - - - - -- -- Convert spherical polar coordinates to p-vector. -- -- Given: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- r double radial distance -- -- Returned: -- p double[3] Cartesian coordinates -- -- Called: -- eraS2c spherical coordinates to unit vector -- eraSxp multiply p-vector by scalar -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p = ufunc.s2p(theta, phi, r) -- return p -- -- --def s2pv(theta, phi, r, td, pd, rd): -- """ -- Wrapper for ERFA function ``eraS2pv``. -- -- Parameters -- ---------- -- theta : double array -- phi : double array -- r : double array -- td : double array -- pd : double array -- rd : double array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S 2 p v -- - - - - - - - - -- -- Convert position/velocity from spherical to Cartesian coordinates. -- -- Given: -- theta double longitude angle (radians) -- phi double latitude angle (radians) -- r double radial distance -- td double rate of change of theta -- pd double rate of change of phi -- rd double rate of change of r -- -- Returned: -- pv double[2][3] pv-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv = ufunc.s2pv(theta, phi, r, td, pd, rd) -- return pv -- -- --def pdp(a, b): -- """ -- Wrapper for ERFA function ``eraPdp``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P d p -- - - - - - - - -- -- p-vector inner (=scalar=dot) product. -- -- Given: -- a double[3] first p-vector -- b double[3] second p-vector -- -- Returned (function value): -- double a . b -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.pdp(a, b) -- return c_retval -- -- --def pm(p): -- """ -- Wrapper for ERFA function ``eraPm``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- c_retval : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a P m -- - - - - - - -- -- Modulus of p-vector. -- -- Given: -- p double[3] p-vector -- -- Returned (function value): -- double modulus -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- c_retval = ufunc.pm(p) -- return c_retval -- -- --def pmp(a, b): -- """ -- Wrapper for ERFA function ``eraPmp``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- amb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P m p -- - - - - - - - -- -- P-vector subtraction. -- -- Given: -- a double[3] first p-vector -- b double[3] second p-vector -- -- Returned: -- amb double[3] a - b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- amb = ufunc.pmp(a, b) -- return amb -- -- --def pn(p): -- """ -- Wrapper for ERFA function ``eraPn``. -- -- Parameters -- ---------- -- p : double array -- -- Returns -- ------- -- r : double array -- u : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - -- e r a P n -- - - - - - - -- -- Convert a p-vector into modulus and unit vector. -- -- Given: -- p double[3] p-vector -- -- Returned: -- r double modulus -- u double[3] unit vector -- -- Notes: -- -- 1) If p is null, the result is null. Otherwise the result is a unit -- vector. -- -- 2) It is permissible to re-use the same array for any of the -- arguments. -- -- Called: -- eraPm modulus of p-vector -- eraZp zero p-vector -- eraSxp multiply p-vector by scalar -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r, u = ufunc.pn(p) -- return r, u -- -- --def ppp(a, b): -- """ -- Wrapper for ERFA function ``eraPpp``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- apb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P p p -- - - - - - - - -- -- P-vector addition. -- -- Given: -- a double[3] first p-vector -- b double[3] second p-vector -- -- Returned: -- apb double[3] a + b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- apb = ufunc.ppp(a, b) -- return apb -- -- --def ppsp(a, s, b): -- """ -- Wrapper for ERFA function ``eraPpsp``. -- -- Parameters -- ---------- -- a : double array -- s : double array -- b : double array -- -- Returns -- ------- -- apsb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P p s p -- - - - - - - - - -- -- P-vector plus scaled p-vector. -- -- Given: -- a double[3] first p-vector -- s double scalar (multiplier for b) -- b double[3] second p-vector -- -- Returned: -- apsb double[3] a + s*b -- -- Note: -- It is permissible for any of a, b and apsb to be the same array. -- -- Called: -- eraSxp multiply p-vector by scalar -- eraPpp p-vector plus p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- apsb = ufunc.ppsp(a, s, b) -- return apsb -- -- --def pvdpv(a, b): -- """ -- Wrapper for ERFA function ``eraPvdpv``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- adb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v d p v -- - - - - - - - - - -- -- Inner (=scalar=dot) product of two pv-vectors. -- -- Given: -- a double[2][3] first pv-vector -- b double[2][3] second pv-vector -- -- Returned: -- adb double[2] a . b (see note) -- -- Note: -- -- If the position and velocity components of the two pv-vectors are -- ( ap, av ) and ( bp, bv ), the result, a . b, is the pair of -- numbers ( ap . bp , ap . bv + av . bp ). The two numbers are the -- dot-product of the two p-vectors and its derivative. -- -- Called: -- eraPdp scalar product of two p-vectors -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- adb = ufunc.pvdpv(a, b) -- return adb -- -- --def pvm(pv): -- """ -- Wrapper for ERFA function ``eraPvm``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- r : double array -- s : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P v m -- - - - - - - - -- -- Modulus of pv-vector. -- -- Given: -- pv double[2][3] pv-vector -- -- Returned: -- r double modulus of position component -- s double modulus of velocity component -- -- Called: -- eraPm modulus of p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- r, s = ufunc.pvm(pv) -- return r, s -- -- --def pvmpv(a, b): -- """ -- Wrapper for ERFA function ``eraPvmpv``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- amb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v m p v -- - - - - - - - - - -- -- Subtract one pv-vector from another. -- -- Given: -- a double[2][3] first pv-vector -- b double[2][3] second pv-vector -- -- Returned: -- amb double[2][3] a - b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Called: -- eraPmp p-vector minus p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- amb = ufunc.pvmpv(a, b) -- return amb -- -- --def pvppv(a, b): -- """ -- Wrapper for ERFA function ``eraPvppv``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- apb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v p p v -- - - - - - - - - - -- -- Add one pv-vector to another. -- -- Given: -- a double[2][3] first pv-vector -- b double[2][3] second pv-vector -- -- Returned: -- apb double[2][3] a + b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Called: -- eraPpp p-vector plus p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- apb = ufunc.pvppv(a, b) -- return apb -- -- --def pvu(dt, pv): -- """ -- Wrapper for ERFA function ``eraPvu``. -- -- Parameters -- ---------- -- dt : double array -- pv : double array -- -- Returns -- ------- -- upv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P v u -- - - - - - - - -- -- Update a pv-vector. -- -- Given: -- dt double time interval -- pv double[2][3] pv-vector -- -- Returned: -- upv double[2][3] p updated, v unchanged -- -- Notes: -- -- 1) "Update" means "refer the position component of the vector -- to a new date dt time units from the existing date". -- -- 2) The time units of dt must match those of the velocity. -- -- 3) It is permissible for pv and upv to be the same array. -- -- Called: -- eraPpsp p-vector plus scaled p-vector -- eraCp copy p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- upv = ufunc.pvu(dt, pv) -- return upv -- -- --def pvup(dt, pv): -- """ -- Wrapper for ERFA function ``eraPvup``. -- -- Parameters -- ---------- -- dt : double array -- pv : double array -- -- Returns -- ------- -- p : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a P v u p -- - - - - - - - - -- -- Update a pv-vector, discarding the velocity component. -- -- Given: -- dt double time interval -- pv double[2][3] pv-vector -- -- Returned: -- p double[3] p-vector -- -- Notes: -- -- 1) "Update" means "refer the position component of the vector to a -- new date dt time units from the existing date". -- -- 2) The time units of dt must match those of the velocity. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p = ufunc.pvup(dt, pv) -- return p -- -- --def pvxpv(a, b): -- """ -- Wrapper for ERFA function ``eraPvxpv``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- axb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v x p v -- - - - - - - - - - -- -- Outer (=vector=cross) product of two pv-vectors. -- -- Given: -- a double[2][3] first pv-vector -- b double[2][3] second pv-vector -- -- Returned: -- axb double[2][3] a x b -- -- Notes: -- -- 1) If the position and velocity components of the two pv-vectors are -- ( ap, av ) and ( bp, bv ), the result, a x b, is the pair of -- vectors ( ap x bp, ap x bv + av x bp ). The two vectors are the -- cross-product of the two p-vectors and its derivative. -- -- 2) It is permissible to re-use the same array for any of the -- arguments. -- -- Called: -- eraCpv copy pv-vector -- eraPxp vector product of two p-vectors -- eraPpp p-vector plus p-vector -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- axb = ufunc.pvxpv(a, b) -- return axb -- -- --def pxp(a, b): -- """ -- Wrapper for ERFA function ``eraPxp``. -- -- Parameters -- ---------- -- a : double array -- b : double array -- -- Returns -- ------- -- axb : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a P x p -- - - - - - - - -- -- p-vector outer (=vector=cross) product. -- -- Given: -- a double[3] first p-vector -- b double[3] second p-vector -- -- Returned: -- axb double[3] a x b -- -- Note: -- It is permissible to re-use the same array for any of the -- arguments. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- axb = ufunc.pxp(a, b) -- return axb -- -- --def s2xpv(s1, s2, pv): -- """ -- Wrapper for ERFA function ``eraS2xpv``. -- -- Parameters -- ---------- -- s1 : double array -- s2 : double array -- pv : double array -- -- Returns -- ------- -- spv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a S 2 x p v -- - - - - - - - - - -- -- Multiply a pv-vector by two scalars. -- -- Given: -- s1 double scalar to multiply position component by -- s2 double scalar to multiply velocity component by -- pv double[2][3] pv-vector -- -- Returned: -- spv double[2][3] pv-vector: p scaled by s1, v scaled by s2 -- -- Note: -- It is permissible for pv and spv to be the same array. -- -- Called: -- eraSxp multiply p-vector by scalar -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- spv = ufunc.s2xpv(s1, s2, pv) -- return spv -- -- --def sxp(s, p): -- """ -- Wrapper for ERFA function ``eraSxp``. -- -- Parameters -- ---------- -- s : double array -- p : double array -- -- Returns -- ------- -- sp : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - -- e r a S x p -- - - - - - - - -- -- Multiply a p-vector by a scalar. -- -- Given: -- s double scalar -- p double[3] p-vector -- -- Returned: -- sp double[3] s * p -- -- Note: -- It is permissible for p and sp to be the same array. -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- sp = ufunc.sxp(s, p) -- return sp -- -- --def sxpv(s, pv): -- """ -- Wrapper for ERFA function ``eraSxpv``. -- -- Parameters -- ---------- -- s : double array -- pv : double array -- -- Returns -- ------- -- spv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - -- e r a S x p v -- - - - - - - - - -- -- Multiply a pv-vector by a scalar. -- -- Given: -- s double scalar -- pv double[2][3] pv-vector -- -- Returned: -- spv double[2][3] s * pv -- -- Note: -- It is permissible for pv and spv to be the same array -- -- Called: -- eraS2xpv multiply pv-vector by two scalars -- -- Copyright (C) 2013-2019, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- spv = ufunc.sxpv(s, pv) -- return spv -- -- --def pav2pv(p, v): -- """ -- Wrapper for ERFA function ``eraPav2pv``. -- -- Parameters -- ---------- -- p : double array -- v : double array -- -- Returns -- ------- -- pv : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - - -- e r a P a v 2 p v -- - - - - - - - - - - -- -- Extend a p-vector to a pv-vector by appending a zero velocity. -- -- Given: -- p double[3] p-vector -- v double[3] v-vector -- -- Returned: -- pv double[2][3] pv-vector -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2017, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- pv = ufunc.pav2pv(p, v) -- return pv -- -- --def pv2pav(pv): -- """ -- Wrapper for ERFA function ``eraPv2pav``. -- -- Parameters -- ---------- -- pv : double array -- -- Returns -- ------- -- p : double array -- v : double array -- -- Notes -- ----- -- The ERFA documentation is below. -- -- - - - - - - - - - -- e r a P v 2 p a v -- - - - - - - - - - -- -- Extend a p-vector to a pv-vector by appending a zero velocity. -- -- Given: -- pv double[2][3] pv-vector -- -- Returned: -- p double[3] p-vector -- v double[3] v-vector -- -- Called: -- eraCp copy p-vector -- -- Copyright (C) 2013-2017, NumFOCUS Foundation. -- Derived, with permission, from the SOFA library. See notes at end of file. -- -- """ -- p, v = ufunc.pv2pav(pv) -- return p, v -- -- --# TODO: delete the functions below when they can get auto-generated --# (current machinery doesn't support returning strings or non-status-codes) --def version(): -- """ -- Returns the package version -- as defined in configure.ac -- in string format -- """ -- return "1.6.0" -- -- --def version_major(): -- """ -- Returns the package major version -- as defined in configure.ac -- as integer -- """ -- return 1 -- -- --def version_minor(): -- """ -- Returns the package minor version -- as defined in configure.ac -- as integer -- """ -- return 6 -- -- --def version_micro(): -- """ -- Returns the package micro version -- as defined in configure.ac -- as integer -- """ -- return 0 -- -- --def sofa_version(): -- """ -- Returns the corresponding SOFA version -- as defined in configure.ac -- in string format -- """ -- return "20190722" -\ No newline at end of file -Index: astropy-4.1/astropy/_erfa/ufunc.c -=================================================================== ---- astropy-4.1.orig/astropy/_erfa/ufunc.c -+++ /dev/null -@@ -1,14016 +0,0 @@ --/* -*- mode: c -*- */ -- --/* Licensed under a 3-clause BSD style license - see LICENSE.rst */ -- --/* -- * "ufunc.c" is auto-generated by erfa_generator.py from the template -- * "ufunc.c.templ". Do *not* edit "ufunc.c" directly, instead edit -- * "ufunc.c.templ" and run ufunc_generator.py from the source directory -- * to update it. -- */ -- --#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION --#include "Python.h" --#include "numpy/arrayobject.h" --#include "numpy/ufuncobject.h" --#include "erfa.h" --#include "erfaextra.h" --#include "erfa_additions.h" -- --#define MODULE_DOCSTRING \ -- "Ufunc wrappers of the ERFA routines.\n\n" \ -- "These ufuncs vectorize the ERFA functions assuming structured dtypes\n" \ -- "for vector and matrix arguments. Status codes are vectors as well.\n" \ -- "Python wrappers are also provided, which convert between\n" \ -- "trailing dimensions and structured dtypes where necessary,\n" \ -- "and combine status codes." --#define GET_LEAP_SECONDS_DOCSTRING \ -- "get_leap_seconds()\n\n" \ -- "Access the leap second table used in ERFA.\n\n" \ -- "Returns\n" \ -- "-------\n" \ -- "leap_seconds : `~numpy.ndarray`\n" \ -- " With structured dtype `~astropy._erfa.dt_eraLEAPSECOND`,\n" \ -- " containing items 'year', 'month', and 'tai_utc'." --#define SET_LEAP_SECONDS_DOCSTRING \ -- "set_leap_seconds([table])\n\n" \ -- "Set the leap second table used in ERFA.\n\n" \ -- "Parameters\n" \ -- "----------\n" \ -- "leap_seconds : array_like, optional\n" \ -- " With structured dtype `~astropy._erfa.dt_eraLEAPSECOND`,\n" \ -- " containing items 'year', 'month', and 'tai_utc'.\n" \ -- " If not given, reset to the ERFA built-in table.\n\n" \ -- "Notes\n" \ -- "-----\n" \ -- "No sanity checks are done on the input; it is simply coerced\n" \ -- "to the correct dtype." -- -- --static inline void copy_to_double3(char *ptr, npy_intp s, double d[3]) { -- char *p = ptr; -- int j; -- for (j = 0; j < 3; j++, p += s) { -- d[j] = *(double *)p; -- } --} -- --static inline void copy_from_double3(char *ptr, npy_intp s, double d[3]) { -- char *p = ptr; -- int j; -- for (j = 0; j < 3; j++, p += s) { -- *(double *)p = d[j]; -- } --} -- --static inline void copy_to_double33(char *ptr, npy_intp s0, npy_intp s1, -- double d[3][3]) { -- char *p0 = ptr; -- int j0, j1; -- for (j0 = 0; j0 < 3; j0++, p0 += s0) { -- char *p1 = p0; -- for (j1 = 0; j1 < 3; j1++, p1 += s1) { -- d[j0][j1] = *(double *)p1; -- } -- } --} -- --static inline void copy_from_double33(char *ptr, npy_intp s0, npy_intp s1, -- double d[3][3]) { -- char *p = ptr; -- char *p0 = ptr; -- int j0, j1; -- for (j0 = 0; j0 < 3; j0++, p0 += s0) { -- char *p1 = p0; -- for (j1 = 0; j1 < 3; j1++, p1 += s1) { -- *(double *)p = d[j0][j1]; -- } -- } --} -- --/* eraLDBODY is never returned, so we do not need a copy_from */ --static inline void copy_to_eraLDBODY(char *ptr, npy_intp s, npy_intp n, -- eraLDBODY b[]) { -- char *p = ptr; -- npy_intp j; -- for (j = 0; j < n; j++, p += s) { -- b[j] = *(eraLDBODY *)p; -- } --} -- --/* -- * INNER LOOPS - iteratively call the erfa function for a chunk of data. -- * -- * For each argument: -- * char * is the pointer to the data in memory; -- * npy_intp s_ is the number of bytes between successive elements; -- * *_ is a correctly cast pointer to the current element; -- * ( _, i.e., not a pointer, for status codes and return values) -- * -- * Notes: -- * 1. Some erfa function change elements in-place; in the ufunc, these "inout" -- * arguments are treated as separate: data is copied from the input to the -- * output, and the output is changed in-place by the erfa function. -- * To reproduce the in-place behaviour, the input to the ufunc can be passed -- * in as output as well -- as is done in the python wrapper (the copy will -- * be omitted for this case). -- * 2. Any erfa function involving light deflection requires an struct -- * eraLDBODY argument with a dimension that is user-defined. Those function -- * are implemented as generalized ufuncs, with a signature in which the -- * relevant variable is marked (i.e., '(),...,(n), (), ... -> (),...'). -- * In the inner loops, an appropriate copy is done if in the numpy array -- * the n elements are not contiguous. -- * 3. Similar copies are done for erfa functions that require vectors or -- * matrices, if the corresponding axes in the input or output operands are -- * not contiguous. -- */ -- --static void ufunc_loop_cal2jd( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *iy = *args++; -- npy_intp s_iy = *steps++; -- char *im = *args++; -- npy_intp s_im = *steps++; -- char *id = *args++; -- npy_intp s_id = *steps++; -- char *djm0 = *args++; -- npy_intp s_djm0 = *steps++; -- char *djm = *args++; -- npy_intp s_djm = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_iy); -- int (*_im); -- int (*_id); -- double (*_djm0); -- double (*_djm); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, iy += s_iy, im += s_im, id += s_id, djm0 += s_djm0, djm += s_djm, c_retval += s_c_retval) { -- _iy = ((int (*))iy); -- _im = ((int (*))im); -- _id = ((int (*))id); -- _djm0 = ((double (*))djm0); -- _djm = ((double (*))djm); -- _c_retval = eraCal2jd(*_iy, *_im, *_id, _djm0, _djm); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_epb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_dj1); -- double (*_dj2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, dj1 += s_dj1, dj2 += s_dj2, c_retval += s_c_retval) { -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _c_retval = eraEpb(*_dj1, *_dj2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_epb2jd( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epb = *args++; -- npy_intp s_epb = *steps++; -- char *djm0 = *args++; -- npy_intp s_djm0 = *steps++; -- char *djm = *args++; -- npy_intp s_djm = *steps++; -- double (*_epb); -- double (*_djm0); -- double (*_djm); -- for (i_o = 0; i_o < n_o; -- i_o++, epb += s_epb, djm0 += s_djm0, djm += s_djm) { -- _epb = ((double (*))epb); -- _djm0 = ((double (*))djm0); -- _djm = ((double (*))djm); -- eraEpb2jd(*_epb, _djm0, _djm); -- } --} -- --static void ufunc_loop_epj( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_dj1); -- double (*_dj2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, dj1 += s_dj1, dj2 += s_dj2, c_retval += s_c_retval) { -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _c_retval = eraEpj(*_dj1, *_dj2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_epj2jd( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *djm0 = *args++; -- npy_intp s_djm0 = *steps++; -- char *djm = *args++; -- npy_intp s_djm = *steps++; -- double (*_epj); -- double (*_djm0); -- double (*_djm); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, djm0 += s_djm0, djm += s_djm) { -- _epj = ((double (*))epj); -- _djm0 = ((double (*))djm0); -- _djm = ((double (*))djm); -- eraEpj2jd(*_epj, _djm0, _djm); -- } --} -- --static void ufunc_loop_jd2cal( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *iy = *args++; -- npy_intp s_iy = *steps++; -- char *im = *args++; -- npy_intp s_im = *steps++; -- char *id = *args++; -- npy_intp s_id = *steps++; -- char *fd = *args++; -- npy_intp s_fd = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_dj1); -- double (*_dj2); -- int (*_iy); -- int (*_im); -- int (*_id); -- double (*_fd); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, dj1 += s_dj1, dj2 += s_dj2, iy += s_iy, im += s_im, id += s_id, fd += s_fd, c_retval += s_c_retval) { -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _iy = ((int (*))iy); -- _im = ((int (*))im); -- _id = ((int (*))id); -- _fd = ((double (*))fd); -- _c_retval = eraJd2cal(*_dj1, *_dj2, _iy, _im, _id, _fd); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_jdcalf( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ndp = *args++; -- npy_intp s_ndp = *steps++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *iymdf = *args++; -- npy_intp s_iymdf = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_ndp); -- double (*_dj1); -- double (*_dj2); -- int (*_iymdf)[4]; -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ndp += s_ndp, dj1 += s_dj1, dj2 += s_dj2, iymdf += s_iymdf, c_retval += s_c_retval) { -- _ndp = ((int (*))ndp); -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _iymdf = ((int (*)[4])iymdf); -- _c_retval = eraJdcalf(*_ndp, *_dj1, *_dj2, *_iymdf); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ab( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pnat = *args++; -- npy_intp s_pnat = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *bm1 = *args++; -- npy_intp s_bm1 = *steps++; -- char *ppr = *args++; -- npy_intp s_ppr = *steps++; -- double b_pnat[3]; -- double (*_pnat)[3] = &b_pnat; -- double b_v[3]; -- double (*_v)[3] = &b_v; -- double (*_s); -- double (*_bm1); -- double b_ppr[3]; -- double (*_ppr)[3] = &b_ppr; -- npy_intp is_pnat0 = *steps++; -- int copy_pnat = (is_pnat0 != sizeof(double)); -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- npy_intp is_ppr0 = *steps++; -- int copy_ppr = (is_ppr0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, pnat += s_pnat, v += s_v, s += s_s, bm1 += s_bm1, ppr += s_ppr) { -- if (copy_pnat) { -- copy_to_double3(pnat, is_pnat0, *_pnat); -- } -- else { -- _pnat = ((double (*)[3])pnat); -- } -- if (copy_v) { -- copy_to_double3(v, is_v0, *_v); -- } -- else { -- _v = ((double (*)[3])v); -- } -- _s = ((double (*))s); -- _bm1 = ((double (*))bm1); -- if (!copy_ppr) { -- _ppr = ((double (*)[3])ppr); -- } -- eraAb(*_pnat, *_v, *_s, *_bm1, *_ppr); -- if (copy_ppr) { -- copy_from_double3(ppr, is_ppr0, *_ppr); -- } -- } --} -- --static void ufunc_loop_apcg( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *ebpv = *args++; -- npy_intp s_ebpv = *steps++; -- char *ehp = *args++; -- npy_intp s_ehp = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_ebpv)[2][3]; -- double b_ehp[3]; -- double (*_ehp)[3] = &b_ehp; -- eraASTROM (*_astrom); -- npy_intp is_ehp0 = *steps++; -- int copy_ehp = (is_ehp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, ebpv += s_ebpv, ehp += s_ehp, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _ebpv = ((double (*)[2][3])ebpv); -- if (copy_ehp) { -- copy_to_double3(ehp, is_ehp0, *_ehp); -- } -- else { -- _ehp = ((double (*)[3])ehp); -- } -- _astrom = ((eraASTROM (*))astrom); -- eraApcg(*_date1, *_date2, *_ebpv, *_ehp, _astrom); -- } --} -- --static void ufunc_loop_apcg13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- eraASTROM (*_astrom); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _astrom = ((eraASTROM (*))astrom); -- eraApcg13(*_date1, *_date2, _astrom); -- } --} -- --static void ufunc_loop_apci( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *ebpv = *args++; -- npy_intp s_ebpv = *steps++; -- char *ehp = *args++; -- npy_intp s_ehp = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_ebpv)[2][3]; -- double b_ehp[3]; -- double (*_ehp)[3] = &b_ehp; -- double (*_x); -- double (*_y); -- double (*_s); -- eraASTROM (*_astrom); -- npy_intp is_ehp0 = *steps++; -- int copy_ehp = (is_ehp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, ebpv += s_ebpv, ehp += s_ehp, x += s_x, y += s_y, s += s_s, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _ebpv = ((double (*)[2][3])ebpv); -- if (copy_ehp) { -- copy_to_double3(ehp, is_ehp0, *_ehp); -- } -- else { -- _ehp = ((double (*)[3])ehp); -- } -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- _astrom = ((eraASTROM (*))astrom); -- eraApci(*_date1, *_date2, *_ebpv, *_ehp, *_x, *_y, *_s, _astrom); -- } --} -- --static void ufunc_loop_apci13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *eo = *args++; -- npy_intp s_eo = *steps++; -- double (*_date1); -- double (*_date2); -- eraASTROM (*_astrom); -- double (*_eo); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, astrom += s_astrom, eo += s_eo) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _astrom = ((eraASTROM (*))astrom); -- _eo = ((double (*))eo); -- eraApci13(*_date1, *_date2, _astrom, _eo); -- } --} -- --static void ufunc_loop_apco( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *ebpv = *args++; -- npy_intp s_ebpv = *steps++; -- char *ehp = *args++; -- npy_intp s_ehp = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *sp = *args++; -- npy_intp s_sp = *steps++; -- char *refa = *args++; -- npy_intp s_refa = *steps++; -- char *refb = *args++; -- npy_intp s_refb = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_ebpv)[2][3]; -- double b_ehp[3]; -- double (*_ehp)[3] = &b_ehp; -- double (*_x); -- double (*_y); -- double (*_s); -- double (*_theta); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_sp); -- double (*_refa); -- double (*_refb); -- eraASTROM (*_astrom); -- npy_intp is_ehp0 = *steps++; -- int copy_ehp = (is_ehp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, ebpv += s_ebpv, ehp += s_ehp, x += s_x, y += s_y, s += s_s, theta += s_theta, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, sp += s_sp, refa += s_refa, refb += s_refb, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _ebpv = ((double (*)[2][3])ebpv); -- if (copy_ehp) { -- copy_to_double3(ehp, is_ehp0, *_ehp); -- } -- else { -- _ehp = ((double (*)[3])ehp); -- } -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- _theta = ((double (*))theta); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _sp = ((double (*))sp); -- _refa = ((double (*))refa); -- _refb = ((double (*))refb); -- _astrom = ((eraASTROM (*))astrom); -- eraApco(*_date1, *_date2, *_ebpv, *_ehp, *_x, *_y, *_s, *_theta, *_elong, *_phi, *_hm, *_xp, *_yp, *_sp, *_refa, *_refb, _astrom); -- } --} -- --static void ufunc_loop_apco13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *eo = *args++; -- npy_intp s_eo = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- eraASTROM (*_astrom); -- double (*_eo); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, astrom += s_astrom, eo += s_eo, c_retval += s_c_retval) { -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _astrom = ((eraASTROM (*))astrom); -- _eo = ((double (*))eo); -- _c_retval = eraApco13(*_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _astrom, _eo); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_apcs( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *ebpv = *args++; -- npy_intp s_ebpv = *steps++; -- char *ehp = *args++; -- npy_intp s_ehp = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_pv)[2][3]; -- double (*_ebpv)[2][3]; -- double b_ehp[3]; -- double (*_ehp)[3] = &b_ehp; -- eraASTROM (*_astrom); -- npy_intp is_ehp0 = *steps++; -- int copy_ehp = (is_ehp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, pv += s_pv, ebpv += s_ebpv, ehp += s_ehp, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _pv = ((double (*)[2][3])pv); -- _ebpv = ((double (*)[2][3])ebpv); -- if (copy_ehp) { -- copy_to_double3(ehp, is_ehp0, *_ehp); -- } -- else { -- _ehp = ((double (*)[3])ehp); -- } -- _astrom = ((eraASTROM (*))astrom); -- eraApcs(*_date1, *_date2, *_pv, *_ebpv, *_ehp, _astrom); -- } --} -- --static void ufunc_loop_apcs13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_pv)[2][3]; -- eraASTROM (*_astrom); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, pv += s_pv, astrom += s_astrom) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _pv = ((double (*)[2][3])pv); -- _astrom = ((eraASTROM (*))astrom); -- eraApcs13(*_date1, *_date2, *_pv, _astrom); -- } --} -- --static void ufunc_loop_aper( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *astrom_in = *args++; -- npy_intp s_astrom_in = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_theta); -- eraASTROM (*_astrom); -- for (i_o = 0; i_o < n_o; -- i_o++, theta += s_theta, astrom += s_astrom, astrom_in += s_astrom_in) { -- _theta = ((double (*))theta); -- _astrom = ((eraASTROM (*))astrom); -- if (astrom_in != astrom) { -- memcpy(astrom, astrom_in, 1*sizeof(eraASTROM)); -- } -- eraAper(*_theta, _astrom); -- } --} -- --static void ufunc_loop_aper13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *astrom_in = *args++; -- npy_intp s_astrom_in = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_ut11); -- double (*_ut12); -- eraASTROM (*_astrom); -- for (i_o = 0; i_o < n_o; -- i_o++, ut11 += s_ut11, ut12 += s_ut12, astrom += s_astrom, astrom_in += s_astrom_in) { -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _astrom = ((eraASTROM (*))astrom); -- if (astrom_in != astrom) { -- memcpy(astrom, astrom_in, 1*sizeof(eraASTROM)); -- } -- eraAper13(*_ut11, *_ut12, _astrom); -- } --} -- --static void ufunc_loop_apio( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *sp = *args++; -- npy_intp s_sp = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *refa = *args++; -- npy_intp s_refa = *steps++; -- char *refb = *args++; -- npy_intp s_refb = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- double (*_sp); -- double (*_theta); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_refa); -- double (*_refb); -- eraASTROM (*_astrom); -- for (i_o = 0; i_o < n_o; -- i_o++, sp += s_sp, theta += s_theta, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, refa += s_refa, refb += s_refb, astrom += s_astrom) { -- _sp = ((double (*))sp); -- _theta = ((double (*))theta); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _refa = ((double (*))refa); -- _refb = ((double (*))refb); -- _astrom = ((eraASTROM (*))astrom); -- eraApio(*_sp, *_theta, *_elong, *_phi, *_hm, *_xp, *_yp, *_refa, *_refb, _astrom); -- } --} -- --static void ufunc_loop_apio13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- eraASTROM (*_astrom); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, astrom += s_astrom, c_retval += s_c_retval) { -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _astrom = ((eraASTROM (*))astrom); -- _c_retval = eraApio13(*_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _astrom); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_atci13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *pr = *args++; -- npy_intp s_pr = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *eo = *args++; -- npy_intp s_eo = *steps++; -- double (*_rc); -- double (*_dc); -- double (*_pr); -- double (*_pd); -- double (*_px); -- double (*_rv); -- double (*_date1); -- double (*_date2); -- double (*_ri); -- double (*_di); -- double (*_eo); -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, pr += s_pr, pd += s_pd, px += s_px, rv += s_rv, date1 += s_date1, date2 += s_date2, ri += s_ri, di += s_di, eo += s_eo) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _pr = ((double (*))pr); -- _pd = ((double (*))pd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _eo = ((double (*))eo); -- eraAtci13(*_rc, *_dc, *_pr, *_pd, *_px, *_rv, *_date1, *_date2, _ri, _di, _eo); -- } --} -- --static void ufunc_loop_atciq( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *pr = *args++; -- npy_intp s_pr = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- double (*_rc); -- double (*_dc); -- double (*_pr); -- double (*_pd); -- double (*_px); -- double (*_rv); -- eraASTROM (*_astrom); -- double (*_ri); -- double (*_di); -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, pr += s_pr, pd += s_pd, px += s_px, rv += s_rv, astrom += s_astrom, ri += s_ri, di += s_di) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _pr = ((double (*))pr); -- _pd = ((double (*))pd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _astrom = ((eraASTROM (*))astrom); -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- eraAtciq(*_rc, *_dc, *_pr, *_pd, *_px, *_rv, _astrom, _ri, _di); -- } --} -- --static void ufunc_loop_atciqn( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *pr = *args++; -- npy_intp s_pr = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- double (*_rc); -- double (*_dc); -- double (*_pr); -- double (*_pd); -- double (*_px); -- double (*_rv); -- eraASTROM (*_astrom); -- eraLDBODY (*_b); -- double (*_ri); -- double (*_di); -- npy_intp nb = dimensions[0]; -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(eraLDBODY)); -- if (copy_b) { -- _b = PyArray_malloc(nb * sizeof(eraLDBODY)); -- if (_b == NULL) { -- PyErr_NoMemory(); -- return; -- } -- } -- else { -- _b = NULL; -- } -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, pr += s_pr, pd += s_pd, px += s_px, rv += s_rv, astrom += s_astrom, b += s_b, ri += s_ri, di += s_di) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _pr = ((double (*))pr); -- _pd = ((double (*))pd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _astrom = ((eraASTROM (*))astrom); -- if (copy_b) { -- copy_to_eraLDBODY(b, is_b0, nb, _b); -- } -- else { -- _b = ((eraLDBODY (*))b); -- } -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- eraAtciqn(*_rc, *_dc, *_pr, *_pd, *_px, *_rv, _astrom, nb, _b, _ri, _di); -- } --} -- --static void ufunc_loop_atciqz( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- double (*_rc); -- double (*_dc); -- eraASTROM (*_astrom); -- double (*_ri); -- double (*_di); -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, astrom += s_astrom, ri += s_ri, di += s_di) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _astrom = ((eraASTROM (*))astrom); -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- eraAtciqz(*_rc, *_dc, _astrom, _ri, _di); -- } --} -- --static void ufunc_loop_atco13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *pr = *args++; -- npy_intp s_pr = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *aob = *args++; -- npy_intp s_aob = *steps++; -- char *zob = *args++; -- npy_intp s_zob = *steps++; -- char *hob = *args++; -- npy_intp s_hob = *steps++; -- char *dob = *args++; -- npy_intp s_dob = *steps++; -- char *rob = *args++; -- npy_intp s_rob = *steps++; -- char *eo = *args++; -- npy_intp s_eo = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_rc); -- double (*_dc); -- double (*_pr); -- double (*_pd); -- double (*_px); -- double (*_rv); -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- double (*_aob); -- double (*_zob); -- double (*_hob); -- double (*_dob); -- double (*_rob); -- double (*_eo); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, pr += s_pr, pd += s_pd, px += s_px, rv += s_rv, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, aob += s_aob, zob += s_zob, hob += s_hob, dob += s_dob, rob += s_rob, eo += s_eo, c_retval += s_c_retval) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _pr = ((double (*))pr); -- _pd = ((double (*))pd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _aob = ((double (*))aob); -- _zob = ((double (*))zob); -- _hob = ((double (*))hob); -- _dob = ((double (*))dob); -- _rob = ((double (*))rob); -- _eo = ((double (*))eo); -- _c_retval = eraAtco13(*_rc, *_dc, *_pr, *_pd, *_px, *_rv, *_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _aob, _zob, _hob, _dob, _rob, _eo); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_atic13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *eo = *args++; -- npy_intp s_eo = *steps++; -- double (*_ri); -- double (*_di); -- double (*_date1); -- double (*_date2); -- double (*_rc); -- double (*_dc); -- double (*_eo); -- for (i_o = 0; i_o < n_o; -- i_o++, ri += s_ri, di += s_di, date1 += s_date1, date2 += s_date2, rc += s_rc, dc += s_dc, eo += s_eo) { -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _eo = ((double (*))eo); -- eraAtic13(*_ri, *_di, *_date1, *_date2, _rc, _dc, _eo); -- } --} -- --static void ufunc_loop_aticq( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- double (*_ri); -- double (*_di); -- eraASTROM (*_astrom); -- double (*_rc); -- double (*_dc); -- for (i_o = 0; i_o < n_o; -- i_o++, ri += s_ri, di += s_di, astrom += s_astrom, rc += s_rc, dc += s_dc) { -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _astrom = ((eraASTROM (*))astrom); -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- eraAticq(*_ri, *_di, _astrom, _rc, _dc); -- } --} -- --static void ufunc_loop_aticqn( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- double (*_ri); -- double (*_di); -- eraASTROM (*_astrom); -- eraLDBODY (*_b); -- double (*_rc); -- double (*_dc); -- npy_intp nb = dimensions[0]; -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(eraLDBODY)); -- if (copy_b) { -- _b = PyArray_malloc(nb * sizeof(eraLDBODY)); -- if (_b == NULL) { -- PyErr_NoMemory(); -- return; -- } -- } -- else { -- _b = NULL; -- } -- for (i_o = 0; i_o < n_o; -- i_o++, ri += s_ri, di += s_di, astrom += s_astrom, b += s_b, rc += s_rc, dc += s_dc) { -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _astrom = ((eraASTROM (*))astrom); -- if (copy_b) { -- copy_to_eraLDBODY(b, is_b0, nb, _b); -- } -- else { -- _b = ((eraLDBODY (*))b); -- } -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- eraAticqn(*_ri, *_di, _astrom, nb, _b, _rc, _dc); -- } --} -- --static void ufunc_loop_atio13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *aob = *args++; -- npy_intp s_aob = *steps++; -- char *zob = *args++; -- npy_intp s_zob = *steps++; -- char *hob = *args++; -- npy_intp s_hob = *steps++; -- char *dob = *args++; -- npy_intp s_dob = *steps++; -- char *rob = *args++; -- npy_intp s_rob = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ri); -- double (*_di); -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- double (*_aob); -- double (*_zob); -- double (*_hob); -- double (*_dob); -- double (*_rob); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ri += s_ri, di += s_di, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, aob += s_aob, zob += s_zob, hob += s_hob, dob += s_dob, rob += s_rob, c_retval += s_c_retval) { -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _aob = ((double (*))aob); -- _zob = ((double (*))zob); -- _hob = ((double (*))hob); -- _dob = ((double (*))dob); -- _rob = ((double (*))rob); -- _c_retval = eraAtio13(*_ri, *_di, *_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _aob, _zob, _hob, _dob, _rob); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_atioq( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *aob = *args++; -- npy_intp s_aob = *steps++; -- char *zob = *args++; -- npy_intp s_zob = *steps++; -- char *hob = *args++; -- npy_intp s_hob = *steps++; -- char *dob = *args++; -- npy_intp s_dob = *steps++; -- char *rob = *args++; -- npy_intp s_rob = *steps++; -- double (*_ri); -- double (*_di); -- eraASTROM (*_astrom); -- double (*_aob); -- double (*_zob); -- double (*_hob); -- double (*_dob); -- double (*_rob); -- for (i_o = 0; i_o < n_o; -- i_o++, ri += s_ri, di += s_di, astrom += s_astrom, aob += s_aob, zob += s_zob, hob += s_hob, dob += s_dob, rob += s_rob) { -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _astrom = ((eraASTROM (*))astrom); -- _aob = ((double (*))aob); -- _zob = ((double (*))zob); -- _hob = ((double (*))hob); -- _dob = ((double (*))dob); -- _rob = ((double (*))rob); -- eraAtioq(*_ri, *_di, _astrom, _aob, _zob, _hob, _dob, _rob); -- } --} -- --static void ufunc_loop_atoc13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *type = *args++; -- npy_intp s_type = *steps++; -- char *ob1 = *args++; -- npy_intp s_ob1 = *steps++; -- char *ob2 = *args++; -- npy_intp s_ob2 = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- const char (*_type); -- double (*_ob1); -- double (*_ob2); -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- double (*_rc); -- double (*_dc); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, type += s_type, ob1 += s_ob1, ob2 += s_ob2, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, rc += s_rc, dc += s_dc, c_retval += s_c_retval) { -- _type = ((const char (*))type); -- _ob1 = ((double (*))ob1); -- _ob2 = ((double (*))ob2); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _c_retval = eraAtoc13(_type, *_ob1, *_ob2, *_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _rc, _dc); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_atoi13( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *type = *args++; -- npy_intp s_type = *steps++; -- char *ob1 = *args++; -- npy_intp s_ob1 = *steps++; -- char *ob2 = *args++; -- npy_intp s_ob2 = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- const char (*_type); -- double (*_ob1); -- double (*_ob2); -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- double (*_ri); -- double (*_di); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, type += s_type, ob1 += s_ob1, ob2 += s_ob2, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, ri += s_ri, di += s_di, c_retval += s_c_retval) { -- _type = ((const char (*))type); -- _ob1 = ((double (*))ob1); -- _ob2 = ((double (*))ob2); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- _c_retval = eraAtoi13(_type, *_ob1, *_ob2, *_utc1, *_utc2, *_dut1, *_elong, *_phi, *_hm, *_xp, *_yp, *_phpa, *_tc, *_rh, *_wl, _ri, _di); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_atoiq( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *type = *args++; -- npy_intp s_type = *steps++; -- char *ob1 = *args++; -- npy_intp s_ob1 = *steps++; -- char *ob2 = *args++; -- npy_intp s_ob2 = *steps++; -- char *astrom = *args++; -- npy_intp s_astrom = *steps++; -- char *ri = *args++; -- npy_intp s_ri = *steps++; -- char *di = *args++; -- npy_intp s_di = *steps++; -- const char (*_type); -- double (*_ob1); -- double (*_ob2); -- eraASTROM (*_astrom); -- double (*_ri); -- double (*_di); -- for (i_o = 0; i_o < n_o; -- i_o++, type += s_type, ob1 += s_ob1, ob2 += s_ob2, astrom += s_astrom, ri += s_ri, di += s_di) { -- _type = ((const char (*))type); -- _ob1 = ((double (*))ob1); -- _ob2 = ((double (*))ob2); -- _astrom = ((eraASTROM (*))astrom); -- _ri = ((double (*))ri); -- _di = ((double (*))di); -- eraAtoiq(_type, *_ob1, *_ob2, _astrom, _ri, _di); -- } --} -- --static void ufunc_loop_ld( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *bm = *args++; -- npy_intp s_bm = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *q = *args++; -- npy_intp s_q = *steps++; -- char *e = *args++; -- npy_intp s_e = *steps++; -- char *em = *args++; -- npy_intp s_em = *steps++; -- char *dlim = *args++; -- npy_intp s_dlim = *steps++; -- char *p1 = *args++; -- npy_intp s_p1 = *steps++; -- double (*_bm); -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_q[3]; -- double (*_q)[3] = &b_q; -- double b_e[3]; -- double (*_e)[3] = &b_e; -- double (*_em); -- double (*_dlim); -- double b_p1[3]; -- double (*_p1)[3] = &b_p1; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_q0 = *steps++; -- int copy_q = (is_q0 != sizeof(double)); -- npy_intp is_e0 = *steps++; -- int copy_e = (is_e0 != sizeof(double)); -- npy_intp is_p10 = *steps++; -- int copy_p1 = (is_p10 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, bm += s_bm, p += s_p, q += s_q, e += s_e, em += s_em, dlim += s_dlim, p1 += s_p1) { -- _bm = ((double (*))bm); -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (copy_q) { -- copy_to_double3(q, is_q0, *_q); -- } -- else { -- _q = ((double (*)[3])q); -- } -- if (copy_e) { -- copy_to_double3(e, is_e0, *_e); -- } -- else { -- _e = ((double (*)[3])e); -- } -- _em = ((double (*))em); -- _dlim = ((double (*))dlim); -- if (!copy_p1) { -- _p1 = ((double (*)[3])p1); -- } -- eraLd(*_bm, *_p, *_q, *_e, *_em, *_dlim, *_p1); -- if (copy_p1) { -- copy_from_double3(p1, is_p10, *_p1); -- } -- } --} -- --static void ufunc_loop_ldn( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *ob = *args++; -- npy_intp s_ob = *steps++; -- char *sc = *args++; -- npy_intp s_sc = *steps++; -- char *sn = *args++; -- npy_intp s_sn = *steps++; -- eraLDBODY (*_b); -- double b_ob[3]; -- double (*_ob)[3] = &b_ob; -- double b_sc[3]; -- double (*_sc)[3] = &b_sc; -- double b_sn[3]; -- double (*_sn)[3] = &b_sn; -- npy_intp nb = dimensions[0]; -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(eraLDBODY)); -- npy_intp is_ob0 = *steps++; -- int copy_ob = (is_ob0 != sizeof(double)); -- npy_intp is_sc0 = *steps++; -- int copy_sc = (is_sc0 != sizeof(double)); -- npy_intp is_sn0 = *steps++; -- int copy_sn = (is_sn0 != sizeof(double)); -- if (copy_b) { -- _b = PyArray_malloc(nb * sizeof(eraLDBODY)); -- if (_b == NULL) { -- PyErr_NoMemory(); -- return; -- } -- } -- else { -- _b = NULL; -- } -- for (i_o = 0; i_o < n_o; -- i_o++, b += s_b, ob += s_ob, sc += s_sc, sn += s_sn) { -- if (copy_b) { -- copy_to_eraLDBODY(b, is_b0, nb, _b); -- } -- else { -- _b = ((eraLDBODY (*))b); -- } -- if (copy_ob) { -- copy_to_double3(ob, is_ob0, *_ob); -- } -- else { -- _ob = ((double (*)[3])ob); -- } -- if (copy_sc) { -- copy_to_double3(sc, is_sc0, *_sc); -- } -- else { -- _sc = ((double (*)[3])sc); -- } -- if (!copy_sn) { -- _sn = ((double (*)[3])sn); -- } -- eraLdn(nb, _b, *_ob, *_sc, *_sn); -- if (copy_sn) { -- copy_from_double3(sn, is_sn0, *_sn); -- } -- } --} -- --static void ufunc_loop_ldsun( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *e = *args++; -- npy_intp s_e = *steps++; -- char *em = *args++; -- npy_intp s_em = *steps++; -- char *p1 = *args++; -- npy_intp s_p1 = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_e[3]; -- double (*_e)[3] = &b_e; -- double (*_em); -- double b_p1[3]; -- double (*_p1)[3] = &b_p1; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_e0 = *steps++; -- int copy_e = (is_e0 != sizeof(double)); -- npy_intp is_p10 = *steps++; -- int copy_p1 = (is_p10 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, e += s_e, em += s_em, p1 += s_p1) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (copy_e) { -- copy_to_double3(e, is_e0, *_e); -- } -- else { -- _e = ((double (*)[3])e); -- } -- _em = ((double (*))em); -- if (!copy_p1) { -- _p1 = ((double (*)[3])p1); -- } -- eraLdsun(*_p, *_e, *_em, *_p1); -- if (copy_p1) { -- copy_from_double3(p1, is_p10, *_p1); -- } -- } --} -- --static void ufunc_loop_pmpx( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc = *args++; -- npy_intp s_rc = *steps++; -- char *dc = *args++; -- npy_intp s_dc = *steps++; -- char *pr = *args++; -- npy_intp s_pr = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *pmt = *args++; -- npy_intp s_pmt = *steps++; -- char *pob = *args++; -- npy_intp s_pob = *steps++; -- char *pco = *args++; -- npy_intp s_pco = *steps++; -- double (*_rc); -- double (*_dc); -- double (*_pr); -- double (*_pd); -- double (*_px); -- double (*_rv); -- double (*_pmt); -- double b_pob[3]; -- double (*_pob)[3] = &b_pob; -- double b_pco[3]; -- double (*_pco)[3] = &b_pco; -- npy_intp is_pob0 = *steps++; -- int copy_pob = (is_pob0 != sizeof(double)); -- npy_intp is_pco0 = *steps++; -- int copy_pco = (is_pco0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, rc += s_rc, dc += s_dc, pr += s_pr, pd += s_pd, px += s_px, rv += s_rv, pmt += s_pmt, pob += s_pob, pco += s_pco) { -- _rc = ((double (*))rc); -- _dc = ((double (*))dc); -- _pr = ((double (*))pr); -- _pd = ((double (*))pd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _pmt = ((double (*))pmt); -- if (copy_pob) { -- copy_to_double3(pob, is_pob0, *_pob); -- } -- else { -- _pob = ((double (*)[3])pob); -- } -- if (!copy_pco) { -- _pco = ((double (*)[3])pco); -- } -- eraPmpx(*_rc, *_dc, *_pr, *_pd, *_px, *_rv, *_pmt, *_pob, *_pco); -- if (copy_pco) { -- copy_from_double3(pco, is_pco0, *_pco); -- } -- } --} -- --static void ufunc_loop_pmsafe( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ra1 = *args++; -- npy_intp s_ra1 = *steps++; -- char *dec1 = *args++; -- npy_intp s_dec1 = *steps++; -- char *pmr1 = *args++; -- npy_intp s_pmr1 = *steps++; -- char *pmd1 = *args++; -- npy_intp s_pmd1 = *steps++; -- char *px1 = *args++; -- npy_intp s_px1 = *steps++; -- char *rv1 = *args++; -- npy_intp s_rv1 = *steps++; -- char *ep1a = *args++; -- npy_intp s_ep1a = *steps++; -- char *ep1b = *args++; -- npy_intp s_ep1b = *steps++; -- char *ep2a = *args++; -- npy_intp s_ep2a = *steps++; -- char *ep2b = *args++; -- npy_intp s_ep2b = *steps++; -- char *ra2 = *args++; -- npy_intp s_ra2 = *steps++; -- char *dec2 = *args++; -- npy_intp s_dec2 = *steps++; -- char *pmr2 = *args++; -- npy_intp s_pmr2 = *steps++; -- char *pmd2 = *args++; -- npy_intp s_pmd2 = *steps++; -- char *px2 = *args++; -- npy_intp s_px2 = *steps++; -- char *rv2 = *args++; -- npy_intp s_rv2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ra1); -- double (*_dec1); -- double (*_pmr1); -- double (*_pmd1); -- double (*_px1); -- double (*_rv1); -- double (*_ep1a); -- double (*_ep1b); -- double (*_ep2a); -- double (*_ep2b); -- double (*_ra2); -- double (*_dec2); -- double (*_pmr2); -- double (*_pmd2); -- double (*_px2); -- double (*_rv2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ra1 += s_ra1, dec1 += s_dec1, pmr1 += s_pmr1, pmd1 += s_pmd1, px1 += s_px1, rv1 += s_rv1, ep1a += s_ep1a, ep1b += s_ep1b, ep2a += s_ep2a, ep2b += s_ep2b, ra2 += s_ra2, dec2 += s_dec2, pmr2 += s_pmr2, pmd2 += s_pmd2, px2 += s_px2, rv2 += s_rv2, c_retval += s_c_retval) { -- _ra1 = ((double (*))ra1); -- _dec1 = ((double (*))dec1); -- _pmr1 = ((double (*))pmr1); -- _pmd1 = ((double (*))pmd1); -- _px1 = ((double (*))px1); -- _rv1 = ((double (*))rv1); -- _ep1a = ((double (*))ep1a); -- _ep1b = ((double (*))ep1b); -- _ep2a = ((double (*))ep2a); -- _ep2b = ((double (*))ep2b); -- _ra2 = ((double (*))ra2); -- _dec2 = ((double (*))dec2); -- _pmr2 = ((double (*))pmr2); -- _pmd2 = ((double (*))pmd2); -- _px2 = ((double (*))px2); -- _rv2 = ((double (*))rv2); -- _c_retval = eraPmsafe(*_ra1, *_dec1, *_pmr1, *_pmd1, *_px1, *_rv1, *_ep1a, *_ep1b, *_ep2a, *_ep2b, _ra2, _dec2, _pmr2, _pmd2, _px2, _rv2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_pvtob( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *hm = *args++; -- npy_intp s_hm = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *sp = *args++; -- npy_intp s_sp = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- double (*_elong); -- double (*_phi); -- double (*_hm); -- double (*_xp); -- double (*_yp); -- double (*_sp); -- double (*_theta); -- double (*_pv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, elong += s_elong, phi += s_phi, hm += s_hm, xp += s_xp, yp += s_yp, sp += s_sp, theta += s_theta, pv += s_pv) { -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _hm = ((double (*))hm); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _sp = ((double (*))sp); -- _theta = ((double (*))theta); -- _pv = ((double (*)[2][3])pv); -- eraPvtob(*_elong, *_phi, *_hm, *_xp, *_yp, *_sp, *_theta, *_pv); -- } --} -- --static void ufunc_loop_refco( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *phpa = *args++; -- npy_intp s_phpa = *steps++; -- char *tc = *args++; -- npy_intp s_tc = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *wl = *args++; -- npy_intp s_wl = *steps++; -- char *refa = *args++; -- npy_intp s_refa = *steps++; -- char *refb = *args++; -- npy_intp s_refb = *steps++; -- double (*_phpa); -- double (*_tc); -- double (*_rh); -- double (*_wl); -- double (*_refa); -- double (*_refb); -- for (i_o = 0; i_o < n_o; -- i_o++, phpa += s_phpa, tc += s_tc, rh += s_rh, wl += s_wl, refa += s_refa, refb += s_refb) { -- _phpa = ((double (*))phpa); -- _tc = ((double (*))tc); -- _rh = ((double (*))rh); -- _wl = ((double (*))wl); -- _refa = ((double (*))refa); -- _refb = ((double (*))refb); -- eraRefco(*_phpa, *_tc, *_rh, *_wl, _refa, _refb); -- } --} -- --static void ufunc_loop_epv00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *pvh = *args++; -- npy_intp s_pvh = *steps++; -- char *pvb = *args++; -- npy_intp s_pvb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_pvh)[2][3]; -- double (*_pvb)[2][3]; -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, pvh += s_pvh, pvb += s_pvb, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _pvh = ((double (*)[2][3])pvh); -- _pvb = ((double (*)[2][3])pvb); -- _c_retval = eraEpv00(*_date1, *_date2, *_pvh, *_pvb); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_plan94( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *np = *args++; -- npy_intp s_np = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- int (*_np); -- double (*_pv)[2][3]; -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, np += s_np, pv += s_pv, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _np = ((int (*))np); -- _pv = ((double (*)[2][3])pv); -- _c_retval = eraPlan94(*_date1, *_date2, *_np, *_pv); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fad03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFad03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fae03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFae03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_faf03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFaf03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_faju03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFaju03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fal03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFal03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_falp03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFalp03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fama03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFama03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fame03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFame03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fane03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFane03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_faom03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFaom03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fapa03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFapa03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fasa03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFasa03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_faur03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFaur03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fave03( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *t = *args++; -- npy_intp s_t = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_t); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, t += s_t, c_retval += s_c_retval) { -- _t = ((double (*))t); -- _c_retval = eraFave03(*_t); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_bi00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dpsibi = *args++; -- npy_intp s_dpsibi = *steps++; -- char *depsbi = *args++; -- npy_intp s_depsbi = *steps++; -- char *dra = *args++; -- npy_intp s_dra = *steps++; -- double (*_dpsibi); -- double (*_depsbi); -- double (*_dra); -- for (i_o = 0; i_o < n_o; -- i_o++, dpsibi += s_dpsibi, depsbi += s_depsbi, dra += s_dra) { -- _dpsibi = ((double (*))dpsibi); -- _depsbi = ((double (*))depsbi); -- _dra = ((double (*))dra); -- eraBi00(_dpsibi, _depsbi, _dra); -- } --} -- --static void ufunc_loop_bp00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rb += s_rb, rp += s_rp, rbp += s_rbp) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- eraBp00(*_date1, *_date2, *_rb, *_rp, *_rbp); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- } --} -- --static void ufunc_loop_bp06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rb += s_rb, rp += s_rp, rbp += s_rbp) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- eraBp06(*_date1, *_date2, *_rb, *_rp, *_rbp); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- } --} -- --static void ufunc_loop_bpn2xy( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- double (*_x); -- double (*_y); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, rbpn += s_rbpn, x += s_x, y += s_y) { -- if (copy_rbpn) { -- copy_to_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- else { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- _x = ((double (*))x); -- _y = ((double (*))y); -- eraBpn2xy(*_rbpn, _x, _y); -- } --} -- --static void ufunc_loop_c2i00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rc2i += s_rc2i) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2i00a(*_date1, *_date2, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2i00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rc2i += s_rc2i) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2i00b(*_date1, *_date2, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2i06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rc2i += s_rc2i) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2i06a(*_date1, *_date2, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2ibpn( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rbpn += s_rbpn, rc2i += s_rc2i) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (copy_rbpn) { -- copy_to_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- else { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2ibpn(*_date1, *_date2, *_rbpn, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2ixy( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, rc2i += s_rc2i) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2ixy(*_date1, *_date2, *_x, *_y, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2ixys( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- double (*_x); -- double (*_y); -- double (*_s); -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, x += s_x, y += s_y, s += s_s, rc2i += s_rc2i) { -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- if (!copy_rc2i) { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- eraC2ixys(*_x, *_y, *_s, *_rc2i); -- if (copy_rc2i) { -- copy_from_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- } --} -- --static void ufunc_loop_c2t00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double (*_tta); -- double (*_ttb); -- double (*_uta); -- double (*_utb); -- double (*_xp); -- double (*_yp); -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, tta += s_tta, ttb += s_ttb, uta += s_uta, utb += s_utb, xp += s_xp, yp += s_yp, rc2t += s_rc2t) { -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2t00a(*_tta, *_ttb, *_uta, *_utb, *_xp, *_yp, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2t00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double (*_tta); -- double (*_ttb); -- double (*_uta); -- double (*_utb); -- double (*_xp); -- double (*_yp); -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, tta += s_tta, ttb += s_ttb, uta += s_uta, utb += s_utb, xp += s_xp, yp += s_yp, rc2t += s_rc2t) { -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2t00b(*_tta, *_ttb, *_uta, *_utb, *_xp, *_yp, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2t06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double (*_tta); -- double (*_ttb); -- double (*_uta); -- double (*_utb); -- double (*_xp); -- double (*_yp); -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, tta += s_tta, ttb += s_ttb, uta += s_uta, utb += s_utb, xp += s_xp, yp += s_yp, rc2t += s_rc2t) { -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2t06a(*_tta, *_ttb, *_uta, *_utb, *_xp, *_yp, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2tcio( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rc2i = *args++; -- npy_intp s_rc2i = *steps++; -- char *era = *args++; -- npy_intp s_era = *steps++; -- char *rpom = *args++; -- npy_intp s_rpom = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double b_rc2i[3][3]; -- double (*_rc2i)[3][3] = &b_rc2i; -- double (*_era); -- double b_rpom[3][3]; -- double (*_rpom)[3][3] = &b_rpom; -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2i0 = *steps++; -- npy_intp is_rc2i1 = *steps++; -- int copy_rc2i = (is_rc2i1 != sizeof(double) && -- is_rc2i0 != 3 * sizeof(double)); -- npy_intp is_rpom0 = *steps++; -- npy_intp is_rpom1 = *steps++; -- int copy_rpom = (is_rpom1 != sizeof(double) && -- is_rpom0 != 3 * sizeof(double)); -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, rc2i += s_rc2i, era += s_era, rpom += s_rpom, rc2t += s_rc2t) { -- if (copy_rc2i) { -- copy_to_double33(rc2i, is_rc2i0, is_rc2i1, *_rc2i); -- } -- else { -- _rc2i = ((double (*)[3][3])rc2i); -- } -- _era = ((double (*))era); -- if (copy_rpom) { -- copy_to_double33(rpom, is_rpom0, is_rpom1, *_rpom); -- } -- else { -- _rpom = ((double (*)[3][3])rpom); -- } -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2tcio(*_rc2i, *_era, *_rpom, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2teqx( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- char *gst = *args++; -- npy_intp s_gst = *steps++; -- char *rpom = *args++; -- npy_intp s_rpom = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- double (*_gst); -- double b_rpom[3][3]; -- double (*_rpom)[3][3] = &b_rpom; -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- npy_intp is_rpom0 = *steps++; -- npy_intp is_rpom1 = *steps++; -- int copy_rpom = (is_rpom1 != sizeof(double) && -- is_rpom0 != 3 * sizeof(double)); -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, rbpn += s_rbpn, gst += s_gst, rpom += s_rpom, rc2t += s_rc2t) { -- if (copy_rbpn) { -- copy_to_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- else { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- _gst = ((double (*))gst); -- if (copy_rpom) { -- copy_to_double33(rpom, is_rpom0, is_rpom1, *_rpom); -- } -- else { -- _rpom = ((double (*)[3][3])rpom); -- } -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2teqx(*_rbpn, *_gst, *_rpom, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2tpe( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double (*_tta); -- double (*_ttb); -- double (*_uta); -- double (*_utb); -- double (*_dpsi); -- double (*_deps); -- double (*_xp); -- double (*_yp); -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, tta += s_tta, ttb += s_ttb, uta += s_uta, utb += s_utb, dpsi += s_dpsi, deps += s_deps, xp += s_xp, yp += s_yp, rc2t += s_rc2t) { -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2tpe(*_tta, *_ttb, *_uta, *_utb, *_dpsi, *_deps, *_xp, *_yp, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_c2txy( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *rc2t = *args++; -- npy_intp s_rc2t = *steps++; -- double (*_tta); -- double (*_ttb); -- double (*_uta); -- double (*_utb); -- double (*_x); -- double (*_y); -- double (*_xp); -- double (*_yp); -- double b_rc2t[3][3]; -- double (*_rc2t)[3][3] = &b_rc2t; -- npy_intp is_rc2t0 = *steps++; -- npy_intp is_rc2t1 = *steps++; -- int copy_rc2t = (is_rc2t1 != sizeof(double) && -- is_rc2t0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, tta += s_tta, ttb += s_ttb, uta += s_uta, utb += s_utb, x += s_x, y += s_y, xp += s_xp, yp += s_yp, rc2t += s_rc2t) { -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- if (!copy_rc2t) { -- _rc2t = ((double (*)[3][3])rc2t); -- } -- eraC2txy(*_tta, *_ttb, *_uta, *_utb, *_x, *_y, *_xp, *_yp, *_rc2t); -- if (copy_rc2t) { -- copy_from_double33(rc2t, is_rc2t0, is_rc2t1, *_rc2t); -- } -- } --} -- --static void ufunc_loop_eo06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEo06a(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_eors( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rnpb = *args++; -- npy_intp s_rnpb = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_rnpb[3][3]; -- double (*_rnpb)[3][3] = &b_rnpb; -- double (*_s); -- double _c_retval; -- npy_intp is_rnpb0 = *steps++; -- npy_intp is_rnpb1 = *steps++; -- int copy_rnpb = (is_rnpb1 != sizeof(double) && -- is_rnpb0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, rnpb += s_rnpb, s += s_s, c_retval += s_c_retval) { -- if (copy_rnpb) { -- copy_to_double33(rnpb, is_rnpb0, is_rnpb1, *_rnpb); -- } -- else { -- _rnpb = ((double (*)[3][3])rnpb); -- } -- _s = ((double (*))s); -- _c_retval = eraEors(*_rnpb, *_s); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fw2m( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *gamb = *args++; -- npy_intp s_gamb = *steps++; -- char *phib = *args++; -- npy_intp s_phib = *steps++; -- char *psi = *args++; -- npy_intp s_psi = *steps++; -- char *eps = *args++; -- npy_intp s_eps = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double (*_gamb); -- double (*_phib); -- double (*_psi); -- double (*_eps); -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, gamb += s_gamb, phib += s_phib, psi += s_psi, eps += s_eps, r += s_r) { -- _gamb = ((double (*))gamb); -- _phib = ((double (*))phib); -- _psi = ((double (*))psi); -- _eps = ((double (*))eps); -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- eraFw2m(*_gamb, *_phib, *_psi, *_eps, *_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_fw2xy( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *gamb = *args++; -- npy_intp s_gamb = *steps++; -- char *phib = *args++; -- npy_intp s_phib = *steps++; -- char *psi = *args++; -- npy_intp s_psi = *steps++; -- char *eps = *args++; -- npy_intp s_eps = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- double (*_gamb); -- double (*_phib); -- double (*_psi); -- double (*_eps); -- double (*_x); -- double (*_y); -- for (i_o = 0; i_o < n_o; -- i_o++, gamb += s_gamb, phib += s_phib, psi += s_psi, eps += s_eps, x += s_x, y += s_y) { -- _gamb = ((double (*))gamb); -- _phib = ((double (*))phib); -- _psi = ((double (*))psi); -- _eps = ((double (*))eps); -- _x = ((double (*))x); -- _y = ((double (*))y); -- eraFw2xy(*_gamb, *_phib, *_psi, *_eps, _x, _y); -- } --} -- --static void ufunc_loop_ltp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- double (*_epj); -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, rp += s_rp) { -- _epj = ((double (*))epj); -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- eraLtp(*_epj, *_rp); -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- } --} -- --static void ufunc_loop_ltpb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *rpb = *args++; -- npy_intp s_rpb = *steps++; -- double (*_epj); -- double b_rpb[3][3]; -- double (*_rpb)[3][3] = &b_rpb; -- npy_intp is_rpb0 = *steps++; -- npy_intp is_rpb1 = *steps++; -- int copy_rpb = (is_rpb1 != sizeof(double) && -- is_rpb0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, rpb += s_rpb) { -- _epj = ((double (*))epj); -- if (!copy_rpb) { -- _rpb = ((double (*)[3][3])rpb); -- } -- eraLtpb(*_epj, *_rpb); -- if (copy_rpb) { -- copy_from_double33(rpb, is_rpb0, is_rpb1, *_rpb); -- } -- } --} -- --static void ufunc_loop_ltpecl( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *vec = *args++; -- npy_intp s_vec = *steps++; -- double (*_epj); -- double b_vec[3]; -- double (*_vec)[3] = &b_vec; -- npy_intp is_vec0 = *steps++; -- int copy_vec = (is_vec0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, vec += s_vec) { -- _epj = ((double (*))epj); -- if (!copy_vec) { -- _vec = ((double (*)[3])vec); -- } -- eraLtpecl(*_epj, *_vec); -- if (copy_vec) { -- copy_from_double3(vec, is_vec0, *_vec); -- } -- } --} -- --static void ufunc_loop_ltpequ( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *veq = *args++; -- npy_intp s_veq = *steps++; -- double (*_epj); -- double b_veq[3]; -- double (*_veq)[3] = &b_veq; -- npy_intp is_veq0 = *steps++; -- int copy_veq = (is_veq0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, veq += s_veq) { -- _epj = ((double (*))epj); -- if (!copy_veq) { -- _veq = ((double (*)[3])veq); -- } -- eraLtpequ(*_epj, *_veq); -- if (copy_veq) { -- copy_from_double3(veq, is_veq0, *_veq); -- } -- } --} -- --static void ufunc_loop_num00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatn = *args++; -- npy_intp s_rmatn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatn[3][3]; -- double (*_rmatn)[3][3] = &b_rmatn; -- npy_intp is_rmatn0 = *steps++; -- npy_intp is_rmatn1 = *steps++; -- int copy_rmatn = (is_rmatn1 != sizeof(double) && -- is_rmatn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatn += s_rmatn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatn) { -- _rmatn = ((double (*)[3][3])rmatn); -- } -- eraNum00a(*_date1, *_date2, *_rmatn); -- if (copy_rmatn) { -- copy_from_double33(rmatn, is_rmatn0, is_rmatn1, *_rmatn); -- } -- } --} -- --static void ufunc_loop_num00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatn = *args++; -- npy_intp s_rmatn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatn[3][3]; -- double (*_rmatn)[3][3] = &b_rmatn; -- npy_intp is_rmatn0 = *steps++; -- npy_intp is_rmatn1 = *steps++; -- int copy_rmatn = (is_rmatn1 != sizeof(double) && -- is_rmatn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatn += s_rmatn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatn) { -- _rmatn = ((double (*)[3][3])rmatn); -- } -- eraNum00b(*_date1, *_date2, *_rmatn); -- if (copy_rmatn) { -- copy_from_double33(rmatn, is_rmatn0, is_rmatn1, *_rmatn); -- } -- } --} -- --static void ufunc_loop_num06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatn = *args++; -- npy_intp s_rmatn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatn[3][3]; -- double (*_rmatn)[3][3] = &b_rmatn; -- npy_intp is_rmatn0 = *steps++; -- npy_intp is_rmatn1 = *steps++; -- int copy_rmatn = (is_rmatn1 != sizeof(double) && -- is_rmatn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatn += s_rmatn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatn) { -- _rmatn = ((double (*)[3][3])rmatn); -- } -- eraNum06a(*_date1, *_date2, *_rmatn); -- if (copy_rmatn) { -- copy_from_double33(rmatn, is_rmatn0, is_rmatn1, *_rmatn); -- } -- } --} -- --static void ufunc_loop_numat( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *rmatn = *args++; -- npy_intp s_rmatn = *steps++; -- double (*_epsa); -- double (*_dpsi); -- double (*_deps); -- double b_rmatn[3][3]; -- double (*_rmatn)[3][3] = &b_rmatn; -- npy_intp is_rmatn0 = *steps++; -- npy_intp is_rmatn1 = *steps++; -- int copy_rmatn = (is_rmatn1 != sizeof(double) && -- is_rmatn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epsa += s_epsa, dpsi += s_dpsi, deps += s_deps, rmatn += s_rmatn) { -- _epsa = ((double (*))epsa); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- if (!copy_rmatn) { -- _rmatn = ((double (*)[3][3])rmatn); -- } -- eraNumat(*_epsa, *_dpsi, *_deps, *_rmatn); -- if (copy_rmatn) { -- copy_from_double33(rmatn, is_rmatn0, is_rmatn1, *_rmatn); -- } -- } --} -- --static void ufunc_loop_nut00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- eraNut00a(*_date1, *_date2, _dpsi, _deps); -- } --} -- --static void ufunc_loop_nut00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- eraNut00b(*_date1, *_date2, _dpsi, _deps); -- } --} -- --static void ufunc_loop_nut06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- eraNut06a(*_date1, *_date2, _dpsi, _deps); -- } --} -- --static void ufunc_loop_nut80( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- eraNut80(*_date1, *_date2, _dpsi, _deps); -- } --} -- --static void ufunc_loop_nutm80( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatn = *args++; -- npy_intp s_rmatn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatn[3][3]; -- double (*_rmatn)[3][3] = &b_rmatn; -- npy_intp is_rmatn0 = *steps++; -- npy_intp is_rmatn1 = *steps++; -- int copy_rmatn = (is_rmatn1 != sizeof(double) && -- is_rmatn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatn += s_rmatn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatn) { -- _rmatn = ((double (*)[3][3])rmatn); -- } -- eraNutm80(*_date1, *_date2, *_rmatn); -- if (copy_rmatn) { -- copy_from_double33(rmatn, is_rmatn0, is_rmatn1, *_rmatn); -- } -- } --} -- --static void ufunc_loop_obl06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraObl06(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_obl80( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraObl80(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_p06e( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *eps0 = *args++; -- npy_intp s_eps0 = *steps++; -- char *psia = *args++; -- npy_intp s_psia = *steps++; -- char *oma = *args++; -- npy_intp s_oma = *steps++; -- char *bpa = *args++; -- npy_intp s_bpa = *steps++; -- char *bqa = *args++; -- npy_intp s_bqa = *steps++; -- char *pia = *args++; -- npy_intp s_pia = *steps++; -- char *bpia = *args++; -- npy_intp s_bpia = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *chia = *args++; -- npy_intp s_chia = *steps++; -- char *za = *args++; -- npy_intp s_za = *steps++; -- char *zetaa = *args++; -- npy_intp s_zetaa = *steps++; -- char *thetaa = *args++; -- npy_intp s_thetaa = *steps++; -- char *pa = *args++; -- npy_intp s_pa = *steps++; -- char *gam = *args++; -- npy_intp s_gam = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *psi = *args++; -- npy_intp s_psi = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_eps0); -- double (*_psia); -- double (*_oma); -- double (*_bpa); -- double (*_bqa); -- double (*_pia); -- double (*_bpia); -- double (*_epsa); -- double (*_chia); -- double (*_za); -- double (*_zetaa); -- double (*_thetaa); -- double (*_pa); -- double (*_gam); -- double (*_phi); -- double (*_psi); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, eps0 += s_eps0, psia += s_psia, oma += s_oma, bpa += s_bpa, bqa += s_bqa, pia += s_pia, bpia += s_bpia, epsa += s_epsa, chia += s_chia, za += s_za, zetaa += s_zetaa, thetaa += s_thetaa, pa += s_pa, gam += s_gam, phi += s_phi, psi += s_psi) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _eps0 = ((double (*))eps0); -- _psia = ((double (*))psia); -- _oma = ((double (*))oma); -- _bpa = ((double (*))bpa); -- _bqa = ((double (*))bqa); -- _pia = ((double (*))pia); -- _bpia = ((double (*))bpia); -- _epsa = ((double (*))epsa); -- _chia = ((double (*))chia); -- _za = ((double (*))za); -- _zetaa = ((double (*))zetaa); -- _thetaa = ((double (*))thetaa); -- _pa = ((double (*))pa); -- _gam = ((double (*))gam); -- _phi = ((double (*))phi); -- _psi = ((double (*))psi); -- eraP06e(*_date1, *_date2, _eps0, _psia, _oma, _bpa, _bqa, _pia, _bpia, _epsa, _chia, _za, _zetaa, _thetaa, _pa, _gam, _phi, _psi); -- } --} -- --static void ufunc_loop_pb06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *bzeta = *args++; -- npy_intp s_bzeta = *steps++; -- char *bz = *args++; -- npy_intp s_bz = *steps++; -- char *btheta = *args++; -- npy_intp s_btheta = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_bzeta); -- double (*_bz); -- double (*_btheta); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, bzeta += s_bzeta, bz += s_bz, btheta += s_btheta) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _bzeta = ((double (*))bzeta); -- _bz = ((double (*))bz); -- _btheta = ((double (*))btheta); -- eraPb06(*_date1, *_date2, _bzeta, _bz, _btheta); -- } --} -- --static void ufunc_loop_pfw06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *gamb = *args++; -- npy_intp s_gamb = *steps++; -- char *phib = *args++; -- npy_intp s_phib = *steps++; -- char *psib = *args++; -- npy_intp s_psib = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_gamb); -- double (*_phib); -- double (*_psib); -- double (*_epsa); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, gamb += s_gamb, phib += s_phib, psib += s_psib, epsa += s_epsa) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _gamb = ((double (*))gamb); -- _phib = ((double (*))phib); -- _psib = ((double (*))psib); -- _epsa = ((double (*))epsa); -- eraPfw06(*_date1, *_date2, _gamb, _phib, _psib, _epsa); -- } --} -- --static void ufunc_loop_pmat00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rbp += s_rbp) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- eraPmat00(*_date1, *_date2, *_rbp); -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- } --} -- --static void ufunc_loop_pmat06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rbp += s_rbp) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- eraPmat06(*_date1, *_date2, *_rbp); -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- } --} -- --static void ufunc_loop_pmat76( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatp = *args++; -- npy_intp s_rmatp = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatp[3][3]; -- double (*_rmatp)[3][3] = &b_rmatp; -- npy_intp is_rmatp0 = *steps++; -- npy_intp is_rmatp1 = *steps++; -- int copy_rmatp = (is_rmatp1 != sizeof(double) && -- is_rmatp0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatp += s_rmatp) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatp) { -- _rmatp = ((double (*)[3][3])rmatp); -- } -- eraPmat76(*_date1, *_date2, *_rmatp); -- if (copy_rmatp) { -- copy_from_double33(rmatp, is_rmatp0, is_rmatp1, *_rmatp); -- } -- } --} -- --static void ufunc_loop_pn00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- char *rn = *args++; -- npy_intp s_rn = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- double (*_epsa); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- double b_rn[3][3]; -- double (*_rn)[3][3] = &b_rn; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- npy_intp is_rn0 = *steps++; -- npy_intp is_rn1 = *steps++; -- int copy_rn = (is_rn1 != sizeof(double) && -- is_rn0 != 3 * sizeof(double)); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps, epsa += s_epsa, rb += s_rb, rp += s_rp, rbp += s_rbp, rn += s_rn, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _epsa = ((double (*))epsa); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- if (!copy_rn) { -- _rn = ((double (*)[3][3])rn); -- } -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPn00(*_date1, *_date2, *_dpsi, *_deps, _epsa, *_rb, *_rp, *_rbp, *_rn, *_rbpn); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- if (copy_rn) { -- copy_from_double33(rn, is_rn0, is_rn1, *_rn); -- } -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pn00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- char *rn = *args++; -- npy_intp s_rn = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- double (*_epsa); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- double b_rn[3][3]; -- double (*_rn)[3][3] = &b_rn; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- npy_intp is_rn0 = *steps++; -- npy_intp is_rn1 = *steps++; -- int copy_rn = (is_rn1 != sizeof(double) && -- is_rn0 != 3 * sizeof(double)); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps, epsa += s_epsa, rb += s_rb, rp += s_rp, rbp += s_rbp, rn += s_rn, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _epsa = ((double (*))epsa); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- if (!copy_rn) { -- _rn = ((double (*)[3][3])rn); -- } -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPn00a(*_date1, *_date2, _dpsi, _deps, _epsa, *_rb, *_rp, *_rbp, *_rn, *_rbpn); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- if (copy_rn) { -- copy_from_double33(rn, is_rn0, is_rn1, *_rn); -- } -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pn00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- char *rn = *args++; -- npy_intp s_rn = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- double (*_epsa); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- double b_rn[3][3]; -- double (*_rn)[3][3] = &b_rn; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- npy_intp is_rn0 = *steps++; -- npy_intp is_rn1 = *steps++; -- int copy_rn = (is_rn1 != sizeof(double) && -- is_rn0 != 3 * sizeof(double)); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps, epsa += s_epsa, rb += s_rb, rp += s_rp, rbp += s_rbp, rn += s_rn, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _epsa = ((double (*))epsa); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- if (!copy_rn) { -- _rn = ((double (*)[3][3])rn); -- } -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPn00b(*_date1, *_date2, _dpsi, _deps, _epsa, *_rb, *_rp, *_rbp, *_rn, *_rbpn); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- if (copy_rn) { -- copy_from_double33(rn, is_rn0, is_rn1, *_rn); -- } -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pn06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- char *rn = *args++; -- npy_intp s_rn = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- double (*_epsa); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- double b_rn[3][3]; -- double (*_rn)[3][3] = &b_rn; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- npy_intp is_rn0 = *steps++; -- npy_intp is_rn1 = *steps++; -- int copy_rn = (is_rn1 != sizeof(double) && -- is_rn0 != 3 * sizeof(double)); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps, epsa += s_epsa, rb += s_rb, rp += s_rp, rbp += s_rbp, rn += s_rn, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _epsa = ((double (*))epsa); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- if (!copy_rn) { -- _rn = ((double (*)[3][3])rn); -- } -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPn06(*_date1, *_date2, *_dpsi, *_deps, _epsa, *_rb, *_rp, *_rbp, *_rn, *_rbpn); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- if (copy_rn) { -- copy_from_double33(rn, is_rn0, is_rn1, *_rn); -- } -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pn06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *deps = *args++; -- npy_intp s_deps = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *rb = *args++; -- npy_intp s_rb = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- char *rbp = *args++; -- npy_intp s_rbp = *steps++; -- char *rn = *args++; -- npy_intp s_rn = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsi); -- double (*_deps); -- double (*_epsa); -- double b_rb[3][3]; -- double (*_rb)[3][3] = &b_rb; -- double b_rp[3][3]; -- double (*_rp)[3][3] = &b_rp; -- double b_rbp[3][3]; -- double (*_rbp)[3][3] = &b_rbp; -- double b_rn[3][3]; -- double (*_rn)[3][3] = &b_rn; -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rb0 = *steps++; -- npy_intp is_rb1 = *steps++; -- int copy_rb = (is_rb1 != sizeof(double) && -- is_rb0 != 3 * sizeof(double)); -- npy_intp is_rp0 = *steps++; -- npy_intp is_rp1 = *steps++; -- int copy_rp = (is_rp1 != sizeof(double) && -- is_rp0 != 3 * sizeof(double)); -- npy_intp is_rbp0 = *steps++; -- npy_intp is_rbp1 = *steps++; -- int copy_rbp = (is_rbp1 != sizeof(double) && -- is_rbp0 != 3 * sizeof(double)); -- npy_intp is_rn0 = *steps++; -- npy_intp is_rn1 = *steps++; -- int copy_rn = (is_rn1 != sizeof(double) && -- is_rn0 != 3 * sizeof(double)); -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsi += s_dpsi, deps += s_deps, epsa += s_epsa, rb += s_rb, rp += s_rp, rbp += s_rbp, rn += s_rn, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsi = ((double (*))dpsi); -- _deps = ((double (*))deps); -- _epsa = ((double (*))epsa); -- if (!copy_rb) { -- _rb = ((double (*)[3][3])rb); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3][3])rp); -- } -- if (!copy_rbp) { -- _rbp = ((double (*)[3][3])rbp); -- } -- if (!copy_rn) { -- _rn = ((double (*)[3][3])rn); -- } -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPn06a(*_date1, *_date2, _dpsi, _deps, _epsa, *_rb, *_rp, *_rbp, *_rn, *_rbpn); -- if (copy_rb) { -- copy_from_double33(rb, is_rb0, is_rb1, *_rb); -- } -- if (copy_rp) { -- copy_from_double33(rp, is_rp0, is_rp1, *_rp); -- } -- if (copy_rbp) { -- copy_from_double33(rbp, is_rbp0, is_rbp1, *_rbp); -- } -- if (copy_rn) { -- copy_from_double33(rn, is_rn0, is_rn1, *_rn); -- } -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pnm00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPnm00a(*_date1, *_date2, *_rbpn); -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pnm00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rbpn = *args++; -- npy_intp s_rbpn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rbpn[3][3]; -- double (*_rbpn)[3][3] = &b_rbpn; -- npy_intp is_rbpn0 = *steps++; -- npy_intp is_rbpn1 = *steps++; -- int copy_rbpn = (is_rbpn1 != sizeof(double) && -- is_rbpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rbpn += s_rbpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rbpn) { -- _rbpn = ((double (*)[3][3])rbpn); -- } -- eraPnm00b(*_date1, *_date2, *_rbpn); -- if (copy_rbpn) { -- copy_from_double33(rbpn, is_rbpn0, is_rbpn1, *_rbpn); -- } -- } --} -- --static void ufunc_loop_pnm06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rnpb = *args++; -- npy_intp s_rnpb = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rnpb[3][3]; -- double (*_rnpb)[3][3] = &b_rnpb; -- npy_intp is_rnpb0 = *steps++; -- npy_intp is_rnpb1 = *steps++; -- int copy_rnpb = (is_rnpb1 != sizeof(double) && -- is_rnpb0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rnpb += s_rnpb) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rnpb) { -- _rnpb = ((double (*)[3][3])rnpb); -- } -- eraPnm06a(*_date1, *_date2, *_rnpb); -- if (copy_rnpb) { -- copy_from_double33(rnpb, is_rnpb0, is_rnpb1, *_rnpb); -- } -- } --} -- --static void ufunc_loop_pnm80( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rmatpn = *args++; -- npy_intp s_rmatpn = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rmatpn[3][3]; -- double (*_rmatpn)[3][3] = &b_rmatpn; -- npy_intp is_rmatpn0 = *steps++; -- npy_intp is_rmatpn1 = *steps++; -- int copy_rmatpn = (is_rmatpn1 != sizeof(double) && -- is_rmatpn0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rmatpn += s_rmatpn) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rmatpn) { -- _rmatpn = ((double (*)[3][3])rmatpn); -- } -- eraPnm80(*_date1, *_date2, *_rmatpn); -- if (copy_rmatpn) { -- copy_from_double33(rmatpn, is_rmatpn0, is_rmatpn1, *_rmatpn); -- } -- } --} -- --static void ufunc_loop_pom00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *xp = *args++; -- npy_intp s_xp = *steps++; -- char *yp = *args++; -- npy_intp s_yp = *steps++; -- char *sp = *args++; -- npy_intp s_sp = *steps++; -- char *rpom = *args++; -- npy_intp s_rpom = *steps++; -- double (*_xp); -- double (*_yp); -- double (*_sp); -- double b_rpom[3][3]; -- double (*_rpom)[3][3] = &b_rpom; -- npy_intp is_rpom0 = *steps++; -- npy_intp is_rpom1 = *steps++; -- int copy_rpom = (is_rpom1 != sizeof(double) && -- is_rpom0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, xp += s_xp, yp += s_yp, sp += s_sp, rpom += s_rpom) { -- _xp = ((double (*))xp); -- _yp = ((double (*))yp); -- _sp = ((double (*))sp); -- if (!copy_rpom) { -- _rpom = ((double (*)[3][3])rpom); -- } -- eraPom00(*_xp, *_yp, *_sp, *_rpom); -- if (copy_rpom) { -- copy_from_double33(rpom, is_rpom0, is_rpom1, *_rpom); -- } -- } --} -- --static void ufunc_loop_pr00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dpsipr = *args++; -- npy_intp s_dpsipr = *steps++; -- char *depspr = *args++; -- npy_intp s_depspr = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dpsipr); -- double (*_depspr); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dpsipr += s_dpsipr, depspr += s_depspr) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dpsipr = ((double (*))dpsipr); -- _depspr = ((double (*))depspr); -- eraPr00(*_date1, *_date2, _dpsipr, _depspr); -- } --} -- --static void ufunc_loop_prec76( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date01 = *args++; -- npy_intp s_date01 = *steps++; -- char *date02 = *args++; -- npy_intp s_date02 = *steps++; -- char *date11 = *args++; -- npy_intp s_date11 = *steps++; -- char *date12 = *args++; -- npy_intp s_date12 = *steps++; -- char *zeta = *args++; -- npy_intp s_zeta = *steps++; -- char *z = *args++; -- npy_intp s_z = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- double (*_date01); -- double (*_date02); -- double (*_date11); -- double (*_date12); -- double (*_zeta); -- double (*_z); -- double (*_theta); -- for (i_o = 0; i_o < n_o; -- i_o++, date01 += s_date01, date02 += s_date02, date11 += s_date11, date12 += s_date12, zeta += s_zeta, z += s_z, theta += s_theta) { -- _date01 = ((double (*))date01); -- _date02 = ((double (*))date02); -- _date11 = ((double (*))date11); -- _date12 = ((double (*))date12); -- _zeta = ((double (*))zeta); -- _z = ((double (*))z); -- _theta = ((double (*))theta); -- eraPrec76(*_date01, *_date02, *_date11, *_date12, _zeta, _z, _theta); -- } --} -- --static void ufunc_loop_s00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _c_retval = eraS00(*_date1, *_date2, *_x, *_y); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_s00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraS00a(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_s00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraS00b(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_s06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _c_retval = eraS06(*_date1, *_date2, *_x, *_y); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_s06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraS06a(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_sp00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraSp00(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_xy06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- eraXy06(*_date1, *_date2, _x, _y); -- } --} -- --static void ufunc_loop_xys00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double (*_s); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, s += s_s) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- eraXys00a(*_date1, *_date2, _x, _y, _s); -- } --} -- --static void ufunc_loop_xys00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double (*_s); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, s += s_s) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- eraXys00b(*_date1, *_date2, _x, _y, _s); -- } --} -- --static void ufunc_loop_xys06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *x = *args++; -- npy_intp s_x = *steps++; -- char *y = *args++; -- npy_intp s_y = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_x); -- double (*_y); -- double (*_s); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, x += s_x, y += s_y, s += s_s) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _x = ((double (*))x); -- _y = ((double (*))y); -- _s = ((double (*))s); -- eraXys06a(*_date1, *_date2, _x, _y, _s); -- } --} -- --static void ufunc_loop_ee00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *epsa = *args++; -- npy_intp s_epsa = *steps++; -- char *dpsi = *args++; -- npy_intp s_dpsi = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_epsa); -- double (*_dpsi); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, epsa += s_epsa, dpsi += s_dpsi, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _epsa = ((double (*))epsa); -- _dpsi = ((double (*))dpsi); -- _c_retval = eraEe00(*_date1, *_date2, *_epsa, *_dpsi); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ee00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEe00a(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ee00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEe00b(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ee06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEe06a(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_eect00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEect00(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_eqeq94( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _c_retval = eraEqeq94(*_date1, *_date2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_era00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_dj1); -- double (*_dj2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, dj1 += s_dj1, dj2 += s_dj2, c_retval += s_c_retval) { -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _c_retval = eraEra00(*_dj1, *_dj2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gmst00( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double (*_tta); -- double (*_ttb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, tta += s_tta, ttb += s_ttb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _c_retval = eraGmst00(*_uta, *_utb, *_tta, *_ttb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gmst06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double (*_tta); -- double (*_ttb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, tta += s_tta, ttb += s_ttb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _c_retval = eraGmst06(*_uta, *_utb, *_tta, *_ttb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gmst82( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dj1 = *args++; -- npy_intp s_dj1 = *steps++; -- char *dj2 = *args++; -- npy_intp s_dj2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_dj1); -- double (*_dj2); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, dj1 += s_dj1, dj2 += s_dj2, c_retval += s_c_retval) { -- _dj1 = ((double (*))dj1); -- _dj2 = ((double (*))dj2); -- _c_retval = eraGmst82(*_dj1, *_dj2); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gst00a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double (*_tta); -- double (*_ttb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, tta += s_tta, ttb += s_ttb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _c_retval = eraGst00a(*_uta, *_utb, *_tta, *_ttb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gst00b( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _c_retval = eraGst00b(*_uta, *_utb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gst06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *rnpb = *args++; -- npy_intp s_rnpb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double (*_tta); -- double (*_ttb); -- double b_rnpb[3][3]; -- double (*_rnpb)[3][3] = &b_rnpb; -- double _c_retval; -- npy_intp is_rnpb0 = *steps++; -- npy_intp is_rnpb1 = *steps++; -- int copy_rnpb = (is_rnpb1 != sizeof(double) && -- is_rnpb0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, tta += s_tta, ttb += s_ttb, rnpb += s_rnpb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- if (copy_rnpb) { -- copy_to_double33(rnpb, is_rnpb0, is_rnpb1, *_rnpb); -- } -- else { -- _rnpb = ((double (*)[3][3])rnpb); -- } -- _c_retval = eraGst06(*_uta, *_utb, *_tta, *_ttb, *_rnpb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gst06a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *tta = *args++; -- npy_intp s_tta = *steps++; -- char *ttb = *args++; -- npy_intp s_ttb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double (*_tta); -- double (*_ttb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, tta += s_tta, ttb += s_ttb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _tta = ((double (*))tta); -- _ttb = ((double (*))ttb); -- _c_retval = eraGst06a(*_uta, *_utb, *_tta, *_ttb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gst94( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *uta = *args++; -- npy_intp s_uta = *steps++; -- char *utb = *args++; -- npy_intp s_utb = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_uta); -- double (*_utb); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, uta += s_uta, utb += s_utb, c_retval += s_c_retval) { -- _uta = ((double (*))uta); -- _utb = ((double (*))utb); -- _c_retval = eraGst94(*_uta, *_utb); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_pvstar( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *ra = *args++; -- npy_intp s_ra = *steps++; -- char *dec = *args++; -- npy_intp s_dec = *steps++; -- char *pmr = *args++; -- npy_intp s_pmr = *steps++; -- char *pmd = *args++; -- npy_intp s_pmd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_pv)[2][3]; -- double (*_ra); -- double (*_dec); -- double (*_pmr); -- double (*_pmd); -- double (*_px); -- double (*_rv); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, ra += s_ra, dec += s_dec, pmr += s_pmr, pmd += s_pmd, px += s_px, rv += s_rv, c_retval += s_c_retval) { -- _pv = ((double (*)[2][3])pv); -- _ra = ((double (*))ra); -- _dec = ((double (*))dec); -- _pmr = ((double (*))pmr); -- _pmd = ((double (*))pmd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _c_retval = eraPvstar(*_pv, _ra, _dec, _pmr, _pmd, _px, _rv); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_starpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ra = *args++; -- npy_intp s_ra = *steps++; -- char *dec = *args++; -- npy_intp s_dec = *steps++; -- char *pmr = *args++; -- npy_intp s_pmr = *steps++; -- char *pmd = *args++; -- npy_intp s_pmd = *steps++; -- char *px = *args++; -- npy_intp s_px = *steps++; -- char *rv = *args++; -- npy_intp s_rv = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ra); -- double (*_dec); -- double (*_pmr); -- double (*_pmd); -- double (*_px); -- double (*_rv); -- double (*_pv)[2][3]; -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ra += s_ra, dec += s_dec, pmr += s_pmr, pmd += s_pmd, px += s_px, rv += s_rv, pv += s_pv, c_retval += s_c_retval) { -- _ra = ((double (*))ra); -- _dec = ((double (*))dec); -- _pmr = ((double (*))pmr); -- _pmd = ((double (*))pmd); -- _px = ((double (*))px); -- _rv = ((double (*))rv); -- _pv = ((double (*)[2][3])pv); -- _c_retval = eraStarpv(*_ra, *_dec, *_pmr, *_pmd, *_px, *_rv, *_pv); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_fk425( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r1950 = *args++; -- npy_intp s_r1950 = *steps++; -- char *d1950 = *args++; -- npy_intp s_d1950 = *steps++; -- char *dr1950 = *args++; -- npy_intp s_dr1950 = *steps++; -- char *dd1950 = *args++; -- npy_intp s_dd1950 = *steps++; -- char *p1950 = *args++; -- npy_intp s_p1950 = *steps++; -- char *v1950 = *args++; -- npy_intp s_v1950 = *steps++; -- char *r2000 = *args++; -- npy_intp s_r2000 = *steps++; -- char *d2000 = *args++; -- npy_intp s_d2000 = *steps++; -- char *dr2000 = *args++; -- npy_intp s_dr2000 = *steps++; -- char *dd2000 = *args++; -- npy_intp s_dd2000 = *steps++; -- char *p2000 = *args++; -- npy_intp s_p2000 = *steps++; -- char *v2000 = *args++; -- npy_intp s_v2000 = *steps++; -- double (*_r1950); -- double (*_d1950); -- double (*_dr1950); -- double (*_dd1950); -- double (*_p1950); -- double (*_v1950); -- double (*_r2000); -- double (*_d2000); -- double (*_dr2000); -- double (*_dd2000); -- double (*_p2000); -- double (*_v2000); -- for (i_o = 0; i_o < n_o; -- i_o++, r1950 += s_r1950, d1950 += s_d1950, dr1950 += s_dr1950, dd1950 += s_dd1950, p1950 += s_p1950, v1950 += s_v1950, r2000 += s_r2000, d2000 += s_d2000, dr2000 += s_dr2000, dd2000 += s_dd2000, p2000 += s_p2000, v2000 += s_v2000) { -- _r1950 = ((double (*))r1950); -- _d1950 = ((double (*))d1950); -- _dr1950 = ((double (*))dr1950); -- _dd1950 = ((double (*))dd1950); -- _p1950 = ((double (*))p1950); -- _v1950 = ((double (*))v1950); -- _r2000 = ((double (*))r2000); -- _d2000 = ((double (*))d2000); -- _dr2000 = ((double (*))dr2000); -- _dd2000 = ((double (*))dd2000); -- _p2000 = ((double (*))p2000); -- _v2000 = ((double (*))v2000); -- eraFk425(*_r1950, *_d1950, *_dr1950, *_dd1950, *_p1950, *_v1950, _r2000, _d2000, _dr2000, _dd2000, _p2000, _v2000); -- } --} -- --static void ufunc_loop_fk45z( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r1950 = *args++; -- npy_intp s_r1950 = *steps++; -- char *d1950 = *args++; -- npy_intp s_d1950 = *steps++; -- char *bepoch = *args++; -- npy_intp s_bepoch = *steps++; -- char *r2000 = *args++; -- npy_intp s_r2000 = *steps++; -- char *d2000 = *args++; -- npy_intp s_d2000 = *steps++; -- double (*_r1950); -- double (*_d1950); -- double (*_bepoch); -- double (*_r2000); -- double (*_d2000); -- for (i_o = 0; i_o < n_o; -- i_o++, r1950 += s_r1950, d1950 += s_d1950, bepoch += s_bepoch, r2000 += s_r2000, d2000 += s_d2000) { -- _r1950 = ((double (*))r1950); -- _d1950 = ((double (*))d1950); -- _bepoch = ((double (*))bepoch); -- _r2000 = ((double (*))r2000); -- _d2000 = ((double (*))d2000); -- eraFk45z(*_r1950, *_d1950, *_bepoch, _r2000, _d2000); -- } --} -- --static void ufunc_loop_fk524( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r2000 = *args++; -- npy_intp s_r2000 = *steps++; -- char *d2000 = *args++; -- npy_intp s_d2000 = *steps++; -- char *dr2000 = *args++; -- npy_intp s_dr2000 = *steps++; -- char *dd2000 = *args++; -- npy_intp s_dd2000 = *steps++; -- char *p2000 = *args++; -- npy_intp s_p2000 = *steps++; -- char *v2000 = *args++; -- npy_intp s_v2000 = *steps++; -- char *r1950 = *args++; -- npy_intp s_r1950 = *steps++; -- char *d1950 = *args++; -- npy_intp s_d1950 = *steps++; -- char *dr1950 = *args++; -- npy_intp s_dr1950 = *steps++; -- char *dd1950 = *args++; -- npy_intp s_dd1950 = *steps++; -- char *p1950 = *args++; -- npy_intp s_p1950 = *steps++; -- char *v1950 = *args++; -- npy_intp s_v1950 = *steps++; -- double (*_r2000); -- double (*_d2000); -- double (*_dr2000); -- double (*_dd2000); -- double (*_p2000); -- double (*_v2000); -- double (*_r1950); -- double (*_d1950); -- double (*_dr1950); -- double (*_dd1950); -- double (*_p1950); -- double (*_v1950); -- for (i_o = 0; i_o < n_o; -- i_o++, r2000 += s_r2000, d2000 += s_d2000, dr2000 += s_dr2000, dd2000 += s_dd2000, p2000 += s_p2000, v2000 += s_v2000, r1950 += s_r1950, d1950 += s_d1950, dr1950 += s_dr1950, dd1950 += s_dd1950, p1950 += s_p1950, v1950 += s_v1950) { -- _r2000 = ((double (*))r2000); -- _d2000 = ((double (*))d2000); -- _dr2000 = ((double (*))dr2000); -- _dd2000 = ((double (*))dd2000); -- _p2000 = ((double (*))p2000); -- _v2000 = ((double (*))v2000); -- _r1950 = ((double (*))r1950); -- _d1950 = ((double (*))d1950); -- _dr1950 = ((double (*))dr1950); -- _dd1950 = ((double (*))dd1950); -- _p1950 = ((double (*))p1950); -- _v1950 = ((double (*))v1950); -- eraFk524(*_r2000, *_d2000, *_dr2000, *_dd2000, *_p2000, *_v2000, _r1950, _d1950, _dr1950, _dd1950, _p1950, _v1950); -- } --} -- --static void ufunc_loop_fk52h( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r5 = *args++; -- npy_intp s_r5 = *steps++; -- char *d5 = *args++; -- npy_intp s_d5 = *steps++; -- char *dr5 = *args++; -- npy_intp s_dr5 = *steps++; -- char *dd5 = *args++; -- npy_intp s_dd5 = *steps++; -- char *px5 = *args++; -- npy_intp s_px5 = *steps++; -- char *rv5 = *args++; -- npy_intp s_rv5 = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *dh = *args++; -- npy_intp s_dh = *steps++; -- char *drh = *args++; -- npy_intp s_drh = *steps++; -- char *ddh = *args++; -- npy_intp s_ddh = *steps++; -- char *pxh = *args++; -- npy_intp s_pxh = *steps++; -- char *rvh = *args++; -- npy_intp s_rvh = *steps++; -- double (*_r5); -- double (*_d5); -- double (*_dr5); -- double (*_dd5); -- double (*_px5); -- double (*_rv5); -- double (*_rh); -- double (*_dh); -- double (*_drh); -- double (*_ddh); -- double (*_pxh); -- double (*_rvh); -- for (i_o = 0; i_o < n_o; -- i_o++, r5 += s_r5, d5 += s_d5, dr5 += s_dr5, dd5 += s_dd5, px5 += s_px5, rv5 += s_rv5, rh += s_rh, dh += s_dh, drh += s_drh, ddh += s_ddh, pxh += s_pxh, rvh += s_rvh) { -- _r5 = ((double (*))r5); -- _d5 = ((double (*))d5); -- _dr5 = ((double (*))dr5); -- _dd5 = ((double (*))dd5); -- _px5 = ((double (*))px5); -- _rv5 = ((double (*))rv5); -- _rh = ((double (*))rh); -- _dh = ((double (*))dh); -- _drh = ((double (*))drh); -- _ddh = ((double (*))ddh); -- _pxh = ((double (*))pxh); -- _rvh = ((double (*))rvh); -- eraFk52h(*_r5, *_d5, *_dr5, *_dd5, *_px5, *_rv5, _rh, _dh, _drh, _ddh, _pxh, _rvh); -- } --} -- --static void ufunc_loop_fk54z( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r2000 = *args++; -- npy_intp s_r2000 = *steps++; -- char *d2000 = *args++; -- npy_intp s_d2000 = *steps++; -- char *bepoch = *args++; -- npy_intp s_bepoch = *steps++; -- char *r1950 = *args++; -- npy_intp s_r1950 = *steps++; -- char *d1950 = *args++; -- npy_intp s_d1950 = *steps++; -- char *dr1950 = *args++; -- npy_intp s_dr1950 = *steps++; -- char *dd1950 = *args++; -- npy_intp s_dd1950 = *steps++; -- double (*_r2000); -- double (*_d2000); -- double (*_bepoch); -- double (*_r1950); -- double (*_d1950); -- double (*_dr1950); -- double (*_dd1950); -- for (i_o = 0; i_o < n_o; -- i_o++, r2000 += s_r2000, d2000 += s_d2000, bepoch += s_bepoch, r1950 += s_r1950, d1950 += s_d1950, dr1950 += s_dr1950, dd1950 += s_dd1950) { -- _r2000 = ((double (*))r2000); -- _d2000 = ((double (*))d2000); -- _bepoch = ((double (*))bepoch); -- _r1950 = ((double (*))r1950); -- _d1950 = ((double (*))d1950); -- _dr1950 = ((double (*))dr1950); -- _dd1950 = ((double (*))dd1950); -- eraFk54z(*_r2000, *_d2000, *_bepoch, _r1950, _d1950, _dr1950, _dd1950); -- } --} -- --static void ufunc_loop_fk5hip( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r5h = *args++; -- npy_intp s_r5h = *steps++; -- char *s5h = *args++; -- npy_intp s_s5h = *steps++; -- double b_r5h[3][3]; -- double (*_r5h)[3][3] = &b_r5h; -- double b_s5h[3]; -- double (*_s5h)[3] = &b_s5h; -- npy_intp is_r5h0 = *steps++; -- npy_intp is_r5h1 = *steps++; -- int copy_r5h = (is_r5h1 != sizeof(double) && -- is_r5h0 != 3 * sizeof(double)); -- npy_intp is_s5h0 = *steps++; -- int copy_s5h = (is_s5h0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r5h += s_r5h, s5h += s_s5h) { -- if (!copy_r5h) { -- _r5h = ((double (*)[3][3])r5h); -- } -- if (!copy_s5h) { -- _s5h = ((double (*)[3])s5h); -- } -- eraFk5hip(*_r5h, *_s5h); -- if (copy_r5h) { -- copy_from_double33(r5h, is_r5h0, is_r5h1, *_r5h); -- } -- if (copy_s5h) { -- copy_from_double3(s5h, is_s5h0, *_s5h); -- } -- } --} -- --static void ufunc_loop_fk5hz( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r5 = *args++; -- npy_intp s_r5 = *steps++; -- char *d5 = *args++; -- npy_intp s_d5 = *steps++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *dh = *args++; -- npy_intp s_dh = *steps++; -- double (*_r5); -- double (*_d5); -- double (*_date1); -- double (*_date2); -- double (*_rh); -- double (*_dh); -- for (i_o = 0; i_o < n_o; -- i_o++, r5 += s_r5, d5 += s_d5, date1 += s_date1, date2 += s_date2, rh += s_rh, dh += s_dh) { -- _r5 = ((double (*))r5); -- _d5 = ((double (*))d5); -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _rh = ((double (*))rh); -- _dh = ((double (*))dh); -- eraFk5hz(*_r5, *_d5, *_date1, *_date2, _rh, _dh); -- } --} -- --static void ufunc_loop_h2fk5( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *dh = *args++; -- npy_intp s_dh = *steps++; -- char *drh = *args++; -- npy_intp s_drh = *steps++; -- char *ddh = *args++; -- npy_intp s_ddh = *steps++; -- char *pxh = *args++; -- npy_intp s_pxh = *steps++; -- char *rvh = *args++; -- npy_intp s_rvh = *steps++; -- char *r5 = *args++; -- npy_intp s_r5 = *steps++; -- char *d5 = *args++; -- npy_intp s_d5 = *steps++; -- char *dr5 = *args++; -- npy_intp s_dr5 = *steps++; -- char *dd5 = *args++; -- npy_intp s_dd5 = *steps++; -- char *px5 = *args++; -- npy_intp s_px5 = *steps++; -- char *rv5 = *args++; -- npy_intp s_rv5 = *steps++; -- double (*_rh); -- double (*_dh); -- double (*_drh); -- double (*_ddh); -- double (*_pxh); -- double (*_rvh); -- double (*_r5); -- double (*_d5); -- double (*_dr5); -- double (*_dd5); -- double (*_px5); -- double (*_rv5); -- for (i_o = 0; i_o < n_o; -- i_o++, rh += s_rh, dh += s_dh, drh += s_drh, ddh += s_ddh, pxh += s_pxh, rvh += s_rvh, r5 += s_r5, d5 += s_d5, dr5 += s_dr5, dd5 += s_dd5, px5 += s_px5, rv5 += s_rv5) { -- _rh = ((double (*))rh); -- _dh = ((double (*))dh); -- _drh = ((double (*))drh); -- _ddh = ((double (*))ddh); -- _pxh = ((double (*))pxh); -- _rvh = ((double (*))rvh); -- _r5 = ((double (*))r5); -- _d5 = ((double (*))d5); -- _dr5 = ((double (*))dr5); -- _dd5 = ((double (*))dd5); -- _px5 = ((double (*))px5); -- _rv5 = ((double (*))rv5); -- eraH2fk5(*_rh, *_dh, *_drh, *_ddh, *_pxh, *_rvh, _r5, _d5, _dr5, _dd5, _px5, _rv5); -- } --} -- --static void ufunc_loop_hfk5z( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *rh = *args++; -- npy_intp s_rh = *steps++; -- char *dh = *args++; -- npy_intp s_dh = *steps++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *r5 = *args++; -- npy_intp s_r5 = *steps++; -- char *d5 = *args++; -- npy_intp s_d5 = *steps++; -- char *dr5 = *args++; -- npy_intp s_dr5 = *steps++; -- char *dd5 = *args++; -- npy_intp s_dd5 = *steps++; -- double (*_rh); -- double (*_dh); -- double (*_date1); -- double (*_date2); -- double (*_r5); -- double (*_d5); -- double (*_dr5); -- double (*_dd5); -- for (i_o = 0; i_o < n_o; -- i_o++, rh += s_rh, dh += s_dh, date1 += s_date1, date2 += s_date2, r5 += s_r5, d5 += s_d5, dr5 += s_dr5, dd5 += s_dd5) { -- _rh = ((double (*))rh); -- _dh = ((double (*))dh); -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _r5 = ((double (*))r5); -- _d5 = ((double (*))d5); -- _dr5 = ((double (*))dr5); -- _dd5 = ((double (*))dd5); -- eraHfk5z(*_rh, *_dh, *_date1, *_date2, _r5, _d5, _dr5, _dd5); -- } --} -- --static void ufunc_loop_starpm( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ra1 = *args++; -- npy_intp s_ra1 = *steps++; -- char *dec1 = *args++; -- npy_intp s_dec1 = *steps++; -- char *pmr1 = *args++; -- npy_intp s_pmr1 = *steps++; -- char *pmd1 = *args++; -- npy_intp s_pmd1 = *steps++; -- char *px1 = *args++; -- npy_intp s_px1 = *steps++; -- char *rv1 = *args++; -- npy_intp s_rv1 = *steps++; -- char *ep1a = *args++; -- npy_intp s_ep1a = *steps++; -- char *ep1b = *args++; -- npy_intp s_ep1b = *steps++; -- char *ep2a = *args++; -- npy_intp s_ep2a = *steps++; -- char *ep2b = *args++; -- npy_intp s_ep2b = *steps++; -- char *ra2 = *args++; -- npy_intp s_ra2 = *steps++; -- char *dec2 = *args++; -- npy_intp s_dec2 = *steps++; -- char *pmr2 = *args++; -- npy_intp s_pmr2 = *steps++; -- char *pmd2 = *args++; -- npy_intp s_pmd2 = *steps++; -- char *px2 = *args++; -- npy_intp s_px2 = *steps++; -- char *rv2 = *args++; -- npy_intp s_rv2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ra1); -- double (*_dec1); -- double (*_pmr1); -- double (*_pmd1); -- double (*_px1); -- double (*_rv1); -- double (*_ep1a); -- double (*_ep1b); -- double (*_ep2a); -- double (*_ep2b); -- double (*_ra2); -- double (*_dec2); -- double (*_pmr2); -- double (*_pmd2); -- double (*_px2); -- double (*_rv2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ra1 += s_ra1, dec1 += s_dec1, pmr1 += s_pmr1, pmd1 += s_pmd1, px1 += s_px1, rv1 += s_rv1, ep1a += s_ep1a, ep1b += s_ep1b, ep2a += s_ep2a, ep2b += s_ep2b, ra2 += s_ra2, dec2 += s_dec2, pmr2 += s_pmr2, pmd2 += s_pmd2, px2 += s_px2, rv2 += s_rv2, c_retval += s_c_retval) { -- _ra1 = ((double (*))ra1); -- _dec1 = ((double (*))dec1); -- _pmr1 = ((double (*))pmr1); -- _pmd1 = ((double (*))pmd1); -- _px1 = ((double (*))px1); -- _rv1 = ((double (*))rv1); -- _ep1a = ((double (*))ep1a); -- _ep1b = ((double (*))ep1b); -- _ep2a = ((double (*))ep2a); -- _ep2b = ((double (*))ep2b); -- _ra2 = ((double (*))ra2); -- _dec2 = ((double (*))dec2); -- _pmr2 = ((double (*))pmr2); -- _pmd2 = ((double (*))pmd2); -- _px2 = ((double (*))px2); -- _rv2 = ((double (*))rv2); -- _c_retval = eraStarpm(*_ra1, *_dec1, *_pmr1, *_pmd1, *_px1, *_rv1, *_ep1a, *_ep1b, *_ep2a, *_ep2b, _ra2, _dec2, _pmr2, _pmd2, _px2, _rv2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_eceq06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dl); -- double (*_db); -- double (*_dr); -- double (*_dd); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dl += s_dl, db += s_db, dr += s_dr, dd += s_dd) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- eraEceq06(*_date1, *_date2, *_dl, *_db, _dr, _dd); -- } --} -- --static void ufunc_loop_ecm06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *rm = *args++; -- npy_intp s_rm = *steps++; -- double (*_date1); -- double (*_date2); -- double b_rm[3][3]; -- double (*_rm)[3][3] = &b_rm; -- npy_intp is_rm0 = *steps++; -- npy_intp is_rm1 = *steps++; -- int copy_rm = (is_rm1 != sizeof(double) && -- is_rm0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, rm += s_rm) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- if (!copy_rm) { -- _rm = ((double (*)[3][3])rm); -- } -- eraEcm06(*_date1, *_date2, *_rm); -- if (copy_rm) { -- copy_from_double33(rm, is_rm0, is_rm1, *_rm); -- } -- } --} -- --static void ufunc_loop_eqec06( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_dr); -- double (*_dd); -- double (*_dl); -- double (*_db); -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, dr += s_dr, dd += s_dd, dl += s_dl, db += s_db) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- eraEqec06(*_date1, *_date2, *_dr, *_dd, _dl, _db); -- } --} -- --static void ufunc_loop_lteceq( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- double (*_epj); -- double (*_dl); -- double (*_db); -- double (*_dr); -- double (*_dd); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, dl += s_dl, db += s_db, dr += s_dr, dd += s_dd) { -- _epj = ((double (*))epj); -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- eraLteceq(*_epj, *_dl, *_db, _dr, _dd); -- } --} -- --static void ufunc_loop_ltecm( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *rm = *args++; -- npy_intp s_rm = *steps++; -- double (*_epj); -- double b_rm[3][3]; -- double (*_rm)[3][3] = &b_rm; -- npy_intp is_rm0 = *steps++; -- npy_intp is_rm1 = *steps++; -- int copy_rm = (is_rm1 != sizeof(double) && -- is_rm0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, rm += s_rm) { -- _epj = ((double (*))epj); -- if (!copy_rm) { -- _rm = ((double (*)[3][3])rm); -- } -- eraLtecm(*_epj, *_rm); -- if (copy_rm) { -- copy_from_double33(rm, is_rm0, is_rm1, *_rm); -- } -- } --} -- --static void ufunc_loop_lteqec( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *epj = *args++; -- npy_intp s_epj = *steps++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- double (*_epj); -- double (*_dr); -- double (*_dd); -- double (*_dl); -- double (*_db); -- for (i_o = 0; i_o < n_o; -- i_o++, epj += s_epj, dr += s_dr, dd += s_dd, dl += s_dl, db += s_db) { -- _epj = ((double (*))epj); -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- eraLteqec(*_epj, *_dr, *_dd, _dl, _db); -- } --} -- --static void ufunc_loop_g2icrs( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- double (*_dl); -- double (*_db); -- double (*_dr); -- double (*_dd); -- for (i_o = 0; i_o < n_o; -- i_o++, dl += s_dl, db += s_db, dr += s_dr, dd += s_dd) { -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- eraG2icrs(*_dl, *_db, _dr, _dd); -- } --} -- --static void ufunc_loop_icrs2g( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dr = *args++; -- npy_intp s_dr = *steps++; -- char *dd = *args++; -- npy_intp s_dd = *steps++; -- char *dl = *args++; -- npy_intp s_dl = *steps++; -- char *db = *args++; -- npy_intp s_db = *steps++; -- double (*_dr); -- double (*_dd); -- double (*_dl); -- double (*_db); -- for (i_o = 0; i_o < n_o; -- i_o++, dr += s_dr, dd += s_dd, dl += s_dl, db += s_db) { -- _dr = ((double (*))dr); -- _dd = ((double (*))dd); -- _dl = ((double (*))dl); -- _db = ((double (*))db); -- eraIcrs2g(*_dr, *_dd, _dl, _db); -- } --} -- --static void ufunc_loop_eform( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *n = *args++; -- npy_intp s_n = *steps++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *f = *args++; -- npy_intp s_f = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_n); -- double (*_a); -- double (*_f); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, n += s_n, a += s_a, f += s_f, c_retval += s_c_retval) { -- _n = ((int (*))n); -- _a = ((double (*))a); -- _f = ((double (*))f); -- _c_retval = eraEform(*_n, _a, _f); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gc2gd( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *n = *args++; -- npy_intp s_n = *steps++; -- char *xyz = *args++; -- npy_intp s_xyz = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *height = *args++; -- npy_intp s_height = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_n); -- double b_xyz[3]; -- double (*_xyz)[3] = &b_xyz; -- double (*_elong); -- double (*_phi); -- double (*_height); -- int _c_retval; -- npy_intp is_xyz0 = *steps++; -- int copy_xyz = (is_xyz0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, n += s_n, xyz += s_xyz, elong += s_elong, phi += s_phi, height += s_height, c_retval += s_c_retval) { -- _n = ((int (*))n); -- if (copy_xyz) { -- copy_to_double3(xyz, is_xyz0, *_xyz); -- } -- else { -- _xyz = ((double (*)[3])xyz); -- } -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _height = ((double (*))height); -- _c_retval = eraGc2gd(*_n, *_xyz, _elong, _phi, _height); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gc2gde( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *f = *args++; -- npy_intp s_f = *steps++; -- char *xyz = *args++; -- npy_intp s_xyz = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *height = *args++; -- npy_intp s_height = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_a); -- double (*_f); -- double b_xyz[3]; -- double (*_xyz)[3] = &b_xyz; -- double (*_elong); -- double (*_phi); -- double (*_height); -- int _c_retval; -- npy_intp is_xyz0 = *steps++; -- int copy_xyz = (is_xyz0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, f += s_f, xyz += s_xyz, elong += s_elong, phi += s_phi, height += s_height, c_retval += s_c_retval) { -- _a = ((double (*))a); -- _f = ((double (*))f); -- if (copy_xyz) { -- copy_to_double3(xyz, is_xyz0, *_xyz); -- } -- else { -- _xyz = ((double (*)[3])xyz); -- } -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _height = ((double (*))height); -- _c_retval = eraGc2gde(*_a, *_f, *_xyz, _elong, _phi, _height); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_gd2gc( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *n = *args++; -- npy_intp s_n = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *height = *args++; -- npy_intp s_height = *steps++; -- char *xyz = *args++; -- npy_intp s_xyz = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_n); -- double (*_elong); -- double (*_phi); -- double (*_height); -- double b_xyz[3]; -- double (*_xyz)[3] = &b_xyz; -- int _c_retval; -- npy_intp is_xyz0 = *steps++; -- int copy_xyz = (is_xyz0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, n += s_n, elong += s_elong, phi += s_phi, height += s_height, xyz += s_xyz, c_retval += s_c_retval) { -- _n = ((int (*))n); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _height = ((double (*))height); -- if (!copy_xyz) { -- _xyz = ((double (*)[3])xyz); -- } -- _c_retval = eraGd2gc(*_n, *_elong, *_phi, *_height, *_xyz); -- *((int *)c_retval) = _c_retval; -- if (copy_xyz) { -- copy_from_double3(xyz, is_xyz0, *_xyz); -- } -- } --} -- --static void ufunc_loop_gd2gce( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *f = *args++; -- npy_intp s_f = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *height = *args++; -- npy_intp s_height = *steps++; -- char *xyz = *args++; -- npy_intp s_xyz = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_a); -- double (*_f); -- double (*_elong); -- double (*_phi); -- double (*_height); -- double b_xyz[3]; -- double (*_xyz)[3] = &b_xyz; -- int _c_retval; -- npy_intp is_xyz0 = *steps++; -- int copy_xyz = (is_xyz0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, f += s_f, elong += s_elong, phi += s_phi, height += s_height, xyz += s_xyz, c_retval += s_c_retval) { -- _a = ((double (*))a); -- _f = ((double (*))f); -- _elong = ((double (*))elong); -- _phi = ((double (*))phi); -- _height = ((double (*))height); -- if (!copy_xyz) { -- _xyz = ((double (*)[3])xyz); -- } -- _c_retval = eraGd2gce(*_a, *_f, *_elong, *_phi, *_height, *_xyz); -- *((int *)c_retval) = _c_retval; -- if (copy_xyz) { -- copy_from_double3(xyz, is_xyz0, *_xyz); -- } -- } --} -- --static void ufunc_loop_d2dtf( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *scale = *args++; -- npy_intp s_scale = *steps++; -- char *ndp = *args++; -- npy_intp s_ndp = *steps++; -- char *d1 = *args++; -- npy_intp s_d1 = *steps++; -- char *d2 = *args++; -- npy_intp s_d2 = *steps++; -- char *iy = *args++; -- npy_intp s_iy = *steps++; -- char *im = *args++; -- npy_intp s_im = *steps++; -- char *id = *args++; -- npy_intp s_id = *steps++; -- char *ihmsf = *args++; -- npy_intp s_ihmsf = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- const char (*_scale); -- int (*_ndp); -- double (*_d1); -- double (*_d2); -- int (*_iy); -- int (*_im); -- int (*_id); -- int (*_ihmsf)[4]; -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, scale += s_scale, ndp += s_ndp, d1 += s_d1, d2 += s_d2, iy += s_iy, im += s_im, id += s_id, ihmsf += s_ihmsf, c_retval += s_c_retval) { -- _scale = ((const char (*))scale); -- _ndp = ((int (*))ndp); -- _d1 = ((double (*))d1); -- _d2 = ((double (*))d2); -- _iy = ((int (*))iy); -- _im = ((int (*))im); -- _id = ((int (*))id); -- _ihmsf = ((int (*)[4])ihmsf); -- _c_retval = eraD2dtf(_scale, *_ndp, *_d1, *_d2, _iy, _im, _id, *_ihmsf); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_dat( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *iy = *args++; -- npy_intp s_iy = *steps++; -- char *im = *args++; -- npy_intp s_im = *steps++; -- char *id = *args++; -- npy_intp s_id = *steps++; -- char *fd = *args++; -- npy_intp s_fd = *steps++; -- char *deltat = *args++; -- npy_intp s_deltat = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- int (*_iy); -- int (*_im); -- int (*_id); -- double (*_fd); -- double (*_deltat); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, iy += s_iy, im += s_im, id += s_id, fd += s_fd, deltat += s_deltat, c_retval += s_c_retval) { -- _iy = ((int (*))iy); -- _im = ((int (*))im); -- _id = ((int (*))id); -- _fd = ((double (*))fd); -- _deltat = ((double (*))deltat); -- _c_retval = eraDat(*_iy, *_im, *_id, *_fd, _deltat); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_dtdb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *date1 = *args++; -- npy_intp s_date1 = *steps++; -- char *date2 = *args++; -- npy_intp s_date2 = *steps++; -- char *ut = *args++; -- npy_intp s_ut = *steps++; -- char *elong = *args++; -- npy_intp s_elong = *steps++; -- char *u = *args++; -- npy_intp s_u = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_date1); -- double (*_date2); -- double (*_ut); -- double (*_elong); -- double (*_u); -- double (*_v); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, date1 += s_date1, date2 += s_date2, ut += s_ut, elong += s_elong, u += s_u, v += s_v, c_retval += s_c_retval) { -- _date1 = ((double (*))date1); -- _date2 = ((double (*))date2); -- _ut = ((double (*))ut); -- _elong = ((double (*))elong); -- _u = ((double (*))u); -- _v = ((double (*))v); -- _c_retval = eraDtdb(*_date1, *_date2, *_ut, *_elong, *_u, *_v); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_dtf2d( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *scale = *args++; -- npy_intp s_scale = *steps++; -- char *iy = *args++; -- npy_intp s_iy = *steps++; -- char *im = *args++; -- npy_intp s_im = *steps++; -- char *id = *args++; -- npy_intp s_id = *steps++; -- char *ihr = *args++; -- npy_intp s_ihr = *steps++; -- char *imn = *args++; -- npy_intp s_imn = *steps++; -- char *sec = *args++; -- npy_intp s_sec = *steps++; -- char *d1 = *args++; -- npy_intp s_d1 = *steps++; -- char *d2 = *args++; -- npy_intp s_d2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- const char (*_scale); -- int (*_iy); -- int (*_im); -- int (*_id); -- int (*_ihr); -- int (*_imn); -- double (*_sec); -- double (*_d1); -- double (*_d2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, scale += s_scale, iy += s_iy, im += s_im, id += s_id, ihr += s_ihr, imn += s_imn, sec += s_sec, d1 += s_d1, d2 += s_d2, c_retval += s_c_retval) { -- _scale = ((const char (*))scale); -- _iy = ((int (*))iy); -- _im = ((int (*))im); -- _id = ((int (*))id); -- _ihr = ((int (*))ihr); -- _imn = ((int (*))imn); -- _sec = ((double (*))sec); -- _d1 = ((double (*))d1); -- _d2 = ((double (*))d2); -- _c_retval = eraDtf2d(_scale, *_iy, *_im, *_id, *_ihr, *_imn, *_sec, _d1, _d2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_taitt( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tai1); -- double (*_tai2); -- double (*_tt1); -- double (*_tt2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tai1 += s_tai1, tai2 += s_tai2, tt1 += s_tt1, tt2 += s_tt2, c_retval += s_c_retval) { -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _c_retval = eraTaitt(*_tai1, *_tai2, _tt1, _tt2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_taiut1( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *dta = *args++; -- npy_intp s_dta = *steps++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tai1); -- double (*_tai2); -- double (*_dta); -- double (*_ut11); -- double (*_ut12); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tai1 += s_tai1, tai2 += s_tai2, dta += s_dta, ut11 += s_ut11, ut12 += s_ut12, c_retval += s_c_retval) { -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _dta = ((double (*))dta); -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _c_retval = eraTaiut1(*_tai1, *_tai2, *_dta, _ut11, _ut12); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_taiutc( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tai1); -- double (*_tai2); -- double (*_utc1); -- double (*_utc2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tai1 += s_tai1, tai2 += s_tai2, utc1 += s_utc1, utc2 += s_utc2, c_retval += s_c_retval) { -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _c_retval = eraTaiutc(*_tai1, *_tai2, _utc1, _utc2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tcbtdb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tcb1 = *args++; -- npy_intp s_tcb1 = *steps++; -- char *tcb2 = *args++; -- npy_intp s_tcb2 = *steps++; -- char *tdb1 = *args++; -- npy_intp s_tdb1 = *steps++; -- char *tdb2 = *args++; -- npy_intp s_tdb2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tcb1); -- double (*_tcb2); -- double (*_tdb1); -- double (*_tdb2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tcb1 += s_tcb1, tcb2 += s_tcb2, tdb1 += s_tdb1, tdb2 += s_tdb2, c_retval += s_c_retval) { -- _tcb1 = ((double (*))tcb1); -- _tcb2 = ((double (*))tcb2); -- _tdb1 = ((double (*))tdb1); -- _tdb2 = ((double (*))tdb2); -- _c_retval = eraTcbtdb(*_tcb1, *_tcb2, _tdb1, _tdb2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tcgtt( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tcg1 = *args++; -- npy_intp s_tcg1 = *steps++; -- char *tcg2 = *args++; -- npy_intp s_tcg2 = *steps++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tcg1); -- double (*_tcg2); -- double (*_tt1); -- double (*_tt2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tcg1 += s_tcg1, tcg2 += s_tcg2, tt1 += s_tt1, tt2 += s_tt2, c_retval += s_c_retval) { -- _tcg1 = ((double (*))tcg1); -- _tcg2 = ((double (*))tcg2); -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _c_retval = eraTcgtt(*_tcg1, *_tcg2, _tt1, _tt2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tdbtcb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tdb1 = *args++; -- npy_intp s_tdb1 = *steps++; -- char *tdb2 = *args++; -- npy_intp s_tdb2 = *steps++; -- char *tcb1 = *args++; -- npy_intp s_tcb1 = *steps++; -- char *tcb2 = *args++; -- npy_intp s_tcb2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tdb1); -- double (*_tdb2); -- double (*_tcb1); -- double (*_tcb2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tdb1 += s_tdb1, tdb2 += s_tdb2, tcb1 += s_tcb1, tcb2 += s_tcb2, c_retval += s_c_retval) { -- _tdb1 = ((double (*))tdb1); -- _tdb2 = ((double (*))tdb2); -- _tcb1 = ((double (*))tcb1); -- _tcb2 = ((double (*))tcb2); -- _c_retval = eraTdbtcb(*_tdb1, *_tdb2, _tcb1, _tcb2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tdbtt( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tdb1 = *args++; -- npy_intp s_tdb1 = *steps++; -- char *tdb2 = *args++; -- npy_intp s_tdb2 = *steps++; -- char *dtr = *args++; -- npy_intp s_dtr = *steps++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tdb1); -- double (*_tdb2); -- double (*_dtr); -- double (*_tt1); -- double (*_tt2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tdb1 += s_tdb1, tdb2 += s_tdb2, dtr += s_dtr, tt1 += s_tt1, tt2 += s_tt2, c_retval += s_c_retval) { -- _tdb1 = ((double (*))tdb1); -- _tdb2 = ((double (*))tdb2); -- _dtr = ((double (*))dtr); -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _c_retval = eraTdbtt(*_tdb1, *_tdb2, *_dtr, _tt1, _tt2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tttai( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tt1); -- double (*_tt2); -- double (*_tai1); -- double (*_tai2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tt1 += s_tt1, tt2 += s_tt2, tai1 += s_tai1, tai2 += s_tai2, c_retval += s_c_retval) { -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _c_retval = eraTttai(*_tt1, *_tt2, _tai1, _tai2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tttcg( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *tcg1 = *args++; -- npy_intp s_tcg1 = *steps++; -- char *tcg2 = *args++; -- npy_intp s_tcg2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tt1); -- double (*_tt2); -- double (*_tcg1); -- double (*_tcg2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tt1 += s_tt1, tt2 += s_tt2, tcg1 += s_tcg1, tcg2 += s_tcg2, c_retval += s_c_retval) { -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _tcg1 = ((double (*))tcg1); -- _tcg2 = ((double (*))tcg2); -- _c_retval = eraTttcg(*_tt1, *_tt2, _tcg1, _tcg2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tttdb( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *dtr = *args++; -- npy_intp s_dtr = *steps++; -- char *tdb1 = *args++; -- npy_intp s_tdb1 = *steps++; -- char *tdb2 = *args++; -- npy_intp s_tdb2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tt1); -- double (*_tt2); -- double (*_dtr); -- double (*_tdb1); -- double (*_tdb2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tt1 += s_tt1, tt2 += s_tt2, dtr += s_dtr, tdb1 += s_tdb1, tdb2 += s_tdb2, c_retval += s_c_retval) { -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _dtr = ((double (*))dtr); -- _tdb1 = ((double (*))tdb1); -- _tdb2 = ((double (*))tdb2); -- _c_retval = eraTttdb(*_tt1, *_tt2, *_dtr, _tdb1, _tdb2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ttut1( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *dt = *args++; -- npy_intp s_dt = *steps++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_tt1); -- double (*_tt2); -- double (*_dt); -- double (*_ut11); -- double (*_ut12); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, tt1 += s_tt1, tt2 += s_tt2, dt += s_dt, ut11 += s_ut11, ut12 += s_ut12, c_retval += s_c_retval) { -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _dt = ((double (*))dt); -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _c_retval = eraTtut1(*_tt1, *_tt2, *_dt, _ut11, _ut12); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ut1tai( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *dta = *args++; -- npy_intp s_dta = *steps++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ut11); -- double (*_ut12); -- double (*_dta); -- double (*_tai1); -- double (*_tai2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ut11 += s_ut11, ut12 += s_ut12, dta += s_dta, tai1 += s_tai1, tai2 += s_tai2, c_retval += s_c_retval) { -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _dta = ((double (*))dta); -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _c_retval = eraUt1tai(*_ut11, *_ut12, *_dta, _tai1, _tai2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ut1tt( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *dt = *args++; -- npy_intp s_dt = *steps++; -- char *tt1 = *args++; -- npy_intp s_tt1 = *steps++; -- char *tt2 = *args++; -- npy_intp s_tt2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ut11); -- double (*_ut12); -- double (*_dt); -- double (*_tt1); -- double (*_tt2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ut11 += s_ut11, ut12 += s_ut12, dt += s_dt, tt1 += s_tt1, tt2 += s_tt2, c_retval += s_c_retval) { -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _dt = ((double (*))dt); -- _tt1 = ((double (*))tt1); -- _tt2 = ((double (*))tt2); -- _c_retval = eraUt1tt(*_ut11, *_ut12, *_dt, _tt1, _tt2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ut1utc( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ut11); -- double (*_ut12); -- double (*_dut1); -- double (*_utc1); -- double (*_utc2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ut11 += s_ut11, ut12 += s_ut12, dut1 += s_dut1, utc1 += s_utc1, utc2 += s_utc2, c_retval += s_c_retval) { -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _dut1 = ((double (*))dut1); -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _c_retval = eraUt1utc(*_ut11, *_ut12, *_dut1, _utc1, _utc2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_utctai( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *tai1 = *args++; -- npy_intp s_tai1 = *steps++; -- char *tai2 = *args++; -- npy_intp s_tai2 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_utc1); -- double (*_utc2); -- double (*_tai1); -- double (*_tai2); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, utc1 += s_utc1, utc2 += s_utc2, tai1 += s_tai1, tai2 += s_tai2, c_retval += s_c_retval) { -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _tai1 = ((double (*))tai1); -- _tai2 = ((double (*))tai2); -- _c_retval = eraUtctai(*_utc1, *_utc2, _tai1, _tai2); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_utcut1( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *utc1 = *args++; -- npy_intp s_utc1 = *steps++; -- char *utc2 = *args++; -- npy_intp s_utc2 = *steps++; -- char *dut1 = *args++; -- npy_intp s_dut1 = *steps++; -- char *ut11 = *args++; -- npy_intp s_ut11 = *steps++; -- char *ut12 = *args++; -- npy_intp s_ut12 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_utc1); -- double (*_utc2); -- double (*_dut1); -- double (*_ut11); -- double (*_ut12); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, utc1 += s_utc1, utc2 += s_utc2, dut1 += s_dut1, ut11 += s_ut11, ut12 += s_ut12, c_retval += s_c_retval) { -- _utc1 = ((double (*))utc1); -- _utc2 = ((double (*))utc2); -- _dut1 = ((double (*))dut1); -- _ut11 = ((double (*))ut11); -- _ut12 = ((double (*))ut12); -- _c_retval = eraUtcut1(*_utc1, *_utc2, *_dut1, _ut11, _ut12); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_ae2hd( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *az = *args++; -- npy_intp s_az = *steps++; -- char *el = *args++; -- npy_intp s_el = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *ha = *args++; -- npy_intp s_ha = *steps++; -- char *dec = *args++; -- npy_intp s_dec = *steps++; -- double (*_az); -- double (*_el); -- double (*_phi); -- double (*_ha); -- double (*_dec); -- for (i_o = 0; i_o < n_o; -- i_o++, az += s_az, el += s_el, phi += s_phi, ha += s_ha, dec += s_dec) { -- _az = ((double (*))az); -- _el = ((double (*))el); -- _phi = ((double (*))phi); -- _ha = ((double (*))ha); -- _dec = ((double (*))dec); -- eraAe2hd(*_az, *_el, *_phi, _ha, _dec); -- } --} -- --static void ufunc_loop_hd2ae( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ha = *args++; -- npy_intp s_ha = *steps++; -- char *dec = *args++; -- npy_intp s_dec = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *az = *args++; -- npy_intp s_az = *steps++; -- char *el = *args++; -- npy_intp s_el = *steps++; -- double (*_ha); -- double (*_dec); -- double (*_phi); -- double (*_az); -- double (*_el); -- for (i_o = 0; i_o < n_o; -- i_o++, ha += s_ha, dec += s_dec, phi += s_phi, az += s_az, el += s_el) { -- _ha = ((double (*))ha); -- _dec = ((double (*))dec); -- _phi = ((double (*))phi); -- _az = ((double (*))az); -- _el = ((double (*))el); -- eraHd2ae(*_ha, *_dec, *_phi, _az, _el); -- } --} -- --static void ufunc_loop_hd2pa( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ha = *args++; -- npy_intp s_ha = *steps++; -- char *dec = *args++; -- npy_intp s_dec = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_ha); -- double (*_dec); -- double (*_phi); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, ha += s_ha, dec += s_dec, phi += s_phi, c_retval += s_c_retval) { -- _ha = ((double (*))ha); -- _dec = ((double (*))dec); -- _phi = ((double (*))phi); -- _c_retval = eraHd2pa(*_ha, *_dec, *_phi); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tpors( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *a01 = *args++; -- npy_intp s_a01 = *steps++; -- char *b01 = *args++; -- npy_intp s_b01 = *steps++; -- char *a02 = *args++; -- npy_intp s_a02 = *steps++; -- char *b02 = *args++; -- npy_intp s_b02 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_xi); -- double (*_eta); -- double (*_a); -- double (*_b); -- double (*_a01); -- double (*_b01); -- double (*_a02); -- double (*_b02); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, xi += s_xi, eta += s_eta, a += s_a, b += s_b, a01 += s_a01, b01 += s_b01, a02 += s_a02, b02 += s_b02, c_retval += s_c_retval) { -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- _a = ((double (*))a); -- _b = ((double (*))b); -- _a01 = ((double (*))a01); -- _b01 = ((double (*))b01); -- _a02 = ((double (*))a02); -- _b02 = ((double (*))b02); -- _c_retval = eraTpors(*_xi, *_eta, *_a, *_b, _a01, _b01, _a02, _b02); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tporv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- char *v01 = *args++; -- npy_intp s_v01 = *steps++; -- char *v02 = *args++; -- npy_intp s_v02 = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_xi); -- double (*_eta); -- double b_v[3]; -- double (*_v)[3] = &b_v; -- double b_v01[3]; -- double (*_v01)[3] = &b_v01; -- double b_v02[3]; -- double (*_v02)[3] = &b_v02; -- int _c_retval; -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- npy_intp is_v010 = *steps++; -- int copy_v01 = (is_v010 != sizeof(double)); -- npy_intp is_v020 = *steps++; -- int copy_v02 = (is_v020 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, xi += s_xi, eta += s_eta, v += s_v, v01 += s_v01, v02 += s_v02, c_retval += s_c_retval) { -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- if (copy_v) { -- copy_to_double3(v, is_v0, *_v); -- } -- else { -- _v = ((double (*)[3])v); -- } -- if (!copy_v01) { -- _v01 = ((double (*)[3])v01); -- } -- if (!copy_v02) { -- _v02 = ((double (*)[3])v02); -- } -- _c_retval = eraTporv(*_xi, *_eta, *_v, *_v01, *_v02); -- *((int *)c_retval) = _c_retval; -- if (copy_v01) { -- copy_from_double3(v01, is_v010, *_v01); -- } -- if (copy_v02) { -- copy_from_double3(v02, is_v020, *_v02); -- } -- } --} -- --static void ufunc_loop_tpsts( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *a0 = *args++; -- npy_intp s_a0 = *steps++; -- char *b0 = *args++; -- npy_intp s_b0 = *steps++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- double (*_xi); -- double (*_eta); -- double (*_a0); -- double (*_b0); -- double (*_a); -- double (*_b); -- for (i_o = 0; i_o < n_o; -- i_o++, xi += s_xi, eta += s_eta, a0 += s_a0, b0 += s_b0, a += s_a, b += s_b) { -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- _a0 = ((double (*))a0); -- _b0 = ((double (*))b0); -- _a = ((double (*))a); -- _b = ((double (*))b); -- eraTpsts(*_xi, *_eta, *_a0, *_b0, _a, _b); -- } --} -- --static void ufunc_loop_tpstv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *v0 = *args++; -- npy_intp s_v0 = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- double (*_xi); -- double (*_eta); -- double b_v0[3]; -- double (*_v0)[3] = &b_v0; -- double b_v[3]; -- double (*_v)[3] = &b_v; -- npy_intp is_v00 = *steps++; -- int copy_v0 = (is_v00 != sizeof(double)); -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, xi += s_xi, eta += s_eta, v0 += s_v0, v += s_v) { -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- if (copy_v0) { -- copy_to_double3(v0, is_v00, *_v0); -- } -- else { -- _v0 = ((double (*)[3])v0); -- } -- if (!copy_v) { -- _v = ((double (*)[3])v); -- } -- eraTpstv(*_xi, *_eta, *_v0, *_v); -- if (copy_v) { -- copy_from_double3(v, is_v0, *_v); -- } -- } --} -- --static void ufunc_loop_tpxes( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *a0 = *args++; -- npy_intp s_a0 = *steps++; -- char *b0 = *args++; -- npy_intp s_b0 = *steps++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_a); -- double (*_b); -- double (*_a0); -- double (*_b0); -- double (*_xi); -- double (*_eta); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, a0 += s_a0, b0 += s_b0, xi += s_xi, eta += s_eta, c_retval += s_c_retval) { -- _a = ((double (*))a); -- _b = ((double (*))b); -- _a0 = ((double (*))a0); -- _b0 = ((double (*))b0); -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- _c_retval = eraTpxes(*_a, *_b, *_a0, *_b0, _xi, _eta); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tpxev( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- char *v0 = *args++; -- npy_intp s_v0 = *steps++; -- char *xi = *args++; -- npy_intp s_xi = *steps++; -- char *eta = *args++; -- npy_intp s_eta = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_v[3]; -- double (*_v)[3] = &b_v; -- double b_v0[3]; -- double (*_v0)[3] = &b_v0; -- double (*_xi); -- double (*_eta); -- int _c_retval; -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- npy_intp is_v00 = *steps++; -- int copy_v0 = (is_v00 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, v += s_v, v0 += s_v0, xi += s_xi, eta += s_eta, c_retval += s_c_retval) { -- if (copy_v) { -- copy_to_double3(v, is_v0, *_v); -- } -- else { -- _v = ((double (*)[3])v); -- } -- if (copy_v0) { -- copy_to_double3(v0, is_v00, *_v0); -- } -- else { -- _v0 = ((double (*)[3])v0); -- } -- _xi = ((double (*))xi); -- _eta = ((double (*))eta); -- _c_retval = eraTpxev(*_v, *_v0, _xi, _eta); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_a2af( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ndp = *args++; -- npy_intp s_ndp = *steps++; -- char *angle = *args++; -- npy_intp s_angle = *steps++; -- char *sign = *args++; -- npy_intp s_sign = *steps++; -- char *idmsf = *args++; -- npy_intp s_idmsf = *steps++; -- int (*_ndp); -- double (*_angle); -- char (*_sign); -- int (*_idmsf)[4]; -- for (i_o = 0; i_o < n_o; -- i_o++, ndp += s_ndp, angle += s_angle, sign += s_sign, idmsf += s_idmsf) { -- _ndp = ((int (*))ndp); -- _angle = ((double (*))angle); -- _sign = ((char (*))sign); -- _idmsf = ((int (*)[4])idmsf); -- eraA2af(*_ndp, *_angle, _sign, *_idmsf); -- } --} -- --static void ufunc_loop_a2tf( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ndp = *args++; -- npy_intp s_ndp = *steps++; -- char *angle = *args++; -- npy_intp s_angle = *steps++; -- char *sign = *args++; -- npy_intp s_sign = *steps++; -- char *ihmsf = *args++; -- npy_intp s_ihmsf = *steps++; -- int (*_ndp); -- double (*_angle); -- char (*_sign); -- int (*_ihmsf)[4]; -- for (i_o = 0; i_o < n_o; -- i_o++, ndp += s_ndp, angle += s_angle, sign += s_sign, ihmsf += s_ihmsf) { -- _ndp = ((int (*))ndp); -- _angle = ((double (*))angle); -- _sign = ((char (*))sign); -- _ihmsf = ((int (*)[4])ihmsf); -- eraA2tf(*_ndp, *_angle, _sign, *_ihmsf); -- } --} -- --static void ufunc_loop_af2a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *ideg = *args++; -- npy_intp s_ideg = *steps++; -- char *iamin = *args++; -- npy_intp s_iamin = *steps++; -- char *asec = *args++; -- npy_intp s_asec = *steps++; -- char *rad = *args++; -- npy_intp s_rad = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- char (*_s); -- int (*_ideg); -- int (*_iamin); -- double (*_asec); -- double (*_rad); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, s += s_s, ideg += s_ideg, iamin += s_iamin, asec += s_asec, rad += s_rad, c_retval += s_c_retval) { -- _s = ((char (*))s); -- _ideg = ((int (*))ideg); -- _iamin = ((int (*))iamin); -- _asec = ((double (*))asec); -- _rad = ((double (*))rad); -- _c_retval = eraAf2a(*_s, *_ideg, *_iamin, *_asec, _rad); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_anp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_a); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, c_retval += s_c_retval) { -- _a = ((double (*))a); -- _c_retval = eraAnp(*_a); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_anpm( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_a); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, c_retval += s_c_retval) { -- _a = ((double (*))a); -- _c_retval = eraAnpm(*_a); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_d2tf( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *ndp = *args++; -- npy_intp s_ndp = *steps++; -- char *days = *args++; -- npy_intp s_days = *steps++; -- char *sign = *args++; -- npy_intp s_sign = *steps++; -- char *ihmsf = *args++; -- npy_intp s_ihmsf = *steps++; -- int (*_ndp); -- double (*_days); -- char (*_sign); -- int (*_ihmsf)[4]; -- for (i_o = 0; i_o < n_o; -- i_o++, ndp += s_ndp, days += s_days, sign += s_sign, ihmsf += s_ihmsf) { -- _ndp = ((int (*))ndp); -- _days = ((double (*))days); -- _sign = ((char (*))sign); -- _ihmsf = ((int (*)[4])ihmsf); -- eraD2tf(*_ndp, *_days, _sign, *_ihmsf); -- } --} -- --static void ufunc_loop_tf2a( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *ihour = *args++; -- npy_intp s_ihour = *steps++; -- char *imin = *args++; -- npy_intp s_imin = *steps++; -- char *sec = *args++; -- npy_intp s_sec = *steps++; -- char *rad = *args++; -- npy_intp s_rad = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- char (*_s); -- int (*_ihour); -- int (*_imin); -- double (*_sec); -- double (*_rad); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, s += s_s, ihour += s_ihour, imin += s_imin, sec += s_sec, rad += s_rad, c_retval += s_c_retval) { -- _s = ((char (*))s); -- _ihour = ((int (*))ihour); -- _imin = ((int (*))imin); -- _sec = ((double (*))sec); -- _rad = ((double (*))rad); -- _c_retval = eraTf2a(*_s, *_ihour, *_imin, *_sec, _rad); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_tf2d( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *ihour = *args++; -- npy_intp s_ihour = *steps++; -- char *imin = *args++; -- npy_intp s_imin = *steps++; -- char *sec = *args++; -- npy_intp s_sec = *steps++; -- char *days = *args++; -- npy_intp s_days = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- char (*_s); -- int (*_ihour); -- int (*_imin); -- double (*_sec); -- double (*_days); -- int _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, s += s_s, ihour += s_ihour, imin += s_imin, sec += s_sec, days += s_days, c_retval += s_c_retval) { -- _s = ((char (*))s); -- _ihour = ((int (*))ihour); -- _imin = ((int (*))imin); -- _sec = ((double (*))sec); -- _days = ((double (*))days); -- _c_retval = eraTf2d(*_s, *_ihour, *_imin, *_sec, _days); -- *((int *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_rx( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *r_in = *args++; -- npy_intp s_r_in = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double (*_phi); -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r_in0 = *steps++; -- npy_intp is_r_in1 = *steps++; -- int copy_r_in = (is_r_in1 != sizeof(double) && -- is_r_in0 != 3 * sizeof(double)); -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, phi += s_phi, r += s_r, r_in += s_r_in) { -- _phi = ((double (*))phi); -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- if (copy_r_in || r != r_in) { -- copy_to_double33(r_in, is_r_in0, is_r_in1, *_r); -- } -- eraRx(*_phi, *_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_ry( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *r_in = *args++; -- npy_intp s_r_in = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double (*_theta); -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r_in0 = *steps++; -- npy_intp is_r_in1 = *steps++; -- int copy_r_in = (is_r_in1 != sizeof(double) && -- is_r_in0 != 3 * sizeof(double)); -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, theta += s_theta, r += s_r, r_in += s_r_in) { -- _theta = ((double (*))theta); -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- if (copy_r_in || r != r_in) { -- copy_to_double33(r_in, is_r_in0, is_r_in1, *_r); -- } -- eraRy(*_theta, *_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_rz( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *psi = *args++; -- npy_intp s_psi = *steps++; -- char *r_in = *args++; -- npy_intp s_r_in = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double (*_psi); -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r_in0 = *steps++; -- npy_intp is_r_in1 = *steps++; -- int copy_r_in = (is_r_in1 != sizeof(double) && -- is_r_in0 != 3 * sizeof(double)); -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, psi += s_psi, r += s_r, r_in += s_r_in) { -- _psi = ((double (*))psi); -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- if (copy_r_in || r != r_in) { -- copy_to_double33(r_in, is_r_in0, is_r_in1, *_r); -- } -- eraRz(*_psi, *_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_cp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *c = *args++; -- npy_intp s_c = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_c[3]; -- double (*_c)[3] = &b_c; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_c0 = *steps++; -- int copy_c = (is_c0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, c += s_c) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (!copy_c) { -- _c = ((double (*)[3])c); -- } -- eraCp(*_p, *_c); -- if (copy_c) { -- copy_from_double3(c, is_c0, *_c); -- } -- } --} -- --static void ufunc_loop_cpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *c = *args++; -- npy_intp s_c = *steps++; -- double (*_pv)[2][3]; -- double (*_c)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, c += s_c) { -- _pv = ((double (*)[2][3])pv); -- _c = ((double (*)[2][3])c); -- eraCpv(*_pv, *_c); -- } --} -- --static void ufunc_loop_cr( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *c = *args++; -- npy_intp s_c = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double b_c[3][3]; -- double (*_c)[3][3] = &b_c; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- npy_intp is_c0 = *steps++; -- npy_intp is_c1 = *steps++; -- int copy_c = (is_c1 != sizeof(double) && -- is_c0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, c += s_c) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- if (!copy_c) { -- _c = ((double (*)[3][3])c); -- } -- eraCr(*_r, *_c); -- if (copy_c) { -- copy_from_double33(c, is_c0, is_c1, *_c); -- } -- } --} -- --static void ufunc_loop_p2pv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double (*_pv)[2][3]; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, pv += s_pv) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- _pv = ((double (*)[2][3])pv); -- eraP2pv(*_p, *_pv); -- } --} -- --static void ufunc_loop_pv2p( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- double (*_pv)[2][3]; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, p += s_p) { -- _pv = ((double (*)[2][3])pv); -- if (!copy_p) { -- _p = ((double (*)[3])p); -- } -- eraPv2p(*_pv, *_p); -- if (copy_p) { -- copy_from_double3(p, is_p0, *_p); -- } -- } --} -- --static void ufunc_loop_ir( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r) { -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- eraIr(*_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_zp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p) { -- if (!copy_p) { -- _p = ((double (*)[3])p); -- } -- eraZp(*_p); -- if (copy_p) { -- copy_from_double3(p, is_p0, *_p); -- } -- } --} -- --static void ufunc_loop_zpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- double (*_pv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv) { -- _pv = ((double (*)[2][3])pv); -- eraZpv(*_pv); -- } --} -- --static void ufunc_loop_zr( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r) { -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- eraZr(*_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_rxr( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *atb = *args++; -- npy_intp s_atb = *steps++; -- double b_a[3][3]; -- double (*_a)[3][3] = &b_a; -- double b_b[3][3]; -- double (*_b)[3][3] = &b_b; -- double b_atb[3][3]; -- double (*_atb)[3][3] = &b_atb; -- npy_intp is_a0 = *steps++; -- npy_intp is_a1 = *steps++; -- int copy_a = (is_a1 != sizeof(double) && -- is_a0 != 3 * sizeof(double)); -- npy_intp is_b0 = *steps++; -- npy_intp is_b1 = *steps++; -- int copy_b = (is_b1 != sizeof(double) && -- is_b0 != 3 * sizeof(double)); -- npy_intp is_atb0 = *steps++; -- npy_intp is_atb1 = *steps++; -- int copy_atb = (is_atb1 != sizeof(double) && -- is_atb0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, atb += s_atb) { -- if (copy_a) { -- copy_to_double33(a, is_a0, is_a1, *_a); -- } -- else { -- _a = ((double (*)[3][3])a); -- } -- if (copy_b) { -- copy_to_double33(b, is_b0, is_b1, *_b); -- } -- else { -- _b = ((double (*)[3][3])b); -- } -- if (!copy_atb) { -- _atb = ((double (*)[3][3])atb); -- } -- eraRxr(*_a, *_b, *_atb); -- if (copy_atb) { -- copy_from_double33(atb, is_atb0, is_atb1, *_atb); -- } -- } --} -- --static void ufunc_loop_tr( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *rt = *args++; -- npy_intp s_rt = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double b_rt[3][3]; -- double (*_rt)[3][3] = &b_rt; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- npy_intp is_rt0 = *steps++; -- npy_intp is_rt1 = *steps++; -- int copy_rt = (is_rt1 != sizeof(double) && -- is_rt0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, rt += s_rt) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- if (!copy_rt) { -- _rt = ((double (*)[3][3])rt); -- } -- eraTr(*_r, *_rt); -- if (copy_rt) { -- copy_from_double33(rt, is_rt0, is_rt1, *_rt); -- } -- } --} -- --static void ufunc_loop_rxp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *rp = *args++; -- npy_intp s_rp = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_rp[3]; -- double (*_rp)[3] = &b_rp; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_rp0 = *steps++; -- int copy_rp = (is_rp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, p += s_p, rp += s_rp) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (!copy_rp) { -- _rp = ((double (*)[3])rp); -- } -- eraRxp(*_r, *_p, *_rp); -- if (copy_rp) { -- copy_from_double3(rp, is_rp0, *_rp); -- } -- } --} -- --static void ufunc_loop_rxpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *rpv = *args++; -- npy_intp s_rpv = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double (*_pv)[2][3]; -- double (*_rpv)[2][3]; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, pv += s_pv, rpv += s_rpv) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- _pv = ((double (*)[2][3])pv); -- _rpv = ((double (*)[2][3])rpv); -- eraRxpv(*_r, *_pv, *_rpv); -- } --} -- --static void ufunc_loop_trxp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *trp = *args++; -- npy_intp s_trp = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_trp[3]; -- double (*_trp)[3] = &b_trp; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_trp0 = *steps++; -- int copy_trp = (is_trp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, p += s_p, trp += s_trp) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (!copy_trp) { -- _trp = ((double (*)[3])trp); -- } -- eraTrxp(*_r, *_p, *_trp); -- if (copy_trp) { -- copy_from_double3(trp, is_trp0, *_trp); -- } -- } --} -- --static void ufunc_loop_trxpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *trpv = *args++; -- npy_intp s_trpv = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double (*_pv)[2][3]; -- double (*_trpv)[2][3]; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, pv += s_pv, trpv += s_trpv) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- _pv = ((double (*)[2][3])pv); -- _trpv = ((double (*)[2][3])trpv); -- eraTrxpv(*_r, *_pv, *_trpv); -- } --} -- --static void ufunc_loop_rm2v( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *w = *args++; -- npy_intp s_w = *steps++; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- double b_w[3]; -- double (*_w)[3] = &b_w; -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- npy_intp is_w0 = *steps++; -- int copy_w = (is_w0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, r += s_r, w += s_w) { -- if (copy_r) { -- copy_to_double33(r, is_r0, is_r1, *_r); -- } -- else { -- _r = ((double (*)[3][3])r); -- } -- if (!copy_w) { -- _w = ((double (*)[3])w); -- } -- eraRm2v(*_r, *_w); -- if (copy_w) { -- copy_from_double3(w, is_w0, *_w); -- } -- } --} -- --static void ufunc_loop_rv2m( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *w = *args++; -- npy_intp s_w = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double b_w[3]; -- double (*_w)[3] = &b_w; -- double b_r[3][3]; -- double (*_r)[3][3] = &b_r; -- npy_intp is_w0 = *steps++; -- int copy_w = (is_w0 != sizeof(double)); -- npy_intp is_r0 = *steps++; -- npy_intp is_r1 = *steps++; -- int copy_r = (is_r1 != sizeof(double) && -- is_r0 != 3 * sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, w += s_w, r += s_r) { -- if (copy_w) { -- copy_to_double3(w, is_w0, *_w); -- } -- else { -- _w = ((double (*)[3])w); -- } -- if (!copy_r) { -- _r = ((double (*)[3][3])r); -- } -- eraRv2m(*_w, *_r); -- if (copy_r) { -- copy_from_double33(r, is_r0, is_r1, *_r); -- } -- } --} -- --static void ufunc_loop_pap( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double _c_retval; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, c_retval += s_c_retval) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- _c_retval = eraPap(*_a, *_b); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_pas( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *al = *args++; -- npy_intp s_al = *steps++; -- char *ap = *args++; -- npy_intp s_ap = *steps++; -- char *bl = *args++; -- npy_intp s_bl = *steps++; -- char *bp = *args++; -- npy_intp s_bp = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_al); -- double (*_ap); -- double (*_bl); -- double (*_bp); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, al += s_al, ap += s_ap, bl += s_bl, bp += s_bp, c_retval += s_c_retval) { -- _al = ((double (*))al); -- _ap = ((double (*))ap); -- _bl = ((double (*))bl); -- _bp = ((double (*))bp); -- _c_retval = eraPas(*_al, *_ap, *_bl, *_bp); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_sepp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double _c_retval; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, c_retval += s_c_retval) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- _c_retval = eraSepp(*_a, *_b); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_seps( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *al = *args++; -- npy_intp s_al = *steps++; -- char *ap = *args++; -- npy_intp s_ap = *steps++; -- char *bl = *args++; -- npy_intp s_bl = *steps++; -- char *bp = *args++; -- npy_intp s_bp = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double (*_al); -- double (*_ap); -- double (*_bl); -- double (*_bp); -- double _c_retval; -- for (i_o = 0; i_o < n_o; -- i_o++, al += s_al, ap += s_ap, bl += s_bl, bp += s_bp, c_retval += s_c_retval) { -- _al = ((double (*))al); -- _ap = ((double (*))ap); -- _bl = ((double (*))bl); -- _bp = ((double (*))bp); -- _c_retval = eraSeps(*_al, *_ap, *_bl, *_bp); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_c2s( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double (*_theta); -- double (*_phi); -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, theta += s_theta, phi += s_phi) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- eraC2s(*_p, _theta, _phi); -- } --} -- --static void ufunc_loop_p2s( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double (*_theta); -- double (*_phi); -- double (*_r); -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, theta += s_theta, phi += s_phi, r += s_r) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- _r = ((double (*))r); -- eraP2s(*_p, _theta, _phi, _r); -- } --} -- --static void ufunc_loop_pv2s( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *td = *args++; -- npy_intp s_td = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *rd = *args++; -- npy_intp s_rd = *steps++; -- double (*_pv)[2][3]; -- double (*_theta); -- double (*_phi); -- double (*_r); -- double (*_td); -- double (*_pd); -- double (*_rd); -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, theta += s_theta, phi += s_phi, r += s_r, td += s_td, pd += s_pd, rd += s_rd) { -- _pv = ((double (*)[2][3])pv); -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- _r = ((double (*))r); -- _td = ((double (*))td); -- _pd = ((double (*))pd); -- _rd = ((double (*))rd); -- eraPv2s(*_pv, _theta, _phi, _r, _td, _pd, _rd); -- } --} -- --static void ufunc_loop_s2c( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *c = *args++; -- npy_intp s_c = *steps++; -- double (*_theta); -- double (*_phi); -- double b_c[3]; -- double (*_c)[3] = &b_c; -- npy_intp is_c0 = *steps++; -- int copy_c = (is_c0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, theta += s_theta, phi += s_phi, c += s_c) { -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- if (!copy_c) { -- _c = ((double (*)[3])c); -- } -- eraS2c(*_theta, *_phi, *_c); -- if (copy_c) { -- copy_from_double3(c, is_c0, *_c); -- } -- } --} -- --static void ufunc_loop_s2p( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- double (*_theta); -- double (*_phi); -- double (*_r); -- double b_p[3]; -- double (*_p)[3] = &b_p; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, theta += s_theta, phi += s_phi, r += s_r, p += s_p) { -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- _r = ((double (*))r); -- if (!copy_p) { -- _p = ((double (*)[3])p); -- } -- eraS2p(*_theta, *_phi, *_r, *_p); -- if (copy_p) { -- copy_from_double3(p, is_p0, *_p); -- } -- } --} -- --static void ufunc_loop_s2pv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *theta = *args++; -- npy_intp s_theta = *steps++; -- char *phi = *args++; -- npy_intp s_phi = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *td = *args++; -- npy_intp s_td = *steps++; -- char *pd = *args++; -- npy_intp s_pd = *steps++; -- char *rd = *args++; -- npy_intp s_rd = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- double (*_theta); -- double (*_phi); -- double (*_r); -- double (*_td); -- double (*_pd); -- double (*_rd); -- double (*_pv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, theta += s_theta, phi += s_phi, r += s_r, td += s_td, pd += s_pd, rd += s_rd, pv += s_pv) { -- _theta = ((double (*))theta); -- _phi = ((double (*))phi); -- _r = ((double (*))r); -- _td = ((double (*))td); -- _pd = ((double (*))pd); -- _rd = ((double (*))rd); -- _pv = ((double (*)[2][3])pv); -- eraS2pv(*_theta, *_phi, *_r, *_td, *_pd, *_rd, *_pv); -- } --} -- --static void ufunc_loop_pdp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double _c_retval; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, c_retval += s_c_retval) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- _c_retval = eraPdp(*_a, *_b); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_pm( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *c_retval = *args++; -- npy_intp s_c_retval = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double _c_retval; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, c_retval += s_c_retval) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- _c_retval = eraPm(*_p); -- *((double *)c_retval) = _c_retval; -- } --} -- --static void ufunc_loop_pmp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *amb = *args++; -- npy_intp s_amb = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double b_amb[3]; -- double (*_amb)[3] = &b_amb; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- npy_intp is_amb0 = *steps++; -- int copy_amb = (is_amb0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, amb += s_amb) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- if (!copy_amb) { -- _amb = ((double (*)[3])amb); -- } -- eraPmp(*_a, *_b, *_amb); -- if (copy_amb) { -- copy_from_double3(amb, is_amb0, *_amb); -- } -- } --} -- --static void ufunc_loop_pn( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *u = *args++; -- npy_intp s_u = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double (*_r); -- double b_u[3]; -- double (*_u)[3] = &b_u; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_u0 = *steps++; -- int copy_u = (is_u0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, r += s_r, u += s_u) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- _r = ((double (*))r); -- if (!copy_u) { -- _u = ((double (*)[3])u); -- } -- eraPn(*_p, _r, *_u); -- if (copy_u) { -- copy_from_double3(u, is_u0, *_u); -- } -- } --} -- --static void ufunc_loop_ppp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *apb = *args++; -- npy_intp s_apb = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double b_apb[3]; -- double (*_apb)[3] = &b_apb; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- npy_intp is_apb0 = *steps++; -- int copy_apb = (is_apb0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, apb += s_apb) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- if (!copy_apb) { -- _apb = ((double (*)[3])apb); -- } -- eraPpp(*_a, *_b, *_apb); -- if (copy_apb) { -- copy_from_double3(apb, is_apb0, *_apb); -- } -- } --} -- --static void ufunc_loop_ppsp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *apsb = *args++; -- npy_intp s_apsb = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double (*_s); -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double b_apsb[3]; -- double (*_apsb)[3] = &b_apsb; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- npy_intp is_apsb0 = *steps++; -- int copy_apsb = (is_apsb0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, s += s_s, b += s_b, apsb += s_apsb) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- _s = ((double (*))s); -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- if (!copy_apsb) { -- _apsb = ((double (*)[3])apsb); -- } -- eraPpsp(*_a, *_s, *_b, *_apsb); -- if (copy_apsb) { -- copy_from_double3(apsb, is_apsb0, *_apsb); -- } -- } --} -- --static void ufunc_loop_pvdpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *adb = *args++; -- npy_intp s_adb = *steps++; -- double (*_a)[2][3]; -- double (*_b)[2][3]; -- double (*_adb)[2]; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, adb += s_adb) { -- _a = ((double (*)[2][3])a); -- _b = ((double (*)[2][3])b); -- _adb = ((double (*)[2])adb); -- eraPvdpv(*_a, *_b, *_adb); -- } --} -- --static void ufunc_loop_pvm( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *r = *args++; -- npy_intp s_r = *steps++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- double (*_pv)[2][3]; -- double (*_r); -- double (*_s); -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, r += s_r, s += s_s) { -- _pv = ((double (*)[2][3])pv); -- _r = ((double (*))r); -- _s = ((double (*))s); -- eraPvm(*_pv, _r, _s); -- } --} -- --static void ufunc_loop_pvmpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *amb = *args++; -- npy_intp s_amb = *steps++; -- double (*_a)[2][3]; -- double (*_b)[2][3]; -- double (*_amb)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, amb += s_amb) { -- _a = ((double (*)[2][3])a); -- _b = ((double (*)[2][3])b); -- _amb = ((double (*)[2][3])amb); -- eraPvmpv(*_a, *_b, *_amb); -- } --} -- --static void ufunc_loop_pvppv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *apb = *args++; -- npy_intp s_apb = *steps++; -- double (*_a)[2][3]; -- double (*_b)[2][3]; -- double (*_apb)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, apb += s_apb) { -- _a = ((double (*)[2][3])a); -- _b = ((double (*)[2][3])b); -- _apb = ((double (*)[2][3])apb); -- eraPvppv(*_a, *_b, *_apb); -- } --} -- --static void ufunc_loop_pvu( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dt = *args++; -- npy_intp s_dt = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *upv = *args++; -- npy_intp s_upv = *steps++; -- double (*_dt); -- double (*_pv)[2][3]; -- double (*_upv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, dt += s_dt, pv += s_pv, upv += s_upv) { -- _dt = ((double (*))dt); -- _pv = ((double (*)[2][3])pv); -- _upv = ((double (*)[2][3])upv); -- eraPvu(*_dt, *_pv, *_upv); -- } --} -- --static void ufunc_loop_pvup( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *dt = *args++; -- npy_intp s_dt = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- double (*_dt); -- double (*_pv)[2][3]; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, dt += s_dt, pv += s_pv, p += s_p) { -- _dt = ((double (*))dt); -- _pv = ((double (*)[2][3])pv); -- if (!copy_p) { -- _p = ((double (*)[3])p); -- } -- eraPvup(*_dt, *_pv, *_p); -- if (copy_p) { -- copy_from_double3(p, is_p0, *_p); -- } -- } --} -- --static void ufunc_loop_pvxpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *axb = *args++; -- npy_intp s_axb = *steps++; -- double (*_a)[2][3]; -- double (*_b)[2][3]; -- double (*_axb)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, axb += s_axb) { -- _a = ((double (*)[2][3])a); -- _b = ((double (*)[2][3])b); -- _axb = ((double (*)[2][3])axb); -- eraPvxpv(*_a, *_b, *_axb); -- } --} -- --static void ufunc_loop_pxp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *a = *args++; -- npy_intp s_a = *steps++; -- char *b = *args++; -- npy_intp s_b = *steps++; -- char *axb = *args++; -- npy_intp s_axb = *steps++; -- double b_a[3]; -- double (*_a)[3] = &b_a; -- double b_b[3]; -- double (*_b)[3] = &b_b; -- double b_axb[3]; -- double (*_axb)[3] = &b_axb; -- npy_intp is_a0 = *steps++; -- int copy_a = (is_a0 != sizeof(double)); -- npy_intp is_b0 = *steps++; -- int copy_b = (is_b0 != sizeof(double)); -- npy_intp is_axb0 = *steps++; -- int copy_axb = (is_axb0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, a += s_a, b += s_b, axb += s_axb) { -- if (copy_a) { -- copy_to_double3(a, is_a0, *_a); -- } -- else { -- _a = ((double (*)[3])a); -- } -- if (copy_b) { -- copy_to_double3(b, is_b0, *_b); -- } -- else { -- _b = ((double (*)[3])b); -- } -- if (!copy_axb) { -- _axb = ((double (*)[3])axb); -- } -- eraPxp(*_a, *_b, *_axb); -- if (copy_axb) { -- copy_from_double3(axb, is_axb0, *_axb); -- } -- } --} -- --static void ufunc_loop_s2xpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s1 = *args++; -- npy_intp s_s1 = *steps++; -- char *s2 = *args++; -- npy_intp s_s2 = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *spv = *args++; -- npy_intp s_spv = *steps++; -- double (*_s1); -- double (*_s2); -- double (*_pv)[2][3]; -- double (*_spv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, s1 += s_s1, s2 += s_s2, pv += s_pv, spv += s_spv) { -- _s1 = ((double (*))s1); -- _s2 = ((double (*))s2); -- _pv = ((double (*)[2][3])pv); -- _spv = ((double (*)[2][3])spv); -- eraS2xpv(*_s1, *_s2, *_pv, *_spv); -- } --} -- --static void ufunc_loop_sxp( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *sp = *args++; -- npy_intp s_sp = *steps++; -- double (*_s); -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_sp[3]; -- double (*_sp)[3] = &b_sp; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_sp0 = *steps++; -- int copy_sp = (is_sp0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, s += s_s, p += s_p, sp += s_sp) { -- _s = ((double (*))s); -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (!copy_sp) { -- _sp = ((double (*)[3])sp); -- } -- eraSxp(*_s, *_p, *_sp); -- if (copy_sp) { -- copy_from_double3(sp, is_sp0, *_sp); -- } -- } --} -- --static void ufunc_loop_sxpv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *s = *args++; -- npy_intp s_s = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *spv = *args++; -- npy_intp s_spv = *steps++; -- double (*_s); -- double (*_pv)[2][3]; -- double (*_spv)[2][3]; -- for (i_o = 0; i_o < n_o; -- i_o++, s += s_s, pv += s_pv, spv += s_spv) { -- _s = ((double (*))s); -- _pv = ((double (*)[2][3])pv); -- _spv = ((double (*)[2][3])spv); -- eraSxpv(*_s, *_pv, *_spv); -- } --} -- --static void ufunc_loop_pav2pv( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_v[3]; -- double (*_v)[3] = &b_v; -- double (*_pv)[2][3]; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, p += s_p, v += s_v, pv += s_pv) { -- if (copy_p) { -- copy_to_double3(p, is_p0, *_p); -- } -- else { -- _p = ((double (*)[3])p); -- } -- if (copy_v) { -- copy_to_double3(v, is_v0, *_v); -- } -- else { -- _v = ((double (*)[3])v); -- } -- _pv = ((double (*)[2][3])pv); -- eraPav2pv(*_p, *_v, *_pv); -- } --} -- --static void ufunc_loop_pv2pav( -- char **args, npy_intp *dimensions, npy_intp* steps, void* data) --{ -- npy_intp i_o; -- npy_intp n_o = *dimensions++; -- char *pv = *args++; -- npy_intp s_pv = *steps++; -- char *p = *args++; -- npy_intp s_p = *steps++; -- char *v = *args++; -- npy_intp s_v = *steps++; -- double (*_pv)[2][3]; -- double b_p[3]; -- double (*_p)[3] = &b_p; -- double b_v[3]; -- double (*_v)[3] = &b_v; -- npy_intp is_p0 = *steps++; -- int copy_p = (is_p0 != sizeof(double)); -- npy_intp is_v0 = *steps++; -- int copy_v = (is_v0 != sizeof(double)); -- for (i_o = 0; i_o < n_o; -- i_o++, pv += s_pv, p += s_p, v += s_v) { -- _pv = ((double (*)[2][3])pv); -- if (!copy_p) { -- _p = ((double (*)[3])p); -- } -- if (!copy_v) { -- _v = ((double (*)[3])v); -- } -- eraPv2pav(*_pv, *_p, *_v); -- if (copy_p) { -- copy_from_double3(p, is_p0, *_p); -- } -- if (copy_v) { -- copy_from_double3(v, is_v0, *_v); -- } -- } --} -- --/* -- * UFUNC LOOP MATCHING HELPERS -- * All but ufunc_loop_matches are copies of code needed but not exported. -- */ -- --/* -- * Adjusted version of ufunc_loop_matches from -- * numpy/core/src/umath/ufunc_type_resolution.c. -- * Here, we special-case the structured dtype check, only allowing -- * casting of the same dtype or string. We also do not distinguish -- * between input and output arguments for casting. -- */ --static int --ufunc_loop_matches(PyUFuncObject *self, -- PyArrayObject **op, -- NPY_CASTING casting, -- int *types, PyArray_Descr **dtypes) --{ -- npy_intp i, nin = self->nin, nop = nin + self->nout; -- /* -- * Check if all the inputs can be cast to the types used by this function. -- */ -- for (i = 0; i < nin; ++i) { -- PyArray_Descr *op_descr = PyArray_DESCR(op[i]); -- /* -- * Check for NPY_VOID with an associated struct dtype. -- */ -- if (types[i] == NPY_VOID && dtypes != NULL) { -- int op_descr_type_num = op_descr->type_num; -- int dtype_elsize = dtypes[i]->elsize; -- /* -- * MHvK: we do our own check on casting, since by default -- * all items can cast to structured dtypes (see gh-11114), -- * which is not OK. So, we only allow VOID->same VOID, -- * and STRING -> VOID-of-STRING (which works well; we -- * recognize VOID-of-STRING by the dtype element size; -- * it would be rather costly to go look at dtype->fields). -- */ -- if (op_descr_type_num == NPY_VOID) { -- /* allow only the same structured to structured */ -- if (!PyArray_EquivTypes(op_descr, dtypes[i])) { -- return 0; -- } -- } -- else if (dtypes[i]->elsize == 1 || dtypes[i]->elsize == 12) { -- /* string structured array; string argument is OK */ -- if (!((op_descr_type_num == NPY_STRING && -- op_descr->elsize <= dtype_elsize) || -- (op_descr_type_num == NPY_UNICODE && -- op_descr->elsize >> 2 <= dtype_elsize))) { -- return 0; -- } -- } -- else { -- return 0; -- } -- } -- else { /* non-void function argument */ -- PyArray_Descr *tmp = PyArray_DescrFromType(types[i]); -- if (tmp == NULL) { -- return -1; -- } -- if (!PyArray_CanCastTypeTo(op_descr, tmp, casting)) { -- Py_DECREF(tmp); -- return 0; -- } -- Py_DECREF(tmp); -- } -- } -- /* -- * All inputs were ok; now check casting back to the outputs. -- * MHvK: Since no casting from structured to non-structured is -- * possible, no changes needed here. -- */ -- for (i = nin; i < nop; ++i) { -- if (op[i] != NULL) { -- PyArray_Descr *tmp = PyArray_DescrFromType(types[i]); -- if (tmp == NULL) { -- return -1; -- } -- if (!PyArray_CanCastTypeTo(tmp, PyArray_DESCR(op[i]), -- casting)) { -- Py_DECREF(tmp); -- return 0; -- } -- Py_DECREF(tmp); -- } -- } -- return 1; --} --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since this translation function is not exported. -- */ --static const char * --npy_casting_to_string(NPY_CASTING casting) --{ -- switch (casting) { -- case NPY_NO_CASTING: -- return "'no'"; -- case NPY_EQUIV_CASTING: -- return "'equiv'"; -- case NPY_SAFE_CASTING: -- return "'safe'"; -- case NPY_SAME_KIND_CASTING: -- return "'same_kind'"; -- case NPY_UNSAFE_CASTING: -- return "'unsafe'"; -- default: -- return ""; -- } --} -- --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since not exported. -- */ --static PyArray_Descr * --ensure_dtype_nbo(PyArray_Descr *type) --{ -- if (PyArray_ISNBO(type->byteorder)) { -- Py_INCREF(type); -- return type; -- } -- else { -- return PyArray_DescrNewByteorder(type, NPY_NATIVE); -- } --} -- --/* -- * Copy from numpy/core/src/umath/ufunc_type_resolution.c, -- * since not exported. -- */ --static int --set_ufunc_loop_data_types(PyUFuncObject *self, PyArrayObject **op, -- PyArray_Descr **out_dtypes, -- int *type_nums, PyArray_Descr **dtypes) --{ -- int i, nin = self->nin, nop = nin + self->nout; -- -- /* -- * Fill the dtypes array. -- * For outputs, -- * also search the inputs for a matching type_num to copy -- * instead of creating a new one, similarly to preserve metadata. -- **/ -- for (i = 0; i < nop; ++i) { -- if (dtypes != NULL) { -- out_dtypes[i] = dtypes[i]; -- Py_XINCREF(out_dtypes[i]); -- /* -- * Copy the dtype from 'op' if the type_num matches, -- * to preserve metadata. -- */ -- } -- else if (op[i] != NULL && -- PyArray_DESCR(op[i])->type_num == type_nums[i]) { -- out_dtypes[i] = ensure_dtype_nbo(PyArray_DESCR(op[i])); -- } -- /* -- * For outputs, copy the dtype from op[0] if the type_num -- * matches, similarly to preserve metdata. -- */ -- else if (i >= nin && op[0] != NULL && -- PyArray_DESCR(op[0])->type_num == type_nums[i]) { -- out_dtypes[i] = ensure_dtype_nbo(PyArray_DESCR(op[0])); -- } -- /* Otherwise create a plain descr from the type number */ -- else { -- out_dtypes[i] = PyArray_DescrFromType(type_nums[i]); -- } -- -- if (out_dtypes[i] == NULL) { -- goto fail; -- } -- } -- -- return 0; -- --fail: -- while (--i >= 0) { -- Py_DECREF(out_dtypes[i]); -- out_dtypes[i] = NULL; -- } -- return -1; --} -- --/* -- * UFUNC TYPE RESOLVER -- * -- * We provide our own type resolver, since the default one, -- * PyUFunc_DefaultTypeResolver from -- * numpy/core/src/umath/ufunc_type_resolution.c, has problems: -- * 1. It only looks for userloops if any of the operands have a user -- * type, which does not work if the inputs are normal and no explicit -- * output is given (see https://github.com/numpy/numpy/issues/11109). -- * 2. It only allows "safe" casting of inputs, which annoyingly prevents -- * passing in a python int for int32 input. -- * The resolver below solves both, and speeds up the process by -- * explicitly assuming that a ufunc has only one function built in, -- * either a regular one or a userloop (for structured dtype). -- * -- * Combines code from linear_search_type_resolver and -- * linear_search_userloop_type_resolver from -- * numpy/core/src/umath/ufunc_type_resolution.c -- */ --static int ErfaUFuncTypeResolver(PyUFuncObject *ufunc, -- NPY_CASTING casting, -- PyArrayObject **operands, -- PyObject *type_tup, -- PyArray_Descr **out_dtypes) --{ -- int *types; -- PyArray_Descr **dtypes; -- -- if (ufunc->userloops) { -- Py_ssize_t unused_pos = 0; -- PyObject *userloop; -- PyUFunc_Loop1d *funcdata; -- -- if (ufunc->ntypes > 0 || PyDict_Size(ufunc->userloops) != 1) { -- goto fail; -- } -- /* No iteration needed; only one entry in dict */ -- PyDict_Next(ufunc->userloops, &unused_pos, NULL, &userloop); -- funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(userloop, NULL); -- /* There should be only one function */ -- if (funcdata->next != NULL) { -- goto fail; -- } -- types = funcdata->arg_types; -- dtypes = funcdata->arg_dtypes; -- } -- else { -- npy_intp j; -- int types_array[NPY_MAXARGS]; -- -- if (ufunc->ntypes != 1) { -- goto fail; -- } -- /* Copy the types into an int array for matching */ -- for (j = 0; j < ufunc->nargs; ++j) { -- types_array[j] = ufunc->types[j]; -- } -- types = types_array; -- dtypes = NULL; -- } -- switch (ufunc_loop_matches(ufunc, operands, casting, types, dtypes)) { -- case 1: /* Matching types */ -- return set_ufunc_loop_data_types(ufunc, operands, out_dtypes, -- types, dtypes); -- case -1: /* Error */ -- return -1; -- } -- /* No match */ -- PyErr_Format(PyExc_TypeError, -- "ufunc '%s' not supported for the input types, and the " -- "inputs could not be safely coerced to any supported " -- "types according to the casting rule '%s'", -- ufunc->name, npy_casting_to_string(casting)); -- return -1; -- --fail: -- /* More than one loop or function */ -- PyErr_Format(PyExc_RuntimeError, -- "Unexpected internal error: ufunc '%s' wraps an ERFA " -- "function and should have only a single loop with a " -- "single function, yet has more.", -- ufunc->name); -- return -1; --} -- --/* -- * LEAP SECOND ACCESS -- * -- * Getting/Setting ERFAs built-in TAI-UTC table. -- * -- * TODO: the whole procedure is not sub-interpreter safe. -- * In this module, one might get dt_eraLEAPSECOND out of the module dict, -- * and store the leap_second array in a per-module struct (see PEP 3121). -- * But one then would also have to adapt erfa/dat.c to not use a -- * static leap second table. Possibly best might be to copy dat.c here -- * and put the table into the per-module struct as well. -- */ --static PyArray_Descr *dt_eraLEAPSECOND = NULL; /* Set in PyInit_ufunc */ -- --static PyObject * --get_leap_seconds(PyObject *NPY_UNUSED(module), PyObject *NPY_UNUSED(args)) { -- eraLEAPSECOND *leapseconds; -- npy_intp count; -- PyArrayObject *array; -- /* Get the leap seconds from ERFA */ -- count = (npy_intp)eraGetLeapSeconds(&leapseconds); -- if (count < 0) { -- PyErr_SetString(PyExc_RuntimeError, -- "Unpexected failure to get ERFA leap seconds."); -- return NULL; -- } -- /* Allocate an array to hold them */ -- Py_INCREF(dt_eraLEAPSECOND); -- array = (PyArrayObject *)PyArray_NewFromDescr( -- &PyArray_Type, dt_eraLEAPSECOND, 1, &count, NULL, NULL, 0, NULL); -- if (array == NULL) { -- return NULL; -- } -- /* Copy the leap seconds over into the array */ -- memcpy(PyArray_DATA(array), leapseconds, count*sizeof(eraLEAPSECOND)); -- return (PyObject *)array; --} -- --static PyObject * --set_leap_seconds(PyObject *NPY_UNUSED(module), PyObject *args) { -- PyObject *leap_seconds = NULL; -- PyArrayObject *array; -- static PyArrayObject *leap_second_array = NULL; -- -- if (!PyArg_ParseTuple(args, "|O:set_leap_seconds", &leap_seconds)) { -- return NULL; -- } -- if (leap_seconds != NULL && leap_seconds != Py_None) { -- /* -- * Convert the input to an array with the proper dtype; -- * Ensure a copy is made so one cannot change the data by changing -- * the input array. -- */ -- Py_INCREF(dt_eraLEAPSECOND); -- array = (PyArrayObject *)PyArray_FromAny(leap_seconds, dt_eraLEAPSECOND, -- 1, 1, (NPY_ARRAY_CARRAY | NPY_ARRAY_ENSURECOPY), NULL); -- if (array == NULL) { -- return NULL; -- } -- if (PyArray_SIZE(array) == 0) { -- PyErr_SetString(PyExc_ValueError, -- "Leap second array must have at least one entry."); -- } -- /* -- * Use the array for the new leap seconds. -- */ -- eraSetLeapSeconds(PyArray_DATA(array), PyArray_SIZE(array)); -- } -- else { -- /* -- * If no input is given, reset leap second table. -- */ -- array = NULL; -- eraSetLeapSeconds(NULL, 0); -- } -- /* -- * If we allocated a leap second array before, deallocate it, -- * and set it to remember any allocation from PyArray_FromAny. -- */ -- if (leap_second_array != NULL) { -- Py_DECREF(leap_second_array); -- } -- leap_second_array = array; -- Py_RETURN_NONE; --} -- --/* -- * UFUNC MODULE DEFINITIONS AND INITIALIZATION -- */ --static PyMethodDef ErfaUFuncMethods[] = { -- {"get_leap_seconds", (PyCFunction)get_leap_seconds, -- METH_NOARGS, GET_LEAP_SECONDS_DOCSTRING}, -- {"set_leap_seconds", (PyCFunction)set_leap_seconds, -- METH_VARARGS, SET_LEAP_SECONDS_DOCSTRING}, -- {NULL, NULL, 0, NULL} --}; -- --static struct PyModuleDef moduledef = { -- PyModuleDef_HEAD_INIT, -- "ufunc", -- MODULE_DOCSTRING, -- -1, -- ErfaUFuncMethods, -- NULL, -- NULL, -- NULL, -- NULL --}; -- --PyMODINIT_FUNC PyInit_ufunc(void) --{ -- /* module and its dict */ -- PyObject *m, *d; -- /* structured dtypes and their definition */ -- PyObject *dtype_def; -- PyArray_Descr *dt_double = NULL, *dt_int = NULL; -- PyArray_Descr *dt_pv = NULL, *dt_pvdpv = NULL; -- PyArray_Descr *dt_ymdf = NULL, *dt_hmsf = NULL, *dt_dmsf = NULL; -- PyArray_Descr *dt_sign = NULL, *dt_type = NULL; -- PyArray_Descr *dt_eraASTROM = NULL, *dt_eraLDBODY = NULL; -- PyArray_Descr *dtypes[NPY_MAXARGS]; -- /* ufuncs and their definitions */ -- int status; -- PyUFuncObject *ufunc; -- static void *data[1] = {NULL}; -- static char types_cal2jd[6] = { NPY_INT, NPY_INT, NPY_INT, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_cal2jd[1] = { &ufunc_loop_cal2jd }; -- static char types_epb[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_epb[1] = { &ufunc_loop_epb }; -- static char types_epb2jd[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_epb2jd[1] = { &ufunc_loop_epb2jd }; -- static char types_epj[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_epj[1] = { &ufunc_loop_epj }; -- static char types_epj2jd[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_epj2jd[1] = { &ufunc_loop_epj2jd }; -- static char types_jd2cal[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_INT, NPY_INT, NPY_INT, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_jd2cal[1] = { &ufunc_loop_jd2cal }; -- static char types_ab[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ab[1] = { &ufunc_loop_ab }; -- static char types_atci13[11] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_atci13[1] = { &ufunc_loop_atci13 }; -- static char types_atco13[25] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_atco13[1] = { &ufunc_loop_atco13 }; -- static char types_atic13[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_atic13[1] = { &ufunc_loop_atic13 }; -- static char types_atio13[20] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_atio13[1] = { &ufunc_loop_atio13 }; -- static char types_ld[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ld[1] = { &ufunc_loop_ld }; -- static char types_ldsun[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ldsun[1] = { &ufunc_loop_ldsun }; -- static char types_pmpx[9] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pmpx[1] = { &ufunc_loop_pmpx }; -- static char types_pmsafe[17] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_pmsafe[1] = { &ufunc_loop_pmsafe }; -- static char types_refco[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_refco[1] = { &ufunc_loop_refco }; -- static char types_fad03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fad03[1] = { &ufunc_loop_fad03 }; -- static char types_fae03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fae03[1] = { &ufunc_loop_fae03 }; -- static char types_faf03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_faf03[1] = { &ufunc_loop_faf03 }; -- static char types_faju03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_faju03[1] = { &ufunc_loop_faju03 }; -- static char types_fal03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fal03[1] = { &ufunc_loop_fal03 }; -- static char types_falp03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_falp03[1] = { &ufunc_loop_falp03 }; -- static char types_fama03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fama03[1] = { &ufunc_loop_fama03 }; -- static char types_fame03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fame03[1] = { &ufunc_loop_fame03 }; -- static char types_fane03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fane03[1] = { &ufunc_loop_fane03 }; -- static char types_faom03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_faom03[1] = { &ufunc_loop_faom03 }; -- static char types_fapa03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fapa03[1] = { &ufunc_loop_fapa03 }; -- static char types_fasa03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fasa03[1] = { &ufunc_loop_fasa03 }; -- static char types_faur03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_faur03[1] = { &ufunc_loop_faur03 }; -- static char types_fave03[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fave03[1] = { &ufunc_loop_fave03 }; -- static char types_bi00[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_bi00[1] = { &ufunc_loop_bi00 }; -- static char types_bp00[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_bp00[1] = { &ufunc_loop_bp00 }; -- static char types_bp06[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_bp06[1] = { &ufunc_loop_bp06 }; -- static char types_bpn2xy[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_bpn2xy[1] = { &ufunc_loop_bpn2xy }; -- static char types_c2i00a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2i00a[1] = { &ufunc_loop_c2i00a }; -- static char types_c2i00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2i00b[1] = { &ufunc_loop_c2i00b }; -- static char types_c2i06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2i06a[1] = { &ufunc_loop_c2i06a }; -- static char types_c2ibpn[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2ibpn[1] = { &ufunc_loop_c2ibpn }; -- static char types_c2ixy[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2ixy[1] = { &ufunc_loop_c2ixy }; -- static char types_c2ixys[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2ixys[1] = { &ufunc_loop_c2ixys }; -- static char types_c2t00a[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2t00a[1] = { &ufunc_loop_c2t00a }; -- static char types_c2t00b[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2t00b[1] = { &ufunc_loop_c2t00b }; -- static char types_c2t06a[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2t06a[1] = { &ufunc_loop_c2t06a }; -- static char types_c2tcio[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2tcio[1] = { &ufunc_loop_c2tcio }; -- static char types_c2teqx[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2teqx[1] = { &ufunc_loop_c2teqx }; -- static char types_c2tpe[9] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2tpe[1] = { &ufunc_loop_c2tpe }; -- static char types_c2txy[9] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2txy[1] = { &ufunc_loop_c2txy }; -- static char types_eo06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eo06a[1] = { &ufunc_loop_eo06a }; -- static char types_eors[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eors[1] = { &ufunc_loop_eors }; -- static char types_fw2m[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fw2m[1] = { &ufunc_loop_fw2m }; -- static char types_fw2xy[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fw2xy[1] = { &ufunc_loop_fw2xy }; -- static char types_ltp[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ltp[1] = { &ufunc_loop_ltp }; -- static char types_ltpb[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ltpb[1] = { &ufunc_loop_ltpb }; -- static char types_ltpecl[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ltpecl[1] = { &ufunc_loop_ltpecl }; -- static char types_ltpequ[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ltpequ[1] = { &ufunc_loop_ltpequ }; -- static char types_num00a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_num00a[1] = { &ufunc_loop_num00a }; -- static char types_num00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_num00b[1] = { &ufunc_loop_num00b }; -- static char types_num06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_num06a[1] = { &ufunc_loop_num06a }; -- static char types_numat[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_numat[1] = { &ufunc_loop_numat }; -- static char types_nut00a[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_nut00a[1] = { &ufunc_loop_nut00a }; -- static char types_nut00b[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_nut00b[1] = { &ufunc_loop_nut00b }; -- static char types_nut06a[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_nut06a[1] = { &ufunc_loop_nut06a }; -- static char types_nut80[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_nut80[1] = { &ufunc_loop_nut80 }; -- static char types_nutm80[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_nutm80[1] = { &ufunc_loop_nutm80 }; -- static char types_obl06[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_obl06[1] = { &ufunc_loop_obl06 }; -- static char types_obl80[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_obl80[1] = { &ufunc_loop_obl80 }; -- static char types_p06e[18] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_p06e[1] = { &ufunc_loop_p06e }; -- static char types_pb06[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pb06[1] = { &ufunc_loop_pb06 }; -- static char types_pfw06[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pfw06[1] = { &ufunc_loop_pfw06 }; -- static char types_pmat00[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pmat00[1] = { &ufunc_loop_pmat00 }; -- static char types_pmat06[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pmat06[1] = { &ufunc_loop_pmat06 }; -- static char types_pmat76[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pmat76[1] = { &ufunc_loop_pmat76 }; -- static char types_pn00[10] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn00[1] = { &ufunc_loop_pn00 }; -- static char types_pn00a[10] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn00a[1] = { &ufunc_loop_pn00a }; -- static char types_pn00b[10] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn00b[1] = { &ufunc_loop_pn00b }; -- static char types_pn06[10] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn06[1] = { &ufunc_loop_pn06 }; -- static char types_pn06a[10] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn06a[1] = { &ufunc_loop_pn06a }; -- static char types_pnm00a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pnm00a[1] = { &ufunc_loop_pnm00a }; -- static char types_pnm00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pnm00b[1] = { &ufunc_loop_pnm00b }; -- static char types_pnm06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pnm06a[1] = { &ufunc_loop_pnm06a }; -- static char types_pnm80[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pnm80[1] = { &ufunc_loop_pnm80 }; -- static char types_pom00[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pom00[1] = { &ufunc_loop_pom00 }; -- static char types_pr00[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pr00[1] = { &ufunc_loop_pr00 }; -- static char types_prec76[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_prec76[1] = { &ufunc_loop_prec76 }; -- static char types_s00[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s00[1] = { &ufunc_loop_s00 }; -- static char types_s00a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s00a[1] = { &ufunc_loop_s00a }; -- static char types_s00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s00b[1] = { &ufunc_loop_s00b }; -- static char types_s06[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s06[1] = { &ufunc_loop_s06 }; -- static char types_s06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s06a[1] = { &ufunc_loop_s06a }; -- static char types_sp00[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_sp00[1] = { &ufunc_loop_sp00 }; -- static char types_xy06[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_xy06[1] = { &ufunc_loop_xy06 }; -- static char types_xys00a[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_xys00a[1] = { &ufunc_loop_xys00a }; -- static char types_xys00b[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_xys00b[1] = { &ufunc_loop_xys00b }; -- static char types_xys06a[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_xys06a[1] = { &ufunc_loop_xys06a }; -- static char types_ee00[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ee00[1] = { &ufunc_loop_ee00 }; -- static char types_ee00a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ee00a[1] = { &ufunc_loop_ee00a }; -- static char types_ee00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ee00b[1] = { &ufunc_loop_ee00b }; -- static char types_ee06a[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ee06a[1] = { &ufunc_loop_ee06a }; -- static char types_eect00[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eect00[1] = { &ufunc_loop_eect00 }; -- static char types_eqeq94[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eqeq94[1] = { &ufunc_loop_eqeq94 }; -- static char types_era00[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_era00[1] = { &ufunc_loop_era00 }; -- static char types_gmst00[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gmst00[1] = { &ufunc_loop_gmst00 }; -- static char types_gmst06[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gmst06[1] = { &ufunc_loop_gmst06 }; -- static char types_gmst82[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gmst82[1] = { &ufunc_loop_gmst82 }; -- static char types_gst00a[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gst00a[1] = { &ufunc_loop_gst00a }; -- static char types_gst00b[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gst00b[1] = { &ufunc_loop_gst00b }; -- static char types_gst06[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gst06[1] = { &ufunc_loop_gst06 }; -- static char types_gst06a[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gst06a[1] = { &ufunc_loop_gst06a }; -- static char types_gst94[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_gst94[1] = { &ufunc_loop_gst94 }; -- static char types_fk425[12] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk425[1] = { &ufunc_loop_fk425 }; -- static char types_fk45z[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk45z[1] = { &ufunc_loop_fk45z }; -- static char types_fk524[12] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk524[1] = { &ufunc_loop_fk524 }; -- static char types_fk52h[12] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk52h[1] = { &ufunc_loop_fk52h }; -- static char types_fk54z[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk54z[1] = { &ufunc_loop_fk54z }; -- static char types_fk5hip[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk5hip[1] = { &ufunc_loop_fk5hip }; -- static char types_fk5hz[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_fk5hz[1] = { &ufunc_loop_fk5hz }; -- static char types_h2fk5[12] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_h2fk5[1] = { &ufunc_loop_h2fk5 }; -- static char types_hfk5z[8] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_hfk5z[1] = { &ufunc_loop_hfk5z }; -- static char types_starpm[17] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_starpm[1] = { &ufunc_loop_starpm }; -- static char types_eceq06[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eceq06[1] = { &ufunc_loop_eceq06 }; -- static char types_ecm06[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ecm06[1] = { &ufunc_loop_ecm06 }; -- static char types_eqec06[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_eqec06[1] = { &ufunc_loop_eqec06 }; -- static char types_lteceq[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_lteceq[1] = { &ufunc_loop_lteceq }; -- static char types_ltecm[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ltecm[1] = { &ufunc_loop_ltecm }; -- static char types_lteqec[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_lteqec[1] = { &ufunc_loop_lteqec }; -- static char types_g2icrs[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_g2icrs[1] = { &ufunc_loop_g2icrs }; -- static char types_icrs2g[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_icrs2g[1] = { &ufunc_loop_icrs2g }; -- static char types_eform[4] = { NPY_INT, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_eform[1] = { &ufunc_loop_eform }; -- static char types_gc2gd[6] = { NPY_INT, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_gc2gd[1] = { &ufunc_loop_gc2gd }; -- static char types_gc2gde[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_gc2gde[1] = { &ufunc_loop_gc2gde }; -- static char types_gd2gc[6] = { NPY_INT, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_gd2gc[1] = { &ufunc_loop_gd2gc }; -- static char types_gd2gce[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_gd2gce[1] = { &ufunc_loop_gd2gce }; -- static char types_dat[6] = { NPY_INT, NPY_INT, NPY_INT, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_dat[1] = { &ufunc_loop_dat }; -- static char types_dtdb[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_dtdb[1] = { &ufunc_loop_dtdb }; -- static char types_taitt[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_taitt[1] = { &ufunc_loop_taitt }; -- static char types_taiut1[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_taiut1[1] = { &ufunc_loop_taiut1 }; -- static char types_taiutc[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_taiutc[1] = { &ufunc_loop_taiutc }; -- static char types_tcbtdb[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tcbtdb[1] = { &ufunc_loop_tcbtdb }; -- static char types_tcgtt[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tcgtt[1] = { &ufunc_loop_tcgtt }; -- static char types_tdbtcb[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tdbtcb[1] = { &ufunc_loop_tdbtcb }; -- static char types_tdbtt[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tdbtt[1] = { &ufunc_loop_tdbtt }; -- static char types_tttai[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tttai[1] = { &ufunc_loop_tttai }; -- static char types_tttcg[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tttcg[1] = { &ufunc_loop_tttcg }; -- static char types_tttdb[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tttdb[1] = { &ufunc_loop_tttdb }; -- static char types_ttut1[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_ttut1[1] = { &ufunc_loop_ttut1 }; -- static char types_ut1tai[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_ut1tai[1] = { &ufunc_loop_ut1tai }; -- static char types_ut1tt[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_ut1tt[1] = { &ufunc_loop_ut1tt }; -- static char types_ut1utc[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_ut1utc[1] = { &ufunc_loop_ut1utc }; -- static char types_utctai[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_utctai[1] = { &ufunc_loop_utctai }; -- static char types_utcut1[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_utcut1[1] = { &ufunc_loop_utcut1 }; -- static char types_ae2hd[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ae2hd[1] = { &ufunc_loop_ae2hd }; -- static char types_hd2ae[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_hd2ae[1] = { &ufunc_loop_hd2ae }; -- static char types_hd2pa[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_hd2pa[1] = { &ufunc_loop_hd2pa }; -- static char types_tpors[9] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tpors[1] = { &ufunc_loop_tpors }; -- static char types_tporv[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tporv[1] = { &ufunc_loop_tporv }; -- static char types_tpsts[6] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_tpsts[1] = { &ufunc_loop_tpsts }; -- static char types_tpstv[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_tpstv[1] = { &ufunc_loop_tpstv }; -- static char types_tpxes[7] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tpxes[1] = { &ufunc_loop_tpxes }; -- static char types_tpxev[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_INT }; -- static PyUFuncGenericFunction funcs_tpxev[1] = { &ufunc_loop_tpxev }; -- static char types_anp[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_anp[1] = { &ufunc_loop_anp }; -- static char types_anpm[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_anpm[1] = { &ufunc_loop_anpm }; -- static char types_rx[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rx[1] = { &ufunc_loop_rx }; -- static char types_ry[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ry[1] = { &ufunc_loop_ry }; -- static char types_rz[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rz[1] = { &ufunc_loop_rz }; -- static char types_cp[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_cp[1] = { &ufunc_loop_cp }; -- static char types_cr[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_cr[1] = { &ufunc_loop_cr }; -- static char types_ir[1] = { NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ir[1] = { &ufunc_loop_ir }; -- static char types_zp[1] = { NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_zp[1] = { &ufunc_loop_zp }; -- static char types_zr[1] = { NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_zr[1] = { &ufunc_loop_zr }; -- static char types_rxr[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rxr[1] = { &ufunc_loop_rxr }; -- static char types_tr[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_tr[1] = { &ufunc_loop_tr }; -- static char types_rxp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rxp[1] = { &ufunc_loop_rxp }; -- static char types_trxp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_trxp[1] = { &ufunc_loop_trxp }; -- static char types_rm2v[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rm2v[1] = { &ufunc_loop_rm2v }; -- static char types_rv2m[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_rv2m[1] = { &ufunc_loop_rv2m }; -- static char types_pap[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pap[1] = { &ufunc_loop_pap }; -- static char types_pas[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pas[1] = { &ufunc_loop_pas }; -- static char types_sepp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_sepp[1] = { &ufunc_loop_sepp }; -- static char types_seps[5] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_seps[1] = { &ufunc_loop_seps }; -- static char types_c2s[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_c2s[1] = { &ufunc_loop_c2s }; -- static char types_p2s[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_p2s[1] = { &ufunc_loop_p2s }; -- static char types_s2c[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s2c[1] = { &ufunc_loop_s2c }; -- static char types_s2p[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_s2p[1] = { &ufunc_loop_s2p }; -- static char types_pdp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pdp[1] = { &ufunc_loop_pdp }; -- static char types_pm[2] = { NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pm[1] = { &ufunc_loop_pm }; -- static char types_pmp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pmp[1] = { &ufunc_loop_pmp }; -- static char types_pn[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pn[1] = { &ufunc_loop_pn }; -- static char types_ppp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ppp[1] = { &ufunc_loop_ppp }; -- static char types_ppsp[4] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_ppsp[1] = { &ufunc_loop_ppsp }; -- static char types_pxp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_pxp[1] = { &ufunc_loop_pxp }; -- static char types_sxp[3] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE }; -- static PyUFuncGenericFunction funcs_sxp[1] = { &ufunc_loop_sxp }; -- -- m = PyModule_Create(&moduledef); -- if (m == NULL) { -- return NULL; -- } -- d = PyModule_GetDict(m); /* borrowed ref. */ -- if (d == NULL) { -- goto fail; -- } -- -- import_array(); -- import_umath(); -- /* -- * Define the basic and structured types used in erfa so that -- * we can use them for definitions of userloops below. -- */ -- dt_double = PyArray_DescrFromType(NPY_DOUBLE); -- dt_int = PyArray_DescrFromType(NPY_INT); -- /* double[2][3] = pv */ -- dtype_def = Py_BuildValue("[(s, s), (s, s)]", -- "p", "(3,)f8", "v", "(3,)f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_pv); -- Py_DECREF(dtype_def); -- /* double[2] = pvdpv */ -- dtype_def = Py_BuildValue("[(s, s), (s, s)]", -- "pdp", "f8", "pdv", "f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_pvdpv); -- Py_DECREF(dtype_def); -- /* int[4] = ymdf, hmsf, dmsf */ -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "y", "i4", "m", "i4", "d", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_ymdf); -- Py_DECREF(dtype_def); -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "h", "i4", "m", "i4", "s", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_hmsf); -- Py_DECREF(dtype_def); -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s), (s, s)]", -- "h", "i4", "m", "i4", "s", "i4", "f", "i4"); -- PyArray_DescrAlignConverter(dtype_def, &dt_dmsf); -- Py_DECREF(dtype_def); -- /* char1 (have to use structured, otherwise it cannot be a user type) */ -- dtype_def = Py_BuildValue("[(s, s)]", "sign", "S1"); -- PyArray_DescrAlignConverter(dtype_def, &dt_sign); -- Py_DECREF(dtype_def); -- /* char12 */ -- dtype_def = Py_BuildValue("[(s, s)]", "type", "S12"); -- PyArray_DescrAlignConverter(dtype_def, &dt_type); -- Py_DECREF(dtype_def); -- /* eraLDBODY */ -- dtype_def = Py_BuildValue( -- "[(s, s), (s, s), (s, s)]", -- "bm", "f8", /* mass of the body (solar masses) */ -- "dl", "f8", /* deflection limiter (radians^2/2) */ -- "pv", "(2,3)f8" /* barycentric PV of the body (au, au/day) */ -- ); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraLDBODY); -- Py_DECREF(dtype_def); -- /* eraASTROM */ -- dtype_def = Py_BuildValue( -- "[(s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s)," -- " (s, s), (s, s), (s, s), (s, s), (s, s)]", -- "pmt", "f8", /* PM time interval (SSB, Julian years) */ -- "eb", "(3,)f8", /* SSB to observer (vector, au) */ -- "eh", "(3,)f8", /* Sun to observer (unit vector) */ -- "em", "f8", /* distance from Sun to observer (au) */ -- "v", "(3,)f8", /* barycentric observer velocity (vector, c) */ -- "bm1", "f8", /* sqrt(1-|v|^2): reciprocal of Lorenz factor */ -- "bpn", "(3,3)f8", /* bias-precession-nutation matrix */ -- "along", "f8", /* longitude + s' + dERA(DUT) (radians) */ -- "phi", "f8", /* geodetic latitude (radians) */ -- "xpl", "f8", /* polar motion xp wrt local meridian (radians) */ -- "ypl", "f8", /* polar motion yp wrt local meridian (radians) */ -- "sphi", "f8", /* sine of geodetic latitude */ -- "cphi", "f8", /* cosine of geodetic latitude */ -- "diurab", "f8", /* magnitude of diurnal aberration vector */ -- "eral", "f8", /* "local" Earth rotation angle (radians) */ -- "refa", "f8", /* refraction constant A (radians) */ -- "refb", "f8" /* refraction constant B (radians) */ -- ); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraASTROM); -- Py_DECREF(dtype_def); -- /* eraLEAPSECOND */ -- dtype_def = Py_BuildValue("[(s, s), (s, s), (s, s)]", -- "year", "i4", "month", "i4", "tai_utc", "f8"); -- PyArray_DescrAlignConverter(dtype_def, &dt_eraLEAPSECOND); -- Py_DECREF(dtype_def); -- -- if (dt_double == NULL || dt_int == NULL || -- dt_pv == NULL || dt_pvdpv == NULL || -- dt_ymdf == NULL || dt_hmsf == NULL || dt_dmsf == NULL || -- dt_sign == NULL || dt_type == NULL || -- dt_eraLDBODY == NULL || dt_eraASTROM == NULL || -- dt_eraLEAPSECOND == NULL) { -- goto fail; -- } -- /* Make the structured dtypes available in the module */ -- PyDict_SetItemString(d, "dt_pv", (PyObject *)dt_pv); -- PyDict_SetItemString(d, "dt_pvdpv", (PyObject *)dt_pvdpv); -- PyDict_SetItemString(d, "dt_ymdf", (PyObject *)dt_ymdf); -- PyDict_SetItemString(d, "dt_hmsf", (PyObject *)dt_hmsf); -- PyDict_SetItemString(d, "dt_dmsf", (PyObject *)dt_dmsf); -- PyDict_SetItemString(d, "dt_sign", (PyObject *)dt_sign); -- PyDict_SetItemString(d, "dt_type", (PyObject *)dt_type); -- PyDict_SetItemString(d, "dt_eraLDBODY", (PyObject *)dt_eraLDBODY); -- PyDict_SetItemString(d, "dt_eraASTROM", (PyObject *)dt_eraASTROM); -- PyDict_SetItemString(d, "dt_eraLEAPSECOND", (PyObject *)dt_eraLEAPSECOND); -- /* -- * Define the ufuncs. For those without structured dtypes, -- * the ufunc creation uses the static variables defined above; -- * for those with structured dtypes, an empty ufunc is created, -- * and then a userloop is added. For both, we set the type -- * resolver to our own, and then add the ufunc to the module. -- * -- * Note that for the arguments, any inout arguments, i.e., those -- * that are changed in-place in the ERFA function, are repeated, -- * since we want the ufuncs not to do in-place changes (unless -- * explicitly requested with ufunc(..., in,..., out=in)) -- */ -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_cal2jd, data, types_cal2jd, -- 1, 3, 3, PyUFunc_None, -- "cal2jd", -- "UFunc wrapper for eraCal2jd", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "cal2jd", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_epb, data, types_epb, -- 1, 2, 1, PyUFunc_None, -- "epb", -- "UFunc wrapper for eraEpb", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "epb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_epb2jd, data, types_epb2jd, -- 1, 1, 2, PyUFunc_None, -- "epb2jd", -- "UFunc wrapper for eraEpb2jd", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "epb2jd", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_epj, data, types_epj, -- 1, 2, 1, PyUFunc_None, -- "epj", -- "UFunc wrapper for eraEpj", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "epj", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_epj2jd, data, types_epj2jd, -- 1, 1, 2, PyUFunc_None, -- "epj2jd", -- "UFunc wrapper for eraEpj2jd", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "epj2jd", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_jd2cal, data, types_jd2cal, -- 1, 2, 5, PyUFunc_None, -- "jd2cal", -- "UFunc wrapper for eraJd2cal", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "jd2cal", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 2, PyUFunc_None, -- "jdcalf", -- "UFunc wrapper for eraJdcalf", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_int; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_ymdf; -- dtypes[4] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_ymdf, -- ufunc_loop_jdcalf, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "jdcalf", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ab, data, types_ab, -- 1, 4, 1, PyUFunc_None, -- "ab", -- "UFunc wrapper for eraAb", -- 0, "(3),(3),(),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ab", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 1, PyUFunc_None, -- "apcg", -- "UFunc wrapper for eraApcg", -- 0, "(),(),(),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_double; -- dtypes[4] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_apcg, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apcg", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "apcg13", -- "UFunc wrapper for eraApcg13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_apcg13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apcg13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 7, 1, PyUFunc_None, -- "apci", -- "UFunc wrapper for eraApci", -- 0, "(),(),(),(3),(),(),()->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_apci, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apci", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 2, PyUFunc_None, -- "apci13", -- "UFunc wrapper for eraApci13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_apci13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apci13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 16, 1, PyUFunc_None, -- "apco", -- "UFunc wrapper for eraApco", -- 0, "(),(),(),(3),(),(),(),(),(),(),(),(),(),(),(),()->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- dtypes[10] = dt_double; -- dtypes[11] = dt_double; -- dtypes[12] = dt_double; -- dtypes[13] = dt_double; -- dtypes[14] = dt_double; -- dtypes[15] = dt_double; -- dtypes[16] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_apco, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apco", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 12, 3, PyUFunc_None, -- "apco13", -- "UFunc wrapper for eraApco13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- dtypes[10] = dt_double; -- dtypes[11] = dt_double; -- dtypes[12] = dt_eraASTROM; -- dtypes[13] = dt_double; -- dtypes[14] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_apco13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apco13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 5, 1, PyUFunc_None, -- "apcs", -- "UFunc wrapper for eraApcs", -- 0, "(),(),(),(),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_pv; -- dtypes[4] = dt_double; -- dtypes[5] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_apcs, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apcs", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 1, PyUFunc_None, -- "apcs13", -- "UFunc wrapper for eraApcs13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_apcs13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apcs13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "aper", -- "UFunc wrapper for eraAper", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_eraASTROM; -- dtypes[2] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_aper, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "aper", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 1, PyUFunc_None, -- "aper13", -- "UFunc wrapper for eraAper13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_aper13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "aper13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 9, 1, PyUFunc_None, -- "apio", -- "UFunc wrapper for eraApio", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_eraASTROM; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_apio, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apio", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 12, 2, PyUFunc_None, -- "apio13", -- "UFunc wrapper for eraApio13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- dtypes[10] = dt_double; -- dtypes[11] = dt_double; -- dtypes[12] = dt_eraASTROM; -- dtypes[13] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_apio13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "apio13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_atci13, data, types_atci13, -- 1, 8, 3, PyUFunc_None, -- "atci13", -- "UFunc wrapper for eraAtci13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atci13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 7, 2, PyUFunc_None, -- "atciq", -- "UFunc wrapper for eraAtciq", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_eraASTROM; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_atciq, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atciq", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 8, 2, PyUFunc_None, -- "atciqn", -- "UFunc wrapper for eraAtciqn", -- 0, "(),(),(),(),(),(),(),(n)->(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_eraASTROM; -- dtypes[7] = dt_eraLDBODY; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraLDBODY, -- ufunc_loop_atciqn, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atciqn", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 2, PyUFunc_None, -- "atciqz", -- "UFunc wrapper for eraAtciqz", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_atciqz, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atciqz", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_atco13, data, types_atco13, -- 1, 18, 7, PyUFunc_None, -- "atco13", -- "UFunc wrapper for eraAtco13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atco13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_atic13, data, types_atic13, -- 1, 4, 3, PyUFunc_None, -- "atic13", -- "UFunc wrapper for eraAtic13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atic13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 2, PyUFunc_None, -- "aticq", -- "UFunc wrapper for eraAticq", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_aticq, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "aticq", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 2, PyUFunc_None, -- "aticqn", -- "UFunc wrapper for eraAticqn", -- 0, "(),(),(),(n)->(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_eraLDBODY; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraLDBODY, -- ufunc_loop_aticqn, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "aticqn", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_atio13, data, types_atio13, -- 1, 14, 6, PyUFunc_None, -- "atio13", -- "UFunc wrapper for eraAtio13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atio13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 5, PyUFunc_None, -- "atioq", -- "UFunc wrapper for eraAtioq", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_eraASTROM; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraASTROM, -- ufunc_loop_atioq, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atioq", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 15, 3, PyUFunc_None, -- "atoc13", -- "UFunc wrapper for eraAtoc13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_type; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- dtypes[10] = dt_double; -- dtypes[11] = dt_double; -- dtypes[12] = dt_double; -- dtypes[13] = dt_double; -- dtypes[14] = dt_double; -- dtypes[15] = dt_double; -- dtypes[16] = dt_double; -- dtypes[17] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_type, -- ufunc_loop_atoc13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atoc13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 15, 3, PyUFunc_None, -- "atoi13", -- "UFunc wrapper for eraAtoi13", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_type; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_double; -- dtypes[10] = dt_double; -- dtypes[11] = dt_double; -- dtypes[12] = dt_double; -- dtypes[13] = dt_double; -- dtypes[14] = dt_double; -- dtypes[15] = dt_double; -- dtypes[16] = dt_double; -- dtypes[17] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_type, -- ufunc_loop_atoi13, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atoi13", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 2, PyUFunc_None, -- "atoiq", -- "UFunc wrapper for eraAtoiq", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_type; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_eraASTROM; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_type, -- ufunc_loop_atoiq, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "atoiq", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ld, data, types_ld, -- 1, 6, 1, PyUFunc_None, -- "ld", -- "UFunc wrapper for eraLd", -- 0, "(),(3),(3),(3),(),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ld", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 1, PyUFunc_None, -- "ldn", -- "UFunc wrapper for eraLdn", -- 0, "(n),(3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_eraLDBODY; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_eraLDBODY, -- ufunc_loop_ldn, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ldn", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ldsun, data, types_ldsun, -- 1, 3, 1, PyUFunc_None, -- "ldsun", -- "UFunc wrapper for eraLdsun", -- 0, "(3),(3),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ldsun", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmpx, data, types_pmpx, -- 1, 8, 1, PyUFunc_None, -- "pmpx", -- "UFunc wrapper for eraPmpx", -- 0, "(),(),(),(),(),(),(),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmpx", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmsafe, data, types_pmsafe, -- 1, 10, 7, PyUFunc_None, -- "pmsafe", -- "UFunc wrapper for eraPmsafe", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmsafe", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 7, 1, PyUFunc_None, -- "pvtob", -- "UFunc wrapper for eraPvtob", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvtob, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvtob", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_refco, data, types_refco, -- 1, 4, 2, PyUFunc_None, -- "refco", -- "UFunc wrapper for eraRefco", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "refco", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 3, PyUFunc_None, -- "epv00", -- "UFunc wrapper for eraEpv00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_pv; -- dtypes[4] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_epv00, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "epv00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 2, PyUFunc_None, -- "plan94", -- "UFunc wrapper for eraPlan94", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_int; -- dtypes[3] = dt_pv; -- dtypes[4] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_plan94, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "plan94", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fad03, data, types_fad03, -- 1, 1, 1, PyUFunc_None, -- "fad03", -- "UFunc wrapper for eraFad03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fad03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fae03, data, types_fae03, -- 1, 1, 1, PyUFunc_None, -- "fae03", -- "UFunc wrapper for eraFae03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fae03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_faf03, data, types_faf03, -- 1, 1, 1, PyUFunc_None, -- "faf03", -- "UFunc wrapper for eraFaf03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "faf03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_faju03, data, types_faju03, -- 1, 1, 1, PyUFunc_None, -- "faju03", -- "UFunc wrapper for eraFaju03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "faju03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fal03, data, types_fal03, -- 1, 1, 1, PyUFunc_None, -- "fal03", -- "UFunc wrapper for eraFal03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fal03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_falp03, data, types_falp03, -- 1, 1, 1, PyUFunc_None, -- "falp03", -- "UFunc wrapper for eraFalp03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "falp03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fama03, data, types_fama03, -- 1, 1, 1, PyUFunc_None, -- "fama03", -- "UFunc wrapper for eraFama03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fama03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fame03, data, types_fame03, -- 1, 1, 1, PyUFunc_None, -- "fame03", -- "UFunc wrapper for eraFame03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fame03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fane03, data, types_fane03, -- 1, 1, 1, PyUFunc_None, -- "fane03", -- "UFunc wrapper for eraFane03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fane03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_faom03, data, types_faom03, -- 1, 1, 1, PyUFunc_None, -- "faom03", -- "UFunc wrapper for eraFaom03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "faom03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fapa03, data, types_fapa03, -- 1, 1, 1, PyUFunc_None, -- "fapa03", -- "UFunc wrapper for eraFapa03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fapa03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fasa03, data, types_fasa03, -- 1, 1, 1, PyUFunc_None, -- "fasa03", -- "UFunc wrapper for eraFasa03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fasa03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_faur03, data, types_faur03, -- 1, 1, 1, PyUFunc_None, -- "faur03", -- "UFunc wrapper for eraFaur03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "faur03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fave03, data, types_fave03, -- 1, 1, 1, PyUFunc_None, -- "fave03", -- "UFunc wrapper for eraFave03", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fave03", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_bi00, data, types_bi00, -- 1, 0, 3, PyUFunc_None, -- "bi00", -- "UFunc wrapper for eraBi00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "bi00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_bp00, data, types_bp00, -- 1, 2, 3, PyUFunc_None, -- "bp00", -- "UFunc wrapper for eraBp00", -- 0, "(),()->(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "bp00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_bp06, data, types_bp06, -- 1, 2, 3, PyUFunc_None, -- "bp06", -- "UFunc wrapper for eraBp06", -- 0, "(),()->(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "bp06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_bpn2xy, data, types_bpn2xy, -- 1, 1, 2, PyUFunc_None, -- "bpn2xy", -- "UFunc wrapper for eraBpn2xy", -- 0, "(3, 3)->(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "bpn2xy", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2i00a, data, types_c2i00a, -- 1, 2, 1, PyUFunc_None, -- "c2i00a", -- "UFunc wrapper for eraC2i00a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2i00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2i00b, data, types_c2i00b, -- 1, 2, 1, PyUFunc_None, -- "c2i00b", -- "UFunc wrapper for eraC2i00b", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2i00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2i06a, data, types_c2i06a, -- 1, 2, 1, PyUFunc_None, -- "c2i06a", -- "UFunc wrapper for eraC2i06a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2i06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2ibpn, data, types_c2ibpn, -- 1, 3, 1, PyUFunc_None, -- "c2ibpn", -- "UFunc wrapper for eraC2ibpn", -- 0, "(),(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2ibpn", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2ixy, data, types_c2ixy, -- 1, 4, 1, PyUFunc_None, -- "c2ixy", -- "UFunc wrapper for eraC2ixy", -- 0, "(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2ixy", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2ixys, data, types_c2ixys, -- 1, 3, 1, PyUFunc_None, -- "c2ixys", -- "UFunc wrapper for eraC2ixys", -- 0, "(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2ixys", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2t00a, data, types_c2t00a, -- 1, 6, 1, PyUFunc_None, -- "c2t00a", -- "UFunc wrapper for eraC2t00a", -- 0, "(),(),(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2t00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2t00b, data, types_c2t00b, -- 1, 6, 1, PyUFunc_None, -- "c2t00b", -- "UFunc wrapper for eraC2t00b", -- 0, "(),(),(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2t00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2t06a, data, types_c2t06a, -- 1, 6, 1, PyUFunc_None, -- "c2t06a", -- "UFunc wrapper for eraC2t06a", -- 0, "(),(),(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2t06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2tcio, data, types_c2tcio, -- 1, 3, 1, PyUFunc_None, -- "c2tcio", -- "UFunc wrapper for eraC2tcio", -- 0, "(3, 3),(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2tcio", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2teqx, data, types_c2teqx, -- 1, 3, 1, PyUFunc_None, -- "c2teqx", -- "UFunc wrapper for eraC2teqx", -- 0, "(3, 3),(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2teqx", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2tpe, data, types_c2tpe, -- 1, 8, 1, PyUFunc_None, -- "c2tpe", -- "UFunc wrapper for eraC2tpe", -- 0, "(),(),(),(),(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2tpe", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2txy, data, types_c2txy, -- 1, 8, 1, PyUFunc_None, -- "c2txy", -- "UFunc wrapper for eraC2txy", -- 0, "(),(),(),(),(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2txy", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eo06a, data, types_eo06a, -- 1, 2, 1, PyUFunc_None, -- "eo06a", -- "UFunc wrapper for eraEo06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eo06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eors, data, types_eors, -- 1, 2, 1, PyUFunc_None, -- "eors", -- "UFunc wrapper for eraEors", -- 0, "(3, 3),()->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eors", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fw2m, data, types_fw2m, -- 1, 4, 1, PyUFunc_None, -- "fw2m", -- "UFunc wrapper for eraFw2m", -- 0, "(),(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fw2m", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fw2xy, data, types_fw2xy, -- 1, 4, 2, PyUFunc_None, -- "fw2xy", -- "UFunc wrapper for eraFw2xy", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fw2xy", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ltp, data, types_ltp, -- 1, 1, 1, PyUFunc_None, -- "ltp", -- "UFunc wrapper for eraLtp", -- 0, "()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ltp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ltpb, data, types_ltpb, -- 1, 1, 1, PyUFunc_None, -- "ltpb", -- "UFunc wrapper for eraLtpb", -- 0, "()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ltpb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ltpecl, data, types_ltpecl, -- 1, 1, 1, PyUFunc_None, -- "ltpecl", -- "UFunc wrapper for eraLtpecl", -- 0, "()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ltpecl", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ltpequ, data, types_ltpequ, -- 1, 1, 1, PyUFunc_None, -- "ltpequ", -- "UFunc wrapper for eraLtpequ", -- 0, "()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ltpequ", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_num00a, data, types_num00a, -- 1, 2, 1, PyUFunc_None, -- "num00a", -- "UFunc wrapper for eraNum00a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "num00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_num00b, data, types_num00b, -- 1, 2, 1, PyUFunc_None, -- "num00b", -- "UFunc wrapper for eraNum00b", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "num00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_num06a, data, types_num06a, -- 1, 2, 1, PyUFunc_None, -- "num06a", -- "UFunc wrapper for eraNum06a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "num06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_numat, data, types_numat, -- 1, 3, 1, PyUFunc_None, -- "numat", -- "UFunc wrapper for eraNumat", -- 0, "(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "numat", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_nut00a, data, types_nut00a, -- 1, 2, 2, PyUFunc_None, -- "nut00a", -- "UFunc wrapper for eraNut00a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "nut00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_nut00b, data, types_nut00b, -- 1, 2, 2, PyUFunc_None, -- "nut00b", -- "UFunc wrapper for eraNut00b", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "nut00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_nut06a, data, types_nut06a, -- 1, 2, 2, PyUFunc_None, -- "nut06a", -- "UFunc wrapper for eraNut06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "nut06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_nut80, data, types_nut80, -- 1, 2, 2, PyUFunc_None, -- "nut80", -- "UFunc wrapper for eraNut80", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "nut80", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_nutm80, data, types_nutm80, -- 1, 2, 1, PyUFunc_None, -- "nutm80", -- "UFunc wrapper for eraNutm80", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "nutm80", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_obl06, data, types_obl06, -- 1, 2, 1, PyUFunc_None, -- "obl06", -- "UFunc wrapper for eraObl06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "obl06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_obl80, data, types_obl80, -- 1, 2, 1, PyUFunc_None, -- "obl80", -- "UFunc wrapper for eraObl80", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "obl80", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_p06e, data, types_p06e, -- 1, 2, 16, PyUFunc_None, -- "p06e", -- "UFunc wrapper for eraP06e", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "p06e", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pb06, data, types_pb06, -- 1, 2, 3, PyUFunc_None, -- "pb06", -- "UFunc wrapper for eraPb06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pb06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pfw06, data, types_pfw06, -- 1, 2, 4, PyUFunc_None, -- "pfw06", -- "UFunc wrapper for eraPfw06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pfw06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmat00, data, types_pmat00, -- 1, 2, 1, PyUFunc_None, -- "pmat00", -- "UFunc wrapper for eraPmat00", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmat00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmat06, data, types_pmat06, -- 1, 2, 1, PyUFunc_None, -- "pmat06", -- "UFunc wrapper for eraPmat06", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmat06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmat76, data, types_pmat76, -- 1, 2, 1, PyUFunc_None, -- "pmat76", -- "UFunc wrapper for eraPmat76", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmat76", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn00, data, types_pn00, -- 1, 4, 6, PyUFunc_None, -- "pn00", -- "UFunc wrapper for eraPn00", -- 0, "(),(),(),()->(),(3, 3),(3, 3),(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn00a, data, types_pn00a, -- 1, 2, 8, PyUFunc_None, -- "pn00a", -- "UFunc wrapper for eraPn00a", -- 0, "(),()->(),(),(),(3, 3),(3, 3),(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn00b, data, types_pn00b, -- 1, 2, 8, PyUFunc_None, -- "pn00b", -- "UFunc wrapper for eraPn00b", -- 0, "(),()->(),(),(),(3, 3),(3, 3),(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn06, data, types_pn06, -- 1, 4, 6, PyUFunc_None, -- "pn06", -- "UFunc wrapper for eraPn06", -- 0, "(),(),(),()->(),(3, 3),(3, 3),(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn06a, data, types_pn06a, -- 1, 2, 8, PyUFunc_None, -- "pn06a", -- "UFunc wrapper for eraPn06a", -- 0, "(),()->(),(),(),(3, 3),(3, 3),(3, 3),(3, 3),(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pnm00a, data, types_pnm00a, -- 1, 2, 1, PyUFunc_None, -- "pnm00a", -- "UFunc wrapper for eraPnm00a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pnm00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pnm00b, data, types_pnm00b, -- 1, 2, 1, PyUFunc_None, -- "pnm00b", -- "UFunc wrapper for eraPnm00b", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pnm00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pnm06a, data, types_pnm06a, -- 1, 2, 1, PyUFunc_None, -- "pnm06a", -- "UFunc wrapper for eraPnm06a", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pnm06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pnm80, data, types_pnm80, -- 1, 2, 1, PyUFunc_None, -- "pnm80", -- "UFunc wrapper for eraPnm80", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pnm80", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pom00, data, types_pom00, -- 1, 3, 1, PyUFunc_None, -- "pom00", -- "UFunc wrapper for eraPom00", -- 0, "(),(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pom00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pr00, data, types_pr00, -- 1, 2, 2, PyUFunc_None, -- "pr00", -- "UFunc wrapper for eraPr00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pr00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_prec76, data, types_prec76, -- 1, 4, 3, PyUFunc_None, -- "prec76", -- "UFunc wrapper for eraPrec76", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "prec76", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s00, data, types_s00, -- 1, 4, 1, PyUFunc_None, -- "s00", -- "UFunc wrapper for eraS00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s00a, data, types_s00a, -- 1, 2, 1, PyUFunc_None, -- "s00a", -- "UFunc wrapper for eraS00a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s00b, data, types_s00b, -- 1, 2, 1, PyUFunc_None, -- "s00b", -- "UFunc wrapper for eraS00b", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s06, data, types_s06, -- 1, 4, 1, PyUFunc_None, -- "s06", -- "UFunc wrapper for eraS06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s06a, data, types_s06a, -- 1, 2, 1, PyUFunc_None, -- "s06a", -- "UFunc wrapper for eraS06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_sp00, data, types_sp00, -- 1, 2, 1, PyUFunc_None, -- "sp00", -- "UFunc wrapper for eraSp00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "sp00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_xy06, data, types_xy06, -- 1, 2, 2, PyUFunc_None, -- "xy06", -- "UFunc wrapper for eraXy06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "xy06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_xys00a, data, types_xys00a, -- 1, 2, 3, PyUFunc_None, -- "xys00a", -- "UFunc wrapper for eraXys00a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "xys00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_xys00b, data, types_xys00b, -- 1, 2, 3, PyUFunc_None, -- "xys00b", -- "UFunc wrapper for eraXys00b", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "xys00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_xys06a, data, types_xys06a, -- 1, 2, 3, PyUFunc_None, -- "xys06a", -- "UFunc wrapper for eraXys06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "xys06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ee00, data, types_ee00, -- 1, 4, 1, PyUFunc_None, -- "ee00", -- "UFunc wrapper for eraEe00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ee00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ee00a, data, types_ee00a, -- 1, 2, 1, PyUFunc_None, -- "ee00a", -- "UFunc wrapper for eraEe00a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ee00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ee00b, data, types_ee00b, -- 1, 2, 1, PyUFunc_None, -- "ee00b", -- "UFunc wrapper for eraEe00b", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ee00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ee06a, data, types_ee06a, -- 1, 2, 1, PyUFunc_None, -- "ee06a", -- "UFunc wrapper for eraEe06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ee06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eect00, data, types_eect00, -- 1, 2, 1, PyUFunc_None, -- "eect00", -- "UFunc wrapper for eraEect00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eect00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eqeq94, data, types_eqeq94, -- 1, 2, 1, PyUFunc_None, -- "eqeq94", -- "UFunc wrapper for eraEqeq94", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eqeq94", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_era00, data, types_era00, -- 1, 2, 1, PyUFunc_None, -- "era00", -- "UFunc wrapper for eraEra00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "era00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gmst00, data, types_gmst00, -- 1, 4, 1, PyUFunc_None, -- "gmst00", -- "UFunc wrapper for eraGmst00", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gmst00", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gmst06, data, types_gmst06, -- 1, 4, 1, PyUFunc_None, -- "gmst06", -- "UFunc wrapper for eraGmst06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gmst06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gmst82, data, types_gmst82, -- 1, 2, 1, PyUFunc_None, -- "gmst82", -- "UFunc wrapper for eraGmst82", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gmst82", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gst00a, data, types_gst00a, -- 1, 4, 1, PyUFunc_None, -- "gst00a", -- "UFunc wrapper for eraGst00a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gst00a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gst00b, data, types_gst00b, -- 1, 2, 1, PyUFunc_None, -- "gst00b", -- "UFunc wrapper for eraGst00b", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gst00b", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gst06, data, types_gst06, -- 1, 5, 1, PyUFunc_None, -- "gst06", -- "UFunc wrapper for eraGst06", -- 0, "(),(),(),(),(3, 3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gst06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gst06a, data, types_gst06a, -- 1, 4, 1, PyUFunc_None, -- "gst06a", -- "UFunc wrapper for eraGst06a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gst06a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gst94, data, types_gst94, -- 1, 2, 1, PyUFunc_None, -- "gst94", -- "UFunc wrapper for eraGst94", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gst94", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 7, PyUFunc_None, -- "pvstar", -- "UFunc wrapper for eraPvstar", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- dtypes[7] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvstar, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvstar", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 6, 2, PyUFunc_None, -- "starpv", -- "UFunc wrapper for eraStarpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_pv; -- dtypes[7] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_starpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "starpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk425, data, types_fk425, -- 1, 6, 6, PyUFunc_None, -- "fk425", -- "UFunc wrapper for eraFk425", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk425", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk45z, data, types_fk45z, -- 1, 3, 2, PyUFunc_None, -- "fk45z", -- "UFunc wrapper for eraFk45z", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk45z", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk524, data, types_fk524, -- 1, 6, 6, PyUFunc_None, -- "fk524", -- "UFunc wrapper for eraFk524", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk524", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk52h, data, types_fk52h, -- 1, 6, 6, PyUFunc_None, -- "fk52h", -- "UFunc wrapper for eraFk52h", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk52h", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk54z, data, types_fk54z, -- 1, 3, 4, PyUFunc_None, -- "fk54z", -- "UFunc wrapper for eraFk54z", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk54z", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk5hip, data, types_fk5hip, -- 1, 0, 2, PyUFunc_None, -- "fk5hip", -- "UFunc wrapper for eraFk5hip", -- 0, "->(3, 3),(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk5hip", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_fk5hz, data, types_fk5hz, -- 1, 4, 2, PyUFunc_None, -- "fk5hz", -- "UFunc wrapper for eraFk5hz", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "fk5hz", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_h2fk5, data, types_h2fk5, -- 1, 6, 6, PyUFunc_None, -- "h2fk5", -- "UFunc wrapper for eraH2fk5", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "h2fk5", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_hfk5z, data, types_hfk5z, -- 1, 4, 4, PyUFunc_None, -- "hfk5z", -- "UFunc wrapper for eraHfk5z", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "hfk5z", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_starpm, data, types_starpm, -- 1, 10, 7, PyUFunc_None, -- "starpm", -- "UFunc wrapper for eraStarpm", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "starpm", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eceq06, data, types_eceq06, -- 1, 4, 2, PyUFunc_None, -- "eceq06", -- "UFunc wrapper for eraEceq06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eceq06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ecm06, data, types_ecm06, -- 1, 2, 1, PyUFunc_None, -- "ecm06", -- "UFunc wrapper for eraEcm06", -- 0, "(),()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ecm06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eqec06, data, types_eqec06, -- 1, 4, 2, PyUFunc_None, -- "eqec06", -- "UFunc wrapper for eraEqec06", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eqec06", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_lteceq, data, types_lteceq, -- 1, 3, 2, PyUFunc_None, -- "lteceq", -- "UFunc wrapper for eraLteceq", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "lteceq", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ltecm, data, types_ltecm, -- 1, 1, 1, PyUFunc_None, -- "ltecm", -- "UFunc wrapper for eraLtecm", -- 0, "()->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ltecm", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_lteqec, data, types_lteqec, -- 1, 3, 2, PyUFunc_None, -- "lteqec", -- "UFunc wrapper for eraLteqec", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "lteqec", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_g2icrs, data, types_g2icrs, -- 1, 2, 2, PyUFunc_None, -- "g2icrs", -- "UFunc wrapper for eraG2icrs", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "g2icrs", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_icrs2g, data, types_icrs2g, -- 1, 2, 2, PyUFunc_None, -- "icrs2g", -- "UFunc wrapper for eraIcrs2g", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "icrs2g", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_eform, data, types_eform, -- 1, 1, 3, PyUFunc_None, -- "eform", -- "UFunc wrapper for eraEform", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "eform", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gc2gd, data, types_gc2gd, -- 1, 2, 4, PyUFunc_None, -- "gc2gd", -- "UFunc wrapper for eraGc2gd", -- 0, "(),(3)->(),(),(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gc2gd", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gc2gde, data, types_gc2gde, -- 1, 3, 4, PyUFunc_None, -- "gc2gde", -- "UFunc wrapper for eraGc2gde", -- 0, "(),(),(3)->(),(),(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gc2gde", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gd2gc, data, types_gd2gc, -- 1, 4, 2, PyUFunc_None, -- "gd2gc", -- "UFunc wrapper for eraGd2gc", -- 0, "(),(),(),()->(3),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gd2gc", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_gd2gce, data, types_gd2gce, -- 1, 5, 2, PyUFunc_None, -- "gd2gce", -- "UFunc wrapper for eraGd2gce", -- 0, "(),(),(),(),()->(3),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "gd2gce", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 5, PyUFunc_None, -- "d2dtf", -- "UFunc wrapper for eraD2dtf", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_type; -- dtypes[1] = dt_int; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_int; -- dtypes[5] = dt_int; -- dtypes[6] = dt_int; -- dtypes[7] = dt_hmsf; -- dtypes[8] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_type, -- ufunc_loop_d2dtf, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "d2dtf", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_dat, data, types_dat, -- 1, 4, 2, PyUFunc_None, -- "dat", -- "UFunc wrapper for eraDat", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "dat", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_dtdb, data, types_dtdb, -- 1, 6, 1, PyUFunc_None, -- "dtdb", -- "UFunc wrapper for eraDtdb", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "dtdb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 7, 3, PyUFunc_None, -- "dtf2d", -- "UFunc wrapper for eraDtf2d", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_type; -- dtypes[1] = dt_int; -- dtypes[2] = dt_int; -- dtypes[3] = dt_int; -- dtypes[4] = dt_int; -- dtypes[5] = dt_int; -- dtypes[6] = dt_double; -- dtypes[7] = dt_double; -- dtypes[8] = dt_double; -- dtypes[9] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_type, -- ufunc_loop_dtf2d, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "dtf2d", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_taitt, data, types_taitt, -- 1, 2, 3, PyUFunc_None, -- "taitt", -- "UFunc wrapper for eraTaitt", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "taitt", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_taiut1, data, types_taiut1, -- 1, 3, 3, PyUFunc_None, -- "taiut1", -- "UFunc wrapper for eraTaiut1", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "taiut1", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_taiutc, data, types_taiutc, -- 1, 2, 3, PyUFunc_None, -- "taiutc", -- "UFunc wrapper for eraTaiutc", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "taiutc", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tcbtdb, data, types_tcbtdb, -- 1, 2, 3, PyUFunc_None, -- "tcbtdb", -- "UFunc wrapper for eraTcbtdb", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tcbtdb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tcgtt, data, types_tcgtt, -- 1, 2, 3, PyUFunc_None, -- "tcgtt", -- "UFunc wrapper for eraTcgtt", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tcgtt", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tdbtcb, data, types_tdbtcb, -- 1, 2, 3, PyUFunc_None, -- "tdbtcb", -- "UFunc wrapper for eraTdbtcb", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tdbtcb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tdbtt, data, types_tdbtt, -- 1, 3, 3, PyUFunc_None, -- "tdbtt", -- "UFunc wrapper for eraTdbtt", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tdbtt", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tttai, data, types_tttai, -- 1, 2, 3, PyUFunc_None, -- "tttai", -- "UFunc wrapper for eraTttai", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tttai", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tttcg, data, types_tttcg, -- 1, 2, 3, PyUFunc_None, -- "tttcg", -- "UFunc wrapper for eraTttcg", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tttcg", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tttdb, data, types_tttdb, -- 1, 3, 3, PyUFunc_None, -- "tttdb", -- "UFunc wrapper for eraTttdb", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tttdb", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ttut1, data, types_ttut1, -- 1, 3, 3, PyUFunc_None, -- "ttut1", -- "UFunc wrapper for eraTtut1", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ttut1", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ut1tai, data, types_ut1tai, -- 1, 3, 3, PyUFunc_None, -- "ut1tai", -- "UFunc wrapper for eraUt1tai", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ut1tai", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ut1tt, data, types_ut1tt, -- 1, 3, 3, PyUFunc_None, -- "ut1tt", -- "UFunc wrapper for eraUt1tt", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ut1tt", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ut1utc, data, types_ut1utc, -- 1, 3, 3, PyUFunc_None, -- "ut1utc", -- "UFunc wrapper for eraUt1utc", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ut1utc", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_utctai, data, types_utctai, -- 1, 2, 3, PyUFunc_None, -- "utctai", -- "UFunc wrapper for eraUtctai", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "utctai", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_utcut1, data, types_utcut1, -- 1, 3, 3, PyUFunc_None, -- "utcut1", -- "UFunc wrapper for eraUtcut1", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "utcut1", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ae2hd, data, types_ae2hd, -- 1, 3, 2, PyUFunc_None, -- "ae2hd", -- "UFunc wrapper for eraAe2hd", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ae2hd", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_hd2ae, data, types_hd2ae, -- 1, 3, 2, PyUFunc_None, -- "hd2ae", -- "UFunc wrapper for eraHd2ae", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "hd2ae", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_hd2pa, data, types_hd2pa, -- 1, 3, 1, PyUFunc_None, -- "hd2pa", -- "UFunc wrapper for eraHd2pa", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "hd2pa", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tpors, data, types_tpors, -- 1, 4, 5, PyUFunc_None, -- "tpors", -- "UFunc wrapper for eraTpors", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tpors", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tporv, data, types_tporv, -- 1, 3, 3, PyUFunc_None, -- "tporv", -- "UFunc wrapper for eraTporv", -- 0, "(),(),(3)->(3),(3),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tporv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tpsts, data, types_tpsts, -- 1, 4, 2, PyUFunc_None, -- "tpsts", -- "UFunc wrapper for eraTpsts", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tpsts", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tpstv, data, types_tpstv, -- 1, 3, 1, PyUFunc_None, -- "tpstv", -- "UFunc wrapper for eraTpstv", -- 0, "(),(),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tpstv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tpxes, data, types_tpxes, -- 1, 4, 3, PyUFunc_None, -- "tpxes", -- "UFunc wrapper for eraTpxes", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tpxes", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tpxev, data, types_tpxev, -- 1, 2, 3, PyUFunc_None, -- "tpxev", -- "UFunc wrapper for eraTpxev", -- 0, "(3),(3)->(),(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tpxev", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 2, PyUFunc_None, -- "a2af", -- "UFunc wrapper for eraA2af", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_int; -- dtypes[1] = dt_double; -- dtypes[2] = dt_sign; -- dtypes[3] = dt_dmsf; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_a2af, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "a2af", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 2, PyUFunc_None, -- "a2tf", -- "UFunc wrapper for eraA2tf", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_int; -- dtypes[1] = dt_double; -- dtypes[2] = dt_sign; -- dtypes[3] = dt_hmsf; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_a2tf, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "a2tf", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 2, PyUFunc_None, -- "af2a", -- "UFunc wrapper for eraAf2a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_sign; -- dtypes[1] = dt_int; -- dtypes[2] = dt_int; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_af2a, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "af2a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_anp, data, types_anp, -- 1, 1, 1, PyUFunc_None, -- "anp", -- "UFunc wrapper for eraAnp", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "anp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_anpm, data, types_anpm, -- 1, 1, 1, PyUFunc_None, -- "anpm", -- "UFunc wrapper for eraAnpm", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "anpm", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 2, PyUFunc_None, -- "d2tf", -- "UFunc wrapper for eraD2tf", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_int; -- dtypes[1] = dt_double; -- dtypes[2] = dt_sign; -- dtypes[3] = dt_hmsf; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_d2tf, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "d2tf", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 2, PyUFunc_None, -- "tf2a", -- "UFunc wrapper for eraTf2a", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_sign; -- dtypes[1] = dt_int; -- dtypes[2] = dt_int; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_tf2a, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tf2a", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 4, 2, PyUFunc_None, -- "tf2d", -- "UFunc wrapper for eraTf2d", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_sign; -- dtypes[1] = dt_int; -- dtypes[2] = dt_int; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_int; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_sign, -- ufunc_loop_tf2d, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tf2d", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rx, data, types_rx, -- 1, 2, 1, PyUFunc_None, -- "rx", -- "UFunc wrapper for eraRx", -- 0, "(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rx", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ry, data, types_ry, -- 1, 2, 1, PyUFunc_None, -- "ry", -- "UFunc wrapper for eraRy", -- 0, "(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ry", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rz, data, types_rz, -- 1, 2, 1, PyUFunc_None, -- "rz", -- "UFunc wrapper for eraRz", -- 0, "(),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rz", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_cp, data, types_cp, -- 1, 1, 1, PyUFunc_None, -- "cp", -- "UFunc wrapper for eraCp", -- 0, "(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "cp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 1, PyUFunc_None, -- "cpv", -- "UFunc wrapper for eraCpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_cpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "cpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_cr, data, types_cr, -- 1, 1, 1, PyUFunc_None, -- "cr", -- "UFunc wrapper for eraCr", -- 0, "(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "cr", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 1, PyUFunc_None, -- "p2pv", -- "UFunc wrapper for eraP2pv", -- 0, "(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_p2pv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "p2pv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 1, PyUFunc_None, -- "pv2p", -- "UFunc wrapper for eraPv2p", -- 0, "()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pv2p, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pv2p", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ir, data, types_ir, -- 1, 0, 1, PyUFunc_None, -- "ir", -- "UFunc wrapper for eraIr", -- 0, "->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ir", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_zp, data, types_zp, -- 1, 0, 1, PyUFunc_None, -- "zp", -- "UFunc wrapper for eraZp", -- 0, "->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "zp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 0, 1, PyUFunc_None, -- "zpv", -- "UFunc wrapper for eraZpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_zpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "zpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_zr, data, types_zr, -- 1, 0, 1, PyUFunc_None, -- "zr", -- "UFunc wrapper for eraZr", -- 0, "->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "zr", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rxr, data, types_rxr, -- 1, 2, 1, PyUFunc_None, -- "rxr", -- "UFunc wrapper for eraRxr", -- 0, "(3, 3),(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rxr", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_tr, data, types_tr, -- 1, 1, 1, PyUFunc_None, -- "tr", -- "UFunc wrapper for eraTr", -- 0, "(3, 3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "tr", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rxp, data, types_rxp, -- 1, 2, 1, PyUFunc_None, -- "rxp", -- "UFunc wrapper for eraRxp", -- 0, "(3, 3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rxp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "rxpv", -- "UFunc wrapper for eraRxpv", -- 0, "(3, 3),()->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_rxpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rxpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_trxp, data, types_trxp, -- 1, 2, 1, PyUFunc_None, -- "trxp", -- "UFunc wrapper for eraTrxp", -- 0, "(3, 3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "trxp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "trxpv", -- "UFunc wrapper for eraTrxpv", -- 0, "(3, 3),()->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_trxpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "trxpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rm2v, data, types_rm2v, -- 1, 1, 1, PyUFunc_None, -- "rm2v", -- "UFunc wrapper for eraRm2v", -- 0, "(3, 3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rm2v", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_rv2m, data, types_rv2m, -- 1, 1, 1, PyUFunc_None, -- "rv2m", -- "UFunc wrapper for eraRv2m", -- 0, "(3)->(3, 3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "rv2m", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pap, data, types_pap, -- 1, 2, 1, PyUFunc_None, -- "pap", -- "UFunc wrapper for eraPap", -- 0, "(3),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pap", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pas, data, types_pas, -- 1, 4, 1, PyUFunc_None, -- "pas", -- "UFunc wrapper for eraPas", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pas", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_sepp, data, types_sepp, -- 1, 2, 1, PyUFunc_None, -- "sepp", -- "UFunc wrapper for eraSepp", -- 0, "(3),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "sepp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_seps, data, types_seps, -- 1, 4, 1, PyUFunc_None, -- "seps", -- "UFunc wrapper for eraSeps", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "seps", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_c2s, data, types_c2s, -- 1, 1, 2, PyUFunc_None, -- "c2s", -- "UFunc wrapper for eraC2s", -- 0, "(3)->(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "c2s", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_p2s, data, types_p2s, -- 1, 1, 3, PyUFunc_None, -- "p2s", -- "UFunc wrapper for eraP2s", -- 0, "(3)->(),(),()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "p2s", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 6, PyUFunc_None, -- "pv2s", -- "UFunc wrapper for eraPv2s", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pv2s, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pv2s", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s2c, data, types_s2c, -- 1, 2, 1, PyUFunc_None, -- "s2c", -- "UFunc wrapper for eraS2c", -- 0, "(),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s2c", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_s2p, data, types_s2p, -- 1, 3, 1, PyUFunc_None, -- "s2p", -- "UFunc wrapper for eraS2p", -- 0, "(),(),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s2p", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 6, 1, PyUFunc_None, -- "s2pv", -- "UFunc wrapper for eraS2pv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- dtypes[3] = dt_double; -- dtypes[4] = dt_double; -- dtypes[5] = dt_double; -- dtypes[6] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_s2pv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s2pv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pdp, data, types_pdp, -- 1, 2, 1, PyUFunc_None, -- "pdp", -- "UFunc wrapper for eraPdp", -- 0, "(3),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pdp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pm, data, types_pm, -- 1, 1, 1, PyUFunc_None, -- "pm", -- "UFunc wrapper for eraPm", -- 0, "(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pm", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pmp, data, types_pmp, -- 1, 2, 1, PyUFunc_None, -- "pmp", -- "UFunc wrapper for eraPmp", -- 0, "(3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pmp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pn, data, types_pn, -- 1, 1, 2, PyUFunc_None, -- "pn", -- "UFunc wrapper for eraPn", -- 0, "(3)->(),(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pn", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ppp, data, types_ppp, -- 1, 2, 1, PyUFunc_None, -- "ppp", -- "UFunc wrapper for eraPpp", -- 0, "(3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ppp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_ppsp, data, types_ppsp, -- 1, 3, 1, PyUFunc_None, -- "ppsp", -- "UFunc wrapper for eraPpsp", -- 0, "(3),(),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "ppsp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvdpv", -- "UFunc wrapper for eraPvdpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pvdpv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvdpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvdpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 2, PyUFunc_None, -- "pvm", -- "UFunc wrapper for eraPvm", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvm, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvm", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvmpv", -- "UFunc wrapper for eraPvmpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvmpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvmpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvppv", -- "UFunc wrapper for eraPvppv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvppv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvppv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvu", -- "UFunc wrapper for eraPvu", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvu, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvu", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvup", -- "UFunc wrapper for eraPvup", -- 0, "(),()->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvup, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvup", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pvxpv", -- "UFunc wrapper for eraPvxpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pvxpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pvxpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_pxp, data, types_pxp, -- 1, 2, 1, PyUFunc_None, -- "pxp", -- "UFunc wrapper for eraPxp", -- 0, "(3),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pxp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 3, 1, PyUFunc_None, -- "s2xpv", -- "UFunc wrapper for eraS2xpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- dtypes[3] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_s2xpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "s2xpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- funcs_sxp, data, types_sxp, -- 1, 2, 1, PyUFunc_None, -- "sxp", -- "UFunc wrapper for eraSxp", -- 0, "(),(3)->(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "sxp", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "sxpv", -- "UFunc wrapper for eraSxpv", -- 0, NULL); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_pv; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_sxpv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "sxpv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 2, 1, PyUFunc_None, -- "pav2pv", -- "UFunc wrapper for eraPav2pv", -- 0, "(3),(3)->()"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_double; -- dtypes[1] = dt_double; -- dtypes[2] = dt_pv; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pav2pv, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pav2pv", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- ufunc = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignature( -- NULL, NULL, NULL, -- 0, 1, 2, PyUFunc_None, -- "pv2pav", -- "UFunc wrapper for eraPv2pav", -- 0, "()->(3),(3)"); -- if (ufunc == NULL) { -- goto fail; -- } -- dtypes[0] = dt_pv; -- dtypes[1] = dt_double; -- dtypes[2] = dt_double; -- status = PyUFunc_RegisterLoopForDescr( -- ufunc, dt_pv, -- ufunc_loop_pv2pav, dtypes, NULL); -- if(status != 0){ -- Py_DECREF(ufunc); -- goto fail; -- } -- ufunc->type_resolver = &ErfaUFuncTypeResolver; -- PyDict_SetItemString(d, "pv2pav", (PyObject *)ufunc); -- Py_DECREF(ufunc); -- -- goto decref; -- --fail: -- Py_XDECREF(m); -- m = NULL; -- --decref: -- Py_XDECREF(dt_double); -- Py_XDECREF(dt_int); -- Py_XDECREF(dt_pv); -- Py_XDECREF(dt_pvdpv); -- Py_XDECREF(dt_ymdf); -- Py_XDECREF(dt_hmsf); -- Py_XDECREF(dt_dmsf); -- Py_XDECREF(dt_sign); -- Py_XDECREF(dt_type); -- Py_XDECREF(dt_eraASTROM); -- Py_XDECREF(dt_eraLDBODY); -- Py_XDECREF(dt_eraLEAPSECOND); -- return m; --} -\ No newline at end of file -Index: astropy-4.1/CHANGES.rst -=================================================================== ---- astropy-4.1.orig/CHANGES.rst -+++ astropy-4.1/CHANGES.rst -@@ -1,3 +1,11 @@ -+PR10329 -- rebased to 4.1 -+======= -+ -+- The private ``_erfa`` module has been converted to its own package, -+ ``pyerfa``, which is a required dependency for astropy, and can be imported -+ with ``import erfa``. Importing ``_erfa`` from ``astropy`` will give a -+ deprecation warning. [#10329] -+ - 4.1 (2020-10-21) - ================ - diff --git a/python-astropy.changes b/python-astropy.changes index f326143..e10513c 100644 --- a/python-astropy.changes +++ b/python-astropy.changes @@ -1,3 +1,22 @@ +------------------------------------------------------------------- +Sat Nov 28 21:28:47 UTC 2020 - Benjamin Greiner + +- Update to Version 4.2 + Astropy 4.2 is a major release that adds new funcionality since + the 4.1 release. + In particular, this release includes: + * Planck 2018 is accepted and now the default cosmology + * Time performance improvements + * Removed ERFA module + In addition to these major changes, Astropy v4.2 includes smaller + improvements and bug fixes and significant cleanup, which are + described in the Full Changelog. By the numbers: + * 183 issues have been closed since v4.1 + * 105 pull requests have been merged since v4.1 + * 63 distinct people have contributed code +- Bump requirements versions +- Drop astropy-pr10329-unbundle-erfa_4.1.patch merged upstream + ------------------------------------------------------------------- Thu Oct 22 09:36:36 UTC 2020 - Benjamin Greiner diff --git a/python-astropy.spec b/python-astropy.spec index 82a0270..88a7591 100644 --- a/python-astropy.spec +++ b/python-astropy.spec @@ -34,8 +34,10 @@ %{?!python_module:%define python_module() python3-%{**}} %define skip_python2 1 +# upcoming python3 multiflavor: minimum supported python is 3.7 +%define skip_python36 1 Name: python-astropy -Version: 4.1 +Version: 4.2 Release: 0 Summary: Community-developed python astronomy tools License: BSD-3-Clause @@ -44,43 +46,41 @@ Source: https://files.pythonhosted.org/packages/source/a/astropy/astropy # Mark wcs headers as false positives for devel-file-in-non-devel-package # These are used by the python files so they must be available. Source100: python-astropy-rpmlintrc -# PATCH-FEATURE-UPSTREAM astropy-pr10329-unbundle-erfa_4.1.patch gh#astropy/astropy#10329 -- unbundle _erfa and use pyerfa instead -Patch0: astropy-pr10329-unbundle-erfa_4.1.patch # https://docs.astropy.org/en/v4.1/install.html#requirements BuildRequires: %{python_module Cython >= 0.21} BuildRequires: %{python_module Jinja2} BuildRequires: %{python_module devel} BuildRequires: %{python_module extension-helpers} -BuildRequires: %{python_module numpy-devel >= 1.16} +BuildRequires: %{python_module numpy-devel >= 1.17} +BuildRequires: %{python_module pyerfa} BuildRequires: %{python_module setuptools_scm} BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: hdf5-devel BuildRequires: pkgconfig BuildRequires: python-rpm-macros -Requires: python >= 3.6 +Requires: python >= 3.7 Requires: python-dbm -Requires: python-numpy >= 1.16.0 +Requires: python-numpy >= 1.17 Requires(post): update-alternatives Requires(postun): update-alternatives Recommends: libxml2-tools Recommends: python-Bottleneck -Recommends: python-PyYAML >= 3.12 +Recommends: python-PyYAML >= 3.13 Recommends: python-asdf >= 2.6 Recommends: python-beautifulsoup4 Recommends: python-bleach Recommends: python-h5py Recommends: python-html5lib Recommends: python-jplephem -Recommends: python-matplotlib >= 2.1 +Recommends: python-matplotlib >= 3 Recommends: python-mpmath Recommends: python-pandas -Recommends: python-scipy >= 0.18 +Recommends: python-scipy >= 1.1 Recommends: python-setuptools Recommends: python-sortedcontainers Conflicts: perl-Data-ShowTable %if %{with systemlibs} -BuildRequires: %{python_module pyerfa} BuildRequires: pkgconfig(cfitsio) BuildRequires: pkgconfig(expat) BuildRequires: pkgconfig(wcslib) >= 7 @@ -89,17 +89,17 @@ Requires: python-pyerfa %if %{with test} # SECTION Optional requirements BuildRequires: %{python_module Bottleneck} -BuildRequires: %{python_module PyYAML >= 3.12} +BuildRequires: %{python_module PyYAML >= 3.13} BuildRequires: %{python_module asdf >= 2.6} BuildRequires: %{python_module beautifulsoup4} BuildRequires: %{python_module bleach} BuildRequires: %{python_module h5py} BuildRequires: %{python_module html5lib} BuildRequires: %{python_module jplephem} -BuildRequires: %{python_module matplotlib >= 2.1} +BuildRequires: %{python_module matplotlib >= 3} BuildRequires: %{python_module mpmath} BuildRequires: %{python_module pandas} -BuildRequires: %{python_module scipy >= 0.18} +BuildRequires: %{python_module scipy >= 1.1} BuildRequires: %{python_module sortedcontainers} BuildRequires: libxml2-tools # /SECTION @@ -128,18 +128,12 @@ managing them. %setup -q -n astropy-%{version} %if %{with systemlibs} -# unbundle liberfa with new package pyerfa -%patch0 -p1 -rm -rf cextern/erfa -rm licenses/ERFA.rst - # Make sure bundled libs are not used rm -rf cextern/cfitsio rm -rf cextern/expat rm -rf cextern/wcslib rm licenses/EXPAT_LICENSE.rst rm licenses/WCSLIB_LICENSE.rst - %endif # Disable test failure on DeprecationWarnings @@ -179,7 +173,7 @@ pytestargs = ('-v ' '-n auto ' # pytest-xdist '-p no:cacheprovider ' '--hypothesis-profile=obs ' - '$testselect_expr') + '$testselect_expr') returncode = astropy.test(args=pytestargs) sys.exit(returncode) "