File: unit_aberration.pas

package info (click to toggle)
astap 2024.11.13-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,032 kB
  • sloc: pascal: 49,240; sh: 205; makefile: 5
file content (139 lines) | stat: -rw-r--r-- 6,401 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
unit unit_aberration;

{$mode delphi}

interface

uses
  Classes, SysUtils,math;

procedure aberration_correction_equatorial(julian_et: double;var ra,dec : double);{J2000 equinox}
procedure nutation_correction_equatorial(julian_et: double;var ra,dec : double);{mean equinox, add nutation M&P page 125}
procedure J2000_to_apparent(jd: double;var ra,dec : double);{without refraction}

implementation

uses unit_hjd, unit_ephemerides,unit_asteroid;


(*-----------------------------------------------------------------------*)
(* NUTEQU: transformation of mean to true coordinates                    *)
(*         (including terms >0.1" according to IAU 1980)                 *)
(*         T = (JD-2451545.0)/36525.0                                    *)
(*-----------------------------------------------------------------------*)
PROCEDURE NUTEQU(T:double; VAR X,Y,Z:double);
CONST ARC=206264.8062;          (* arcseconds per radian = 3600*180/pi *)
      P2 =6.283185307;          (* 2*pi                                *)
VAR   LS,D,F,N,EPS : double;
      DPSI,DEPS,C,S: double;
      DX,DY,DZ     : double;
  FUNCTION FRAC(X:double):double;
    BEGIN  FRAC:=X-TRUNC(X) END;
BEGIN
  LS  := P2*FRAC(0.993133+  99.997306*T); (* mean anomaly Sun          *)
  D   := P2*FRAC(0.827362+1236.853087*T); (* diff. longitude Moon-Sun  *)
  F   := P2*FRAC(0.259089+1342.227826*T); (* mean argument of latitude *)
  N   := P2*FRAC(0.347346-   5.372447*T); (* longit. ascending node    *)
  EPS := 0.4090928-2.2696E-4*T;           (* obliquity of the ecliptic *)
  DPSI := ( -17.200*SIN(N)   - 1.319*SIN(2*(F-D+N)) - 0.227*SIN(2*(F+N))
            + 0.206*SIN(2*N) + 0.143*SIN(LS) ) / ARC;
  DEPS := ( + 9.203*COS(N)   + 0.574*COS(2*(F-D+N)) + 0.098*COS(2*(F+N))
            - 0.090*COS(2*N)                 ) / ARC;
  C := DPSI*COS(EPS);  S := DPSI*SIN(EPS);
  DX := -(C*Y+S*Z); DY := (C*X-DEPS*Z); DZ := (S*X+DEPS*Y);
  X:=X + DX;
  Y:=Y + DY;
  Z:=Z + DZ;
END;


(*-----------------------------------------------------------------------*)
(* CART2: conversion of polar coordinates (r,theta,phi)                   *)
(*       into cartesian coordinates (x,y,z)                              *)
(*       (theta in [-pi/2.. pi/2 rad]; phi in [-pi*2,+pi*2 rad])         *)
(*-----------------------------------------------------------------------*)
procedure cart2(R,THETA,PHI: double; out X,Y,Z: double);
  VAR RCST : double;
      cos_theta,sin_theta :double;
      cos_phi,sin_phi     :double;
begin
  sincos(theta,sin_theta,cos_theta);
  sincos(phi  ,sin_phi  ,cos_phi);
  RCST := R*COS_THETA;
  X    := RCST*COS_PHI; Y := RCST*SIN_PHI; Z := R*SIN_THETA;
end;


(*----------------------------------------------------------------*)
(* EQUHOR: conversion of equatorial into horizontal coordinates   *)
(*   DEC  : declination (-pi/2 .. +pi/2)                          *)
(*   TAU  : hour angle (0 .. 2*pi)                                *)
(*   PHI  : geographical latitude (in rad)                        *)
(*   H    : altitude (in rad)                                     *)
(*   AZ   : azimuth (0 deg .. 2*pi rad, counted S->W->N->E->S)    *)
(*----------------------------------------------------------------*)
PROCEDURE EQUHOR2 (DEC,TAU,PHI: double; out H,AZ: double);
  VAR COS_PHI,SIN_PHI, COS_DEC,SIN_DEC,COS_TAU, SIN_TAU, X,Y,Z, DUMMY: double;
BEGIN
  SINCOS(PHI,SIN_PHI,COS_PHI);
  SINCOS(DEC,SIN_DEC,COS_DEC);
  SINCOS(TAU,SIN_TAU,COS_TAU);
  X:=COS_DEC*SIN_PHI*COS_TAU - SIN_DEC*COS_PHI;
  Y:=COS_DEC*SIN_TAU;
  Z:=COS_DEC*COS_PHI*COS_TAU + SIN_DEC*SIN_PHI;
  POLAR2(X,Y,Z, DUMMY,H,AZ)
END;


procedure nutation_correction_equatorial(julian_et: double;var ra,dec : double);{mean equinox, add nutation M&P page 125}
var r,x0,y0,z0 : double;

begin
  cart2(1,dec,ra,x0,y0,z0); {make cartesian coordinates}
  NUTEQU((julian_et-2451545.0)/36525.0 ,x0,y0,z0);{add nutation}
  polar2(x0,y0,z0,r,dec,ra);
end;


procedure aberration_correction_equatorial(julian_et: double;var ra,dec : double);{J2000 equinox}
var r,x0,y0,z0 : double;
    pb_earth, vb_earth : r3_array;{barycentric earth vector}

begin
  //http://www.bbastrodesigns.com/coordErrors.html  Gives same value within a fraction of arcsec.
  //2020-1-1, JD=2458850.50000, RA,DEC position 12:00:00, 40:00:00, precession +00:01:01.45, -00:06:40.8, Nutation -00:00:01.1,  +00:00:06.6, Annual aberration +00:00:00.29, -00:00:14.3
  //2020-1-1, JD=2458850.50000  RA,DEC position 06:00:00, 40:00:00, precession +00:01:23.92, -00:00:01.2, Nutation -00:00:01.38, -00:00:01.7, Annual aberration +00:00:01.79, +00:00:01.0
  //2030-6-1, JD=2462654.50000  RA,DEC position 06:00:00, 40:00:00, precession +00:02:07.63, -00°00'02.8",Nutation +00:00:01.32, -0°00'02.5", Annual aberration -00:00:01.65, +00°00'01.10"

//  Meeus Astronomical algorithms. Example 22.a and 20.b
//  2028-11-13.19     JD 2462088.69
//  J2000, RA=41.054063, DEC=49.22775
//  Mean   RA=41.547214, DEC=49.348483
//  True   RA=41.55996122, DEC=49.35207022  {error  with Astronomy on the computer 0.23" and -0.06"}
//  Nutation ["]   RA 15.843, DEC	6.218
//  Aberration["]  RA 30.047, DEC	6.696

  cart2(1,dec,ra,x0,y0,z0); {make cartesian coordinates}

  sla_EPV2(julian_et-2400000.5{mjd}, true {barycentric}, pb_earth,vb_earth {AU/day});{barycentric position earth including light time correction, high accuracy for years 1900 to 2100}
  x0:=x0+vb_earth[1]*0.00577552; {conversion from AU/day to speed of light, about 1/173} {apply aberration,(v_earth/speed_light)*180/pi=20.5"}
  y0:=y0+vb_earth[2]*0.00577552; {conversion from AU/day to speed of light, about 1/173}
  z0:=z0+vb_earth[3]*0.00577552; {conversion from AU/day to speed of light, about 1/173}

  polar2(x0,y0,z0,r,dec,ra);
end;


procedure J2000_to_apparent(jd: double;var ra,dec : double);{without refraction}
var
  jde : double; {Julian day based on dynamic time}
begin
  jde:=jd+deltaT_calc(jd);// difference between dynamic time and UTC in days
  aberration_correction_equatorial(jde,ra,dec);{aberration correction in J2000 equinox, See ook meeus pagine 148. De Earth velocity terms are for J2000 and not Jnow}
  precession3(2451545 {J2000},jde,ra,dec); {precession, from J2000 to Jnow}
  nutation_correction_equatorial(jde,ra,dec);{mean equinox.  M&P page 125}
end;


end.