User's Guide To NOVAS Version C3.1

NOVAS_C3.1_Guide

NOVAS_C3.1_Guide

User Manual: Pdf

Open the PDF directly: View PDF PDF.
Page Count: 124

DownloadUser's Guide To NOVAS Version C3.1
Open PDF In BrowserView PDF
User’s Guide
to NOVAS Version C3.1
Naval Observatory Vector Astrometry Software

C Edition

John Bangert
Wendy Puatua
George Kaplan
Jennifer Bartlett
William Harris
Amy Fredericks
Alice Monet

U.S. Naval Observatory
March 2011

Approved for Public Release

User ’s Guide to NOVAS Ver sion C3.1
Naval Obser vator y Vector Astr ometr y Softwar e

C Edition

In this document, hyperlinks are in blue.

Table of Contents
Introduction
Citing NOVAS
Acknowledgements
References
Abbreviations and Symbols Frequently Used

C-7
C-8
C-9
C-9
C-10

Chapter

1 Astronomical Background
1.1
Astronomical Coordinate Systems
1.2
Computing Observable Quantities
1.3
Time Scales for Astronomy
1.4
Adopted Models for Precession and Nutation
1.5
New Model for the Rotation of the Earth about its Axis
1.6
Terrestrial-Celestial Relationships
1.7
References

C-13
C-13
C-16
C-19
C-21
C-22
C-23
C-24

Chapter

2 Installing NOVAS
2.1
List of Distribution Files
2.2
Installation and Basic Validation
2.3
Using External Solar System Ephemeris Files
2.4
Using External Minor Planet Ephemeris Files
2.5
Using an External CIO File
2.6
Reduced-accuracy Mode
2.7
References

C-25
C-25
C-27
C-28
C-29
C-30
C-31
C-32

Chapter

3 Sample Calculations
3.1
Initialization
3.2
Setting Time Arguments
3.3
Example 1—Position of a Star
3.4
Example 2—Position of the Moon
3.5
Example 3—Greenwich Sidereal Time
3.6
Example 4—Other Frequently Requested Quantities

C-33
C-33
C-34
C-35
C-36
C-38
C-38

Chapter

4 Data Structures and Functions
4.1
Important Data Structures
Structure cat_entry
Structure object
Structure on_surface
Structure in_space

C-41
C-41
C-41
C-42
C-42
C-43

C-3

4.2
4.3

Chapter

Structure observer
Structure sky_pos
Structure ra_of_cio
Function List (table)
Important Functions in NOVAS
place
sidereal_time
ter2cel
cel2ter
equ2hor
transform_cat
transform_hip
app_star
topo_star
virtual_star
local_star
astro_star
app_planet
topo_planet
virtual_planet
local_planet
astro_planet
precession
equ2ecl
cio_ra
era
cel_pole
e_tilt
ephemeris
solarsystem
solarsystem, Version 1
solarsystem, Version 2
solarsystem, Version 3
solarsystem_hp
solarsystem_hp, Version 1
solarsystem_hp, Version 2
solarsystem_hp, Version 3
Nutation Models

5 Equinox- and CIO-Based Paradigms Compared
5.1
Computing Hour Angles
5.2
Other Computational Considerations
5.3
How NOVAS Implements the CIO-Based Paradigm
5.4
References

C-4

C-43
C-43
C-43
C-44
C-47
C-48
C-51
C-53
C-54
C-55
C-57
C-59
C-61
C-62
C-64
C-65
C-66
C-67
C-68
C-70
C-71
C-73
C-74
C-76
C-78
C-79
C-80
C-82
C-83
C-85
C-87
C-88
C-90
C-91
C-92
C-93
C-95
C-96
C-97
C-97
C-98
C-99
C-100

Appendix A Overview of How NOVAS Has Changed
A.1
Important Changes in Calls
A.2
place: A New General-Purpose “Place” Function
A.3
New Reference Systems
A.4
New Models for Precession and Nutation
A.5
New Model for the Rotation of the Earth about its Axis
A.6
New Features
A.7
New Terminology
A.8
References

C-101
C-101
C-102
C-102
C-103
C-104
C-105
C-105
C-105

Appendix B List of Changes from NOVAS C2.0.1 to C3.1
B.1
New Functions
B.1.1
New Functions in NOVAS C3.0
B.1.2
New Functions in NOVAS C3.1
B.2
Changes to NOVAS C Structures and Calling Sequences
B.2.1
Changes from C2.0.1 to C3.0
B.2.2
Changes from C3.0 to C3.1
B.3
Significant Internal Changes to Code
B.3.1
Significant Internal Changes to Code from C2.0.1 to C3.0
B.3.2
Significant Internal Changes to Code from C3.0 to C3.1
B.4
Other Internal Code Changes
B.4.1
Other Internal Code Changes from C2.0.1 to C3.0
B.4.2
Other Internal Code Changes from C3.0 to C3.1
B.5
References

C-107
C-107
C-107
C-109
C-109
C-109
C-110
C-111
C-111
C-113
C-114
C-114
C-114
C-114

Appendix C How to Set Up the JPL Ephemerides
C.1
Overview
C.2
Step-by-Step Guide

C-117
C-117
C-117

Appendix D A Comparison of SOFA and NOVAS C3.0
D.1
Goal
D.2
Procedure
D.3
Results
D.4
References
D.5
Addendum: NOVAS C3.0 Code

C-121
C-121
C-121
C-122
C-123
C-124

C-5

C-6

Intr oduction
The Naval Observatory Vector Astrometry Software (NOVAS) is a source-code library in
Fortran, C, and Python that provides common astrometric quantities and transformations. It
can supply, in one or two function calls, the instantaneous celestial position of any star or
planet in a variety of coordinate systems. The library also provides access to all of the
“building blocks” that go into such computations—single-purpose functions for common
astrometric algorithms, such as those for precession, nutation, aberration, parallax, etc.
NOVAS calculations are accurate at the sub-milliarcsecond level. The package is an easy-touse facility that can be incorporated into data reduction programs, telescope control systems,
and simulations. The United States (U.S.) Nautical Almanac Office uses NOVAS in the
production of its sections of The Astronomical Almanac.
The NOVAS algorithms are based on a vector and matrix formulation that is rigorous and
consistent with recent recommendations of the International Astronomical Union (IAU).
Objects inside and outside the solar system are treated similarly. The position vectors formed
and operated on by the NOVAS functions are defined within either the Barycentric Celestial
Reference System (BCRS) or the Geocentric Celestial Reference System (GCRS), as
appropriate. Both of these systems are described in IAU resolutions passed in 2000. GCRS
quantities are converted to more familiar coordinate systems, such as the equator and equinox
of date, by applying standard rotations.
Three levels of functions are involved: basic, utility, and supervisory. Basic-level functions
supply the values of fundamental variables, such as the nutation angles and the heliocentric
positions of solar system bodies, for specific epochs. Utility-level functions perform
computations corresponding to individual physical effects or transformations (aberration,
light-bending, precession, polar motion, etc.). Supervisory-level functions call the basic and
utility subroutines in the proper order to compute the apparent coordinates of stars or solar
system bodies for specific dates and times. If desired, users can interact exclusively with the
supervisory-level functions and not become concerned with the details of the geometry or
physical models involved in the computation.
The Fortran version of NOVAS goes back to the late 1970s but has been updated periodically
to use new, more accurate models that represent the evolving standards of the international
astronomical and geodetic communities. The success of the initial Fortran package led to
requests for a C-language version. In the early 1990s, the U.S. Naval Observatory
(USNO)/Naval Research Laboratory (NRL) optical interferometer group converted parts of
NOVAS to C for use in their project. That work formed the basis for the first complete
edition of NOVAS in C (designated NOVAS Version C1.0), which the USNO Astronomical
Applications (AA) Department completed and released in 1996. A major revision of the
NOVAS Fortran code took place in 1998, with the primary goal of supporting data
conforming to the International Celestial Reference System (ICRS). Shortly thereafter, the C
version of NOVAS was updated to version C2.0 to reflect the changes in the Fortran code
and to extend its capabilities. In response to user requests, NOVAS 3.1 introduces a Python
edition. The initial Python release is a set of wrappers around the current C code. In fullaccuracy calculations using the same data sources, differences in the results from Fortran and
C-7

C editions of NOVAS, for the same calculation, should not exceed 6 × 10−8 arcseconds
(3 × 10−13 radians) for solar system bodies and 7 × 10−10 arcseconds (3 × 10−15 radians) for
stars.
Previous versions of NOVAS were based on the algorithms described in Kaplan et al.
(1989). 1 Although the phenomena that are considered and the overall sequence of
calculations remains much the same in the current release, many of the models have been
improved substantially over the last two decades in response to increased accuracy in
observing techniques. Specifically, version 3.0 of NOVAS, released in 2009 and described
in USNO Circular 180, 2 implements the resolutions on astronomical reference systems and
Earth-rotation models passed at the IAU General Assemblies in 1997, 2000, and 2006. An
explanation of the recent IAU resolutions can be found in The IAU Resolutions on
Astronomical Reference Systems, Time Scales, and Earth Rotation Models: Explanation and
Implementation (Kaplan 2005; hereafter USNO Circular 179 3), which contains significantly
more information on topics only briefly mentioned in this document. NOVAS 3.0 also
improves the accuracy of its star and planet position calculations by including several small
effects not previously implemented in the code; see, for example, Klioner (2003). In addition,
some new convenience functions have been added in NOVAS 3.0. The current version,
NOVAS 3.1, provides some new capabilities and fixes some bugs.
Although Chapter 1 provides some background material, the intent of this user’s guide is not
to explain positional astronomy. Many books have been written on this subject. NOVAS
users who desire additional information on the terminology and concepts used in the software
should consult The Explanatory Supplement to the Astronomical Almanac (Seidelmann 1992;
hereafter The Explanatory Supplement) and USNO Circular 179. Until the revision of the
former publication is completed, the latter serves as an important update providing an
explanation of the recent IAU resolutions.
Citing NOVAS
If you use NOVAS, please send us an e-mail 4 that outlines your application. This
information helps justify further improvements to NOVAS. Your comments and suggestions
are also welcome.
This user's guide is the official reference for NOVAS C3.1 and may be cited as
Bangert, J., Puatua, W., Kaplan, G., Bartlett, J., Harris, W., Fredericks, A., & Monet, A.
2011, User’s Guide to NOVAS Version C3.1 (Washington, DC: USNO)
In addition, we ask that you also direct your readers to the NOVAS website. 5

1

Hohenkerk et al. (1992) reprinted parts of this article in Chapter 3 of The Explanatory Supplement to the
Astronomical Almanac.
2
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-180
3
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
4
http://www.usno.navy.mil/help/astronomy-help
5
The current version of NOVAS may be obtained at http://www.usno.navy.mil/USNO/astronomicalapplications/software-products/novas
C-8

The official reference for NOVAS 3.0 is USNO Circular 180, which may be cited as
Kaplan, G., Bangert, J., Bartlett, J., Puatua, W., & Monet, A. 2009, User’s Guide to NOVAS
3.0, USNO Circular 180 (Washington, DC: USNO)
The official reference for all versions of NOVAS prior to 3.0 is the 1990 software report
announcing its release, which is
Kaplan, G. 1990, “NOVAS: U. S. Naval Observatory,” Bull. AAS, 22, 930
Acknowledgements
Current version: William T. Harris of the USNO AA Department wrote most of the C code
that accesses the JPL binary solar-system ephemerides (files eph_manager.c and solsys1.c).
Previous versions: Thomas K. Buchanan, working as part of the USNO/NRL Optical
Interferometer team, did the initial conversion of many of the NOVAS Fortran subroutines to
C. William T. Harris was largely responsible for completing the conversion, and for NOVAS
Version C1.0. David Buscher, James Hilton, Christian Hummel, and Sandra Martinka, users
of early C versions of NOVAS, provided valuable comments and suggestions.
References
Hohenkerk, C. Y., Yallop, B. D., Smith, C. A., & Sinclair, A. T. 1992, in The Explanatory
Supplement to the Astronomical Almanac, ed. P. K. Seidelmann (Mill Valley, CA: Univ. Sci.
Books) 95
Kaplan, G. 1990, Bull. AAS, 22, 930
Kaplan, G. H. 2005, The IAU Resolutions on Astronomical Reference Systems, Time Scales,
and Earth Rotation Models, USNO Circular 179 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
(USNO Circular 179)
Kaplan, G., Bangert, J., Bartlett, J., Puatua, W., & Monet, A. 2009, User’s Guide to NOVAS
3.0, USNO Circular 180 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-180
(USNO Circular 180)
Kaplan, G. H., Hughes, J. A., Seidelmann, P. K., Smith, C. A., & Yallop, B. D. 1989, AJ, 97,
1197
Klioner, S. A. 2003, AJ, 125, 1580
Seidelmann, K., ed. 1992, The Explanatory Supplement to the Astronomical Almanac (Mill
Valley, CA: Univ. Sci. Books) (The Explanatory Supplement)

C-9

Abbr eviations and Symbols Fr equently Used
∆AT
∆T
θ
A&A
AA
AJ
ASCII
AU
BCRS
Bull. AAS
c
CIO
CIP
dec
ECEF
EO
ERA
GCRS
IAU
ICRS
IERS
ITRS
J2000.0

JD
JPL
NOVAS
NRL
RA
SI
SOFA
TAI
TDB
TIO
TT
U.S.
USNO
UT1
UTC

TAI – UTC (an integral number of seconds)
TT – UT1
Earth Rotation Angle (also ERA)
Astronomy and Astrophysics (journal)
Astronomical Applications, a USNO department
The Astronomical Journal (journal)
American Standard Code for Information Interchange
astronomical unit
Barycentric Celestial Reference System
Bulletin of the American Astronomical Society (journal)
speed of light
Celestial Intermediate Origin
Celestial Intermediate Pole
declination
Earth-centered, Earth-fixed
Earth Orientation, a USNO department
Earth Rotation Angle (also θ)
Geocentric Celestial Reference System
International Astronomical Union
International Celestial Reference System
International Earth Rotation and Reference Systems Service
International Terrestrial Reference System
epoch 2000 January 1, 12h TT (JD 2451545.0 TT) at the geocenter
(“J2000.0 system” is shorthand for the celestial reference system defined by
the mean equator and equinox of J2000.0)
Julian date
Jet Propulsion Laboratory
Naval Observatory Vector Astrometry Software
Naval Research Laboratory
right ascension
Système International
Standards of Fundamental Astronomy (software)
International Atomic Time (TAI = UTC + ∆AT)
Barycentric Dynamical Time
Terrestrial Intermediate Origin
Terrestrial Time (TT = TAI + 32.184 s = UT1 + ∆T)
United States
U.S. Naval Observatory
“Universal Time 1,” universal time that is a measure of the Earth’s rotational
angle and subject to irregularities in the Earth’s rotation (UT1 = TT – ∆T)
Coordinated Universal Time, an atomic time scale that is the basis for
worldwide civil time (replaces Greenwich Mean Time); currently kept within
0.9 s of UT1 through the addition or subtraction of leap seconds
C-10

VLBI
WGS-84
xp, yp

Very Long Baseline Interferometry
World Geodetic System 1984
Polar motion components; coordinates of the CIP with respect to the ITRS

(Return to Table of Contents)

C-11

C-12

Chapter 1 Astr onomical Backgr ound
At its highest level, NOVAS computes the precise positions of selected celestial objects at
specified dates and times, as seen from a given location on, or near, the Earth. Such positions
can then be expressed in a number of coordinate systems. Dates and times are specified in
several astronomical time scales, depending on the application. Users of NOVAS should
have a basic knowledge of astronomical coordinate systems and time; terms like right
ascension (RA), declination (dec), hour angle, ecliptic, equinox, precession, and sidereal time
should be familiar. Any number of texts on fundamental astronomyfor example, Spherical
Astronomy (Green 1985)can provide the essential concepts. For more technical
descriptions of the latest international standards on reference systems, USNO Circular 179, 6
cited in the Introduction, can provide the background. USNO Circular 179 documents the
algorithms for many important calculations in NOVAS. Others are described in the Kaplan
et al. (1989) paper mentioned in the Introduction or in the Explanatory Supplement. In
addition, two glossaries may be useful to NOVAS users: one published in The Astronomical
Almanac, 7 and one compiled by the IAU Working Group on Nomenclature for Fundamental
Astronomy. 8
A very cursory overview of some of the most important aspects of the astronomical
calculations performed by NOVAS follows. In this chapter, names of functions relevant to
the subject being discussed are shown in [brackets]. In the background material, special
terms referred to in IAU resolutions are printed in bold when first mentioned; other relevant
terms with widely accepted meanings in astronomy are initially printed in italics. In
descriptions of specific C code, bold text will be used to refer to file names and italic text
will be used to refer to function names. Variable names or code snippets will be presented in
a typewriter-like font.
1.1 Astronomical Coordinate Systems
Astronomical coordinate systems have traditionally been based on the extension of the
Earth’s equatorial plane to infinity, along with a fiducial direction in that plane, the equinox.
The direction of the equinox is along the line of nodes where the equatorial and ecliptic
planes meet. Because the Earth’s equator and ecliptic are both in motion (the equator’s
motion is described by precession and nutation; the ecliptic’s motion is due to the Earth’s
orbital variations), an infinite number of such coordinate systems exist, each one
corresponding to the orientation of the two planes at a specific date and time. The situation is
complicated by the fact that for some purposes in the past it was convenient to consider only
precession—and to neglect nutation—in defining celestial coordinate systems, so that we can
have, for any given date and time, both a mean system (in which only precession is
considered) and a true system (in which both precession and nutation are taken into account).

6

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
http://asa.usno.navy.mil/SecM/Section_M.html
8
http://syrte.obspm.fr/iauWGnfa/NFA_Glossary.html
7

C-13

Thus we have the mean system of some date, the true system of some date, the mean system
of 2000.0, etc. [precession, nutation, gcrs2equ]
Sidereal time is closely tied to the equatorial coordinate systems: one day of sidereal time is
marked by successive transits of the equinox across a specific geographic meridian, and local
sidereal time is just the apparent right ascension of stars transiting the observer’s meridian.
Like the equatorial coordinate systems, sidereal time comes in two flavors, mean and
apparent, based on, respectively, the mean and true equinox and the system of right
ascension that each defines. [sidereal_time]
In the last few decades of the 20th century, several IAU working groups led a general reexamination of astronomical coordinate systems at a very basic level. Part of the motivation
was quite practical: most large ground-based telescopes were no longer built on equatorial
mounts, and the equatorial coordinate systems were irrelevant to increasingly important
space observations. Furthermore, the most precise fundamental measurement—those that by
their nature are most closely related to the equatorial systems—are now obtained from Very
Long Baseline Interferometry (VLBI), a radio technique that has no direct sensitivity to the
equinox. Another important consideration was the need for astronomical coordinate systems
that were part of a general relativistic framework. All of these factors were folded into some
very important resolutions passed by the IAU in 1997 and 2000, which form the basis for the
coordinate systems used in the current version of NOVAS.
These resolutions have introduced concepts and terminology that may not be familiar to
astronomers accustomed to the traditional systems and names, which were used in the
previous versions of NOVAS. The new systems are outlined in the following paragraphs, but
see USNO Circular 179 9 for a much more complete description.
One of the resolutions passed by the IAU in 2000 defined two systems of space-time
coordinates, one for the solar system and the other for the near-Earth environment, within the
framework of General Relativity, by specifying the form of the metric tensors for each and
the four-dimensional space-time transformation between them. The former is called the
Barycentric Celestial Reference System (BCRS) and the latter is called the Geocentric
Celestial Reference System (GCRS). The BCRS is the system appropriate for the basic
ephemerides of solar system objects and astrometric reference data on galactic and
extragalactic objects, i.e., the data in astrometric star catalogs. The GCRS is the system
appropriate for describing the rotation of the Earth, the orbits of Earth satellites, and geodetic
quantities such as instrument locations and baselines. The directions of astronomical objects
as seen from the geocenter can also be expressed in the GCRS. The analysis of precise
observations inevitably involves quantities expressed in both systems and the transformations
between them. Functions in NOVAS may work with BCRS vectors, GCRS vectors, or both
with appropriate conversions.
If the orientation of the BCRS axes in space is specified, the orientation of the GCRS axes
then follows from the relativistic transformation between the two systems. The orientation of
the BCRS is given by what is called the International Celestial Reference System (ICRS).

9

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-14

The ICRS is a triad of coordinate axes with their origin at the solar system barycenter and
with axis directions effectively defined by the adopted coordinates of about 200 extragalactic
radio sources observed by VLBI (listed in Section H of The Astronomical Almanac). The
abbreviations BCRS and ICRS are often used interchangeably, because the two concepts are
so closely related: the ICRS is the orientation of the BCRS while the BCRS is the metric for
the ICRS.
The extragalactic radio sources that define the ICRS orientation are assumed to have no
observable intrinsic angular motions. Thus, the ICRS is a “space-fixed” system (more
precisely, a kinematically non-rotating system) and, as such, it has no associated epoch—its
axes always point in the same directions with respect to distant galaxies. However, the ICRS
was set up to approximate the conventional system defined by the Earth’s mean equator and
equinox of epoch J2000.0; the alignment difference is at the 0.02-arcsecond level, which is
negligible for many applications. [frame_tie]
Reference data for positional astronomy, such as the data in astrometric star catalogs (e.g.,
Hipparcos, UCAC, or 2MASS) or barycentric planetary ephemerides (e.g., JPL’s DE405) are
now specified within the ICRS; more precisely stated, they are specified within the BCRS,
with respect to the ICRS axes.
In the near-Earth environment, celestial coordinates and related quantities are expressed with
respect to the GCRS or reference systems that are derived from it. Because the orientation of
the GCRS is derived from that of the BCRS, the GCRS can be thought of as the “geocentric
ICRS.”
Besides the GCRS itself, the two reference systems most commonly used for expressing the
apparent directions of astronomical objects as seen from the Earth are the true equator and
equinox of date and the Celestial Intermediate Reference System. Both are obtained from
simple rotations of the GCRS, and, in both cases, the fundamental plane is the true equator of
date. [gcrs2equ] In the new terminology, the true or instantaneous equator is the plane
orthogonal to the Celestial Intermediate Pole (CIP), which is the celestial pole defined by
the adopted precession and nutation algorithms (see section 1.4). The only difference
between these two systems is the origin of right ascension: the points on the equator where
RA = 0 are, respectively, the true equinox and the Celestial Intermediate Origin (CIO).
The CIO is a recently introduced fiducial point on the equator that rigorously defines one
rotation of the Earth (see section 1.5). [cio_location]
The GCRS and the two equatorial systems obtained from it have their origin at the geocenter.
For topocentric coordinates or vectors, referred to an observer at a specific location on, or
near, the surface of the Earth, analogous coordinate systems exist although no semantic
distinction is usually made between them and their geocentric equivalents. In NOVAS, the
topocentric equivalent of the GCRS is referred to as the “local GCRS,” and its spatial axes
are assumed to be obtained from the GCRS by a Galilean transformation (simple shift of
origin without a change in orientation). The two topocentric equator-of-date systems are
obtained similarly.
Reference System for NOVAS Input Data: NOVAS now assumes that input reference data,
such as catalog star positions and proper motions and the basic solar system ephemerides, are
provided in the ICRS (that is, within the BCRS as aligned to the ICRS axes), or at least are
C-15

consistent with it to within the data’s inherent accuracy. [place, ephemeris] The latter case
will probably apply to most FK5-compatible data specified with respect to the mean equator
and equinox of J2000.0 (the “J2000.0 system”). The distinction between the ICRS and the
J2000.0 system becomes important only when an accuracy of 0.02 arcsecond or better is
important. [frame_tie] Nevertheless, because NOVAS is designed for the highest-accuracy
applications, the ICRS is mentioned as the reference system of choice for many input
arguments to NOVAS functions.
Reference Systems for NOVAS Output Data: For output coordinates (e.g., the position of
Mars on a certain date), three options for the coordinate system are available. (The
coordinates themselves can be right ascension and declination or the components of a unit
vector.) You can request coordinates expressed in the GCRS, the equator and equinox of
date, or the Celestial Intermediate Reference System (equator and CIO of date). These
coordinate systems can be requested for either geocentric or topocentric output. [place,
gcrs2equ]
NOVAS can also convert topocentric right ascension and declination, with respect to the
equator and equinox of date, to local horizon coordinates, zenith distance and azimuth. The
angular shift due to atmospheric refraction can be included as an option. [equ2hor] Another
function is available to transform right ascension and declination to ecliptic longitude and
latitude. [equ2ecl] Still another transforms right ascension and declination to galactic
longitude and latitude. [equ2gal]
Reference System for the Location of the Observer: The location of an Earth-based observer
is specified in NOVAS by longitude, latitude, and height with respect to the World Geodetic
System 1984 (WGS-84) reference ellipsoid. Coordinates provided by GPS (if uncorrected for
the local datum) are referred to WGS-84, which is also sometimes called the Earth-centered,
Earth-fixed (ECEF) system. The International Terrestrial Reference System (ITRS) is a
geocentric rectangular coordinate system used for high-precision work. WGS-84 coordinates
are functionally equivalent (within a few centimeters) to ITRS coordinates. Thus, the
geodetic positions used by NOVAS are consistent with the ITRS. [geo_posvel]
1.2 Computing Observable Quantities
NOVAS is mostly used for computing, for a selected object, the instantaneous angular
coordinates (or the equivalent unit vector components) at which it might be observed within
one of several user-selected coordinate systems. Obviously the values of the angular
coordinates computed by NOVAS depend on the coordinate system requested, but there are
several phenomena that affect the observed position of a star or planet that are independent of
the coordinate system. For stars, the effects are
•

Proper motion (generalized): the three-dimensional space motion of the star,
relative to that of the solar system barycenter, between the catalog epoch and the
date of interest. Assumed linear and computed from the catalog proper motion
components, radial velocity, and parallax. Projected onto the sky, the motion
amounts to less than 1 arcsecond per year (usually much less) except for a few
nearby stars. [starvectors, proper_motion]

C-16

•

Parallax: the change in our perspective on stars in the solar neighborhood due to the
position of the Earth in its orbit. Its magnitude is (distance in parsecs)-1 and, hence,
is always less than 1 arcsecond. [bary2obs]

•

Gravitational light bending: the apparent deflection of the light path in the
gravitational field of the Sun and, to a much lesser extent, the other planets.
Although it reaches 1.8 arcsecond at the limb of the Sun, it falls to 0.05 arcsecond
10º from the Sun and amounts to no more than a few milliarcseconds over the
hemisphere of the sky opposite the Sun. [grav_def, grav_vec]

