{ Practical astronomy | Computing | Coordinate calculations }

# Coordinate calculations

Here we combine the computing environment, the software design principles and the insights about coordinate systems into software to do some calculations for us. The result is the Coords module.

For distances we use Gigametre (Gm) throughout, except for elevation above the ellipsoid, which is required and returned in metre. For angles we use degrees, unless it is expedient to use radian internally. Coordinates are Cartesian internally and converted from/to degrees for the user interface. We aspire to an accuracy of 0.01° within ±100 years from the present and 1° within ±1000 years.

The principal coordinate system is RA/Dec for J2000. Supported systems are the seven listed systems and transforms between successive list entries (not between random pairs of systems):

1. galactic lII,bII
2. B1950 geocentric RA/Dec
3. J2000 geocentric RA/Dec
4. EOD geocentric ecliptic λ,β
5. EOD geocentric RA/Dec
6. EOD topocentric HA/Dec
7. topocentric horizontal A,h

We do not support atmospheric refraction, which causes objects to appear a little higher above the horizon than they mathematically are. The user is encouraged to account for this in the calculation of the rise or set time of an object. This is done by specifying the criterion as the altitude being not zero, but −0.6°.

We use two hidden files to keep information about our location on the Earth (our "observatory") and about the object in the sky.

`.CL4_LOC`
Stores the geographic longitude in degrees, the geodetic (geographic) latitude in degrees, the elevation above sea level in Gm, a name for the observatory.
`.CL4_FIX`
Stores the right ascension and declination for equinox J2000 in degrees, the distance in Gm, a name for the object.

The object is specifically a "fixed object", i.e. an object in the Galaxy or an external galaxy, but not a body in orbit around the Sun or Earth. That said, it may make sense for the user to calculate the position of such a body for a specific time and then treat that like a fixed object over a short time interval.

We have these user utilities to set the principal data. They require Python scripts to invoke from the Bash shell and to convert input parameters, and Python functions to do the work:

```LocSet.py long lat elev name LocSet(long, lat, elev, name)```
Store the given data as the observatory location. Enter geographic (not geocentric) longitude and latitude in degrees and elevation in metres.
```FixSet.py sys angle1 angle2 distance name FixSet(sys, angle1, angle2, distance, name)```
Store the given data as the fixed sky position. Enter the system code as
1: galactic lII, bII;
2: B1950 RA, Dec;
3: J2000 RA, Dec;
4: EOD ecliptic λ, β;
5: EOD geocentric RA, Dec;
6: topocentric HA, Dec;
7: horizontal A, h.
The two angles are then interpreted in that system. Enter the angles in degrees, the distance in Gm.

We have these user utilities to show the principal data and data derived from it. They require Python scripts to invoke from the Bash shell and to convert input parameters, and Python functions to do the work:

```LocShow.py LocShow()```
Show the observatory location, also sidereal time.
```FixShow.py FixShow()```
Show the fixed sky object, in all coordinate systems.
```FixRise.py alt FixRise(alt)```
Show the next rise and set times for the fixed sky object. The given parameter is the altitude in degrees that defines the "rise" or "set". Give 0 for the mathematical horizon, −0.6° to compensate for average atmospheric refraction.

Here is an example use from the Bash shell. The time is set from the computer's clock, then the observatory and object selected. Four output routines show time, observatory, position of the object, and finally, when the object will rise above 20° altitude. (Although we have entered the distance of the object accurately, for objects beyond the Solar System one can just use something like `1e30` as a quasi-infinite distance.)

```\$ TimSetSys.py
\$ LocSet.py   -70.417 -24.667 2635 "Cerro Paranal"
\$ FixSet.py 1  59.02   40.91  2.1e7 M13

\$ TimShow.py

JD [d]  2459020.343923
Gregorian Date and UT  2020-06-19T20:15:15.0
Julian Date and UT  2020-06-06T20:15:15.0
TT - UT [s]  70.46637624534196
TAI - UTC [s]  38.282376245341965

\$ LocShow.py

Observatory  Cerro Paranal
Geographic longitude [deg]  -70.417
Geographic latitude [deg]  -24.667
Geocentric latitude [deg]  -24.52155560529307
Elevation [m]  2635.0
Sidereal time [deg]  141.90911509974632

\$ FixShow.py

Object  M13
lII,bII  59.019999999999 40.910000000000 21000000.0
RA,Dec B1950  249.980022346597 36.563327770589 21000000.0
RA,Dec J2000  250.427317007154 36.469228833130 21000000.0
lam,bet EOD  239.862267904956 57.8590900570145 21000000.0
RA,Dec EOD  250.610441035663 36.431300917755 21000000.0
HA,Dec topo  251.29867404544 36.431300920551 21000000.0030685
A,h topo  60.452487932477 -28.8341454455192 21000000.0030685

\$ FixRise.py 20

next rise  2020-06-20T01:04:23.1
next set  2020-06-20T05:53:21.0
altitude [deg]  20.0
```