1
0
python-astropy/astropy-pr10329-unbundle-erfa_4.1.patch
Benjamin Greiner 18c04387c7 Accepting request 843474 from home:bnavigator:branches:devel:languages:python:numeric
- Update to 4.1
  Astropy 4.1 is a major release that contains bug fixes and new
  features since the 4.0.x series of releases.  In particular, this 
  release includes:
  * A new SpectralCoord class for representing and transforming 
    spectral quantities
  * Support for writing Dask arrays to FITS files
  * Added True Equator Mean Equinox (TEME) frame for satellite two-
    line ephemeris data
  * Support for in-place setting of array-valued SkyCoord and frame 
    objects
  * Change in the definition of equality comparison for coordinate 
    classes
  * Support use of SkyCoord in table vstack, dstack, and insert_row
  * Support for table cross-match join with SkyCoord or N-d columns
  * Support for custom attributes in Table subclasses
  * Added a new Time subformat unix_tai
  * Added support for the -TAB convention in FITS WCS
  * Support for replacing submodels in CompoundModel
  * Support for units on otherwise unitless models via the 
    Model.coerce_units method.
  * Support for ASDF serialization of models
  In addition to these major changes, Astropy v4.0 includes a large
  number of smaller improvements and bug fixes, which are described
  in the Full Changelog. By the numbers:
  * 381 issues have been closed since v4.0
  * 511 pull requests have been merged since v4.0
  * 66 distinct people have contributed code to this release, 23 of
    which are first time contributors to Astropy 
- Drop astropy-pr10545-remove-newline-3d_cd_hdr.patch
  * merged upstream
  * gh#astropy/astropy#10545
- Add astropy-pr10329-unbundle-erfa_4.1.patch
  * Remove bundled _erfa but use system package pyerfa instead
  * gh#astropy/astropy#10329
- enable optional pytest-xdist
- Update to 4.0.3
  * astropy.table  
    Fixed a small bug where initializing an empty `Column` 
    with a structured dtype with a length and a shape 
    failed to give the requested dtype. [#10819]
  * Fixed installation of the source distribution with 
    pip<19. [#10837, #10852]

OBS-URL: https://build.opensuse.org/request/show/843474
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:numeric/python-astropy?expand=0&rev=36
2020-10-23 11:32:38 +00:00

38123 lines
1.2 MiB

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 <http://jinja.pocoo.org/>`_ 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 *<name> is the pointer to the data in memory;
- * npy_intp s_<name> is the number of bytes between successive elements;
- * <ctype> *_<name> is a correctly cast pointer to the current element;
- * (<ctype> _<name>, 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 "<unknown>";
- }
-}
-
-/*
- * 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 <https://github.com/liberfa/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
-<https://github.com/astropy/astropy/blob/master/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
-<https://github.com/astropy/astropy/blob/master/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 <https://github.com/liberfa>`_ see ``cextern/erfa/README.rst`` for the
- bundled version. To use the system version, set ``ASTROPY_USE_SYSTEM_ERFA=1``.
-
- `expat <https://libexpat.github.io/>`_ 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 <https://en.wikipedia.org/wiki/Time_standard>`_ article
-.. [#] SOFA Time Scale and Calendar Tools
+.. [#] SOFA_ Time Scale and Calendar Tools
`(PDF) <http://www.iausofa.org/sofa_ts_c.pdf>`_
.. [#] `<https://www.ucolick.org/~sla/leapsecs/timescales.html>`_
@@ -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
<http://www.iausofa.org/sofa_ts_c.pdf>`_ 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 <http://www.iausofa.org/sofa_ts_c.pdf>`_ 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 <https://github.com/liberfa/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
-<https://github.com/liberfa/erfa>`_ 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 *<name> is the pointer to the data in memory;
- * npy_intp s_<name> is the number of bytes between successive elements;
- * <ctype> *_<name> is a correctly cast pointer to the current element;
- * (<ctype> _<name>, 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 "<unknown>";
- }
-}
-
-/*
- * 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)
================