•

Aberration: the change in the apparent direction of light caused by the observer’s
velocity (v) with respect to the solar system barycenter. Independent of distance, it
is approximately equal to v/c, expressed as an angle. Therefore, it can reach
21 arcseconds for observers on the surface of the Earth and somewhat more for
instruments in orbit. [aberration]

•

Atmospheric refraction: the total angular change in the direction of the light path
through the Earth’s atmosphere; applies only to an observer on, or near, the surface
of the Earth. The direction of refraction is always assumed to be parallel to the local
vertical and a function only of zenith distance although these assumptions may not
be true in all cases. At optical wavelengths, its magnitude is zero at the zenith,
about 1 arcminute at a zenith distance of 45°, and 0.5° at the horizon. Refraction is
roughly proportional to the atmospheric pressure at the observer, but it also depends
on other atmospheric parameters and the observational wavelength. [equ2hor,
refract]

The same effects are relevant to objects in the solar system, except that the proper motion
calculation is replaced by a function that retrieves the object’s barycentric position from its
ephemeris as part of an iterative light-time calculation. [light_time, ephemeris] Extragalactic
objects can be considered to be stars with zero parallax and proper motion. The star or planet
positions computed by considering all these effects obviously depend on the location of the
observer; so that an observer on the surface of the Earth will see a slightly different position
than one at the geocenter, the differences being greater for solar system objects, especially
nearby ones (reaching about 1º for the Moon).
In computing these effects, the same functions are used for stars and planets, because
NOVAS uses position vectors rather than directions; that is, internally, it places all objects at
their computed distance from the solar system barycenter. (Objects of unknown distance are
placed on the “NOVAS celestial sphere” at a radius of 1 Gigaparsec = 2 × 1014 astronomical
units). [starvectors] These vectors are all defined within the BCRS until the relativistic
aberration calculation is applied, which effectively takes an input vector in the BCRS and
produces an output vector in the GCRS.
Nomenclature: When all these effects are included, we obtain star or planet coordinates in
the GCRS that reflect where the star or planet actually appears in the sky. The coordinates
can then be transformed to other reference systems, if desired. We will call the results of this
process, generically, the “apparent position” or “observed position” of the object.

C-17

However, some caution with the semantics is in order, because the term apparent place has
traditionally been reserved specifically for the star or planet position we obtain by applying
all these effects (except refraction) for a geocentric observer, with the coordinates expressed
with respect to the true equator and equinox of date. For an observer on the surface of the
Earth, the corresponding term is topocentric place. If the apparent star or planet position is
instead expressed with respect to the mean equator and equinox of J2000.0, the terms used in
NOVAS have been virtual place and local place, respectively. (Although these last two
terms were suggested in the Kaplan et al. (1989) paper previously cited, they do not appear to
have been widely used outside of the context of NOVAS.)
The above terminology is reflected in the names of the high-level functions that perform the
computations, where “app” stands for “apparent place”, “topo” stands for “topocentric
place”, etc. [app_star, app_planet, topo_star, topo_planet, virtual_star, virtual_planet,
local_star, local_planet] In addition, an astrometric place calculation can be used for some
differential measurements; it is the same as virtual place except that light bending and
aberration (and refraction) are not computed, under the assumption that these effects are the
same for all objects within a small field of view. [astro_star, astro_planet]
In response to the introduction of the new IAU-recommended coordinate systems, we must
make some adjustments and additions to the nomenclature. The mean equator and equinox
of J2000.0, considered as a geocentric system, has been replaced by the GCRS. The IAU
Working Group on Nomenclature (2003–2006) recommended that the term proper place be
used for what is called virtual place in NOVAS. With the introduction of the Celestial
Intermediate Reference System, with its right ascension origin at the CIO, we now have two
more possibilities for apparent positions, one geocentric and one topocentric. The geocentric
coordinates are called the object’s intermediate place, and right ascension measured with
respect to the CIO is called intermediate right ascension.
The complete table of nomenclature for apparent positions of various types, updated for
NOVAS 3.0, and later, is below.
Final Coordinate System

Observer at Geocenter

True equator and equinox of date

apparent place

Observer near
Surface of Earth
topocentric place

Celestial Intermediate Reference System

intermediate place

[no name]

GCRS

proper or virtual place

local place

GCRS

astrometric place*

[no name]

*variant of proper or virtual place, in which some calculations are omitted
The only difference between a position expressed in the Celestial Intermediate Reference
System and the same position expressed with respect to the true equator and equinox of date
is an offset in right ascension, the equation of the origins. The equation of the origins is the
angle between the equinox and the CIO, both of which lie on the instantaneous equator.
[ira_equinox]
C-18

NOVAS function place can be used to compute all of these types of positions; the input arguments allow you to select both the location of the observer and the coordinate system in
which the computed position is to be expressed. These selections make the nomenclature
superfluous. place does not apply atmospheric refraction, but that can be added by a
subsequent call to equ2hor.
1.3 Time Scales for Astronomy
As explained in USNO Circular 179, 10 basically two kinds of time scales are used in
astronomy; those that are based on the Système International (SI) second (“atomic time”) and
those that are tied to the irregular rotation of the Earth; in essence, “lab” time and
“astronomical” time, respectively. Theoretical time scales, not kept by any real clocks, are
also used that are the time basis for—that is, the fourth dimension of—the BCRS and GCRS.
We almost always start with Coordinated Universal Time (UTC), which is the worldwide
basis for civil time. UTC (USNO) is obtained from the Global Positioning System (GPS). In
addition, UTC can be obtained with varying accuracy from Network Time Protocol (NTP)
services on the Internet and from radio time broadcasts (e.g., WWV, WWV, WWVB, and
CHU), cell phones, TV, etc. UTC is based on SI seconds at sea level on the rotating Earth.
From UTC, one adds an integral number of (SI) seconds to obtain International Atomic
Time (TAI): TAI = UTC + ∆AT, where ∆AT is a total count of leap seconds in UTC (for
example, ∆AT = 34 s for 2011). The USNO Earth Orientation (EO) Department 11 provides a
complete table of ∆AT values on-line. The current value may also be found at the beginning
of Bulletin A 12 published by the International Earth Rotation and Reference System Service
(IERS). The addition of a leap second to UTC, which increases ∆AT by 1 second, is usually
done, when needed, at 23:59:59 UTC on December 31 and is announced about six months in
advance.
NOVAS Time Arguments: Typically, the first input argument to most NOVAS functions is
the time of interest (for example, the time of an observation), expressed as a Julian date (JD).
Julian dates are simply a convenient format for representing a date and time in any time scale
and are discussed below. Two time scales are used as the basis for most of the Julian dates
that are input arguments to the higher-level NOVAS functions.
The first is Terrestrial Time (TT), which is effectively just a constant offset from TAI:
TT = TAI + 32.184 s. Therefore, TT = UTC + ∆AT + 32.184 s. Historically, TT is
considered continuous with the obsolete time scales Ephemeris Time (ET) and Terrestrial
Dynamical Time (TDT). It is meant to be a smooth and continuous “coordinate” time scale
independent of the rotation of the Earth. The high-level NOVAS functions that compute the
apparent direction of an object at a specified time use Julian dates based on TT. [place,
app_star, topo_star, app_planet, transform_cat]

10

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
http://maia.usno.navy.mil/ser7/tai-utc.dat
12
http://maia.usno.navy.mil/ser7/ser7.dat
11

C-19

The second time scale is Universal Time (UT1), which is based on the rotation of the Earth.
It is needed for computing sidereal time [sidereal_time] or the Earth Rotation Angle (ERA or
θ) [era], which in turn allows one to compute hour angles, altitude and azimuth, or other
topocentric quantities. UT1 is also obtained from UTC: UT1 = UTC + (UT1−UTC). The
value of UT1−UTC is available in a daily-interval tabulation on the IERS web site 13 (data
marked “P” are predictions); IERS publishes historical values in Bulletin B. 14 The values of
UT1−UTC often change at the millisecond level over one day. In computing the topocentric
direction of a celestial object with respect to Earth-fixed axes (e.g., altitude and azimuth),
1-arcsecond accuracy in the final angles requires 67-ms accuracy in UT1. Because
UT1−UTC can have an absolute value up to 900 ms, it is an important correction for all but
the crudest applications; that is, in most cases, it is not acceptable to approximate UT1 as
being equal to UTC.
A few of the lower-level NOVAS functions use time arguments based on Barycentric
Dynamical Time (TDB). [e_tilt, precession, ephemeris, solarsystem] TDB differs from TT
only by periodic variations (due mainly to the Earth’s elliptical orbit and described by
General Relativity), the largest of which has an amplitude of 1.6 ms and a period of one year.
[tdb2tt] The difference between the two time scales can often be neglected in practice as
noted in the function preambles where appropriate. TDB is equivalent to Teph, the barycentric
coordinate time argument of the Jet Propulsion Laboratory (JPL) planetary and lunar
ephemerides.
As previously mentioned, time is specified within NOVAS as Julian dates, which can be used
for any of the above time scales. Julian dates are a simple count of days since noon on 4713
BC January 1, so that any date in recorded human history has a positive JD. Over 2.4 million
days have elapsed since JD 0, and thus, for current dates, seven digits of precision are taken
up just by the day count; if the JD is given by a standard double-precision floating-point
number, about 9 digits are left to represent the time of day. Therefore, we expect a doubleprecision floating-point JD can represent time to a precision of about 10-9 day ≈ 100 μs.
However, after further examination, Kaplan, Bartlett, and Harris (2011) determined that the
actual precision is closer to 20.1 μs. In those NOVAS functions where more precision is
appropriate, the JD can be split between two input arguments, one that carries the high-order
part of the JD (e.g., the day count) and the other that carries the low-order part (e.g., the
fraction of a day). Note that for 0h (TT, UT1, or TDB), the fractional part of the Julian date
is 0.5. An online calendar-date-to-Julian-date converter is available at the AA Department
web site. 15 NOVAS has utility functions to convert between calendar date and Julian date
and vice versa. They work for any time scale; that is, their input and output arguments should
be considered to be just different ways of expressing the same instant within the same time
scale. [julian_date, cal_date]
The epoch J2000.0 is considered to be an event at the geocenter at Julian date 2451545.0 TT,
which is 2000 January 1, 12h TT.

13

http://maia.usno.navy.mil/ser7/mark3.out
http://www.iers.org/IERS/EN/Publications/Bulletins/bulletins.html
15
http://www.usno.navy.mil/USNO/astronomical-applications/data-services/cal-to-jd-conv
14

C-20

The difference ∆T = TT – UT1, expressed in seconds, is required for certain NOVAS
functions that use both TT and UT1 internally but require only one type of input time
argument. A table of historical values of ∆T is on pages K9–K10 of The Astronomical
Almanac and more recent values and predictions can be found online at EO web site. 16
Values of ∆T can also be computed from
∆T = 32.184s + ∆AT – (UT1–UTC)
For example, on 2010 December 1, ∆T = 66.3054 s, which is based on a ∆AT value of 34 s
and a UT1-UTC value of –0.1214 s (obtained from finals.data 17 and rounded to the
nearest ten-thousandth of a second). More information on ∆T is given in section 1.6
below.
1.4 Adopted Models for Precession and Nutation
Astronomers realized over a decade ago that the old standard models for the precession and
nutation were in need of revision. The value of the angular rate of precession in longitude
adopted by the IAU in 1976—and incorporated into the widely used precession formulation
by Lieske and collaborators (1977)—is too large by about 0.3 arcsecond per century (3 milliarcseconds per year). The amplitudes of a number of the largest nutation components
specified in the 1980 IAU Theory of Nutation are also known to be in error by several
milliarcseconds. Both the precession and nutation errors are significant relative to current
observational capabilities.
Thus, the resolutions passed by the IAU in 2000 mandated an improvement to the precession
and nutation formulations. NOVAS 3.0, and later, incorporate the models adopted in
response to these resolutions. [precession, nutation] The precession model is the P03 solution
of Capitaine, Wallace, and Chapront (2003), as recommended by the IAU Working Group on
Precession and the Ecliptic (Hilton et al. 2006). The P03 precession model was formally
adopted by the IAU in 2006. The nutation model is taken from Mathews, Herring, and
Buffett (2002). This model, referred to as the IAU 2000A nutation, consists of 1,365
trigonometric terms, more than ten times the number in the previous model.
[nutation_angles, iau2000a] Because evaluation of nutation has always been the most
computationally intensive task in NOVAS, you may notice an increase in execution time for
some applications.
To reduce execution time, NOVAS 3.0, and later, provide an optional reduced-accuracy
mode in which a truncated nutation series is used. This nutation series is specific to NOVAS
and is referred to as 2000K. [nu2000k] It consists of the largest 488 terms in the IAU 2000A
series and provides an accuracy of about 0.1 milliarcsecond (specifically, 0.1 milliarcsecond
for Δψ and about 0.04 milliarcsecond for Δε and Δψ sin ε). 2000K is the default reducedaccuracy nutation series in both Fortran and C editions of NOVAS, but the C edition also
includes the 77-term, IAU-approved truncated nutation series, IAU 2000B [iau2000b], which
is accurate to about 1 milliarcsecond in the interval 1995–2050 (McCarthy & Luzum 2003).

16
17

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
http://maia.usno.navy.mil/ser7/finals.data (See http://maia.usno.navy.mil/ser7/readme.finals for file format.)
C-21

More information on the implementation of nutation in NOVAS can be found section 2.6,
section 4.3, and in USNO Circular 181, 18 Nutation Series Evaluation in NOVAS 3.0 (Kaplan
2009).
As mentioned in section 1.1, the celestial pole described by the new precession and nutation
models (with very small observational corrections) is called the Celestial Intermediate Pole
(CIP). The true equator of date, also called the instantaneous equator or the intermediate
equator, is the plane orthogonal to the direction of the CIP. The CIP is also the rotational
pole on the surface of the Earth (see section 1.6).
1.5 New Model for the Rotation of the Earth about its Axis
IAU resolutions passed in 2000 also dealt in a very fundamental way with how the Earth’s
spin around its axis is described. The conventional treatment is based on the equinox and
sidereal time; Greenwich (or local) sidereal time is just the Greenwich (or local) hour angle
of the equinox of date. However, the equinox is constantly moving due to precession, so that
sidereal time combines two angular motions, the Earth’s rotation and the precession of its
axis. (In the case of apparent sidereal time, nutation is also included.) One rotation of the
Earth is about 8 ms longer than one mean sidereal day.
For about two decades, people who routinely deal with the most precise measurements of the
Earth’s rotation have been advocating for a change in the way it is described. Their ideas
were introduced in resolutions passed by the IAU in 2000. In this new paradigm, the
reference point on the moving celestial equator for the description of Earth rotation is called
the Celestial Intermediate Origin (CIO). Unlike the equinox, this point has no motion
along the equator at all; as the orientation of the equator changes in space due to precession
and nutation, the CIO remains on the equator but its instantaneous motion is always at right
angles to it. [cio_location, cio_ra] Thus, loosely speaking, two transits of the CIO across a
terrestrial meridian define one rotation of the Earth. The CIO is a point on the celestial
equator near RA = 0 (in the Celestial Intermediate Reference System, it defines RA = 0), and
there is a corresponding point on the terrestrial equator near longitude = 0 called the
Terrestrial Intermediate Origin (TIO). For all astronomical purposes, the TIO can be
considered a point fixed at geodetic longitude zero on the Earth’s rotational equator. 19 In the
new paradigm, the rotation of the Earth is specified by the angle (in the instantaneous
equatorial plane) between the TIO and the CIO, which is a linear function of universal time
(UT1). This angle is called the Earth Rotation Angle (ERA) and is designated by θ. [era]
Some internal calculations in NOVAS can be performed using either the equinox or the CIO
as the fundamental fiducial point on the moving astronomical equator. The user can select the
basis for these calculations via an input parameter method. The results are identical to within
a microarcsecond around the current time and the computational burden is about the same.

18

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-181
The CIO and TIO are technically examples of non-rotating origins, although neither is fixed within its
respective coordinate system. However, the slow drift of the TIO, due to polar motion, with respect to standard
geodetic coordinates (the ITRS, or, effectively, WGS-84) amounts to only 1.5 millimeters per century and is
completely negligible for astronomical purposes.

19

C-22

1.6 Terrestrial-Celestial Relationships
NOVAS uses the ITRS for specifying locations and directions on, or near, the surface of the
Earth. As mentioned at the end of section 1.1, the ITRS is consistent, to within a few
centimeters, with WGS-84 coordinates provided by GPS, and it is sometimes referred to as
the Earth-centered, Earth-fixed system (ECEF). The ITRS is a geocentric system with the
directions of its axes defined by the coordinates of a large number of observing stations, in a
way completely analogous to the definition of the ICRS by the coordinates of extragalactic
radio sources. The ITRS z-axis is toward the north geodetic pole and its x-axis is toward a
point at longitude and latitude zero; the y-axis forms a right-handed system with the other
two axes.
Practical applications of astronomical data often require relating terrestrial coordinates to
celestial coordinates and vice versa. For example, we may want the position of a celestial
object expressed with respect to the local horizon system. [equ2hor] Or, we may have a
vector, expressed in an Earth-fixed system, that represents some instrumental axis, and we
would like to know where that vector is pointed on the celestial sphere. NOVAS can
perform the terrestrial-to-celestial transformation or its inverse; specifically, the
transformation from the ITRS to the GCRS or the GCRS to the ITRS. [ter2cel, cel2ter]
These transformations are a series of rotations that, taken together, represent the
instantaneous orientation of the Earth in space. [precession, nutation, cio_basis,
sidereal_time, era, wobble]
Not all aspects of the Earth’s orientation are predictable. Polar motion represents the small
shift of the geodetic north pole (the ITRS z-axis) with respect to the rotational axis (the CIP),
the largest part of which must be determined from observations. Typically, the total shift
amounts to a few tenths of an arcsecond (1-2 µrad, 10 meters) and is specified by the
parameters xp and yp. The observational determinations are designated simply as x and y,
and current values are available from IERS Bulletin A. 20 Past values can be obtained at the
EO web site. 21 For most purposes, we can set xp=x and yp=y (see USNO Circular 179 22
section 6.5.2 or the IERS Conventions (2010) section 5.5.1). Several NOVAS functions
require as input the xp and yp values for the date of interest, although, if the final accuracy
requirements are no better than one arcsecond, these values can be set to zero.
Because the difference ∆T = TT – UT1 is used in only a few internal computations where the
conversion from one time scale to another is not critical, the value of ∆T needs to be accurate
to only about one second. Therefore, one ∆T value will typically apply to all dates for a given
year.
Finally, the new IAU precession and nutation models are neither perfect nor complete and,
for very high-accuracy applications, observational corrections are sometimes needed. These
corrections now amount to less than one milliarcsecond (5 nrad). These corrections are
available from the same sources as the polar motion determinations, and are designated as dX

20

http://maia.usno.navy.mil/ser7/ser7.dat
http://www.usno.navy.mil/USNO/earth-orientation/eo-products/daily
22
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
21

C-23

