Files
sjy01-image-proc/vendor/github.com/hebl/gofa/catalog.go
2024-10-24 15:46:01 +08:00

1093 lines
33 KiB
Go

// Copyright 2022 HE Boliang
// All rights reserved.
package gofa
/*
Fk425 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 float64 B1950.0 RA,Dec (rad)
dr1950,dd1950 float64 B1950.0 proper motions (rad/trop.yr)
p1950 float64 parallax (arcsec)
v1950 float64 radial velocity (km/s, +ve = moving away)
Returned: (all J2000.0, FK5)
r2000,d2000 float64 J2000.0 RA,Dec (rad)
dr2000,dd2000 float64 J2000.0 proper motions (rad/Jul.yr)
p2000 float64 parallax (arcsec)
v2000 float64 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 SOFA 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:
Anp normalize angle into range 0 to 2pi
Pv2s pv-vector to spherical coordinates
Pdp scalar product of two p-vectors
Pvmpv pv-vector minus pv_vector
Pvppv pv-vector plus pv_vector
S2pv spherical coordinates to pv-vector
Sxp 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.
*/
func Fk425(r1950, d1950 float64, dr1950, dd1950 float64, p1950, v1950 float64,
r2000, d2000 *float64, dr2000, dd2000 *float64, p2000, v2000 *float64) {
/* Radians per year to arcsec per century */
const PMF = 100.0 * DR2AS
/* Small number to avoid arithmetic problems */
const TINY = 1e-30
/* Miscellaneous */
var r, d, ur, ud, px, rv, pxvf, w, rd float64
var i, j, k, l int
/* Pv-vectors */
var r0, pv1, pv2 [2][3]float64
/*
CANONICAL CONSTANTS (Seidelmann 1992)
*/
/* Km per sec to AU per tropical century */
/* = 86400 * 36524.2198782 / 149597870.7 */
const VF = 21.095
/* Constant pv-vector (cf. Seidelmann 3.591-2, vectors A and Adot) */
a := [2][3]float64{
{-1.62557e-6, -0.31919e-6, -0.13843e-6},
{+1.245e-3, -1.580e-3, -0.659e-3},
}
/* 3x2 matrix of pv-vectors (cf. Seidelmann 3.591-4, matrix M) */
em := [2][3][2][3]float64{
{{{+0.9999256782, -0.0111820611, -0.0048579477},
{+0.00000242395018, -0.00000002710663, -0.00000001177656}},
{{+0.0111820610, +0.9999374784, -0.0000271765},
{+0.00000002710663, +0.00000242397878, -0.00000000006587}},
{{+0.0048579479, -0.0000271474, +0.9999881997},
{+0.00000001177656, -0.00000000006582, +0.00000242410173}}},
{{{-0.000551, -0.238565, +0.435739},
{+0.99994704, -0.01118251, -0.00485767}},
{{+0.238514, -0.002667, -0.008541},
{+0.01118251, +0.99995883, -0.00002718}},
{{-0.435623, +0.012254, +0.002117},
{+0.00485767, -0.00002714, +1.00000956}}},
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* The FK4 data (units radians and arcsec per tropical century). */
r = r1950
d = d1950
ur = dr1950 * PMF
ud = dd1950 * PMF
px = p1950
rv = v1950
/* Express as a pv-vector. */
pxvf = px * VF
w = rv * pxvf
S2pv(r, d, 1.0, ur, ud, w, &r0)
/* Allow for E-terms (cf. Seidelmann 3.591-2). */
Pvmpv(r0, a, &pv1)
Sxp(Pdp(r0[0], a[0]), r0[0], &pv2[0])
Sxp(Pdp(r0[0], a[1]), r0[0], &pv2[1])
Pvppv(pv1, pv2, &pv1)
/* Convert pv-vector to Fricke system (cf. Seidelmann 3.591-3). */
for i = 0; i < 2; i++ {
for j = 0; j < 3; j++ {
w = 0.0
for k = 0; k < 2; k++ {
for l = 0; l < 3; l++ {
w += em[i][j][k][l] * pv1[k][l]
}
}
pv2[i][j] = w
}
}
/* Revert to catalog form. */
Pv2s(pv2, &r, &d, &w, &ur, &ud, &rd)
if px > TINY {
rv = rd / pxvf
px = px / w
}
/* Return the results. */
*r2000 = Anp(r)
*d2000 = d
*dr2000 = ur / PMF
*dd2000 = ud / PMF
*v2000 = rv
*p2000 = px
}
/*
Fk45z 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 function requires the epoch at which the position in the FK4
system was determined.
Given:
r1950,d1950 float64 B1950.0 FK4 RA,Dec at epoch (rad)
bepoch float64 Besselian epoch (e.g. 1979.3)
Returned:
r2000,d2000 float64 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 function Fk425
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 SOFA 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.
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:
Anp normalize angle into range 0 to 2pi
C2s p-vector to spherical
Epb2jd Besselian epoch to Julian date
Epj Julian date to Julian epoch
Pdp scalar product of two p-vectors
Pmp p-vector minus p-vector
Ppsp p-vector plus scaled p-vector
Pvu update a pv-vector
S2c spherical to p-vector
*/
func Fk45z(r1950, d1950, bepoch float64, r2000, d2000 *float64) {
/* Radians per year to arcsec per century */
const PMF = 100.0 * DR2AS
/* Position and position+velocity vectors */
var r0, p [3]float64
var pv [2][3]float64
/* Miscellaneous */
var w, djm0, djm float64
var i, j, k int
/*
CANONICAL CONSTANTS (Seidelmann 1992)
*/
/* Vectors A and Adot (Seidelmann 3.591-2) */
a := [3]float64{-1.62557e-6, -0.31919e-6, -0.13843e-6}
ad := [3]float64{+1.245e-3, -1.580e-3, -0.659e-3}
/* 3x2 matrix of p-vectors (cf. Seidelmann 3.591-4, matrix M) */
em := [2][3][3]float64{
{{+0.9999256782, -0.0111820611, -0.0048579477},
{+0.0111820610, +0.9999374784, -0.0000271765},
{+0.0048579479, -0.0000271474, +0.9999881997}},
{{-0.000551, -0.238565, +0.435739},
{+0.238514, -0.002667, -0.008541},
{-0.435623, +0.012254, +0.002117}},
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* Spherical coordinates to p-vector. */
S2c(r1950, d1950, &r0)
/* Adjust p-vector A to give zero proper motion in FK5. */
w = (bepoch - 1950) / PMF
Ppsp(a, w, ad, &p)
/* Remove E-terms. */
Ppsp(p, -Pdp(r0, p), r0, &p)
Pmp(r0, p, &p)
/* Convert to Fricke system pv-vector (cf. Seidelmann 3.591-3). */
for i = 0; i < 2; i++ {
for j = 0; j < 3; j++ {
w = 0.0
for k = 0; k < 3; k++ {
w += em[i][j][k] * p[k]
}
pv[i][j] = w
}
}
/* Allow for fictitious proper motion. */
Epb2jd(bepoch, &djm0, &djm)
w = (Epj(djm0, djm) - 2000.0) / PMF
Pvu(w, pv, &pv)
/* Revert to spherical coordinates. */
C2s(pv[0], &w, d2000)
*r2000 = Anp(w)
}
/*
Fk524 Convert J2000.0 FK5 star catalog data to B1950.0 FK4
Given: (all J2000.0, FK5)
r2000,d2000 float64 J2000.0 RA,Dec (rad)
dr2000,dd2000 float64 J2000.0 proper motions (rad/Jul.yr)
p2000 float64 parallax (arcsec)
v2000 float64 radial velocity (km/s, +ve = moving away)
Returned: (all B1950.0, FK4)
r1950,d1950 float64 B1950.0 RA,Dec (rad)
dr1950,dd1950 float64 B1950.0 proper motions (rad/trop.yr)
p1950 float64 parallax (arcsec)
v1950 float64 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.
3. 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 SOFA 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:
Anp normalize angle into range 0 to 2pi
Pdp scalar product of two p-vectors
Pm modulus of p-vector
Pmp p-vector minus p-vector
Ppp p-vector pluus p-vector
Pv2s pv-vector to spherical coordinates
S2pv spherical coordinates to pv-vector
Sxp 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.
*/
func Fk524(r2000, d2000 float64, dr2000, dd2000 float64, p2000, v2000 float64,
r1950, d1950 *float64, dr1950, dd1950 *float64, p1950, v1950 *float64) {
/* Radians per year to arcsec per century */
const PMF = 100.0 * DR2AS
/* Small number to avoid arithmetic problems */
const TINY = 1e-30
/* Miscellaneous */
var r, d, ur, ud, px, rv, pxvf, w, rd float64
var i, j, k, l int
/* Vectors, p and pv */
var r0, r1, pv [2][3]float64
var p1, p2 [3]float64
/*
CANONICAL CONSTANTS (Seidelmann 1992)
*/
/* Km per sec to AU per tropical century */
/* = 86400 * 36524.2198782 / 149597870.7 */
const VF = 21.095
/* Constant pv-vector (cf. Seidelmann 3.591-2, vectors A and Adot) */
a := [2][3]float64{
{-1.62557e-6, -0.31919e-6, -0.13843e-6},
{+1.245e-3, -1.580e-3, -0.659e-3},
}
/* 3x2 matrix of pv-vectors (cf. Seidelmann 3.592-1, matrix M^-1) */
em := [2][3][2][3]float64{
{{
{+0.9999256795, +0.0111814828, +0.0048590039},
{-0.00000242389840, -0.00000002710544, -0.00000001177742},
}, {
{-0.0111814828, +0.9999374849, -0.0000271771},
{+0.00000002710544, -0.00000242392702, +0.00000000006585},
}, {
{-0.0048590040, -0.0000271557, +0.9999881946},
{+0.00000001177742, +0.00000000006585, -0.00000242404995},
},
},
{{
{-0.000551, +0.238509, -0.435614},
{+0.99990432, +0.01118145, +0.00485852},
}, {
{-0.238560, -0.002667, +0.012254},
{-0.01118145, +0.99991613, -0.00002717},
}, {
{+0.435730, -0.008541, +0.002117},
{-0.00485852, -0.00002716, +0.99996684},
}},
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* The FK5 data (units radians and arcsec per Julian century). */
r = r2000
d = d2000
ur = dr2000 * PMF
ud = dd2000 * PMF
px = p2000
rv = v2000
/* Express as a pv-vector. */
pxvf = px * VF
w = rv * pxvf
S2pv(r, d, 1.0, ur, ud, w, &r0)
/* Convert pv-vector to Bessel-Newcomb system (cf. Seidelmann 3.592-1). */
for i = 0; i < 2; i++ {
for j = 0; j < 3; j++ {
w = 0.0
for k = 0; k < 2; k++ {
for l = 0; l < 3; l++ {
w += em[i][j][k][l] * r0[k][l]
}
}
r1[i][j] = w
}
}
/* Apply E-terms (equivalent to Seidelmann 3.592-3, one iteration). */
/* Direction. */
w = Pm(r1[0])
Sxp(Pdp(r1[0], a[0]), r1[0], &p1)
Sxp(w, a[0], &p2)
Pmp(p2, p1, &p1)
Ppp(r1[0], p1, &p1)
/* Recompute length. */
w = Pm(p1)
/* Direction. */
Sxp(Pdp(r1[0], a[0]), r1[0], &p1)
Sxp(w, a[0], &p2)
Pmp(p2, p1, &p1)
Ppp(r1[0], p1, &pv[0])
/* Derivative. */
Sxp(Pdp(r1[0], a[1]), pv[0], &p1)
Sxp(w, a[1], &p2)
Pmp(p2, p1, &p1)
Ppp(r1[1], p1, &pv[1])
/* Revert to catalog form. */
Pv2s(pv, &r, &d, &w, &ur, &ud, &rd)
if px > TINY {
rv = rd / pxvf
px = px / w
}
/* Return the results. */
*r1950 = Anp(r)
*d1950 = d
*dr1950 = ur / PMF
*dd1950 = ud / PMF
*p1950 = px
*v1950 = rv
}
/*
Fk52h Transform FK5 (J2000.0) star data into the Hipparcos frame
Given (all FK5, equinox J2000.0, epoch J2000.0):
r5 float64 RA (radians)
d5 float64 Dec (radians)
dr5 float64 proper motion in RA (dRA/dt, rad/Jyear)
dd5 float64 proper motion in Dec (dDec/dt, rad/Jyear)
px5 float64 parallax (arcsec)
rv5 float64 radial velocity (km/s, positive = receding)
Returned (all Hipparcos, epoch J2000.0):
rh float64 RA (radians)
dh float64 Dec (radians)
drh float64 proper motion in RA (dRA/dt, rad/Jyear)
ddh float64 proper motion in Dec (dDec/dt, rad/Jyear)
pxh float64 parallax (arcsec)
rvh float64 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 H2fk5, Fk5hz, Hfk5z.
Called:
Starpv star catalog data to space motion pv-vector
Fk5hip FK5 to Hipparcos rotation and spin
Rxp product of r-matrix and p-vector
Pxp vector product of two p-vectors
Ppp p-vector plus p-vector
Pvstar space motion pv-vector to star catalog data
Reference:
F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000).
*/
func Fk52h(r5, d5 float64, dr5, dd5, px5, rv5 float64,
rh, dh *float64, drh, ddh, pxh, rvh *float64) {
var i int
var pv5, pvh [2][3]float64
var r5h [3][3]float64
var s5h, wxp, vv [3]float64
/* FK5 barycentric position/velocity pv-vector (normalized). */
Starpv(r5, d5, dr5, dd5, px5, rv5, &pv5)
/* FK5 to Hipparcos orientation matrix and spin vector. */
Fk5hip(&r5h, &s5h)
/* Make spin units per day instead of per year. */
for i = 0; i < 3; i++ {
s5h[i] /= 365.25
}
/* Orient the FK5 position into the Hipparcos system. */
Rxp(r5h, pv5[0], &pvh[0])
/* Apply spin to the position giving an extra space motion component. */
Pxp(pv5[0], s5h, &wxp)
/* Add this component to the FK5 space motion. */
Ppp(wxp, pv5[1], &vv)
/* Orient the FK5 space motion into the Hipparcos system. */
Rxp(r5h, vv, &pvh[1])
/* Hipparcos pv-vector to spherical. */
Pvstar(pvh, rh, dh, drh, ddh, pxh, rvh)
}
/*
Fk54z Convert a J2000.0 FK5 star position to B1950.0 FK4, assuming zero proper motion in FK5 system and zero parallax
Given:
r2000,d2000 float64 J2000.0 FK5 RA,Dec (rad)
bepoch float64 Besselian epoch (e.g. 1950.0)
Returned:
r1950,d1950 float64 B1950.0 FK4 RA,Dec (rad) at epoch BEPOCH
dr1950,dd1950 float64 B1950.0 FK4 proper motions (rad/trop.yr)
Notes:
1. In contrast to the Fk524 function, 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 function returns those fictitious proper
motions.
3. Conversion from J2000.0 FK5 to B1950.0 FK4 only is provided for.
Conversions involving other equinoxes would require additional
treatment for precession.
4. The position returned by this function 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:
Anp normalize angle into range 0 to 2pi
C2s p-vector to spherical
Fk524 FK4 to FK5
S2c spherical to p-vector
*/
func Fk54z(r2000, d2000, bepoch float64, r1950, d1950 *float64, dr1950, dd1950 *float64) {
var r, d, pr, pd, px, rv, w float64
var p, v [3]float64
var i int
/* FK5 equinox J2000.0 to FK4 equinox B1950.0. */
Fk524(r2000, d2000, 0.0, 0.0, 0.0, 0.0,
&r, &d, &pr, &pd, &px, &rv)
/* Spherical to Cartesian. */
S2c(r, d, &p)
/* Fictitious proper motion (radians per year). */
v[0] = -pr*p[1] - pd*cos(r)*sin(d)
v[1] = pr*p[0] - pd*sin(r)*sin(d)
v[2] = pd * cos(d)
/* Apply the motion. */
w = bepoch - 1950.0
for i = 0; i < 3; i++ {
p[i] += w * v[i]
}
/* Cartesian to spherical. */
C2s(p, &w, d1950)
*r1950 = Anp(w)
/* Fictitious proper motion. */
*dr1950 = pr
*dd1950 = pd
}
/*
Fk5hip FK5 orientation and spin with respect to Hipparcos
Returned:
r5h [3][3]float64 r-matrix: FK5 rotation wrt Hipparcos (Note 2)
s5h [3]float64 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:
Rv2m r-vector to r-matrix
Reference:
F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000).
*/
func Fk5hip(r5h *[3][3]float64, s5h *[3]float64) {
var v [3]float64
/* FK5 wrt Hipparcos orientation and spin (radians, radians/year) */
var epx, epy, epz float64
var omx, omy, omz float64
epx = -19.9e-3 * DAS2R
epy = -9.1e-3 * DAS2R
epz = 22.9e-3 * DAS2R
omx = -0.30e-3 * DAS2R
omy = 0.60e-3 * DAS2R
omz = 0.70e-3 * DAS2R
/* FK5 to Hipparcos orientation expressed as an r-vector. */
v[0] = epx
v[1] = epy
v[2] = epz
/* Re-express as an r-matrix. */
Rv2m(v, r5h)
/* Hipparcos wrt FK5 spin expressed as an r-vector. */
s5h[0] = omx
s5h[1] = omy
s5h[2] = omz
}
/*
Fk5hz FK5 to Hipparcos assuming zero Hipparcos proper motion
Transform an FK5 (J2000.0) star position into the system of the
Hipparcos catalogue, assuming zero Hipparcos proper motion.
Given:
r5 float64 FK5 RA (radians), equinox J2000.0, at date
d5 float64 FK5 Dec (radians), equinox J2000.0, at date
date1,date2 float64 TDB date (Notes 1,2)
Returned:
rh float64 Hipparcos RA (radians)
dh float64 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 Fk52h, H2fk5, Hfk5z.
Called:
S2c spherical coordinates to unit vector
Fk5hip FK5 to Hipparcos rotation and spin
Sxp multiply p-vector by scalar
Rv2m r-vector to r-matrix
Trxp product of transpose of r-matrix and p-vector
Pxp vector product of two p-vectors
C2s p-vector to spherical
Anp normalize angle into range 0 to 2pi
Reference:
F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739.
*/
func Fk5hz(r5, d5 float64, date1, date2 float64, rh, dh *float64) {
var t, w float64
var p5e, s5h, vst, p5, ph [3]float64
var r5h, rst [3][3]float64
/* Interval from given date to fundamental epoch J2000.0 (JY). */
t = -((date1 - DJ00) + date2) / DJY
/* FK5 barycentric position vector. */
S2c(r5, d5, &p5e)
/* FK5 to Hipparcos orientation matrix and spin vector. */
Fk5hip(&r5h, &s5h)
/* Accumulated Hipparcos wrt FK5 spin over that interval. */
Sxp(t, s5h, &vst)
/* Express the accumulated spin as a rotation matrix. */
Rv2m(vst, &rst)
/* Derotate the vector's FK5 axes back to date. */
Trxp(rst, p5e, &p5)
/* Rotate the vector into the Hipparcos system. */
Rxp(r5h, p5, &ph)
/* Hipparcos vector to spherical. */
C2s(ph, &w, dh)
*rh = Anp(w)
}
/*
H2fk5 Transform Hipparcos star data into the FK5 (J2000.0) frame
Given (all Hipparcos, epoch J2000.0):
rh float64 RA (radians)
dh float64 Dec (radians)
drh float64 proper motion in RA (dRA/dt, rad/Jyear)
ddh float64 proper motion in Dec (dDec/dt, rad/Jyear)
pxh float64 parallax (arcsec)
rvh float64 radial velocity (km/s, positive = receding)
Returned (all FK5, equinox J2000.0, epoch J2000.0):
r5 float64 RA (radians)
d5 float64 Dec (radians)
dr5 float64 proper motion in RA (dRA/dt, rad/Jyear)
dd5 float64 proper motion in Dec (dDec/dt, rad/Jyear)
px5 float64 parallax (arcsec)
rv5 float64 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 Fk52h, Fk5hz, Hfk5z.
Called:
Starpv star catalog data to space motion pv-vector
Fk5hip FK5 to Hipparcos rotation and spin
Rv2m r-vector to r-matrix
Rxp product of r-matrix and p-vector
Trxp product of transpose of r-matrix and p-vector
Pxp vector product of two p-vectors
Pmp p-vector minus p-vector
Pvstar space motion pv-vector to star catalog data
Reference:
F.Mignard & M.Froeschle, Astron.Astrophys., 354, 732-739 (2000).
*/
func H2fk5(rh, dh float64, drh, ddh, pxh, rvh float64,
r5, d5 *float64, dr5, dd5, px5, rv5 *float64) {
var i int
var pvh, pv5 [2][3]float64
var r5h [3][3]float64
var s5h, sh, wxp, vv [3]float64
/* Hipparcos barycentric position/velocity pv-vector (normalized). */
Starpv(rh, dh, drh, ddh, pxh, rvh, &pvh)
/* FK5 to Hipparcos orientation matrix and spin vector. */
Fk5hip(&r5h, &s5h)
/* Make spin units per day instead of per year. */
for i = 0; i < 3; i++ {
s5h[i] /= 365.25
}
/* Orient the spin into the Hipparcos system. */
Rxp(r5h, s5h, &sh)
/* De-orient the Hipparcos position into the FK5 system. */
Trxp(r5h, pvh[0], &pv5[0])
/* Apply spin to the position giving an extra space motion component. */
Pxp(pvh[0], sh, &wxp)
/* Subtract this component from the Hipparcos space motion. */
Pmp(pvh[1], wxp, &vv)
/* De-orient the Hipparcos space motion into the FK5 system. */
Trxp(r5h, vv, &pv5[1])
/* FK5 pv-vector to spherical. */
Pvstar(pv5, r5, d5, dr5, dd5, px5, rv5)
}
/*
Hfk5z Hipparcos to FK5 assuming zero Hipparcos proper motion
Transform a Hipparcos star position into FK5 J2000.0, assuming
zero Hipparcos proper motion.
Given:
rh float64 Hipparcos RA (radians)
dh float64 Hipparcos Dec (radians)
date1,date2 float64 TDB date (Note 1)
Returned (all FK5, equinox J2000.0, date date1+date2):
r5 float64 RA (radians)
d5 float64 Dec (radians)
dr5 float64 FK5 RA proper motion (rad/year, Note 4)
dd5 float64 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 Fk52h, H2fk5, Fk5hz.
Called:
S2c spherical coordinates to unit vector
Fk5hip FK5 to Hipparcos rotation and spin
Rxp product of r-matrix and p-vector
Sxp multiply p-vector by scalar
Rxr product of two r-matrices
Trxp product of transpose of r-matrix and p-vector
Pxp vector product of two p-vectors
Pv2s pv-vector to spherical
Anp normalize angle into range 0 to 2pi
Reference:
F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739.
*/
func Hfk5z(rh, dh float64, date1, date2 float64, r5, d5, dr5, dd5 *float64) {
var t, w, r, v float64
var ph, s5h, sh, vst, vv [3]float64
var pv5e [2][3]float64
var r5h, rst, r5ht [3][3]float64
/* Time interval from fundamental epoch J2000.0 to given date (JY). */
t = ((date1 - DJ00) + date2) / DJY
/* Hipparcos barycentric position vector (normalized). */
S2c(rh, dh, &ph)
/* FK5 to Hipparcos orientation matrix and spin vector. */
Fk5hip(&r5h, &s5h)
/* Rotate the spin into the Hipparcos system. */
Rxp(r5h, s5h, &sh)
/* Accumulated Hipparcos wrt FK5 spin over that interval. */
Sxp(t, s5h, &vst)
/* Express the accumulated spin as a rotation matrix. */
Rv2m(vst, &rst)
/* Rotation matrix: accumulated spin, then FK5 to Hipparcos. */
Rxr(r5h, rst, &r5ht)
/* De-orient & de-spin the Hipparcos position into FK5 J2000.0. */
Trxp(r5ht, ph, &pv5e[0])
/* Apply spin to the position giving a space motion. */
Pxp(sh, ph, &vv)
/* De-orient & de-spin the Hipparcos space motion into FK5 J2000.0. */
Trxp(r5ht, vv, &pv5e[1])
/* FK5 position/velocity pv-vector to spherical. */
Pv2s(pv5e, &w, d5, &r, dr5, dd5, &v)
*r5 = Anp(w)
}