1093 lines
33 KiB
Go
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)
|
|
}
|