and dY (note that the units are milliarcseconds). In the rare cases where they are needed,
they are pre-specified to NOVAS for use in subsequent calculations for a specific date.
[cel_pole]
1.7 References
Capitaine, N. Wallace, P. T., & Chapront. J. 2003, A&A, 412, 567 (P03)
Green, R. 1985, Spherical Astronomy (New York: Cambridge Univ. Press)
Hilton, J. L. et al. 2006, Celest. Mech. & Dynamical Astron., 94, 351
Kaplan, G. H. 2005, The IAU Resolutions on Astronomical Reference Systems, Time Scales,
and Earth Rotation Models, USNO Circular 179 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
Kaplan, G. H. 2009, Nutation Series Evaluation in NOVAS 3.0, USNO Circular 181
(Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-181
Kaplan, G., Bartlett J., & Harris, W. 2011, The Error in the Double Precision Representation
of Julian Dates, USNO-AA Tech. Note 2011-02
Kaplan, G. H., Hughes, J. A., Seidelmann, P. K., Smith, C. A., & Yallop, B. D. 1989, AJ, 97,
1197
Lieske, J. H., Lederle, T., Fricke, W., & Morando, B. 1977, A&A, 58, 1
Mathews, P. M., Herring, T. A., & Buffett, B. A. 2003, J. of Geophys. Res., 107, ETG 3-1
McCarthy, D. D. & Luzum, B. J. 2003, Celest. Mech. & Dynamical Astron., 85, 37
Petit, G. & Luzum, B. (eds.) 2010, Chapter 5, in IERS Conventions, IERS Tech. Not. 36
(Frankfurt: IERS)
Seidelmann, K., ed. 1992, The Explanatory Supplement to the Astronomical Almanac (Mill
Valley, CA: Univ. Science Books) (The Explanatory Supplement)
USNO & HMNAO. 2009, The Astronomical Almanac for the Year 2011, (Washington, DC:
GPO) and subsequent editions

(Return to Table of Contents)

C-24

Chapter 2

Installing NOVAS

2.1 List of Distribution Files
The table below lists the fifteen files that comprise the main distribution of NOVAS C3.1. 23
Except for the user’s guide, which is in Portable Document Format (PDF), the files are all
plain ASCII text. Files with a .c extension are C source code; their associated header files are
designated by a .h extension. The single file with a .f extension contains Fortran source code.
File name
novas.c
novas.h
novascon.c
novascon.h
nutation.c
nutation.h
solsys1.c

solsys2.c

solsys3.c

solarsystem.h
eph_manager.c

23

Description
contains all supervisory and utility functions and most basic
functions (see Section 4.2 for a full listing)
header file for novas.c
(includes structure definitions and function prototypes)
contains most mathematical and physical constants used by
NOVAS
header file for novascon.c
contains functions implementing the IAU 2000A,
IAU 2000B, and 2000K nutation models
header file for nutation.c
versions of functions solarsystem and solarsystem_hp that,
when used with eph_manager.c, provide a complete “all
C” interface between NOVAS and JPL’s lunar and
planetary ephemerides
(see detailed discussion in Chapter 4)
versions of functions solarsystem and solarsystem_hp that,
when used with jplint.f, provide an interface between
NOVAS and JPL’s Fortran solar system ephemeris-access
code
(see detailed discussion in Chapter 4)
versions of functions solarsystem and solarsystem_hp that
provide the position and velocity of the Earth and Sun
without reference to an external data file
(see detailed discussion in Chapter 4)
header file for the solsys1.c, solsys2.c, and solsys3.c files
C implementation of JPL’s solar system ephemeris-access
code for use with solsys1.c; requires a binary JPL ephemeris

http://www.usno.navy.mil/USNO/astronomical-applications/software-products/novas/novas-c
C-25

File name
eph_manager.h
readeph0.c

jplint.f

README.txt
NOVAS_C3.1_Guide.pdf

Description
Header file for eph_manager.c
dummy version of function readeph, the highest-level call
to the USNO/AE98 24 minor planet ephemerides software;
when positions of selected minor planets are desired,
replace this file with readeph.c from the USNO/AE98
package
Fortran subroutines that, when used with solsys2.c, provide
an interface between NOVAS and JPL’s Fortran ephemerisaccess code (see detailed discussion in Chapter 4)
basic information for using NOVAS C3.1
User’s Guide to NOVAS C3.1, this manual

In addition, the following six files are provided to assist you in validating the installation of
NOVAS on your local system. Files with a .c extension are the C source code that created the
associated ASCII text files ending with .txt extensions. Compare the USNO-generated output
files with the results produced by your local installation as described in Section 2.2 (basic
installation), Section 2.3 (including a JPL solar system ephemeris), and Section 2.4
(including a USNO/AE98 minor planet ephemeris).
File name
checkout-stars.c
checkout-stars-usno.txt
checkout-stars-full.c

checkout-stars-full-usno.txt
checkout-mp.c

checkout-mp-usno.txt

24

Description
main function that calls functions in novas.c and solsys3.c
to validate a basic local installation
USNO output from checkout-stars application
main function that calls functions in novas.c and solsys1.c
with full accuracy to validate a local installation for use
with solar system ephemerides; requires binary JPL
ephemeris file
USNO output from checkout-stars-full application
main function that calls functions in novas.c, solsys1.c,
and USNO/AE98 minor planet software to validate a local
installation for use with minor planet ephemerides;
requires minor planet ephemeris and binary JPL ephemeris
files
USNO output from checkout-mp application

http://www.usno.navy.mil/USNO/astronomical-applications/software-products/usnoae98
C-26

The following two files contain sample code to get you started developing your own
applications using NOVAS. Chapter 3 discusses each of the examples included and provides
instructions for using the sample code. The file with a .c extension is the C source code that
produced the associated ASCII text file (.txt).
File name
example.c

example-usno.txt

Description
main function that calls selected functions in novas.c and
solsys1.c; example code discussed in Chapter 3; requires a
binary JPL ephemeris
USNO output from example application

Finally, an ASCII text file (.txt) containing the right ascensions of the CIO in the GCRS is
supplied along with C source code (.c) to convert it to a binary direct-access file. The set-up
and use of this file is discussed in Section 2.5.
File name
CIO_RA.TXT
cio_file.c

Description
right ascensions of the CIO in the GCRS from 1700 to 2300
main function that converts CIO_RA.TXT (ASCII) to
cio_ra.bin (binary)

2.2 Installation and Basic Validation
To install NOVAS and perform a basic validation of the code on your local system, follow
the instructions given below. These instructions assume that you know how to compile and
link C source code on your computer system. Details of the process are dependent on your
particular computer system. In particular, some C compilers require an explicit link to the
math library, which is typically accomplished using the –lm option in the command line; see
your compiler’s documentation for details. NOVAS has been successfully implemented on
Microsoft Windows, Apple Macintosh, and Red Hat Enterprise Linux systems.
The most basic validation of NOVAS requires no external ephemeris files.
a. Copy all NOVAS files to a directory on your local system.
b. Compile and link files checkout-stars.c, novas.c, novascon.c, nutation.c, solsys3.c,
and readeph0.c. Name the resulting application checkout-stars.
c. Run the checkout-stars application.
d. Compare the results that you get from checkout-stars with the data in file checkoutstars-usno.txt. If the results agree, the installation was probably successful, but see
the important note below.
Important Note
The checkout-stars application exercises one supervisory function and most, but not all,
of the low-level functions in novas.c. The use of the checkout-stars application is not a
complete test of NOVAS. Comparing the results from the NOVAS C supervisory
functions with results from the analogous NOVAS Fortran supervisory functions will
constitute a more complete check of your NOVAS implementation.

C-27

This setup of NOVAS, using solarsystem version 3, will calculate the positions of stars or
extragalactic objects with errors not exceeding 1.5 milliarcseconds (if your input catalog data
is that good) or the Sun with an error not exceeding 2 arcseconds. However, it will not
provide the positions of solar system objects other than the Sun. For more general or
demanding applications, NOVAS must use another version of solarsystem.
2.3 Using External Solar System Ephemeris Files
NOVAS requires access to a solar system ephemeris, which provides NOVAS with the
heliocentric and barycentric positions and velocities of desired solar system objects referred
to the ICRS. A solar system ephemeris is required even when only precise star positions are
needed—in that case, the “desired solar system objects” are the Earth and Sun. Thus, an
ephemeris of the barycentric Earth and the barycentric Sun is the minimum requirement.
NOVAS C3.0, and later, access such data for solar system objects through function
ephemeris. As provided, ephemeris supports access to a JPL ephemeris of the major solar
system bodies (here defined as Sun, Moon, eight planets, and Pluto) and provides direct
support for access to the USNO Ephemerides of the Largest Asteroids (Hilton 1999;
hereafter USNO/AE98 25). Function ephemeris accesses the JPL ephemerides by calling the
appropriate version of solarsystem or solarsystem_hp.
If you need to compute star or radio-source positions to better than 1.5 milliarcseconds,
positions of the Sun to better than 2 arcseconds, or positions of solar system bodies other
than the Sun, you will have to use function solarsystem version 1 or version 2, which require
external ephemerides, instead of solarsystem version 3, which is self-contained.
solarsystem version 1, along with functions in eph_manager.c, provides a complete C
language interface between NOVAS and one of the JPL “development ephemerides”
(DEnnn), such as DE405. The planet_ephemeris function is the C version of the Fortran
subroutine PLEPH, and it, in turn, calls other functions in the JPL ephemeris software
package. Alternatively, solarsystem version 2, along with subroutines in jplint.f, provides an
interface to the JPL ephemeris access code, which is available in Fortran. Subroutine jplint
contains a single call to JPL’s Fortran subroutine PLEPH, which in turn calls other Fortran
subroutines in the JPL ephemeris software package.
Establishing a working copy of the JPL software and the DEnnn binary files on your system
is not, unfortunately, a trivial process. The files for doing that can be obtained directly from
JPL26 as discussed in Appendix C.
Once you have generated a DEnnn binary file, you can test the combined set-up with
solarsystem version 1 on your system as follows:
a. Compile and link files checkout-stars-full.c, novas.c, novascon.c, nutation.c,
solsys1.c, eph_manager.c, and readeph0.c.
b. Name the resulting application checkout-stars-full.
c. Run the checkout-stars-full application.

25
26

http://www.usno.navy.mil/USNO/astronomical-applications/software-products/usnoae98
http://ssd.jpl.nasa.gov/?planet_eph_export
C-28

d. Compare the results that you get from checkout-stars-full with the data in file
checkout-stars-full-usno.txt. If the results agree, the installation was probably
successful, but see the important note above.
The USNO output file, checkout-stars-full-usno.txt, was generated using DE405. The
application, check-out-stars-full, uses the full-accuracy mode of NOVAS, which includes
the IAU 2000A nutation model, a three-body gravitational deflection model, two-part Julian
dates in calls to function ephemeris, and the full series when computing the “complementary
terms” in the equation of the equinoxes [iau2000a, nutation_angles, grav_def, ephemeris,
ee_ct]. If your accuracy requirements are no better than about 1 milliarcsecond, you may
wish to consider “reduced-accuracy” mode, which is described in Section 2.6, for your own
applications.
2.4 Using External Minor Planet Ephemeris Files
The USNO/AE98 27 minor planet ephemerides contain positions for fifteen of the largest
asteroids and are used in the production of The Astronomical Almanac. These ephemerides
along with software to compact, read, and interpolate them are available on CD-ROM from
the USNO. The software is written in C and designed to be used with NOVAS. To include
these ephemeris files in your NOVAS programs, you will need to install a working copy of
the USNO/AE98 software and convert the relevant ASCII ephemerides to binary Chebyshev
polynomial ephemerides. You will still need one version of solarsystem; solarsystem
version 1 with access to the JPL lunar and planetary ephemeris is recommended.
Instructions 28 for installing and testing the USNO/AE98 software and for converting
ephemerides are provided with the software. Section 2.3 and Appendix C discuss the use and
installation of a JPL lunar and planetary ephemeris.
In order to access the USNO/AE98 minor planet ephemerides, function ephemeris calls
function readeph, which is part of the USNO/AE98 package and is not part of, or supplied
with, NOVAS. A dummy version of readeph is provided in file readeph0.c. The dummy
function enables NOVAS to be used without the minor planet package (i.e., for computing
positions of major solar system bodies and “stars” only). To use USNO/AE98 with NOVAS,
replace file readeph0.c provided with NOVAS, with readeph.c, allocate.c, and chby.c from
the USNO minor planet ephemerides software when compiling and linking.
Once you have a DEnnn binary solar system ephemeris file, the USNO/AE98 software, and a
binary Chebyshev polynomial ephemeris of a minor planet, you can test the combined set-up
with solarsystem version 1 on your system as follows:
a. Compile and link files checkout-mp.c, novas.c, novascon.c, nutation.c, solsys1.c,
eph_manager.c, readeph.c, allocate.c, and chby.c. The last three code files are
from the USNO/AE98 software.
b. Name the resulting application checkout-mp.
c. Run the checkout-mp application.

27
28

http://www.usno.navy.mil/USNO/astronomical-applications/software-products/usnoae98
http://www.usno.navy.mil/USNO/astronomical-applications/software-products/usnoae98/ae98-rm
C-29

d. Compare the results that you get from checkout-mp with the data in file checkoutmp-usno.txt. If the results agree, the installation was probably successful, but see the
important note above.
The USNO output file, checkout-mp-usno.txt, was generated using DE405 from JPL and
pallas.chby from the minor planet ephemerides. Like the check-out-stars-full application,
checkout-mp uses the full-accuracy mode of NOVAS. If you do not require accuracy better
than about 1 milliarcsecond, you may wish to consider the “reduced-accuracy” mode
discussed in Section 2.6.
2.5 Using an External CIO File
You have the option of using an external file of CIO right ascension values on the GCRS or
of allowing NOVAS to calculate the true right ascension of the CIO (the arc on the
instantaneous equator from the equinox to the CIO) using a series expansion. Section 5.3
explains how NOVAS handles these two situations. If you choose to use CIO_RA.TXT,
which is provided with NOVAS, you must first convert it to a binary direct-access file as
follows:
a. Copy CIO_RA.TXT and cio_file.c to a directory on your local system.
b. Compile cio_file.c.
c. Name the resulting application cio_file.
d. Run the cio_file application. If everything runs smoothly, you should get the
following message
Results from program cio_file:
Input file identifier: CIO RA P03

@ 1.200d

182657 records read from the input file:
First Julian date: 2341951.400000
Last Julian date: 2561138.600000
Data interval: 1.200000 days
First data point: 2341951.400000
Last data point: 2561138.600000

-1.948328
1.942125

Binary file cio_ra.bin created.

e. Verify the presence of cio_ra.bin, which should contain approximately 2.9 Mbytes.
The file CIO_RA.TXT, as supplied, contains six centuries of data, most of which is seldom
used, so trimming it down can reduce the file size. It is plain text (ASCII) that can be
modified by any text editor. The first record is a header, which should remain as such
(although its contents are not used by NOVAS), but all the other records contain a Julian date
and information for that date in ascending date order. Simply trim from the beginning and
ending of the file any records for dates that you are sure you will never need; be sure to leave
at least ten extra dates on each end to allow the internal interpolation scheme to work
properly. For example, CIO_RA.TXT contains data for years 1700 through 2300 but you
may need only the range from 2010 to 2015. Leave the data within your overall anticipated
date range as is—that is, do not attempt to make several groups of dates within the same file.
The final file that you create must be a fixed-interval list running from the first date to the
last date with no gaps after the header record. When you have modified CIO_RA.TXT
C-30

appropriately, follow the steps above to convert your custom version to the binary directaccess format useable by NOVAS. The output message and file will differ from that above
based on the changes you made.
If a CIO file (cio_ra.bin) is not present when NOVAS needs to determine the location of the
CIO, NOVAS will simply revert to using an internal computation for this information. The
results differ by a few microarcseconds at most, and those differences are reached only for
dates before 1900 or after 2200. The two approaches represent independent algorithms for
determining the location of the CIO on the equator, and the tiny differences for dates that are
several centuries from now are of no practical consequence. Small differences in execution
time may occur for the two approaches, but those timing differences are likely to vary with
the specific application—depending, for example, on the order and spread of the dates that
are processed by NOVAS. For some applications using such an external file may be
undesirable. Because, in many simple NOVAS applications, the location of the CIO is never
needed, the best scheme is probably to start without using the CIO file. If your application’s
execution time is critical, you might want to experiment to see whether using a CIO file
affects its performance one way or the other.
2.6 Reduced-accuracy Mode
NOVAS has “full-accuracy” and “reduced-accuracy” modes that must be selected when
calling about half of the functions in novas.c; see the prolog to each function and the
corresponding description in Chapter 4 for specific functions. Each of those functions has a
short integer input parameter, accuracy. If accuracy is set to zero (0), the function and
any lower-level functions that it calls will proceed with full accuracy. Alternatively, if
accuracy is set to one (1), the function and any lower-level functions that it calls will
proceed with reduced accuracy.
In full-accuracy mode,
•
•
•
•
•

nutation calculations use the IAU 2000A model [iau2000a, nutation_angles];
gravitational deflection is calculated using three bodies: Sun, Jupiter, and Saturn
[grav_def];
the equation of the equinoxes includes the entire series when computing the
“complementary terms" [ee_ct];
geocentric positions of solar system bodies are adjusted for light travel time using
split, or two-part, Julian dates in calls to ephemeris and iterate with a convergence
tolerance of 10-12 days [light_time, ephemeris];
ephemeris calls the appropriate solar system ephemeris using split, or two-part, Julian
dates primarily to support light-time calculations [ephemeris, solarsystem_hp,
light_time].

In reduced-accuracy mode,
•
•

nutation calculations use the 2000K model, which is the default for this mode, or the
IAU 2000B model, which may be set manually by user [nu2000k, iau2000b,
nutation_angles];
gravitational deflection is calculated using only one body, the Sun [grav_def];
C-31

•
•
•

the equation of the equinoxes excludes terms smaller than 2 microarcseconds when
computing the "complementary terms" [ee_ct];
geocentric positions of solar system bodies are adjusted for light travel time using
single-value Julian dates in calls to ephemeris and iterate with a convergence
tolerance of 10-9 days [light-time, ephemeris, solarsystem];
ephemeris calls the appropriate solar system ephemeris using single-value Julian
dates [ephemeris, solarsystem].

In full-accuracy mode, the IAU 2000A nutation series (1,365 terms) is used [iau2000a].
Evaluating the series for nutation is usually the main computational burden in NOVAS, so
using reduced-accuracy mode improves execution time, often noticeably. In reducedaccuracy mode, the NOVAS 2000K nutation series (488 terms) is used by default [nu2000k].
This mode can be used when the accuracy requirements are not better than 0.1 milliarcsecond
for stars or 3.5 milliarcseconds for solar system bodies. Selecting this approach can reduce
the time required for Earth-rotation computations by about two-thirds. However, if your
reduced-accuracy application requires the IAU-approved truncated nutation series, IAU
2000B (77 terms), you can edit the function nutation_angles slightly so that it calls iau2000b
in reduced-accuracy mode instead of nu2000k; the necessary changes are described in the
prolog to that function. Section 1.4 and USNO Circular 181 29 (Kaplan 2009) provide some
additional information about nutation series.
2.7 References
Hilton, J. L. 1999, AJ, 117, 1077 http://www.usno.navy.mil/USNO/astronomicalapplications/software-products/usnoae98 (USNO/AE98)
Kaplan, G. H. 2009, Nutation Series Evaluation in NOVAS 3.0, USNO Circular 181
(Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-181
USNO & HMNAO. 2010, The Astronomical Almanac for the Year 2011, (Washington, DC:
GPO) and subsequent editions

(Return to Table of Contents)

29

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-181
C-32

Chapter 3

Sample Calculations

The sample C code discussed in this chapter can be found in the file example.c, which is
distributed along with NOVAS; it is a main function that can be linked to the NOVAS
modules and executed. It requires solarsystem version 1, a working copy of the JPL software,
and a DEnnn binary file. To use it,
a. compile and link files: example.c, novas.c, novascon.c, nutation.c, solsys1.c,
eph_manager.c, and readeph0.c.
b. name the resulting application example.
c. verify that the JPL ephemeris file JPLEPH, or an alias to it, is available in the same
directory as example.
d. execute the example application.
The results are given in the file example-usno.txt, which was generated at the USNO with
the JPL DE405 ephemeris. example.c may be modified for use with solarsystem version 2;
see the comments within that file for details.
NOVAS has a number of high-level functions that make obtaining frequently needed
information on the positions of celestial objects easy; some of these are described below. In
addition, Chapter 4 describes many of the functions and all of the structures used in these
examples. The checkout programs used to validate a local installation (checkout-stars.c,
checkout-stars-full.c, and checkout-mp.c) also provide other examples of NOVAS function
calls.
Note that all floating-point arguments to NOVAS functions, input or output, are double
precision floating-point values (type double).
3.1 Initialization
You may choose to call many NOVAS functions in either full- or reduced-accuracy modes.
Usually all functions in a single application will have the same accuracy requirements.
Therefore, you may wish to define a short integer constant for this purpose at the beginning
of your main function. example operates in full-accuracy mode, so accuracy is set to zero
const short int accuracy = 0;

A value of one (1) would have set reduced accuracy. For more information on the two
modes, see section 2.6.
Three high-level NOVAS functions sidereal_time, ter2cel, and cel2ter can perform their
internal calculations using either the CIO-based method or equinox-based method. If you will
be calling these functions multiple times, you may also wish to define a short integer constant
for this purpose, with a value of zero (0) for the CIO-based method or one (1) for the
equinox-based method. In example, the appropriate method is chosen when these functions
are called. Because the equinox-based method is more efficient for computing sidereal time,
example chooses this mode. For more information about these two methods, see section 5.2.

C-33

3.2 Setting Time Arguments
You should also consider how you will handle dates and times. As described in section 1.3,
NOVAS uses either of two time scales, TT or UT1, as the basis for the time input argument
to its higher-level functions. However, you may be working with UTC, Coordinated
Universal Time. UTC is the basis for civil time systems worldwide and, because it is
distributed quite accurately by GPS, is often used as the time-tag for observations. The key
relationship is
TT = UTC + ∆AT + 32.184s
where ∆AT is an integer representing the total count of leap seconds in UTC (for example,
∆AT = 34 s for 2011). Equivalently,
TT = TAI + 32.184s
where TAI is International Atomic Time. If you will only be dealing with the geocentric
celestial coordinates of objects, TT is all you will need.
If you will also be computing topocentric coordinates (for a specific location on the surface
of the Earth), you will also need to obtain UT1. The key relationship is
UT1 = UTC + (UT1–UTC)
where UT1–UTC is interpolated from the daily values of this quantity published by the
IERS. 30 Alternatively,
UT1 = TT – ∆T
See section 1.3 for more information on time scales, including sources of data that can be
used for the values of ∆AT, UT1–UTC, and ∆T.
To convert a date and time in the common format (year/month/day/hour/minute/second) to a
Julian date, which is used by NOVAS for time arguments, call julian_date. Dates and times
based on UTC, TT, or UT1 (or any other time scale) can be converted using julian_date; the
output Julian date simply has the same basis as the input date and time. In the examples
below, we will be using 2008 April 24, 10:36:18.0 UTC as the time of interest; this
corresponds to a Julian date of 2454580.9441875 UTC. 31 Consequently, we will use a ∆AT
value of 33 s and a UT1–UTC value of −0.387845 s, which are appropriate for this date.
const
const
const
const

short
short
short
short

int
int
int
int

year = 2008;
month = 4;
day = 24;
leap_secs = 33;

const double hour = 10.605;
const double ut1_utc = -0.387845;
const double x_pole = -0.002;
const double y_pole = +0.529;

30

http://maia.usno.navy.mil/ser7/mark3.out
A “UTC Julian date” is something of a non sequitur, because UTC is not continuous due to leap seconds.
Here we are simply using julian_date with UTC input to obtain a value that allows us to compute Julian dates in
better-behaved time scales.
31

C-34

where x_pole and y_pole are the coordinates of the CIO with respect to the ITRS pole for
2008 April 24. So, if we use
jd_utc = julian_date (year,month,day,hour);

the output argument, jd_utc, will have a value of 2454580.9441875. The next few lines
of code should be something like
jd_tt = jd_utc + ((double) leap_secs + 32.184) / 86400.0;
jd_ut1 = jd_utc + ut1_utc / 86400.0;
delta_t = 32.184 + leap_secs - ut1_utc;

where 86400.0 is the number of seconds in a day, and the value of delta_t would be
computed to be 65.571845 (seconds). If we had known the value of ∆T (delta_t) at the
start, rather than the value of ut1_utc (UT1–UTC), then the lines immediately above could
have been replaced by
jd_tt = jd_utc + ((double) leap_secs + 32.184) / 86400.0;
jd_ut1 = jd_tt - delta_t / 86400.0;

3.3 Example 1—Position of a Star
Suppose we have the catalog data from star FK6 1307 (Groombridge 1830) for epoch
J2000.0, expressed in the ICRS:
11.88299133
ICRS right ascension at J2000.0 (hours):
37.71867646
ICRS declination at J2000.0 (degrees):
4003.27
Proper motion in RA (milliarcseconds per year):
–5815.07
Proper motion in dec (milliarcseconds per year):
109.21
Parallax (milliarcseconds):
–98.8
Radial velocity (kilometers per second):
To obtain the apparent geocentric place of the star on our date of interest, with respect to the
equator and equinox of that date, first make a structure of type cat_entry,
make_cat_entry ("GMB 1830","FK6",1307,11.88299133,37.71867646,
4003.27,-5815.07109.21,-98.8, &star);

Then, simply call app_star supplying it with the catalog quantities:
error = app_star (jd_tt,&star,accuracy,&ra,&dec)

In this example and other examples in this chapter, the returned value from the function—
error—is an error indicator. Non-zero values of error indicate an error condition inside
the function; see the function prolog for details. The calling function should take appropriate
action in such cases. The output coordinates, ra and dec (hours and degrees, respectively),
represent the apparent geocentric coordinates of the star, with respect to the true equator and
equinox of date. The computation takes into account all time-dependent effects that shift the
star’s position from its catalog coordinates (except atmospheric refraction, which is locationand weather-dependent): the star’s space motion to the date of interest, parallax due to the
Earth’s position in its orbit, gravitational light-bending in the solar system, aberration due to
the Earth’s orbital velocity, and the precession and nutation of the Earth’s axis.
Important note: Hipparcos catalog data, although expressed with respect to the ICRS, refer
to epoch 1991.25 and must be converted to epoch J2000.0 before being used as input
arguments to any NOVAS function. Use function transform_hip to do this. Most other
C-35

modern catalogs, including the FK6 (used above), Tycho-2, UCAC, etc., provide data for
epoch J2000.0 that need no conversion.
If we want the apparent topocentric place of the star, that is, the star’s position as it would be
seen (except for refraction) from a particular location on Earth, such as off the Atlantic coast
near Truro, Massachusetts
const
const
const
const
const

double
double
double
double
double

latitude = 42.0;
longitude = -70;
height = 0.0;
temperature = 10.0;
pressure = 1010.0;

where longitude and latitude are the location’s geodetic longitude and latitude
(degrees, with east longitude and north latitude positive) and height is the height of the
location above sea level (meters). The temperature and pressure (in degrees Celsius
and millibars, respectively) are only used in calculations involving atmospheric refraction;
here, the values are simply placeholders. You should create a structure of type on_surface
for that location
make_on_surface (latitude,longitude,height,temperature,pressure,&geo_loc);

Now, call topo_star
error = topo_star (jd_tt,delta_t,&star,&geo_loc,accuracy,&rat,&dect)

where rat and dect reflect the position of the star as it would be seen from that particular
location—the small differences from the geocentric coordinates ra and dec arise mainly
from diurnal aberration. topo_star uses the catalog data on the star created earlier.
3.4 Example 2—Position of the Moon
Obtaining the coordinates of solar system objects other than the Sun requires that either
solarsystem version 1 or version 2 be used. First, you will need to create a structure of type
cat_entry for a “dummy” star, which is, then, used as a placeholder in a structure of type
object for the Moon.
make_cat_entry ("DUMMY","xxx",0,0.0,0.0,0.0,0.0,0.0,0.0,&dummy_star);
error = make_object (0,11,"Moon",&dummy_star,&moon)

Then, call function app_planet
error = app_planet (jd_tt,&moon,accuracy,&ra,&dec,&dis)

where, again, ra and dec are the apparent geocentric coordinates of the Moon (hours and
degrees, respectively), with respect to the true equator and equinox of date, and dis is the
true (Euclidean) geocentric distance (astronomical units or AU) at time jd_tt. The
computation of the angular coordinates of solar system objects takes light-time into account,
along with the other effects (light bending, aberration, precession, and nutation) that also
apply to stars.
To get the topocentric celestial coordinates of the Moon, call topo_planet
error = topo_planet(jd_tt,&moon,delta_t,&geo_loc,accuracy,&rat,&dect,&dist)

However, a single function, place, can be used for all types of positions of both stars and
solar system objects. In fact, app_star, topo_star, app_planet, and topo_planet, along with
C-36

several other similar functions, are actually just special-purpose front-ends to place. place
uses three structure arguments (cel_object of type object and location of type
observer for input and output of type sky_pos for output) as well as several scalar
arguments. The cel_object of type object is same as was created earlier for use by
app_planet and topo_planet in calculating the position of the Moon. Function
make_observer_on_surface creates a structure of type observer for an observer on, or near,
the surface of the Earth:
make_observer_on_surface (latitude,longitude,height,temperature,pressure,
&obs_loc);

The call to place to obtain topocentric coordinates of the Moon, with respect to the true
equator and equinox of date, then is
error = place (jd_tt,&moon,&obs_loc,delta_t,1,accuracy,&t_place)

where short integer coord_sys has been set to one (1) so that the output coordinates in
t_place, a structure of type sky_pos, will be based on the true equator and equinox of
date:
typedef struct
{
double r_hat[3];
double ra;
double dec;
double dis;
double rv;
} sky_pos;

Here, double r_hat[3] is a dimensionless unit vector in the apparent direction of the
Moon, in the same coordinate system as the right ascension and declination (i.e., it is exactly
equivalent to the spherical coordinates). place has many options for both input and output;
refer to its description in Chapter 4 or look at its prolog.
Once you have the topocentric celestial coordinates of an object, these can be transformed
into local altitude and azimuth by a call to equ2hor. If we have used place to obtain the
topocentric coordinates, then
equ2hor (jd_ut1,delta_t,accuracy,0.0,0.0,&geo_loc,rat,dect,1,&zd,&az,&rar,
&decr);

where the refraction option, short integer ref_option, is set here to one (1) and the x- and
y-coordinates of the CIO with respect to the ITRS pole, double xp and double yp, have been
set to zero (0.0). The refraction option selected here is for “standard atmospheric” conditions.
The other options for refraction are zero (0) for no refraction or two (2) for refraction based
on the atmospheric conditions indicated by location, a structure of type on_surface.
Setting the CIO coordinates to zero is appropriate when sub-arcsecond accuracy is
unnecessary; otherwise these arguments should contain the appropriate pole coordinates for
the date of interest. The output coordinates, zd, az, rar, and decr, are, respectively, the
zenith distance (degrees), azimuth (degrees), right ascension (hours), and declination
(degrees). The output values of zd, rar, and decr are affected by atmospheric refraction for
refraction options 1 and 2. If ref_option equals 0, the output right ascension and
declination values are the same as the input values. zd and az are referred to the horizon
C-37

system that is tangent to the Earth’s reference ellipsoid at the observer’s location; that is, the
deflection of the vertical (the local undulation of the geoid) is not taken into account.
3.5 Example 3—Greenwich Sidereal Time
To obtain Greenwich sidereal time, call sidereal_time:
error = sidereal_time (jd_ut1,0.0,delta_t,1,1,accuracy,&gast)

where short integer gst_type and short integer method have each been set to one (1) to
compute Greenwich apparent sidereal time using the equinox-based method. In this example,
the output sidereal time gast is Greenwich apparent sidereal time in hours. If gst_type
had been set to zero (0), the output sidereal time would have been Greenwich mean sidereal
time in hours. Choosing between equinox-based and CIO-based methods is discussed in
section 3.1 and section 5.2.
sidereal_time and several other functions allow for a “split” input UT1 Julian date—highand low-order parts in the first two arguments—for increased precision. Generally, the split
would be at the Julian date’s decimal point, with the day count in the first argument and the
fraction of a day in the second. However, using two arguments for the Julian date provides
more precision only if the fractional part of the Julian date has been handled separately all
along. We have not done that, so here, the entire Julian date is just placed in the first
argument and the second argument is set to zero (0.0).
To compute local sidereal time (either mean or apparent), add the longitude (east positive)
expressed in hours:
last = gast + geo_loc.longitude / 15.0;

The result may have to be reduced to the range 0 to 24 hours by statements similar to the
following:
if (last >= 24.0)
last -= 24.0;
if (last < 0.0)
last += 24.0;

The quantity that is analogous to Greenwich apparent sidereal time in the CIO-based
paradigm is θ, the ERA. It can be computed
theta = era (jd_ut1,0.0);

where theta is the ERA (degrees). era, like sidereal_time, allows for a split input UT1
Julian date.
See section 5.1 for information on the difference between Greenwich apparent sidereal time
and the ERA, and how hour angles are computed in the two paradigms.
3.6 Example 4—Other Frequently Requested Quantities
In the following function calls, vectors are used. Vectors are simply double-precision arrays
with a dimension of 3. Most NOVAS internal calculations are performed with vectors and
matrices. The following vectors are referred to below:
double pos[3], vel[3], pose[3], vter[3], vcel[3];

C-38

To obtain the barycentric or heliocentric coordinates (BCRS vectors) of a solar system body,
for example, Mars, first create an appropriate structure of type object
error = make_object (0,4,"Mars",&dummy_star,&mars)) != 0

which uses the dummy_star structure created in Example 2. Then, call ephemeris:
jd_tdb = jd_tt;
/* Approximation good to 0.0017 seconds. */
jd[0] = jd_tdb;
jd[1] = 0.0;
error = ephemeris (jd,&mars,1,accuracy,pos,vel)

where short integer origin has been set to one (1) to obtain a heliocentric position, we have
approximated jd_tdb = jd_tt, 32 and the output position and velocity vectors are pos and
vel (components in AU and AU/day, respectively). For barycentric positions, set origin
to zero (0).
If pos is a heliocentric vector, it can be transformed to the ecliptic system (fixed ecliptic of
J2000.0) by calling equ2ecl_vec:
error = equ2ecl_vec (T0,2,accuracy,pos,pose)

where pose is the output vector in the ecliptic system (same units as pos). pose could then
easily be converted to heliocentric spherical coordinates: ecliptic longitude, ecliptic latitude,
and radius vector.
error = vector2radec (pose,&elon,&elat)
elon *= 15.0;
r = sqrt (pose[0] * pose[0] + pose[1] * pose[1] + pose[2] * pose[2]);

Finally, transforming a vector from the terrestrial reference system to the celestial reference
system can be useful. The vector might represent a geographic position, a geodetic reference
line or direction, or an instrumental axis. For this transformation, the vector starts out as an
Earth-fixed vector expressed with respect to the ITRS axes. For example, the vector toward
the local vertical (orthogonal to the ellipsoid at the place of interest) is simply (cos φ cos λ,
cos φ sin λ, sin φ), where φ is the geodetic latitude and λ is the longitude. A vector along a
telescope’s polar axis would nominally point toward (0,0,1) in this system.
lon_rad
lat_rad
sin_lon
cos_lon
sin_lat
cos_lat
vter[0]
vter[1]
vter[2]

=
=
=
=
=
=
=
=
=

geo_loc.longitude * DEG2RAD;
geo_loc.latitude * DEG2RAD;
sin (lon_rad);
cos (lon_rad);
sin (lat_rad);
cos (lat_rad);
cos_lat * cos_lon;
cos_lat * sin_lon;
sin_lat;

Any such ITRS vector can be transformed into the equivalent GCRS vector with a single call
to ter2cel:
error = ter2cel (jd_ut1,0.0,delta_t,1,accuracy,0,x_pole,y_pole,vter,vcel)

32

Strictly, ephemeris requires a TDB-based Julian date as input. TDB differs from TT by at most 1.7 ms; see
section 1.3. If this time difference is important, use function tbd2tt to determine the difference between the two
time scales and adjust jd_tdb accordingly. For the example here, neglecting the difference can lead to an
error in the position of Mars of about 50 meters.
C-39

where vter is the input vector (terrestrial, ITRS) and vcel is the equivalent output vector
(celestial, GCRS). The components of vter can be in any units; vcel will be in the same
units. vcel will sweep around the celestial sphere as the Earth rotates, i.e., as jd_ut1
advances. (ter2cel, like sidereal_time, allows for a split input UT1 Julian date.) Use
vector2radec to obtain vcel’s instantaneous spherical coordinates:
error = vector2radec (vcel,&ra,&dec)

where ra and dec are the GCRS right ascension and declination (hours and degrees,
respectively) of the point on the celestial sphere toward which vcel points. At any jd_ut1,
vcel can be compared to the directions of stars computed by place for the equivalent jd_tt,
with GCRS output coordinates selected.

(Return to Table of Contents)

C-40

Chapter 4

Data Str uctur es and Functions

NOVAS can be used several different ways. Some users will simply want to adopt a subset
of the basic or utility functions for use in their own code systems. For these users, the
function prologs should be sufficient for providing the information needed to use the
functions. Other users will want to implement the supervisory functions to compute, for
example, apparent places of stars or topocentric places of solar system bodies. This section
of the user’s guide is intended for these users.
4.1 Important Data Structures
Seven important data structures are used throughout NOVAS. They are formally declared in
file novas.h.
Structure cat_entry
Structure cat_entry contains the astrometric catalog data for a celestial object; equator and
equinox and units will depend on the catalog. While this structure can be used as a generic
container for catalog data, all high-level NOVAS functions require ICRS catalog data with
the appropriate units, which are shown in parentheses below:
typedef struct
{
char starname[SIZE_OF_OBJ_NAME];
char catalog[SIZE_OF_CAT_NAME];
long int starnumber;
double ra;
double dec;
double promora;
double promodec;
double parallax;
double radialvelocity;
} cat_entry;

where
starname[SIZE_OF_OBJ_NAME]
catalog[SIZE_OF_CAT_NAME]
starnumber
ra
dec
promora
promodec
parallax
radialvelocity

=
=
=
=
=
=

name of celestial object
catalog designator (e.g., HIP)
integer identifier assigned to object
ICRS right ascension (hours)
ICRS declination (degrees)
ICRS proper motion in right ascension
(milliarcseconds/year)
= ICRS proper motion in declination
(milliarcseconds/year)
= parallax (milliarcseconds)
= radial velocity (km/s)

SIZE_OF_OBJ_NAME and SIZE_OF_CAT_NAME are constants also defined in novas.h. Each
is the number of characters in the string (the string length) plus the null terminator.

C-41

Structure object
Structure object designates a celestial object:
typedef struct
{
short int type;
short int number;
char name[SIZE_OF_OBJ_NAME];
cat_entry star;
} object;

where
type

number

name
star

=
=
=
=

type of object
0 ... major planet, Pluto, Sun, or Moon
1 ... minor planet
2 ... object located outside the solar system
(star, nebula, galaxy, etc.)
= object number
For 'type' = 0: Mercury = 1, ..., Pluto = 9,
Sun = 10, Moon = 11
For 'type' = 1: minor planet number
For 'type' = 2: set to 0 (object is
fully specified in 'struct cat_entry')
= name of the object (limited to
(SIZE_OF_OBJ_NAME – 1) characters)
= basic astrometric data for any celestial object
located outside the solar system; the catalog
data for a star

Structure on_surface
Structure on_surface contains data for the observer’s location on the surface of the Earth.
The atmospheric parameters (temperature and pressure) are used only by the refraction
function (refract) called from function equ2hor when ref_option = 2; dummy values can
be used otherwise. Additional parameters can be added to this structure if a more
sophisticated refraction model is employed:
typedef struct
{
double latitude;
double longitude;
double height;
double temperature;
double pressure;
} on_surface;

where
latitude
longitude
height
temperature
pressure

=
=
=
=
=

geodetic (ITRS) latitude; north positive (degrees)
geodetic (ITRS) longitude; east positive (degrees)
height of the observer (meters)
temperature (degrees Celsius)
atmospheric pressure (millibars)

C-42

Structure in_space
Structure in_space contains data for an observer’s location on a near-Earth spacecraft:
typedef struct
{
double sc_pos[3];
double sc_vel[3];
} in_space;

where
sc_pos[3]
sc_vel[3]

= geocentric position vector (x, y, z), components
in km
= geocentric velocity vector (x_dot, y_dot,
z_dot), components in km/s
Both vectors with respect to true equator and
equinox of date

Structure observer
Structure observer is a general container for information specifying the location of the
observer:
typedef struct
{
short int where;
on_surface on_surf;
in_space near_earth;
} observer;

where
where

on_surface
near_earth

= integer code specifying location of observer
= 0: observer at geocenter
= 1: observer on surface of earth
= 2: observer on near-earth spacecraft
= structure containing data for an observer's
location on the surface of the Earth (where = 1)
= data for an observer's location on a near-Earth
spacecraft (where = 2)

Structure sky_pos
Structure sky_pos contains data specifying a celestial object’s place on the sky, specifically
the output from function place:
typedef struct
{
double r_hat[3];
double ra;
double dec;
double dis;
double rv;
} sky_pos;

where
r_hat[3]

= unit vector toward object (dimensionless)
C-43

ra
dec
dis
rv

= apparent, topocentric, or astrometric
right ascension (hours)
= apparent, topocentric, or astrometric
declination (degrees)
= true (geometric, Euclidian) distance to solar
system body or 0.0 for star (AU)
= radial velocity (km/s)

Structure ra_of_cio
Structure ra_of_cio contains the right ascension of the Celestial Intermediate Origin (CIO)
with respect to the GCRS:
typedef struct
{
double jd_tdb;
double ra_cio;
} ra_of_cio;

where
jd_tdb
ra_cio

= TDB Julian date
= right ascension of the CIO with respect
to the GCRS (arcseconds)

4.2 Function List
The following functions are contained in file novas.c:
Function name
place *

sidereal_time
ter2cel **
cel2ter ***
equ2hor
transform_cat
transform_hip
app_star
topo_star
virtual_star
local_star
astro_star
mean_star
app_planet
topo_planet
virtual_planet

Level Purpose
super Computes apparent direction of a star or solar system body, given the
time and observer’s location. Direction is expressed in one of several
selectable coordinate systems.
super Computes Greenwich sidereal time, either mean or apparent
super Transforms arbitrary vector in rotating Earth-fixed (ITRS) system to
space-fixed (GCRS) system, terrestrial-to-celestial transformation
super Transforms arbitrary vector in space-fixed (GCRS) system to rotating
Earth-fixed (ITRS) system, celestial-to-terrestrial transformation
super Transforms topocentric RA and dec to zenith distance and azimuth,
optionally accounts for atmospheric refraction
super Transforms star’s catalog quantities for a change of epoch and/or
equator and equinox
super Converts Hipparcos catalog data at epoch J1991.25 to epoch J2000.0
super Computes apparent place of a star, given its catalog data
super Computes topocentric place of a star, given geodetic location of
observer
super Computes virtual place of a star, given its catalog data
super Computes local place of a star, given geodetic location of observer
super Computes astrometric place of a star, given its catalog data
super Computes ICRS/J2000.0 place of a star, given its apparent place
super Computes apparent place of a solar system body
super Computes topocentric place of a solar system body, given geodetic
location of observer
super Computes virtual place of a solar system body

C-44

Function name
local_planet

Level Purpose
super Computes local place of a solar system body, given geodetic location
of observer
astro_planet
super Computes astrometric place of a solar system body
aberration
util
Adjusts position vector for aberration of light due to motion of Earth
bary2obs **
util
Changes origin of coordinates from barycenter of solar system to
center of mass of Earth
cio_basis *
util
Computes orthonormal basis vectors, with respect to GCRS, of righthanded system defined by CIP (z-direction) and CIO (x-direction)
d_light *
util
For a star, returns difference in light-time between solar system
barycenter and observer. Or, returns the light-time from observer to
point on light ray closest to a given solar system body.
ecl2equ_vec *
util
Converts ecliptic position vector to an equatorial position vector
equ2ecl *
util
Converts RA and dec to ecliptic longitude and latitude
equ2ecl_vec *
util
Converts equatorial position vector to an ecliptic position vector
equ2gal *
util
Converts ICRS RA and dec to galactic longitude and latitude
era *
util
Returns ERA (θ) for given UT1 Julian date
frame_tie *
util
Transforms vector between dynamical reference system (mean
equator and equinox of J2000.0) and ICRS
gcrs2equ *
util
Converts GCRS RA and dec to coordinates with respect to the
equator of date (mean or true)
geo_posvel *
util
Computes geocentric position and velocity, in GCRS, of observer on,
or near, the surface of Earth
grav_def **
util
Computes total gravitational deflection of light for an object due to
major solar system bodies
grav_vec *
util
Corrects position vector for deflection of light in gravitational field
of given body
light_time *
util
Computes position of a solar system body antedated for light-time
limb_angle *
util
Determines angle of object above or below Earth's limb (horizon)
make_cat_entry
util
Creates a structure of type cat_entry containing catalog data for a
star or “star-like” object
make_object **
util
Creates structure of type object—specifying a celestial object based
on the input parameters
make_observer *
util
Creates structure of type observer—specifying the location of the
observer
make_observer_at_geocenter * util
Creates structure of type observer—specifying that the “observer”
is at the geocenter
make_observer_in_space *
util
Creates structure of type observer—specifying the position and
velocity of an observer situated on a near-Earth spacecraft
make_observer_on_surface * util
Creates structure of type observer—specifying the location of and
weather for an observer on the surface of the Earth
make_in_space *
util
Creates structure of type in_space—specifying the position and
velocity of an observer situated on a near-Earth spacecraft
make_on_surface *
util
Creates structure of type on_surface—specifying the location of
and weather for an observer on the surface of the Earth
nutation **
util
Applies nutation to position vector
precession
util
Applies precession to position vector
proper_motion
util
Updates position vector of a star to allow for its space motion
rad_vel *
util
Predicts radial velocity of observed object as would be measured by
spectroscopy
radec2vector
util
Converts RA, dec, and distance to a position vector
spin
util
Rotates vector by specified angle about the z-axis
C-45

Function name
starvectors

Level Purpose
util
Converts a star’s RA, dec, proper motion, etc., to position and
velocity vectors
util
Converts geodetic coordinates to geocentric position vector
util
Converts position vector to RA and dec
util
Adjusts Earth-fixed vector for polar motion
basic Computes calendar date and time, given Julian date
basic Allows for the specification of celestial pole offsets for highprecision applications
basic Returns array of Julian dates and corresponding values of RA of CIO
(in GCRS), given TDB Julian date and number of dates desired
basic Returns location of CIO as RA with respect to either GCRS origin or
true equinox of date, given TDB Julian date
basic Computes true right ascension of the CIO, given TT Julian date
basic Returns complementary terms for equation of the equinoxes
basic Retrieves position and velocity of a solar system body from a
fundamental ephemeris
basic Provides information on orientation of Earth’s axis: obliquity,
nutation parameters, etc.
basic Computes fundamental arguments (mean elements) of the Sun and
Moon
basic Computes intermediate RA of the equinox, given TDB Julian date
basic Computes Julian date, given calendar date and time
basic Computes the mean obliquity of the ecliptic
basic Normalize angle into the range 0 <= angle < (2 * pi)
basic Supervises calculation of nutation parameters and provides nutation
in longitude and obliquity
basic Computes atmospheric refraction in zenith distance
basic Converts Barycentric Dynamical Time (TDB) to Terrestrial Time
(TT)

terra
vector2radec
wobble
cal_date
cel_pole
cio_array *
cio_location *
cio_ra *
ee_ct *
ephemeris
e_tilt **
fund_args
ira_equinox *
julian_date
mean_obliq *
norm_ang *
nutation_angles
refract
tdb2tt **

*
New function in NOVAS C3.0
** Name change from NOVAS C2.0.1
*** New function in NOVAS C3.1

The following functions are contained in file nutation.c:
Function name
iau2000a *
iau2000b *
nu2000k *
*

Level
basic
basic
basic

Purpose
Evaluates high-accuracy nutation series (IAU 2000A model)
Evaluates low-accuracy nutation series (IAU 2000B model)
Evaluates low-accuracy nutation series (2000K, truncated version of
IAU 2000A model)

New function in NOVAS C3.0

C-46

The following functions are contained in the various solsysn.c files, where n is an integer:
Function name
solarsystem
solarsystem_hp *

Level
basic
basic

sun_eph **

basic

*
**

Purpose
Provides position and velocity vectors of a solar system body
Provides position and velocity vectors of a solar system for applications
requiring the highest precision
Computes equatorial spherical coordinates of Sun referred to the mean
equator and equinox of date

New function in NOVAS C3.0
Only present in solsys3.c

4.3 Important Functions
Descriptions of some of the most frequently used NOVAS functions follow. The prologs in
the source code at the beginning of each NOVAS function are intended to provide enough
information for correct usage. They are reproduced here followed by additional discussion
and recommendations.

C-47

place
short int place (double jd_tt, object *cel_object,
observer *location, double delta_t,
short int coord_sys, short int accuracy,
sky_pos *output)
PURPOSE:
This function computes the apparent direction of a star or solar
system body at a specified time and in a specified coordinate
system.
REFERENCES:
Kaplan, G. et al. (1989), Astronomical Journal 97, 1197-1210.
Klioner, S. (2003), Astronomical Journal 125, 1580-1597.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for place.
*cel_object (struct object)
Specifies the celestial object of interest (structure defined
in novas.h).
*location (struct observer)
Specifies the location of the observer (structure defined in
novas.h).
delta_t (double)
Difference TT-UT1 at 'jd_tt', in seconds of time.
coord_sys (short int)
Code specifying coordinate system of the output position.
= 0 ... GCRS or "local GCRS"
= 1 ... true equator and equinox of date
= 2 ... true equator and CIO of date
= 3 ... astrometric coordinates, i.e., without light
deflection or aberration.
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*output (struct sky_pos)
Output data specifying object's place on the sky at time
'jd_tt', with respect to the specified output coordinate system
(struct defined in novas.h).
RETURNED
VALUE:
= 0
= 1
= 2
= 3

> 10, < 40
> 40, < 50

...
...
...
...

No problems.
invalid value of 'coord_sys'
invalid value of 'accuracy'
Earth is the observed object, and the observer is
either at the geocenter or on the Earth's surface
(not permitted)
... 10 + error from function 'ephemeris'
... 40 + error from function 'geo_posvel'

C-48

>
>
>
>

50,
70,
80,
90,

<
<
<
<

70
80
90
100

...
...
...
...

50
70
80
90

+
+
+
+

error
error
error
error

from
from
from
from

function
function
function
function

'light_time'
'grav_def'
'cio_location'
'cio_basis'

Discussion:
Function place computes the apparent direction of a star or solar system body at a specified
time and in a specified coordinate system. The word “star” as used here refers to any object
outside the solar system.
The apparent direction of a star computed by this function takes into account the star’s proper
motion (linear three-dimensional space motion) from the catalog epoch to the date requested,
parallax, gravitational deflection of light by solar system bodies (mostly the Sun), and
aberration. The same effects are computed for solar system bodies, except that the proper
motion calculation is replaced by an algorithm that retrieves the object’s barycentric position
from its ephemeris, as part of an iterative light-time calculation. Extragalactic objects are
treated as stars with zero proper motion and parallax. The result in all cases is an apparent
direction expressed in the GCRS, which is optionally transformed into either of two other
output coordinate systems, as specified by argument coord_sys.
“Astrometric place” is a variant of the above calculation that is appropriate for some types of
differential measurements. Light bending and aberration are ignored under the assumption
that they are the same for all objects within a small area of the sky. Astrometric places are
expressed in the ICRS.
The observer’s location may be at the geocenter, on or near the surface of the Earth, or in
orbit around the Earth, as specified by the where member of the argument location.
Function place does not take into account atmospheric refraction (which would be
appropriate only for observers on, or near, the surface of the Earth), but its effect can be
added by a subsequent call to function equ2hor.
For stars, the required input data, stored in the cel_object->star argument, are the
standard five astrometric quantities from a catalog, together with radial velocity if known.
Any parameter should be set to 0.0 if its value is unknown. All catalog data used as input to
this function must apply to epoch J2000.0 and be expressed with respect to the ICRS. (For
Hipparcos catalog data, see function transform_hip.) Extragalactic objects should be treated
as stars, but with all input parameters set to 0.0 except for the catalog right ascension and
declination. For solar system bodies, the argument cel_object->number must contain the
identification number from the list of objects supported by the ephemeris in use.
The values of location->where and coord_sys for various kinds of place are listed
below.
location->where
0
1
0
1
0
1

coord_sys
0
0
1
1
2
2
C-49

Type of Place
virtual place* = proper place
local place*
apparent place
topocentric place
intermediate place
topocentric intermediate place*

location->where
0
1

coord_sys
3
3

Type of Place
astrometric place
topocentric astrometric place*
*
Place name not widely recognized outside of NOVAS.

NOVAS functions app_star, topo_star, app_planet, topo_planet, etc., are now just specialpurpose front-ends to place.
Important: The input value of ∆T (delta_t) is used only when location->where = 1
or 2 (observer is on surface of Earth or in a near-Earth satellite). An error in ∆T of 1 s can
result in a topocentric place error of up to 0.3 arcsecond for the Moon, but proportionally less
for more distant bodies (e.g., 3 milliarcseconds for Venus at its closest). Distance errors of up
to 500 m (3 × 10-9 AU) can also result, independent of distance. If errors of this magnitude are
important, care needs to be taken in specifying a more accurate value of ∆T. An error in ∆T
of 1 s will not result in a significant error in the topocentric places of stars. Values of ∆T are
published annually in The Astronomical Almanac or can be obtained from the EO web site. 33
output->rv, the radial velocity, is the predicted radial velocity measure (z) times the speed

of light, an inherently spectroscopic quantity. For a star, it includes all effects, such as
gravitational red shift, contained in the catalog barycentric radial velocity measure, which is
assumed given in cel_object->star.radialvelocity. For a solar system body, it
applies to a fictitious emitter at the center of the observed object, assumed to be massless (no
gravitational red shift), and does not in general apply to reflected light.
“Loose” catalog data can be assembled into a structure of type cat_entry by using function
make_cat_entry. Similarly, we recommend using function make_object to create the input
structure cel_object.

(Return to Function List)

33

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
C-50

sidereal_time
short int sidereal_time (double jd_high, double jd_low,
double delta_t,short int gst_type,
short int method, short int accuracy,
double *gst)
PURPOSE:
Computes the Greenwich sidereal time, either mean or apparent, at
Julian date 'jd_high' + 'jd_low'.
REFERENCES:
Kaplan, G. (2005), US Naval Observatory Circular 179.
INPUT
ARGUMENTS:
jd_high (double)
High-order part of UT1 Julian date.
jd_low (double)
Low-order part of UT1 Julian date.
delta_t (double)
Difference TT-UT1 at 'jd_high'+'jd_low', in seconds
of time.
gst_type (short int)
= 0 ... compute Greenwich mean sidereal time
= 1 ... compute Greenwich apparent sidereal time
method (short int)
Selection for method
= 0 ... CIO-based method
= 1 ... equinox-based method
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*gst (double)
Greenwich (mean or apparent) sidereal time, in hours.
RETURNED
VALUE:
(short int)
= 0
= 1
= 2
> 10, < 30

...
...
...
...

everything OK
invalid value of 'accuracy'
invalid value of 'method'
10 + error from function 'cio_rai'

Discussion:
This function computes Greenwich sidereal time, either mean, if gst_type = 0, or
apparent, if gst_type = 1.
The input Julian date, which must be in the UT1 time scale, may be split into two parts to
ensure the highest precision in the computation. For example, set jd_high equal to the
integral part of the Julian date and set jd_low equal to the fractional part. Generally, this
C-51

split will be advantageous only if the low-order part has been treated separately within the
calling program; for example, if the time of day has been stored in its own variable(s), from
which jd_low is constructed.
For many applications, the position of the split is not critical as long as the sum jd_high +
jd_low is correct: in particular, when used with computers providing 16 decimal digits of
precision in double variables, this function will yield values of gst precise to about
0.1 millisecond even if jd_high contains the entire Julian date and jd_low = 0.0.
Values of ∆T (delta_t) are published annually in The Astronomical Almanac or can be
obtained from the EO web site. 34
If gst_type = 1 for apparent sidereal time, the output value of gst will correctly reflect
the celestial pole offset in longitude if function cel_pole has previously been called.
(Return to Function List)

34

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
C-52

ter2cel
short int ter2cel (double jd_ut_high, double jd_ut_low, double delta_t,
short int method, short int accuracy, short int option,
double xp, double yp, double *vec1,
double *vec2)
PURPOSE:
This function rotates a vector from the terrestrial to the
celestial system. Specifically, it transforms a vector in the
ITRS (rotating earth-fixed system) to the GCRS (a local spacefixed system) by applying rotations for polar motion, Earth
rotation, nutation, precession, and the dynamical-to-GCRS
frame tie.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Kaplan, G. H. (2003), 'Another Look at Non-Rotating Origins',
Proceedings of IAU XXV Joint Discussion 16.
INPUT
ARGUMENTS:
jd_ut_high (double)
High-order part of UT1 Julian date.
jd_ut_low (double)
Low-order part of UT1 Julian date.
delta_t (double)
Value of Delta T (= TT - UT1) at the input UT1 Julian date.
method (short int)
Selection for method
= 0 ... CIO-based method
= 1 ... equinox-based method
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
option (short int)
= 0 ... The output vector is referred to GCRS axes.
= 1 ... The output vector is produced with respect to the
equator and equinox of date.
xp (double)
Conventionally-defined x p coordinate of celestial intermediate
pole with respect to ITRS pole, in arcseconds.
yp (double)
Conventionally-defined y p coordinate of celestial intermediate
pole with respect to ITRS pole, in arcseconds.
vec1[3] (double)
Position vector, geocentric equatorial rectangular coordinates,
referred to ITRS axes (terrestrial system) in the normal case
where 'option' = 0.
OUTPUT
ARGUMENTS:
vec2[3] (double)
Position vector, geocentric equatorial rectangular coordinates,
referred to GCRS axes (celestial system) or with respect to
the equator and equinox of date, depending on 'option'.

C-53

RETURNED
VALUE:
= 0 ... everything is ok.
= 1 ... invalid value of 'accuracy'
= 2 ... invalid value of 'method'
> 10 ... 10 + error from function 'cio_location'
> 20 ... 20 + error from function 'cio_basis'

Discussion:
Function ter2cel rotates a vector from the terrestrial to the celestial system. Specifically, it
transforms a vector in the ITRS (a rotating Earth-fixed system) to the GCRS (a local spacefixed system) by applying rotations for polar motion, Earth rotation, nutation, precession, and
the dynamical-to-GCRS frame tie. The input vector might represent a cardinal direction at
the observer’s position, a geodetic baseline, or some instrumental axis. The units for the
vector components are arbitrary and the output vector will have the same units as the input
vector. Geodetic coordinates in the WGS-84 system, also sometimes called the Earthcentered, Earth-fixed (ECEF) system, can be considered to be compatible with the ITRS.
This function allows for the input UT1 time to be represented as a split Julian date. See the
discussion in the description of function sidereal_time. Both jd_ut_high and jd_ut_low
should be non-negative for normal use; jd_ut_low = 0.0 is acceptable.
Values of ∆T (delta_t) are published annually in The Astronomical Almanac or can be
obtained from the EO web site. 35
The option flag only works for the equinox-based method.
Set xp = yp = 0.0 to omit the polar motion rotation.
Function cel2ter performs the reverse transformation, rotating the vector from the celestial
system (GCRS) to the terrestrial system (ITRS). The arguments are as described above,
except that for cel2ter, vec1 is the vector with respect to the GCRS (in) and vec2 is the
vector with respect to the ITRS (out).
(Return to Function List)

35

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
C-54

equ2hor
void equ2hor (double jd_ut1, double delta_t, short int accuracy,
double xp, double yp, on_surface *location, double ra,
double dec, short int ref_option,
double *zd, double *az, double *rar, double *decr)
PURPOSE:
This function transforms topocentric right ascension and
declination to zenith distance and azimuth. It uses a method
that properly accounts for polar motion, which is significant at
the sub-arcsecond level. This function can also adjust
coordinates for atmospheric refraction.
REFERENCES:
Kaplan, G. (2008). USNO/AA Technical Note of 28 Apr 2008,
"Refraction as a Vector."
INPUT
ARGUMENTS:
jd_ut1 (double)
UT1 Julian date.
delta_t (double)
Difference TT-UT1 at 'jd_ut1', in seconds.
accuracy (short int)
Selection for method and accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
xp (double)
Conventionally-defined x p coordinate of celestial intermediate
pole with respect to ITRS reference pole, in arcseconds.
yp (double)
Conventionally-defined y p coordinate of celestial intermediate
pole with respect to ITRS reference pole, in arcseconds.
*location (struct on_surface)
Pointer to structure containing observer's location (defined
in novas.h).
ra (double)
Topocentric right ascension of object of interest, in hours,
referred to true equator and equinox of date.
dec (double)
Topocentric declination of object of interest, in degrees,
referred to true equator and equinox of date.
ref_option (short int)
= 0 ... no refraction
= 1 ... include refraction, using 'standard' atmospheric
conditions.
= 2 ... include refraction, using atmospheric parameters
input in the 'location' structure.
OUTPUT
ARGUMENTS:
*zd (double)
Topocentric zenith distance in degrees, affected by
refraction if 'ref_option' is non-zero.
*az (double)
Topocentric azimuth (measured east from north) in degrees.

