Apply aberration to transform natural direction into proper direction.
Status: support routine.
The algorithm is based on Expr. (7.40) in the Explanatory Supplement (Urban & Seidelmann 2013), but with the following changes:
Rigorous rather than approximate normalization is applied.
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.
In almost all cases, the maximum accuracy will be limited by the supplied velocity. For example, if the SOFA EPV00 routine is used, errors of up to 5 microarcseconds could occur.
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).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | intent(in), | dimension(3) | :: | pnat | natural direction to the source (unit vector) |
|
real(kind=wp), | intent(in), | dimension(3) | :: | v | observer barycentric velocity in units of c |
|
real(kind=wp), | intent(in) | :: | s | distance between the Sun and the observer (au) |
||
real(kind=wp), | intent(in) | :: | bm1 | sqrt(1-|v|^2): reciprocal of Lorenz factor |
||
real(kind=wp), | intent(out), | dimension(3) | :: | ppr | proper direction to source (unit vector) |
subroutine AB ( pnat, v, s, bm1, ppr )
implicit none
real(wp),dimension(3),intent(in) :: pnat !! natural direction to the source (unit vector)
real(wp),dimension(3),intent(in) :: v !! observer barycentric velocity in units of c
real(wp),intent(in) :: s !! distance between the Sun and the observer (au)
real(wp),intent(in) :: bm1 !! sqrt(1-|v|^2): reciprocal of Lorenz factor
real(wp),dimension(3),intent(out) :: ppr !! proper direction to source (unit vector)
! Schwarzschild radius of the Sun (au)
! = 2 * 1.32712440041e20 / (2.99792458e8)^2 / 1.49597870700e11
real(wp),parameter :: srs = 1.97412574336e-08_wp
integer :: i
real(wp) :: pdv, w1, w2, r2, w, p(3), r
call PDP ( pnat, v, pdv )
w1 = 1.0_wp + pdv/(1.0_wp+bm1)
w2 = srs / s
r2 = 0.0_wp
do i=1,3
w = pnat(i)*bm1 + w1*v(i) + w2*(v(i)-pdv*pnat(i))
p(i) = w
r2 = r2 + w*w
end do
r = sqrt ( r2 )
do i=1,3
ppr(i) = p(i) / r
end do
end subroutine AB