C-55

*rar (double)
Topocentric right ascension of object of interest, in hours,
referred to true equator and equinox of date, affected by
refraction if 'ref_option' is non-zero.
*decr (double)
Topocentric declination of object of interest, in degrees,
referred to true equator and equinox of date, affected by
refraction if 'ref_option' is non-zero.
RETURNED
VALUE:
None.

Discussion:
Function equ2hor takes the topocentric celestial coordinates of an object and computes the
equivalent local horizon coordinates. The function uses a method that properly accounts for
polar motion, which is significant at the sub-arcsecond level. Atmospheric refraction can be
included in the transformation, and, if so, refraction is applied to both sets of coordinates,
which can be useful for telescope pointing. Refraction, when requested, is computed by
function refract.
ra and dec, the input topocentric right ascension and declination, can be obtained from
place (with location->where = 1 and coord_sys = 1), topo_star, or topo_planet.
jd_ut1 is the UT1 time at which the topocentric place was computed. The difference
TT−UT1 (often called ∆T) is passed to the function via argument delta_t. Values of ∆T

are published annually in The Astronomical Almanac or can be obtained from the EO web
site. 36
The coordinates of the pole, xp and yp, can be obtained from IERS Bulletins A and B, 37
although xp and yp can be set to zero (0.0) if sub-arcsecond accuracy is not needed. (If
refraction is requested, sub-arcsecond accuracy is unlikely.)
The height of the observer and meteorological conditions at the observer’s location,
contained in structure location, are used only for refraction, i.e., if ref_option is not
equal to zero. In this function, the directions zd = 0.0 (the zenith) and az = 0.0 (north)
are considered fixed in the terrestrial frame. Specifically, the zenith is along the geodetic
normal, and north is toward the ITRS reference pole.
If ref_option = 0 for no refraction, then rar = ra and decr = dec.
(Return to Function List)

36
37

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
http://www.iers.org/IERS/EN/Publications/Bulletins/bulletins.html
C-56

transform_cat
short int transform_cat (short int option, double date_incat,
cat_entry *incat, double date_newcat,
char newcat_id[SIZE_OF_CAT_NAME],
cat_entry *newcat)
PURPOSE:
To transform a star's catalog quantities for a change of epoch
and/or equator and equinox. Also used to rotate catalog
quantities on the dynamical equator and equinox of J2000.0 to the
ICRS or vice versa.
REFERENCES:
None.
INPUT
ARGUMENTS:
option (short int)
Transformation option
= 1 ... change epoch; same equator and equinox
= 2 ... change equator and equinox; same epoch
= 3 ... change equator and equinox and epoch
= 4 ... change equator and equinox J2000.0 to ICRS
= 5 ... change ICRS to equator and equinox of J2000.0
date_incat (double)
TT Julian date, or year, of input catalog data.
*incat (struct cat_entry)
An entry from the input catalog, with units as given in
the struct definition (struct defined in novas.h).
date_newcat (double)
TT Julian date, or year, of transformed catalog data.
newcat_id[SIZE_OF_CAT_NAME] (char)
Catalog identifier ((SIZE_OF_CAT_NAME - 1) characters maximum)
e.g. HIP = Hipparcos, TY2 = Tycho-2.
OUTPUT
ARGUMENTS:
*newcat (struct cat_entry)
The transformed catalog entry, with units as given in
the struct definition (struct defined in novas.h).
RETURNED
VALUE:
= 0 ... Everything OK.
= 1 ... Invalid value of an input date for option 2 or 3.
= 2 ... length of 'newcat_id' out of bounds.

Discussion:
Function transform_cat performs mean place to mean place transformations on star catalog
data. Only catalog reference data, not observed quantities, should be processed by this
function.

C-57

For option = 1, 2, or 3, two dates, date_incat and date_newcat, must be specified:
the input data is associated with the first date, and the output data is associated with the
second date. Two transformations are available:
option = 1: The star’s data is updated to account for the star’s space motion

between the first and second dates, within a fixed reference system. That is,
the epoch of the data is changed, but not the equator and equinox (or other
system).
option = 2: The reference frame within which the star’s coordinates and proper

motion are expressed is rotated corresponding to precession between the first
and second dates. The star’s position in space is not changed. That is, the
equator and equinox of the data are changed, but not the epoch.
Setting option = 3 requests both transformations and is the most common case.
The two date arguments, date_incat and date_newcat, may be specified either as a
Julian date (e.g., 2433282.5) or a Julian year and fraction (e.g., 1950.0). (Values less
than 10000.0 are assumed to represent years.)
The option = 1 and option = 3 transformations are appropriate only for objects with
linear (or no) space motion; do not use them for components of binary stars. Also, this
function cannot be properly used to bring data from old star catalogs into the modern system,
because old catalogs were compiled using a set of constants (in particular, the rate of
precession) that are incompatible with modern values.
The option = 2 and option = 3 transformations involve the dynamical system, that is,
the moving mean equator and equinox. The mean equator and equinox of J2000.0 was the
most common reference system for modern astrometric catalog data before the ICRS was
introduced in 1998. Now, catalog data is usually referred to the ICRS, which is a reference
system fixed with respect to distant extragalactic objects not defined by any Earth motions
and with no associated date.
The option = 4 transformation is used to convert catalog quantities from the mean equator
and equinox of J2000.0 (the “J2000.0 system”) to the ICRS. The option = 5
transformation is the opposite. The arguments date_incat and date_newcat are ignored
for these transformations.
Function frame_tie can be used to transform vectors from the J2000.0 system to the ICRS or
vice versa.
See function transform_hip for transforming Hipparcos catalog data to epoch J2000.0.
SIZE_OF_CAT_NAME is defined in novas.h.

(Return to Function List)

C-58

transform_hip
void transform_hip (cat_entry *hipparcos,
cat_entry *hip_2000)
PURPOSE:
To convert Hipparcos catalog data at epoch J1991.25 to epoch
J2000.0, for use within NOVAS. To be used only for Hipparcos or
Tycho stars with linear space motion. Both input and output data
is in the ICRS.
REFERENCES:
None.
INPUT
ARGUMENTS:
*hipparcos (struct cat_entry)
An entry from the Hipparcos catalog, at epoch J1991.25, with
all members having Hipparcos catalog units. See Note 1
below (struct defined in novas.h).
OUTPUT
ARGUMENTS:
*hip_2000 (struct cat_entry)
The transformed input entry, at epoch J2000.0.
below (struct defined in novas.h).

See Note 2

RETURNED
VALUE:
None.
NOTES:
1. Input (Hipparcos catalog) epoch and units:
Epoch: J1991.25
Right ascension (RA): degrees
Declination (Dec): degrees
Proper motion in RA: milliarcseconds per year
Proper motion in Dec: milliarcseconds per year
Parallax: milliarcseconds
Radial velocity: kilometers per second (not in catalog)
2. Output (modified Hipparcos) epoch and units:
Epoch: J2000.0
Right ascension: hours
Declination: degrees
Proper motion in RA: milliarcseconds per year
Proper motion in Dec: milliarcseconds per year
Parallax: milliarcseconds
Radial velocity: kilometers per second

Discussion:
Function transform_hip takes Hipparcos catalog data, which is published for epoch J1991.25,
and transforms it to epoch J2000.0 for use in NOVAS functions such as place, app_star,
topo_star, virtual_star, etc. The Hipparcos (input) right ascension is expressed in degrees, as
in the catalog, while the J2000.0 (output) right ascension is given in hours, compatible with

C-59

other NOVAS functions. Function transform_cat (with option = 1) is called to perform
the epoch transformation. The reference frame for both input and output is the ICRS.
This function should be used only for Hipparcos stars with linear space motion.
Radial velocity (hipparcos->radialvelocity) is not given in the Hipparcos catalog. If
a value is not known, set hipparcos->radialvelocity = 0.0. The radial velocity is
important for only a small number of nearby, high proper motion stars.
(Return to Function List)

C-60

app_star
short int app_star (double jd_tt, cat_entry *star, short int accuracy,
double *ra, double *dec)
PURPOSE:
Computes the apparent place of a star at date 'jd_tt', given its
catalog mean place, proper motion, parallax, and radial velocity.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992), Ch. 3
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for apparent place.
*star (struct cat_entry)
Pointer to catalog entry structure containing catalog data for
the object in the ICRS (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Apparent right ascension in hours, referred to true equator
and equinox of date 'jd_tt'.
*dec (double)
Apparent declination in degrees, referred to true equator
and equinox of date 'jd_tt'.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
> 10 ... Error code from function 'make_object'.
> 20 ... Error code from function 'place'.

Discussion:
Function app_star computes the apparent place of a star for time jd_tt. As used here, any
object outside the solar system is a “star.” The calling program should set promora,
promodec, parallax, or radialvelocity within structure star to 0.0 if their values
are unknown, if their values are zero within the associated error, or if they describe an
extragalactic object.
Function app_star works by calling place with location->where = 0 and coord_sys =
1.
Function make_cat_entry can assemble “loose” catalog data into a structure of type
cat_entry.
(Return to Function List)
C-61

topo_star
short int topo_star (double jd_tt, double delta_t, cat_entry *star,
on_surface *position, short int accuracy,
double *ra, double *dec)
PURPOSE:
Computes the topocentric place of a star at date 'jd_tt', given its
catalog mean place, proper motion, parallax, and radial velocity.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for topocentric place.
delta_t (double)
Difference TT-UT1 at 'jd_tt', in seconds of time.
*star (struct cat_entry)
Pointer to catalog entry structure containing catalog data for
the object in the ICRS (defined in novas.h).
*position (struct on_surface)
Specifies the position of the observer (structure defined in
novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Topocentric
and equinox
*dec (double)
Topocentric
and equinox
RETURNED
VALUE:
(short int)
= 0 ...
= 1 ...
> 10 ...
> 20 ...

right ascension in hours, referred to true equator
of date 'jd_tt'.
declination in degrees, referred to true equator
of date 'jd_tt'.

Everything OK.
Invalid value of 'where' in structure 'location'.
Error code from function 'make_object'.
Error code from function 'place'.

Discussion:
Function topo_star computes the topocentric place of a star (neglecting atmospheric
refraction) for the location specified by the argument location at time jd_tt. Note that
jd_tt is the TT time at which the topocentric place is to be computed. The word “star” as
used here refers to any object outside the solar system. If the values of promora,
promodec, parallax, or radialvelocity within structure star are unknown (or zero
C-62

within the errors of measurement), the calling program should set them to zero. For
extragalactic objects, these input values should also be set to zero. The difference TT–UT1
(often called ∆T) is passed to the function via argument delta_t. Values of ∆T are
published annually in The Astronomical Almanac or can be obtained from the EO web site. 38
Atmospheric refraction can be subsequently applied to ra and dec by function equ2hor.
Function topo_star works by calling place with location->where = 1 and coord_sys
= 1.
“Loose” catalog data can be assembled into a structure of type cat_entry by using
function make_cat_entry.
(Return to Function List)

38

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
C-63

virtual_star
short int virtual_star (double jd_tt, cat_entry *star,
short int accuracy,
double *ra, double *dec)
PURPOSE:
Computes the virtual place of a star at date 'jd_tt', given its
catalog mean place, proper motion, parallax, and radial velocity.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for virtual place.
*star (struct cat_entry)
Pointer to catalog entry structure containing catalog data for
the object in the ICRS (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Virtual right ascension in hours, referred to the GCRS.
*dec (double)
Virtual declination in degrees, referred to the GCRS.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
> 10 ... Error code from function 'make_object'.
> 20 ... Error code from function 'place'.

Discussion:
See the discussion for function app_star. Function virtual_star is identical to app_star in
input arguments and use. Here, however, the output arguments provide the virtual place
(also called the proper place) of the star. The virtual place (proper place) is essentially the
apparent place expressed in the GCRS.
Function virtual_star works by calling place with location->where = 0 and coord_sys
= 0.
(Return to Function List)

C-64

local_star
short int local_star (double jd_tt, double delta_t, cat_entry *star,
on_surface *position, short int accuracy,
double *ra, double *dec)
PURPOSE:
Computes the local place of a star at date 'jd_tt', given its
catalog mean place, proper motion, parallax, and radial velocity.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992), Ch. 3
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for local place.
delta_t (double)
Difference TT-UT1 at 'jd_tt', in seconds of time.
*star (struct cat_entry)
Pointer to catalog entry structure containing catalog data for
the object in the ICRS (defined in novas.h).
*position (struct on_surface)
Specifies the position of the observer (structure defined in
novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Local right ascension in hours, referred to the 'local GCRS'.
*dec (double)
Local declination in degrees, referred to the 'local GCRS'.
RETURNED
VALUE:
(short int)
= 0 ...
= 1 ...
> 10 ...
> 20 ...

Everything OK.
Invalid value of 'where' in structure 'location'.
Error code from function 'make_object'.
Error code from function 'place'.

Discussion:
See the discussion for function topo_star. Function local_star is identical to topo_star in
input arguments and use. Here, however, the output arguments provide the local place of the
star. The local place is essentially the topocentric place expressed in the “local GCRS”.
Function local_star works by calling place with location->where = 1 and coord_sys
= 0.
(Return to Function List)
C-65

astro_star
short int astro_star (double jd_tt, cat_entry *star, short int accuracy,
double *ra, double *dec)
PURPOSE:
Computes the astrometric place of a star at date 'jd_tt', given
its catalog mean place, proper motion, parallax, and radial
velocity.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for astrometric place.
*star (struct cat_entry)
Pointer to catalog entry structure containing catalog data for
the object in the ICRS (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Astrometric right ascension in hours (referred to the ICRS,
without light deflection or aberration).
*dec (double)
Astrometric declination in degrees (referred to the ICRS,
without light deflection or aberration).
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
> 10 ... Error code from function 'make_object'.
> 20 ... Error code from function 'place'.

Discussion:
See the discussion for function app_star. Function astro_star is identical to app_star in
input arguments and use. Here, however, the output arguments provide the astrometric place
of the star in the ICRS.
Function astro_star works by calling place with location->where = 0 and coord_sys
= 3.
(Return to Function List)

C-66

app_planet
short int app_planet (double jd_tt, object *ss_body, short int accuracy,
double *ra, double *dec, double *dis)
PURPOSE:
Compute the apparent place of a solar system body.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for apparent place.
*ss_body (struct object)
Pointer to structure containing the body designation for the
solar system body (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Apparent right ascension in hours, referred to true equator
and equinox of date.
*dec (double)
Apparent declination in degrees, referred to true equator
and equinox of date.
*dis (double)
True distance from Earth to the body at 'jd_tt' in AU.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'type' in structure 'ss_body'.
> 10 ... Error code from function 'place'.

Discussion:
This function computes the apparent place of a solar system body. Your chosen version of
function solarsystem, accessed from function ephemeris, determines the source of the body’s
barycentric rectangular coordinates used in the calculation.
Function app_planet works by calling place with location->where = 0 and coord_sys
= 1.
(Return to Function List)

C-67

topo_planet
short int topo_planet (double jd_tt, object *ss_body, double delta_t,
on_surface *position, short int accuracy,
double *ra, double *dec, double *dis)
PURPOSE:
Computes the topocentric place of a solar system body.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for topocentric place.
*ss_body (struct object)
Pointer to structure containing the body designation for the
solar system body (defined in novas.h).
delta_t (double)
Difference TT-UT1 at 'jd_tt', in seconds of time.
*position (struct on_surface)
Specifies the position of the observer (structure defined in
novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Topocentric right ascension in hours, referred to true equator
and equinox of date.
*dec (double)
Topocentric declination in degrees, referred to true equator
and equinox of date.
*dis (double)
True distance from Earth to the body at 'jd_tt' in AU.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'where' in structure 'location'.
> 10 ... Error code from function 'place'.

Discussion:
Function topo_planet computes the topocentric place of a solar system body (neglecting
atmospheric refraction) for the location specified by the argument location at the time
specified by the argument jd_tt. The argument jd_tt is the TT time at which the
topocentric place is to be computed. The difference TT–UT1 (often called ∆T) is passed to
C-68

the function via argument delta_t. Values of ∆T are published annually in The
Astronomical Almanac or can be obtained from the EO web site. 39 The user’s choice of
ephemerides determines the values to be used in structure ss_body, which identifies the
solar system object.
Atmospheric refraction can be subsequently applied to ra and dec by function equ2hor.
Function topo_planet works by calling place with location->where = 1 and
coord_sys = 1.
(Return to Function List)

39

http://www.usno.navy.mil/USNO/earth-orientation/eo-products/long-term
C-69

virtual_planet
short int virtual_planet (double jd_tt, object *ss_body,
short int accuracy,
double *ra, double *dec, double *dis)
PURPOSE:
Compute the virtual place of a solar system body.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992),
Chapter 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for virtual place.
*ss_body (struct object)
Pointer to structure containing the body designation for the
solar system body (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Virtual right ascension in hours, referred to the GCRS.
*dec (double)
Virtual declination in degrees, referred to the GCRS.
*dis (double)
True distance from Earth to the body in AU.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'type' in structure 'ss_body'.
> 10 ... Error code from function 'place'.

Discussion:
See the discussion for function app_planet. Function virtual_planet is identical to
app_planet in input arguments and use. Here, however, the output arguments provide the
virtual place (also called the proper place) of the body. The virtual place (proper place) is
essentially the apparent place expressed in the GCRS.
Function virtual_planet works by calling place with location->where = 0 and
coord_sys = 0.
(Return to Function List)

C-70

local_planet
short int local_planet (double jd_tt, object *ss_body,
double delta_t, on_surface *position,
short int accuracy,
double *ra, double *dec, double *dis)
PURPOSE:
Computes the local place of a solar system body.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992), Ch. 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for local place.
*ss_body (struct object)
Pointer to structure containing the body designation for the
solar system body (defined in novas.h).
delta_t (double)
Difference TT-UT1 at 'jd_tt', in seconds of time.
*position (struct on_surface)
Specifies the position of the observer (structure defined in
novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Local right ascension in hours, referred to the 'local GCRS'.
*dec (double)
Local declination in degrees, referred to the 'local GCRS'.
*dis (double)
True distance from Earth to the body in AU.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'where' in structure 'location'.
> 10 ... Error code from function 'place'.

Discussion:
See the discussion for function topo_planet. Function local_planet is identical to
topo_planet in input arguments and use. Here, however, the output arguments provide the
local place of the star. The local place is essentially the topocentric place expressed in the
“local GCRS.”

C-71

Function local_planet works by calling place with location->where = 1 and
coord_sys = 0.
(Return to Function List)

C-72

astro_planet
short int astro_planet (double jd_tt, object *ss_body,
short int accuracy,
double *ra, double *dec, double *dis)
PURPOSE:
Compute the astrometric place of a solar system body.
REFERENCES:
Kaplan, G. H. et. al. (1989). Astron. Journ. 97, 1197-1210.
Explanatory Supplement to the Astronomical Almanac (1992), Chap. 3.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date for astrometric place.
*ss_body (struct object)
Pointer to structure containing the body designation for the
solar system body (defined in novas.h).
accuracy (short int)
Code specifying the relative accuracy of the output position.
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra (double)
Astrometric right ascension in hours (referred to the ICRS,
without light deflection or aberration).
*dec (double)
Astrometric declination in degrees (referred to the ICRS,
without light deflection or aberration).
*dis (double)
True distance from Earth to the body in AU.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'type' in structure 'ss_body'.
> 10 ... Error code from function 'place'.

Discussion:
See the discussion for function app_planet. Function astro_planet is identical to app_planet
in input arguments and use. Here, however, the output arguments provide the astrometric
place of the planet in the ICRS.
Function astro_planet works by calling place with location->where = 0 and
coord_sys = 3.
(Return to Function List)

C-73

precession
short int precession (double jd_tdb1, double *pos1, double jd_tdb2,
double *pos2)
PURPOSE:
Precesses equatorial rectangular coordinates from one epoch to
another. One of the two epochs must be J2000.0. The coordinates
are referred to the mean dynamical equator and equinox of the two
respective epochs.
REFERENCES:
Explanatory Supplement To The Astronomical Almanac, pp. 103-104.
Capitaine, N. et al. (2003), Astronomy And Astrophysics 412,
pp. 567-586.
Hilton, J. L. et al. (2006), IAU WG report, Celest. Mech., 94,
pp. 351-367.
INPUT
ARGUMENTS:
jd_tdb1 (double)
TDB Julian date of first epoch.
pos1[3] (double)
Position vector, geocentric equatorial rectangular coordinates,
referred to mean dynamical equator and equinox of first epoch.
jd_tdb2 (double)
TDB Julian date of second epoch.
OUTPUT
ARGUMENTS:
pos2[3] (double)
Position vector, geocentric equatorial rectangular coordinates,
referred to mean dynamical equator and equinox of second epoch.
RETURNED
VALUE:
(short int)
= 0 ... everything OK.
= 1 ... Precession not to or from J2000.0; 'jd_tdb1' or 'jd_tdb2'
not 2451545.0.

Discussion:
This function precesses the input position vector, pos1, from the equator and equinox of
jd_tdb1 to the equator and equinox of jd_tdb2; the resulting vector is pos2.
One of the two input Julian dates must be standard epoch J2000.0—either jd_tdb1 or
jd_tdb2 must be 2451545.0 exactly. To precess a vector from one arbitrary date to
another, call precession twice, using J2000.0 as the “middle” date. That is, in the first call,
jd_tdb1 = first Julian date and jd_tdb2 = 2451545.0; in the second call,
jd_tdb1 = 2451545.0 and jd_tdb2 = second Julian date.
Formally, the current precession algorithm is a function of Barycentric Dynamical Time
(TDB), but using TT as the basis for the input Julian dates results in a maximum error of only
about 3 × 10-9 arcseconds, which is totally negligible. Standard epoch J2000.0, although
C-74

formally defined in the TT time scale, is the same in the TT and TDB time scales to the
precision given by double-precision Julian dates: at J2000.0,
TT − TDB ≈ 10-4 second ≈ 10-9 day.
(Return to Function List)

C-75

equ2ecl
short int equ2ecl (double jd_tt, short int coord_sys,
short int accuracy, double ra, double dec,
double *elon, double *elat)
PURPOSE:
To convert right ascension and declination to ecliptic longitude
and latitude.
REFERENCES:
None.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date of equator, equinox, and ecliptic used for
coordinates.
coord_sys (short int)
Coordinate system selection.
= 0 ... mean equator and equinox of date 'jd_tt'
= 1 ... true equator and equinox of date 'jd_tt'
= 2 ... ICRS
(ecliptic is always the mean plane)
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
ra (double)
Right ascension in hours, referred to specified equator and
equinox of date.
dec (double)
Declination in degrees, referred to specified equator and
equinox of date.
OUTPUT
ARGUMENTS:
*elon (double)
Ecliptic longitude in degrees, referred to specified ecliptic
and equinox of date.
*elat (double)
Ecliptic latitude in degrees, referred to specified ecliptic
and equinox of date.
RETURNED
VALUE:
(short int)
= 0 ... everything OK
= 1 ... invalid value of 'coord_sys'

Discussion:
Function equ2ecl converts the equatorial position of an object into the equivalent ecliptic
position: equatorial coordinates ra and dec are converted to ecliptic coordinates elon and
elat. This function can be used for any kind of barycentric or geocentric coordinates—the
conversion involves a simple rotation and should be regarded as just a formalism. As in
C-76

function precession, the input Julian date can be based on either the TDB or TT time scales
with negligible resulting error.
ra and dec can be expressed with respect to either the mean equator and equinox of date
jd_tt (if coord_sys = 0) or the true equator and equinox of date jd_tt (if
coord_sys = 1).

The representation of the ecliptic used for celestial coordinates is a smoothly moving mean
plane described as part of the precession development. However, the mean and true equators
intersect this ecliptic at different points. Therefore, the equinox, which serves as the origin of
ecliptic longitude as well as the origin of right ascension, is different in the two cases. elon
will be expressed with respect to the same equinox as ra.
If jd_tt = 0.0 and coord_sys = 0, the function assumes ra and dec are expressed
with respect to the ICRS and provides elon and elat with respect to the ecliptic and mean
equinox of J2000.0.
See functions equ2ecl_vec and ecl2equ_vec for the conversion of vectors between equatorial
and ecliptic systems.
(Return to Function List)

C-77

cio_ra
short int cio_ra (double jd_tt, short int accuracy,
double *ra_cio)
PURPOSE:
This function computes the true right ascension of the celestial
intermediate origin (CIO) at a given TT Julian date. This is
-(equation of the origins).
REFERENCES:
Kaplan, G. (2005), US Naval Observatory Circular 179.
INPUT
ARGUMENTS:
jd_tt (double)
TT Julian date.
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*ra_cio (double)
Right ascension of the CIO, with respect to the true equinox
of date, in hours (+ or -).
RETURNED
VALUE:
(short int)
= 0 ...
= 1 ...
> 10 ...
> 20 ...

everything OK.
invalid value of 'accuracy'.
10 + the error code from function 'cio_location'.
20 + the error code from function 'cio_basis'.

Discussion:
This function supplies the true right ascension of the Celestial Intermediate Origin (CIO).
ra_cio = – (equation of the origins)
ra_cio = Greenwich apparent sidereal time – Earth Rotation Angle
where all quantities are expressed in hours.
(Return to Function List)

C-78

era
double era (double jd_high, double jd_low)
PURPOSE:
This function returns the value of the Earth Rotation Angle
(theta) for a given UT1 Julian date. The expression used is
taken from the note to IAU Resolution B1.8 of 2000.
REFERENCES:
IAU Resolution B1.8, adopted at the 2000 IAU General Assembly,
Manchester, UK.
Kaplan, G. (2005), US Naval Observatory Circular 179.
INPUT
ARGUMENTS:
jd_high (double)
High-order part of UT1 Julian date.
jd_low (double)
Low-order part of UT1 Julian date.
OUTPUT
ARGUMENTS:
None.
RETURNED
VALUE:
(double)
The Earth Rotation Angle (theta) in degrees.

Discussion:
This function supplies the Earth Rotation Angle, θ, which is the geocentric angle, in the
instantaneous equatorial plane (true equator), between the directions toward the Terrestrial
Intermediate Origin (TIO) and the Celestial Intermediate Origin (CIO).
This function allows for the input UT1 time to be represented as a split Julian date. See the
discussion in the description of function sidereal_time.
(Return to Function List)

C-79

cel_pole
short int cel_pole (double tjd, short int type, double dpole1,
double dpole2)
PURPOSE:
This function allows for the specification of celestial pole
offsets for high-precision applications. Each set of offsets is
a correction to the modeled position of the pole for a specific
date, derived from observations and published by the IERS.
REFERENCES:
Kaplan, G. (2005), US Naval Observatory Circular 179.
Kaplan, G. (2003), USNO/AA Technical Note 2003-03.
INPUT
ARGUMENTS:
tjd (double)
TDB or TT Julian date for pole offsets.
type (short int)
Type of pole offset
= 1 for corrections to angular coordinates of modeled pole
referred to mean ecliptic of date, that is,
delta-delta-psi and delta-delta-epsilon.
= 2 for corrections to components of modeled pole unit
vector referred to GCRS axes, that is, dx and dy.
dpole1 (double)
Value of celestial pole offset in first coordinate,
(delta-delta-psi or dx) in milliarcseconds.
dpole2 (double)
Value of celestial pole offset in second coordinate,
(delta-delta-epsilon or dy) in milliarcseconds.
OUTPUT
ARGUMENTS:
None.
RETURNED
VALUE:
(short int)
= 0 ... Everything OK.
= 1 ... Invalid value of 'type'.

Discussion:
This function allows for the specification of celestial pole offsets for high-precision
applications. The offsets describe the observed position of the Celestial Intermediate Pole
(CIP) with respect to the position computed from the standard precession and nutation
models. The offsets are subsequently applied as corrections to the nutation in longitude and
nutation in obliquity within e_tilt. Thus, e_tilt output arguments tobl, ee, dpsi, and deps
will be affected. Because other NOVAS functions, such as sidereal_time, call e_tilt to obtain
data related to the Earth’s orientation in space, the celestial pole offsets specified here are
propagated through the data that the various NOVAS functions provide.

C-80

Daily values of the celestial pole offsets are published, for example, in IERS Bulletins A and
B. 40 The celestial pole offsets effectively correct for errors or incompleteness in the standard
precession or nutation models. If you use cel_pole, make sure it is called before any other
functions for a given date. Values of the pole offsets that you specify by a call to cel_pole
will be used by e_tilt until you explicitly change them.
Important: For compatibility with the precession and nutation models used in NOVAS 3.0,
and later, specify type = 2 and use only IERS dX and dY values with respect to “IAU
2000A” (sometimes labeled “IAU 2000”). These pole offset values will generally not exceed
0.5 milliarcsecond and therefore cel_pole would need to be called only when very high
accuracy is required.
(Return to Function List)

40

http://www.iers.org/IERS/EN/Publications/Bulletins/bulletins.html
C-81

e_tilt
void e_tilt (double jd_tdb, short int accuracy,
double *mobl, double *tobl, double *ee, double *dpsi,
double *deps)
PURPOSE:
Computes quantities related to the orientation of the Earth's
rotation axis at Julian date 'jd_tdb'.
REFERENCES:
None.
INPUT
ARGUMENTS:
jd_tdb (double)
TDB Julian Date.
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
*mobl (double)
Mean obliquity of the ecliptic in degrees at 'jd_tdb'.
*tobl (double)
True obliquity of the ecliptic in degrees at 'jd_tdb'.
*ee (double)
Equation of the equinoxes in seconds of time at 'jd_tdb'.
*dpsi (double)
Nutation in longitude in arcseconds at 'jd_tdb'.
*deps (double)
Nutation in obliquity in arcseconds at 'jd_tdb'.
RETURNED
VALUE:
None.

Discussion:
This function computes various quantities related to the orientation of the Earth’s rotation
axis (vector toward Celestial Intermediate Pole) with respect to the ecliptic plane at a specific
time. The computation involves a call to function nutation_angles to evaluate the nutation
series.
The output values of the last four arguments will correctly reflect the celestial pole offsets if
function cel_pole has previously been called.
(Return to Function List)

C-82

ephemeris
short int ephemeris (double jd[2], object *cel_obj, short int origin,
short int accuracy,
double *pos, double *vel)
PURPOSE:
Retrieves the position and velocity of a solar system body from
a fundamental ephemeris.
REFERENCES:
None.
INPUT
ARGUMENTS:
jd[2] (double)
TDB Julian date split into two parts, where the sum
jd[0] + jd[1] is the TDB Julian date.
*cel_obj (struct object)
Pointer to structure containing the designation of the body
of interest (defined in novas.h).
origin (short int)
Origin code
= 0 ... solar system barycenter
= 1 ... center of mass of the Sun
accuracy (short int)
Selection for accuracy
= 0 ... full accuracy
= 1 ... reduced accuracy
OUTPUT
ARGUMENTS:
pos[3] (double)
Position vector of the body at 'jd_tdb'; equatorial rectangular
coordinates in AU referred to the ICRS.
vel[3] (double)
Velocity vector of the body at 'jd_tdb'; equatorial rectangular
coordinates in AU/day referred to the ICRS.
RETURNED
VALUE:
(short int)
0
...
1
...
2
...
3
...
10+n ...
20+n ...

Everything OK.
Invalid value of 'origin'.
Invalid value of 'type' in 'cel_obj'.
Unable to allocate memory.
where n is the error code from 'solarsystem'.
where n is the error code from 'readeph'.

Discussion:
Function ephemeris serves as the single interface between NOVAS and ephemerides of solar
system bodies. The version of ephemeris distributed with NOVAS provides direct support
for the JPL ephemerides of major solar system bodies (such as JPL’s DE405, DE406, and

C-83

DE421), and the USNO minor planet ephemerides (USNO/AE98 41). The function ephemeris
calls an appropriate version of function solarsystem (or solarsystem_hp) in order to access an
ephemeris of the “major” bodies (in this context Sun, Moon, and Mercury through Pluto). It
accesses the minor planet ephemerides by calling readeph. Neither the USNO minor planet
ephemerides nor the JPL ephemerides are part of NOVAS and must be obtained elsewhere as
discussed in sections 2.4 and 2.3, respectively.
Modifying function ephemeris to support ephemerides other than the two mentioned above is
relatively easy. In function ephemeris, a switch structure is controlled by the value of type
in a data structure of type object. Currently, two cases within the switch are defined:
type = 0 for major bodies to be handled via a call to solarsystem and type = 1 for minor
planets to be handled via a call to readeph. To support ephemerides of other bodies, simply
define a new value of type and add another case block containing code that accesses the
new ephemeris. Alternate versions of solarsystem can be written to support alternate
ephemerides, i.e., non-JPL, of major solar system bodies.
Additional information concerning function solarsystem is provided in the following
sections.
(Return to Function List)

41

http://www.usno.navy.mil/USNO/astronomical-applications/software-products/usnoae98
C-84

solarsystem
short int solarsystem (double tjd, short int body, short int origin,
double *position, double *velocity)

PURPOSE:
Provides the position and velocity vectors of a planet or other
solar system body at a specific time. The origin of coordinates
may be either the barycenter of the solar system or the center
of mass of the Sun.
REFERENCES:
JPL. 2007, "JPL Planetary and Lunar Ephemerides: Export Information,"
(Pasadena, CA: JPL) http://ssd.jpl.nasa.gov/?planet_eph_export.
Kaplan, G. H. "NOVAS: Naval Observatory Vector Astrometry
Subroutines"; USNO internal document dated 20 Oct 1988;
revised 15 Mar 1990.
INPUT
ARGUMENTS:
tjd (double)
Julian date of the desired time, on the TDB time scale.
body (short int)
Body identification number for the solar system object of
interest; Mercury = 1,...,Pluto = 9, Sun = 10, Moon = 11.
origin (short int)
Origin code
= 0 ... solar system barycenter
= 1 ... center of mass of the Sun
OUTPUT
ARGUMENTS:
position[3] (double)
Position vector of 'body' at tjd; equatorial rectangular
coordinates in AU referred to the ICRS.
velocity[3] (double)
Velocity vector of 'body' at tjd; equatorial rectangular
system referred to the ICRS, in AU/day.
RETURNED
VALUE:
(short int)
0...Everything OK.
Other values depend upon version in use.

Discussion:
Another NOVAS function, ephemeris, calls this function, solarsystem to provide the position
vector pos and velocity vector vel for body at time tjd. The vectors computed by
solarsystem are expressed with respect to ICRS axes, in the BCRS metric. The vectors are
barycentric if origin = 0 and heliocentric if origin = 1.
Three different versions of solarsystem are supplied in NOVAS, each with its own internal
logic. One uses internally-stored data or series expansions while the other two use the JPL
ephemerides, which exist as external data files. Additional documentation (see below) is
C-85

usually required for the proper use of each version. You are, of course, free to supply your
own version(s) of solarsystem, providing that the arguments conform to the above
specifications.
The values of the body identification number, body, will in general differ from one
solarsystem version to another; consult the documentation for the specific version in use.
Usually, body = 1 refers to Mercury, body = 2 refers to Venus, body = 3 refers to the
Earth, etc., but the identification numbers for bodies such as the Sun or Moon differ across
implementations. [Note: The data structure of type object, input to function ephemeris,
specifies the way that NOVAS identifies solar-system bodies. Code within ephemeris does
the “translation” between the body numbers required by ephemeris and the body numbers
required by solarsystem.] Furthermore, some versions of solarsystem support only a subset
of the major solar system bodies. The minimum requirement is support for the Sun and
Earth. Here, “Earth” refers to the geocenter and not the Earth/Moon barycenter.
For highest-precision applications using “split” Julian dates, call solarsystem_hp.
(Return to Function List)

C-86

solarsystem, version 1
(File solsys1.c)
RETURNED
VALUE:
None.

Discussion:
This version of solarsystem provides an “all C” interface between NOVAS and the JPL lunar
and planetary ephemerides. Specifically, it serves as the interface between USNO’s C version
of the JPL ephemeris software (contained in file eph_manager.c) and the main set of
NOVAS functions. This version of solarsystem calls planet_ephemeris (the C version of
JPL’s Fortran subroutine PLEPH), which in turn calls other functions in the ephemeris
software package. The user must set up the binary, random-access ephemeris file (see
Appendix C).
Important: When using this version of solarsystem, the user’s program that calls the
NOVAS functions must make a call to function ephem_open prior to calling the NOVAS
functions. ephem_open opens the binary JPL ephemeris file (DE200, DE403, DE404,
DE405, DE406, and DE421 are supported). Similarly, the user’s program should call
ephem_close to close the binary ephemeris file once ephemeris access is no longer
required. The functions ephem_open and ephem_close are located in eph_manager.c.
The body identification numbers to be used with this version are listed below.
body
10
1
2
3
4
5
6
7
8
9
11

Name
Sun
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Moon

(Return to Function List)

C-87

solarsystem, version 2
(File solsys2.c)
RETURNED
VALUE:
(short int)
0...Everything OK.
1...Invalid value of body or origin.
2...Error detected by JPL software.

Discussion:
This version of solarsystem serves as the interface between the JPL’s own Fortran-based
lunar and planetary ephemeris software and NOVAS. The function contains a single call to
Fortran subroutine jplint_, which in turn calls PLEPH and other Fortran subroutines in the
JPL ephemeris software package. The user is responsible for obtaining the Fortran
ephemeris code and data, setting up the binary, random-access ephemeris file, and linking the
JPL Fortran code with NOVAS. See the implementation notes below.
The body identification numbers to be used with this version are listed below.
body
10
1
2
3
4
5
6
7
8
9
11

Name
Sun
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Moon

Implementation Notes:
In order to use NOVAS with solarsystem version 2, you must first obtain the planetary
ephemeris export package from JPL as discussed in Appendix C. If the verification process
is successful, the ephemeris file is ready to use. The ephemeris data is obtained from the
binary file by calling the access subroutines provided in the JPL export package.
Version 2 of solarsystem obtains ephemeris data from the binary file by calling Fortran
subroutine jplint_, which is contained in NOVAS file jplint.f. Subroutine jplint_, in turn,
calls JPL Fortran subroutine PLEPH and all other supporting Fortran subroutines. The C
function solarsystem has a few features that make it possible for it to exchange data with the
Fortran subroutine jplint_. First, all of the C arguments of the call to jplint_ are addresses,
because Fortran uses call by address instead of call by value for arguments of subroutines.
Second, all of the integer arguments in the call are designated as type long int in the C
C-88

function to match the Fortran INTEGER default. The DOUBLE PRECISION arguments in the
subroutine are designated as type double in the C function.
Probably the biggest hurdle in implementing version 2 of solarsystem involves the proper
compiling and linking of files containing different languages. The procedures will be
specific to your computing platform; therefore, you will have to consult your compiler
manual for detailed instructions. The following instructions are offered only as a guideline;
they provide a specific example of how such files were successfully handled on a PC running
Red Hat Enterprise Linux ES release 4 (Nahant Update 8).
1. Create a single file named jplsubs.f with all of the JPL Fortran ephemeris access
subroutines as discussed in Appendix C.
2. Compile the Fortran files, jplsubs.f and jplint.f, without invoking the linkage
editor to create the object file jplsubs.o and jplint.o. The Fortran compiler/linker
is g77.
g77 -c jplsubs.f jplint.f

3. Compile, again without invoking the linkage editor, the C files main.c, novas.c,
novascon.c, nutation.c, solsys2.c, and readeph0.c that create the object files
main.o, novas.o, novascon.o, nutation.o, solsys2.o, and readeph0.o. In this
example, main.c is the name of the file containing the user’s program. The C
compiler/linker is gcc.
gcc -c main.c novas.c novascon.c nutation.c solsys2.c readeph0.c

4. Finally, link the object files using the Fortran linker:

object files

g77 -o app main.o novas.o novascon.o nutation.o solsys2.o readeph0.o jplsubs.o jplint.o

create executable named "app"

In this example, the resulting executable file is named app.

(Return to Function List)

C-89

solarsystem, version 3
(File solsys3.c)
RETURNED
VALUE:
(short int)
0...Everything OK.
1...Input Julian date ('tjd') out of range.
2...Invalid value of 'body'.

Discussion:
This version of solarsystem provides the position and velocity of the Earth or Sun only
without reference to any external data file. The heliocentric position and velocity of the Earth
are computed by evaluating trigonometric series. When barycentric positions and velocities
are required, a number of additional approximations are involved; therefore, barycentric
positions and velocities computed by this version of solarsystem are less accurate than
heliocentric positions and velocities. This version of solarsystem produces data within the
following error limits (compared to the JPL DE405 ephemeris) for dates within the interval
1800–2050:
Earth heliocentric positions:
Earth heliocentric velocities:
Earth barycentric positions:
Earth barycentric velocities:

840
1.4
2500
1.4

km
m/s
km
m/s

When this version of solarsystem is used in the computation of the apparent place of the Sun,
it should contribute less than 2 arcseconds of error. When used in the computation of
apparent places of stars, it should contribute less than 1.5 milliarcseconds of error. This
assessment applies to the interval 1800–2050.
This version of solarsystem will return ierr = 1 for Julian dates prior to 2340000.5
(August 1694) or Julian dates after 2560000.5 (December 2296).
This version of solarsystem calls NOVAS function precession, and certain expressions in the
solarsystem algorithm have been adjusted to conform to the IAU 2006 precession.
The body identification numbers to be used with this version are listed below.
body

Name
Sun
Sun
Sun
Earth
Earth

0
1
10
2
3

(Return to Function List)
C-90

solarsystem_hp
short int solarsystem_hp (double tjd[2], short int body,
short int origin,
double *position, double *velocity)
PURPOSE:
Provides an interface between the JPL direct-access solar system
ephemerides and NOVAS-C for highest precision applications.
REFERENCES:
JPL. 2007, "JPL Planetary and Lunar Ephemerides: Export
Information," (Pasadena, CA: JPL)
http://ssd.jpl.nasa.gov/?planet_eph_export.
Kaplan, G. H. "NOVAS: Naval Observatory Vector Astrometry
Subroutines"; USNO internal document dated 20 Oct 1988;
revised 15 Mar 1990.
INPUT
ARGUMENTS:
tjd[2] (double)
Two-element array containing the Julian date, which may be
split any way (although the first element is usually the
"integer" part, and the second element is the "fractional"
part). Julian date is on the TDB or "T_eph" time scale.
body (short int)
Body identification number for the solar system object of
interest; Mercury = 1, ..., Pluto= 9, Sun= 10, Moon = 11.
origin (short int)
Origin code
= 0 ... solar system barycenter
= 1 ... center of mass of the Sun
OUTPUT
ARGUMENTS:
position[3] (double)
Position vector of 'body' at tjd; equatorial rectangular
coordinates in AU referred to the ICRS.
velocity[3] (double)
Velocity vector of 'body' at tjd; equatorial rectangular
system referred to the ICRS, in AU/day.
RETURNED
VALUE:
Value depends upon version in use.

Discussion:
Function solarsystem_hp provides positions and velocities for the major bodies of the solar
system when the highest precision is required. This function supports the “split” Julian date
feature for highest precision. The two parts of the input Julian date are stored in the twoelement array, tjd.
(Return to Function List)

C-91

solarsystem_hp, version 1
(File solsys1.c)
RETURNED
VALUE:
None.

Discussion:
This version of solarsystem_hp provides an “all C” interface between NOVAS and the JPL
lunar and planetary ephemerides when the highest precision is required. Specifically, it
serves as the interface between USNO’s C version of the JPL ephemeris software (contained
in file eph_manager.c) and the main set of NOVAS functions. This version of
solarsystem_hp calls planet_ephemeris (the C version of JPL’s Fortran subroutine PLEPH),
which in turn calls other functions in the ephemeris software package. The user must set up
the binary, random-access ephemeris file (see Appendix C).
Important: When using this version of solarsystem_hp, the user’s program that calls the
NOVAS functions must make a call to function ephem_open prior to calling the NOVAS
functions. ephem_open opens the binary JPL ephemeris file (DE200, DE403, DE404,
DE405, DE406, and DE421 are supported). Similarly, the user’s program should call
ephem_close to close the binary ephemeris file once ephemeris access is no longer
required. The functions ephem_open and ephem_close are located in eph_manager.c.
The body identification numbers to be used with this version are listed below.
Body
10
1
2
3
4
5
6
7
8
9
11

Name
Sun
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Moon

(Return to Function List)

C-92

solarsystem_hp, version 2
(File solsys2.c)
RETURNED
VALUE:
(short int)
0...Everything OK.
1...Invalid value of body or origin.
2...Error detected by JPL software.

Discussion:
This version of solarsystem_hp serves as the interface between the JPL’s own Fortran-based
lunar and planetary ephemeris software and NOVAS when the highest precision is required.
The function contains a single call to Fortran subroutine jplihp_, which in turn calls
DPLEPH and other Fortran subroutines in the JPL ephemeris software package. The user is
responsible for obtaining the Fortran ephemeris code and data, setting up the binary, randomaccess ephemeris file, and linking the JPL Fortran code with NOVAS. See the
implementation notes below.
The body identification numbers to be used with this version are listed below.
Body
10
1
2
3
4
5
6
7
8
9
11

Name
Sun
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Moon

Implementation Notes:
In order to use NOVAS with solarsystem_hp version 2, you must first obtain the planetary
ephemeris export package from JPL (see Appendix C for details). If the verification process
is successful, the ephemeris file is ready to use. The ephemeris data is obtained from the
binary file by calling the access subroutines provided in the JPL export package.
Version 2 of solarsystem_hp obtains ephemeris data from the binary file by calling Fortran
subroutine jplihp_, which is in the NOVAS jplint.f file. Subroutine jplihp_, in turn, calls JPL
subroutine DPLEPH (Fortran code) and all other supporting Fortran subroutines. The C
function solarsystem_hp has a few features that make it possible for it to exchange data with
the Fortran subroutine jplihp_. First, all of the C arguments of the call to jplihp_ are
C-93

addresses, because Fortran uses call by address instead of call by value for arguments of
subroutines. Second, all of the integer arguments in the call are designated as type long
int in the C function to match the Fortran INTEGER default. The DOUBLE PRECISION
arguments in the subroutine are designated as type double in the C function.
Probably the biggest hurdle in implementing version 2 of solarsystem_hp involves the proper
compiling and linking of files containing different languages. The procedures will be
specific to your computing platform; therefore, you will have to consult your compiler
manual for detailed instructions. The instructions given for version 2 of solarsystem provide
an example of how such files could be handled.
(Return to Function List)

C-94

solarsystem_hp, version 3
(File solsys3.c)
RETURNED
VALUE:
(short int)
0...Everything OK.
1...Input Julian date ('tjd') out of range.
2...Invalid value of 'body'.
3...This version of 'solarsystem' not valid for use with
NOVAS-C.

Discussion:
NOVAS does not provide a high-precision counterpart of solarsystem version 3 that works
without requiring an external data file. Thus, this version of solarsystem_hp is essentially a
dummy function that acts according to the value of variable action, which is set within the
function itself.
If action = 1 (the default), this function returns an error code of 3 indicating
appropriately that the function does not provide high-precision position and velocity of the
Earth and Sun.
If action = 2 (must be manually set), this function simply calls function solarsystem
(version 3) and returns the low-precision position and velocity. An error code of 0 (no error)
is also returned. This action may be useful for code testing purposes, but is neither
appropriate nor recommended for normal use of NOVAS. Use alternate versions of
solarsystem_hp (located in the various solsysn.c files, where n is an integer) when the highest
precision is needed.
(Return to Function List)

C-95

Nutation Models
(File nutation.c)
The C version of NOVAS provides three implementations of the nutation model, all of which
are found in file nutation.c. Each model computes the nutation angles, ∆ψ and ∆ε, which are
the nutation in longitude and obliquity, respectively. These functions have the following
input and output:
INPUT
ARGUMENTS:
jd_high (double)
High-order part of TT Julian date.
jd_low (double)
Low-order part of TT Julian date.
OUTPUT
ARGUMENTS:
*dpsi (double)
Nutation (luni-solar + planetary) in longitude, in radians.
*deps (double)
Nutation (luni-solar + planetary) in obliquity, in radians.
RETURNED
VALUE:
None.

Discussion:
The nutation model is invoked via function nutation_angles in file novas.c. As previously
mentioned, the nutation model can be the most computationally intensive part of NOVAS. It
makes no sense to evaluate the full IAU 2000A nutation model (1,365 terms) [iau2000a]
unless the highest level of accuracy is needed. Thus, in addition to the full IAU 2000A
model, two reduced-accuracy models—truncated versions of IAU 2000A—are also provided:
IAU 2000B [iau2000b] and 2000K [nu2000k]. Section 1.4 discussed these models in greater
detail. Several higher-level NOVAS functions have an input argument, accuracy, which
specifies whether a full- or reduced-accuracy calculation is desired. Whenever accuracy is
set to 0 (full accuracy), IAU 2000A is used. By default, whenever accuracy is set to 1
(reduced accuracy), 2000K is used. However, a small coding change can be made to
nutation_angles to replace 2000K with IAU 2000B as the reduced-accuracy model. The
prolog and comments in nutation_angles explain how to make this change. A summary of
the models follows.
Nutation
Model

Function
Name

Accuracy
Selection

IAU 2000A
2000K
IAU 2000B

iau2000a
nu2000k
iau2000b

full
reduced (default)
reduced (alternate)

Terms

Accuracy Compared to
IAU 2000A (mas)

1,365
488
77

(Return to Function List)

C-96

…
0.1
1

Time Span
…
1700–2300
1995–2050

Chapter 5

Equinox- and CIO-Based Par adigms Compar ed

5.1 Computing Hour Angles
The equinox- and CIO-based celestial reference systems are part of two computational
schemes for accounting for the Earth’s instantaneous orientation with respect to the stars.
These two methods represent the same phenomena, as they obviously must, but in slightly
different order. The overall matrix that embodies, for a given instant, the terrestrial-tocelestial (ITRS-ICRS) transformation is the same for both schemes. Therefore, the value of
observable quantities will not be affected by the choice of which paradigm is used for the
computations.
In NOVAS, quantities such as declination and hour angle, which are in principle measurable
angles, should have the same values regardless of the way in which they are computed.
Because both the equinox-based and CIO-based paradigms are constructed on the
instantaneous (true) equator of date—the plane orthogonal to the CIP—declinations are, in
fact, completely unaffected.
How are hour angles of celestial objects computed in the old and new paradigms? Assume
that we are considering Greenwich hour angles, that is, hour angles measured from the
meridian of geodetic longitude zero (the X-Z plane of the ITRS) without polar motion. In the
equinox-based scheme, we compute the topocentric place of the object of interest with
respect to the true equator and equinox of date. Then, we compute Greenwich apparent
sidereal time and subtract the object’s apparent right ascension to form the hour angle. In the
CIO-based scheme, we compute the object’s topocentric place with respect to the true
equator and CIO of date. To form the hour angle, we compute the ERA and subtract the
CIO-based right ascension (also called the intermediate right ascension). The two results
should be identical. The computed GHA may have to be reduced to the range −12h to +12h.
The table below summarizes the two equivalent procedures for hour angle and the NOVAS
functions that would be used for each, assuming that polar motion is neglected. The
procedures outlined here provide the Greenwich hour angle (GHA) of a star; only the first step
would be different for a solar system body.
Functions app_star, topo_star, and place require time arguments in the TT time scale
(topo_star also requires ∆T), while sidereal_time and era require time arguments in the UT1
time scale. The two procedures should yield the same value of GHA to within a microarcsecond around the present time and identical values for DEC. To obtain the local hour
angle in either method, simply add to the GHA the observer’s longitude (east positive) in
appropriate units.

C-97

Use
function

…to obtain

Then, use
function
…to obtain
Compute
Greenwich
hour angle

Equinox-Based Method
topo_star
— or —
place with
cel_object (type) = ′2′,
location = 1, and

CIO-Based Method

place with

coord_sys = 1
RA and DEC

cel_object (type) = ′2′, ,
location = 1, and
coord_sys = 2
RA and DEC

topocentric RA and dec of the star
with respect to the true equator and
equinox of date
(in hours and degrees, respectively)
sidereal_time with

topocentric RA and dec of the star
with respect to the true equator and
CIO of date
(in hours and degrees, respectively)
era

gst_type = 1
GST

THETA

Greenwich apparent sidereal time
(in hours)

Earth Rotation Angle, θ
(in degrees)

GHA = GST – RA

GHA = THETA / 15.0 – RA

(in hours)

(in hours)

The common notion of hour angle becomes somewhat problematic when polar motion is
taken into account, because what we usually regard as the Greenwich (or observer’s)
meridian—a plane of constant geodetic longitude—is not, in general, parallel to an hour
circle on the celestial sphere when the geodetic pole and the CIP are not coincident. See the
discussion in section 6.5.4 of USNO Circular 179. 42
5.2 Other Computational Considerations
Three high-level NOVAS functions that involve Earth rotation, sidereal_time, ter2cel, and
cel2ter, can perform their internal calculations using either the equinox-based paradigm or
the CIO-based paradigm. As previously mentioned, sidereal_time computes sidereal time.
ter2cel performs the terrestrial-to-celestial transformation, and cel2ter performs the celestialto-terrestrial transformation. (equ2hor is indirectly involved because it calls ter2cel.) The
method used within the three functions is selected when that function is called. The integer
input argument, method, must be set to either zero (0) to use the CIO-based method or to
one (1) to use the equinox-based method. Because no external difference occurs in how
sidereal_time, ter2cel, or cel2ter are used, and because the two computational paradigms
yield answers that are consistent within a few microarcseconds over many centuries, a
practical basis for choosing seldom arises. However, the equinox method is much more
efficient if mean sidereal time is to be computed.

42

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-98

Finally, another of the new Earth-rotation-related functions is worth mentioning. For a given
TT Julian date, cio_ra provides the right ascension of the CIO with respect to the true
equinox of date. With a sign reversal, this quantity is the equation of the origins, the direction
of the true equinox measured in the equator eastward (+) from the CIO. Because the equinox
and CIO are simply different right ascension origins on the instantaneous equator, cio_ra
provides the angular difference between the origins of these two systems. The equation of
the origins is also the difference, expressed as an angle, between the ERA and Greenwich
apparent sidereal time.
5.3 How NOVAS Implements the CIO-Based Paradigm
The equinox-based paradigm is, of course, the historical basis for NOVAS. One of its key
pieces is the precession algorithm [precession], which uses the equinox as its azimuthal
coordinate; that is, it transforms celestial coordinates from the mean equator and equinox of
one date to the mean equator and equinox of another date. Even though the recommended
precession formulation has been replaced twice over the last half-century, this aspect of it has
remained unchanged. Another key piece is the algorithm for sidereal time [sidereal_time],
which is based on a sidereal day that is defined by successive transits of the equinox. The
sidereal time formula must always be matched to the precession algorithm, because mean
sidereal time must account for the precession of the equinox in right ascension; this has been
consistently done in NOVAS.
To use the CIO-based paradigm, we must know where the CIO is in some well-defined
coordinate system. Unlike the equinox, the CIO is not defined by static geometry but by its
motion, so its position at any time is given by the result of an integral that has been evaluated
either analytically or numerically. In NOVAS, both results are available: the position of the
CIO can be taken from an external file that is the output of a numerical integration, or it can
be obtained from an analytical expression for the equation of the origins [cio_location]. See
sections 6.5.1.1 and 6.5.1.2 of USNO Circular 179. 43
The NOVAS implementation of the CIO-based Earth-rotation paradigm for a given date is
based on the construction of the Celestial Intermediate Reference System for that date, using
vectors toward the CIP and the CIO. These two directions define, respectively, the z-axis
and x-axis of the celestial intermediate system. The direction toward the CIP in the GCRS
can be computed by passing the vector (0,0,1) through functions nutation, precession, and
frame_tie in succession. Given the direction of the CIP, the other piece of required
information is the location of the CIO for the same date, which is provided by cio_location
described below. The basis vectors of the intermediate system, with respect to the GCRS, are
computed by cio_basis (see section 6.5.1 of USNO Circular 179 for the algorithms). Having
these basis vectors available allows NOVAS to easily transform any vector in the GCRS to
the intermediate system. The only other quantity used in the CIO-based paradigm is the
ERA, which is trivial to compute and is provided by era.
Function cio_location obtains the location of the CIO for a given date in one of two ways and
sets an output argument, ref_sys, that indicates which way was used. If an external file of

43

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-99

CIO right ascension values is available (nominally called cio_ra.bin and located in the
current directory) then cio_location will provide the GCRS right ascension of the CIO, and
will set ref_sys to one (1). If this file is not available, then cio_location will provide the
true right ascension of the CIO (the arc on the instantaneous equator from the equinox to the
CIO), obtained from a series expansion, and will set ref_sys to two (2). cio_basis can
work with either coordinate of the CIO. The two methods are equivalent within several
microarcseconds over six centuries centered on the year 2000; it is not clear which method is
more correct.
To do the hard work, cio_location calls either cio_array (for ref_sys = 1) or ira_equinox
(for ref_sys = 2). cio_location always initially checks to see if the external file of CIO
right ascensions is present. If it is, cio_array reads the file, which is the output from a
numerical integration covering years 1700 to 2300, and returns an array to be interpolated;
the interpolation directly provides the right ascension of the CIO in the GCRS. A copy of
CIO_RA.TXT is provided as part of the NOVAS distribution, along with a utility program
called cio_file.c to convert the text file to a binary direct-access file; section 2.5 describes
creating cio_ra.bin (2.9 Mbytes) from CIO_RA.TXT (7.5 Mbytes).
If cio_ra.bin is not present, then cio_location calls ira_equinox to evaluate the equation of
the origins from a closed-form expression that includes the evaluation of nutation in
longitude, a lengthy series of trigonometric terms. The result locates the CIO with respect to
the equinox on the instantaneous equator.
At no point does NOVAS use the CIO locator, s, which is described in IERS documents and
The Astronomical Almanac.
5.4 References
Kaplan, G. H. 2005, The IAU Resolutions on Astronomical Reference Systems, Time Scales,
and Earth Rotation Models, USNO Circular 179 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
(USNO Circular 179)
USNO & HMNAO. 2009, The Astronomical Almanac for the Year 2011, (Washington, DC:
GPO) and subsequent editions

(Return to Table of Contents)
C-100

Appendix A Over view of How NOVAS Has Changed
A detailed list of the changes in the NOVAS C code from the previous versions (C2.0.1 of
2000 and C3.0 of 2009) is given in Appendix B. This appendix provides some perspective
on these changes for people who are already familiar with NOVAS. Most of the
modifications have been made in response to resolutions passed by the IAU in 2000 and
2006 that recommended new models for fundamental astronomy within a new conceptual
framework. To the greatest extent possible, the calling sequences for the highest-level (and
most used) functions from the previous versions of NOVAS have been preserved, but a few
important exceptions exist. Many new calls are now available as well.
A.1

Important Changes in Calls

Probably the most important change to existing NOVAS calls is the change of proper motion
and parallax units in the calls to app_star, virtual_star, astro_star, transform_cat, and
transform_hip, all of which deal with star positions. The units have been changed as follows:
• proper motion in right ascension: from seconds per century to milliarcseconds per year
• proper motion in declination:
from arcseconds per century to milliarcseconds per year
• parallax:
from arcseconds to milliarcseconds
These changes have been made to conform to the units used in most modern star catalogs
(e.g., Hipparcos, Tycho-2, or the FK6), which in turn follow from the observational
techniques now used in the construction of such catalogs. Obviously, star data previously
used with NOVAS must either be replaced or transformed. The transformation equations
from “old” to “new” units are as follows:
pmrnew = pmrold * 150.0 * cos ( dec0 * DEG2RAD ); /* proper motion in RA */
pmdnew = pmdold * 10.0;
/* proper motion in declination */
paxnew = paxold * 1000.0;
/* parallax */

where dec0 is the catalog declination (J2000.0 or ICRS) of the star in degrees and DEG2RAD
is the degrees-to-radians conversion factor (0.01745329…).
Another important change to the high-level functions is that the argument lists of the
traditional “place” functions (app_star, topo_star, app_planet, topo_planet. virtual_star,
etc.) have changed. The earth data structure (type body) has been removed. This structure
is now created within the new place function described in the following section. A new input
parameter, accuracy, has been added to select either full-accuracy or reduced-accuracy
calculations.
Finally, function pnsw has been renamed to ter2cel with a change to its time argument; this
function carries out the terrestrial-to-celestial transformation.
All other changes to existing NOVAS calls involve lower-level functions not frequently
invoked by most users; Appendix B details these changes.

C-101

A.2

place: A New General-Purpose “Place” Function

All computational code to compute apparent, topocentric, virtual, astrometric, etc., places of
stars or planets has now been consolidated into a single new function called place. The
familiar calls to the traditional place functions from earlier versions of NOVAS still work
essentially as before—except for the important changes described in A.1 above—but are now
just “front-ends” to place [app_star, topo_star, app_planet, topo_planet. virtual_star,
local_star, virtual_planet, local_planet, astro_star, astro_planet]. This change eliminated
much duplicate code, provides more flexibility, and allows for possible future additions (such
as binary star orbits or nonlinear terms in proper motion). place can produce star or planet
positions within the Celestial Intermediate Reference System that is part of the new paradigm
for Earth rotation calculations (see below). place provides its output position both in
spherical coordinates (right ascension, declination, and, for solar system bodies, geometric
distance) and as a unit vector. In addition, place furnishes radial velocity. It also allows the
observer to be located at the geocenter, on or near the Earth’s surface, or in a near-Earth
spacecraft. You may want to consider changing your calls to app_star, app_planet, etc., to
the equivalent calls to place; the code for the new versions of the traditional place functions
specifies the appropriate input parameters.
A.3

New Reference Systems

The IAU resolutions of 2000 defined several new reference systems for fundamental
astronomy. The Barycentric Celestial Reference System (BRCS), Geocentric Celestial
Reference System (GCRS), International Celestial Reference System (ICRS), and Celestial
Intermediate Reference System are defined briefly below. More detailed descriptions of these
systems are in section 1.1 of this document and in Chapters 1, 3, and 6 of USNO Circular
179. 44
Barycentric Celestial Reference System (BCRS) replaces the barycentric system based on
the mean equator and equinox of J2000.0. It is used for data tabulated in astrometric catalogs
and fundamental solar system ephemerides.
Geocentric Celestial Reference System (GCRS) replaces the geocentric system based on
the mean equator and equinox of J2000.0. It is used for geocentric apparent positions of
celestial objects, measurements and coordinates in the near-Earth environment, and artificial
Earth satellite ephemerides.
The BCRS and GCRS are nearly parallel systems, related by a relativistic transformation.
International Celestial Reference System (ICRS) is the name applied to the orientation of
the axes of the BCRS, based on the adopted coordinates of several hundred extragalactic
radio sources that are assumed to have no net systematic motion. The resulting orientation is
close to, but not exactly aligned with, the mean equator and equinox of J2000.0. The ICRS is
a “space-fixed” (kinematically non-rotating) system.

44

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-102

Because of their close relationship, the abbreviations “BCRS” and “ICRS” are often used
interchangeably.
Celestial Intermediate Reference System is a system for geocentric apparent positions of
stars and planets based on the true (instantaneous) equator of date and a zero point of right
ascension at the CIO (see section A.5).
The geocentric system based on the true equator and equinox of date is also still used for
geocentric apparent positions of stars and planets.
These reference systems are now used for the input and output arguments to NOVAS
functions. For example, NOVAS 3.0, and later, assume that input reference data, such as
catalog star positions and proper motions, and the basic solar system ephemerides, are
provided in the ICRS (that is, within the BCRS as aligned to the ICRS axes), or at least are
consistent with it to within the data’s inherent accuracy. The distinction between the ICRS
and the system defined by the mean equator and equinox of J2000.0 (the “J2000.0 system”)
becomes important only when an accuracy of 0.02 arcseconds or better is needed.
Nevertheless, because NOVAS is designed for the highest accuracy applications, the ICRS is
given as the reference system of choice for many input arguments to NOVAS functions.
Because the ICRS axes are not precisely aligned to those of the J2000.0 system, a new
function called frame_tie is available to transform vectors between the two systems. This
transformation is a very small fixed rotation. frame_tie is used for both barycentric vectors
(BCRS to or from the barycentric J2000.0 system) and geocentric vectors (GCRS to or from
the geocentric J2000.0 system). frame_tie is called many times, in both directions, within the
NOVAS code. It is needed because precession (and nutation) can properly be applied only to
vectors in a real equatorial system; vectors in the GCRS (geocentric ICRS) must be
transformed, via frame_tie, to the J2000.0 system before precession is used. If your code
only interacts with the highest-level NOVAS functions, all this is transparent to you.
However, if you use precession within your own code, you should precede it by a call to
frame_tie (with the middle argument direction > 0) if your input vector is expressed in the
GCRS, that is, if it is derived from an input source based on the ICRS.
Output data from many of the supervisory-level NOVAS functions can be expressed in the
GCRS or either of two equator-of-date systems: the true equator and equinox of date or the
Celestial Intermediate Reference System. The latter two systems differ only in their right
ascension origins, and, in the new paradigm, they are understood to be derived from the
GCRS by applying a few rotations.
A.4

New Models for Precession and Nutation

As described in section 1.4, new models for both precession and nutation have been adopted
by the IAU and have been incorporated into NOVAS. Although the underlying
developments for these effects are different than in NOVAS 2.0, from a programming point
of view, little has changed. The functions that directly involve precession and nutation
[precession, nutation, nutation_angles, sidereal_time] essentially work the same as before,
but with slightly different results. The new nutation model has more than ten times the
number of trigonometric terms than the previous model. Because evaluation of nutation has
always been the most computationally intensive task in NOVAS, you may notice an increase
C-103

in execution time for some NOVAS applications. However, that extra computation time can
be reduced.
Earth-rotation calculations can be performed in either full- or reduced-accuracy mode as
described in section 2.6. Many functions include an input argument, accuracy, that
determines which mode will be used by that function and by any function it calls. In fullaccuracy mode, the various models are evaluated at the few-microarcsecond level. For
nutation, using this mode means that a 1,365-term trigonometric series is evaluated for each
unique date. However, neither the models nor current observations are accurate at this level,
so much of the increased computational burden is unproductive. Reduced-accuracy mode can
be used when the accuracy requirements are not better than 0.1 milliarcsecond for stars or
3.5 milliarcseconds for solar system bodies. The computation time for these calculations is
thereby reduced by about two-thirds.
A.5

New Model for the Rotation of the Earth about its Axis

IAU resolutions passed in 2000 established a new geometric paradigm for how we describe
the Earth’s spin around its axis. Both the old and new paradigms are based on the
instantaneous (true) equator of date, but they use different fiducial points on the equator as
the origin of right ascension and different time-like quantities (actually, time-dependent
angles) to describe the rotation of the Earth. As described in section 1.4 and Chapter 5, the
conventional scheme is based on the equinox and sidereal time; in the new paradigm, the
reference point is called the CIO and the time-like quantity is called the ERA. A more
complete explanation of the new concepts, along with the algorithms used with them, can be
found in Chapter 6 of USNO Circular 179. 45
NOVAS 3.0, and later, implement both the equinox- and CIO-based computational schemes.
Implementing the CIO-based paradigm has required the addition of many new functions
along with new code added to existing functions. First, the function place is coded to provide
output right ascensions with respect to either the equinox or the CIO; the choice is made
through input argument coord_sys. Function gcrs2equ can similarly convert GCRS right
ascensions and declinations to their equatorial equivalents (for a given date) with output right
ascensions measured with respect to either zero point. cio_ra provides the angle between the
two zero points, that is, the difference between the two right ascension systems. Functions
cio_location, cio_basis, cio_array, ira_equinox provide lower-level support to these
computations. Function era computes the ERA for any instant.
Two high-level NOVAS functions that involve Earth rotation, sidereal_time and ter2cel (the
latter replaces the old pnsw) have been re-coded to perform their internal calculations using
either the equinox-based or CIO-based paradigm. When each function is called, an input
argument, method, is set to either zero (0) for the CIO-based approach or one (1) for the
equinox-based approach. New NOVAS 3.1 function cel2ter works similarly.

45

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-104

A.6

New Features

The functions in this section have been added to NOVAS to increase functionality and
convenience.
place is new general-purpose apparent place function. Section A.2 describes this function in
greater detail.
equ2ecl converts RA and dec to ecliptic longitude and latitude. In addition, equ2ecl_vec and
ecl2equ_vec convert vectors from an equatorial to an ecliptic basis and vice versa,
respectively.
equ2gal converts ICRS RA and dec to galactic longitude and latitude.
gcrs2equ converts GCRS (geocentric ICRS) RA and dec to one of the equatorial systems of
date.
make_object and make_observer are examples of a new set of functions which have been
added to facilitate the construction of important data structures used in NOVAS.
cel2ter (NOVAS 3.1) transforms a vector from the celestial system (GCRS) to the terrestrial
system (ITRS).
A.7

New Terminology

Not surprisingly, the IAU resolutions on reference systems and Earth rotation have required
some new terminology, and an IAU Working Group on Nomenclature for Fundamental
Astronomy was established for the 2003–2006 triennium to systematize the usage. New
terms and abbreviations now appear in the comment statements of many NOVAS functions,
including the prologs where the input and output arguments are described. The most
important terms are described in Chapter 1 of this document and further information can be
found in USNO Circular 179.
A.8

References

Kaplan, G. H. 2005, The IAU Resolutions on Astronomical Reference Systems, Time Scales,
and Earth Rotation Models, USNO Circular 179 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
(USNO Circular 179)

(Return to Table of Contents)

C-105

C-106

Appendix B List of Changes fr om NOVAS C2.0.1 to C3.1
This appendix lists in detail the changes between the current C3.1 version of NOVAS and
earlier versions (C3.0 of 2009 and C2.0.1 of 2000). Appendix A provides some perspective
on these changes for people who are already familiar with NOVAS. Most of the
modifications are in response to resolutions passed by the IAU in 2000 and 2006 that
recommended new models for fundamental astronomy within a new conceptual framework.
To the greatest extent possible, the calling sequences for the highest-level (and most used)
functions from the previous versions of NOVAS have been preserved, but a few important
exceptions exist. Many new calls are now available as well.
B.1

New Functions

B.1.1 New Functions in NOVAS C3.0
cio_array is called from cio_location. It reads and returns a set of values of the GCRS right
ascension of the CIO, near a given TDB Julian date, from an external, binary direct-access
file.
cio_basis returns orthonormal basis vectors for the Celestial Intermediate Reference System
with respect to the GCRS. It requires a prior call to cio_location.
cio_location returns the RA of the CIO at a given TDB Julian date, either with respect to the
GCRS or with respect to the true equator and equinox of date.
cio_ra returns the value of the true RA of the CIO for a given TDB Julian date.
d_light evaluates the difference in light-time to a star between the solar system barycenter
and the Earth.
ecl2equ_vec converts an ecliptic position vector to an equatorial position vector.
ee_ct evaluates a 34-term series for “complementary terms” in the equation of the equinoxes
based on the work of Capitaine, Wallace, and McCarthy (2003), which is also discussed in
Petit and Luzum, eds. (2010).
equ2ecl converts equatorial RA and dec to ecliptic longitude and latitude.
equ2ecl_vec converts an equatorial position vector to an ecliptic position vector.
equ2gal converts ICRS RA and dec to galactic longitude and latitude.
era evaluates the ERA, θ.
frame_tie sets up the frame tie matrix and transforms a vector from the dynamical mean
J2000.0 system to the ICRS, or vice versa. This function implements a first-order matrix
with second-order corrections to the diagonal elements, patterned after the work by Hilton
and Hohenkerk (2004). Given the smallness of the angles involved and their uncertainties,
this approach is quite adequate.

C-107

gcrs2equ transforms GCRS RA and dec to RA and dec on mean or true equator of date. For
true equator of date, either the true equinox or the CIO can be specified as the origin of right
ascension.
geo_posvel is called from place to compute the geocentric position and velocity vectors of an
observer on, or above, the surface of the Earth.
grav_def replaces sun_field; it supervises the evaluation of gravitational deflection of light
due to the Sun, Jupiter, and other solar system bodies. It calls a new function grav_vec to do
the deflection calculation for each body.
grav_vec calculates the gravitational deflection of light due to a solar system body. It is
called by grav_def, a new function that replaces sun_field.
iau2000a evaluates the IAU 2000A nutation series (nutation only) based on IERS code 46
(Wallace 2003a).
iau2000b evaluates the IAU 2000B nutation series based on IERS code (Wallace 2003b).
ira_equinox returns the value of the Equation of the Origins, i.e., the right ascension of the
equinox in the Celestial Intermediate Reference System from an analytical expression. The
Equation of the Origins is the arc on the true equator of date from the CIO to the equinox,
measured positively to the east.
light_time is called from place to antedate the position of a solar system body for light-time.
limb_angle evaluates where an observed object is with respect to the Earth’s limb (horizon),
given the geocentric position vectors of the observer and the object. place calls limb_angle
for the topocentric cases in order to decide whether to include the gravitational deflection of
light due to the Earth itself.
make_observer creates a structure of type observer specifying the location of the observer.
make_observer_at_geocenter creates a structure of type observer specifying an observer at
the geocenter.
make_observer_in_space creates a structure of type observer specifying the position and
velocity of an observer situated on a near-Earth spacecraft.
make_observer_on_surface creates a structure of type observer specifying the location of
and weather for an observer on the surface of the Earth.
make_in_space creates a structure of type in_space specifying the position and velocity of
an observer situated on a near-Earth spacecraft.
make_on_surface creates a structure of type on_surface specifying the location of and
weather for an observer on the surface of the Earth.
mean_obliq is called from e_tilt and cel_pole to compute the mean obliquity of the ecliptic.
norm_ang is called by ee_ct to normalize angles into the range 0 ≤ angle < (2 π).

46

http://tai.bipm.org/iers/conv2003/conv2003_c5.html
C-108

nu2000k is a modification of iau2000a. It evaluates a truncated version (2000K) of the full
IAU 2000A nutation series and uses a consistent set of expressions for the fundamental
arguments, those of Simon et al. (1994). It is more accurate than the IAU 2000B series:
about 0.1 milliarcseconds for Δψ and about 0.04 milliarcseconds for Δε and Δψ sin ε over a
longer interval of time than IAU 2000B.
place is a new, general-purpose function for computing apparent, topocentric, virtual,
astrometric, etc., places of stars and planets. All substantive code for performing these
calculations has been moved from app_star, topo_star, app_planet, etc., into place. In the
call to place, the object requested is specified by the input parameter cel_object. The type
of place requested is specified by two input parameters, one indicating the location of the
observer and the other indicating the coordinate system of the output positions. app_star,
topo_star, app_planet, etc., now are just “front-ends” to place.
rad_vel is called from place to compute the radial velocity of observed object with respect to
the observer.
B.1.2 New Function in NOVAS C3.1
cel2ter transforms a vector from the celestial system (GCRS) to the terrestrial system (ITRS).
B.2

Changes to NOVAS C Structures and Calling Sequences

B.2.1 Changes in Structures and Calling Sequences from C2.0.1 to C3.0
All of the high-level functions (place, app_star, app_planet, etc.) now assume that they are
working with ICRS data, including input RA, dec, and proper motion components for the
stellar functions and position and velocity vectors obtained from solarsystem for both
stellar and planetary functions. virtual_star, local_star, virtual_planet, local_planet,
astro_star, astro_planet, and mean_star produce output positions in the ICRS.
app_star, virtual_star, astro_star, app_planet, virtual_planet, astro_planet, mean_star,
topo_star, topo_planet, local_star, and local_planet have a new accuracy input parameter.
The former earth input parameter was removed from each of these functions.
aberration no longer returns an error code.
bary_to_geo was renamed bary2obs.
cel_pole can now accept input corrections to the pole positions as either (dψ, dε) or
(dX, dY); the choice of correction is specified by a new input parameter type. In either case,
the units of the correction must be in milliarcseconds. In addition, this function now returns
an error code.
earthtilt was renamed e_tilt with a new accuracy input parameter.
ephemeris now returns an error code.
get_earth was eliminated and its functionality moved to place.

C-109

make_cat_entry changed its proper motion units (in both RA and dec) to
milliarcseconds/year and changed its parallax units to milliarcseconds. Proper motion in RA
includes a cos dec factor.
nutate was renamed nutation. It has a new accuracy input parameter, and it no longer
returns an error code.
nutation_angles has a new accuracy input parameter, and it no longer returns an error code.
pnsw was renamed ter2cel (terrestrial-to-celestial transformation) with the former input
argument tjd changed to a UT1 Julian date split into a pair of double-precision words,
jd_ut_high and jd_ut_low, and with a new accuracy input parameter added.
precession can no longer process two arbitrary epochs, because the new precession
expressions are not as flexible as those of Lieske et al. (1977, 1979). Therefore, one of the
input epochs must be 2451545.0 (J2000.0). In addition, this function now returns an error
code.
set_body was renamed make_object.
sidereal_time has new delta_t, gst_type, method, and accuracy input parameters. The
former ee input parameter was removed. In addition, this function now returns an error code.
spin is no longer specifically associated with sidereal time. It now applies a rotation about
the current z-axis with the angle expressed in degrees.
struct body was renamed object with the length of name member shortened to
50 characters and structure cat_entry member added.
struct site_info was renamed on_surface.

sun_field was replaced by grav_def, a more general function that evaluates the gravitational
deflection of light due to several solar system bodies.
tdb2tdt was renamed tdb2tt.
transform_cat has two modified and two new transformation options. Existing option=2
and existing option=3 can no longer process two arbitrary epochs, because the new
precession expressions are not as flexible as those of Lieske et al. (1977, 1979). Therefore,
one of the input epochs for these options must be 2451545.0 (J2000.0). New option=4
rotates data from the dynamical equator and equinox of J2000.0 to the ICRS while new
option=5 does the opposite rotation.
wobble has a new Julian date argument.
B.2.2 Changes in Structures and Calling Sequences from C3.0 to C3.1
To prevent possible array overflows, two new preprocessor constants, SIZE_OF_OBJ_NAME
and SIZE_OF_CAT_NAME have been defined in novas.h. SIZE_OF_OBJ_NAME defines the
length of the starname character array in the cat_entry structure and the length of the
name character array in the object structure. SIZE_OF_CAT_NAME defines the length of
the catalog character array in the cat_entry structure. Although the actual lengths of
C-110

the arrays are unchanged, the make_cat_entry and make_object function prototypes and
definitions now use these new preprocessor constants in their argument lists.
wobble has a new direction input parameter.
Several changes were made to the ephemeris manager code in eph_manager.c and
eph_manager.h.

B.3

•

The function names Ephem_Open, Ephem_Close, Planet_Ephemeris, State,
Interpolate, and Split were all changed to lower case (i.e., ephem_open, ephem_close,
planet_ephemeris, state, interpolate, and split) to conform to internal coding
standards.

•

ephem_open also has an additional output argument, de_number, that indicates the
DE number of the opened ephemeris file.
Significant Internal Changes to Code

B.3.1 Significant Internal Changes to Code from C2.0.1 to C3.0
app_star, topo_star, app_planet, topo_planet, virtual_star, local_star, virtual_planet,
local_planet, astro_star, and astro_planet are now simply “front-ends” to specific calls to
place. All substantive apparent place calculations of the various kinds are now done only in
place. The following changes in the basic algorithms were made.
1. Calls to frame_tie were added in appropriate places to transform between the ICRS
and the dynamical system.
2. In updating a star’s position for proper motion, a correction to the epoch of interest
for the difference in light-time between the solar system barycenter (the reference
point for the input catalog data) and the Earth itself is now included. This change
affects only stars with the greatest proper motions and, then, only at the
0.1-milliarcsecond level. The new function d_light is used to compute the epoch
offset.
3. The “Doppler factor,” k, is included in the computation of stellar space motion
vectors as discussed in the note on starvectors below.
4. Modifications were made related to the change in gravitational deflection algorithms
from sun_field to the more general function grav_def as discussed in the note above.
5. Code has been introduced that allows a place to be expressed in the Celestial
Intermediate Reference System (equator of date with CIO as the right ascension
origin).
6. Code has been added that allows the input of an observer’s instantaneous geocentric
position and velocity vectors (with respect to the true equator and equinox of date) for
a topocentric place calculation; this change supports satellite observations.
e_tilt now evaluates a more complete series for the complementary terms in the equation of
the equinoxes; formerly, it just evaluated the two largest terms. It uses the expression for the
mean obliquity from the P03 precession formulation. Internally, the function works in either
full- or reduced-accuracy mode as set by the accuracy input parameter.
Full-accuracy mode obtains the sum of the terms from IERS function ee_ct.
C-111

Reduced-accuracy obtains the sum of the terms from a nine-term internal series.
equ2hor implements an improved algorithm for refraction geometry.
fund_args now evaluates expressions for the fundamental solar and lunar arguments from
Simon et al. (1994).
nutation_angles now just calls either of the nutation functions, iau2000a (from the IERS) or
nu2000k (a reduced-accuracy version of iau2000a), to do the hard work; it does not contain a
nutation series itself. The nutation function called depends on the value of the accuracy
input parameter. In reduced-accuracy mode, iau2000b may be called instead of nu2000k by
making a small code modification as explained in the prolog to the nutation_angles function.
precession now evaluates the precession-angle polynomials for the Capitaine, Wallace, and
Chapront (2003) P03 model, which was recommended by an IAU resolution in 2006. Some
code changes were made to ensure reversibility of transformation (to/from J2000.0).
sidereal_time returns the value of sidereal time, either mean or apparent. Internally, this
function can work by either of two methods as set by the method input parameter.
Equinox-based method evaluates the expression for mean sidereal time following the
discussion in section 2.6.2 of USNO Circular 179. 47 The ERA, θ, is obtained from era.
For apparent sidereal time, the equation of the equinoxes, including the “complementary
terms,” is obtained from e_tilt.
CIO-based method obtains the sidereal time using the method of section 6.5.4 of USNO
Circular 179. That equation is based on the position of the true equinox of date in the
Celestial Intermediate Reference System, the basis of which is obtained from cio_basis.
The ERA, θ, is obtained from era. Mean sidereal time, when requested, is calculated by
subtracting the equation of the equinoxes, obtained from e_tilt.
In either method, sidereal_time/era evaluates θ using the input UT1 epoch, but other
components of sidereal time are evaluated using TDB (set equal to TT), with
TT=UT1+ΔT where the delta_t input parameter sets the ΔT value.
ter2cel performs the terrestrial-to-celestial transformation on a given vector, i.e., the total
rotation from the ITRS to the GCRS; it includes calls to frame_tie at appropriate places.
Internally, this function can work by either of two methods as set by method input
parameter.
Equinox-based method evaluates the old-style transformation as per the previous function
pnsw, but with a call to frame_tie added at the end to put final vector in GCRS. This
method uses apparent sidereal time, obtained from sidereal_time.
CIO-based method performs the transformation of equations 3 and 4 given by Kaplan
(2003), based on the Celestial Intermediate Reference System. The orthonormal basis of
the system is obtained from cio_basis, and the ERA, θ, is obtained from era.
In either method, the “fast angle” (rotation about z-axis) is evaluated using the input UT1
epoch, but other components of sidereal time are evaluated using TDB (set equal to TT),
with TT=UT1+ΔT where the delta_t input parameter sets the ΔT value.

47

http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
C-112

transform_cat, transform_hip, and starvectors were modified to accommodate the new
proper motion and parallax units.
transform_cat and starvectors now use (sin(parallax))-1 to compute distance, rather than
parallax-1; an inconsequential change that just makes the expression formally correct. Also,
the “Doppler Factor,” k, mentioned in the Hipparcos documentation and other papers, is now
applied in computing the space-motion vector. The computational distance used for objects
of zero parallax has been increased to 1 Gpc (2.06 x 1014 AU).
transform_cat calls frame_tie for new transformation option=4 and for the new
transformation option=5, which rotate data between dynamical J2000.0 system and ICRS.
wobble now includes a very tiny (inconsequential for most applications) rotation about the zaxis in the matrix to correct the ITRS longitude origin to TIO. This rotation uses the recently
published approximation to TIO longitude as a function of time, which required that the new
time argument also be added to this function. Essentially, this modification changes a W
rotation to a W´ rotation. Also, the matrix-element expressions changed from first-order
approximations to exact expressions for increased precision.
The following changes were made to constants:
• renamed MAU to AU and updated value
• renamed KMAU to AU_KM and updated value
• added AU_SEC from DE405
• added C_AUDAY
• changed units of C from AU/day to meters/second
• updated value of GS from DE405
• added GE from DE405
• renamed EARTHRAD to ERAD, changed units from kilometers to meters, and updated value
• updated value of F
• renamed OMEGA to ANGVEL
• added RMASS[12]
• updated value of TWOPI
• added ASEC360
• removed RAD2SEC
• added ASEC2RAD
B.3.2 Significant Internal Changes to Code from C3.0 to C3.1
app_star, astro_star, local_star, topo_star, and virtual_star all include a bug fix in the setup
of the local variable obj_name.
make_cat_entry includes a bug fix in the setup of the output structure members
star->starname and star->catalog.
make_object implements SIZE_OF_OBJ_NAME and SIZE_OF_CAT_NAME and checks the
length of name.

C-113

precession includes the static variable first_time to fix a bug that occurs when jd_tdb2
is T0 on the first call to this function.
Additionally, in nutation.c, iau2000a, iau2000b, and nu2000k now use static storage
class for the large const arrays.
In eph_manager.c and eph_manager.h, some variables have been changed from long int
to int to fix a problem on 64-bit Linux and Mac OS X 10.6 (Snow Leopard) systems.
B.4

Other Internal Code Changes

B.4.1 Other Internal Code Changes from C2.0.1 to C3.0
Many minor changes have been made in the code. Obviously, many of the comment
statements had to be revised, and others had to be added; such changes are too numerous to
try to list. Some variable names were changed. For example, the output RA and dec for the
mean_star function was named mra and mdec, the m indicating “mean”; these are now ira
and idec, the i indicating “ICRS.” Many similar trivial changes have been made.
B.4 .2 Other Internal Code Changes from C3.0 to C3.1
For consistency throughout NOVAS and with IERS Conventions, the variables representing
the coordinates of the celestial intermediate pole with respect to the ITRS pole were renamed
to xp and yp. This change is most notable in the input arguments of ter2cel, wobble, and
equ2hor.
ee_ct has additional references and notes.
mean_star uses make_cat_entry to set up the local tempstar structure.
sidereal_time has additional notes on usage.
The ephemeris manager code (eph_manager.c and eph_manager.h) contains many minor
internal updates, including support for JPL’s DE421.
B.5

References

Capitaine, N. Wallace, P. T., & Chapront. J. 2003, A&A, 412, 567 (P03)
Capitaine, N., Wallace, P. T., & McCarthy, D. D. 2003, A&A, 406, 1135
Hilton, J. L. & Hohenkerk, C. Y. 2004, A&A, 413, 765
Kaplan, G. H. 2003, in Proceeding of IAU Gen. Assembly XXV, Joint Discussion 16, The
International Celestial Reference System, Maintenance and Future Realizations, ed.
R. Guame, D. McCarthy, & J. Souchay (Sydney: The Assembly) 196
Kaplan, G. H. 2005, The IAU Resolutions on Astronomical Reference Systems, Time Scales,
and Earth Rotation Models, USNO Circular 179 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-179
(USNO Circular 179)
Lieske, J. H., Lederle, T., Fricke, W., & Morando, B. 1977, A&A, 1
C-114

Lieske, J. H. 1979, A&A, 282
Petit, G. & Luzum, B. (eds.) 2010, Chapter 5, in IERS Conventions, IERS Tech. Not. 36
(Frankfurt: IERS) (Table 5.2e presented in the printed publication is a truncated series. The
full series, which is used in NOVAS, is available on the IERS Conventions Center website in
file tab5.2e.txt.) ftp://tai.bipm.org/iers/conv2010/chapter5/
Simon, J. L., Bretagnon, P., Chapront, J., Chapront-Touze, M., Francou, G., & Laskar, J.
1994, A&A, 282, 663
Standish, E. M. 1998, “JPL Planetary and Lunar Ephemerides, DE405/LE405,” JPL IOM
312.F-98-048 (Pasadena, CA: JPL) http://ssd.jpl.nasa.gov/iau-comm4/relateds.html
Wallace, P. 2003a, NU2000A Subroutine, Subroutines for Chapter 5, in IERS Conventions,
ed. D. McCarthy & G. Petit, IERS Tech. Not. 32 (Frankfurt: IERS)
http://tai.bipm.org/iers/conv2003/conv2003_c5.html
Wallace, P. 2003b, NU2000B Subroutine, Subroutines for Chapter 5, in IERS Conventions,
ed. D. McCarthy & G. Petit, IERS Tech. Not. 32 (Frankfurt: IERS)
http://tai.bipm.org/iers/conv2003/conv2003_c5.html
(Return to Table of Contents)

C-115

C-116

Appendix C How to Set Up the J PL Ephemer ides
C.1

Overview

As described elsewhere in this document, NOVAS requires access to a high-accuracy solar
system ephemeris in order to compute places of solar system bodies and the highest-accuracy
star places. Groups in the U.S., France, and Russia now construct high-accuracy solar system
ephemerides. In NOVAS C, solarsystem version 1 and solarsystem version 2 provide direct
access to the “developmental ephemerides,” designated as “DEnnn,” which are produced by
JPL in the U.S. The former is a front-end to a USNO-supplied C implementation of JPL’s
ephemeris-access software, while the latter is a front-end to the JPL-provided Fortran
software; both versions enable reading and interpolating a binary, direct-access ephemeris
file. The binary ephemeris file is created from ASCII data files and software supplied by JPL.
The JPL software must be tailored for your specific computer architecture.
This appendix describes how to set up the binary ephemeris file and the JPL software that
reads it on your system. After these tasks have been done successfully, the JPL software must
be linked into any NOVAS application that uses solarsystem version 2. Alternatively, the
binary ephemeris file can be used directly with solarsystem version 1 and the software in file
eph_manager.c. The procedures outlined below worked on an Intel-based Mac OS X system
using the open-source gfortran compiler and the JPL software available in February 2009.
The resulting binary, direct-access ephemeris file was successfully transferred to and used on
other Intel-based computers running Microsoft Windows XP and Linux. Thus, our
procedures are tailored for computers containing Intel processors, including many systems
running Microsoft Windows, Mac OS X, and Linux. Providing specific procedures for all
combinations of computer processors, operating systems, and compilers is beyond the scope
of this user’s guide. Furthermore, the procedures in this appendix are intended simply as a
guide; the USNO cannot provide technical support regarding JPL software.
C.2

Step-by-Step Guide

Step 1: Connect to the JPL ftp site. All the files needed to install the JPL ephemerides are
available via anonymous ftp from ssd.jpl.nasa.gov. This can be accomplished through
most modern Web browsers by typing
ftp://ssd.jpl.nasa.gov
in the address (URL) field. When connected, go to the pub/eph/planets/ directory.
Step 2: Download the JPL software, ASCII ephemeris files, and corresponding test data file.
Follow the “CONTENTS TO BE RETRIEVED BY THE USER” instructions in the file
README.txt, which is also available as a webpage. 48 We recommend following the
instructions for “non-UNIX users” regardless of your computer’s operating system. Our
experience at USNO has been that the installation process is more a function of your
computer’s processor (hardware) than its operating system. The test data file, testpo.xxx,

48

http://ssd.jpl.nasa.gov/?planet_eph_export
C-117

may be found in both the same directory as the ASCII ephemeris files and in the separate test
data directory.
The characters used to terminate lines, the end-of-line codes, vary among operating systems.
Some systems use carriage returns (CR), some use line feeds (LF), and some use both. The
end-of-line codes may not be properly translated between operating systems when files are
copied from one system to another, depending on how the files are transferred and on what
options are invoked. If you have trouble reading or using any of the files downloaded from
JPL, check the encoding to ensure it is appropriate to your system.
Step 3: Configure the asc2eph.f file provided by JPL. For computer systems with Intel
processors, select (uncomment) the following statement at the beginning of the program:
PARAMETER ( NRECL = 4 )

Step 4: Split the testeph.f file provided by JPL into two files: jplsubs.f and testeph.f. The
first new file, jplsubs.f, should contain JPL subroutines FSIZER3, PLEPH (including
ENTRY DPLEPH), INTERP, SPLIT, STATE, and CONST extracted from the original JPL test
program. The second revised file, testeph.f, should contain only the main program and no
subroutines. JPL subroutines FSIZER1 and FSIZER2 will not be needed and are not retained
in either file.
The creation of the new file, jplsubs.f, is advantageous for the long-term use of the JPL
subroutines and the binary ephemeris files with NOVAS. The new file contains no
extraneous material and is named descriptively.
Step 5: Configure the new jplsubs.f file.
a. For computer systems with Intel processors, in subroutine FSIZER3 of jplsubs.f,
uncomment and set
NRECL=4

b. In subroutine FSIZER3 of jplsubs.f, identify the binary ephemeris file to be used
by setting
NAMFIL= 'JPLEPH'

You may wish to specify a more complete file name including the appropriate
directories, such as
NAMFIL= '/users/mystuff/ephem/JPLEPH'

to avoid having to keep an alias to this binary file in all your working directories.
c. In subroutine FSIZER3 of jplsubs.f, set KSIZE to the correct value for the
specific ephemeris being used (see the comments in the code); e.g., set
KSIZE = 2036

for DE405 and DE421.
d. In subroutine STATE of jplsubs.f, select (uncomment)
CALL FSIZER3(NRECL,KSIZE,NRFILE,NAMFIL)
leaving the lines containing CALL FSIZER1 and CALL FSIZER2 as comments.

Step 6: Compile and create executables.
a. Create executable application asc2eph by compiling and linking file asc2eph.f.
b. Create executable application testeph by compiling and linking files testeph.f
and jplsubs.f.
C-118

NOTE for Windows systems: Some Fortran compilers may produce files
with an .exe extension, i.e., asc2eph.exe and testeph.exe. If so, ignore the
.exe extension when using those applications in the following steps.
Step 7: Concatenate the ASCII data files and convert the concatenated file to binary form.
Follow the instructions in the “ASCII to BINARY (for non-UNIX users)” section of the
usrguide file, which is located in the pub/eph/planets directory. The resulting binary
ephemeris file will be named JPLEPH, or whatever name you specified in Step 5b.
Step 8: Test the binary ephemeris file. Follow the instructions in the “TESTING THE
BINARY FILE” section of the usrguide file, which is located in pub/eph/planets. You
should have already downloaded the appropriate test data file in Step 2.
NOTE: In testing, jplsubs.f returned different values for some dates when
compiled with Lahey/Fujitsu Fortran 95 and GNU Fortran 4.1.2 under Red
Hat Enterprise Linux ES release 4 (Nahant Update 9).
Step 9: Use the binary ephemeris file with NOVAS. After successfully completing the test,
compile and link NOVAS function solarsystem version 2 (solsys2.c) and the JPL subroutines
contained in jplsubs.f with the remaining relevant parts of NOVAS and your application
code. Alternatively, the binary ephemeris file can be used directly with solarsystem version 1
and the software in file eph_manager.c. Unless you specified otherwise in Step 5b, the
binary JPL ephemeris file, or an alias to it, should reside in the same directory as your
executable application.

(Return to Table of Contents)

C-119

C-120

Appendix D A Compar ison of SOFA and NOVAS C3.0
The Standards of Fundamental Astronomy (IAU 2009a; SOFA) 49 library is the official
collection of approved software for positional astronomy, operating under the auspices of
International Astronomical Union (IAU) Division 1 (Fundamental Astronomy). Both Fortran
and C libraries are available. An international SOFA Reviewing Board manages the
collection.
Generally, NOVAS is independent of SOFA although both software libraries include code
that is similar to two IERS Fortran modules. 50 Function iau2000a, which evaluates the full
1,365-term IAU 2000A nutation series in NOVAS 3.0, is based on the IERS subroutine
NU2000A. Function ee_ct, which evaluates the “complementary terms” in the equation of the
equinoxes, is based on IERS function EECT2000. The corresponding modules in SOFA are,
respectively, iau_NUT00A and iau_EECT00 (Fortran) and iauNut00a and iauEect00 (C).
The document SOFA Tools for Earth Attitude, also known as the “SOFA Cookbook,”
contains several Fortran examples of the transformation between terrestrial and celestial
coordinate systems. This appendix examines how one of those examples plays out in the C
editions of both NOVAS and SOFA.
D.1

Goal

These tests were designed to compare the transformation from GCRS to ITRS using the IAU
2000A/2006 models for precession and nutation. We compared the CIO-based method in
NOVAS C3.0 at full accuracy with a C translation of the example in section 5.5 of the SOFA
Cookbook titled “IAU 2006/2000A, CIO based, using classical angles.” The goal was to
verify that the NOVAS libraries, which are (mostly) independent of SOFA, produced results
that agree with their SOFA counterparts at a level that is at least an order of magnitude better
than the best observational results.
D.2

Procedure

The comparison of the C editions of NOVAS and SOFA was based on an earlier comparison
of the Fortran editions, which is described in Appendix D of the User’s Guide to NOVAS
Version F3.0 51 (Fortran section of this circular). The C test functions were basically a linefor-line transliteration of the Fortran terceltest.f and SOFA-TEST.f using the NOVAS and
SOFA C functions, respectively. User’s Guide to NOVAS Version F3.1 includes complete
code for the full text of the NOVAS test program, terceltest.f and SOFA-TEST.f.

49

http://www.iausofa.org/
http://tai.bipm.org/iers/conv2003/conv2003_c5.html
51
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-180
50

C-121

Function terceltest is provided in the addendum; it was run using the following input
parameters:
•

Universal Time: UT1 = 2400000.5 + 54195.4999991658 days (Julian date)
The UT1 value is divided into two parts, i.e., two separate arguments, because of the
large number of significant digits needed for precise results. The best agreement
between NOVAS and SOFA was obtained when UT1 was split in the exactly the
same place. In the Fortran tests, splitting the date differently produced differences of
about 3 microarcseconds.

•

Difference between TT and UT1: ∆T = 65.25607389 s
SOFA does not use ∆T; this value is the difference between the TT and UT1 Julian
dates in the SOFA example, expressed in seconds.

•

Polar coordinates: XP = 0.0349282, YP = 0.4833163 arcsec

•

CIP offsets: DX = 0.1725, DY = -0.265 arcsec

The SOFA function iauNut06a includes small corrections to the nutation series arising from
the P03 precession that are not used in the NOVAS calculations. The corrections amount to
only a few microarcseconds for current dates.
NOVAS does not directly produce an overall GCRS-to-ITRS rotation matrix as SOFA does.
The NOVAS rotation matrix was constructed simply by passing the three vectors, (1,0,0),
(0,1,0), and (0,0,1), in succession through function ter2cel.
A series of tests was done, with and without corrections for polar motion, precession and
nutation, and the P03 correction in SOFA. The output of the C functions was compared with
output from the corresponding Fortran programs. Both the Fortran and C computations were
executed on a 32-bit Intel Apple Macintosh system running the Leopard (Mac OS X 10.5)
operating system.
D.3

Results

Table D1 shows that the latest C releases of NOVAS and SOFA agree at the submicroarcsecond level in the transformation between the celestial and terrestrial reference
systems when the same Earth orientation parameters and conventions are used. In this case,
including the P03 corrections in the SOFA nutation adds a discrepancy on the order of
1.4 µas. Inclusion of the CIP offsets and polar motion does not significantly add to the
differences in the two formulations, as long as the parameters used are identical in the two
cases. Use of the external CIO_RA file in the NOVAS calculation adds about 0.05 µas to
the difference for the above case, while using the equinox method for the NOVAS
computations does not have a significant effect on the results.
The results presented in Table D1 were obtained by computing the GCRS to ITRS
transformations for the single time discussed in the SOFA Cookbook. Therefore, the values
should be typical.

C-122

Table D1. Comparison of NOVAS C3.0 and SOFA C
Corrections Applied
Other Options
Polar
CIP
P03
External
Equinox
Difference
Motion
Offsets
Terms
method
CIO_RA
(µas)
No
No
No
No
No
0.25814
No
No
Yes
No
No
1.6752
No
Yes
Yes
No
No
1.6728
Yes
Yes
Yes
No
No
1.6735
Yes
Yes
No
No
No
0.28679
Yes
Yes
No
Yes
No
0.34369
Yes
Yes
No
No
Yes
0.28644
D.4

References

Capitaine, N., Wallace, P. T., Chapront, J. 2003, A&A, 412, 567 (P03)
Kaplan, G., Bartlett, J., Monet, A., Bangert, J., & Puatua, W., 2009, User’s Guide to NOVAS
F3.0 (Washington, DC: USNO)
http://www.usno.navy.mil/USNO/astronomical-applications/publications/circ-180
IAU. 2009a, Standards of Fundamental Astronomy, (SOFA) http://www.iausofa.org/
IAU. 2009b, SOFA Tools for Earth Attitude, Software version 4, Document revision 1.1
(SOFA Cookbook) http://www.iausofa.org/sofa_pn.pdf
IERS. 2003, Conventions 2003: Chapter 5 Transformation Between the Celestial and
Terrestrial Systems (Frankfurt, Germany: BKG)
http://tai.bipm.org/iers/conv2003/conv2003_c5.html
Monet, A., Kaplan, G., & Harris, W. Testing Coordinate Frame Transformations
NOVAS vs SOFA, USNO/AA Technical Note 2010-04 (Washington, DC: USNO)

C-123

D.5

Addendum:

NOVAS C3.0 Code

void terceltest ()
{
/* Transform vectors from ITRS to GCRS */
double tjdh, tjdl, xp, yp, delt = 65.25607389, vec1[3], vec2[3], tjd,
dx, dy, mobl, tobl, ee;
short num = 0;
FILE *In_Data = NULL;
dx = +0.1750;
dy = -0.2259;
/* Open the input file of Julian dates,CIO coords,ITRS vector */
In_Data = fopen ("tercel-test-input.dat","r");
while (!feof(In_Data))
{
fscanf(In_Data,"%hi%lf%lf%lf%lf%lf%lf%lf",&num,&tjdh,&tjdl,
&xp,&yp,&vec1[0],&vec1[1],&vec1[2]);
/*

Set transformation method, accuracy level, and ut1-utc. */
tjd = tjdh + tjdl;

/*

celpol (tjd,2,dx,dy);*/
e_tilt (tjd,0, &mobl,&tobl,&ee,&dx,&dy);

/*

Rotate vec1 from ITRS to GCRS = vec2

*/

ter2cel (tjdh,tjdl,delt,1,0,0,xp,yp,vec1, vec2);
printf ("%i
%20.17f
%20.17f
"
" %20.17f\n",num,vec2[0],vec2[1],vec2[2]);
}
fclose (In_Data);
}

(Return to Table of Contents)

C-124



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : Yes
Author                          : John Bangert, Wendy Puatua, George Kaplan, Jennifer Bartlett, William Harris, Amy Fredericks, Alice Monet
Category                        : software documentation
Comments                        : 
Company                         : US Naval Observatory
Create Date                     : 2011:03:31 14:40:19-04:00
Manager                         : 
Modify Date                     : 2011:03:31 14:46:34-04:00
Source Modified                 : D:20110331182555
Subject                         : Naval Observatory Vector Astrometry Software
Tagged PDF                      : Yes
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04
Metadata Date                   : 2011:03:31 14:46:34-04:00
Creator Tool                    : Acrobat PDFMaker 9.1 for Word
Document ID                     : uuid:a9637a6a-58e9-489a-bef7-c8ce0283ca60
Instance ID                     : uuid:0ddc3f33-7475-4a90-a0a2-bbc3e532db7f
Format                          : application/pdf
Title                           : User's Guide to NOVAS Version C3.1
Description                     : Naval Observatory Vector Astrometry Software
Creator                         : John Bangert, Wendy Puatua, George Kaplan, Jennifer Bartlett, William Harris, Amy Fredericks, Alice Monet
Producer                        : Adobe PDF Library 9.0
Keywords                        : 
Headline                        : Naval Observatory Vector Astrometry Software
Page Layout                     : OneColumn
Page Count                      : 124
EXIF Metadata provided by EXIF.tools

Navigation menu