From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001
From: Joseph Hunkeler <jhunkeler@gmail.com>
Date: Wed, 8 Jul 2015 20:46:52 -0400
Subject: Initial commit

---
 math/slalib/sun67.tex | 13140 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 13140 insertions(+)
 create mode 100644 math/slalib/sun67.tex

(limited to 'math/slalib/sun67.tex')

diff --git a/math/slalib/sun67.tex b/math/slalib/sun67.tex
new file mode 100644
index 00000000..ab9c7ba9
--- /dev/null
+++ b/math/slalib/sun67.tex
@@ -0,0 +1,13140 @@
+\documentclass[11pt,twoside]{article}
+\setcounter{tocdepth}{2}
+\pagestyle{myheadings}
+
+% -----------------------------------------------------------------------------
+% ? Document identification
+\newcommand{\stardoccategory}  {Starlink User Note}
+\newcommand{\stardocinitials}  {SUN}
+\newcommand{\stardocsource}    {sun67.70}
+\newcommand{\stardocnumber}    {67.70}
+\newcommand{\stardocauthors}   {P.\,T.\,Wallace}
+\newcommand{\stardocdate}      {19 December 2005}
+\newcommand{\stardoctitle}     {SLALIB --- Positional Astronomy Library}
+\newcommand{\stardocversion}   {2.5-3}
+\newcommand{\stardocmanual}    {Programmer's Manual}
+% ? End of document identification
+
+%%% Also see \nroutines definition later %%%
+
+% -----------------------------------------------------------------------------
+
+\newcommand{\stardocname}{\stardocinitials /\stardocnumber}
+\markright{\stardocname}
+
+%----------------------------------------------------
+% Comment out unwanted definitions to suit stationery
+
+\setlength{\textwidth}{160mm}       %
+\setlength{\textheight}{230mm}      % European A4
+\setlength{\topmargin}{-5mm}        %
+
+%\setlength{\textwidth}{167mm}       %
+%\setlength{\textheight}{220mm}      % US Letter
+%\setlength{\topmargin}{-10mm}       %
+
+%
+%----------------------------------------------------
+
+\setlength{\textwidth}{160mm}
+\setlength{\textheight}{230mm}
+\setlength{\topmargin}{-2mm}
+\setlength{\oddsidemargin}{0mm}
+\setlength{\evensidemargin}{0mm}
+\setlength{\parindent}{0mm}
+\setlength{\parskip}{\medskipamount}
+\setlength{\unitlength}{1mm}
+
+% -----------------------------------------------------------------------------
+%  Hypertext definitions.
+%  ======================
+%  These are used by the LaTeX2HTML translator in conjunction with star2html.
+
+%  Comment.sty: version 2.0, 19 June 1992
+%  Selectively in/exclude pieces of text.
+%
+%  Author
+%    Victor Eijkhout                                      <eijkhout@cs.utk.edu>
+%    Department of Computer Science
+%    University Tennessee at Knoxville
+%    104 Ayres Hall
+%    Knoxville, TN 37996
+%    USA
+
+%  Do not remove the %begin{latexonly} and %end{latexonly} lines (used by
+%  star2html to signify raw TeX that latex2html cannot process).
+%begin{latexonly}
+\makeatletter
+\def\makeinnocent#1{\catcode`#1=12 }
+\def\csarg#1#2{\expandafter#1\csname#2\endcsname}
+
+\def\ThrowAwayComment#1{\begingroup
+    \def\CurrentComment{#1}%
+    \let\do\makeinnocent \dospecials
+    \makeinnocent\^^L% and whatever other special cases
+    \endlinechar`\^^M \catcode`\^^M=12 \xComment}
+{\catcode`\^^M=12 \endlinechar=-1 %
+ \gdef\xComment#1^^M{\def\test{#1}
+      \csarg\ifx{PlainEnd\CurrentComment Test}\test
+          \let\html@next\endgroup
+      \else \csarg\ifx{LaLaEnd\CurrentComment Test}\test
+            \edef\html@next{\endgroup\noexpand\end{\CurrentComment}}
+      \else \let\html@next\xComment
+      \fi \fi \html@next}
+}
+\makeatother
+
+\def\includecomment
+ #1{\expandafter\def\csname#1\endcsname{}%
+    \expandafter\def\csname end#1\endcsname{}}
+\def\excludecomment
+ #1{\expandafter\def\csname#1\endcsname{\ThrowAwayComment{#1}}%
+    {\escapechar=-1\relax
+     \csarg\xdef{PlainEnd#1Test}{\string\\end#1}%
+     \csarg\xdef{LaLaEnd#1Test}{\string\\end\string\{#1\string\}}%
+    }}
+
+%  Define environments that ignore their contents.
+\excludecomment{comment}
+\excludecomment{rawhtml}
+\excludecomment{htmlonly}
+
+%  Hypertext commands etc. This is a condensed version of the html.sty
+%  file supplied with LaTeX2HTML by: Nikos Drakos <nikos@cbl.leeds.ac.uk> &
+%  Jelle van Zeijl <jvzeijl@isou17.estec.esa.nl>. The LaTeX2HTML documentation
+%  should be consulted about all commands (and the environments defined above)
+%  except \xref and \xlabel which are Starlink specific.
+
+\newcommand{\htmladdnormallinkfoot}[2]{#1\footnote{#2}}
+\newcommand{\htmladdnormallink}[2]{#1}
+\newcommand{\htmladdimg}[1]{}
+\newenvironment{latexonly}{}{}
+\newcommand{\hyperref}[4]{#2\ref{#4}#3}
+\newcommand{\htmlref}[2]{#1}
+\newcommand{\htmlimage}[1]{}
+\newcommand{\htmladdtonavigation}[1]{}
+\newcommand{\latexhtml}[2]{#1}
+\newcommand{\html}[1]{}
+
+%  Starlink cross-references and labels.
+\newcommand{\xref}[3]{#1}
+\newcommand{\xlabel}[1]{}
+
+%  LaTeX2HTML symbol.
+\newcommand{\latextohtml}{{\bf LaTeX}{2}{\tt{HTML}}}
+
+%  Define command to re-centre underscore for Latex and leave as normal
+%  for HTML (severe problems with \_ in tabbing environments and \_\_
+%  generally otherwise).
+\newcommand{\latex}[1]{#1}
+\newcommand{\setunderscore}{\renewcommand{\_}{{\tt\symbol{95}}}}
+\latex{\setunderscore}
+
+% -----------------------------------------------------------------------------
+%  Debugging.
+%  =========
+%  Remove % on the following to debug links in the HTML version using Latex.
+
+% \newcommand{\hotlink}[2]{\fbox{\begin{tabular}[t]{@{}c@{}}#1\\\hline{\footnotesize #2}\end{tabular}}}
+% \renewcommand{\htmladdnormallinkfoot}[2]{\hotlink{#1}{#2}}
+% \renewcommand{\htmladdnormallink}[2]{\hotlink{#1}{#2}}
+% \renewcommand{\hyperref}[4]{\hotlink{#1}{\S\ref{#4}}}
+% \renewcommand{\htmlref}[2]{\hotlink{#1}{\S\ref{#2}}}
+% \renewcommand{\xref}[3]{\hotlink{#1}{#2 -- #3}}
+%end{latexonly}
+% -----------------------------------------------------------------------------
+% ? Document specific \newcommand or \newenvironment commands.
+%------------------------------------------------------------------------------
+
+\newcommand{\nroutines} {188}
+\newcommand{\radec}     {$[\,\alpha,\delta\,]$}
+\newcommand{\hadec}     {$[\,h,\delta\,]$}
+\newcommand{\xieta}     {$[\,\xi,\eta\,]$}
+\newcommand{\azel}      {$[\,Az,El~]$}
+\newcommand{\ecl}       {$[\,\lambda,\beta~]$}
+\newcommand{\gal}       {$[\,l^{I\!I},b^{I\!I}\,]$}
+\newcommand{\xy}        {$[\,x,y\,]$}
+\newcommand{\xyz}       {$[\,x,y,z\,]$}
+\newcommand{\xyzd}      {$[\,\dot{x},\dot{y},\dot{z}\,]$}
+\newcommand{\xyzxyzd}   {$[\,x,y,z,\dot{x},\dot{y},\dot{z}\,]$}
+\newcommand{\degree}[2] {$#1^{\circ}
+                        \hspace{-0.37em}.\hspace{0.02em}#2$}
+
+\newcommand{\arcsec}[2] {\arcseci{#1}$\hspace{-0.4em}.#2$}
+\begin{htmlonly}
+   \newcommand{\arcsec}[2] {
+      {$#1\hspace{-0.05em}^{'\hspace{-0.1em}'}\hspace{-0.4em}.#2$}
+   }
+\end{htmlonly}
+
+\newcommand{\arcseci}[1] {$#1\hspace{-0.05em}$\raisebox{-0.5ex}
+                         {$^{'\hspace{-0.1em}'}$}}
+\begin{htmlonly}
+   \newcommand{\arcseci}[1] {$#1\hspace{-0.05em}^{'\hspace{-0.1em}'}$}
+\end{htmlonly}
+
+\newcommand{\dms}[4]    {$#1^{\circ}\,#2\raisebox{-0.5ex}
+                        {$^{'}$}\,$\arcsec{#3}{#4}}
+\begin{htmlonly}
+   \newcommand{\dms}[4]{$#1^{\circ}\,#2^{'}\,#3^{''}.#4$}
+\end{htmlonly}
+
+\newcommand{\tseci}[1]   {$#1$\mbox{$^{\rm s}$}}
+\newcommand{\tsec}[2]    {\tseci{#1}$\hspace{-0.3em}.#2$}
+\begin{htmlonly}
+   \newcommand{\tsec}[2] {$#1^{\rm s}\hspace{-0.3em}.#2$}
+\end{htmlonly}
+
+\newcommand{\hms}[4]    {$#1^{\rm h}\,#2^{\rm m}\,$\tsec{#3}{#4}}
+\begin{htmlonly}
+   \newcommand{\hms}[4] {$#1^{h}\,#2^{m}\,#3^{s}.#4$}
+\end{htmlonly}
+
+\newcommand{\callhead}[1]{\goodbreak\vspace{\bigskipamount}{\large\bf{#1}}}
+\newenvironment{callset}{\begin{list}{}{\setlength{\leftmargin}{2cm}
+                             \setlength{\parsep}{\smallskipamount}}}{\end{list}}
+\newcommand{\subp}[1]{\item\hspace{-1cm}#1\\}
+\newcommand{\subq}[2]{\item\hspace{-1cm}#1\\\hspace*{-1cm}#2\\}
+\newcommand{\name}[1]{\mbox{#1}}
+\newcommand{\fortvar}[1]{\mbox{\em #1}}
+
+\newcommand{\routine}[3]
+{\hbadness=10000
+  \vbox
+  {
+    \rule{\textwidth}{0.3mm}\\
+    {\Large {\bf #1} \hfill #2 \hfill {\bf #1}}\\
+    \setlength{\oldspacing}{\topsep}
+    \setlength{\topsep}{0.3ex}
+    \begin{description}
+      #3
+    \end{description}
+    \setlength{\topsep}{\oldspacing}
+  }
+}
+
+%  Replacement for HTML version (each routine in own subsection).
+\begin{htmlonly}
+   \newcommand{\routine}[3]
+   {
+      \subsection{#1\xlabel{#1} - #2\label{#1}}
+       \begin{description}
+         #3
+       \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\action}[1]
+{\item[ACTION]: #1}
+
+\begin{htmlonly}
+   \newcommand{\action}[1]
+   {\item[ACTION:] #1}
+\end{htmlonly}
+
+\newcommand{\call}[1]
+{\item[CALL]: \hspace{0.4em}{\tt #1}}
+\newlength{\oldspacing}
+
+\begin{htmlonly}
+   \newcommand{\call}[1]
+   {
+    \item[CALL:] {\tt #1}
+   }
+\end{htmlonly}
+
+\newcommand{\args}[2]
+{
+  \goodbreak
+  \setlength{\oldspacing}{\topsep}
+  \setlength{\topsep}{0.3ex}
+  \begin{description}
+  \item[#1]:\\[1.5ex]
+    \begin{tabular}{p{7em}p{6em}p{22em}}
+      #2
+    \end{tabular}
+  \end{description}
+  \setlength{\topsep}{\oldspacing}
+}
+\begin{htmlonly}
+   \newcommand{\args}[2]
+   {
+     \begin{description}
+        \item[#1:]\\
+        \begin{tabular}{p{7em}p{6em}l}
+           #2
+        \end{tabular}
+     \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\spec}[3]
+{
+  {\em {#1}} & {\bf \mbox{#2}} & {#3}
+}
+
+\newcommand{\specel}[2]
+{
+  \multicolumn{1}{c}{#1} & {} & {#2}
+}
+
+\newcommand{\anote}[1]
+{
+  \goodbreak
+  \setlength{\oldspacing}{\topsep}
+  \setlength{\topsep}{0.3ex}
+  \begin{description}
+    \item[NOTE]:
+        #1
+  \end{description}
+  \setlength{\topsep}{\oldspacing}
+}
+
+\begin{htmlonly}
+   \newcommand{\anote}[1]
+   {
+      \begin{description}
+      \item[NOTE:]
+          #1
+      \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\notes}[1]
+{
+  \goodbreak
+  \setlength{\oldspacing}{\topsep}
+  \setlength{\topsep}{0.3ex}
+  \begin{description}
+    \item[NOTES]:
+        #1
+  \end{description}
+  \setlength{\topsep}{\oldspacing}
+}
+
+\begin{htmlonly}
+   \newcommand{\notes}[1]
+   {
+      \begin{description}
+         \item[NOTES:]
+            #1
+      \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\aref}[1]
+{
+  \goodbreak
+  \setlength{\oldspacing}{\topsep}
+  \setlength{\topsep}{0.3ex}
+  \begin{description}
+    \item[REFERENCE]:
+        #1
+  \end{description}
+  \setlength{\topsep}{\oldspacing}
+}
+
+\begin{htmlonly}
+   \newcommand{\aref}[1]
+   {
+     \begin{description}
+       \item[REFERENCE:]
+           #1
+     \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\refs}[1]
+{
+  \goodbreak
+  \setlength{\oldspacing}{\topsep}
+  \setlength{\topsep}{0.3ex}
+  \begin{description}
+    \item[REFERENCES]:
+        #1
+  \end{description}
+  \setlength{\topsep}{\oldspacing}
+}
+\begin{htmlonly}
+   \newcommand{\refs}[1]
+   {
+     \begin{description}
+       \item[REFERENCES:]
+           #1
+     \end{description}
+   }
+\end{htmlonly}
+
+\newcommand{\exampleitem}{\item [EXAMPLE]:}
+\begin{htmlonly}
+   \newcommand{\exampleitem}{\item [EXAMPLE:]}
+\end{htmlonly}
+
+%------------------------------------------------------------------------------
+% ? End of document specific commands
+% -----------------------------------------------------------------------------
+%  Title Page.
+%  ===========
+\renewcommand{\thepage}{\roman{page}}
+\begin{document}
+\thispagestyle{empty}
+
+%  Latex document header.
+%  ======================
+\begin{latexonly}
+   CCLRC / {\sc Rutherford Appleton Laboratory} \hfill {\bf \stardocname}\\
+   {\large Particle Physics \& Astronomy Research Council}\\
+   {\large Starlink Project\\}
+   {\large \stardoccategory\ \stardocnumber}
+   \begin{flushright}
+   \stardocauthors\\
+   \stardocdate
+   \end{flushright}
+   \vspace{-4mm}
+   \rule{\textwidth}{0.5mm}
+   \vspace{5mm}
+   \begin{center}
+   {\Huge\bf  \stardoctitle \\ [2.5ex]}
+   {\LARGE\bf \stardocversion \\ [4ex]}
+   {\Huge\bf  \stardocmanual}
+   \end{center}
+   \vspace{5mm}
+
+% ? Heading for abstract if used.
+   \vspace{10mm}
+   \begin{center}
+      {\Large\bf Abstract}
+   \end{center}
+% ? End of heading for abstract.
+\end{latexonly}
+
+%  HTML documentation header.
+%  ==========================
+\begin{htmlonly}
+   \xlabel{}
+   \begin{rawhtml} <H1> \end{rawhtml}
+      \stardoctitle\\
+      \stardocversion\\
+      \stardocmanual
+   \begin{rawhtml} </H1> \end{rawhtml}
+
+% ? Add picture here if required.
+% ? End of picture
+
+   \begin{rawhtml} <P> <I> \end{rawhtml}
+   \stardoccategory\ \stardocnumber \\
+   \stardocauthors \\
+   \stardocdate
+   \begin{rawhtml} </I> </P> <H3> \end{rawhtml}
+      \htmladdnormallink{CCLRC}{http://www.cclrc.ac.uk} /
+      \htmladdnormallink{Rutherford Appleton Laboratory}
+                        {http://www.cclrc.ac.uk} \\
+      \htmladdnormallink{Particle Physics \& Astronomy Research Council}
+                        {http://www.pparc.ac.uk} \\
+   \begin{rawhtml} </H3> <H2> \end{rawhtml}
+      \htmladdnormallink{Starlink Project}{http://www.starlink.ac.uk/}
+   \begin{rawhtml} </H2> \end{rawhtml}
+   \htmladdnormallink{\htmladdimg{source.gif} Retrieve hardcopy}
+      {http://www.starlink.ac.uk/cgi-bin/hcserver?\stardocsource}\\
+
+%  HTML document table of contents.
+%  ================================
+%  Add table of contents header and a navigation button to return to this
+%  point in the document (this should always go before the abstract \section).
+  \label{stardoccontents}
+  \begin{rawhtml}
+    <HR>
+    <H2>Contents</H2>
+  \end{rawhtml}
+  \htmladdtonavigation{\htmlref{\htmladdimg{contents_motif.gif}}
+        {stardoccontents}}
+
+% ? New section for abstract if used.
+  \section{\xlabel{abstract}Abstract}
+% ? End of new section for abstract
+\end{htmlonly}
+
+% -----------------------------------------------------------------------------
+% ? Document Abstract. (if used)
+%   ==================
+SLALIB is a library used by writers of positional-astronomy applications.
+Most of the \nroutines\ routines are concerned with astronomical position
+and time,
+but a number have wider trigonometrical, numerical or general applications.
+% ? End of document abstract
+% -----------------------------------------------------------------------------
+% ? Latex document Table of Contents (if used).
+%  ===========================================
+ \newpage
+ \begin{latexonly}
+   \setlength{\parskip}{0mm}
+   \tableofcontents
+   \setlength{\parskip}{\medskipamount}
+   \markright{\stardocname}
+ \end{latexonly}
+% ? End of Latex document table of contents
+% -----------------------------------------------------------------------------
+\newpage
+\renewcommand{\thepage}{\arabic{page}}
+\setcounter{page}{1}
+
+\section{INTRODUCTION}
+\subsection{Purpose}
+SLALIB\footnote{The name isn't an acronym;
+it just stands for ``Subprogram Library~A''.}
+is a library of routines
+intended to make accurate and reliable positional-astronomy
+applications easier to write.
+Most SLALIB routines are concerned with astronomical position and time, but a
+number have wider trigonometrical, numerical or general applications.
+The applications ASTROM, COCO, RV and TPOINT
+all make extensive use of the SLALIB
+routines, as do a number of telescope control systems around the world.
+The SLALIB versions currently in service are written in
+Fortran~77 and run on VAX/VMS, several Unix platforms and PC.
+A proprietary ANSI~C version is also available from the author;  it is
+functionally similar to the Fortran version upon which the present
+document concentrates.
+
+\subsection{Example Application}
+Here is a simple example of an application program written
+using SLALIB calls:
+
+\begin{verbatim}
+         PROGRAM FK4FK5
+   *
+   *  Read a B1950 position from I/O unit 5 and reply on I/O unit 6
+   *  with the J2000 equivalent.  Enter a period to quit.
+   *
+         IMPLICIT NONE
+         CHARACTER C*80,S
+         INTEGER I,J,IHMSF(4),IDMSF(4)
+         DOUBLE PRECISION R4,D4,R5,D5
+         LOGICAL BAD
+
+   *   Loop until a period is entered
+         C = ' '
+         DO WHILE (C(:1).NE.'.')
+
+   *     Read h m s d ' "
+            READ (5,'(A)') C
+            IF (C(:1).NE.'.') THEN
+               BAD = .TRUE.
+
+   *        Decode the RA
+               I = 1
+               CALL sla_DAFIN(C,I,R4,J)
+               IF (J.EQ.0) THEN
+                  R4 = 15D0*R4
+
+   *           Decode the Dec
+                  CALL sla_DAFIN(C,I,D4,J)
+                  IF (J.EQ.0) THEN
+
+   *              FK4 to FK5
+                     CALL sla_FK45Z(R4,D4,1950D0,R5,D5)
+
+   *              Format and output the result
+                     CALL sla_DR2TF(2,R5,S,IHMSF)
+                     CALL sla_DR2AF(1,D5,S,IDMSF)
+                     WRITE (6,
+        :       '(1X,I2.2,2I3.2,''.'',I2.2,2X,A,I2.2,2I3.2,''.'',I1)')
+        :                                                     IHMSF,S,IDMSF
+                     BAD = .FALSE.
+                  END IF
+               END IF
+               IF (BAD) WRITE (6,'(1X,''?'')')
+            END IF
+         END DO
+
+         END
+\end{verbatim}
+In this example, SLALIB not only provides the complicated FK4 to
+FK5 transformation but also
+simplifies the tedious and error-prone tasks
+of decoding and formatting angles
+expressed as hours, minutes {\it etc}.  The
+example incorporates range checking, and avoids the
+notorious ``minus zero'' problem (an often-perpetrated bug where
+declinations between $0^{\circ}$ and $-1^{\circ}$ lose their minus
+sign).
+With a little extra elaboration and a few more calls to SLALIB,
+defaulting can be provided (enabling unused fields to
+be replaced with commas to avoid retyping), proper motions
+can be handled, different epochs can be specified, and
+so on.  See the program COCO (SUN/56) for further ideas.
+
+\subsection{Scope}
+SLALIB contains \nroutines\ routines covering the following topics:
+\begin{itemize}
+\item String Decoding,
+      Sexagesimal Conversions
+\item Angles, Vectors \& Rotation Matrices
+\item Calendars,
+      Time Scales
+\item Precession \& Nutation
+\item Proper Motion
+\item FK4/FK5/Hipparcos,
+      Elliptic Aberration
+\item Geocentric Coordinates
+\item Apparent \& Observed Place
+\item Azimuth \& Elevation
+\item Refraction \& Air Mass
+\item Ecliptic,
+      Galactic,
+      Supergalactic Coordinates
+\item Ephemerides
+\item Astrometry
+\item Numerical Methods
+\end{itemize}
+
+\subsection{Objectives}
+SLALIB was designed to give application programmers
+a basic set of positional-astronomy tools which were
+accurate and easy to use.  To this end, the library is:
+\begin{itemize}
+\item Readily available, including source code and documentation.
+\item Supported and maintained.
+\item Portable -- coded in standard languages and available for
+multiple computers and operating systems.
+\item Thoroughly commented, both for maintainability and to
+assist those wishing to cannibalize the code.
+\item Stable.
+\item Trustworthy -- some care has gone into
+testing SLALIB, both by comparison with published data and
+by checks for internal consistency.
+\item Rigorous -- corners are not cut,
+even where the practical consequences would, as a rule, be
+negligible.
+\item Comprehensive, without including too many esoteric features
+required only by specialists.
+\item Practical -- almost all the routines have been written to
+satisfy real needs encountered during the development of
+real-life applications.
+\item Environment-independent -- the package is
+completely free of pauses, stops, I/O {\it etc}.
+\item Self-contained -- SLALIB calls no other libraries.
+\end{itemize}
+A few {\it caveats}:
+\begin{itemize}
+\item SLALIB does not pretend to be canonical.  It is in essence
+an anthology, and the adopted algorithms are liable
+to change as more up-to-date ones become available.
+\item The functions aren't orthogonal -- there are several
+cases of different
+routines doing similar things, and many examples where
+sequences of SLALIB calls have simply been packaged, all to
+make applications less trouble to write.
+\item There are omissions -- for example there are no
+routines for calculating physical ephemerides of
+Solar-System bodies.
+\item SLALIB is not homogeneous, though important subsets
+(for example the FK4/FK5 routines) are.
+\item The library is not foolproof.  You have to know what
+you are trying to do ({\it e.g.}\ by reading textbooks on positional
+astronomy), and it is the caller's responsibility to supply
+sensible arguments (although enough internal validation is done to
+avoid arithmetic errors).
+\item Without being written in a wasteful
+manner, SLALIB is nonetheless optimized for maintainability
+rather than speed.  In addition, there are many places
+where considerable simplification would be possible if some
+specified amount of accuracy could be sacrificed;  such
+compromises are left to the individual programmer and
+are not allowed to limit SLALIB's value as a source
+of comparison results.
+\end{itemize}
+
+\subsection{Fortran Version}
+The Fortran versions of SLALIB use ANSI Fortran~77 with a few
+commonplace extensions.  Just three out of the \nroutines\ routines require
+platform-specific techniques and accordingly are supplied
+in different forms.
+SLALIB has been implemented on the following platforms:
+VAX/VMS,
+PC (Microsoft Fortran, Linux),
+DECstation (Ultrix),
+DEC Alpha (DEC Unix),
+Sun (SunOS, Solaris),
+Hewlett Packard (HP-UX),
+CONVEX,
+Perkin-Elmer and
+Fujitsu.
+
+\subsection{C Version}
+An ANSI C version of SLALIB is available from the author
+but is not part of the Starlink release.
+The functionality of this (proprietary) C version closely matches
+that of the Starlink Fortran SLALIB, partly for the convenience of
+existing users of the Fortran version, some of whom have in the past
+implemented C ``wrappers''.  The function names
+cannot be the same as the Fortran versions because of potential
+linking problems when
+both forms of the library are present; the C routine which
+is the equivalent of (for example) {\tt SLA\_REFRO} is {\tt slaRefro}.
+The types of arguments follow the Fortran version, except
+that integers are {\tt int} rather than {\tt long} (the one
+exception being
+{\tt slaIntin}, which returns a {\tt long}
+and is supplemented by an additional routine,
+not present in the Fortran SLALIB, called {\tt slaInt2in}, which returns
+an {\tt int}).
+Argument passing is by value
+(except for arrays and strings of course)
+for given arguments and by pointer for returned arguments.
+All the C functions are re-entrant.
+
+The Fortran routines {\tt sla\_GRESID}, {\tt sla\_RANDOM} and
+{\tt sla\_WAIT} have no C counterparts.
+
+Further details of the C version of SLALIB are available
+from the author.  The definitive guide to
+the calling sequences is the file {\tt slalib.h}.
+
+\subsection{Future Versions}
+The homogeneity and ease of use of SLALIB could perhaps be improved
+in the future by turning to object-oriented techniques, in particular
+through the C++ and Java languages.  For example ``celestial
+position'' could be a class and many of the transformations
+could happen automatically.  This requires further study and
+would result in a complete redesign.  Various attempts have been
+made to do this, but none as yet has the author's seal of
+approval.  Furthermore,
+the impact of Fortran~90 has yet to be assessed.  Should compilers
+become widely available, some internal recoding may be worthwhile
+in order to simplify parts of the code.  However, as with C++,
+a redesign of the
+application interfaces will be needed if the capabilities of the
+new language are to be exploited to the full.
+
+\subsection{New Functions}
+In a package like SLALIB it is difficult to know how far to go.  Is it
+enough to provide the primitive operations, or should more
+complicated functions be packaged?  Is it worth encroaching on
+specialist areas, where individual experts have all written their
+own software already?  To what extent should CPU efficiency be
+an issue?  How much support of different numerical precisions is
+required?  And so on.
+
+In practice, almost all the routines in SLALIB are there because they were
+needed for some specific application, and this is likely to remain the
+pattern for any enhancements in the future.
+Suggestions for additional SLALIB routines should be addressed to the
+author.
+
+\subsection{Acknowledgements}
+SLALIB is descended from a package of routines written
+for the AAO 16-bit minicomputers
+in the mid-1970s.  The coming of the VAX
+allowed a much more comprehensive and thorough package
+to be designed for Starlink, especially important
+at a time when the adoption
+of the IAU 1976 resolutions meant that astronomers
+would have to cope with a mixture of reference frames,
+time scales and nomenclature.
+
+Much of the preparatory work on SLALIB was done by
+Althea~Wilkinson of Manchester University.
+During its development,
+Andrew~Murray,
+Catherine~Hohenkerk,
+Andrew~Sinclair,
+Bernard~Yallop
+and
+Brian~Emerson of Her Majesty's Nautical Almanac Office were consulted
+on many occasions; their advice was indispensable.
+I am especially grateful to
+Catherine~Hohenkerk
+for supplying preprints of papers, and test data. A number of
+enhancements to SLALIB were at the suggestion of
+Russell~Owen, University of Washington,
+the late Phil~Hill, St~Andrews University,
+Bill~Vacca, JILA, Boulder and
+Ron~Maddalena, NRAO.
+Mark~Calabretta, CSIRO Radiophysics, Sydney supplied changes to suit Convex.
+I am indebted to Derek~Jones (RGO) for introducing me to the
+``universal variables'' method of calculating orbits.
+
+The first C version of SLALIB was a hand-coded transcription
+of the Starlink Fortran version carried out by
+Steve~Eaton (University of Leeds) in the course of
+MSc work.  This was later
+enhanced by John~Straede (AAO) and Martin~Shepherd (Caltech).
+The current C SLALIB is a complete rewrite by the present author and
+includes a comprehensive validation suite.
+Additional comments on the C version came from Bob~Payne (NRAO) and
+Jeremy~Bailey (AAO).
+
+\section{LINKING}
+
+On Unix systems (Linux, Sun, DEC Alpha {\it etc.}):
+\begin{verse}
+{\tt \%~~f77 progname.o -L/star/lib `sla\_link` -o progname}
+\end{verse}
+(The above assumes that all Starlink directories have been added to
+the {\tt LD\_LIBRARY\_PATH} and {\tt PATH} environment variables
+as described in SUN/202.)
+
+\pagebreak
+
+\section{SUBPROGRAM SPECIFICATIONS}
+%-----------------------------------------------------------------------
+\routine{SLA\_ADDET}{Add E-terms of Aberration}
+{
+ \action{Add the E-terms (elliptic component of annual aberration) to a
+  pre IAU 1976 mean place to conform to the old catalogue convention.}
+ \call{CALL sla\_ADDET (RM, DM, EQ, RC, DC)}
+}
+\args{GIVEN}
+{
+ \spec{RM,DM}{D}{\radec\ without E-terms (radians)} \\
+ \spec{EQ}{D}{Besselian epoch of mean equator and equinox}
+}
+\args{RETURNED}
+{
+ \spec{RC,DC}{D}{\radec\ with E-terms included (radians)}
+}
+\anote{Most star positions from pre-1984 optical catalogues (or
+       obtained by astrometry with respect to such stars) have the
+       E-terms built-in.  If it is necessary to convert a formal mean
+       place (for example a pulsar timing position) to one
+       consistent with such a star catalogue, then the
+       \radec\ should be adjusted using this routine.}
+\aref{{\it Explanatory Supplement to the Astronomical Ephemeris},
+ section 2D, page 48.}
+%-----------------------------------------------------------------------
+\routine{SLA\_AFIN}{Sexagesimal character string to angle}
+{
+ \action{Decode a free-format sexagesimal string (degrees, arcminutes,
+         arcseconds) into a single precision floating point
+         number (radians).}
+ \call{CALL sla\_AFIN (STRING, NSTRT, RESLT, JF)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C*(*)}{string containing deg, arcmin, arcsec fields} \\
+ \spec{NSTRT}{I}{pointer to start of decode (beginning of STRING = 1)}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{advanced past the decoded angle} \\
+ \spec{RESLT}{R}{angle in radians} \\
+ \spec{JF}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em}   0 = OK} \\
+ \spec{}{}{\hspace{0.7em} $+1$ = default, RESLT unchanged (note 2)} \\
+ \spec{}{}{\hspace{0.7em} $-1$ = bad degrees (note 3)} \\
+ \spec{}{}{\hspace{0.7em} $-2$ = bad arcminutes (note 3)} \\
+ \spec{}{}{\hspace{0.7em} $-3$ = bad arcseconds (note 3)} \\
+}
+\goodbreak
+\setlength{\oldspacing}{\topsep}
+\setlength{\topsep}{0.3ex}
+\begin{description}
+ \exampleitem \\ [1.5ex]
+  \begin{tabular}{lll}
+   {\it argument} & {\it before} & {\it after} \\ \\
+   STRING & $'$\verb*#-57 17 44.806  12 34 56.7#$'$ & unchanged \\
+   NSTRT & 1 & 16 ({\it i.e.}\ pointing to 12...) \\
+   RESLT & - & $-1.00000$ \\
+   JF & - & 0
+  \end{tabular}
+\end{description}
+A further call to sla\_AFIN, without adjustment of NSTRT, will
+decode the second angle, \dms{12}{34}{56}{7}.
+\setlength{\topsep}{\oldspacing}
+\notes
+{
+ \begin{enumerate}
+  \item The first three ``fields'' in STRING are degrees, arcminutes,
+   arcseconds, separated by spaces or commas.  The degrees field
+   may be signed, but not the others.  The decoding is carried
+   out by the sla\_DFLTIN routine and is free-format.
+  \item Successive fields may be absent, defaulting to zero.  For
+   zero status, the only combinations allowed are degrees alone,
+   degrees and arcminutes, and all three fields present.  If all
+   three fields are omitted, a status of +1 is returned and RESLT is
+   unchanged.  In all other cases RESLT is changed.
+  \item Range checking:
+   \begin{itemize}
+    \item The degrees field is not range checked.  However, it is
+     expected to be integral unless the other two fields are absent.
+    \item The arcminutes field is expected to be 0-59, and integral if
+     the arcseconds field is present.  If the arcseconds field
+     is absent, the arcminutes is expected to be 0-59.9999...
+    \item The arcseconds field is expected to be 0-59.9999...
+    \item Decoding continues even when a check has failed.  Under these
+     circumstances the field takes the supplied value, defaulting to
+     zero, and the result RESLT is computed and returned.
+   \end{itemize}
+   \item Further fields after the three expected ones are not treated as
+    an error.  The pointer NSTRT is left in the correct state for
+    further decoding with the present routine or with sla\_DFLTIN
+    {\it etc}.  See the example, above.
+   \item If STRING contains hours, minutes, seconds instead of
+    degrees {\it etc},
+    or if the required units are turns (or days) instead of radians,
+    the result RESLT should be multiplied as follows: \\ [1.5ex]
+    \begin{tabular}{lll}
+    {\it for STRING} & {\it to obtain} & {\it multiply RESLT by} \\ \\
+    ${\circ}$~~\raisebox{-0.7ex}{$'$}~~\raisebox{-0.7ex}{$''$}
+     & radians & $1.0$ \\
+    ${\circ}$~~\raisebox{-0.7ex}{$'$}~~\raisebox{-0.7ex}{$''$}
+     & turns & $1/{2 \pi} = 0.1591549430918953358$ \\
+    h m s & radians & $15.0$ \\
+    h m s & days & $15/{2\pi} = 2.3873241463784300365$ \\
+   \end{tabular}
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AIRMAS}{Air Mass}
+{
+ \action{Air mass at given zenith distance (double precision).}
+ \call{D~=~sla\_AIRMAS (ZD)}
+}
+\args{GIVEN}
+{
+ \spec{ZD}{D}{observed zenith distance (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_AIRMAS}{D}{air mass (1 at zenith)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The {\it observed}\/ zenith distance referred to above means
+        ``as affected by refraction''.
+  \item The routine uses Hardie's (1962) polynomial fit to Bemporad's
+        data for the relative air mass, $X$, in units of thickness at the
+        zenith as tabulated by Schoenberg (1929). This is adequate for all
+        normal needs as it is accurate to better than
+        0.1\% up to $X = 6.8$ and better than 1\% up to $X = 10$.
+        Bemporad's tabulated values are unlikely to be trustworthy
+        to such accuracy
+        because of variations in density, pressure and other
+        conditions in the atmosphere from those assumed in his work.
+  \item The sign of the ZD is ignored.
+  \item At zenith distances greater than about $\zeta = 87^{\circ}$ the
+        air mass is held constant to avoid arithmetic overflows.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Hardie, R.H., 1962, in {\it Astronomical Techniques}\,
+        ed. W.A.\ Hiltner, University of Chicago Press, p180.
+  \item Schoenberg, E., 1929, Hdb.\ d.\ Ap.,
+        Berlin, Julius Springer, 2, 268.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_ALTAZ}{Velocities {\it etc.}\ for Altazimuth Mount}
+{
+ \action{Positions, velocities and accelerations for an altazimuth
+         telescope mount that is tracking a star (double precision).}
+ \call{CALL sla\_ALTAZ (\vtop{
+         \hbox{HA, DEC, PHI,}
+         \hbox{AZ, AZD, AZDD, EL, ELD, ELDD, PA, PAD, PADD)}}}
+}
+\args{GIVEN}
+{
+ \spec{HA}{D}{hour angle} \\
+ \spec{DEC}{D}{declination} \\
+ \spec{PHI}{D}{observatory latitude}
+}
+\args{RETURNED}
+{
+ \spec{AZ}{D}{azimuth} \\
+ \spec{AZD}{D}{azimuth velocity} \\
+ \spec{AZDD}{D}{azimuth acceleration} \\
+ \spec{EL}{D}{elevation} \\
+ \spec{ELD}{D}{elevation velocity} \\
+ \spec{ELDD}{D}{elevation acceleration} \\
+ \spec{PA}{D}{parallactic angle} \\
+ \spec{PAD}{D}{parallactic angle velocity} \\
+ \spec{PADD}{D}{parallactic angle acceleration}
+}
+\notes
+{
+ \begin{enumerate}
+  \setlength{\parskip}{\medskipamount}
+  \item Natural units are used throughout.  HA, DEC, PHI, AZ, EL
+        and ZD are in radians.  The velocities and accelerations
+        assume constant declination and constant rate of change of
+        hour angle (as for tracking a star);  the units of AZD, ELD
+        and PAD are radians per radian of HA, while the units of AZDD,
+        ELDD and PADD are radians per radian of HA squared.  To
+        convert into practical degree- and second-based units:
+
+        \begin{center}
+        \begin{tabular}{rlcl}
+                  angles & $\times 360/2\pi$ & $\rightarrow$ & degrees \\
+              velocities & $\times (2\pi/86400) \times (360/2\pi)$
+                                             & $\rightarrow$ & degree/sec \\
+           accelerations & $\times (2\pi/86400)^2 \times (360/2\pi)$
+                                             & $\rightarrow$ & degree/sec/sec \\
+        \end{tabular}
+        \end{center}
+
+        Note that the seconds here are sidereal rather than SI.  One
+        sidereal second is about 0.99727 SI seconds.
+
+        The velocity and acceleration factors assume the sidereal
+        tracking case.  Their respective numerical values are (exactly)
+        1/240 and (approximately) 1/3300236.9.
+  \item Azimuth is returned in the range $[\,0,2\pi\,]$;  north is zero,
+        and east is $+\pi/2$.  Elevation and parallactic angle are
+        returned in the range $\pm\pi$.  Position angle is +ve
+        for a star west of the meridian and is the angle NP--star--zenith.
+  \item The latitude is geodetic as opposed to geocentric.  The
+        hour angle and declination are topocentric.  Refraction and
+        deficiencies in the telescope mounting are ignored.  The
+        purpose of the routine is to give the general form of the
+        quantities.  The details of a real telescope could profoundly
+        change the results, especially close to the zenith.
+  \item No range checking of arguments is carried out.
+  \item In applications which involve many such calculations, rather
+        than calling the present routine it will be more efficient to
+        use inline code, having previously computed fixed terms such
+        as sine and cosine of latitude, and (for tracking a star)
+        sine and cosine of declination.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AMP}{Apparent to Mean}
+{
+ \action{Convert star \radec\ from geocentric apparent to
+         mean place (post IAU 1976).}
+ \call{CALL sla\_AMP (RA, DA, DATE, EQ, RM, DM)}
+}
+\args{GIVEN}
+{
+ \spec{RA,DA}{D}{apparent \radec\ (radians)} \\
+ \spec{DATE}{D}{TDB for apparent place (JD$-$2400000.5)} \\
+ \spec{EQ}{D}{equinox:  Julian epoch of mean place}
+}
+\args{RETURNED}
+{
+ \spec{RM,DM}{D}{mean \radec\ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The distinction between the required TDB and TT is
+        always negligible.  Moreover, for all but the most
+        critical applications UTC is adequate.
+  \item Iterative techniques are used for the aberration and
+        light deflection corrections so that the routines
+        sla\_AMP (or sla\_AMPQK) and sla\_MAP (or sla\_MAPQK) are
+        accurate inverses;  even at the edge of the Sun's disc
+        the discrepancy is only about 1~nanoarcsecond.
+  \item Where multiple apparent places are to be converted to
+        mean places, for a fixed date and equinox, it is more
+        efficient to use the sla\_MAPPA routine to compute the
+        required parameters once, followed by one call to
+        sla\_AMPQK per star.
+  \item For EQ=2000D0,
+        the agreement with ICRS sub-mas, limited by the
+        precession-nutation model (IAU 1976 precession, Shirai \&
+        Fukushima 2001 forced nutation and precession corrections).
+  \item The accuracy is further limited by the routine sla\_EVP, called
+        by sla\_MAPPA, which computes the Earth position and
+        velocity using the methods of Stumpff.  The maximum
+        error is about 0.3~milliarcsecond.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AMPQK}{Quick Apparent to Mean}
+{
+ \action{Convert star \radec\ from geocentric apparent to mean place
+         (post IAU 1976).  Use of this routine is appropriate when
+         efficiency is important and where many star positions are
+         all to be transformed for one epoch and equinox.  The
+         star-independent parameters can be obtained by calling
+         the sla\_MAPPA routine.}
+ \call{CALL sla\_AMPQK (RA, DA, AMPRMS, RM, DM)}
+}
+\args{GIVEN}
+{
+ \spec{RA,DA}{D}{apparent \radec\ (radians)} \\
+ \spec{AMPRMS}{D(21)}{star-independent mean-to-apparent parameters:} \\
+ \specel   {(1)}     {time interval for proper motion (Julian years)} \\
+ \specel   {(2-4)}   {barycentric position of the Earth (AU)} \\
+ \specel   {(5-7)}   {heliocentric direction of the Earth (unit vector)} \\
+ \specel   {(8)}     {(gravitational radius of
+                      Sun)$\times 2 / $(Sun-Earth distance)} \\
+ \specel   {(9-11)}  {{\bf v}: barycentric Earth velocity in units of c} \\
+ \specel   {(12)}    {$\sqrt{1-\left|\mbox{\bf v}\right|^2}$} \\
+ \specel   {(13-21)} {precession-nutation $3\times3$ matrix}
+}
+\args{RETURNED}
+{
+ \spec{RM,DM}{D}{mean \radec\ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Iterative techniques are used for the aberration and
+        light deflection corrections so that the routines
+        sla\_AMP (or sla\_AMPQK) and sla\_MAP (or sla\_MAPQK) are
+        accurate inverses;  even at the edge of the Sun's disc
+        the discrepancy is only about 1~nanoarcsecond.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AOP}{Apparent to Observed}
+{
+ \action{Apparent to observed place, for sources distant from
+         the solar system.}
+ \call{CALL sla\_AOP (\vtop{
+         \hbox{RAP, DAP, DATE, DUT, ELONGM, PHIM, HM, XP, YP,}
+         \hbox{TDK, PMB, RH, WL, TLR, AOB, ZOB, HOB, DOB, ROB)}}}
+}
+\args{GIVEN}
+{
+ \spec{RAP,DAP}{D}{geocentric apparent \radec\ (radians)} \\
+ \spec{DATE}{D}{UTC date/time (Modified Julian Date, JD$-$2400000.5)} \\
+ \spec{DUT}{D}{$\Delta$UT:  UT1$-$UTC (UTC seconds)} \\
+ \spec{ELONGM}{D}{observer's mean longitude (radians, east +ve)} \\
+ \spec{PHIM}{D}{observer's mean geodetic latitude (radians)} \\
+ \spec{HM}{D}{observer's height above sea level (metres)} \\
+ \spec{XP,YP}{D}{polar motion \xy\ coordinates (radians)} \\
+ \spec{TDK}{D}{local ambient temperature (K; std=273.15D0)} \\
+ \spec{PMB}{D}{local atmospheric pressure (mb; std=1013.25D0)} \\
+ \spec{RH}{D}{local relative humidity (in the range 0D0\,--\,1D0)} \\
+ \spec{WL}{D}{effective wavelength ($\mu{\rm m}$, {\it e.g.}\ 0.55D0)} \\
+ \spec{TLR}{D}{tropospheric lapse rate (K per metre,
+                                              {\it e.g.}\ 0.0065D0)}
+}
+\args{RETURNED}
+{
+ \spec{AOB}{D}{observed azimuth (radians: N=0, E=$90^{\circ}$)} \\
+ \spec{ZOB}{D}{observed zenith distance (radians)} \\
+ \spec{HOB}{D}{observed Hour Angle (radians)} \\
+ \spec{DOB}{D}{observed $\delta$ (radians)} \\
+ \spec{ROB}{D}{observed $\alpha$ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine returns zenith distance rather than elevation
+        in order to reflect the fact that no allowance is made for
+        depression of the horizon.
+  \item The accuracy of the result is limited by the corrections for
+        refraction.  Providing the meteorological parameters are
+        known accurately and there are no gross local effects, the
+        predicted azimuth and elevation should be within about
+        \arcsec{0}{1} for $\zeta<70^{\circ}$.  Even
+        at a topocentric zenith distance of
+        $90^{\circ}$, the accuracy in elevation should be better than
+        1~arcminute;  useful results are available for a further
+        $3^{\circ}$, beyond which the sla\_REFRO routine returns a
+        fixed value of the refraction.  The complementary
+        routines sla\_AOP (or sla\_AOPQK) and sla\_OAP (or sla\_OAPQK)
+        are self-consistent to better than 1~microarcsecond all over
+        the celestial sphere.
+  \item It is advisable to take great care with units, as even
+        unlikely values of the input parameters are accepted and
+        processed in accordance with the models used.
+  \item {\it Apparent}\/ \radec\ means the geocentric apparent
+        right ascension
+        and declination, which is obtained from a catalogue mean place
+        by allowing for space motion, parallax, the Sun's gravitational
+        lens effect, annual aberration, and precession-nutation.  For
+        star positions in the FK5 system ({\it i.e.}\ J2000), these
+        effects can
+        be applied by means of the sla\_MAP {\it etc.}\ routines.
+        Starting from
+        other mean place systems, additional transformations will be
+        needed;  for example, FK4 ({\it i.e.}\ B1950) mean places would
+        first have to be converted to FK5, which can be done with the
+        sla\_FK425 {\it etc.}\ routines.
+  \item {\it Observed}\/ \azel\ means the position that would be seen by a
+        perfect theodolite located at the observer.  This is obtained
+        from the geocentric apparent \radec\ by allowing for Earth
+        orientation and diurnal aberration, rotating from equator
+        to horizon coordinates, and then adjusting for refraction.
+        The \hadec\ is obtained by rotating back into equatorial
+        coordinates, using the geodetic latitude corrected for polar
+        motion, and is the position that would be seen by a perfect
+        equatorial located at the observer and with its polar axis
+        aligned to the Earth's axis of rotation ({\it n.b.}\ not to the
+        refracted pole).  Finally, the $\alpha$ is obtained by subtracting
+        the {\it h}\/ from the local apparent ST.
+  \item To predict the required setting of a real telescope, the
+        observed place produced by this routine would have to be
+        adjusted for the tilt of the azimuth or polar axis of the
+        mounting (with appropriate corrections for mount flexures),
+        for non-perpendicularity between the mounting axes, for the
+        position of the rotator axis and the pointing axis relative
+        to it, for tube flexure, for gear and encoder errors, and
+        finally for encoder zero points.  Some telescopes would, of
+        course, exhibit other properties which would need to be
+        accounted for at the appropriate point in the sequence.
+  \item This routine takes time to execute, due mainly to the
+        rigorous integration used to evaluate the refraction.
+        For processing multiple stars for one location and time,
+        call sla\_AOPPA once followed by one call per star to sla\_AOPQK.
+        Where a range of times within a limited period of a few hours
+        is involved, and the highest precision is not required, call
+        sla\_AOPPA once, followed by a call to sla\_AOPPAT each time the
+        time changes, followed by one call per star to sla\_AOPQK.
+  \item The DATE argument is UTC expressed as an MJD.  This is,
+        strictly speaking, wrong, because of leap seconds.  However,
+        as long as the $\Delta$UT and the UTC are consistent there
+        are no difficulties, except during a leap second.  In this
+        case, the start of the 61st second of the final minute should
+        begin a new MJD day and the old pre-leap $\Delta$UT should
+        continue to be used.  As the 61st second completes, the MJD
+        should revert to the start of the day as, simultaneously,
+        the $\Delta$UT changes by one second to its post-leap new value.
+  \item The $\Delta$UT (UT1$-$UTC) is tabulated in IERS circulars and
+        elsewhere.  It increases by exactly one second at the end of
+        each UTC leap second, introduced in order to keep $\Delta$UT
+        within $\pm$\tsec{0}{9}.
+  \item IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION.  The
+        longitude required by the present routine is {\bf east-positive},
+        in accordance with geographical convention (and right-handed).
+        In particular, note that the longitudes returned by the
+        sla\_OBS routine are west-positive (as in the {\it Astronomical
+        Almanac}\/ before 1984) and must be reversed in sign before use
+        in the present routine.
+  \item The polar coordinates XP,YP can be obtained from IERS
+        circulars and equivalent publications.  The
+        maximum amplitude is about \arcsec{0}{3}.  If XP,YP values
+        are unavailable, use XP=YP=0D0.  See page B60 of the 1988
+        {\it Astronomical Almanac}\/ for a definition of the two angles.
+  \item The height above sea level of the observing station, HM,
+        can be obtained from the {\it Astronomical Almanac}\/ (Section J
+        in the 1988 edition), or via the routine sla\_OBS.  If P,
+        the pressure in millibars, is available, an adequate
+        estimate of HM can be obtained from the following expression:
+        \begin{quote}
+         {\tt HM=-29.3D0*TSL*LOG(P/1013.25D0)}
+        \end{quote}
+        where TSL is the approximate sea-level air temperature in K
+        (see {\it Astrophysical Quantities}, C.W.Allen, 3rd~edition,
+        \S 52).  Similarly, if the pressure P is not known,
+        it can be estimated from the height of the observing
+        station, HM as follows:
+        \begin{quote}
+         {\tt P=1013.25D0*EXP(-HM/(29.3D0*TSL))}
+        \end{quote}
+        Note, however, that the refraction is nearly proportional to the
+        pressure and that an accurate P value is important for
+        precise work.
+  \item The azimuths {\it etc.}\ used by the present routine are with
+        respect to the celestial pole.  Corrections to the terrestrial pole
+        can be computed using sla\_POLMO.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AOPPA}{Appt-to-Obs Parameters}
+{
+ \action{Pre-compute the set of apparent to observed place parameters
+         required by the ``quick'' routines sla\_AOPQK and sla\_OAPQK.}
+ \call{CALL sla\_AOPPA (\vtop{
+          \hbox{DATE, DUT, ELONGM, PHIM, HM, XP, YP,}
+          \hbox{TDK, PMB, RH, WL, TLR, AOPRMS)}}}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{UTC date/time (Modified Julian Date, JD$-$2400000.5)} \\
+ \spec{DUT}{D}{$\Delta$UT:  UT1$-$UTC (UTC seconds)} \\
+ \spec{ELONGM}{D}{observer's mean longitude (radians, east +ve)} \\
+ \spec{PHIM}{D}{observer's mean geodetic latitude (radians)} \\
+ \spec{HM}{D}{observer's height above sea level (metres)} \\
+ \spec{XP,YP}{D}{polar motion \xy\ coordinates (radians)} \\
+ \spec{TDK}{D}{local ambient temperature (K; std=273.15D0)} \\
+ \spec{PMB}{D}{local atmospheric pressure (mb; std=1013.25D0)} \\
+ \spec{RH}{D}{local relative humidity (in the range 0D0\,--\,1D0)} \\
+ \spec{WL}{D}{effective wavelength ($\mu{\rm m}$, {\it e.g.}\ 0.55D0)} \\
+ \spec{TLR}{D}{tropospheric lapse rate (K per metre,
+                                              {\it e.g.}\ 0.0065D0)}
+}
+\args{RETURNED}
+{
+ \spec{AOPRMS}{D(14)}{star-independent apparent-to-observed parameters:} \\
+ \specel   {(1)}     {geodetic latitude (radians)} \\
+ \specel   {(2,3)}   {sine and cosine of geodetic latitude} \\
+ \specel   {(4)}     {magnitude of diurnal aberration vector} \\
+ \specel   {(5)}     {height (HM)} \\
+ \specel   {(6)}     {ambient temperature (TDK)} \\
+ \specel   {(7)}     {pressure (PMB)} \\
+ \specel   {(8)}     {relative humidity (RH)} \\
+ \specel   {(9)}     {wavelength (WL)} \\
+ \specel   {(10)}    {lapse rate (TLR)} \\
+ \specel   {(11,12)} {refraction constants A and B (radians)} \\
+ \specel   {(13)}    {longitude + eqn of equinoxes +
+                       ``sidereal $\Delta$UT'' (radians)} \\
+ \specel   {(14)}    {local apparent sidereal time (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item It is advisable to take great care with units, as even
+        unlikely values of the input parameters are accepted and
+        processed in accordance with the models used.
+  \item The DATE argument is UTC expressed as an MJD.  This is,
+        strictly speaking, wrong, because of leap seconds.  However,
+        as long as the $\Delta$UT and the UTC are consistent there
+        are no difficulties, except during a leap second.  In this
+        case, the start of the 61st second of the final minute should
+        begin a new MJD day and the old pre-leap $\Delta$UT should
+        continue to be used.  As the 61st second completes, the MJD
+        should revert to the start of the day as, simultaneously,
+        the $\Delta$UT changes by one second to its post-leap new value.
+  \item The $\Delta$UT (UT1$-$UTC) is tabulated in IERS circulars and
+        elsewhere.  It increases by exactly one second at the end of
+        each UTC leap second, introduced in order to keep $\Delta$UT
+        within $\pm$\tsec{0}{9}.  The ``sidereal $\Delta$UT'' which forms
+        part of AOPRMS(13) is the same quantity, but converted from solar
+        to sidereal seconds and expressed in radians.
+  \item IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION.  The
+        longitude required by the present routine is {\bf east-positive},
+        in accordance with geographical convention (and right-handed).
+        In particular, note that the longitudes returned by the
+        sla\_OBS routine are west-positive (as in the {\it Astronomical
+        Almanac}\/ before 1984) and must be reversed in sign before use in
+        the present routine.
+  \item The polar coordinates XP,YP can be obtained from IERS
+        circulars and equivalent publications.  The
+        maximum amplitude is about \arcsec{0}{3}.  If XP,YP values
+        are unavailable, use XP=YP=0D0.  See page B60 of the 1988
+        {\it Astronomical Almanac}\/ for a definition of the two angles.
+  \item The height above sea level of the observing station, HM,
+        can be obtained from the {\it Astronomical Almanac}\/ (Section J
+        in the 1988 edition), or via the routine sla\_OBS.  If P,
+        the pressure in millibars, is available, an adequate
+        estimate of HM can be obtained from the following expression:
+        \begin{quote}
+         {\tt HM=-29.3D0*TSL*LOG(P/1013.25D0)}
+        \end{quote}
+        where TSL is the approximate sea-level air temperature in K
+        (see {\it Astrophysical Quantities}, C.W.Allen, 3rd~edition,
+        \S 52).  Similarly, if the pressure P is not known,
+        it can be estimated from the height of the observing
+        station, HM as follows:
+        \begin{quote}
+         {\tt P=1013.25D0*EXP(-HM/(29.3D0*TSL))}
+        \end{quote}
+        Note, however, that the refraction is nearly proportional to the
+        pressure and that an accurate P value is important for
+        precise work.
+  \item Repeated, computationally-expensive, calls to sla\_AOPPA for
+        times that are very close together can be avoided by calling
+        sla\_AOPPA just once and then using sla\_AOPPAT for the subsequent
+        times.  Fresh calls to sla\_AOPPA will be needed only when changes
+        in the precession have grown to unacceptable levels or when
+        anything affecting the refraction has changed.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AOPPAT}{Update Appt-to-Obs Parameters}
+{
+ \action{Recompute the sidereal time in the apparent to observed place
+         star-independent parameter block.}
+ \call{CALL sla\_AOPPAT (DATE, AOPRMS)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{UTC date/time (Modified Julian Date, JD$-$2400000.5)} \\
+ \spec{AOPRMS}{D(14)}{star-independent apparent-to-observed parameters:} \\
+ \specel{(1-12)}{not required} \\
+ \specel{(13)}{longitude + eqn of equinoxes +
+               ``sidereal $\Delta$UT'' (radians)} \\
+ \specel{(14)}{not required}
+}
+\args{RETURNED}
+{
+ \spec{AOPRMS}{D(14)}{star-independent apparent-to-observed parameters:} \\
+ \specel{(1-13)}{not changed} \\
+ \specel{(14)}{local apparent sidereal time (radians)}
+}
+\anote{For more information, see sla\_AOPPA.}
+%-----------------------------------------------------------------------
+\routine{SLA\_AOPQK}{Quick Appt-to-Observed}
+{
+ \action{Quick apparent to observed place (but see Note~8, below).}
+ \call{CALL sla\_AOPQK (RAP, DAP, AOPRMS, AOB, ZOB, HOB, DOB, ROB)}
+}
+\args{GIVEN}
+{
+ \spec{RAP,DAP}{D}{geocentric apparent \radec\ (radians)} \\
+ \spec{AOPRMS}{D(14)}{star-independent apparent-to-observed parameters:} \\
+ \specel{(1)}{geodetic latitude (radians)} \\
+ \specel{(2,3)}{sine and cosine of geodetic latitude} \\
+ \specel{(4)}{magnitude of diurnal aberration vector} \\
+ \specel{(5)}{height (metres)} \\
+ \specel{(6)}{ambient temperature (K)} \\
+ \specel{(7)}{pressure (mb)} \\
+ \specel{(8)}{relative humidity (0\,--\,1)} \\
+ \specel{(9)}{wavelength ($\mu{\rm m}$)} \\
+ \specel{(10)}{lapse rate (K per metre)} \\
+ \specel{(11,12)}{refraction constants A and B (radians)} \\
+ \specel{(13)}{longitude + eqn of equinoxes +
+               ``sidereal $\Delta$UT'' (radians)} \\
+ \specel{(14)}{local apparent sidereal time (radians)}
+}
+\args{RETURNED}
+{
+ \spec{AOB}{D}{observed azimuth (radians: N=0, E=$90^{\circ}$)} \\
+ \spec{ZOB}{D}{observed zenith distance (radians)} \\
+ \spec{HOB}{D}{observed Hour Angle (radians)} \\
+ \spec{DOB}{D}{observed Declination (radians)} \\
+ \spec{ROB}{D}{observed Right Ascension (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine returns zenith distance rather than elevation
+        in order to reflect the fact that no allowance is made for
+        depression of the horizon.
+  \item The accuracy of the result is limited by the corrections for
+        refraction.  Providing the meteorological parameters are
+        known accurately and there are no gross local effects, the
+        predicted azimuth and elevation should be within about
+        \arcsec{0}{1} for $\zeta<70^{\circ}$.  Even
+        at a topocentric zenith distance of
+        $90^{\circ}$, the accuracy in elevation should be better than
+        1~arcminute;  useful results are available for a further
+        $3^{\circ}$, beyond which the sla\_REFRO routine returns a
+        fixed value of the refraction.  The complementary
+        routines sla\_AOP (or sla\_AOPQK) and sla\_OAP (or sla\_OAPQK)
+        are self-consistent to better than 1~microarcsecond all over
+        the celestial sphere.
+  \item It is advisable to take great care with units, as even
+        unlikely values of the input parameters are accepted and
+        processed in accordance with the models used.
+  \item {\it Apparent}\/ \radec\ means the geocentric apparent right ascension
+        and declination, which is obtained from a catalogue mean place
+        by allowing for space motion, parallax, the Sun's gravitational
+        lens effect, annual aberration and precession-nutation.  For
+        star positions in the FK5 system ({\it i.e.}\ J2000), these effects can
+        be applied by means of the sla\_MAP {\it etc.}\ routines.  Starting from
+        other mean place systems, additional transformations will be
+        needed;  for example, FK4 ({\it i.e.}\ B1950) mean places would first
+        have to be converted to FK5, which can be done with the
+        sla\_FK425 {\it etc.}\ routines.
+  \item {\it Observed}\/ \azel\ means the position that would be seen by a
+        perfect theodolite located at the observer.  This is obtained
+        from the geocentric apparent \radec\ by allowing for Earth
+        orientation and diurnal aberration, rotating from equator
+        to horizon coordinates, and then adjusting for refraction.
+        The \hadec\ is obtained by rotating back into equatorial
+        coordinates, using the geodetic latitude corrected for polar
+        motion, and is the position that would be seen by a perfect
+        equatorial located at the observer and with its polar axis
+        aligned to the Earth's axis of rotation ({\it n.b.}\ not to the
+        refracted pole).  Finally, the $\alpha$ is obtained by subtracting
+        the {\it h}\/ from the local apparent ST.
+  \item To predict the required setting of a real telescope, the
+        observed place produced by this routine would have to be
+        adjusted for the tilt of the azimuth or polar axis of the
+        mounting (with appropriate corrections for mount flexures),
+        for non-perpendicularity between the mounting axes, for the
+        position of the rotator axis and the pointing axis relative
+        to it, for tube flexure, for gear and encoder errors, and
+        finally for encoder zero points.  Some telescopes would, of
+        course, exhibit other properties which would need to be
+        accounted for at the appropriate point in the sequence.
+  \item The star-independent apparent-to-observed-place parameters
+        in AOPRMS may be computed by means of the sla\_AOPPA routine.
+        If nothing has changed significantly except the time, the
+        sla\_AOPPAT routine may be used to perform the requisite
+        partial recomputation of AOPRMS.
+  \item At zenith distances beyond about $76^\circ$, the need for
+        special care with the corrections for refraction causes a
+        marked increase in execution time.  Moreover, the effect
+        gets worse with increasing zenith distance.  Adroit
+        programming in the calling application may allow the
+        problem to be reduced.  Prepare an alternative AOPRMS array,
+        computed for zero air-pressure;  this will disable the
+        refraction corrections and cause rapid execution.  Using
+        this AOPRMS array, a preliminary call to the present routine
+        will, depending on the application, produce a rough position
+        which may be enough to establish whether the full, slow
+        calculation (using the real AOPRMS array) is worthwhile.
+        For example, there would be no need for the full calculation
+        if the preliminary call had already established that the
+        source was well below the elevation limits for a particular
+        telescope.
+  \item The azimuths {\it etc.}\ used by the present routine are with
+        respect to the celestial pole.  Corrections to the terrestrial pole
+        can be computed using sla\_POLMO.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_ATMDSP}{Atmospheric Dispersion}
+{
+ \action{Apply atmospheric-dispersion adjustments to refraction coefficients.}
+ \call{CALL sla\_ATMDSP (TDK, PMB, RH, WL1, A1, B1, WL2, A2, B2)}
+}
+\args{GIVEN}
+{
+ \spec{TDK}{D}{ambient temperature at the observer (K)} \\
+ \spec{PMB}{D}{pressure at the observer (mb)} \\
+ \spec{RH}{D}{relative humidity at the observer (range 0\,--\,1)} \\
+ \spec{WL1}{D}{base wavelength ($\mu{\rm m}$)} \\
+ \spec{A1}{D}{refraction coefficient A for wavelength WL1 (radians)} \\
+ \spec{B1}{D}{refraction coefficient B for wavelength WL1 (radians)} \\
+ \spec{WL2}{D}{wavelength for which adjusted A,B required ($\mu{\rm m}$)}
+}
+\args{RETURNED}
+{
+ \spec{A2}{D}{refraction coefficient A for wavelength WL2 (radians)} \\
+ \spec{B2}{D}{refraction coefficient B for wavelength WL2 (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item To use this routine, first call sla\_REFCO specifying WL1 as the
+        wavelength.  This yields refraction coefficients A1, B1, correct
+        for that wavelength.  Subsequently, calls to sla\_ATMDSP specifying
+        different wavelengths will produce new, slightly adjusted
+        refraction coefficients A2, B2, which apply to the specified wavelength.
+  \item Most of the atmospheric dispersion happens between $0.7\,\mu{\rm m}$
+        and the UV atmospheric cutoff, and the effect increases strongly
+        towards the UV end.  For this reason a blue reference wavelength
+        is recommended, for example $0.4\,\mu{\rm m}$.
+  \item The accuracy, for this set of conditions: \\[1pc]
+   \hspace*{5ex} \begin{tabular}{rcl}
+        height above sea level & ~ & 2000\,m \\
+                      latitude & ~ & $29^\circ$ \\
+                      pressure & ~ & 793\,mb \\
+                   temperature & ~ & $290^\circ$\,K \\
+                      humidity & ~ & 0.5 (50\%) \\
+                    lapse rate & ~ & $0.0065^\circ m^{-1}$ \\
+          reference wavelength & ~ & $0.4\,\mu{\rm m}$ \\
+                star elevation & ~ & $15^\circ$ \\
+                  \end{tabular}\\[1pc]
+        is about 2.5\,mas RMS between 0.3 and $1.0\,\mu{\rm m}$, and stays
+        within 4\,mas for the whole range longward of $0.3\,\mu{\rm m}$
+        (compared with a total dispersion from 0.3 to $20\,\mu{\rm m}$
+        of about \arcseci{11}).  These errors are typical for ordinary
+        conditions;  in extreme conditions values a few times this size
+        may occur.
+  \item If either wavelength exceeds $100\,\mu{\rm m}$, the radio case
+        is assumed and the returned refraction coefficients are the
+        same as the given ones. Note that radio refraction coefficients
+        cannot be turned into optical values using this routine, nor
+        vice versa.
+  \item The algorithm consists of calculation of the refractivity of the
+        air at the observer for the two wavelengths, using the methods
+        of the sla\_REFRO routine, and then scaling of the two refraction
+        coefficients according to classical refraction theory.  This
+        amounts to scaling the A coefficient in proportion to $(\mu-1)$ and
+        the B coefficient almost in the same ratio (see R.M.Green,
+        {\it Spherical Astronomy,}\/ Cambridge University Press, 1985).
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_AV2M}{Rotation Matrix from Axial Vector}
+{
+ \action{Form the rotation matrix corresponding to a given axial vector
+         (single precision).}
+ \call{CALL sla\_AV2M (AXVEC, RMAT)}
+}
+\args{GIVEN}
+{
+ \spec{AXVEC}{R(3)}{axial vector (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RMAT}{R(3,3)}{rotation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A rotation matrix describes a rotation about some
+        arbitrary axis, called the Euler axis.  The
+        {\it axial vector} supplied to this routine
+        has the same direction as the Euler axis, and its
+        magnitude is the amount of rotation in radians.
+  \item If AXVEC is null, the unit matrix is returned.
+  \item The reference frame rotates clockwise as seen looking along
+        the axial vector from the origin.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_BEAR}{Direction Between Points on a Sphere}
+{
+ \action{Returns the bearing (position angle) of one point on a
+         sphere seen from another (single precision).}
+ \call{R~=~sla\_BEAR (A1, B1, A2, B2)}
+}
+\args{GIVEN}
+{
+ \spec{A1,B1}{R}{spherical coordinates of one point} \\
+ \spec{A2,B2}{R}{spherical coordinates of the other point}
+}
+\args{RETURNED}
+{
+ \spec{sla\_BEAR}{R}{bearing from first point to second}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The spherical coordinates are \radec,
+       $[\lambda,\phi]$ {\it etc.}, in radians.
+ \item The result is the bearing (position angle), in radians,
+       of point [A2,B2] as seen
+       from point [A1,B1].  It is in the range $\pm \pi$.  The sense
+       is such that if [A2,B2]
+       is a small distance due east of [A1,B1] the result
+       is about $+\pi/2$. Zero is returned
+       if the two points are coincident.
+ \item If either B-coordinate is outside the range $\pm\pi/2$, the
+       result may correspond to ``the long way round''.
+ \item The routine sla\_PAV performs an equivalent function except
+       that the points are specified in the form of Cartesian unit
+       vectors.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CAF2R}{Deg,Arcmin,Arcsec to Radians}
+{
+ \action{Convert degrees, arcminutes, arcseconds to radians
+         (single precision).}
+ \call{CALL sla\_CAF2R (IDEG, IAMIN, ASEC, RAD, J)}
+}
+\args{GIVEN}
+{
+ \spec{IDEG}{I}{degrees} \\
+ \spec{IAMIN}{I}{arcminutes} \\
+ \spec{ASEC}{R}{arcseconds}
+}
+\args{RETURNED}
+{
+ \spec{RAD}{R}{angle in radians} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 1 = IDEG outside range 0$-$359} \\
+ \spec{}{}{\hspace{1.5em} 2 = IAMIN outside range 0$-$59} \\
+ \spec{}{}{\hspace{1.5em} 3 = ASEC outside range 0$-$59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CALDJ}{Calendar Date to MJD}
+{
+ \action{Gregorian Calendar to Modified Julian Date, with century default.}
+ \call{CALL sla\_CALDJ (IY, IM, ID, DJM, J)}
+}
+\args{GIVEN}
+{
+ \spec{IY,IM,ID}{I}{year, month, day in Gregorian calendar}
+}
+\args{RETURNED}
+{
+ \spec{DJM}{D}{modified Julian Date (JD$-$2400000.5) for $0^{\rm h}$} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = bad year   (MJD not computed)} \\
+ \spec{}{}{\hspace{1.5em} 2 = bad month  (MJD not computed)} \\
+ \spec{}{}{\hspace{1.5em} 3 = bad day    (MJD computed)} \\
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine supports the {\it century default}\/ feature.
+        Acceptable years are:
+        \begin{itemize}
+         \item 00-49, interpreted as 2000\,--\,2049,
+         \item 50-99, interpreted as 1950\,--\,1999, and
+         \item 100 upwards, interpreted literally.
+        \end{itemize}
+        For 1-100AD use the routine sla\_CLDJ instead.
+  \item For year $n$BC use IY = $-(n-1)$.
+  \item When an invalid year or month is supplied (status J~=~1~or~2)
+        the MJD is {\bf not} computed.  When an invalid day is supplied
+        (status J~=~3) the MJD {\bf is} computed.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CALYD}{Calendar to Year, Day}
+{
+ \action{Gregorian calendar date to year and day in year, in a Julian
+         calendar aligned to the 20th/21st century Gregorian calendar,
+         with century default.}
+ \call{CALL sla\_CALYD (IY, IM, ID, NY, ND, J)}
+}
+\args{GIVEN}
+{
+ \spec{IY,IM,ID}{I}{year, month, day in Gregorian calendar:
+                    year may optionally omit the century}
+}
+\args{RETURNED}
+{
+ \spec{NY}{I}{year (re-aligned Julian calendar)} \\
+ \spec{ND}{I}{day in year (1 = January 1st)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em}  0 = OK} \\
+ \spec{}{}{\hspace{1.5em}  1 = bad year (before $-4711$)} \\
+ \spec{}{}{\hspace{1.5em}  2 = bad month} \\
+ \spec{}{}{\hspace{1.5em}  3 = bad day}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine supports the {\it century default}\/ feature.
+        Acceptable years are:
+        \begin{itemize}
+         \item 00-49, interpreted as 2000\,--\,2049,
+         \item 50-99, interpreted as 1950\,--\,1999, and
+         \item other years after $-4712$, interpreted literally.
+        \end{itemize}
+        Use sla\_CLYD for years before 100AD.
+  \item The purpose of sla\_CALDJ is to support
+        sla\_EARTH, sla\_MOON and sla\_ECOR.
+  \item Between 1900~March~1 and 2100~February~28 it returns answers
+        which are consistent with the ordinary Gregorian calendar.
+        Outside this range there will be a discrepancy which increases
+        by one day for every non-leap century year.
+  \item When an invalid year or month is supplied (status J~=~1 or J~=~2)
+        the results are {\bf not} computed.  When a day is
+        supplied which is outside the conventional range (status J~=~3)
+        the results {\bf are} computed.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CC2S}{Cartesian to Spherical}
+{
+ \action{Cartesian coordinates to spherical coordinates (single precision).}
+ \call{CALL sla\_CC2S (V, A, B)}
+}
+\args{GIVEN}
+{
+ \spec{V}{R(3)}{\xyz\ vector}
+}
+\args{RETURNED}
+{
+ \spec{A,B}{R}{spherical coordinates in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The spherical coordinates are longitude (+ve anticlockwise
+        looking from the +ve latitude pole) and latitude.  The
+        Cartesian coordinates are right handed, with the {\it x}-axis
+        at zero longitude and latitude, and the {\it z}-axis at the
+        +ve latitude pole.
+  \item If V is null, zero A and B are returned.
+  \item At either pole, zero A is returned.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CC62S}{Cartesian 6-Vector to Spherical}
+{
+ \action{Conversion of position \& velocity in Cartesian coordinates
+         to spherical coordinates (single precision).}
+ \call{CALL sla\_CC62S (V, A, B, R, AD, BD, RD)}
+}
+\args{GIVEN}
+{
+ \spec{V}{R(6)}{\xyzxyzd}
+}
+\args{RETURNED}
+{
+ \spec{A}{R}{longitude (radians) -- for example $\alpha$} \\
+ \spec{B}{R}{latitude (radians) -- for example $\delta$} \\
+ \spec{R}{R}{radial coordinate} \\
+ \spec{AD}{R}{longitude derivative (radians per unit time)} \\
+ \spec{BD}{R}{latitude derivative (radians per unit time)} \\
+ \spec{RD}{R}{radial derivative}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CD2TF}{Days to Hour,Min,Sec}
+{
+ \action{Convert an interval in days to hours, minutes, seconds
+         (single precision).}
+ \call{CALL sla\_CD2TF (NDP, DAYS, SIGN, IHMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of seconds} \\
+ \spec{DAYS}{R}{interval in days}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IHMSF}{I(4)}{hours, minutes, seconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size of
+        DAYS, the format of REAL floating-point numbers on the target
+        machine, and the risk of overflowing IHMSF(4).  On some
+        architectures, for DAYS up to 1.0,
+        the available floating-point
+        precision corresponds roughly to NDP=3.  This is well
+        below the ultimate limit of NDP=9 set by the capacity of a
+        typical 32-bit IHMSF(4).
+  \item The absolute value of DAYS may exceed 1.0.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where DAYS is very nearly 1.0 and rounds up to 24~hours,
+        by testing for IHMSF(1)=24 and setting IHMSF(1-4) to zero.
+\end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CLDJ}{Calendar to MJD}
+{
+ \action{Gregorian Calendar to Modified Julian Date.}
+ \call{CALL sla\_CLDJ (IY, IM, ID, DJM, J)}
+}
+\args{GIVEN}
+{
+ \spec{IY,IM,ID}{I}{year, month, day in Gregorian calendar}
+}
+\args{RETURNED}
+{
+ \spec{DJM}{D}{modified Julian Date (JD$-$2400000.5) for $0^{\rm h}$} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = bad year} \\
+ \spec{}{}{\hspace{1.5em} 2 = bad month} \\
+ \spec{}{}{\hspace{1.5em} 3 = bad day}
+}
+\notes
+{
+ \begin{enumerate}
+  \item When an invalid year or month is supplied (status J~=~1~or~2)
+        the MJD is {\bf not} computed.  When an invalid day is supplied
+        (status J~=~3) the MJD {\bf is} computed.
+  \item The year must be $-$4699 ({\it i.e.}\ 4700BC) or later.
+        For year $n$BC use IY = $-(n-1)$.
+  \item An alternative to the present routine is sla\_CALDJ, which
+        accepts a year with the century missing.
+ \end{enumerate}
+}
+\aref{The algorithm is adapted from Hatcher,
+      {\it Q.\,Jl.\,R.\,astr.\,Soc.}\ (1984) {\bf 25}, 53-55.}
+%-----------------------------------------------------------------------
+\routine{SLA\_CLYD}{Calendar to Year, Day}
+{
+ \action{Gregorian calendar date to year and day in year, in a Julian
+         calendar aligned to the 20th/21st century Gregorian calendar.}
+ \call{CALL sla\_CLYD (IY, IM, ID, NY, ND, J)}
+}
+\args{GIVEN}
+{
+ \spec{IY,IM,ID}{I}{year, month, day in Gregorian calendar}
+}
+\args{RETURNED}
+{
+ \spec{NY}{I}{year (re-aligned Julian calendar)} \\
+ \spec{ND}{I}{day in year (1 = January 1st)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em}  0 = OK} \\
+ \spec{}{}{\hspace{1.5em}  1 = bad year (before $-4711$)} \\
+ \spec{}{}{\hspace{1.5em}  2 = bad month} \\
+ \spec{}{}{\hspace{1.5em}  3 = bad day}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The purpose of sla\_CLYD is to support sla\_EARTH,
+        sla\_MOON and sla\_ECOR.
+  \item Between 1900~March~1 and 2100~February~28 it returns answers
+        which are consistent with the ordinary Gregorian calendar.
+        Outside this range there will be a discrepancy which increases
+        by one day for every non-leap century year.
+  \item When an invalid year or month is supplied (status J~=~1 or J~=~2)
+        the results are {\bf not} computed.  When a day is
+        supplied which is outside the conventional range (status J~=~3)
+        the results {\bf are} computed.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_COMBN}{Next Combination}
+{
+ \action{Generate the next combination, a subset of a specified size chosen
+         from a specified number of items.}
+ \call{CALL sla\_COMBN (NSEL, NCAND, LIST, J)}
+}
+\args{GIVEN}
+{
+ \spec{NSEL}{I}{number of items (subset size)} \\
+ \spec{NCAND}{I}{number of candidates (set size)}
+}
+\args{GIVEN and RETURNED}
+{
+ \spec{LIST}{I(NSEL)}{latest combination, LIST(1)=0 to initialize}
+}
+\args{RETURNED}
+{
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal NSEL or NCAND} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $+$1 = no more combinations available}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NSEL and NCAND must both be at least 1, and NSEL must be less
+        than or equal to NCAND.
+  \item This routine returns, in the LIST array, a subset of NSEL integers
+        chosen from the range 1 to NCAND inclusive, in ascending order.
+        Before calling the routine for the first time, the caller must set
+        the first element of the LIST array to zero (any value less than 1
+        will do) to cause initialization.
+  \item The first combination to be generated is:
+        \begin{verse}
+            LIST(1)=1, LIST(2)=2, \ldots, LIST(NSEL)=NSEL
+        \end{verse}
+        This is also the combination returned for the ``finished'' (J=1) case.
+        The final permutation to be generated is:
+        \begin{verse}
+           LIST(1)=NCAND, LIST(2)=NCAND$-$1, \ldots, \\
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~LIST(NSEL)=NCAND$-$NSEL+1
+        \end{verse}
+  \item If the ``finished'' (J=1) status is ignored, the routine
+        continues to deliver combinations, the pattern repeating
+        every NCAND!/(NSEL!(NCAND$-$NSEL)!) calls.
+  \item The algorithm is by R.\,F.\,Warren-Smith (private communication).
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CR2AF}{Radians to Deg,Arcmin,Arcsec}
+{
+ \action{Convert an angle in radians to degrees, arcminutes,
+         arcseconds (single precision).}
+ \call{CALL sla\_CR2AF (NDP, ANGLE, SIGN, IDMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of arcseconds} \\
+ \spec{ANGLE}{R}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IDMSF}{I(4)}{degrees, arcminutes, arcseconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size of
+        ANGLE, the format of REAL floating-point numbers on the target
+        machine, and the risk of overflowing IDMSF(4).  On some
+        architectures, for ANGLE up to 2pi,
+        the available floating-point
+        precision corresponds roughly to NDP=3.  This is well
+        below the ultimate limit of NDP=9 set by the capacity of a
+        typical 32-bit IDMSF(4).
+  \item The absolute value of ANGLE may exceed $2\pi$.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where ANGLE is very nearly $2\pi$ and rounds up to $360^{\circ}$,
+        by testing for IDMSF(1)=360 and setting IDMSF(1-4) to zero.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CR2TF}{Radians to Hour,Min,Sec}
+{
+ \action{Convert an angle in radians to hours, minutes, seconds
+         (single precision).}
+ \call{CALL sla\_CR2TF (NDP, ANGLE, SIGN, IHMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of seconds} \\
+ \spec{ANGLE}{R}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IHMSF}{I(4)}{hours, minutes, seconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size of
+        ANGLE, the format of REAL floating-point numbers on the target
+        machine, and the risk of overflowing IHMSF(4).  On some
+        architectures, for ANGLE up to 2pi,
+        the available floating-point
+        precision corresponds roughly to NDP=3.  This is well below
+        the ultimate limit of NDP=9 set by the capacity of a typical
+        32-bit IHMSF(4).
+  \item The absolute value of ANGLE may exceed $2\pi$.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where ANGLE is very nearly $2\pi$ and rounds up to 24~hours,
+        by testing for IHMSF(1)=24 and setting IHMSF(1-4) to zero.
+\end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CS2C}{Spherical to Cartesian}
+{
+ \action{Spherical coordinates to Cartesian coordinates (single precision).}
+ \call{CALL sla\_CS2C (A, B, V)}
+}
+\args{GIVEN}
+{
+ \spec{A,B}{R}{spherical coordinates in radians: \radec\ {\it etc.}}
+}
+\args{RETURNED}
+{
+ \spec{V}{R(3)}{\xyz\ unit vector}
+}
+\anote{The spherical coordinates are longitude (+ve anticlockwise
+       looking from the +ve latitude pole) and latitude.  The
+       Cartesian coordinates are right handed, with the {\it x}-axis
+       at zero longitude and latitude, and the {\it z}-axis at the
+       +ve latitude pole.}
+%-----------------------------------------------------------------------
+\routine{SLA\_CS2C6}{Spherical Pos/Vel to Cartesian}
+{
+ \action{Conversion of position \& velocity in spherical coordinates
+         to Cartesian coordinates (single precision).}
+ \call{CALL sla\_CS2C6 (A, B, R, AD, BD, RD, V)}
+}
+\args{GIVEN}
+{
+ \spec{A}{R}{longitude (radians) -- for example $\alpha$} \\
+ \spec{B}{R}{latitude (radians) -- for example $\delta$} \\
+ \spec{R}{R}{radial coordinate} \\
+ \spec{AD}{R}{longitude derivative (radians per unit time)} \\
+ \spec{BD}{R}{latitude derivative (radians per unit time)} \\
+ \spec{RD}{R}{radial derivative}
+}
+\args{RETURNED}
+{
+ \spec{V}{R(6)}{\xyzxyzd}
+}
+\anote{The spherical coordinates are longitude (+ve anticlockwise
+       looking from the +ve latitude pole) and latitude.  The
+       Cartesian coordinates are right handed, with the {\it x}-axis
+       at zero longitude and latitude, and the {\it z}-axis at the
+       +ve latitude pole.}
+%-----------------------------------------------------------------------
+\routine{SLA\_CTF2D}{Hour,Min,Sec to Days}
+{
+ \action{Convert hours, minutes, seconds to days (single precision).}
+ \call{CALL sla\_CTF2D (IHOUR, IMIN, SEC, DAYS, J)}
+}
+\args{GIVEN}
+{
+ \spec{IHOUR}{I}{hours} \\
+ \spec{IMIN}{I}{minutes} \\
+ \spec{SEC}{R}{seconds}
+}
+\args{RETURNED}
+{
+ \spec{DAYS}{R}{interval in days} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = IHOUR outside range 0-23} \\
+ \spec{}{}{\hspace{1.5em} 2 = IMIN outside range 0-59} \\
+ \spec{}{}{\hspace{1.5em} 3 = SEC outside range 0-59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_CTF2R}{Hour,Min,Sec to Radians}
+{
+ \action{Convert hours, minutes, seconds to radians (single precision).}
+ \call{CALL sla\_CTF2R (IHOUR, IMIN, SEC, RAD, J)}
+}
+\args{GIVEN}
+{
+ \spec{IHOUR}{I}{hours} \\
+ \spec{IMIN}{I}{minutes} \\
+ \spec{SEC}{R}{seconds}
+}
+\args{RETURNED}
+{
+ \spec{RAD}{R}{angle in radians} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = IHOUR outside range 0-23} \\
+ \spec{}{}{\hspace{1.5em} 2 = IMIN outside range 0-59} \\
+ \spec{}{}{\hspace{1.5em} 3 = SEC outside range 0-59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DAF2R}{Deg,Arcmin,Arcsec to Radians}
+{
+ \action{Convert degrees, arcminutes, arcseconds to radians
+  (double precision).}
+ \call{CALL sla\_DAF2R (IDEG, IAMIN, ASEC, RAD, J)}
+}
+\args{GIVEN}
+{
+ \spec{IDEG}{I}{degrees} \\
+ \spec{IAMIN}{I}{arcminutes} \\
+ \spec{ASEC}{D}{arcseconds}
+}
+\args{RETURNED}
+{
+ \spec{RAD}{D}{angle in radians} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 1 = IDEG outside range 0$-$359} \\
+ \spec{}{}{\hspace{1.5em} 2 = IAMIN outside range 0$-$59} \\
+ \spec{}{}{\hspace{1.5em} 3 = ASEC outside range 0$-$59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DAFIN}{Sexagesimal character string to angle}
+{
+ \action{Decode a free-format sexagesimal string (degrees, arcminutes,
+         arcseconds) into a double precision floating point
+         number (radians).}
+ \call{CALL sla\_DAFIN (STRING, NSTRT, DRESLT, JF)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C*(*)}{string containing deg, arcmin, arcsec fields} \\
+ \spec{NSTRT}{I}{pointer to start of decode (beginning of STRING = 1)}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{advanced past the decoded angle} \\
+ \spec{DRESLT}{D}{angle in radians} \\
+ \spec{JF}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em}   0 = OK} \\
+ \spec{}{}{\hspace{0.7em} $+1$ = default, DRESLT unchanged (note 2)} \\
+ \spec{}{}{\hspace{0.7em} $-1$ = bad degrees (note 3)} \\
+ \spec{}{}{\hspace{0.7em} $-2$ = bad arcminutes (note 3)} \\
+ \spec{}{}{\hspace{0.7em} $-3$ = bad arcseconds (note 3)} \\
+}
+\goodbreak
+\setlength{\oldspacing}{\topsep}
+\setlength{\topsep}{0.3ex}
+\begin{description}
+ \item [EXAMPLE]: \\ [1.5ex]
+  \begin{tabular}{lll}
+   {\it argument} & {\it before} & {\it after} \\ \\
+   STRING & $'$\verb*}-57 17 44.806  12 34 56.7}$'$ & unchanged \\
+   NSTRT & 1 & 16 ({\it i.e.}\ pointing to 12...) \\
+   RESLT & - & $-1.00000${\tt D0} \\
+   JF & - & 0
+  \end{tabular}
+ \item A further call to sla\_DAFIN, without adjustment of NSTRT, will
+       decode the second angle, \dms{12}{34}{56}{7}.
+\end{description}
+\setlength{\topsep}{\oldspacing}
+\notes
+{
+ \begin{enumerate}
+  \item The first three ``fields'' in STRING are degrees, arcminutes,
+   arcseconds, separated by spaces or commas.  The degrees field
+   may be signed, but not the others.  The decoding is carried
+   out by the sla\_DFLTIN routine and is free-format.
+  \item Successive fields may be absent, defaulting to zero.  For
+   zero status, the only combinations allowed are degrees alone,
+   degrees and arcminutes, and all three fields present.  If all
+   three fields are omitted, a status of +1 is returned and DRESLT is
+   unchanged.  In all other cases DRESLT is changed.
+  \item Range checking:
+   \begin{itemize}
+    \item The degrees field is not range checked.  However, it is
+     expected to be integral unless the other two fields are absent.
+    \item The arcminutes field is expected to be 0-59, and integral if
+     the arcseconds field is present.  If the arcseconds field
+     is absent, the arcminutes is expected to be 0-59.9999...
+    \item The arcseconds field is expected to be 0-59.9999...
+    \item Decoding continues even when a check has failed.  Under these
+     circumstances the field takes the supplied value, defaulting to
+     zero, and the result DRESLT is computed and returned.
+   \end{itemize}
+   \item Further fields after the three expected ones are not treated as
+    an error.  The pointer NSTRT is left in the correct state for
+    further decoding with the present routine or with sla\_DFLTIN
+    {\it etc}.  See the example, above.
+   \item If STRING contains hours, minutes, seconds instead of
+    degrees {\it etc},
+    or if the required units are turns (or days) instead of radians,
+    the result DRESLT should be multiplied as follows: \\ [1.5ex]
+    \begin{tabular}{lll}
+    {\it for STRING} & {\it to obtain} & {\it multiply DRESLT by} \\ \\
+    ${\circ}$~~\raisebox{-0.7ex}{$'$}~~\raisebox{-0.7ex}{$''$}
+     & radians & $1.0D0$ \\
+    ${\circ}$~~\raisebox{-0.7ex}{$'$}~~\raisebox{-0.7ex}{$''$}
+     & turns & $1/{2 \pi} = 0.1591549430918953358D0$ \\
+    h m s & radians & $15.0D0$ \\
+    h m s & days & $15/{2\pi} = 2.3873241463784300365D0$
+   \end{tabular}
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_DAT}{TAI$-$UTC}
+{
+ \action{Increment to be applied to Coordinated Universal Time UTC to give
+         International Atomic Time TAI.}
+ \call{D~=~sla\_DAT (UTC)}
+}
+\args{GIVEN}
+{
+ \spec{UTC}{D}{UTC date as a modified JD (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DAT}{D}{TAI$-$UTC in seconds}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The UTC is specified to be a date rather than a time to indicate
+       that care needs to be taken not to specify an instant which lies
+       within a leap second.  Though in most cases UTC can include the
+       fractional part, correct behaviour on the day of a leap second
+       can be guaranteed only up to the end of the second
+       $23^{\rm h}\,59^{\rm m}\,59^{\rm s}$.
+ \item For epochs from 1961 January 1 onwards, the expressions from the
+       file {\tt ftp://maia.usno.navy.mil/ser7/tai-utc.dat} are used.
+       A 5ms time step at 1961~January~1 is taken from 2.58.1 (p87) of
+       the 1992 Explanatory Supplement.
+ \item UTC began at 1960 January 1.0 (JD 2436934.5) and it is improper
+       to call the routine with an earlier epoch.  However, if this
+       is attempted, the TAI$-$UTC expression for the year 1960 is used.
+ \item This routine has to be updated on each occasion that a
+       leap second is announced, and programs using it relinked.
+       Refer to the program source code for information on when the
+       most recent leap second was added.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DAV2M}{Rotation Matrix from Axial Vector}
+{
+ \action{Form the rotation matrix corresponding to a given axial vector
+         (double precision).}
+ \call{CALL sla\_DAV2M (AXVEC, RMAT)}
+}
+\args{GIVEN}
+{
+ \spec{AXVEC}{D(3)}{axial vector (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RMAT}{D(3,3)}{rotation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A rotation matrix describes a rotation about some
+        arbitrary axis, called the Euler axis.  The
+        {\it axial vector} supplied to this routine
+        has the same direction as the Euler axis, and its
+        magnitude is the amount of rotation in radians.
+  \item If AXVEC is null, the unit matrix is returned.
+  \item The reference frame rotates clockwise as seen looking along
+        the axial vector from the origin.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DBEAR}{Direction Between Points on a Sphere}
+{
+ \action{Returns the bearing (position angle) of one point on a
+         sphere relative to another (double precision).}
+ \call{D~=~sla\_DBEAR (A1, B1, A2, B2)}
+}
+\args{GIVEN}
+{
+ \spec{A1,B1}{D}{spherical coordinates of one point} \\
+ \spec{A2,B2}{D}{spherical coordinates of the other point}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DBEAR}{D}{bearing from first point to second}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The spherical coordinates are \radec,
+       $[\lambda,\phi]$ {\it etc.}, in radians.
+ \item The result is the bearing (position angle), in radians,
+       of point [A2,B2] as seen
+       from point [A1,B1].  It is in the range $\pm \pi$.  The sense
+       is such that if [A2,B2]
+       is a small distance due east of [A1,B1] the result
+       is about $+\pi/2$. Zero is returned
+       if the two points are coincident.
+ \item If either B-coordinate is outside the range $\pm\pi/2$, the
+       result may correspond to ``the long way round''.
+ \item The routine sla\_DPAV performs an equivalent function except
+       that the points are specified in the form of Cartesian
+       vectors.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DBJIN}{Decode String to B/J Epoch (DP)}
+{
+ \action{Decode a character string into a DOUBLE PRECISION number,
+         with special provision for Besselian and Julian epochs.
+         The string syntax is as for sla\_DFLTIN, prefixed by
+         an optional `B' or `J'.}
+ \call{CALL sla\_DBJIN (STRING, NSTRT, DRESLT, J1, J2)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C}{string containing field to be decoded} \\
+ \spec{NSTRT}{I}{pointer to first character of field in string}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{incremented past the decoded field} \\
+ \spec{DRESLT}{D}{result} \\
+ \spec{J1}{I}{DFLTIN status:} \\
+ \spec{}{}{\hspace{0.7em} $-$1 = $-$OK} \\
+ \spec{}{}{\hspace{1.5em}   0 = +OK} \\
+ \spec{}{}{\hspace{1.5em}   1 = null field} \\
+ \spec{}{}{\hspace{1.5em}   2 = error} \\
+ \spec{J2}{I}{syntax flag:} \\
+ \spec{}{}{\hspace{1.5em}   0 = normal DFLTIN syntax} \\
+ \spec{}{}{\hspace{1.5em}   1 = `B' or `b'} \\
+ \spec{}{}{\hspace{1.5em}   2 = `J' or `j'}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The purpose of the syntax extensions is to help cope with mixed
+        FK4 and FK5 data, allowing fields such as `B1950' or `J2000'
+        to be decoded.
+  \item In addition to the syntax accepted by sla\_DFLTIN,
+        the following two extensions are recognized by sla\_DBJIN:
+        \begin{enumerate}
+         \item A valid non-null field preceded by the character `B'
+               (or `b') is accepted.
+         \item A valid non-null field preceded by the character `J'
+               (or `j') is accepted.
+         \end{enumerate}
+  \item The calling program is told of the `B' or `J' through an
+        supplementary status argument.  The rest of
+        the arguments are as for sla\_DFLTIN.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DC62S}{Cartesian 6-Vector to Spherical}
+{
+ \action{Conversion of position \& velocity in Cartesian coordinates
+         to spherical coordinates (double precision).}
+ \call{CALL sla\_DC62S (V, A, B, R, AD, BD, RD)}
+}
+\args{GIVEN}
+{
+ \spec{V}{D(6)}{\xyzxyzd}
+}
+\args{RETURNED}
+{
+ \spec{A}{D}{longitude (radians)} \\
+ \spec{B}{D}{latitude (radians)} \\
+ \spec{R}{D}{radial coordinate} \\
+ \spec{AD}{D}{longitude derivative (radians per unit time)} \\
+ \spec{BD}{D}{latitude derivative (radians per unit time)} \\
+ \spec{RD}{D}{radial derivative}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DCC2S}{Cartesian to Spherical}
+{
+ \action{Cartesian coordinates to spherical coordinates (double precision).}
+ \call{CALL sla\_DCC2S (V, A, B)}
+}
+\args{GIVEN}
+{
+ \spec{V}{D(3)}{\xyz\ vector}
+}
+\args{RETURNED}
+{
+ \spec{A,B}{D}{spherical coordinates in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The spherical coordinates are longitude (+ve anticlockwise
+        looking from the +ve latitude pole) and latitude.  The
+        Cartesian coordinates are right handed, with the {\it x}-axis
+        at zero longitude and latitude, and the {\it z}-axis at the
+        +ve latitude pole.
+  \item If V is null, zero A and B are returned.
+  \item At either pole, zero A is returned.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DCMPF}{Interpret Linear Fit}
+{
+ \action{Decompose an \xy\ linear fit into its constituent parameters:
+         zero points, scales, nonperpendicularity and orientation.}
+ \call{CALL sla\_DCMPF (COEFFS,XZ,YZ,XS,YS,PERP,ORIENT)}
+}
+\args{GIVEN}
+{
+ \spec{COEFFS}{D(6)}{transformation coefficients (see note)}
+}
+\args{RETURNED}
+{
+ \spec{XZ}{D}{{\it x} zero point} \\
+ \spec{YZ}{D}{{\it y} zero point} \\
+ \spec{XS}{D}{{\it x} scale} \\
+ \spec{YS}{D}{{\it y} scale} \\
+ \spec{PERP}{D}{nonperpendicularity (radians)} \\
+ \spec{ORIENT}{D}{orientation (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The model relates two sets of \xy\ coordinates as follows.
+        Naming the six elements of COEFFS $a,b,c,d,e$ \& $f$,
+        the model transforms coordinates $[x_{1},y_{1}\,]$ into coordinates
+        $[x_{2},y_{2}\,]$ as follows:
+        \begin{verse}
+         $x_{2} = a + bx_{1} + cy_{1}$ \\
+         $y_{2} = d + ex_{1} + fy_{1}$
+        \end{verse}
+        The sla\_DCMPF routine decomposes this transformation
+        into four steps:
+        \begin{enumerate}
+        \item Zero points:
+              \begin{verse}
+               $x' = x_{1} + {\rm XZ}$ \\
+               $y' = y_{1} + {\rm YZ}$
+              \end{verse}
+        \item Scales:
+              \begin{verse}
+               $x'' = x' {\rm XS}$ \\
+               $y'' = y' {\rm YS}$
+              \end{verse}
+        \item Nonperpendicularity:
+              \begin{verse}
+               $x''' = + x'' \cos {\rm PERP}/2 + y'' \sin {\rm PERP}/2$ \\
+               $y''' = + x'' \sin {\rm PERP}/2 + y'' \cos {\rm PERP}/2$
+              \end{verse}
+        \item Orientation:
+              \begin{verse}
+               $x_{2} = + x''' \cos {\rm ORIENT} +
+                          y''' \sin {\rm ORIENT}$ \\
+               $y_{2} = - x''' \sin {\rm ORIENT} +
+                          y''' \cos {\rm ORIENT}$
+              \end{verse}
+        \end{enumerate}
+  \item See also sla\_FITXY, sla\_PXY, sla\_INVF, sla\_XY2XY.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DCS2C}{Spherical to Cartesian}
+{
+ \action{Spherical coordinates to Cartesian coordinates (double precision).}
+ \call{CALL sla\_DCS2C (A, B, V)}
+}
+\args{GIVEN}
+{
+ \spec{A,B}{D}{spherical coordinates in radians: \radec\ {\it etc.}}
+}
+\args{RETURNED}
+{
+ \spec{V}{D(3)}{\xyz\ unit vector}
+}
+\anote{The spherical coordinates are longitude (+ve anticlockwise
+       looking from the +ve latitude pole) and latitude.  The
+       Cartesian coordinates are right handed, with the {\it x}-axis
+       at zero longitude and latitude, and the {\it z}-axis at the
+       +ve latitude pole.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DD2TF}{Days to Hour,Min,Sec}
+{
+ \action{Convert an interval in days into hours, minutes, seconds
+         (double precision).}
+ \call{CALL sla\_DD2TF (NDP, DAYS, SIGN, IHMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of seconds} \\
+ \spec{DAYS}{D}{interval in days}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IHMSF}{I(4)}{hours, minutes, seconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size
+        of DAYS, the format of DOUBLE PRECISION floating-point numbers
+        on the target machine, and the risk of overflowing IHMSF(4).
+        On some architectures, for DAYS up to 1D0, the available
+        floating-point precision corresponds roughly to NDP=12.
+        However, the practical limit is NDP=9, set by the capacity of
+        a typical 32-bit IHMSF(4).
+  \item The absolute value of DAYS may exceed 1D0.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where DAYS is very nearly 1D0 and rounds up to 24~hours,
+        by testing for IHMSF(1)=24 and setting IHMSF(1-4) to zero.
+\end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DE2H}{$h,\delta$ to Az,El}
+{
+ \action{Equatorial to horizon coordinates
+         (double precision).}
+ \call{CALL sla\_DE2H (HA, DEC, PHI, AZ, EL)}
+}
+\args{GIVEN}
+{
+ \spec{HA}{D}{hour angle (radians)} \\
+ \spec{DEC}{D}{declination (radians)} \\
+ \spec{PHI}{D}{latitude (radians)}
+}
+\args{RETURNED}
+{
+ \spec{AZ}{D}{azimuth (radians)} \\
+ \spec{EL}{D}{elevation (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Azimuth is returned in the range $0\!-\!2\pi$;  north is zero,
+        and east is $+\pi/2$.  Elevation is returned in the range
+        $\pm\pi$.
+  \item The latitude must be geodetic.  In critical applications,
+        corrections for polar motion should be applied.
+  \item In some applications it will be important to specify the
+        correct type of hour angle and declination in order to
+        produce the required type of azimuth and elevation.  In
+        particular, it may be important to distinguish between
+        elevation as affected by refraction, which would
+        require the {\it observed} \hadec, and the elevation
+        {\it in vacuo}, which would require the {\it topocentric}
+        \hadec.
+        If the effects of diurnal aberration can be neglected, the
+        {\it apparent} \hadec\ may be used instead of the topocentric
+        \hadec.
+  \item No range checking of arguments is carried out.
+  \item In applications which involve many such calculations, rather
+        than calling the present routine it will be more efficient to
+        use inline code, having previously computed fixed terms such
+        as sine and cosine of latitude, and (for tracking a star)
+        sine and cosine of declination.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DEULER}{Euler Angles to Rotation Matrix}
+{
+ \action{Form a rotation matrix from the Euler angles -- three
+         successive rotations about specified Cartesian axes
+         (double precision).}
+ \call{CALL sla\_DEULER (ORDER, PHI, THETA, PSI, RMAT)}
+}
+\args{GIVEN}
+{
+ \spec{ORDER}{C}{specifies about which axes the rotations occur} \\
+ \spec{PHI}{D}{1st rotation (radians)} \\
+ \spec{THETA}{D}{2nd rotation (radians)} \\
+ \spec{PSI}{D}{3rd rotation (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RMAT}{D(3,3)}{rotation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+ \item A rotation is positive when the reference frame rotates
+       anticlockwise as seen looking towards the origin from the
+       positive region of the specified axis.
+ \item The characters of ORDER define which axes the three successive
+       rotations are about.  A typical value is `ZXZ', indicating that
+       RMAT is to become the direction cosine matrix corresponding to
+       rotations of the reference frame through PHI radians about the
+       old {\it z}-axis, followed by THETA radians about the resulting
+       {\it x}-axis,
+       then PSI radians about the resulting {\it z}-axis.
+ \item The axis names can be any of the following, in any order or
+       combination:  X, Y, Z, uppercase or lowercase, 1, 2, 3.  Normal
+       axis labelling/numbering conventions apply;  the {\it xyz} ($\equiv123$)
+       triad is right-handed.  Thus, the `ZXZ' example given above
+       could be written `zxz' or `313' (or even `ZxZ' or `3xZ').  ORDER
+       is terminated by length or by the first unrecognized character.
+       Fewer than three rotations are acceptable, in which case the later
+       angle arguments are ignored.  Zero rotations produces
+       the identity RMAT.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DFLTIN}{Decode a Double Precision Number}
+{
+ \action{Convert free-format input into double precision floating point.}
+ \call{CALL sla\_DFLTIN (STRING, NSTRT, DRESLT, JFLAG)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C}{string containing number to be decoded} \\
+ \spec{NSTRT}{I}{pointer to where decoding is to commence} \\
+ \spec{DRESLT}{D}{current value of result}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{advanced to next number} \\
+ \spec{DRESLT}{D}{result} \\
+ \spec{JFLAG}{I}{status: $-$1~=~$-$OK, 0~=~+OK, 1~=~null result, 2~=~error}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The reason sla\_DFLTIN has separate `OK' status values
+       for + and $-$ is to enable minus zero to be detected.
+       This is of crucial importance
+       when decoding mixed-radix numbers.  For example, an angle
+       expressed as degrees, arcminutes and arcseconds may have a
+       leading minus sign but a zero degrees field.
+ \item A TAB is interpreted as a space, and lowercase characters are
+       interpreted as uppercase.  {\it n.b.}\ The test for TAB is
+       ASCII-specific.
+ \item The basic format is the sequence of fields $\pm n.n x \pm n$,
+       where $\pm$ is a sign
+       character `+' or `$-$', $n$ means a string of decimal digits,
+       `.' is a decimal point, and $x$, which indicates an exponent,
+       means `D' or `E'.  Various combinations of these fields can be
+       omitted, and embedded blanks are permissible in certain places.
+ \item Spaces:
+       \begin{itemize}
+       \item Leading spaces are ignored.
+       \item Embedded spaces are allowed only after +, $-$, D or E,
+             and after the decimal point if the first sequence of
+             digits is absent.
+       \item Trailing spaces are ignored;  the first signifies
+             end of decoding and subsequent ones are skipped.
+       \end{itemize}
+ \item Delimiters:
+       \begin{itemize}
+       \item Any character other than +,$-$,0-9,.,D,E or space may be
+             used to signal the end of the number and terminate decoding.
+       \item Comma is recognized by sla\_DFLTIN as a special case; it
+             is skipped, leaving the pointer on the next character.  See
+             13, below.
+       \item Decoding will in all cases terminate if end of string
+             is reached.
+       \end{itemize}
+ \item Both signs are optional.  The default is +.
+ \item The mantissa $n.n$ defaults to unity.
+ \item The exponent $x\!\pm\!n$ defaults to `D0'.
+ \item The strings of decimal digits may be of any length.
+ \item The decimal point is optional for whole numbers.
+ \item A {\it null result}\/ occurs when the string of characters
+       being decoded does not begin with +,$-$,0-9,.,D or E, or
+       consists entirely of spaces.  When this condition is
+       detected, JFLAG is set to 1 and DRESLT is left untouched.
+ \item NSTRT = 1 for the first character in the string.
+ \item On return from sla\_DFLTIN, NSTRT is set ready for the next
+       decode -- following trailing blanks and any comma.  If a
+       delimiter other than comma is being used, NSTRT must be
+       incremented before the next call to sla\_DFLTIN, otherwise
+       all subsequent calls will return a null result.
+ \item Errors (JFLAG=2) occur when:
+       \begin{itemize}
+       \item a +, $-$, D or E is left unsatisfied; or
+       \item the decimal point is present without at least
+             one decimal digit before or after it; or
+       \item an exponent more than 100 has been presented.
+       \end{itemize}
+ \item When an error has been detected, NSTRT is left
+       pointing to the character following the last
+       one used before the error came to light.  This
+       may be after the point at which a more sophisticated
+       program could have detected the error.  For example,
+       sla\_DFLTIN does not detect that `1D999' is unacceptable
+       (on a computer where this is so) until the entire number
+       has been decoded.
+ \item Certain highly unlikely combinations of mantissa and
+       exponent can cause arithmetic faults during the
+       decode, in some cases despite the fact that they
+       together could be construed as a valid number.
+ \item Decoding is left to right, one pass.
+ \item See also sla\_FLOTIN and sla\_INTIN.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DH2E}{Az,El to $h,\delta$}
+{
+ \action{Horizon to equatorial coordinates
+         (double precision).}
+ \call{CALL sla\_DH2E (AZ, EL, PHI, HA, DEC)}
+}
+\args{GIVEN}
+{
+ \spec{AZ}{D}{azimuth (radians)} \\
+ \spec{EL}{D}{elevation (radians)} \\
+ \spec{PHI}{D}{latitude (radians)}
+}
+\args{RETURNED}
+{
+ \spec{HA}{D}{hour angle (radians)} \\
+ \spec{DEC}{D}{declination (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The sign convention for azimuth is north zero, east $+\pi/2$.
+  \item HA is returned in the range $\pm\pi$.  Declination is returned
+        in the range $\pm\pi/2$.
+  \item The latitude is (in principle) geodetic.  In critical
+        applications, corrections for polar motion should be applied
+        (see sla\_POLMO).
+  \item In some applications it will be important to specify the
+        correct type of elevation in order to produce the required
+        type of \hadec.  In particular, it may be important to
+        distinguish between the elevation as affected by refraction,
+        which will yield the {\it observed} \hadec, and the elevation
+        {\it in vacuo}, which will yield the {\it topocentric}
+        \hadec.  If the
+        effects of diurnal aberration can be neglected, the
+        topocentric \hadec\ may be used as an approximation to the
+        {\it apparent} \hadec.
+  \item No range checking of arguments is carried out.
+  \item In applications which involve many such calculations, rather
+        than calling the present routine it will be more efficient to
+        use inline code, having previously computed fixed terms such
+        as sine and cosine of latitude.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DIMXV}{Apply 3D Reverse Rotation}
+{
+ \action{Multiply a 3-vector by the inverse of a rotation
+         matrix (double precision).}
+ \call{CALL sla\_DIMXV (DM, VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{DM}{D(3,3)}{rotation matrix} \\
+ \spec{VA}{D(3)}{vector to be rotated}
+}
+\args{RETURNED}
+{
+ \spec{VB}{D(3)}{result vector}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine performs the operation:
+        \begin{verse}
+         {\bf b} = {\bf M}$^{T}\cdot${\bf a}
+        \end{verse}
+        where {\bf a} and {\bf b} are the 3-vectors VA and VB
+        respectively, and  {\bf M} is the $3\times3$ matrix DM.
+  \item The main function of this routine is apply an inverse
+        rotation;  under these circumstances, ${\bf M}$ is
+        {\it orthogonal}, with its inverse the same as its transpose.
+  \item To comply with the ANSI Fortran 77 standard, VA and VB must
+        {\bf not} be the same array.  The routine is, in fact, coded
+        so as to work properly on the VAX and many other systems even
+        if this rule is violated, something that is {\bf not}, however,
+        recommended.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DJCAL}{MJD to Gregorian for Output}
+{
+ \action{Modified Julian Date to Gregorian Calendar Date, expressed
+         in a form convenient for formatting messages (namely
+         rounded to a specified precision, and with the fields
+         stored in a single array).}
+ \call{CALL sla\_DJCAL (NDP, DJM, IYMDF, J)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of days in fraction} \\
+ \spec{DJM}{D}{modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{IYMDF}{I(4)}{year, month, day, fraction in Gregorian calendar} \\
+ \spec{J}{I}{status:  nonzero = out of range}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Any date after 4701BC March 1 is accepted.
+  \item Large NDP values risk internal overflows.  It is typically safe
+        to use up to NDP=4.
+ \end{enumerate}
+}
+\aref{The algorithm is adapted from Hatcher,
+      {\it Q.\,Jl.\,R.\,astr.\,Soc.}\ (1984) {\bf 25}, 53-55.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DJCL}{MJD to Year,Month,Day,Frac}
+{
+ \action{Modified Julian Date to Gregorian year, month, day,
+         and fraction of a day.}
+ \call{CALL sla\_DJCL (DJM, IY, IM, ID, FD, J)}
+}
+\args{GIVEN}
+{
+ \spec{DJM}{D}{modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{IY}{I}{year} \\
+ \spec{IM}{I}{month} \\
+ \spec{ID}{I}{day} \\
+ \spec{FD}{D}{fraction of day} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em}0~=~OK} \\
+ \spec{}{}{\hspace{0.7em}$-$1~= unacceptable date} \\
+ \spec{}{}{\hspace{0.7em}~~~~~~~~~~~~(before 4701\,BC~March~1)}
+}
+\aref{The algorithm is adapted from Hatcher,
+      {\it Q.\,Jl.\,R.\,astr.\,Soc.}\ (1984) {\bf 25}, 53-55.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DM2AV}{Rotation Matrix to Axial Vector}
+{
+ \action{From a rotation matrix, determine the corresponding axial vector
+        (double precision).}
+ \call{CALL sla\_DM2AV (RMAT, AXVEC)}
+}
+\args{GIVEN}
+{
+ \spec{RMAT}{D(3,3)}{rotation matrix}
+}
+\args{RETURNED}
+{
+ \spec{AXVEC}{D(3)}{axial vector (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A rotation matrix describes a rotation about some arbitrary axis,
+        called the Euler axis.  The {\it axial vector} returned by
+        this routine has the same direction as the Euler axis, and its
+        magnitude is the amount of rotation in radians.
+  \item The magnitude and direction of the axial vector can be separated
+        by means of the routine sla\_DVN.
+  \item The reference frame rotates clockwise as seen looking along
+        the axial vector from the origin.
+  \item If RMAT is null, so is the result.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DMAT}{Solve Simultaneous Equations}
+{
+ \action{Matrix inversion and solution of simultaneous equations
+         (double precision).}
+ \call{CALL sla\_DMAT (N, A, Y, D, JF, IW)}
+}
+\args{GIVEN}
+{
+ \spec{N}{I}{number of unknowns} \\
+ \spec{A}{D(N,N)}{matrix} \\
+ \spec{Y}{D(N)}{vector}
+}
+\args{RETURNED}
+{
+ \spec{A}{D(N,N)}{matrix inverse} \\
+ \spec{Y}{D(N)}{solution} \\
+ \spec{D}{D}{determinant} \\
+ \spec{JF}{I}{singularity flag: 0=OK} \\
+ \spec{IW}{I(N)}{workspace}
+}
+\notes
+{
+ \begin{enumerate}
+  \item For the set of $n$ simultaneous linear equations in $n$ unknowns:
+        \begin{verse}
+         {\bf A}$\cdot${\bf y} = {\bf x}
+        \end{verse}
+        where:
+        \begin{itemize}
+         \item {\bf A} is a non-singular $n \times n$ matrix,
+         \item {\bf y} is the vector of $n$ unknowns, and
+         \item {\bf x} is the known vector,
+        \end{itemize}
+        sla\_DMAT computes:
+        \begin{itemize}
+         \item the inverse of matrix {\bf A},
+         \item the determinant of matrix {\bf A}, and
+         \item the vector of $n$ unknowns {\bf y}.
+        \end{itemize}
+        Argument N is the order $n$, A (given) is the matrix {\bf A},
+        Y (given) is the vector {\bf x} and Y (returned)
+        is the vector {\bf y}.
+        The argument A (returned) is the inverse matrix {\bf A}$^{-1}$,
+        and D is {\it det}\/({\bf A}).
+  \item JF is the singularity flag.  If the matrix is non-singular,
+        JF=0 is returned.  If the matrix is singular, JF=$-$1
+        and D=0D0 are returned.  In the latter case, the contents
+        of array A on return are undefined.
+  \item The algorithm is Gaussian elimination with partial pivoting.
+        This method is very fast;  some much slower algorithms can give
+        better accuracy, but only by a small factor.
+  \item This routine replaces the obsolete sla\_DMATRX.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DMOON}{Approx Moon Pos/Vel}
+{
+ \action{Approximate geocentric position and velocity of the Moon
+         (double precision).}
+ \call{CALL sla\_DMOON (DATE, PV)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (loosely ET) as a Modified Julian Date (JD$-$2400000.5)
+}
+}
+\args{RETURNED}
+{
+ \spec{PV}{D(6)}{Moon \xyzxyzd, mean equator and equinox
+                 of date (AU, AU~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine is a full implementation of the algorithm
+        published by Meeus (see reference).
+  \item Meeus quotes accuracies of \arcseci{10} in longitude,
+        \arcseci{3} in latitude and \arcsec{0}{2} arcsec in HP
+        (equivalent to about 20~km in distance).  Comparison with
+        JPL~DE200 over the interval 1960-2025 gives RMS errors of
+        \arcsec{3}{7} and 83~mas/hour in longitude,
+        \arcsec{2}{3} arcsec and 48~mas/hour in latitude,
+        11~km and 81~mm/s in distance.
+        The maximum errors over the same interval are
+        \arcseci{18} and \arcsec{0}{50}/hour in longitude,
+        \arcseci{11} and \arcsec{0}{24}/hour in latitude,
+        40~km and 0.29~m/s in distance.
+  \item The original algorithm is expressed in terms of the obsolete
+        time scale {\it Ephemeris Time}.  Either TDB or TT can be used,
+        but not UT without incurring significant errors (\arcseci{30} at
+        the present time) due to the Moon's \arcsec{0}{5}/s movement.
+  \item The algorithm is based on pre IAU 1976 standards.  However,
+        the result has been moved onto the new (FK5) equinox, an
+        adjustment which is in any case much smaller than the
+        intrinsic accuracy of the procedure.
+  \item Velocity is obtained by a complete analytical differentiation
+        of the Meeus model.
+ \end{enumerate}
+}
+\aref{Meeus, {\it l'Astronomie}, June 1984, p348.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DMXM}{Multiply $3\times3$ Matrices}
+{
+ \action{Product of two $3\times3$ matrices (double precision).}
+ \call{CALL sla\_DMXM (A, B, C)}
+}
+\args{GIVEN}
+{
+ \spec{A}{D(3,3)}{matrix {\bf A}} \\
+ \spec{B}{D(3,3)}{matrix {\bf B}}
+}
+\args{RETURNED}
+{
+ \spec{C}{D(3,3)}{matrix result: {\bf A}$\times${\bf B}}
+}
+\anote{To comply with the ANSI Fortran 77 standard, A, B and C must
+       be different arrays.  However, the routine is coded so as to
+       work properly on many platforms even if this rule is violated,
+       something that is {\bf not}, however, recommended.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DMXV}{Apply 3D Rotation}
+{
+ \action{Multiply a 3-vector by a rotation matrix (double precision).}
+ \call{CALL sla\_DMXV (DM, VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{DM}{D(3,3)}{rotation matrix} \\
+ \spec{VA}{D(3)}{vector to be rotated}
+}
+\args{RETURNED}
+{
+ \spec{VB}{D(3)}{result vector}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine performs the operation:
+        \begin{verse}
+           {\bf b} = {\bf M}$\cdot${\bf a}
+        \end{verse}
+        where {\bf a} and {\bf b} are the 3-vectors VA and VB
+        respectively, and {\bf M} is the $3\times3$ matrix DM.
+  \item The main function of this routine is apply a
+        rotation;  under these circumstances, {\bf M} is a
+        {\it proper real orthogonal}\/ matrix.
+  \item To comply with the ANSI Fortran 77 standard, VA and VB must
+        {\bf not} be the same array.  The routine is, in fact, coded
+        so as to work properly with many Fortran compilers even
+        if this rule is violated, something that is {\bf not}, however,
+        recommended.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DPAV}{Position-Angle Between Two Directions}
+{
+ \action{Returns the bearing (position angle) of one celestial
+         direction with respect to another (double precision).}
+ \call{D~=~sla\_DPAV (V1, V2)}
+}
+\args{GIVEN}
+{
+ \spec{V1}{D(3)}{vector to one point} \\
+ \spec{V2}{D(3)}{vector to the other point}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DPAV}{D}{position-angle of 2nd point with respect to 1st}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The coordinate frames correspond to \radec,
+       $[\lambda,\phi]$ {\it etc.}.
+ \item The result is the bearing (position angle), in radians,
+       of point V2 as seen
+       from point V1.  It is in the range $\pm \pi$.  The sense
+       is such that if V2
+       is a small distance due east of V1 the result
+       is about $+\pi/2$. Zero is returned
+       if the two points are coincident.
+ \item There is no requirement for either vector to be of unit length.
+ \item The routine sla\_DBEAR performs an equivalent function except
+       that the points are specified in the form of spherical coordinates.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_DR2AF}{Radians to Deg,Min,Sec,Frac}
+{
+ \action{Convert an angle in radians to degrees, arcminutes, arcseconds,
+         fraction (double precision).}
+ \call{CALL sla\_DR2AF (NDP, ANGLE, SIGN, IDMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of arcseconds} \\
+ \spec{ANGLE}{D}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IDMSF}{I(4)}{degrees, arcminutes, arcseconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size
+        of ANGLE, the format of DOUBLE PRECISION floating-point
+        numbers on the target machine, and the risk of overflowing
+        IDMSF(4).  On some architectures, for ANGLE up to 2pi, the
+        available floating-point precision corresponds roughly to
+        NDP=12.  However, the practical limit is NDP=9, set by the
+        capacity of a typical 32-bit IDMSF(4).
+  \item The absolute value of ANGLE may exceed $2\pi$.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where ANGLE is very nearly $2\pi$ and rounds up to $360^{\circ}$,
+        by testing for IDMSF(1)=360 and setting IDMSF(1-4) to zero.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DR2TF}{Radians to Hour,Min,Sec,Frac}
+{
+ \action{Convert an angle in radians to hours, minutes, seconds,
+         fraction (double precision).}
+ \call{CALL sla\_DR2TF (NDP, ANGLE, SIGN, IHMSF)}
+}
+\args{GIVEN}
+{
+ \spec{NDP}{I}{number of decimal places of seconds} \\
+ \spec{ANGLE}{D}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{SIGN}{C}{`+' or `$-$'} \\
+ \spec{IHMSF}{I(4)}{hours, minutes, seconds, fraction}
+}
+\notes
+{
+ \begin{enumerate}
+  \item NDP less than zero is interpreted as zero.
+  \item The largest useful value for NDP is determined by the size
+        of ANGLE, the format of DOUBLE PRECISION floating-point
+        numbers on the target machine, and the risk of overflowing
+        IHMSF(4).  On some architectures, for ANGLE up to 2pi, the
+        available floating-point precision corresponds roughly to
+        NDP=12.  However, the practical limit is NDP=9, set by the
+        capacity of a typical 32-bit IHMSF(4).
+  \item The absolute value of ANGLE may exceed $2\pi$.  In cases where it
+        does not, it is up to the caller to test for and handle the
+        case where ANGLE is very nearly $2\pi$ and rounds up to 24~hours,
+        by testing for IHMSF(1)=24 and setting IHMSF(1-4) to zero.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DRANGE}{Put Angle into Range $\pm\pi$}
+{
+ \action{Normalize an angle into the range $\pm\pi$ (double precision).}
+ \call{D~=~sla\_DRANGE (ANGLE)}
+}
+\args{GIVEN}
+{
+ \spec{ANGLE}{D}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DRANGE}{D}{ANGLE expressed in the range $\pm\pi$.}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DRANRM}{Put Angle into Range $0\!-\!2\pi$}
+{
+ \action{Normalize an angle into the range $0\!-\!2\pi$
+         (double precision).}
+ \call{D~=~sla\_DRANRM (ANGLE)}
+}
+\args{GIVEN}
+{
+ \spec{ANGLE}{D}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DRANRM}{D}{ANGLE expressed in the range $0\!-\!2\pi$}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DS2C6}{Spherical Pos/Vel to Cartesian}
+{
+ \action{Conversion of position \& velocity in spherical coordinates
+         to Cartesian coordinates (double precision).}
+ \call{CALL sla\_DS2C6 (A, B, R, AD, BD, RD, V)}
+}
+\args{GIVEN}
+{
+ \spec{A}{D}{longitude (radians) -- for example $\alpha$} \\
+ \spec{B}{D}{latitude (radians) -- for example $\delta$} \\
+ \spec{R}{D}{radial coordinate} \\
+ \spec{AD}{D}{longitude derivative (radians per unit time)} \\
+ \spec{BD}{D}{latitude derivative (radians per unit time)} \\
+ \spec{RD}{D}{radial derivative}
+}
+\args{RETURNED}
+{
+ \spec{V}{D(6)}{\xyzxyzd}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DS2TP}{Spherical to Tangent Plane}
+{
+ \action{Projection of spherical coordinates onto the tangent plane
+         (double precision).}
+ \call{CALL sla\_DS2TP (RA, DEC, RAZ, DECZ, XI, ETA, J)}
+}
+\args{GIVEN}
+{
+ \spec{RA,DEC}{D}{spherical coordinates of star (radians)} \\
+ \spec{RAZ,DECZ}{D}{spherical coordinates of tangent point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{XI,ETA}{D}{tangent plane coordinates (radians)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK, star on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 1 = error, star too far from axis} \\
+ \spec{}{}{\hspace{1.5em} 2 = error, antistar on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 3 = error, antistar too far from axis}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_DV2TP is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DSEP}{Angle Between 2 Points on Sphere}
+{
+ \action{Angle between two points on a sphere (double precision).}
+ \call{D~=~sla\_DSEP (A1, B1, A2, B2)}
+}
+\args{GIVEN}
+{
+ \spec{A1,B1}{D}{spherical coordinates of one point (radians)} \\
+ \spec{A2,B2}{D}{spherical coordinates of the other point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DSEP}{D}{angle between [A1,B1] and [A2,B2] in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The spherical coordinates are right ascension and declination,
+        longitude and latitude, {\it etc.}, in radians.
+  \item The result is always positive.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DSEPV}{Angle Between 2 Vectors}
+{
+ \action{Angle between two vectors (double precision).}
+ \call{D~=~sla\_DSEPV (V1, V2)}
+}
+\args{GIVEN}
+{
+ \spec{V1}{D(3)}{first vector} \\
+ \spec{V2}{D(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DSEPV}{D}{angle between V1 and V2 in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item There is no requirement for either vector to be of unit length.
+  \item If either vector is null, zero is returned.
+  \item The result is always positive.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DT}{Approximate ET minus UT}
+{
+ \action{Estimate $\Delta$T, the offset between dynamical time
+         and Universal Time, for a given historical epoch.}
+ \call{D~=~sla\_DT (EPOCH)}
+}
+\args{GIVEN}
+{
+ \spec{EPOCH}{D}{(Julian) epoch ({\it e.g.}\ 1850D0)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DT}{D}{approximate ET$-$UT (after 1984, TT$-$UT1) in seconds}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Depending on the epoch, one of three parabolic approximations
+        is used:
+
+\begin{tabular}{lll}
+& before AD 979 & Stephenson \& Morrison's 390 BC to AD 948 model \\
+& AD 979 to AD 1708 & Stephenson \& Morrison's AD 948 to AD 1600 model \\
+& after AD 1708 & McCarthy \& Babcock's post-1650 model
+\end{tabular}
+
+        The breakpoints are chosen to ensure continuity:  they occur
+        at places where the adjacent models give the same answer as
+        each other.
+  \item The accuracy is modest, with errors of up to $20^{\rm s}$ during
+        the interval since 1650, rising to perhaps $30^{\rm m}$
+        by 1000~BC.  Comparatively accurate values from AD~1600
+        are tabulated in
+        the {\it Astronomical Almanac}\/ (see section K8 of the 1995
+        edition).
+  \item The use of {\tt DOUBLE PRECISION} for both argument and result is
+        simply for compatibility with other SLALIB time routines.
+  \item The models used are based on a lunar tidal acceleration value
+        of \arcsec{-26}{00} per century.
+ \end{enumerate}
+}
+\aref{Seidelmann, P.K.\ (ed), 1992.  {\it Explanatory
+      Supplement to the Astronomical Almanac,}\/ ISBN~0-935702-68-7.
+      This contains references to the papers by Stephenson \& Morrison
+      and by McCarthy \& Babcock which describe the models used here.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTF2D}{Hour,Min,Sec to Days}
+{
+ \action{Convert hours, minutes, seconds to days (double precision).}
+ \call{CALL sla\_DTF2D (IHOUR, IMIN, SEC, DAYS, J)}
+}
+\args{GIVEN}
+{
+ \spec{IHOUR}{I}{hours} \\
+ \spec{IMIN}{I}{minutes} \\
+ \spec{SEC}{D}{seconds}
+}
+\args{RETURNED}
+{
+ \spec{DAYS}{D}{interval in days} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = IHOUR outside range 0-23} \\
+ \spec{}{}{\hspace{1.5em} 2 = IMIN outside range 0-59} \\
+ \spec{}{}{\hspace{1.5em} 3 = SEC outside range 0-59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTF2R}{Hour,Min,Sec to Radians}
+{
+ \action{Convert hours, minutes, seconds to radians (double precision).}
+ \call{CALL sla\_DTF2R (IHOUR, IMIN, SEC, RAD, J)}
+}
+\args{GIVEN}
+{
+ \spec{IHOUR}{I}{hours} \\
+ \spec{IMIN}{I}{minutes} \\
+ \spec{SEC}{D}{seconds}
+}
+\args{RETURNED}
+{
+ \spec{RAD}{D}{angle in radians} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{1.5em} 1 = IHOUR outside range 0-23} \\
+ \spec{}{}{\hspace{1.5em} 2 = IMIN outside range 0-59} \\
+ \spec{}{}{\hspace{1.5em} 3 = SEC outside range 0-59.999$\cdots$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is computed even if any of the range checks fail.
+  \item The sign must be dealt with outside this routine.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTP2S}{Tangent Plane to Spherical}
+{
+ \action{Transform tangent plane coordinates into spherical
+         coordinates (double precision)}
+ \call{CALL sla\_DTP2S (XI, ETA, RAZ, DECZ, RA, DEC)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{D}{tangent plane rectangular coordinates (radians)} \\
+ \spec{RAZ,DECZ}{D}{spherical coordinates of tangent point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RA,DEC}{D}{spherical coordinates (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_DTP2V is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTP2V}{Tangent Plane to Direction Cosines}
+{
+ \action{Given the tangent-plane coordinates of a star and the direction
+         cosines of the tangent point, determine the direction cosines
+         of the star
+         (double precision).}
+ \call{CALL sla\_DTP2V (XI, ETA, V0, V)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{D}{tangent plane coordinates of star (radians)} \\
+ \spec{V0}{D(3)}{direction cosines of tangent point}
+}
+\args{RETURNED}
+{
+ \spec{V}{D(3)}{direction cosines of star}
+}
+\notes
+{
+ \begin{enumerate}
+  \item If vector V0 is not of unit length, the returned vector V will
+        be wrong.
+  \item If vector V0 points at a pole, the returned vector V will be
+        based on the arbitrary assumption that $\alpha=0$ at
+        the tangent point.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_DTP2S.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTPS2C}{Plate centre from $\xi,\eta$ and $\alpha,\delta$}
+{
+ \action{From the tangent plane coordinates of a star of known \radec,
+        determine the \radec\ of the tangent point (double precision)}
+ \call{CALL sla\_DTPS2C (XI, ETA, RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2, N)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{D}{tangent plane rectangular coordinates (radians)} \\
+ \spec{RA,DEC}{D}{spherical coordinates (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RAZ1,DECZ1}{D}{spherical coordinates of tangent point,
+                      solution 1} \\
+ \spec{RAZ2,DECZ2}{D}{spherical coordinates of tangent point,
+                      solution 2} \\
+ \spec{N}{I}{number of solutions:} \\
+ \spec{}{}{\hspace{1em} 0 = no solutions returned  (note 2)} \\
+ \spec{}{}{\hspace{1em} 1 = only the first solution is useful (note 3)} \\
+ \spec{}{}{\hspace{1em} 2 = there are two useful solutions (note 3)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The RAZ1 and RAZ2 values returned are in the range $0\!-\!2\pi$.
+  \item Cases where there is no solution can only arise near the poles.
+        For example, it is clearly impossible for a star at the pole
+        itself to have a non-zero $\xi$ value, and hence it is
+        meaningless to ask where the tangent point would have to be
+        to bring about this combination of $\xi$ and $\delta$.
+  \item Also near the poles, cases can arise where there are two useful
+        solutions.  The argument N indicates whether the second of the
+        two solutions returned is useful.  N\,=\,1
+        indicates only one useful solution, the usual case;  under
+        these circumstances, the second solution corresponds to the
+        ``over-the-pole'' case, and this is reflected in the values
+        of RAZ2 and DECZ2 which are returned.
+  \item The DECZ1 and DECZ2 values returned are in the range $\pm\pi$,
+        but in the ordinary, non-pole-crossing, case, the range is
+        $\pm\pi/2$.
+  \item RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2 are all in radians.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_DTPV2C is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTPV2C}{Plate centre from $\xi,\eta$ and $x,y,z$}
+{
+ \action{From the tangent plane coordinates of a star of known
+         direction cosines, determine the direction cosines
+         of the tangent point (double precision)}
+ \call{CALL sla\_DTPV2C (XI, ETA, V, V01, V02, N)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{D}{tangent plane coordinates of star (radians)} \\
+ \spec{V}{D(3)}{direction cosines of star}
+}
+\args{RETURNED}
+{
+ \spec{V01}{D(3)}{direction cosines of tangent point, solution 1} \\
+ \spec{V02}{D(3)}{direction cosines of tangent point, solution 2} \\
+ \spec{N}{I}{number of solutions:} \\
+ \spec{}{}{\hspace{1em} 0 = no solutions returned  (note 2)} \\
+ \spec{}{}{\hspace{1em} 1 = only the first solution is useful (note 3)} \\
+ \spec{}{}{\hspace{1em} 2 = there are two useful solutions (note 3)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The vector V must be of unit length or the result will be wrong.
+  \item Cases where there is no solution can only arise near the poles.
+        For example, it is clearly impossible for a star at the pole
+        itself to have a non-zero XI value.
+  \item Also near the poles, cases can arise where there are two useful
+        solutions.  The argument N indicates whether the second of the
+        two solutions returned is useful.
+        N\,=\,1
+        indicates only one useful solution, the usual case;  under these
+        circumstances, the second solution can be regarded as valid if
+        the vector V02 is interpreted as the ``over-the-pole'' case.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_DTPS2C.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DTT}{TT minus UTC}
+{
+ \action{Compute $\Delta$TT, the increment to be applied to
+         Coordinated Universal Time UTC to give
+         Terrestrial Time TT.}
+ \call{D~=~sla\_DTT (DJU)}
+}
+\args{GIVEN}
+{
+ \spec{DJU}{D}{UTC date as a modified JD (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DTT}{D}{TT$-$UTC in seconds}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The UTC is specified to be a date rather than a time to indicate
+        that care needs to be taken not to specify an instant which lies
+        within a leap second.  Though in most cases UTC can include the
+        fractional part, correct behaviour on the day of a leap second
+        can be guaranteed only up to the end of the second
+        $23^{\rm h}\,59^{\rm m}\,59^{\rm s}$.
+  \item Pre 1972 January 1 a fixed value of 10 + ET$-$TAI is returned.
+  \item TT is one interpretation of the defunct time scale
+        {\it Ephemeris Time}, ET.
+  \item See also the routine sla\_DT, which roughly estimates ET$-$UT for
+        historical epochs.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DV2TP}{Direction Cosines to Tangent Plane}
+{
+ \action{Given the direction cosines of a star and of the tangent point,
+         determine the star's tangent-plane coordinates
+         (double precision).}
+ \call{CALL sla\_DV2TP (V, V0, XI, ETA, J)}
+}
+\args{GIVEN}
+{
+ \spec{V}{D(3)}{direction cosines of star} \\
+ \spec{V0}{D(3)}{direction cosines of tangent point}
+}
+\args{RETURNED}
+{
+ \spec{XI,ETA}{D}{tangent plane coordinates (radians)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK, star on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 1 = error, star too far from axis} \\
+ \spec{}{}{\hspace{1.5em} 2 = error, antistar on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 3 = error, antistar too far from axis}
+}
+\notes
+{
+ \begin{enumerate}
+  \item If vector V0 is not of unit length, or if vector V is of zero
+        length, the results will be wrong.
+  \item If V0 points at a pole, the returned $\xi,\eta$
+        will be based on the
+        arbitrary assumption that $\alpha=0$ at the tangent point.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_DS2TP.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DVDV}{Scalar Product}
+{
+ \action{Scalar product of two 3-vectors (double precision).}
+ \call{D~=~sla\_DVDV (VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{VA}{D(3)}{first vector} \\
+ \spec{VB}{D(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{sla\_DVDV}{D}{scalar product VA.VB}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_DVN}{Normalize Vector}
+{
+ \action{Normalize a 3-vector, also giving the modulus (double precision).}
+ \call{CALL sla\_DVN (V, UV, VM)}
+}
+\args{GIVEN}
+{
+ \spec{V}{D(3)}{vector}
+}
+\args{RETURNED}
+{
+ \spec{UV}{D(3)}{unit vector in direction of V} \\
+ \spec{VM}{D}{modulus of V}
+}
+\anote{If the modulus of V is zero, UV is set to zero as well.}
+%-----------------------------------------------------------------------
+\routine{SLA\_DVXV}{Vector Product}
+{
+ \action{Vector product of two 3-vectors (double precision).}
+ \call{CALL sla\_DVXV (VA, VB, VC)}
+}
+\args{GIVEN}
+{
+ \spec{VA}{D(3)}{first vector} \\
+ \spec{VB}{D(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{VC}{D(3)}{vector product VA$\times$VB}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_E2H}{$h,\delta$ to Az,El}
+{
+ \action{Equatorial to horizon coordinates
+         (single precision).}
+ \call{CALL sla\_DE2H (HA, DEC, PHI, AZ, EL)}
+}
+\args{GIVEN}
+{
+ \spec{HA}{R}{hour angle (radians)} \\
+ \spec{DEC}{R}{declination (radians)} \\
+ \spec{PHI}{R}{latitude (radians)}
+}
+\args{RETURNED}
+{
+ \spec{AZ}{R}{azimuth (radians)} \\
+ \spec{EL}{R}{elevation (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Azimuth is returned in the range $0\!-\!2\pi$;  north is zero,
+        and east is $+\pi/2$.  Elevation is returned in the range
+        $\pm\pi$.
+  \item The latitude must be geodetic.  In critical applications,
+        corrections for polar motion should be applied.
+  \item In some applications it will be important to specify the
+        correct type of hour angle and declination in order to
+        produce the required type of azimuth and elevation.  In
+        particular, it may be important to distinguish between
+        elevation as affected by refraction, which would
+        require the {\it observed} \hadec, and the elevation
+        {\it in vacuo}, which would require the {\it topocentric}
+        \hadec.
+        If the effects of diurnal aberration can be neglected, the
+        {\it apparent} \hadec\ may be used instead of the topocentric
+        \hadec.
+  \item No range checking of arguments is carried out.
+  \item In applications which involve many such calculations, rather
+        than calling the present routine it will be more efficient to
+        use inline code, having previously computed fixed terms such
+        as sine and cosine of latitude, and (for tracking a star)
+        sine and cosine of declination.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EARTH}{Approx Earth Pos/Vel}
+{
+ \action{Approximate heliocentric position and velocity of the Earth
+         (single precision).}
+ \call{CALL sla\_EARTH (IY, ID, FD, PV)}
+}
+\args{GIVEN}
+{
+ \spec{IY}{I}{year} \\
+ \spec{ID}{I}{day in year (1 = Jan 1st)} \\
+ \spec{FD}{R}{fraction of day}
+}
+\args{RETURNED}
+{
+ \spec{PV}{R(6)}{Earth \xyzxyzd\ (AU, AU~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The date and time is TDB (loosely ET) in a Julian calendar
+        which has been aligned to the ordinary Gregorian
+        calendar for the interval 1900~March~1 to 2100~February~28.
+        The year and day can be obtained by calling sla\_CALYD or
+        sla\_CLYD.
+  \item The Earth heliocentric 6-vector is referred to the
+        FK4 mean equator and equinox of date.
+  \item Maximum/RMS errors 1950-2050:
+        \begin{itemize}
+         \item 13/5~$\times10^{-5}$~AU = 19200/7600~km in position
+         \item 47/26~$\times10^{-10}$~AU~s$^{-1}$ =
+               0.0070/0.0039~km~s$^{-1}$ in speed
+        \end{itemize}
+  \item More accurate results are obtainable with the routines sla\_EVP
+        and sla\_EPV.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_ECLEQ}{Ecliptic to Equatorial}
+{
+ \action{Transformation from ecliptic longitude and latitude to
+         J2000.0 \radec.}
+ \call{CALL sla\_ECLEQ (DL, DB, DATE, DR, DD)}
+}
+\args{GIVEN}
+{
+ \spec{DL,DB}{D}{ecliptic longitude and latitude
+                          (mean of date, IAU 1980 theory, radians)} \\
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date
+                                             (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{DR,DD}{D}{J2000.0 mean \radec\ (radians)}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_ECMAT}{Form $\alpha,\delta\rightarrow\lambda,\beta$ Matrix}
+{
+ \action{Form the equatorial to ecliptic rotation matrix (IAU 1980 theory).}
+ \call{CALL sla\_ECMAT (DATE, RMAT)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date
+                                           (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{RMAT}{D(3,3)}{rotation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item RMAT is matrix {\bf M} in the expression
+        {\bf v}$_{ecl}$~=~{\bf M}$\cdot${\bf v}$_{equ}$.
+  \item The equator, equinox and ecliptic are mean of date.
+ \end{enumerate}
+}
+\aref{Murray, C.A., {\it Vectorial Astrometry}, section 4.3.}
+%-----------------------------------------------------------------------
+\routine{SLA\_ECOR}{RV \& Time Corrns to Sun}
+{
+ \action{Component of Earth orbit velocity and heliocentric
+         light time in a given direction.}
+ \call{CALL sla\_ECOR (RM, DM, IY, ID, FD, RV, TL)}
+}
+\args{GIVEN}
+{
+ \spec{RM,DM}{R}{mean \radec\ of date (radians)} \\
+ \spec{IY}{I}{year} \\
+ \spec{ID}{I}{day in year (1 = Jan 1st)} \\
+ \spec{FD}{R}{fraction of day}
+}
+\args{RETURNED}
+{
+ \spec{RV}{R}{component of Earth orbital velocity (km~s$^{-1}$)} \\
+ \spec{TL}{R}{component of heliocentric light time (s)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The date and time is TDB (loosely ET) in a Julian calendar
+        which has been aligned to the ordinary Gregorian
+        calendar for the interval 1900 March 1 to 2100 February 28.
+        The year and day can be obtained by calling sla\_CALYD or
+        sla\_CLYD.
+  \item Sign convention:
+        \begin{itemize}
+         \item The velocity component is +ve when the
+               Earth is receding from
+               the given point on the sky.
+         \item The light time component is +ve
+               when the Earth lies between the Sun and
+               the given point on the sky.
+        \end{itemize}
+ \item Accuracy:
+       \begin{itemize}
+        \item The velocity component is usually within 0.004~km~s$^{-1}$
+              of the correct value and is never in error by more than
+              0.007~km~s$^{-1}$.
+        \item The error in light time correction is about
+              \tsec{0}{03} at worst,
+              but is usually better than \tsec{0}{01}.
+       \end{itemize}
+       For applications requiring higher accuracy, see the sla\_EVP
+       and sla\_EPV routines.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EG50}{B1950 $\alpha,\delta$ to Galactic}
+{
+ \action{Transformation from B1950.0 FK4 equatorial coordinates to
+         IAU 1958 galactic coordinates.}
+ \call{CALL sla\_EG50 (DR, DD, DL, DB)}
+}
+\args{GIVEN}
+{
+ \spec{DR,DD}{D}{B1950.0 \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal\ (radians)}
+}
+\anote{The equatorial coordinates are B1950.0 FK4.  Use the
+       routine sla\_EQGAL if conversion from J2000.0 FK5 coordinates
+       is required.}
+\aref{Blaauw {\it et al.}, 1960, {\it Mon.Not.R.astr.Soc.},
+      {\bf 121}, 123.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EL2UE}{Conventional to Universal Elements}
+{
+ \action{Transform conventional osculating orbital elements
+         into ``universal'' form.}
+ \call{CALL sla\_EL2UE (\vtop{
+         \hbox{DATE, JFORM, EPOCH, ORBINC, ANODE,}
+         \hbox{PERIH, AORQ, E, AORL, DM,}
+         \hbox{U, JSTAT)}}}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{epoch (TT MJD) of osculation (Note~3)} \\
+ \spec{JFORM}{I}{choice of element set (1-3; Note~6)} \\
+ \spec{EPOCH}{D}{epoch of elements ($t_0$ or $T$, TT MJD)} \\
+ \spec{ORBINC}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH}{D}{longitude or argument of perihelion
+                            ($\varpi$ or $\omega$,} \\
+ \spec{}{}{\hspace{1.5em} radians)} \\
+ \spec{AORQ}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E}{D}{eccentricity ($e$)} \\
+ \spec{AORL}{D}{mean anomaly or longitude
+                               ($M$ or $L$, radians,} \\
+ \spec{}{}{\hspace{1.5em} JFORM=1,2 only)} \\
+ \spec{DM}{D}{daily motion ($n$, radians, JFORM=1 only)}
+}
+\args{RETURNED}
+{
+ \spec{U}{D(13)}{universal orbital elements (Note~1)} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v}_0$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date,
+                    approx} \\ \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{1.95em}       0 = OK} \\
+ \spec{}{}{\hspace{1.2em}  $-$1 = illegal JFORM} \\
+ \spec{}{}{\hspace{1.2em}   $-$2 = illegal E} \\
+ \spec{}{}{\hspace{1.2em}   $-$3 = illegal AORQ} \\
+ \spec{}{}{\hspace{1.2em}   $-$4 = illegal DM} \\
+ \spec{}{}{\hspace{1.2em}   $-$5 = numerical error}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The ``universal'' elements are those which define the orbit for
+        the purposes of the method of universal variables (see reference).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+  \item The companion routine is sla\_UE2PV.  This takes the set of numbers
+        that the present routine outputs and uses them to derive the
+        object's position and velocity.  A single prediction requires one
+        call to the present routine followed by one call to sla\_UE2PV;
+        for convenience, the two calls are packaged as the routine
+        sla\_PLANEL.  Multiple predictions may be made by again calling the
+        present routine once, but then calling sla\_UE2PV multiple times,
+        which is faster than multiple calls to sla\_PLANEL.
+  \item DATE is the epoch of osculation.  It is in the TT time scale
+        (formerly Ephemeris Time, ET) and is a Modified Julian Date
+        (JD$-$2400000.5).
+  \item The supplied orbital elements are with respect to the J2000
+        ecliptic and equinox.  The position and velocity parameters
+        returned in the array U are with respect to the mean equator and
+        equinox of epoch J2000, and are for the perihelion prior to the
+        specified epoch.
+  \item The universal elements returned in the array U are in canonical
+        units (solar masses, AU and canonical days).
+  \item Three different element-format options are supported, as
+        follows. \\
+
+        JFORM=1, suitable for the major planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & longitude of perihelion $\varpi$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean longitude $L$ (radians) \\
+        & DM     & = & daily motion $n$ (radians)
+        \end{tabular}
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e \leq 10 )$
+        \end{tabular}
+
+  \item Unused elements (DM for JFORM=2, AORL and DM for JFORM=3) are
+        not accessed.
+  \item The algorithm was originally adapted from the EPHSLA program of
+        D.\,H.\,P.\,Jones (private communication, 1996).  The method
+        is based on Stumpff's Universal Variables.
+ \end{enumerate}
+}
+\aref{Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.}
+%------------------------------------------------------------------------------
+\routine{SLA\_EPB}{MJD to Besselian Epoch}
+{
+ \action{Conversion of Modified Julian Date to Besselian Epoch.}
+ \call{D~=~sla\_EPB (DATE)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{Modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EPB}{D}{Besselian Epoch}
+}
+\aref{Lieske, J.H., 1979, {\it Astr.Astrophys.}\ {\bf 73}, 282.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EPB2D}{Besselian Epoch to MJD}
+{
+ \action{Conversion of Besselian Epoch to Modified Julian Date.}
+ \call{D~=~sla\_EPB2D (EPB)}
+}
+\args{GIVEN}
+{
+ \spec{EPB}{D}{Besselian Epoch}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EPB2D}{D}{Modified Julian Date (JD$-$2400000.5)}
+}
+\aref{Lieske, J.H., 1979. {\it Astr.Astrophys.}\ {\bf 73}, 282.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EPCO}{Convert Epoch to B or J}
+{
+ \action{Convert an epoch to Besselian or Julian to match another one.}
+ \call{D~=~sla\_EPCO (K0, K, E)}
+
+}
+\args{GIVEN}
+{
+ \spec{K0}{C}{form of result:  `B'=Besselian, `J'=Julian} \\
+ \spec{K}{C}{form of given epoch:  `B' or `J'} \\
+ \spec{E}{D}{epoch}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EPCO}{D}{the given epoch converted as necessary}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The result is always either equal to or very close to
+        the given epoch E.  The routine is required only in
+        applications where punctilious treatment of heterogeneous
+        mixtures of star positions is necessary.
+  \item K0 and K are not validated.  They are interpreted as follows:
+        \begin{itemize}
+         \item If K0 and K are the same, the result is E.
+         \item If K0 is `B' and K isn't, the conversion is J to B.
+         \item In all other cases, the conversion is B to J.
+        \end{itemize}
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EPJ}{MJD to Julian Epoch}
+{
+ \action{Convert Modified Julian Date to Julian Epoch.}
+ \call{D~=~sla\_EPJ (DATE)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{Modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EPJ}{D}{Julian Epoch}
+}
+\aref{Lieske, J.H., 1979.\ {\it Astr.Astrophys.}, {\bf 73}, 282.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EPJ2D}{Julian Epoch to MJD}
+{
+ \action{Convert Julian Epoch to Modified Julian Date.}
+ \call{D~=~sla\_EPJ2D (EPJ)}
+}
+\args{GIVEN}
+{
+ \spec{EPJ}{D}{Julian Epoch}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EPJ2D}{D}{Modified Julian Date (JD$-$2400000.5)}
+}
+\aref{Lieske, J.H., 1979.\ {\it Astr.Astrophys.}, {\bf 73}, 282.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EPV}{Earth Position \& Velocity (high accuracy)}
+{
+ \action{Earth position and velocity, heliocentric and barycentric,
+         with respect to the Barycentric Celestial Reference System.}
+ \call{CALL sla\_EPV (DATE, PH, VH, PB, VB)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB Modified Julian Date (Note~1)}
+}
+\args{RETURNED}
+{
+ \spec{PH}{D(3)}{heliocentric \xyz, AU} \\
+ \spec{VH}{D(3)}{heliocentric \xyzd, AU~d$^{-1}$} \\
+ \spec{PB}{D(3)}{barycentric \xyz, AU} \\
+ \spec{VB}{D(3)}{barycentric \xyzd, AU~d$^{-1}$}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The date is TDB as MJD (=JD$-$2400000.5).  TT can be used
+        instead of TDB in most applications.
+  \item The vectors are with respect to the Barycentric Celestial
+        Reference System (BCRS).  Positions are in AU;  velocities are in
+        AU per TDB day.
+  \item The routine is a {\it simplified solution}\/ from the planetary
+        theory VSOP2000 (X.\,Moisson, P.\,Bretagnon, 2001, Celes. Mechanics
+        \& Dyn. Astron., {\bf 80}, 3/4, 205-213) and is an adaptation of
+        original Fortran code supplied by P.\,Bretagnon (private
+        communication, 2000).
+  \item Comparisons over the time span 1900-2100 with this simplified
+        solution and the JPL DE405 ephemeris give the following results:
+
+        \begin{tabular}{lllll}
+        &               & RMS & max \\
+        & Heliocentric: \\
+        & ~~~~~position error & 3.7 & 11.2 & km \\
+        & ~~~~~velocity error & 1.4 & ~5.0 & mm/s \\
+        & Barycentric: \\
+        & ~~~~~position error & 4.6 & 13.4 & km \\
+        & ~~~~~velocity error & 1.4 & ~4.9 & mm/s
+        \end{tabular}
+
+        The results deteriorate outside this time span.
+  \item The routine sla\_EVP is faster but less accurate.
+        The present routine targets the case where high
+        accuracy is more important
+        than CPU time, yet the extra complication of reading a
+        pre-computed ephemeris is not justified.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EQECL}{J2000 $\alpha,\delta$ to Ecliptic}
+{
+ \action{Transformation from J2000.0 equatorial coordinates to
+         ecliptic longitude and latitude.}
+ \call{CALL sla\_EQECL (DR, DD, DATE, DL, DB)}
+}
+\args{GIVEN}
+{
+ \spec{DR,DD}{D}{J2000.0 mean \radec\ (radians)} \\
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{DL,DB}{D}{ecliptic longitude and latitude
+                        (mean of date, IAU 1980 theory, radians)}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EQEQX}{Equation of the Equinoxes}
+{
+ \action{Equation of the equinoxes (IAU 1994).}
+ \call{D~=~sla\_EQEQX (DATE)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_EQEQX}{D}{The equation of the equinoxes (radians)}
+}
+\notes{
+ \begin{enumerate}
+  \item The equation of the equinoxes is defined here as GAST~$-$~GMST:
+        it is added to a {\it mean}\/ sidereal time to give the
+        {\it apparent}\/ sidereal time.
+  \item The change from the classic ``textbook'' expression
+        $\Delta\psi\,cos\,\epsilon$ occurred with IAU Resolution C7,
+        Recommendation~3 (1994).  The new formulation takes into
+        account cross-terms between the various precession and
+        nutation quantities, amounting to about 3~milliarcsec.
+        The transition from the old to the new model officially
+        took place on 1997 February~27.
+ \end{enumerate}
+}
+\aref{Capitaine, N.\ \& Gontier, A.-M.\ (1993),
+      {\it Astron. Astrophys.},
+      {\bf 275}, 645-650.}
+%-----------------------------------------------------------------------
+\routine{SLA\_EQGAL}{J2000 $\alpha,\delta$ to Galactic}
+{
+ \action{Transformation from J2000.0 FK5 equatorial coordinates to
+ IAU 1958 galactic coordinates.}
+ \call{CALL sla\_EQGAL (DR, DD, DL, DB)}
+}
+\args{GIVEN}
+{
+ \spec{DR,DD}{D}{J2000.0 \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal\ (radians)}
+}
+\anote{The equatorial coordinates are J2000.0 FK5.  Use the routine
+       sla\_EG50 if conversion from B1950.0 FK4 coordinates is required.}
+\aref{Blaauw {\it et al.}, 1960, {\it Mon.Not.R.astr.Soc.},
+      {\bf 121}, 123.}
+%-----------------------------------------------------------------------
+\routine{SLA\_ETRMS}{E-terms of Aberration}
+{
+ \action{Compute the E-terms vector -- the part of the annual
+         aberration which arises from the eccentricity of the
+         Earth's orbit.}
+ \call{CALL sla\_ETRMS (EP, EV)}
+}
+\args{GIVEN}
+{
+ \spec{EP}{D}{Besselian epoch}
+}
+\args{RETURNED}
+{
+ \spec{EV}{D(3)}{E-terms as $[\Delta x, \Delta y, \Delta z\,]$}
+}
+\anote{Note the use of the J2000 aberration constant (\arcsec{20}{49552}).
+       This is a reflection of the fact that the E-terms embodied in
+       existing star catalogues were computed from a variety of
+       aberration constants.  Rather than adopting one of the old
+       constants the latest value is used here.}
+\refs
+{
+ \begin{enumerate}
+  \item Smith, C.A.\ {\it et al.}, 1989.  {\it Astr.J.}\ {\bf 97}, 265.
+  \item Yallop, B.D.\ {\it et al.}, 1989.  {\it Astr.J.}\ {\bf 97}, 274.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EULER}{Rotation Matrix from Euler Angles}
+{
+ \action{Form a rotation matrix from the Euler angles -- three
+         successive rotations about specified Cartesian axes
+         (single precision).}
+ \call{CALL sla\_EULER (ORDER, PHI, THETA, PSI, RMAT)}
+}
+\args{GIVEN}
+{
+ \spec{ORDER}{C*(*)}{specifies about which axes the rotations occur} \\
+ \spec{PHI}{R}{1st rotation (radians)} \\
+ \spec{THETA}{R}{2nd rotation (radians)} \\
+ \spec{PSI}{R}{3rd rotation (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RMAT}{R(3,3)}{rotation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A rotation is positive when the reference frame rotates
+        anticlockwise as seen looking towards the origin from the
+        positive region of the specified axis.
+  \item The characters of ORDER define which axes the three successive
+        rotations are about.  A typical value is `ZXZ', indicating that
+        RMAT is to become the direction cosine matrix corresponding to
+        rotations of the reference frame through PHI radians about the
+        old {\it z}-axis, followed by THETA radians about the resulting
+        {\it x}-axis,
+        then PSI radians about the resulting {\it z}-axis.  In detail:
+        \begin{itemize}
+         \item The axis names can be any of the following, in any order or
+               combination:  X, Y, Z, uppercase or lowercase, 1, 2, 3.  Normal
+               axis labelling/numbering conventions apply;
+               the {\it xyz} ($\equiv123$)
+               triad is right-handed.  Thus, the `ZXZ' example given above
+               could be written `zxz' or `313' (or even `ZxZ' or `3xZ').
+         \item ORDER is terminated by length or by the first unrecognized
+               character.
+         \item Fewer than three rotations are acceptable, in which case
+               the later angle arguments are ignored.
+        \end{itemize}
+  \item Zero rotations produces the identity RMAT.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_EVP}{Earth Position \& Velocity}
+{
+ \action{Barycentric and heliocentric velocity and position of the Earth.}
+ \call{CALL sla\_EVP (DATE, DEQX, DVB, DPB, DVH, DPH)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as a Modified Julian Date
+                                        (JD$-$2400000.5)} \\
+ \spec{DEQX}{D}{Julian Epoch ({\it e.g.}\ 2000D0) of mean equator and
+                equinox of the vectors returned.  If DEQX~$<0$,
+                  all vectors are referred to the mean equator and
+                  equinox (FK5) of date DATE.}
+}
+\args{RETURNED}
+{
+ \spec{DVB}{D(3)}{barycentric \xyzd, AU~s$^{-1}$} \\
+ \spec{DPB}{D(3)}{barycentric \xyz, AU} \\
+ \spec{DVH}{D(3)}{heliocentric \xyzd, AU~s$^{-1}$} \\
+ \spec{DPH}{D(3)}{heliocentric \xyz, AU}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine is accurate enough for many purposes but faster
+        and more compact than the sla\_EPV routine.  The maximum
+        deviations from the JPL~DE96 ephemeris are as follows:
+        \begin{itemize}
+         \item velocity (barycentric or heliocentric): 420~mm~s$^{-1}$
+         \item position (barycentric): 6900~km
+         \item position (heliocentric): 1600~km
+        \end{itemize}
+  \item The routine is adapted from the BARVEL and BARCOR
+        subroutines of Stumpff (1980).
+        Most of the changes are merely cosmetic and do not affect
+        the results at all.  However, some adjustments have been
+        made so as to give results that refer to the IAU 1976
+        `FK5' equinox and precession, although the differences these
+        changes make relative to the results from Stumpff's original
+        `FK4' version are smaller than the inherent accuracy of the
+        algorithm.  One minor shortcoming in the original routines
+        that has {\bf not} been corrected is that slightly better
+        numerical accuracy could be achieved if the various polynomial
+        evaluations were to be so arranged that the smallest terms were
+        computed first.
+ \end{enumerate}
+}
+\aref {Stumpff, P., 1980.,  {\it Astron.Astrophys.Suppl.Ser.}\
+       {\bf 41}, 1-8.}
+%-----------------------------------------------------------------------
+\routine{SLA\_FITXY}{Fit Linear Model to Two \xy\ Sets}
+{
+ \action{Fit a linear model to relate two sets of \xy\ coordinates.}
+ \call{CALL sla\_FITXY (ITYPE, NP, XYE, XYM, COEFFS, J)}
+}
+\args{GIVEN}
+{
+ \spec{ITYPE}{I}{type of model: 4 or 6 (note 1)} \\
+ \spec{NP}{I}{number of samples (note 2)} \\
+ \spec{XYE}{D(2,NP)}{expected \xy\ for each sample} \\
+ \spec{XYM}{D(2,NP)}{measured \xy\ for each sample}
+}
+\args{RETURNED}
+{
+ \spec{COEFFS}{D(6)}{coefficients of model (note 3)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK} \\
+ \spec{}{}{\hspace{0.7em} $-$1 = illegal ITYPE} \\
+ \spec{}{}{\hspace{0.7em} $-$2 = insufficient data} \\
+ \spec{}{}{\hspace{0.7em} $-$3 = singular solution}
+}
+\notes
+{
+ \begin{enumerate}
+  \item ITYPE, which must be either 4 or 6, selects the type of model
+        fitted.  Both allowed ITYPE values produce a model COEFFS which
+        consists of six coefficients, namely the zero points and, for
+        each of XE and YE, the coefficient of XM and YM.  For ITYPE=6,
+        all six coefficients are independent, modelling squash and shear
+        as well as origin, scale, and orientation.  However, ITYPE=4
+        selects the {\it solid body rotation}\/ option;  the model COEFFS
+        still consists of the same six coefficients, but now two of
+        them are used twice (appropriately signed).  Origin, scale
+        and orientation are still modelled, but not squash or shear --
+        the units of X and Y have to be the same.
+  \item For NC=4, NP must be at least 2.  For NC=6, NP must be at
+        least 3.
+  \item The model is returned in the array COEFFS.  Naming the
+        six elements of COEFFS $a,b,c,d,e$ \& $f$,
+        the model transforms {\it measured}\/ coordinates
+        $[x_{m},y_{m}\,]$ into {\it expected}\/ coordinates
+        $[x_{e},y_{e}\,]$ as follows:
+        \begin{verse}
+         $x_{e} = a + bx_{m} + cy_{m}$ \\
+         $y_{e} = d + ex_{m} + fy_{m}$
+        \end{verse}
+        For the {\it solid body rotation}\/ option (ITYPE=4), the
+        magnitudes of $b$ and $f$, and of $c$ and $e$, are equal.  The
+        signs of these coefficients depend on whether there is a
+        sign reversal between $[x_{e},y_{e}]$ and $[x_{m},y_{m}]$;
+        fits are performed
+        with and without a sign reversal and the best one chosen.
+  \item Error status values J=$-$1 and $-$2 leave COEFFS unchanged;
+        if J=$-$3 COEFFS may have been changed.
+  \item See also sla\_PXY, sla\_INVF, sla\_XY2XY, sla\_DCMPF.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK425}{FK4 to FK5}
+{
+ \action{Convert B1950.0 FK4 star data to J2000.0 FK5.
+         This routine converts stars from the old, Bessel-Newcomb, FK4
+         system to the new, IAU~1976, FK5, Fricke system.  The precepts
+         of Smith~{\it et~al.}\ (see reference~1) are followed,
+         using the implementation
+         by Yallop~{\it et~al.}\ (reference~2) of a matrix method
+         due to Standish.
+         Kinoshita's development of Andoyer's post-Newcomb precession is
+         used.  The numerical constants from
+         Seidelmann~{\it et~al.}\  (reference~3) are used canonically.}
+ \call{CALL sla\_FK425 (\vtop{
+         \hbox{R1950,D1950,DR1950,DD1950,P1950,V1950,}
+         \hbox{R2000,D2000,DR2000,DD2000,P2000,V2000)}}}
+}
+\args{GIVEN}
+{
+ \spec{R1950}{D}{B1950.0 $\alpha$ (radians)} \\
+ \spec{D1950}{D}{B1950.0 $\delta$ (radians)} \\
+ \spec{DR1950}{D}{B1950.0 proper motion in $\alpha$
+                              (radians per tropical year)} \\
+ \spec{DD1950}{D}{B1950.0 proper motion in $\delta$
+                              (radians per tropical year)} \\
+ \spec{P1950}{D}{B1950.0 parallax (arcsec)} \\
+ \spec{V1950}{D}{B1950.0 radial velocity (km~s$^{-1}$, +ve = moving away)}
+}
+\args{RETURNED}
+{
+ \spec{R2000}{D}{J2000.0 $\alpha$ (radians)} \\
+ \spec{D2000}{D}{J2000.0 $\delta$ (radians)} \\
+ \spec{DR2000}{D}{J2000.0 proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DD2000}{D}{J2000.0 proper motion in $\delta$
+                              (radians per Julian year)} \\
+ \spec{P2000}{D}{J2000.0 parallax (arcsec)} \\
+ \spec{V2000}{D}{J2000.0 radial velocity (km~s$^{-1}$, +ve = moving away)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item Conversion from Besselian epoch 1950.0 to Julian epoch
+        2000.0 only is provided for.  Conversions involving other
+        epochs will require use of the appropriate precession,
+        proper motion, and E-terms routines before and/or after FK425
+        is called.
+  \item In the FK4 catalogue the proper motions of stars within
+        $10^{\circ}$ of the poles do not include the {\it differential
+        E-terms}\/ effect and should, strictly speaking, be handled
+        in a different manner from stars outside these regions.
+        However, given the general lack of homogeneity of the star
+        data available for routine astrometry, the difficulties of
+        handling positions that may have been determined from
+        astrometric fields spanning the polar and non-polar regions,
+        the likelihood that the differential E-terms effect was not
+        taken into account when allowing for proper motion in past
+        astrometry, and the undesirability of a discontinuity in
+        the algorithm, the decision has been made in this routine to
+        include the effect of differential E-terms on the proper
+        motions for all stars, whether polar or not.  At epoch J2000,
+        and measuring on the sky rather than in terms of $\Delta\alpha$,
+        the errors resulting from this simplification are less than
+        1~milliarcsecond in position and 1~milliarcsecond per
+        century in proper motion.
+  \item See also sla\_FK45Z, sla\_FK524, sla\_FK54Z.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Smith, C.A.\ {\it et al.}, 1989.\  {\it Astr.J.}\ {\bf 97}, 265.
+  \item Yallop, B.D.\ {\it et al.}, 1989.\ {\it Astr.J.}\ {\bf 97}, 274.
+  \item Seidelmann, P.K.\ (ed), 1992.  {\it Explanatory
+        Supplement to the Astronomical Almanac,}\/ ISBN~0-935702-68-7.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK45Z}{FK4 to FK5, no P.M. or Parallax}
+{
+ \action{Convert B1950.0 FK4 star data to J2000.0 FK5 assuming zero
+         proper motion in the FK5 frame.
+         This routine converts stars from the old, Bessel-Newcomb, FK4
+         system to the new, IAU~1976, FK5, Fricke system, in such a
+         way that the FK5 proper motion is zero.  Because such a star
+         has, in general, a non-zero proper motion in the FK4 system,
+         the routine requires the epoch at which the position in the
+         FK4 system was determined.  The method is from appendix~2 of
+         reference~1, but using the constants of reference~4.}
+ \call{CALL sla\_FK45Z (R1950, D1950, BEPOCH, R2000, D2000)}
+}
+\args{GIVEN}
+{
+ \spec{R1950}{D}{B1950.0 FK4 $\alpha$ at epoch BEPOCH (radians)} \\
+ \spec{D1950}{D}{B1950.0 FK4 $\delta$ at epoch BEPOCH (radians)} \\
+ \spec{BEPOCH}{D}{Besselian epoch ({\it e.g.}\ 1979.3D0)}
+}
+\args{RETURNED}
+{
+ \spec{R2000}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D2000}{D}{J2000.0 FK5 $\delta$ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The epoch BEPOCH is strictly speaking Besselian, but
+        if a Julian epoch is supplied the result will be
+        affected only to a negligible extent.
+  \item Conversion from Besselian epoch 1950.0 to Julian epoch
+        2000.0 only is provided for.  Conversions involving other
+        epochs will require use of the appropriate precession,
+        proper motion, and E-terms routines before and/or
+        after FK45Z is called.
+  \item In the FK4 catalogue the proper motions of stars within
+        $10^{\circ}$ of the poles do not include the {\it differential
+        E-terms}\/ effect and should, strictly speaking, be handled
+        in a different manner from stars outside these regions.
+        However, given the general lack of homogeneity of the star
+        data available for routine astrometry, the difficulties of
+        handling positions that may have been determined from
+        astrometric fields spanning the polar and non-polar regions,
+        the likelihood that the differential E-terms effect was not
+        taken into account when allowing for proper motion in past
+        astrometry, and the undesirability of a discontinuity in
+        the algorithm, the decision has been made in this routine to
+        include the effect of differential E-terms on the proper
+        motions for all stars, whether polar or not.  At epoch 2000,
+        and measuring on the sky rather than in terms of $\Delta\alpha$,
+        the errors resulting from this simplification are less than
+        1~milliarcsecond in position and 1~milliarcsecond per
+        century in proper motion.
+  \item See also sla\_FK425, sla\_FK524, sla\_FK54Z.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Aoki, S., {\it et al.}, 1983.\ {\it Astr.Astrophys.}, {\bf 128}, 263.
+  \item Smith, C.A.\ {\it et al.}, 1989.\  {\it Astr.J.}\ {\bf 97}, 265.
+  \item Yallop, B.D.\ {\it et al.}, 1989.\ {\it Astr.J.}\ {\bf 97}, 274.
+  \item Seidelmann, P.K.\ (ed), 1992.  {\it Explanatory
+        Supplement to the Astronomical Almanac,}\/ ISBN~0-935702-68-7.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK524}{FK5 to FK4}
+{
+ \action{Convert J2000.0 FK5 star data to B1950.0 FK4.
+         This routine converts stars from the new, IAU~1976, FK5, Fricke
+         system, to the old, Bessel-Newcomb, FK4 system.
+         The precepts of Smith~{\it et~al.}\ (reference~1) are followed,
+         using the implementation by Yallop~{\it et~al.}\ (reference~2)
+         of a matrix method due to Standish.  Kinoshita's development of
+         Andoyer's post-Newcomb precession is used.  The numerical
+         constants from Seidelmann~{\it et~al.}\ (reference~3) are
+         used canonically.}
+ \call{CALL sla\_FK524 (\vtop{
+         \hbox{R2000, D2000, DR2000, DD2000, P2000, V2000,}
+         \hbox{R1950, D1950, DR1950, DD1950, P1950, V1950)}}}
+}
+\args{GIVEN}
+{
+ \spec{R2000}{D}{J2000.0 $\alpha$ (radians)} \\
+ \spec{D2000}{D}{J2000.0 $\delta$ (radians)} \\
+ \spec{DR2000}{D}{J2000.0 proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DD2000}{D}{J2000.0 proper motion in $\delta$
+                              (radians per Julian year)} \\
+ \spec{P2000}{D}{J2000.0 parallax (arcsec)} \\
+ \spec{V2000}{D}{J2000 radial velocity (km~s$^{-1}$, +ve = moving away)}
+}
+\args{RETURNED}
+{
+ \spec{R1950}{D}{B1950.0 $\alpha$ (radians)} \\
+ \spec{D1950}{D}{B1950.0 $\delta$ (radians)} \\
+ \spec{DR1950}{D}{B1950.0 proper motion in $\alpha$
+                              (radians per tropical year)} \\
+ \spec{DD1950}{D}{B1950.0 proper motion in $\delta$
+                              (radians per tropical year)} \\
+ \spec{P1950}{D}{B1950.0 parallax (arcsec)} \\
+ \spec{V1950}{D}{radial velocity (km~s$^{-1}$, +ve = moving away)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item Note that conversion from Julian epoch 2000.0 to Besselian
+        epoch 1950.0 only is provided for.  Conversions involving
+        other epochs will require use of the appropriate precession,
+        proper motion, and E-terms routines before and/or after
+        FK524 is called.
+  \item In the FK4 catalogue the proper motions of stars within
+        $10^{\circ}$ of the poles do not include the {\it differential
+        E-terms}\/ effect and should, strictly speaking, be handled
+        in a different manner from stars outside these regions.
+        However, given the general lack of homogeneity of the star
+        data available for routine astrometry, the difficulties of
+        handling positions that may have been determined from
+        astrometric fields spanning the polar and non-polar regions,
+        the likelihood that the differential E-terms effect was not
+        taken into account when allowing for proper motion in past
+        astrometry, and the undesirability of a discontinuity in
+        the algorithm, the decision has been made in this routine to
+        include the effect of differential E-terms on the proper
+        motions for all stars, whether polar or not.  At epoch 2000,
+        and measuring on the sky rather than in terms of $\Delta\alpha$,
+        the errors resulting from this simplification are less than
+        1~milliarcsecond in position and 1~milliarcsecond per
+        century in proper motion.
+  \item See also sla\_FK425, sla\_FK45Z, sla\_FK54Z.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Smith, C.A.\ {\it et al.}, 1989.\  {\it Astr.J.}\ {\bf 97}, 265.
+  \item Yallop, B.D.\ {\it et al.}, 1989.\ {\it Astr.J.}\ {\bf 97}, 274.
+  \item Seidelmann, P.K.\ (ed), 1992.  {\it Explanatory
+        Supplement to the Astronomical Almanac,}\/ ISBN~0-935702-68-7.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK52H}{FK5 to Hipparcos}
+{
+ \action{Transform an FK5 (J2000) position and proper motion
+         into the frame of the Hipparcos catalogue.}
+ \call{CALL sla\_FK52H (R5, D5, DR5, DD5, RH, DH, DRH, DDH)}
+}
+\args{GIVEN}
+{
+ \spec{R5}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D5}{D}{J2000.0 FK5 $\delta$ (radians)} \\
+ \spec{DR5}{D}{J2000.0 FK5 proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DD5}{D}{J2000.0 FK5 proper motion in $\delta$
+                              (radians per Julian year)}
+}
+\args{RETURNED}
+{
+ \spec{RH}{D}{Hipparcos $\alpha$ (radians)} \\
+ \spec{DH}{D}{Hipparcos $\delta$ (radians)} \\
+ \spec{DRH}{D}{Hipparcos proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DDH}{D}{Hipparcos proper motion in $\delta$
+                              (radians per Julian year)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item The FK5 to Hipparcos
+        transformation consists of a pure rotation and spin;
+        zonal errors in the FK5 catalogue are not taken into account.
+  \item The adopted epoch J2000.0 FK5 to Hipparcos orientation and spin
+        values are as follows (see reference):
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~~~
+        \begin{tabular}{|r|r|r|} \hline
+        &
+        \multicolumn{1}{|c}{\it orientation} &
+        \multicolumn{1}{|c|}{\it ~~~spin~~~} \\ \hline
+        $x$ & $-19.9$~~~~ & ~$-0.30$~~ \\
+        $y$ &  $-9.1$~~~~ & ~$+0.60$~~ \\
+        $z$ & $+22.9$~~~~ & ~$+0.70$~~ \\ \hline
+        & {\it mas}~~~~~ & ~{\it mas/y}~ \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        These orientation and spin components are interpreted as
+        {\it axial vectors.}  An axial vector points at the pole of
+        the rotation and its length is the amount of rotation in radians.
+  \item See also sla\_FK5HZ, sla\_H2FK5, sla\_HFK5Z.
+ \end{enumerate}
+}
+\aref {Feissel, M.\ \& Mignard, F., 1998.,  {\it Astron.Astrophys.}\
+       {\bf 331}, L33-L36.}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK54Z}{FK5 to FK4, no P.M. or Parallax}
+{
+ \action{Convert a J2000.0 FK5 star position to B1950.0 FK4 assuming
+         FK5 zero proper motion and parallax.
+         This routine converts star positions from the new, IAU~1976,
+         FK5, Fricke system to the old, Bessel-Newcomb, FK4 system.}
+ \call{CALL sla\_FK54Z (R2000, D2000, BEPOCH, R1950, D1950, DR1950, DD1950)}
+}
+\args{GIVEN}
+{
+ \spec{R2000}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D2000}{D}{J2000.0 FK5 $\delta$ (radians)} \\
+ \spec{BEPOCH}{D}{Besselian epoch ({\it e.g.}\ 1950D0)}
+}
+\args{RETURNED}
+{
+ \spec{R1950}{D}{B1950.0 FK4 $\alpha$ at epoch BEPOCH (radians)} \\
+ \spec{D1950}{D}{B1950.0 FK4 $\delta$ at epoch BEPOCH (radians)} \\
+ \spec{DR1950}{D}{B1950.0 FK4 proper motion in $\alpha$
+                              (radians per tropical year)} \\
+ \spec{DD1950}{D}{B1950.0 FK4 proper motion in $\delta$
+                              (radians per tropical year)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item Conversion from Julian epoch 2000.0 to Besselian epoch 1950.0
+        only is provided for.  Conversions involving other epochs will
+        require use of the appropriate precession routines before and
+        after this routine is called.
+  \item Unlike in the sla\_FK524 routine, the FK5 proper motions, the
+        parallax and the radial velocity are presumed zero.
+  \item It was the intention that FK5 should be a close approximation
+        to an inertial frame, so that distant objects have zero proper
+        motion;  such objects have (in general) non-zero proper motion
+        in FK4, and this routine returns those {\it fictitious proper
+        motions}.
+  \item The position returned by this routine is in the B1950
+        reference frame but at Besselian epoch BEPOCH.  For
+        comparison with catalogues the BEPOCH argument will
+        frequently be 1950D0.
+  \item See also sla\_FK425, sla\_FK45Z, sla\_FK524.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_FK5HZ}{FK5 to Hipparcos, no P.M.}
+{
+ \action{Transform an FK5 (J2000) star position into the frame of the
+         Hipparcos catalogue, assuming zero Hipparcos proper motion.}
+ \call{CALL sla\_FK5HZ (R5, D5, EPOCH, RH, DH)}
+}
+\args{GIVEN}
+{
+ \spec{R5}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D5}{D}{J2000.0 FK5 $\delta$ (radians)} \\
+ \spec{EPOCH}{D}{Julian epoch (TDB)}
+}
+\args{RETURNED}
+{
+ \spec{RH}{D}{Hipparcos $\alpha$ (radians)} \\
+ \spec{DH}{D}{Hipparcos $\delta$ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item The FK5 to Hipparcos
+        transformation consists of a pure rotation and spin;
+        zonal errors in the FK5 catalogue are not taken into account.
+  \item The adopted epoch J2000.0 FK5 to Hipparcos orientation and spin
+        values are as follows (see reference):
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~~~
+        \begin{tabular}{|r|r|r|} \hline
+        &
+        \multicolumn{1}{|c}{\it orientation} &
+        \multicolumn{1}{|c|}{\it ~~~spin~~~} \\ \hline
+        $x$ & $-19.9$~~~~ & ~$-0.30$~~ \\
+        $y$ &  $-9.1$~~~~ & ~$+0.60$~~ \\
+        $z$ & $+22.9$~~~~ & ~$+0.70$~~ \\ \hline
+        & {\it mas}~~~~~ & ~{\it mas/y}~ \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        These orientation and spin components are interpreted as
+        {\it axial vectors.}  An axial vector points at the pole of
+        the rotation and its length is the amount of rotation in radians.
+  \item See also sla\_FK52H, sla\_H2FK5, sla\_HFK5Z.
+ \end{enumerate}
+}
+\aref {Feissel, M.\ \& Mignard, F., 1998.,  {\it Astron.Astrophys.}\
+       {\bf 331}, L33-L36.}
+%-----------------------------------------------------------------------
+\routine{SLA\_FLOTIN}{Decode a Real Number}
+{
+ \action{Convert free-format input into single precision floating point.}
+ \call{CALL sla\_FLOTIN (STRING, NSTRT, RESLT, JFLAG)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C}{string containing number to be decoded} \\
+ \spec{NSTRT}{I}{pointer to where decoding is to commence} \\
+ \spec{RESLT}{R}{current value of result}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{advanced to next number} \\
+ \spec{RESLT}{R}{result} \\
+ \spec{JFLAG}{I}{status: $-$1~=~$-$OK, 0~=~+OK, 1~=~null result, 2~=~error}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The reason sla\_FLOTIN has separate `OK' status values
+       for + and $-$ is to enable minus zero to be detected.
+       This is of crucial importance
+       when decoding mixed-radix numbers.  For example, an angle
+       expressed as degrees, arcminutes and arcseconds may have a
+       leading minus sign but a zero degrees field.
+ \item A TAB is interpreted as a space, and lowercase characters are
+       interpreted as uppercase.  {\it n.b.}\ The test for TAB is
+       ASCII-specific.
+ \item The basic format is the sequence of fields $\pm n.n x \pm n$,
+       where $\pm$ is a sign
+       character `+' or `$-$', $n$ means a string of decimal digits,
+       `.' is a decimal point, and $x$, which indicates an exponent,
+       means `D' or `E'.  Various combinations of these fields can be
+       omitted, and embedded blanks are permissible in certain places.
+ \item Spaces:
+       \begin{itemize}
+       \item Leading spaces are ignored.
+       \item Embedded spaces are allowed only after +, $-$, D or E,
+             and after the decimal point if the first sequence of
+             digits is absent.
+       \item Trailing spaces are ignored;  the first signifies
+             end of decoding and subsequent ones are skipped.
+       \end{itemize}
+ \item Delimiters:
+       \begin{itemize}
+       \item Any character other than +,$-$,0-9,.,D,E or space may be
+             used to signal the end of the number and terminate decoding.
+       \item Comma is recognized by sla\_FLOTIN as a special case; it
+             is skipped, leaving the pointer on the next character.  See
+             13, below.
+       \item Decoding will in all cases terminate if end of string
+             is reached.
+       \end{itemize}
+ \item Both signs are optional.  The default is +.
+ \item The mantissa $n.n$ defaults to unity.
+ \item The exponent $x\!\pm\!n$ defaults to `E0'.
+ \item The strings of decimal digits may be of any length.
+ \item The decimal point is optional for whole numbers.
+ \item A {\it null result}\/ occurs when the string of characters
+       being decoded does not begin with +,$-$,0-9,.,D or E, or
+       consists entirely of spaces.  When this condition is
+       detected, JFLAG is set to 1 and RESLT is left untouched.
+ \item NSTRT = 1 for the first character in the string.
+ \item On return from sla\_FLOTIN, NSTRT is set ready for the next
+       decode -- following trailing blanks and any comma.  If a
+       delimiter other than comma is being used, NSTRT must be
+       incremented before the next call to sla\_FLOTIN, otherwise
+       all subsequent calls will return a null result.
+ \item Errors (JFLAG=2) occur when:
+       \begin{itemize}
+       \item a +, $-$, D or E is left unsatisfied; or
+       \item the decimal point is present without at least
+             one decimal digit before or after it; or
+       \item an exponent more than 100 has been presented.
+       \end{itemize}
+ \item When an error has been detected, NSTRT is left
+       pointing to the character following the last
+       one used before the error came to light.  This
+       may be after the point at which a more sophisticated
+       program could have detected the error.  For example,
+       sla\_FLOTIN does not detect that `1E999' is unacceptable
+       (on a computer where this is so)
+       until the entire number has been decoded.
+ \item Certain highly unlikely combinations of mantissa and
+       exponent can cause arithmetic faults during the
+       decode, in some cases despite the fact that they
+       together could be construed as a valid number.
+ \item Decoding is left to right, one pass.
+ \item See also sla\_DFLTIN and sla\_INTIN.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_GALEQ}{Galactic to J2000 $\alpha,\delta$}
+{
+ \action{Transformation from IAU 1958 galactic coordinates
+         to J2000.0 FK5 equatorial coordinates.}
+ \call{CALL sla\_GALEQ (DL, DB, DR, DD)}
+}
+\args{GIVEN}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal}
+}
+\args{RETURNED}
+{
+ \spec{DR,DD}{D}{J2000.0 \radec}
+}
+\notes
+{
+ \begin{enumerate}
+  \item All arguments are in radians.
+  \item The equatorial coordinates are J2000.0 FK5.  Use the routine
+        sla\_GE50 if conversion to B1950.0 FK4 coordinates is
+                           required.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_GALSUP}{Galactic to Supergalactic}
+{
+ \action{Transformation from IAU 1958 galactic coordinates to
+         de Vaucouleurs supergalactic coordinates.}
+ \call{CALL sla\_GALSUP (DL, DB, DSL, DSB)}
+}
+\args{GIVEN}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{DSL,DSB}{D}{supergalactic longitude and latitude (radians)}
+}
+\refs
+{
+ \begin{enumerate}
+  \item de Vaucouleurs, de Vaucouleurs, \& Corwin, {\it Second Reference
+    Catalogue of Bright Galaxies}, U.Texas, p8.
+  \item Systems \& Applied Sciences Corp., documentation for the
+        machine-readable version of the above catalogue,
+        Contract NAS 5-26490.
+ \end{enumerate}
+ (These two references give different values for the galactic
+ longitude of the supergalactic origin.  Both are wrong;  the
+ correct value is $l^{I\!I}=137.37$.)
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_GE50}{Galactic to B1950 $\alpha,\delta$}
+{
+ \action{Transformation from IAU 1958 galactic coordinates to
+         B1950.0 FK4 equatorial coordinates.}
+ \call{CALL sla\_GE50 (DL, DB, DR, DD)}
+}
+\args{GIVEN}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal}
+}
+\args{RETURNED}
+{
+ \spec{DR,DD}{D}{B1950.0 \radec}
+}
+\notes
+{
+ \begin{enumerate}
+  \item All arguments are in radians.
+  \item The equatorial coordinates are B1950.0 FK4.  Use the
+        routine sla\_GALEQ if conversion to J2000.0 FK5 coordinates
+        is required.
+ \end{enumerate}
+}
+\aref{Blaauw {\it et al.}, 1960, {\it Mon.Not.R.astr.Soc.},
+      {\bf 121}, 123.}
+%-----------------------------------------------------------------------
+\routine{SLA\_GEOC}{Geodetic to Geocentric}
+{
+ \action{Convert geodetic position to geocentric.}
+ \call{CALL sla\_GEOC (P, H, R, Z)}
+}
+\args{GIVEN}
+{
+ \spec{P}{D}{latitude (geodetic, radians)} \\
+ \spec{H}{D}{height above reference spheroid (geodetic, metres)}
+}
+\args{RETURNED}
+{
+ \spec{R}{D}{distance from Earth axis (AU)} \\
+ \spec{Z}{D}{distance from plane of Earth equator (AU)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Geocentric latitude can be obtained by evaluating {\tt ATAN2(Z,R)}.
+  \item IAU 1976 constants are used.
+ \end{enumerate}
+}
+\aref{Green, R.M., 1985.\ {\it Spherical Astronomy}, Cambridge U.P., p98.}
+%-----------------------------------------------------------------------
+\routine{SLA\_GMST}{UT to GMST}
+{
+ \action{Conversion from universal time UT1 to Greenwich mean
+         sidereal time.}
+ \call{D~=~sla\_GMST (UT1)}
+}
+\args{GIVEN}
+{
+ \spec{UT1}{D}{universal time (strictly UT1) expressed as
+                 modified Julian Date (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_GMST}{D}{Greenwich mean sidereal time (radians)}
+}
+\notes
+{
+  \begin{enumerate}
+       \item The IAU~1982 expression
+       (see page~S15 of the 1984 {\it Astronomical
+       Almanac})\/ is used, but rearranged to reduce rounding errors.  This
+       expression is always described as giving the GMST at $0^{\rm h}$UT;
+       in fact, it gives the difference between the
+       GMST and the UT, which happens to equal the GMST (modulo
+       24~hours) at $0^{\rm h}$UT each day.  In sla\_GMST, the
+       entire UT is used directly as the argument for the
+       canonical formula, and the fractional part of the UT is
+       added separately;  note that the factor $1.0027379\cdots$ does
+       not appear.
+       \item See also the routine sla\_GMSTA, which
+       delivers better numerical
+       precision by accepting the UT date and time as separate arguments.
+  \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_GMSTA}{UT to GMST (extra precision)}
+{
+ \action{Conversion from universal time UT1 to Greenwich mean
+         sidereal time, with rounding errors minimized.}
+ \call{D~=~sla\_GMSTA (DATE, UT1)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{UT1 date as Modified Julian Date (integer part
+                of JD$-$2400000.5)} \\
+ \spec{UT1}{D}{UT1 time (fraction of a day)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_GMST}{D}{Greenwich mean sidereal time (radians)}
+}
+\notes
+{
+  \begin{enumerate}
+       \item The algorithm is derived from the IAU 1982 expression
+       (see page~S15 of the 1984 Astronomical Almanac).
+       \item There is no restriction on how the UT is apportioned between the
+       DATE and UT1 arguments.  Either of the two arguments could, for
+       example, be zero and the entire date\,+\,time supplied in the other.
+       However, the routine is designed to deliver maximum accuracy when
+       the DATE argument is a whole number and the UT1 argument
+       lies in the range $[\,0,\,1\,]$, or {\it vice versa}.
+       \item See also the routine sla\_GMST, which accepts the UT1 as a single
+       argument.  Compared with sla\_GMST, the extra numerical precision
+       delivered by the present routine is unlikely to be important in
+       an absolute sense, but may be useful when critically comparing
+       algorithms and in applications where two sidereal times close
+       together are differenced.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_GRESID}{Gaussian Residual}
+{
+ \action{Generate pseudo-random normal deviate or {\it Gaussian residual}.}
+ \call{R~=~sla\_GRESID (S)}
+}
+\args{GIVEN}
+{
+ \spec{S}{R}{standard deviation}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The results of many calls to this routine will be
+        normally distributed with mean zero and standard deviation S.
+  \item The Box-Muller algorithm is used.
+  \item The implementation is machine-dependent.
+ \end{enumerate}
+}
+\aref{Ahrens \& Dieter, 1972.\ {\it Comm.A.C.M.}\ {\bf 15}, 873.}
+%-----------------------------------------------------------------------
+\routine{SLA\_H2E}{Az,El to $h,\delta$}
+{
+ \action{Horizon to equatorial coordinates
+         (single precision).}
+ \call{CALL sla\_H2E (AZ, EL, PHI, HA, DEC)}
+}
+\args{GIVEN}
+{
+ \spec{AZ}{R}{azimuth (radians)} \\
+ \spec{EL}{R}{elevation (radians)} \\
+ \spec{PHI}{R}{latitude (radians)}
+}
+\args{RETURNED}
+{
+ \spec{HA}{R}{hour angle (radians)} \\
+ \spec{DEC}{R}{declination (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The sign convention for azimuth is north zero, east $+\pi/2$.
+  \item HA is returned in the range $\pm\pi$.  Declination is returned
+        in the range $\pm\pi$.
+  \item The latitude is (in principle) geodetic.  In critical
+        applications, corrections for polar motion should be applied
+        (see sla\_POLMO).
+  \item In some applications it will be important to specify the
+        correct type of elevation in order to produce the required
+        type of \hadec.  In particular, it may be important to
+        distinguish between the elevation as affected by refraction,
+        which will yield the {\it observed} \hadec, and the elevation
+        {\it in vacuo}, which will yield the {\it topocentric}
+        \hadec.  If the
+        effects of diurnal aberration can be neglected, the
+        topocentric \hadec\ may be used as an approximation to the
+        {\it apparent} \hadec.
+  \item No range checking of arguments is carried out.
+  \item In applications which involve many such calculations, rather
+        than calling the present routine it will be more efficient to
+        use inline code, having previously computed fixed terms such
+        as sine and cosine of latitude.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_H2FK5}{Hipparcos to FK5}
+{
+ \action{Transform a Hipparcos star position and proper motion
+         into the FK5 (J2000) frame.}
+ \call{CALL sla\_H2FK5 (RH, DH, DRH, DDH, R5, D5, DR5, DD5)}
+}
+\args{GIVEN}
+{
+ \spec{RH}{D}{Hipparcos $\alpha$ (radians)} \\
+ \spec{DH}{D}{Hipparcos $\delta$ (radians)} \\
+ \spec{DRH}{D}{Hipparcos proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DDH}{D}{Hipparcos proper motion in $\delta$
+                              (radians per Julian year)}
+}
+\args{RETURNED}
+{
+ \spec{R5}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D5}{D}{J2000.0 FK5 $\delta$ (radians)} \\
+ \spec{DR5}{D}{J2000.0 FK5 proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DD5}{D}{FK5 J2000.0 proper motion in $\delta$
+                              (radians per Julian year)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item The FK5 to Hipparcos
+        transformation consists of a pure rotation and spin;
+        zonal errors in the FK5 catalogue are not taken into account.
+  \item The adopted epoch J2000.0 FK5 to Hipparcos orientation and spin
+        values are as follows (see reference):
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~~~
+        \begin{tabular}{|r|r|r|} \hline
+        &
+        \multicolumn{1}{|c}{\it orientation} &
+        \multicolumn{1}{|c|}{\it ~~~spin~~~} \\ \hline
+        $x$ & $-19.9$~~~~ & ~$-0.30$~~ \\
+        $y$ &  $-9.1$~~~~ & ~$+0.60$~~ \\
+        $z$ & $+22.9$~~~~ & ~$+0.70$~~ \\ \hline
+        & {\it mas}~~~~~ & ~{\it mas/y}~ \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        These orientation and spin components are interpreted as
+        {\it axial vectors.}  An axial vector points at the pole of
+        the rotation and its length is the amount of rotation in radians.
+  \item See also sla\_FK52H, sla\_FK5HZ, sla\_HFK5Z.
+ \end{enumerate}
+}
+\aref {Feissel, M.\ \& Mignard, F., 1998.,  {\it Astron.Astrophys.}\
+       {\bf 331}, L33-L36.}
+%-----------------------------------------------------------------------
+\routine{SLA\_HFK5Z}{Hipparcos to FK5, no P.M.}
+{
+ \action{Transform a Hipparcos star position
+         into the FK5 (J2000) frame assuming zero Hipparcos proper motion.}
+ \call{CALL sla\_HFK5Z (RH, DH, EPOCH, R5, D5, DR5, DD5)}
+}
+\args{GIVEN}
+{
+ \spec{RH}{D}{Hipparcos $\alpha$ (radians)} \\
+ \spec{DH}{D}{Hipparcos $\delta$ (radians)} \\
+ \spec{EPOCH}{D}{Julian epoch (TDB)}
+}
+\args{RETURNED}
+{
+ \spec{R5}{D}{J2000.0 FK5 $\alpha$ (radians)} \\
+ \spec{D5}{D}{J2000.0 FK5 $\delta$ (radians)} \\
+ \spec{DR5}{D}{J2000.0 FK5 proper motion in $\alpha$
+                              (radians per Julian year)} \\
+ \spec{DD5}{D}{FK5 J2000.0 proper motion in $\delta$
+                              (radians per Julian year)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item The FK5 to Hipparcos
+        transformation consists of a pure rotation and spin;
+        zonal errors in the FK5 catalogue are not taken into account.
+  \item The adopted epoch J2000.0 FK5 to Hipparcos orientation and spin
+        values are as follows (see reference):
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~~~
+        \begin{tabular}{|r|r|r|} \hline
+        &
+        \multicolumn{1}{|c}{\it orientation} &
+        \multicolumn{1}{|c|}{\it ~~~spin~~~} \\ \hline
+        $x$ & $-19.9$~~~~ & ~$-0.30$~~ \\
+        $y$ &  $-9.1$~~~~ & ~$+0.60$~~ \\
+        $z$ & $+22.9$~~~~ & ~$+0.70$~~ \\ \hline
+        & {\it mas}~~~~~ & ~{\it mas/y}~ \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        These orientation and spin components are interpreted as
+        {\it axial vectors.}  An axial vector points at the pole of
+        the rotation and its length is the amount of rotation in radians.
+  \item It was the intention that Hipparcos should be a close
+        approximation to an inertial frame, so that distant objects
+        have zero proper motion;  such objects have (in general)
+        non-zero proper motion in FK5, and this routine returns those
+        {\it fictitious proper motions.}
+  \item The position returned by this routine is in the FK5 J2000
+        reference frame but at Julian epoch EPOCH.
+  \item See also sla\_FK52H, sla\_FK5HZ, sla\_H2FK5.
+ \end{enumerate}
+}
+\aref {Feissel, M.\ \& Mignard, F., 1998.,  {\it Astron.Astrophys.}\
+       {\bf 331}, L33-L36.}
+%-----------------------------------------------------------------------
+\routine{SLA\_IMXV}{Apply 3D Reverse Rotation}
+{
+ \action{Multiply a 3-vector by the inverse of a rotation
+         matrix (single precision).}
+ \call{CALL sla\_IMXV (RM, VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{RM}{R(3,3)}{rotation matrix} \\
+ \spec{VA}{R(3)}{vector to be rotated}
+}
+\args{RETURNED}
+{
+ \spec{VB}{R(3)}{result vector}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine performs the operation:
+        \begin{verse}
+         {\bf b} = {\bf M}$^{T}\cdot${\bf a}
+        \end{verse}
+        where {\bf a} and {\bf b} are the 3-vectors VA and VB
+        respectively, and {\bf M} is the $3\times3$ matrix RM.
+  \item The main function of this routine is apply an inverse
+        rotation;  under these circumstances, ${\bf M}$ is
+        {\it orthogonal}, with its inverse the same as its transpose.
+  \item To comply with the ANSI Fortran 77 standard, VA and VB must
+        {\bf not} be the same array.  The routine is, in fact, coded
+        so as to work properly on the VAX and many other systems even
+        if this rule is violated, something that is {\bf not}, however,
+        recommended.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_INTIN}{Decode an Integer Number}
+{
+ \action{Convert free-format input into an integer.}
+ \call{CALL sla\_INTIN (STRING, NSTRT, IRESLT, JFLAG)}
+}
+\args{GIVEN}
+{
+ \spec{STRING}{C}{string containing number to be decoded} \\
+ \spec{NSTRT}{I}{pointer to where decoding is to commence} \\
+ \spec{IRESLT}{I}{current value of result}
+}
+\args{RETURNED}
+{
+ \spec{NSTRT}{I}{advanced to next number} \\
+ \spec{IRESLT}{I}{result} \\
+ \spec{JFLAG}{I}{status: $-$1 = $-$OK, 0~=~+OK, 1~=~null result, 2~=~error}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The reason sla\_INTIN has separate `OK' status values
+       for + and $-$ is to enable minus zero to be detected.
+       This is of crucial importance
+       when decoding mixed-radix numbers.  For example, an angle
+       expressed as degrees, arcminutes and arcseconds may have a
+       leading minus sign but a zero degrees field.
+ \item A TAB is interpreted as a space. {\it n.b.}\ The test for TAB is
+       ASCII-specific.
+ \item The basic format is the sequence of fields $\pm n$,
+       where $\pm$ is a sign
+       character `+' or `$-$', and $n$ means a string of decimal digits.
+ \item Spaces:
+       \begin{itemize}
+       \item Leading spaces are ignored.
+       \item Spaces between the sign and the number are allowed.
+       \item Trailing spaces are ignored;  the first signifies
+             end of decoding and subsequent ones are skipped.
+       \end{itemize}
+ \item Delimiters:
+       \begin{itemize}
+       \item Any character other than +,$-$,0-9 or space may be
+             used to signal the end of the number and terminate decoding.
+       \item Comma is recognized by sla\_INTIN as a special case; it
+             is skipped, leaving the pointer on the next character.  See
+             9, below.
+       \item Decoding will in all cases terminate if end of string
+             is reached.
+       \end{itemize}
+ \item The sign is optional.  The default is +.
+ \item A {\it null result}\/ occurs when the string of characters
+       being decoded does not begin with +,$-$ or 0-9, or
+       consists entirely of spaces.  When this condition is
+       detected, JFLAG is set to 1 and IRESLT is left untouched.
+ \item NSTRT = 1 for the first character in the string.
+ \item On return from sla\_INTIN, NSTRT is set ready for the next
+       decode -- following trailing blanks and any comma.  If a
+       delimiter other than comma is being used, NSTRT must be
+       incremented before the next call to sla\_INTIN, otherwise
+       all subsequent calls will return a null result.
+ \item Errors (JFLAG=2) occur when:
+       \begin{itemize}
+       \item there is a + or $-$ but no number; or
+       \item the number is greater than $2^{31}-1$.
+       \end{itemize}
+ \item When an error has been detected, NSTRT is left
+       pointing to the character following the last
+       one used before the error came to light.
+ \item See also sla\_FLOTIN and sla\_DFLTIN.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_INVF}{Invert Linear Model}
+{
+ \action{Invert a linear model of the type produced by the
+         sla\_FITXY routine.}
+ \call{CALL sla\_INVF (FWDS,BKWDS,J)}
+}
+\args{GIVEN}
+{
+ \spec{FWDS}{D(6)}{model coefficients}
+}
+\args{RETURNED}
+{
+ \spec{BKWDS}{D(6)}{inverse model} \\
+ \spec{J}{I}{status:  0 = OK, $-$1 = no inverse}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The models relate two sets of \xy\ coordinates as follows.
+        Naming the six elements of FWDS $a,b,c,d,e$ \& $f$,
+        where two sets of coordinates $[x_{1},y_{1}]$ and
+        $[x_{2},y_{2}\,]$ are related thus:
+        \begin{verse}
+         $x_{2} = a + bx_{1} + cy_{1}$ \\
+         $y_{2} = d + ex_{1} + fy_{1}$
+        \end{verse}
+        The present routine generates a new set of coefficients
+        $p,q,r,s,t$ \& $u$ (the array BKWDS) such that:
+        \begin{verse}
+         $x_{1} = p + qx_{2} + ry_{2}$ \\
+         $y_{1} = s + tx_{2} + uy_{2}$
+        \end{verse}
+  \item Two successive calls to this routine will deliver a set
+        of coefficients equal to the starting values.
+  \item To comply with the ANSI Fortran 77 standard, FWDS and BKWDS must
+        {\bf not} be the same array.  The routine is, in fact, coded
+        so as to work properly with many Fortran compilers even
+        if this rule is violated, something that is {\bf not}, however,
+        recommended.
+  \item See also sla\_FITXY, sla\_PXY, sla\_XY2XY, sla\_DCMPF.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_KBJ}{Select Epoch Prefix}
+{
+ \action{Select epoch prefix `B' or `J'.}
+ \call{CALL sla\_KBJ (JB, E, K, J)}
+}
+\args{GIVEN}
+{
+ \spec{JB}{I}{sla\_DBJIN prefix status:  0=none, 1=`B', 2=`J'} \\
+ \spec{E}{D}{epoch -- Besselian or Julian}
+}
+\args{RETURNED}
+{
+ \spec{K}{C}{`B' or `J'} \\
+ \spec{J}{I}{status:  0=OK}
+}
+\anote{The routine is mainly intended for use in conjunction with the
+       sla\_DBJIN routine.  If the value of JB indicates that an explicit
+       B or J prefix was detected by sla\_DBJIN, a `B' or `J'
+       is returned to match.  If JB indicates that no explicit B or J
+       was supplied, the choice is made on the basis of the epoch
+       itself;  B is assumed for E $<1984$, otherwise J.}
+%-----------------------------------------------------------------------
+\routine{SLA\_M2AV}{Rotation Matrix to Axial Vector}
+{
+ \action{From a rotation matrix, determine the corresponding axial vector
+        (single precision).}
+ \call{CALL sla\_M2AV (RMAT, AXVEC)}
+}
+\args{GIVEN}
+{
+ \spec{RMAT}{R(3,3)}{rotation matrix}
+}
+\args{RETURNED}
+{
+ \spec{AXVEC}{R(3)}{axial vector (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A rotation matrix describes a rotation about some arbitrary axis,
+        called the Euler axis.  The {\it axial vector} returned by
+        this routine has the same direction as the Euler axis, and its
+        magnitude is the amount of rotation in radians.
+  \item The magnitude and direction of the axial vector can be separated
+        by means of the routine sla\_VN.
+  \item The reference frame rotates clockwise as seen looking along
+        the axial vector from the origin.
+  \item If RMAT is null, so is the result.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_MAP}{Mean to Apparent}
+{
+ \action{Transform star \radec\ from mean place to geocentric apparent.
+         The reference frames and time scales used are post IAU~1976.}
+ \call{CALL sla\_MAP (RM, DM, PR, PD, PX, RV, EQ, DATE, RA, DA)}
+}
+\args{GIVEN}
+{
+ \spec{RM,DM}{D}{mean \radec\ (radians)} \\
+ \spec{PR,PD}{D}{proper motions:  \radec\ changes per Julian year} \\
+ \spec{PX}{D}{parallax (arcsec)} \\
+ \spec{RV}{D}{radial velocity (km~s$^{-1}$, +ve if receding)} \\
+ \spec{EQ}{D}{epoch and equinox of star data (Julian)} \\
+ \spec{DATE}{D}{TDB for apparent place (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{RA,DA}{D}{apparent \radec\ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item EQ is the Julian epoch specifying both the reference
+        frame and the epoch of the position -- usually 2000.
+        For positions where the epoch and equinox are
+        different, use the routine sla\_PM to apply proper
+        motion corrections before using this routine.
+  \item The distinction between the required TDB and TT is
+        always negligible.  Moreover, for all but the most
+        critical applications UTC is adequate.
+  \item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+        $\dot{\alpha}\cos\delta$, and are per year rather than per century.
+  \item This routine may be wasteful for some applications
+        because it recomputes the Earth position/velocity and
+        the precession-nutation matrix each time, and because
+        it allows for parallax and proper motion.  Where
+        multiple transformations are to be carried out for one
+        epoch, a faster method is to call the sla\_MAPPA routine
+        once and then either the sla\_MAPQK routine (which includes
+        parallax and proper motion) or sla\_MAPQKZ (which assumes
+        zero parallax and FK5 proper motion).
+  \item The accuracy, starting from ICRS star data,
+        is limited to about 1~mas by the
+        precession-nutation model used, SF2001.
+        A different precession-nutation model
+        can be introduced by using sla\_MAPPA and sla\_MAPQK (see
+        the previous note) and replacing the precession-nutation
+        matrix into the parameter array directly.
+  \item The accuracy is further limited by the routine sla\_EVP, called
+        by sla\_MAPPA, which computes the Earth position and
+        velocity using the methods of Stumpff.  The maximum
+        error is about 0.3~milliarcsecond.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_MAPPA}{Mean to Apparent Parameters}
+{
+ \action{Compute star-independent parameters in preparation for
+         conversions between mean place and geocentric apparent place.
+         The parameters produced by this routine are required in the
+         parallax, light deflection, aberration, and precession-nutation
+         parts of the mean/apparent transformations.
+         The reference frames and time scales used are post IAU~1976.}
+ \call{CALL sla\_MAPPA (EQ, DATE, AMPRMS)}
+}
+\args{GIVEN}
+{
+ \spec{EQ}{D}{epoch of mean equinox to be used (Julian)} \\
+ \spec{DATE}{D}{TDB (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{AMPRMS}{D(21)}{star-independent mean-to-apparent parameters:} \\
+ \specel   {(1)}     {time interval for proper motion (Julian years)} \\
+ \specel   {(2-4)}   {barycentric position of the Earth (AU)} \\
+ \specel   {(5-7)}   {heliocentric direction of the Earth (unit vector)} \\
+ \specel   {(8)}     {(gravitational radius of
+                      Sun)$\times 2 / $(Sun-Earth distance)} \\
+ \specel   {(9-11)}  {{\bf v}: barycentric Earth velocity in units of c} \\
+ \specel   {(12)}    {$\sqrt{1-\left|\mbox{\bf v}\right|^2}$} \\
+ \specel   {(13-21)} {precession-nutation $3\times3$ matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item For DATE, the distinction between the required TDB and TT
+        is always negligible.  Moreover, for all but the most
+        critical applications UTC is adequate.
+  \item The vectors AMPRMS(2-4) and AMPRMS(5-7) are
+        (in essence) referred to
+        the mean equinox and equator of epoch EQ.  For
+        EQ=2000D0, they are referred to the ICRS.
+  \item The parameters produced by this routine are used by
+        sla\_MAPQK, sla\_MAPQKZ and sla\_AMPQK.
+  \item The accuracy, starting from ICRS star data,
+        is limited to about 1~mas by the precession-nutation
+        model used, SF2001.  A different precession-nutation model
+        can be introduced by first calling the present routine
+        and then replacing the precession-nutation
+        matrix in AMPRMS(13-21) directly.
+  \item A further limit to the accuracy of routines using the
+        parameter array AMPRMS is
+        imposed by the routine sla\_EVP, used here to compute the
+        Earth position and velocity by the methods of Stumpff.
+        The maximum error in the resulting aberration corrections is
+        about 0.3 milliarcsecond.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_MAPQK}{Quick Mean to Apparent}
+{
+ \action{Quick mean to apparent place:  transform a star \radec\ from
+         mean place to geocentric apparent place, given the
+         star-independent parameters.  The reference frames and
+         time scales used are post IAU~1976.}
+ \call{CALL sla\_MAPQK (RM, DM, PR, PD, PX, RV, AMPRMS, RA, DA)}
+}
+\args{GIVEN}
+{
+ \spec{RM,DM}{D}{mean \radec\ (radians)} \\
+ \spec{PR,PD}{D}{proper motions:  \radec\ changes per Julian year} \\
+ \spec{PX}{D}{parallax (arcsec)} \\
+ \spec{RV}{D}{radial velocity (km~s$^{-1}$, +ve if receding)} \\
+ \spec{AMPRMS}{D(21)}{star-independent mean-to-apparent parameters:} \\
+ \specel   {(1)}     {time interval for proper motion (Julian years)} \\
+ \specel   {(2-4)}   {barycentric position of the Earth (AU)} \\
+ \specel   {(5-7)}   {heliocentric direction of the Earth (unit vector)} \\
+ \specel   {(8)}     {(gravitational radius of
+                      Sun)$\times 2 / $(Sun-Earth distance)} \\
+ \specel   {(9-11)}  {{\bf v}: barycentric Earth velocity in units of c} \\
+ \specel   {(12)}    {$\sqrt{1-\left|\mbox{\bf v}\right|^2}$} \\
+ \specel   {(13-21)} {precession-nutation $3\times3$ matrix}
+}
+\args{RETURNED}
+{
+ \spec{RA,DA}{D }{apparent \radec\ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Use of this routine is appropriate when efficiency is important
+        and where many star positions, all referred to the same equator
+        and equinox, are to be transformed for one epoch.  The
+        star-independent parameters can be obtained by calling the
+        sla\_MAPPA routine.
+  \item If the parallax and proper motions are zero the sla\_MAPQKZ
+        routine can be used instead.
+  \item The vectors AMPRMS(2-4) and AMPRMS(5-7) are
+        (in essence) referred to
+        the mean equinox and equator of epoch EQ.  For
+        EQ=2000D0, they are referred to the ICRS.
+  \item Strictly speaking, the routine is not valid for solar-system
+        sources, though the error will usually be extremely small.
+        However, to prevent gross errors in the case where the
+        position of the Sun is specified, the gravitational
+        deflection term is restrained within about \arcseci{920} of the
+        centre of the Sun's disc.  The term has a maximum value of
+        about \arcsec{1}{85} at this radius, and decreases to zero as
+        the centre of the disc is approached.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_MAPQKZ}{Quick Mean-Appt, no PM {\it etc.}}
+{
+ \action{Quick mean to apparent place:  transform a star \radec\ from
+         mean place to geocentric apparent place, given the
+         star-independent parameters, and assuming zero parallax
+         and FK5 proper motion.
+         The reference frames and time scales used are post IAU~1976.}
+ \call{CALL sla\_MAPQKZ (RM, DM, AMPRMS, RA, DA)}
+}
+\args{GIVEN}
+{
+ \spec{RM,DM}{D}{mean \radec\ (radians)} \\
+ \spec{AMPRMS}{D(21)}{star-independent mean-to-apparent parameters:} \\
+ \specel   {(1)}     {time interval for proper motion (Julian years)} \\
+ \specel   {(2-4)}   {barycentric position of the Earth (AU)} \\
+ \specel   {(5-7)}   {heliocentric direction of the Earth (unit vector)} \\
+ \specel   {(8)}     {(gravitational radius of
+                      Sun)$\times 2 / $(Sun-Earth distance)} \\
+ \specel   {(9-11)}  {{\bf v}: barycentric Earth velocity in units of c} \\
+ \specel   {(12)}    {$\sqrt{1-\left|\mbox{\bf v}\right|^2}$} \\
+ \specel   {(13-21)} {precession-nutation $3\times3$ matrix}
+}
+\args{RETURNED}
+{
+ \spec{RA,DA}{D}{apparent \radec\ (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Use of this routine is appropriate when efficiency is important
+        and where many star positions, all with parallax and proper
+        motion either zero or already allowed for, and all referred to
+        the same equator and equinox, are to be transformed for one
+        epoch.  The star-independent parameters can be obtained by
+        calling the sla\_MAPPA routine.
+  \item The corresponding routine for the case of non-zero parallax
+        and FK5 proper motion is sla\_MAPQK.
+  \item The vectors AMPRMS(2-4) and AMPRMS(5-7) are
+        (in essence) referred to
+        the mean equinox and equator of epoch EQ.  For
+        EQ=2000D0, they are referred to the ICRS.
+  \item Strictly speaking, the routine is not valid for solar-system
+        sources, though the error will usually be extremely small.
+        However, to prevent gross errors in the case where the
+        position of the Sun is specified, the gravitational
+        deflection term is restrained within about \arcseci{920} of the
+        centre of the Sun's disc.  The term has a maximum value of
+        about \arcsec{1}{85} at this radius, and decreases to zero as
+        the centre of the disc is approached.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr.Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_MOON}{Approx Moon Pos/Vel}
+{
+ \action{Approximate geocentric position and velocity of the Moon
+         (single precision).}
+ \call{CALL sla\_MOON (IY, ID, FD, PV)}
+}
+\args{GIVEN}
+{
+ \spec{IY}{I}{year} \\
+ \spec{ID}{I}{day in year (1 = Jan 1st)} \\
+ \spec{FD}{R }{fraction of day}
+}
+\args{RETURNED}
+{
+ \spec{PV}{R(6)}{Moon \xyzxyzd, mean equator and equinox of
+                 date (AU, AU~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The date and time is TDB (loosely ET) in a Julian calendar
+        which has been aligned to the ordinary Gregorian
+        calendar for the interval 1900 March 1 to 2100 February 28.
+        The year and day can be obtained by calling sla\_CALYD or
+        sla\_CLYD.
+  \item The position is accurate to better than 0.5~arcminute
+        in direction and 1000~km in distance.  The velocity
+        is accurate to better than \arcsec{0}{5} per hour in direction
+        and 4~metres per second in distance.  (RMS figures with respect
+        to JPL DE200 for the interval 1960-2025 are \arcseci{14} and
+        \arcsec{0}{2} per hour in longitude, \arcseci{9} and \arcsec{0}{2}
+        per hour in latitude, 350~km and 2~metres per second in distance.)
+        Note that the distance accuracy is comparatively poor because this
+        routine is principally intended for computing topocentric direction.
+  \item This routine is only a partial implementation of the original
+        Meeus algorithm (reference below), which offers 4 times the
+        accuracy in direction and 20 times the accuracy in distance
+        when fully implemented (as it is in sla\_DMOON).
+ \end{enumerate}
+}
+\aref{Meeus, {\it l'Astronomie}, June 1984, p348.}
+%-----------------------------------------------------------------------
+\routine{SLA\_MXM}{Multiply $3\times3$ Matrices}
+{
+ \action{Product of two $3\times3$ matrices (single precision).}
+ \call{CALL sla\_MXM (A, B, C)}
+}
+\args{GIVEN}
+{
+ \spec{A}{R(3,3)}{matrix {\bf A}} \\
+ \spec{B}{R(3,3)}{matrix {\bf B}}
+}
+\args{RETURNED}
+{
+ \spec{C}{R(3,3)}{matrix result: {\bf A}$\times${\bf B}}
+}
+\anote{To comply with the ANSI Fortran 77 standard, A, B and C must
+       be different arrays.  The routine is, in fact, coded
+       so as to work properly with many Fortran compilers even
+       if this rule is violated, something that is {\bf not}, however,
+       recommended.}
+%-----------------------------------------------------------------------
+\routine{SLA\_MXV}{Apply 3D Rotation}
+{
+ \action{Multiply a 3-vector by a rotation matrix (single precision).}
+ \call{CALL sla\_MXV (RM, VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{RM}{R(3,3)}{rotation matrix} \\
+ \spec{VA}{R(3)}{vector to be rotated}
+}
+\args{RETURNED}
+{
+ \spec{VB}{R(3)}{result vector}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine performs the operation:
+        \begin{verse}
+         {\bf b} = {\bf M}$\cdot${\bf a}
+        \end{verse}
+        where {\bf a} and {\bf b} are the 3-vectors VA and VB
+        respectively, and {\bf M} is the $3\times3$ matrix RM.
+  \item The main function of this routine is apply a
+        rotation;  under these circumstances, ${\bf M}$ is a
+        {\it proper real orthogonal}\/ matrix.
+  \item To comply with the ANSI Fortran 77 standard, VA and VB must
+        {\bf not} be the same array.  The routine is, in fact, coded
+        so as to work properly with many Fortran compilers even
+        if this rule is violated, something that is {\bf not}, however,
+        recommended.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_NUT}{Nutation Matrix}
+{
+ \action{Form the matrix of nutation (SF2001 theory) for a given date.}
+ \call{CALL sla\_NUT (DATE, RMATN)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date
+                                          (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{RMATN}{D(3,3)}{nutation matrix}
+}
+\notes{
+ \begin{enumerate}
+  \item The matrix is in the sense:
+        \begin{verse}
+         ${\bf v}_{true} = {\bf M}\times{\bf v}_{mean}$
+        \end{verse}
+        where ${\bf v}_{true}$ is the star vector relative to the
+        true equator and equinox of date, {\bf M} is the
+        $3\times3$ matrix {\tt rmatn} and
+        ${\bf v}_{mean}$ is the star vector relative to the
+        mean equator and equinox of date.
+  \item The matrix represents forced nutation (but not free core nutation)
+        plus corrections to the IAU~1976 precession model.
+  \item Earth attitude predictions made by combining the present nutation
+        matrix with IAU~1976 precession are accurate to 1~mas (with respect
+        to the ICRS) for a few decades around 2000.
+  \item The distinction between the required TDB and TT is
+        always negligible.  Moreover, for all but the most
+        critical applications UTC is adequate.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Kaplan, G.H., 1981.\ {\it USNO circular No.\ 163}, pA3-6.
+  \item Shirai, T. \& Fukushima, T., 2001, Astron.J., {\bf 121},
+        3270-3283.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_NUTC}{Nutation Components}
+{
+ \action{Nutation (SF2001 theory):  longitude \& obliquity
+         components, and mean obliquity.}
+ \call{CALL sla\_NUTC (DATE, DPSI, DEPS, EPS0)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date
+                                           (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{DPSI,DEPS}{D}{nutation in longitude and obliquity (radians)} \\
+ \spec{EPS0}{D}{mean obliquity (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The routine predicts forced nutation (but not free core nutation)
+        plus corrections to the IAU~1976 precession model.
+  \item Earth attitude predictions made by combining the present nutation
+        model with IAU~1976 precession are accurate to 1~mas (with respect
+        to the ICRS) for a few decades around 2000.
+  \item The slaNutc80 routine is the equivalent of the present routine
+        but using the IAU 1980 nutation theory.  The older theory is less
+        accurate, leading to errors as large as 350~mas over the interval
+        1900-2100, mainly because of the error in the IAU~1976 precession.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Shirai, T. \& Fukushima, T., Astron.J.\ 121, 3270-3283 (2001).
+  \item Fukushima, T., Astron.Astrophys.\ 244, L11 (1991).
+  \item Simon, J. L., Bretagnon, P., Chapront, J., Chapront-Touze, M.,
+        Francou, G. \& Laskar, J., Astron.Astrophys.\ 282, 663 (1994).
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_NUTC80}{Nutation Components, IAU 1980}
+{
+ \action{Nutation (IAU 1980 theory):  longitude \& obliquity
+         components, and mean obliquity.}
+ \call{CALL sla\_NUTC80 (DATE, DPSI, DEPS, EPS0)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TDB (formerly ET) as Modified Julian Date
+                                           (JD$-$2400000.5)}
+}
+\args{RETURNED}
+{
+ \spec{DPSI,DEPS}{D}{nutation in longitude and obliquity (radians)} \\
+ \spec{EPS0}{D}{mean obliquity (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The IAU 1980 theory used in the present function has
+        errors as large as 350~mas over the interval
+        1900-2100, mainly because of the error in the IAU~1976
+        precession.  For more accurate results, either the corrections
+        published in IERS {\it Bulletin~B}\/
+        must be applied, or the
+        sla\_NUTC function can be used.  The latter is based upon the
+        more recent SF2001 nutation theory and is of better
+        than 1\,mas accuracy.
+  \item The distinction between the required TDB and TT is
+        always negligible.  Moreover, for all but the most
+        critical applications UTC is adequate.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Final report of the IAU Working Group on Nutation,
+        chairman P.K.Seidelmann, 1980.
+  \item Kaplan, G.H., 1981.\ {\it USNO circular no.\ 163}, pA3-6.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_OAP}{Observed to Apparent}
+{
+ \action{Observed to apparent place.}
+ \call{CALL sla\_OAP (\vtop{
+         \hbox{TYPE, OB1, OB2, DATE, DUT, ELONGM, PHIM,}
+         \hbox{HM, XP, YP, TDK, PMB, RH, WL, TLR, RAP, DAP)}}}
+}
+\args{GIVEN}
+{
+ \spec{TYPE}{C*(*)}{type of coordinates -- `R', `H' or `A' (see below)} \\
+ \spec{OB1}{D}{observed Az, HA or RA (radians; Az is N=0, E=$90^{\circ}$)} \\
+ \spec{OB2}{D}{observed zenith distance or $\delta$ (radians)} \\
+ \spec{DATE}{D }{UTC date/time (Modified Julian Date, JD$-$2400000.5)} \\
+ \spec{DUT}{D}{$\Delta$UT:  UT1$-$UTC (UTC seconds)} \\
+ \spec{ELONGM}{D}{observer's mean longitude (radians, east +ve)} \\
+ \spec{PHIM}{D}{observer's mean geodetic latitude (radians)} \\
+ \spec{HM}{D}{observer's height above sea level (metres)} \\
+ \spec{XP,YP}{D}{polar motion \xy\ coordinates (radians)} \\
+ \spec{TDK}{D}{local ambient temperature (K; std=273.15D0)} \\
+ \spec{PMB}{D}{local atmospheric pressure (mb; std=1013.25D0)} \\
+ \spec{RH}{D}{local relative humidity (in the range 0D0\,--\,1D0)} \\
+ \spec{WL}{D}{effective wavelength ($\mu{\rm m}$, {\it e.g.}\ 0.55D0)} \\
+ \spec{TLR}{D}{tropospheric lapse rate (K per metre,
+                                                {\it e.g.}\ 0.0065D0)}
+}
+\args{RETURNED}
+{
+ \spec{RAP,DAP}{D}{geocentric apparent \radec}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Only the first character of the TYPE argument is significant.
+        `R' or `r' indicates that OBS1 and OBS2 are the observed right
+        ascension and declination;  `H' or `h' indicates that they are
+        hour angle (west +ve) and declination; anything else (`A' or
+        `a' is recommended) indicates that OBS1 and OBS2 are azimuth
+        (north zero, east $90^{\circ}$) and zenith distance.  (Zenith
+        distance is used rather than elevation in order to reflect the
+        fact that no allowance is made for depression of the horizon.)
+  \item The accuracy of the result is limited by the corrections for
+        refraction.  Providing the meteorological parameters are
+        known accurately and there are no gross local effects, the
+        predicted azimuth and elevation should be within about
+        \arcsec{0}{1} for $\zeta<70^{\circ}$.  Even
+        at a topocentric zenith distance of
+        $90^{\circ}$, the accuracy in elevation should be better than
+        1~arcminute;  useful results are available for a further
+        $3^{\circ}$, beyond which the sla\_REFRO routine returns a
+        fixed value of the refraction.  The complementary
+        routines sla\_AOP (or sla\_AOPQK) and sla\_OAP (or sla\_OAPQK)
+        are self-consistent to better than 1~microarcsecond all over
+        the celestial sphere.
+  \item It is advisable to take great care with units, as even
+        unlikely values of the input parameters are accepted and
+        processed in accordance with the models used.
+  \item {\it Observed}\/ \azel\ means the position that would be seen by a
+        perfect theodolite located at the observer.  This is
+        related to the observed \hadec\ via the standard rotation, using
+        the geodetic latitude (corrected for polar motion), while the
+        observed HA and RA are related simply through the local
+        apparent ST.  {\it Observed}\/ \radec\ or \hadec\ thus means the
+        position that would be seen by a perfect equatorial located
+        at the observer and with its polar axis aligned to the
+        Earth's axis of rotation ({\it n.b.}\ not to the refracted pole).
+        By removing from the observed place the effects of
+        atmospheric refraction and diurnal aberration, the
+        geocentric apparent \radec\ is obtained.
+  \item Frequently, {\it mean}\/ rather than {\it apparent}\,
+        \radec\ will be required,
+        in which case further transformations will be necessary.  The
+        sla\_AMP {\it etc.}\ routines will convert
+        the apparent \radec\ produced
+        by the present routine into an FK5 J2000 mean place, by
+        allowing for the Sun's gravitational lens effect, annual
+        aberration, nutation and precession.  Should FK4 B1950
+        coordinates be required, the routines sla\_FK524 {\it etc.}\ will also
+        have to be applied.
+  \item To convert to apparent \radec\ the coordinates read from a
+        real telescope, corrections would have to be applied for
+        encoder zero points, gear and encoder errors, tube flexure,
+        the position of the rotator axis and the pointing axis
+        relative to it, non-perpendicularity between the mounting
+        axes, and finally for the tilt of the azimuth or polar axis
+        of the mounting (with appropriate corrections for mount
+        flexures).  Some telescopes would, of course, exhibit other
+        properties which would need to be accounted for at the
+        appropriate point in the sequence.
+  \item This routine takes time to execute, due mainly to the
+        rigorous integration used to evaluate the refraction.
+        For processing multiple stars for one location and time,
+        call sla\_AOPPA once followed by one call per star to sla\_OAPQK.
+        Where a range of times within a limited period of a few hours
+        is involved, and the highest precision is not required, call
+        sla\_AOPPA once, followed by a call to sla\_AOPPAT each time the
+        time changes, followed by one call per star to sla\_OAPQK.
+  \item The DATE argument is UTC expressed as an MJD.  This is,
+        strictly speaking, wrong, because of leap seconds.  However,
+        as long as the $\Delta$UT and the UTC are consistent there
+        are no difficulties, except during a leap second.  In this
+        case, the start of the 61st second of the final minute should
+        begin a new MJD day and the old pre-leap $\Delta$UT should
+        continue to be used.  As the 61st second completes, the MJD
+        should revert to the start of the day as, simultaneously,
+        the $\Delta$UT changes by one second to its post-leap new value.
+  \item The $\Delta$UT (UT1$-$UTC) is tabulated in IERS circulars and
+        elsewhere.  It increases by exactly one second at the end of
+        each UTC leap second, introduced in order to keep $\Delta$UT
+        within $\pm$\tsec{0}{9}.
+  \item IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION.  The
+        longitude required by the present routine is {\bf east-positive},
+        in accordance with geographical convention (and right-handed).
+        In particular, note that the longitudes returned by the
+        sla\_OBS routine are west-positive (as in the {\it Astronomical
+        Almanac}\/ before 1984) and must be reversed in sign before use
+        in the present routine.
+  \item The polar coordinates XP,YP can be obtained from IERS
+        circulars and equivalent publications.  The
+        maximum amplitude is about \arcsec{0}{3}.  If XP,YP values
+        are unavailable, use XP=YP=0D0.  See page B60 of the 1988
+        {\it Astronomical Almanac}\/ for a definition of the two angles.
+  \item The height above sea level of the observing station, HM,
+        can be obtained from the {\it Astronomical Almanac}\/ (Section J
+        in the 1988 edition), or via the routine sla\_OBS.  If P,
+        the pressure in mb, is available, an adequate
+        estimate of HM can be obtained from the following expression:
+        \begin{quote}
+         {\tt HM=-29.3D0*TSL*LOG(P/1013.25D0)}
+        \end{quote}
+        where TSL is the approximate sea-level air temperature in K
+        (see {\it Astrophysical Quantities}, C.W.Allen, 3rd~edition,
+        \S 52).  Similarly, if the pressure P is not known,
+        it can be estimated from the height of the observing
+        station, HM as follows:
+        \begin{quote}
+         {\tt P=1013.25D0*EXP(-HM/(29.3D0*TSL))}
+        \end{quote}
+        Note, however, that the refraction is nearly proportional to the
+        pressure and that an accurate P value is important for
+        precise work.
+  \item The azimuths {\it etc.}\ used by the present routine are with
+        respect to the celestial pole.  Corrections from the terrestrial pole
+        can be computed using sla\_POLMO.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_OAPQK}{Quick Observed to Apparent}
+{
+ \action{Quick observed to apparent place.}
+ \call{CALL sla\_OAPQK (TYPE, OB1, OB2, AOPRMS, RAP, DAP)}
+}
+\args{GIVEN}
+{
+ \spec{TYPE}{C*(*)}{type of coordinates -- `R', `H' or `A' (see below)} \\
+ \spec{OB1}{D}{observed Az, HA or RA (radians; Az is N=0, E=$90^{\circ}$)} \\
+ \spec{OB2}{D}{observed zenith distance or $\delta$ (radians)} \\
+ \spec{AOPRMS}{D(14)}{star-independent apparent-to-observed parameters:} \\
+ \specel   {(1)}     {geodetic latitude (radians)} \\
+ \specel   {(2,3)}   {sine and cosine of geodetic latitude} \\
+ \specel   {(4)}     {magnitude of diurnal aberration vector} \\
+ \specel   {(5)}     {height (HM)} \\
+ \specel   {(6)}     {ambient temperature (TDK)} \\
+ \specel   {(7)}     {pressure (PMB)} \\
+ \specel   {(8)}     {relative humidity (RH)} \\
+ \specel   {(9)}     {wavelength (WL)} \\
+ \specel   {(10)}    {lapse rate (TLR)} \\
+ \specel   {(11,12)} {refraction constants A and B (radians)} \\
+ \specel   {(13)}    {longitude + eqn of equinoxes +
+                       ``sidereal $\Delta$UT'' (radians)} \\
+ \specel   {(14)}    {local apparent sidereal time (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RAP,DAP}{D}{geocentric apparent \radec}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Only the first character of the TYPE argument is significant.
+        `R' or `r' indicates that OBS1 and OBS2 are the observed right
+        ascension and declination;  `H' or `h' indicates that they are
+        hour angle (west +ve) and declination; anything else (`A' or
+        `a' is recommended) indicates that OBS1 and OBS2 are Azimuth
+        (north zero, east $90^{\circ}$) and zenith distance.  (Zenith
+        distance is used rather than elevation in order to reflect the
+        fact that no allowance is made for depression of the horizon.)
+  \item The accuracy of the result is limited by the corrections for
+        refraction.  Providing the meteorological parameters are
+        known accurately and there are no gross local effects, the
+        predicted azimuth and elevation should be within about
+        \arcsec{0}{1} for $\zeta<70^{\circ}$.  Even
+        at a topocentric zenith distance of
+        $90^{\circ}$, the accuracy in elevation should be better than
+        1~arcminute;  useful results are available for a further
+        $3^{\circ}$, beyond which the sla\_REFRO routine returns a
+        fixed value of the refraction.  The complementary
+        routines sla\_AOP (or sla\_AOPQK) and sla\_OAP (or sla\_OAPQK)
+        are self-consistent to better than 1~microarcsecond all over
+        the celestial sphere.
+  \item It is advisable to take great care with units, as even
+        unlikely values of the input parameters are accepted and
+        processed in accordance with the models used.
+  \item {\it Observed}\/ \azel\ means the position that would be seen by a
+        perfect theodolite located at the observer.  This is
+        related to the observed \hadec\ via the standard rotation, using
+        the geodetic latitude (corrected for polar motion), while the
+        observed HA and RA are related simply through the local
+        apparent ST.  {\it Observed}\/ \radec\ or \hadec\ thus means the
+        position that would be seen by a perfect equatorial located
+        at the observer and with its polar axis aligned to the
+        Earth's axis of rotation ({\it n.b.}\ not to the refracted pole).
+        By removing from the observed place the effects of
+        atmospheric refraction and diurnal aberration, the
+        geocentric apparent \radec\ is obtained.
+  \item Frequently, {\it mean}\/ rather than {\it apparent}\,
+        \radec\ will be required,
+        in which case further transformations will be necessary.  The
+        sla\_AMP {\it etc.}\ routines will convert
+        the apparent \radec\ produced
+        by the present routine into an FK5 J2000 mean place, by
+        allowing for the Sun's gravitational lens effect, annual
+        aberration, nutation and precession.  Should FK4 B1950
+        coordinates be required, the routines sla\_FK524 {\it etc.}\ will also
+        have to be applied.
+  \item To convert to apparent \radec\ the coordinates read from a
+        real telescope, corrections would have to be applied for
+        encoder zero points, gear and encoder errors, tube flexure,
+        the position of the rotator axis and the pointing axis
+        relative to it, non-perpendicularity between the mounting
+        axes, and finally for the tilt of the azimuth or polar axis
+        of the mounting (with appropriate corrections for mount
+        flexures).  Some telescopes would, of course, exhibit other
+        properties which would need to be accounted for at the
+        appropriate point in the sequence.
+  \item The star-independent apparent-to-observed-place parameters
+        in AOPRMS may be computed by means of the sla\_AOPPA routine.
+        If nothing has changed significantly except the time, the
+        sla\_AOPPAT routine may be used to perform the requisite
+        partial recomputation of AOPRMS.
+  \item The azimuths {\it etc.}\ used by the present routine are with
+        respect to the celestial pole.  Corrections from the terrestrial pole
+        can be computed using sla\_POLMO.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_OBS}{Observatory Parameters}
+{
+ \action{Look up an entry in a standard list of
+         groundbased observing stations parameters.}
+ \call{CALL sla\_OBS (N, C, NAME, W, P, H)}
+}
+\args{GIVEN}
+{
+ \spec{N}{I}{number specifying observing station}
+}
+\args{GIVEN or RETURNED}
+{
+ \spec{C}{C*(*)}{identifier specifying observing station}
+}
+\args{RETURNED}
+{
+ \spec{NAME}{C*(*)}{name of specified observing station} \\
+ \spec{W}{D}{longitude (radians, west +ve)} \\
+ \spec{P}{D}{geodetic latitude (radians, north +ve)} \\
+ \spec{H}{D}{height above sea level (metres)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Station identifiers C may be up to 10 characters long,
+        and station names NAME may be up to 40 characters long.
+  \item C and N are {\it alternative}\/ ways of specifying the observing
+        station.  The C option, which is the most generally useful,
+        may be selected by specifying an N value of zero or less.
+        If N is 1 or more, the parameters of the Nth station
+        in the currently supported list are interrogated, and
+        the station identifier C is returned as well as NAME, W,
+        P and H.
+  \item If the station parameters are not available, either because
+        the station identifier C is not recognized, or because an
+        N value greater than the number of stations supported is
+        given, a name of `?' is returned and W, P and H are left in
+        their current states.
+  \item Programs can obtain a list of all currently supported
+        stations by calling the routine repeatedly, with N=1,2,3...
+        When NAME=`?' is seen, the list of stations has been
+        exhausted.  The stations at the time of writing are listed
+        below.
+  \item Station numbers, identifiers, names and other details are
+        subject to change and should not be hardwired into
+        application programs.
+  \item All station identifiers C are uppercase only;  lower case
+        characters must be converted to uppercase by the calling
+        program.  The station names returned may contain both upper-
+        and lowercase.  All characters up to the first space are
+        checked;  thus an abbreviated ID will return the parameters
+        for the first station in the list which matches the
+        abbreviation supplied, and no station in the list will ever
+        contain embedded spaces.  C must not have leading spaces.
+  \item IMPORTANT -- BEWARE OF THE LONGITUDE SIGN CONVENTION.  The
+        longitude returned by sla\_OBS is
+        {\bf west-positive}, following the pre-1984 {\it Astronomical
+        Almanac}.  However, this sign convention is left-handed and is
+        the opposite of the one now used; elsewhere in
+        SLALIB the preferable east-positive convention is used.  In
+        particular, note that for use in sla\_AOP, sla\_AOPPA and
+        sla\_OAP the sign of the longitude must be reversed.
+  \item Users are urged to inform the author of any improvements
+        they would like to see made.  For example:
+        \begin{itemize}
+         \item typographical corrections
+         \item more accurate parameters
+         \item better station identifiers or names
+         \item additional stations
+        \end{itemize}
+ \end{enumerate}
+Stations supported by sla\_OBS at the time of writing:
+
+\begin{tabbing}
+xxxxxxxxxxxxxxxxx \= \kill
+{\it ID} \> {\it NAME} \\ \\
+AAT \> Anglo-Australian 3.9m Telescope \\
+ANU2.3 \> Siding Spring 2.3m \\
+APO3.5 \> Apache Point 3.5m \\
+ARECIBO \> Arecibo 1000 foot \\
+ATCA \> Australia Telescope Compact Array \\
+BLOEMF \> Bloemfontein 1.52m \\
+BOSQALEGRE \> Bosque Alegre 1.54m \\
+CAMB1MILE \> Cambridge 1 mile \\
+CAMB5KM \> Cambridge 5 km \\
+CATALINA61 \> Catalina 61 inch \\
+CFHT \> Canada-France-Hawaii 3.6m Telescope \\
+CSO \> Caltech Sub-mm Observatory, Mauna Kea \\
+DAO72 \> DAO Victoria BC 1.85m \\
+DUNLAP74 \> David Dunlap 74 inch \\
+DUPONT \> Du Pont 2.5m Telescope, Las Campanas \\
+EFFELSBERG \> Effelsberg 100m \\
+ESO3.6 \> ESO 3.6m \\
+ESONTT \> ESO 3.5m NTT \\
+ESOSCHM \> ESO 1m Schmidt, La Silla \\
+FCRAO \> Five College Radio Astronomy Obs \\
+FLAGSTF61 \> USNO 61 inch astrograph, Flagstaff \\
+GBVA140 \> Greenbank 140 foot \\
+GBVA300 \> Greenbank 300 foot \\
+GEMININ \> Gemini North 8m \\
+GEMINIS \> Gemini South 8m \\
+HARVARD \> Harvard College Observatory 1.55m \\
+HPROV1.52 \> Haute Provence 1.52m \\
+HPROV1.93 \> Haute Provence 1.93m \\
+IRTF \> NASA IR Telescope Facility, Mauna Kea \\
+JCMT \> JCMT 15m \\
+JODRELL1 \> Jodrell Bank 250 foot \\
+KECK1 \> Keck 10m Telescope 1 \\
+KECK2 \> Keck 10m Telescope 2 \\
+KISO \> Kiso 1.05m Schmidt, Japan \\
+KOSMA3M \> Cologne Submillimeter Observatory 3m \\
+KOTTAMIA \> Kottamia 74 inch \\
+KPNO158 \> Kitt Peak 158 inch \\
+KPNO36FT \> Kitt Peak 36 foot \\
+KPNO84 \> Kitt Peak 84 inch \\
+KPNO90 \> Kitt Peak 90 inch \\
+LICK120 \> Lick 120 inch \\
+LOWELL72 \> Perkins 72 inch, Lowell \\
+LPO1 \> Jacobus Kapteyn 1m Telescope \\
+LPO2.5 \> Isaac Newton 2.5m Telescope \\
+LPO4.2 \> William Herschel 4.2m Telescope \\
+MAGELLAN1 \> Magellan 1, 6.5m, Las Campanas \\
+MAGELLAN2 \> Magellan 2, 6.5m, Las Campanas \\
+MAUNAK88 \> Mauna Kea 88 inch \\
+MCDONLD2.1 \> McDonald 2.1m \\
+MCDONLD2.7 \> McDonald 2.7m \\
+MMT \> MMT, Mt Hopkins \\
+MOPRA \> ATNF Mopra Observatory \\
+MTEKAR \> Mt Ekar 1.82m \\
+MTHOP1.5 \> Mt Hopkins 1.5m \\
+MTLEMMON60 \> Mt Lemmon 60 inch \\
+NOBEYAMA \> Nobeyama 45m \\
+OKAYAMA \> Okayama 1.88m \\
+PALOMAR200 \> Palomar 200 inch \\
+PALOMAR48 \> Palomar 48-inch Schmidt \\
+PALOMAR60 \> Palomar 60 inch \\
+PARKES \> Parkes 64m \\
+QUEBEC1.6 \> Quebec 1.6m \\
+SAAO74 \> Sutherland 74 inch \\
+SANPM83 \> San Pedro Martir 83 inch \\
+ST.ANDREWS \> St Andrews University Observatory \\
+STEWARD90 \> Steward 90 inch \\
+STROMLO74 \> Mount Stromlo 74 inch \\
+SUBARU \> Subaru 8m \\
+SUGARGROVE \> Sugar Grove 150 foot \\
+TAUTNBG \> Tautenburg 2m \\
+TAUTSCHM \> Tautenberg 1.34m Schmidt \\
+TIDBINBLA \> Tidbinbilla 64m \\
+TOLOLO1.5M \> Cerro Tololo 1.5m \\
+TOLOLO4M \> Cerro Tololo 4m \\
+UKIRT \> UK Infra Red Telescope \\
+UKST \> UK 1.2m Schmidt, Siding Spring \\
+USSR6 \> USSR 6m \\
+USSR600 \> USSR 600 foot \\
+VLA \> Very Large Array \\
+VLT1 \> ESO VLT 8m, UT1 \\
+VLT2 \> ESO VLT 8m, UT2 \\
+VLT3 \> ESO VLT 8m, UT3 \\
+VLT4 \> ESO VLT 8m, UT4
+\end{tabbing}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PA}{$h,\delta$ to Parallactic Angle}
+{
+ \action{Hour angle and declination to parallactic angle
+         (double precision).}
+ \call{D~=~sla\_PA (HA, DEC, PHI)}
+}
+\args{GIVEN}
+{
+ \spec{HA}{D}{hour angle in radians (geocentric apparent)} \\
+ \spec{DEC}{D}{declination in radians (geocentric apparent)} \\
+ \spec{PHI}{D}{latitude in radians (geodetic)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_PA}{D}{parallactic angle (radians, in the range $\pm \pi$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The parallactic angle at a point in the sky is the position
+        angle of the vertical, {\it i.e.}\ the angle between the direction to
+        the pole and to the zenith.  In precise applications care must
+        be taken only to use geocentric apparent \hadec\ and to consider
+        separately the effects of atmospheric refraction and telescope
+        mount errors.
+  \item At the pole a zero result is returned.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PAV}{Position-Angle Between Two Directions}
+{
+ \action{Returns the bearing (position angle) of one celestial
+         direction with respect to another (single precision).}
+ \call{R~=~sla\_PAV (V1, V2)}
+}
+\args{GIVEN}
+{
+ \spec{V1}{R(3)}{vector to one point} \\
+ \spec{V2}{R(3)}{vector to the other point}
+}
+\args{RETURNED}
+{
+ \spec{sla\_PAV}{R}{position-angle of 2nd point with respect to 1st}
+}
+\notes
+{
+ \begin{enumerate}
+ \item The coordinate frames correspond to \radec,
+       $[\lambda,\phi]$ {\it etc.}.
+ \item The result is the bearing (position angle), in radians,
+       of point V2 as seen
+       from point V1.  It is in the range $\pm \pi$.  The sense
+       is such that if V2
+       is a small distance due east of V1 the result
+       is about $+\pi/2$. Zero is returned
+       if the two points are coincident.
+ \item There is no requirement for either vector to be of unit length.
+ \item The routine sla\_BEAR performs an equivalent function except
+       that the points are specified in the form of spherical coordinates.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_PCD}{Apply Radial Distortion}
+{
+ \action{Apply pincushion/barrel distortion to a tangent-plane \xy.}
+ \call{CALL sla\_PCD (DISCO,X,Y)}
+}
+\args{GIVEN}
+{
+ \spec{DISCO}{D}{pincushion/barrel distortion coefficient} \\
+ \spec{X,Y}{D}{tangent-plane \xy}
+}
+\args{RETURNED}
+{
+ \spec{X,Y}{D}{distorted \xy}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The distortion is of the form $\rho = r (1 + c r^{2})$, where $r$ is
+        the radial distance from the tangent point, $c$ is the DISCO
+        argument, and $\rho$ is the radial distance in the presence of
+        the distortion.
+  \item For {\it pincushion}\/ distortion, C is +ve;  for
+        {\it barrel}\/ distortion, C is $-$ve.
+  \item For X,Y in units of one projection radius (in the case of
+        a photographic plate, the focal length), the following
+        DISCO values apply:
+
+        \vspace{2ex}
+
+        \hspace{5em}
+        \begin{tabular}{|l|c|} \hline
+         Geometry & DISCO \\ \hline \hline
+         astrograph & 0.0 \\ \hline
+         Schmidt & $-$0.3333 \\ \hline
+         AAT PF doublet & +147.069 \\ \hline
+         AAT PF triplet & +178.585 \\ \hline
+         AAT f/8 & +21.20 \\ \hline
+         JKT f/8 & +14.6 \\ \hline
+        \end{tabular}
+
+        \vspace{2ex}
+
+  \item There is a companion routine, sla\_UNPCD, which performs the
+        inverse operation.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PDA2H}{H.A.\ for a Given Azimuth}
+{
+ \action{Hour Angle corresponding to a given azimuth (double precision).}
+ \call{CALL sla\_PDA2H (P, D, A, H1, J1, H2, J2)}
+}
+\args{GIVEN}
+{
+ \spec{P}{D}{latitude} \\
+ \spec{D}{D}{declination} \\
+ \spec{A}{D}{azimuth}
+}
+\args{RETURNED}
+{
+ \spec{H1}{D}{hour angle:  first solution if any} \\
+ \spec{J1}{I}{flag: 0 = solution 1 is valid} \\
+ \spec{H2}{D}{hour angle:  second solution if any} \\
+ \spec{J2}{I}{flag: 0 = solution 2 is valid}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PDQ2H}{H.A.\ for a Given P.A.}
+{
+ \action{Hour Angle corresponding to a given parallactic angle
+         (double precision).}
+ \call{CALL sla\_PDQ2H (P, D, Q, H1, J1, H2, J2)}
+}
+\args{GIVEN}
+{
+ \spec{P}{D}{latitude} \\
+ \spec{D}{D}{declination} \\
+ \spec{Q}{D}{azimuth}
+}
+\args{RETURNED}
+{
+ \spec{H1}{D}{hour angle:  first solution if any} \\
+ \spec{J1}{I}{flag: 0 = solution 1 is valid} \\
+ \spec{H2}{D}{hour angle:  second solution if any} \\
+ \spec{J2}{I}{flag: 0 = solution 2 is valid}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PERMUT}{Next Permutation}
+{
+ \action{Generate the next permutation of a specified number of items.}
+ \call{CALL sla\_PERMUT (N, ISTATE, IORDER, J)}
+}
+\args{GIVEN}
+{
+ \spec{N}{I}{number of items:  there will be N! permutations} \\
+ \spec{ISTATE}{I(N)}{state, ISTATE(1)$=-1$ to initialize}
+}
+\args{RETURNED}
+{
+ \spec{ISTATE}{I(N)}{state, updated ready for next time} \\
+ \spec{IORDER}{I(N)}{next permutation of numbers 1,2,\ldots,N} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal N (zero or less is illegal)} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $+$1 = no more permutations available}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine returns, in the IORDER array, the integers 1 to N
+        inclusive, in an order that depends on the current contents of
+        the ISTATE array.  Before calling the routine for the first
+        time, the caller must set the first element of the ISTATE array
+        to $-1$ (any negative number will do) to cause the ISTATE array
+        to be fully initialized.
+  \item The first permutation to be generated is:
+        \begin{verse}
+           IORDER(1)=N, IORDER(2)=N-1, ..., IORDER(N)=1
+        \end{verse}
+        This is also the permutation returned for the ``finished'' (J=1) case.
+        The final permutation to be generated is:
+        \begin{verse}
+           IORDER(1)=1, IORDER(2)=2, ..., IORDER(N)=N
+        \end{verse}
+  \item If the ``finished'' (J=1) status is ignored, the routine continues
+        to deliver permutations, the pattern repeating every~N!\,~calls.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_PERTEL}{Perturbed Orbital Elements}
+{
+ \action{Update the osculating elements of an asteroid or comet by
+         applying planetary perturbations.}
+ \call{CALL sla\_PERTEL (\vtop{
+         \hbox{JFORM, DATE0, DATE1,}
+         \hbox{EPOCH0, ORBI0, ANODE0, PERIH0, AORQ0, E0, AM0,}
+         \hbox{EPOCH1, ORBI1, ANODE1, PERIH1, AORQ1, E1, AM1,}
+         \hbox{JSTAT)}}}
+}
+\args{GIVEN (format and dates)}
+{
+ \spec{JFORM}{I}{choice of element set (2 or 3; Note~1)} \\
+ \spec{DATE0}{D}{date of osculation (TT MJD) for the given} \\
+ \spec{}{}{\hspace{1.5em} elements} \\
+ \spec{DATE1}{D}{date of osculation (TT MJD) for the updated} \\
+ \spec{}{}{\hspace{1.5em} elements}
+}
+\args{GIVEN (the unperturbed elements)}
+{
+ \spec{EPOCH0}{D}{epoch of the given element set
+                            ($t_0$ or $T$, TT MJD;} \\
+ \spec{}{}{\hspace{1.5em} Note~2)} \\
+ \spec{ORBI0}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE0}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH0}{D}{argument of perihelion
+                            ($\omega$, radians)} \\
+ \spec{AORQ0}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E0}{D}{eccentricity ($e$)} \\
+ \spec{AM0}{D}{mean anomaly ($M$, radians, JFORM=2 only)}
+}
+\args{RETURNED (the updated elements)}
+{
+ \spec{EPOCH1}{D}{epoch of the updated element set
+                            ($t_0$ or $T$,} \\
+ \spec{}{}{\hspace{1.5em} TT MJD; Note~2)} \\
+ \spec{ORBI1}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE1}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH1}{D}{argument of perihelion
+                            ($\omega$, radians)} \\
+ \spec{AORQ1}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E1}{D}{eccentricity ($e$)} \\
+ \spec{AM1}{D}{mean anomaly ($M$, radians, JFORM=2 only)}
+}
+\args{RETURNED (status flag)}
+{
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{0.5em}+102 = warning, distant epoch} \\
+ \spec{}{}{\hspace{0.5em}+101 = warning, large timespan
+                                            ($>100$ years)} \\
+ \spec{}{}{\hspace{-1.8em}+1 to +10 = coincident with major planet
+                                                  (Note~6)} \\
+ \spec{}{}{\hspace{1.95em}       0 = OK} \\
+ \spec{}{}{\hspace{1.2em}    $-$1 = illegal JFORM} \\
+ \spec{}{}{\hspace{1.2em}    $-$2 = illegal E0} \\
+ \spec{}{}{\hspace{1.2em}    $-$3 = illegal AORQ0} \\
+ \spec{}{}{\hspace{1.2em}    $-$4 = internal error} \\
+ \spec{}{}{\hspace{1.2em}    $-$5 = numerical error}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Two different element-format options are supported, as follows. \\
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e \leq 10 )$
+        \end{tabular}
+
+ \item DATE0, DATE1, EPOCH0 and EPOCH1 are all instants of time in
+       the TT time scale (formerly Ephemeris Time, ET), expressed
+       as Modified Julian Dates (JD$-$2400000.5).
+       \begin{itemize}
+       \item DATE0 is the instant at which the given
+             ({\it i.e.}\ unperturbed) osculating elements are correct.
+       \item DATE1 is the specified instant at which the updated osculating
+             elements are correct.
+       \item EPOCH0 and EPOCH1 will be the same as DATE0 and DATE1
+             (respectively) for the JFORM=2 case, normally used for minor
+             planets.  For the JFORM=3 case, the two epochs will refer to
+             perihelion passage and so will not, in general, be the same as
+             DATE0 and/or DATE1 though they may be similar to one another.
+       \end{itemize}
+ \item The elements are with respect to the J2000 ecliptic and mean equinox.
+ \item Unused elements (AM0 and AM1 for JFORM=3) are not accessed.
+ \item See the sla\_PERTUE routine for details of the algorithm used.
+ \item This routine is not intended to be used for major planets, which
+       is why JFORM=1 is not available and why there is no opportunity
+       to specify either the longitude of perihelion or the daily
+       motion.  However, if JFORM=2 elements are somehow obtained for a
+       major planet and supplied to the routine, sensible results will,
+       in fact, be produced.  This happens because the sla\_PERTUE routine
+       that is called to perform the calculations checks the separation
+       between the body and each of the planets and interprets a
+       suspiciously small value (0.001~AU) as an attempt to apply it to
+       the planet concerned.  If this condition is detected, the
+       contribution from that planet is ignored, and the status is set to
+       the planet number (1--10 = Mercury, Venus, EMB, Mars, Jupiter,
+       Saturn, Uranus, Neptune, Earth, Moon) as a warning.
+ \end{enumerate}
+}
+\aref{Sterne, Theodore E., {\it An Introduction to Celestial Mechanics,}\/
+      Interscience Publishers, 1960.  Section 6.7, p199.}
+%------------------------------------------------------------------------------
+\routine{SLA\_PERTUE}{Perturbed Universal Elements}
+{
+ \action{Update the universal elements of an asteroid or comet by
+         applying planetary perturbations.}
+ \call{CALL sla\_PERTUE (DATE, U, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{final epoch (TT MJD) for the updated elements}
+}
+\args{GIVEN and RETURNED}
+{
+ \spec{U}{D(13)}{universal elements (updated in place)} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v_0}$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date, approx}
+}
+\args{RETURNED}
+{
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{0.5em}+102 = warning, distant epoch} \\
+ \spec{}{}{\hspace{0.5em}+101 = warning, large timespan
+                                            ($>100$ years)} \\
+ \spec{}{}{\hspace{-1.8em}+1 to +10 = coincident with major planet
+                                                  (Note~5)} \\
+ \spec{}{}{\hspace{1.95em}       0 = OK} \\
+ \spec{}{}{\hspace{1.2em}    $-$1 = numerical error}
+}
+\notes
+{
+ \begin{enumerate}
+  \setlength{\parskip}{\medskipamount}
+  \item The ``universal'' elements are those which define the orbit for the
+        purposes of the method of universal variables (see reference 2).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+
+  \item The universal elements are with respect to the J2000 equator and
+        equinox.
+
+  \item The epochs DATE, U(3) and U(12) are all Modified Julian Dates
+        (JD$-$2400000.5).
+
+  \item The algorithm is a simplified form of Encke's method.  It takes as
+        a basis the unperturbed motion of the body, and numerically
+        integrates the perturbing accelerations from the major planets.
+        The expression used is essentially Sterne's 6.7-2 (reference 1).
+        Everhart \& Pitkin (reference 2) suggest rectifying the orbit at
+        each integration step by propagating the new perturbed position
+        and velocity as the new universal variables.  In the present
+        routine the orbit is rectified less frequently than this, in order
+        to gain a slight speed advantage.  However, the rectification is
+        done directly in terms of position and velocity, as suggested by
+        Everhart \& Pitkin, bypassing the use of conventional orbital
+        elements.
+
+        The $f(q)$ part of the full Encke method is not used.  The purpose
+        of this part is to avoid subtracting two nearly equal quantities
+        when calculating the ``indirect member'', which takes account of the
+        small change in the Sun's attraction due to the slightly displaced
+        position of the perturbed body.  A simpler, direct calculation in
+        double precision proves to be faster and not significantly less
+        accurate.
+
+        Apart from employing a variable timestep, and occasionally
+        ``rectifying the orbit'' to keep the indirect member small, the
+        integration is done in a fairly straightforward way.  The
+        acceleration estimated for the middle of the timestep is assumed
+        to apply throughout that timestep;  it is also used in the
+        extrapolation of the perturbations to the middle of the next
+        timestep, to predict the new disturbed position.  There is no
+        iteration within a timestep.
+
+        Measures are taken to reach a compromise between execution time
+        and accuracy.  The starting-point is the goal of achieving
+        arcsecond accuracy for ordinary minor planets over a ten-year
+        timespan.  This goal dictates how large the timesteps can be,
+        which in turn dictates how frequently the unperturbed motion has
+        to be recalculated from the osculating elements.
+
+        Within predetermined limits, the timestep for the numerical
+        integration is varied in length in inverse proportion to the
+        magnitude of the net acceleration on the body from the major
+        planets.
+
+        The numerical integration requires estimates of the major-planet
+        motions.  Approximate positions for the major planets (Pluto
+        alone is omitted) are obtained from the routine sla\_PLANET.  Two
+        levels of interpolation are used, to enhance speed without
+        significantly degrading accuracy.  At a low frequency, the routine
+        sla\_PLANET is called to generate updated position+velocity ``state
+        vectors''.  The only task remaining to be carried out at the full
+        frequency ({\it i.e.}\ at each integration step) is to use the state
+        vectors to extrapolate the planetary positions.  In place of a
+        strictly linear extrapolation, some allowance is made for the
+        curvature of the orbit by scaling back the radius vector as the
+        linear extrapolation goes off at a tangent.
+
+        Various other approximations are made.  For example, perturbations
+        by Pluto and the minor planets are neglected and relativistic
+        effects are not taken into account.
+
+        In the interests of simplicity, the background calculations for
+        the major planets are carried out {\it en masse.}
+        The mean elements and
+        state vectors for all the planets are refreshed at the same time,
+        without regard for orbit curvature, mass or proximity.
+
+        The Earth-Moon system is treated as a single body when the body is
+        distant but as separate bodies when closer to the EMB than the
+        parameter RNE, which incurs a time penalty but improves accuracy
+        for near-Earth objects.
+
+  \item This routine is not intended to be used for major planets.
+        However, if major-planet elements are supplied, sensible results
+        will, in fact, be produced.  This happens because the routine
+        checks the separation between the body and each of the planets and
+        interprets a suspiciously small value (0.001~AU) as an attempt to
+        apply the routine to the planet concerned.  If this condition
+        is detected, the
+        contribution from that planet is ignored, and the status is set to
+        the planet number (1--10 = Mercury, Venus, EMB,
+        Mars, Jupiter, Saturn, Uranus, Neptune, Earth, Moon) as a warning.
+ \end{enumerate}
+}
+\refs{
+   \begin{enumerate}
+   \item Sterne, Theodore E., {\it An Introduction to Celestial Mechanics,}\/
+         Interscience Publishers, 1960.  Section 6.7, p199.
+   \item Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.
+   \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PLANEL}{Planet Position from Elements}
+{
+ \action{Heliocentric position and velocity of a planet,
+         asteroid or comet, starting from orbital elements.}
+ \call{CALL sla\_PLANEL (\vtop{
+         \hbox{DATE, JFORM, EPOCH, ORBINC, ANODE, PERIH,}
+         \hbox{AORQ, E, AORL, DM, PV, JSTAT)}}}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TT MJD of observation (JD$-$2400000.5,} \\
+ \spec{}{}{\hspace{1.5em} Note~1)} \\
+ \spec{JFORM}{I}{choice of element set (1-3, Note~3)} \\
+ \spec{EPOCH}{D}{epoch of elements ($t_0$ or $T$, TT MJD, Note~4)} \\
+ \spec{ORBINC}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH}{D}{longitude or argument of perihelion
+                            ($\varpi$ or $\omega$,} \\
+ \spec{}{}{\hspace{1.5em} radians)} \\
+ \spec{AORQ}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E}{D}{eccentricity ($e$)} \\
+ \spec{AORL}{D}{mean anomaly or longitude
+                               ($M$ or $L$, radians,} \\
+ \spec{}{}{\hspace{1.5em} JFORM=1,2 only)} \\
+ \spec{DM}{D}{daily motion ($n$, radians, JFORM=1 only)}
+}
+\args{RETURNED}
+{
+ \spec{PV}{D(6)}{heliocentric \xyzxyzd, equatorial, J2000} \\
+ \spec{}{}{\hspace{1.5em} (AU, AU/s)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal JFORM} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = illegal E} \\
+ \spec{}{}{\hspace{1.5em} $-$3 = illegal AORQ} \\
+ \spec{}{}{\hspace{1.5em} $-$4 = illegal DM} \\
+ \spec{}{}{\hspace{1.5em} $-$5 = numerical error}
+}
+\notes
+{
+ \begin{enumerate}
+  \item DATE is the instant for which the prediction is required.  It is
+        in the TT time scale (formerly Ephemeris Time, ET) and is a
+        Modified Julian Date (JD$-$2400000.5).
+  \item The elements are with respect to the J2000 ecliptic and equinox.
+  \item A choice of three different element-format options is available, as
+        follows. \\
+
+        JFORM=1, suitable for the major planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & longitude of perihelion $\varpi$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ \\
+        & AORL   & = & mean longitude $L$ (radians) \\
+        & DM     & = & daily motion $n$ (radians)
+        \end{tabular}
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$
+        \end{tabular}
+
+        Unused elements (DM for JFORM=2, AORL and DM for JFORM=3) are
+        not accessed.
+
+  \item Each of the three element sets defines an unperturbed heliocentric
+        orbit.  For a given epoch of observation, the position of the body
+        in its orbit can be predicted from these elements, which are
+        called {\it osculating elements,}\/
+        using standard two-body analytical
+        solutions.  However, due to planetary perturbations, a given set
+        of osculating elements remains usable for only as long as the
+        unperturbed orbit that it describes is an adequate approximation
+        to reality.  Attached to such a set of elements is a date called
+        the {\it osculating epoch,}\/
+        at which the elements are, momentarily,
+        a perfect representation of the instantaneous position and
+        velocity of the body.
+
+        \vspace{1ex}
+
+        Therefore, for any given problem there are up to three different
+        epochs in play, and it is vital to distinguish clearly between
+        them:
+        \begin{itemize}
+        \item The epoch of observation:  the moment in time for which the
+              position of the body is to be predicted.
+        \item The epoch defining the position of the body:  the moment
+              in time at which, in the absence of purturbations, the
+              specified position---mean longitude, mean anomaly, or
+              perihelion---is reached.
+        \item The osculating epoch:  the moment in time at which the
+              given elements are correct.
+        \end{itemize}
+        For the major-planet and minor-planet cases it is usual to make
+        the epoch that defines the position of the body the same as the
+        epoch of osculation.  Thus, only two different epochs are
+        involved:  the epoch of the elements and the epoch of observation.
+        For comets, the epoch of perihelion fixes the position in the
+        orbit and in general a different epoch of osculation will be
+        chosen.  Thus, all three types of epoch are involved.
+
+        \vspace{1ex}
+
+        \goodbreak
+        For the present routine:
+        \begin{itemize}
+        \item The epoch of observation is the argument DATE.
+        \item The epoch defining the position of the body is the argument
+              EPOCH.
+        \item The osculating epoch is not used and is assumed to be
+              close enough to the epoch of observation to deliver
+              adequate accuracy. If not, a preliminary call to
+              sla\_PERTEL may be used to update the element-set (and
+              its associated osculating epoch) by
+              applying planetary perturbations.
+        \end{itemize}
+  \item The reference frame for the result is equatorial and is with
+        respect to the mean equinox and ecliptic of epoch J2000.
+  \item The algorithm was originally adapted from the EPHSLA program of
+        D.\,H.\,P.\,Jones (private communication, 1996).  The method
+        is based on Stumpff's Universal Variables.
+ \end{enumerate}
+}
+\aref{Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.}
+%------------------------------------------------------------------------------
+\routine{SLA\_PLANET}{Planetary Ephemerides}
+{
+ \action{Approximate heliocentric position and velocity of a planet.}
+ \call{CALL sla\_PLANET (DATE, NP, PV, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{Modified Julian Date (JD$-$2400000.5)} \\
+ \spec{NP}{I}{planet:} \\
+ \spec{}{}{\hspace{1.5em} 1\,=\,Mercury} \\
+ \spec{}{}{\hspace{1.5em} 2\,=\,Venus} \\
+ \spec{}{}{\hspace{1.5em} 3\,=\,Earth-Moon Barycentre} \\
+ \spec{}{}{\hspace{1.5em} 4\,=\,Mars} \\
+ \spec{}{}{\hspace{1.5em} 5\,=\,Jupiter} \\
+ \spec{}{}{\hspace{1.5em} 6\,=\,Saturn} \\
+ \spec{}{}{\hspace{1.5em} 7\,=\,Uranus} \\
+ \spec{}{}{\hspace{1.5em} 8\,=\,Neptune} \\
+ \spec{}{}{\hspace{1.5em} 9\,=\,Pluto}
+}
+\args{RETURNED}
+{
+ \spec{PV}{D(6)}{heliocentric \xyzxyzd, equatorial, J2000} \\
+ \spec{}{}{\hspace{1.5em} (AU, AU/s)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} $+$1 = warning: date outside of range} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal NP (outside 1-9)} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = solution didn't converge}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The epoch, DATE, is in the TDB time scale and is in the form
+        of a Modified Julian Date (JD$-$2400000.5).
+  \item The reference frame is equatorial and is with respect to
+        the mean equinox and ecliptic of epoch J2000.
+  \item If a planet number, NP, outside the range 1-9 is supplied, an error
+        status is returned (JSTAT~=~$-1$) and the PV vector
+        is set to zeroes.
+  \item The algorithm for obtaining the mean elements of the
+        planets from Mercury to Neptune is due to
+        J.\,L.\,Simon, P.\,Bretagnon, J.\,Chapront,
+        M.\,Chapront-Touze, G.\,Francou and J.\,Laskar (Bureau des
+        Longitudes, Paris, France).  The (completely different)
+        algorithm for calculating the ecliptic coordinates of
+        Pluto is by Meeus.
+  \item Comparisons of the present routine with the JPL DE200 ephemeris
+        give the following RMS errors over the interval 1960-2025:
+
+        \begin{tabular}{llll}
+         & & {\it position (km)} & {\it speed (metre/sec)} \\ \\
+         & Mercury & \hspace{2em}334 & \hspace{2.5em}0.437 \\
+         & Venus   & \hspace{1.5em}1060 & \hspace{2.5em}0.855 \\
+         & EMB     & \hspace{1.5em}2010 & \hspace{2.5em}0.815 \\
+         & Mars    & \hspace{1.5em}7690 & \hspace{2.5em}1.98 \\
+         & Jupiter & \hspace{1em}71700 & \hspace{2.5em}7.70 \\
+         & Saturn  & \hspace{0.5em}199000 & \hspace{2em}19.4 \\
+         & Uranus  & \hspace{0.5em}564000 & \hspace{2em}16.4 \\
+         & Neptune & \hspace{0.5em}158000 & \hspace{2em}14.4 \\
+         & Pluto & \hspace{1em}36400 & \hspace{2.5em}0.137
+        \end{tabular}
+
+        From comparisons with DE102, Simon {\it et al.}\/ quote the following
+        longitude accuracies over the interval 1800-2200:
+
+        \begin{tabular}{lll}
+         & Mercury & \hspace{0.5em}\arcseci{4} \\
+         & Venus   & \hspace{0.5em}\arcseci{5} \\
+         & EMB     & \hspace{0.5em}\arcseci{6} \\
+         & Mars    & \arcseci{17} \\
+         & Jupiter & \arcseci{71} \\
+         & Saturn  & \arcseci{81} \\
+         & Uranus  & \arcseci{86} \\
+         & Neptune & \arcseci{11}
+        \end{tabular}
+
+        In the case of Pluto, Meeus quotes an accuracy of \arcsec{0}{6}
+        in longitude and \arcsec{0}{2} in latitude for the period
+        1885-2099.
+
+        For all except Pluto, over the period 1000-3000,
+        the accuracy is better than 1.5
+        times that over 1800-2200.  Outside the interval 1000-3000 the
+        accuracy declines.  For Pluto the accuracy declines rapidly
+        outside the period 1885-2099.  Outside these ranges
+        (1885-2099 for Pluto, 1000-3000 for the rest) a ``date out
+        of range'' warning status ({\tt JSTAT=+1}) is returned.
+  \item The algorithms for (i)~Mercury through Neptune and
+        (ii)~Pluto are completely independent.  In the Mercury
+        through Neptune case, the present SLALIB
+        implementation differs from the original
+        Simon {\it et al.}\/ Fortran code in the following respects:
+        \begin{itemize}
+         \item The date is supplied as a Modified Julian Date rather
+               a Julian Date (${\rm MJD} = ({\rm JD} - 2400000.5$).
+         \item The result is returned only in equatorial
+               Cartesian form;  the ecliptic
+               longitude, latitude and radius vector are not returned.
+         \item The velocity is in AU per second, not AU per day.
+         \item Different error/warning status values are used.
+         \item Kepler's Equation is not solved inline.
+         \item Polynomials in T are nested to minimize rounding errors.
+         \item Explicit double-precision constants are used to avoid
+               mixed-mode expressions.
+         \item There are other, cosmetic, changes to comply with
+               Starlink/SLALIB style guidelines.
+        \end{itemize}
+        None of the above changes affects the result significantly.
+  \item For NP\,=\,3 the result is for the Earth-Moon Barycentre.  To
+        obtain the heliocentric position and velocity of the Earth,
+        either use the SLALIB routine sla\_EVP (or sla\_EPV)
+        or call sla\_DMOON and
+        subtract 0.012150581 times the geocentric Moon vector from
+        the EMB vector produced by the present routine.  (The Moon
+        vector should be precessed to J2000 first, but this can
+        be omitted for modern epochs without introducing significant
+        inaccuracy.)
+ \end{enumerate}
+\refs
+{
+ \begin{enumerate}
+  \item Simon {\it et al.,}\/
+        Astron.\ Astrophys.\ {\bf 282}, 663 (1994).
+  \item Meeus, J.,
+        {\it Astronomical Algorithms,}\/ Willmann-Bell (1991).
+ \end{enumerate}
+}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_PLANTE}{\radec\ of Planet from Elements}
+{
+ \action{Topocentric apparent \radec\ of a Solar-System object whose
+         heliocentric orbital elements are known.}
+ \call{CALL sla\_PLANTE (\vtop{
+         \hbox{DATE, ELONG, PHI, JFORM, EPOCH, ORBINC, ANODE, PERIH,}
+         \hbox{AORQ, E, AORL, DM, RA, DEC, R, JSTAT)}}}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TT MJD of observation (JD$-$2400000.5,} \\
+ \spec{}{}{\hspace{1.5em} Notes~1,5)} \\
+ \spec{ELONG,PHI}{D}{observer's longitude (east +ve) and latitude} \\
+ \spec{}{}{\hspace{1.5em} (radians, Note~2)} \\
+ \spec{JFORM}{I}{choice of element set (1-3, Notes~3-6)} \\
+ \spec{EPOCH}{D}{epoch of elements ($t_0$ or $T$, TT MJD, Note~5)} \\
+ \spec{ORBINC}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH}{D}{longitude or argument of perihelion
+                            ($\varpi$ or $\omega$,} \\
+ \spec{}{}{\hspace{1.5em} radians)} \\
+ \spec{AORQ}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E}{D}{eccentricity ($e$)} \\
+ \spec{AORL}{D}{mean anomaly or longitude ($M$ or $L$, radians,} \\
+  \spec{}{}{\hspace{1.5em} JFORM=1,2 only)} \\
+ \spec{DM}{D}{daily motion ($n$, radians, JFORM=1 only)}
+}
+\args{RETURNED}
+{
+ \spec{RA,DEC}{D}{topocentric apparent \radec\ (radians)} \\
+ \spec{R}{D}{distance from observer (AU)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal JFORM} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = illegal E} \\
+ \spec{}{}{\hspace{1.5em} $-$3 = illegal AORQ} \\
+ \spec{}{}{\hspace{1.5em} $-$4 = illegal DM} \\
+ \spec{}{}{\hspace{1.5em} $-$5 = numerical error}
+}
+\notes
+{
+ \begin{enumerate}
+  \item DATE is the instant for which the prediction is
+        required.  It is in the TT time scale (formerly
+        Ephemeris Time, ET) and is a
+        Modified Julian Date (JD$-$2400000.5).
+  \item The longitude and latitude allow correction for geocentric
+        parallax.  This is usually a small effect, but can become
+        important for near-Earth asteroids.  Geocentric positions
+        can be generated by appropriate use of the routines
+        sla\_EVP (or sla\_EPV) and sla\_PLANEL.
+  \item The elements are with respect to the J2000 ecliptic and equinox.
+  \item A choice of three different element-format options is available, as
+        follows. \\
+
+        JFORM=1, suitable for the major planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & longitude of perihelion $\varpi$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ \\
+        & AORL   & = & mean longitude $L$ (radians) \\
+        & DM     & = & daily motion $n$ (radians)
+        \end{tabular}
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$
+        \end{tabular}
+
+        Unused elements (DM for JFORM=2, AORL and DM for JFORM=3) are
+        not accessed.
+
+  \item Each of the three element sets defines an unperturbed heliocentric
+        orbit.  For a given epoch of observation, the position of the body
+        in its orbit can be predicted from these elements, which are
+        called {\it osculating elements,}\/
+        using standard two-body analytical
+        solutions.  However, due to planetary perturbations, a given set
+        of osculating elements remains usable for only as long as the
+        unperturbed orbit that it describes is an adequate approximation
+        to reality.  Attached to such a set of elements is a date called
+        the {\it osculating epoch,}\/
+        at which the elements are, momentarily,
+        a perfect representation of the instantaneous position and
+        velocity of the body.
+
+        \vspace{1ex}
+
+        Therefore, for any given problem there are up to three different
+        epochs in play, and it is vital to distinguish clearly between
+        them:
+        \begin{itemize}
+        \item The epoch of observation:  the moment in time for which the
+              position of the body is to be predicted.
+        \item The epoch defining the position of the body:  the moment
+              in time at which, in the absence of purturbations, the
+              specified position---mean longitude, mean anomaly, or
+              perihelion---is reached.
+        \item The osculating epoch:  the moment in time at which the
+              given elements are correct.
+        \end{itemize}
+        For the major-planet and minor-planet cases it is usual to make
+        the epoch that defines the position of the body the same as the
+        epoch of osculation.  Thus, only two different epochs are
+        involved:  the epoch of the elements and the epoch of observation.
+        For comets, the epoch of perihelion fixes the position in the
+        orbit and in general a different epoch of osculation will be
+        chosen.  Thus, all three types of epoch are involved.
+
+        \vspace{1ex}
+
+        \goodbreak
+        For the present routine:
+        \begin{itemize}
+        \item The epoch of observation is the argument DATE.
+        \item The epoch defining the position of the body is the argument
+              EPOCH.
+        \item The osculating epoch is not used and is assumed to be
+              close enough to the epoch of observation to deliver
+              adequate accuracy. If not, a preliminary call to
+              sla\_PERTEL may be used to update the element-set (and
+              its associated osculating epoch) by
+              applying planetary perturbations.
+        \end{itemize}
+  \item Two important sources for orbital elements are {\it Horizons,}\/
+        operated by the Jet Propulsion Laboratory, Pasadena,
+        and the {\it Minor Planet Center,}\/ operated by the Center for
+        Astrophysics, Harvard.  For further details, see Section~\ref{ephem}.
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_PLANTU}{\radec\ from Universal Elements}
+{
+ \action{Topocentric apparent \radec\ of a Solar-System object whose
+         heliocentric universal orbital elements are known.}
+ \call{CALL sla\_PLANTU (DATE, ELONG, PHI, U, RA, DEC, R, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{TT MJD of observation (JD$-$2400000.5)} \\
+ \spec{ELONG,PHI}{D}{observer's longitude (east +ve) and latitude} \\
+ \spec{}{}{\hspace{1.5em} radians)}
+}
+\args{GIVEN and RETURNED}
+{
+ \spec{U}{D(13)}{universal orbital elements} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v_0}$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date, approx}
+}
+\args{RETURNED}
+{
+ \spec{RA,DEC}{D}{topocentric apparent \radec\ (radians)} \\
+ \spec{R}{D}{distance from observer (AU)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = radius vector zero} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = failed to converge}
+}
+\notes
+{
+ \begin{enumerate}
+  \item DATE is the instant for which the prediction is
+        required.  It is in the TT time scale (formerly
+        Ephemeris Time, ET) and is a
+        Modified Julian Date (JD$-$2400000.5).
+  \item The longitude and latitude allow correction for geocentric
+        parallax.  This is usually a small effect, but can become
+        important for near-Earth asteroids.  Geocentric positions
+        can be generated by appropriate use of the routines
+        sla\_EVP (or sla\_EPV) and sla\_UE2PV.
+  \item The ``universal'' elements are those which define the orbit for the
+        purposes of the method of universal variables (see reference 2).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+  \item The universal elements are with respect to the J2000 ecliptic
+        and equinox.
+ \end{enumerate}
+}
+\refs{
+   \begin{enumerate}
+   \item Sterne, Theodore E., {\it An Introduction to Celestial Mechanics,}\/
+         Interscience Publishers, 1960.  Section 6.7, p199.
+   \item Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.
+   \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_PM}{Proper Motion}
+{
+ \action{Apply corrections for proper motion to a star \radec.}
+ \call{CALL sla\_PM (R0, D0, PR, PD, PX, RV, EP0, EP1, R1, D1)}
+}
+\args{GIVEN}
+{
+ \spec{R0,D0}{D}{\radec\ at epoch EP0 (radians)} \\
+ \spec{PR,PD}{D}{proper motions:  rate of change of
+                 \radec\  (radians per year)} \\
+ \spec{PX}{D}{parallax (arcsec)} \\
+ \spec{RV}{D}{radial velocity (km~s$^{-1}$, +ve if receding)} \\
+ \spec{EP0}{D}{start epoch in years ({\it e.g.}\ Julian epoch)} \\
+ \spec{EP1}{D}{end epoch in years (same system as EP0)}
+}
+\args{RETURNED}
+{
+ \spec{R1,D1}{D}{\radec\ at epoch EP1 (radians)}
+}
+\notes
+{
+\begin{enumerate}
+\item The $\alpha$ proper motions are $\dot{\alpha}$ rather than
+      $\dot{\alpha}\cos\delta$, and are in the same coordinate
+      system as R0,D0.
+\item If the available proper motions are pre-FK5 they will be per
+      tropical year rather than per Julian year, and so the epochs
+      must both be Besselian rather than Julian.  In such cases, a
+      scaling factor of 365.2422D0/365.25D0 should be applied to the
+      radial velocity before use also.
+\end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item 1984 {\it Astronomical Almanac}, pp B39-B41.
+  \item Lederle \& Schwan, 1984.\ {\it Astr. Astrophys.}\ {\bf 134}, 1-6.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_POLMO}{Polar Motion}
+{
+ \action{Polar motion:  correct site longitude and latitude for polar
+         motion and calculate azimuth difference between celestial and
+         terrestrial poles.}
+ \call{CALL sla\_POLMO (ELONGM, PHIM, XP, YP, ELONG, PHI, DAZ)}
+}
+\args{GIVEN}
+{
+ \spec{ELONGM}{D}{mean longitude of the site (radians, east +ve)} \\
+ \spec{PHIM}{D}{mean geodetic latitude of the site (radians)} \\
+ \spec{XP}{D}{polar motion $x$-coordinate (radians)} \\
+ \spec{YP}{D}{polar motion $y$-coordinate (radians)}
+}
+\args{RETURNED}
+{
+ \spec{ELONG}{D}{true longitude of the site (radians, east +ve)} \\
+ \spec{PHI}{D}{true geodetic latitude of the site (radians)} \\
+ \spec{DAZ}{D}{azimuth correction (terrestrial$-$celestial, radians)}
+}
+\notes
+{
+\begin{enumerate}
+\item ``Mean'' longitude and latitude are the (fixed) values for the
+      site's location with respect to the IERS terrestrial reference
+      frame;  the latitude is geodetic.  TAKE CARE WITH THE LONGITUDE
+      SIGN CONVENTION.  The longitudes used by the present routine
+      are east-positive, in accordance with geographical convention
+      (and right-handed).  In particular, note that the longitudes
+      returned by the sla\_OBS routine are west-positive, following
+      astronomical usage, and must be reversed in sign before use in
+      the present routine.
+\item XP and YP are the (changing) coordinates of the Celestial
+      Ephemeris Pole with respect to the IERS Reference Pole.
+      XP is positive along the meridian at longitude $0^\circ$,
+      and YP is positive along the meridian at longitude
+      $270^\circ$ ({\it i.e.}\ $90^\circ$ west).  Values for XP,YP can
+      be obtained from IERS circulars and equivalent publications;
+      the maximum amplitude observed so far is about \arcsec{0}{3}.
+\item ``True'' longitude and latitude are the (moving) values for
+      the site's location with respect to the celestial ephemeris
+      pole and the meridian which corresponds to the Greenwich
+      apparent sidereal time.  The true longitude and latitude
+      link the terrestrial coordinates with the standard celestial
+      models (for precession, nutation, sidereal time {\it etc}).
+\item The azimuths produced by sla\_AOP and sla\_AOPQK are with
+      respect to due north as defined by the Celestial Ephemeris
+      Pole, and can therefore be called ``celestial azimuths''.
+      However, a telescope fixed to the Earth measures azimuth
+      essentially with respect to due north as defined by the
+      IERS Reference Pole, and can therefore be called ``terrestrial
+      azimuth''.  Uncorrected, this would manifest itself as a
+      changing ``azimuth zero-point error''.  The value DAZ is the
+      correction to be added to a celestial azimuth to produce
+      a terrestrial azimuth.
+\item The present routine is rigorous.  For most practical
+      purposes, the following simplified formulae provide an
+      adequate approximation: \\[2ex]
+      \hspace*{1em}\begin{tabular}{lll}
+        {\tt ELONG} & {\tt =} &
+             {\tt ELONGM+XP*COS(ELONGM)-YP*SIN(ELONGM)} \\
+        {\tt PHI  } & {\tt =} &
+             {\tt PHIM+(XP*SIN(ELONGM)+YP*COS(ELONGM))*TAN(PHIM)} \\
+        {\tt DAZ  } & {\tt =} &
+             {\tt -SQRT(XP*XP+YP*YP)*COS(ELONGM-ATAN2(XP,YP))/COS(PHIM)} \\
+      \end{tabular} \\[2ex]
+      An alternative formulation for DAZ is:\\[2ex]
+      \hspace*{1em}\begin{tabular}{lll}
+        {\tt X  } & {\tt =} & {\tt COS(ELONGM)*COS(PHIM)} \\
+        {\tt Y  } & {\tt =} & {\tt SIN(ELONGM)*COS(PHIM)} \\
+        {\tt DAZ} & {\tt =} & {\tt ATAN2(-X*YP-Y*XP,X*X+Y*Y)} \\
+      \end{tabular}
+\end{enumerate}
+}
+\aref{Seidelmann, P.K.\ (ed), 1992.  {\it Explanatory
+      Supplement to the Astronomical Almanac,}\/ ISBN~0-935702-68-7,
+      sections 3.27, 4.25, 4.52.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PREBN}{Precession Matrix (FK4)}
+{
+ \action{Generate the matrix of precession between two epochs,
+         using the old, pre IAU~1976, Bessel-Newcomb model, in
+         Andoyer's formulation.}
+ \call{CALL sla\_PREBN (BEP0, BEP1, RMATP)}
+}
+\args{GIVEN}
+{
+ \spec{BEP0}{D}{beginning Besselian epoch} \\
+ \spec{BEP1}{D}{ending Besselian epoch}
+}
+\args{RETURNED}
+{
+ \spec{RMATP}{D(3,3)}{precession matrix}
+}
+\anote{The matrix is in the sense:
+       \begin{verse}
+        {\bf v}$_{1}$ =  {\bf M}$\cdot${\bf v}$_{0}$
+       \end{verse}
+       where {\bf v}$_{1}$ is the star vector relative to the
+       mean equator and equinox of epoch BEP1, {\bf M} is the
+       $3\times3$ matrix RMATP and
+       {\bf v}$_{0}$ is the star vector relative to the
+       mean equator and equinox of epoch BEP0.}
+\aref{Smith {\it et al.}, 1989.\ {\it Astr.J.}\ {\bf 97}, 269.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PREC}{Precession Matrix (FK5)}
+{
+ \action{Form the matrix of precession between two epochs (IAU 1976, FK5).}
+ \call{CALL sla\_PREC (EP0, EP1, RMATP)}
+}
+\args{GIVEN}
+{
+ \spec{EP0}{D}{beginning epoch} \\
+ \spec{EP1}{D}{ending epoch}
+}
+\args{RETURNED}
+{
+ \spec{RMATP}{D(3,3)}{precession matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The epochs are TDB Julian epochs.
+  \item The matrix is in the sense:
+        \begin{verse}
+         {\bf v}$_{1}$ =  {\bf M}$\cdot${\bf v}$_{0}$
+        \end{verse}
+        where {\bf v}$_{1}$ is the star vector relative to the
+        mean equator and equinox of epoch EP1, {\bf M} is the
+        $3\times3$ matrix RMATP and
+        {\bf v}$_{0}$ is the star vector relative to the
+        mean equator and equinox of epoch EP0.
+  \item Though the matrix method itself is rigorous, the precession
+        angles are expressed through canonical polynomials which are
+        valid only for a limited time span.  There are also known
+        errors in the IAU precession rate.  The absolute accuracy
+        of the present formulation is better than \arcsec{0}{1} from
+        1960\,AD to 2040\,AD, better than \arcseci{1} from 1640\,AD to 2360\,AD,
+        and remains below \arcseci{3} for the whole of the period
+        500\,BC to 3000\,AD.  The errors exceed \arcseci{10} outside the
+        range 1200\,BC to 3900\,AD, exceed \arcseci{100} outside 4200\,BC to
+        5600\,AD and exceed \arcseci{1000} outside 6800\,BC to 8200\,AD.
+        The SLALIB routine sla\_PRECL implements a more elaborate
+        model which is suitable for problems spanning several
+        thousand years.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Lieske, J.H., 1979.\ {\it Astr.Astrophys.}\ {\bf 73}, 282;
+        equations 6 \& 7, p283.
+  \item Kaplan, G.H., 1981.\ {\it USNO circular no.\ 163}, pA2.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PRECES}{Precession}
+{
+ \action{Precession -- either the old ``FK4'' (Bessel-Newcomb, pre~IAU~1976)
+         or new ``FK5'' (Fricke, post~IAU~1976) as required.}
+ \call{CALL sla\_PRECES (SYSTEM, EP0, EP1, RA, DC)}
+}
+\args{GIVEN}
+{
+ \spec{SYSTEM}{C}{precession to be applied: `FK4' or `FK5'} \\
+ \spec{EP0,EP1}{D}{starting and ending epoch} \\
+ \spec{RA,DC}{D}{\radec, mean equator \& equinox of epoch EP0}
+}
+\args{RETURNED}
+{
+ \spec{RA,DC}{D}{\radec, mean equator \& equinox of epoch EP1}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Lowercase characters in SYSTEM are acceptable.
+  \item The epochs are Besselian if SYSTEM=`FK4' and Julian if `FK5'.
+        For example, to precess coordinates in the old system from
+        equinox 1900.0 to 1950.0 the call would be:
+        \begin{quote}
+         {\tt CALL sla\_PRECES ('FK4', 1900D0, 1950D0, RA, DC)}
+        \end{quote}
+  \item This routine will {\bf NOT} correctly convert between the old and
+        the new systems -- for example conversion from B1950 to J2000.
+        For these purposes see sla\_FK425, sla\_FK524, sla\_FK45Z and
+        sla\_FK54Z.
+  \item If an invalid SYSTEM is supplied, values of $-$99D0,$-$99D0 are
+        returned for both RA and DC.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PRECL}{Precession Matrix (latest)}
+{
+ \action{Form the matrix of precession between two epochs, using the
+         model of Simon {\it et al}.\ (1994), which is suitable for long
+         periods of time.}
+ \call{CALL sla\_PRECL (EP0, EP1, RMATP)}
+}
+\args{GIVEN}
+{
+ \spec{EP0}{D}{beginning epoch} \\
+ \spec{EP1}{D}{ending epoch}
+}
+\args{RETURNED}
+{
+ \spec{RMATP}{D(3,3)}{precession matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The epochs are TDB Julian epochs.
+  \item The matrix is in the sense:
+        \begin{verse}
+         {\bf v}$_{1}$ =  {\bf M}$\cdot${\bf v}$_{0}$
+        \end{verse}
+        where {\bf v}$_{1}$ is the star vector relative to the
+        mean equator and equinox of epoch EP1, {\bf M} is the
+        $3\times3$ matrix RMATP and
+        {\bf v}$_{0}$ is the star vector relative to the
+        mean equator and equinox of epoch EP0.
+  \item The absolute accuracy of the model is limited by the
+        uncertainty in the general precession, about \arcsec{0}{3} per
+        1000~years.  The remainder of the formulation provides a
+        precision of 1~milliarcsecond over the interval from 1000\,AD
+        to 3000\,AD, \arcsec{0}{1} from 1000\,BC to 5000\,AD and
+        \arcseci{1} from 4000\,BC to 8000\,AD.
+ \end{enumerate}
+}
+\aref{Simon, J.L.\ {\it et al}., 1994.\ {\it Astr.Astrophys.}\ {\bf 282},
+      663.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PRENUT}{Precession-Nutation Matrix}
+{
+ \action{Form the matrix of precession and nutation (SF2001).}
+ \call{CALL sla\_PRENUT (EPOCH, DATE, RMATPN)}
+}
+\args{GIVEN}
+{
+ \spec{EPOCH}{D}{Julian Epoch for mean coordinates} \\
+ \spec{DATE}{D}{Modified Julian Date (JD$-$2400000.5)
+                       for true coordinates}
+}
+\args{RETURNED}
+{
+ \spec{RMATPN}{D(3,3)}{combined precession-nutation matrix}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The epoch and date are TDB.  TT (or even UTC) will do.
+  \item The matrix is in the sense:
+        \begin{verse}
+         {\bf v}$_{true}$ =  {\bf M}$\cdot${\bf v}$_{mean}$
+        \end{verse}
+        where {\bf v}$_{true}$ is the star vector relative to the
+        true equator and equinox of epoch DATE, {\bf M} is the
+        $3\times3$ matrix RMATPN and
+        {\bf v}$_{mean}$ is the star vector relative to the
+        mean equator and equinox of epoch EPOCH.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_PV2EL}{Orbital Elements from Position/Velocity}
+{
+ \action{Heliocentric osculating elements obtained from instantaneous
+         position and velocity.}
+ \call{CALL sla\_PV2EL (\vtop{
+         \hbox{PV, DATE, PMASS, JFORMR, JFORM, EPOCH, ORBINC,}
+         \hbox{ANODE, PERIH, AORQ, E, AORL, DM, JSTAT)}}}
+}
+\args{GIVEN}
+{
+ \spec{PV}{D(6)}{heliocentric \xyzxyzd, equatorial, J2000} \\
+ \spec{}{}{\hspace{1.5em} (AU, AU/s; Note~1)} \\
+ \spec{DATE}{D}{date (TT Modified Julian Date = JD$-$2400000.5)} \\
+ \spec{PMASS}{D}{mass of the planet (Sun = 1; Note~2)} \\
+ \spec{JFORMR}{I}{requested element set (1-3; Note~3)}
+}
+\args{RETURNED}
+{
+ \spec{JFORM}{I}{element set actually returned (1-3; Note~4)} \\
+ \spec{EPOCH}{D}{epoch of elements ($t_0$ or $T$, TT MJD)} \\
+ \spec{ORBINC}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH}{D}{longitude or argument of perihelion
+                            ($\varpi$ or $\omega$,} \\
+ \spec{}{}{\hspace{1.5em} radians)} \\
+ \spec{AORQ}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E}{D}{eccentricity ($e$)} \\
+ \spec{AORL}{D}{mean anomaly or longitude
+                               ($M$ or $L$, radians,} \\
+ \spec{}{}{\hspace{1.5em} JFORM=1,2 only)} \\
+ \spec{DM}{D}{daily motion ($n$, radians, JFORM=1 only)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal PMASS} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = illegal JFORMR} \\
+ \spec{}{}{\hspace{1.5em} $-$3 = position/velocity out of allowed range}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The PV 6-vector is with respect to the mean equator and equinox of
+        epoch J2000.  The orbital elements produced are with respect to
+        the J2000 ecliptic and mean equinox.
+  \item The mass, PMASS, is important only for the larger planets.  For
+        most purposes ({\it e.g.}~asteroids) use 0D0.  Values less than zero
+        are illegal.
+  \item Three different element-format options are supported, as
+        follows. \\
+
+        JFORM=1, suitable for the major planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & longitude of perihelion $\varpi$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean longitude $L$ (radians) \\
+        & DM     & = & daily motion $n$ (radians)
+        \end{tabular}
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e \leq 10 )$
+        \end{tabular}
+
+  \item It may not be possible to generate elements in the form
+        requested through JFORMR.  The caller is notified of the form
+        of elements actually returned by means of the JFORM argument:
+
+        \begin{tabular}{llll}
+        & JFORMR   & JFORM   & meaning \\ \\
+        & ~~~~~1   & ~~~~~1  & OK: elements are in the requested format \\
+        & ~~~~~1   & ~~~~~2  & never happens \\
+        & ~~~~~1   & ~~~~~3  & orbit not elliptical \\
+        & ~~~~~2   & ~~~~~1  & never happens \\
+        & ~~~~~2   & ~~~~~2  & OK: elements are in the requested format \\
+        & ~~~~~2   & ~~~~~3  & orbit not elliptical \\
+        & ~~~~~3   & ~~~~~1  & never happens \\
+        & ~~~~~3   & ~~~~~2  & never happens \\
+        & ~~~~~3   & ~~~~~3  & OK: elements are in the requested format
+        \end{tabular}
+
+  \item The arguments returned for each value of JFORM ({\it cf.}\/ Note~5:
+        JFORM may not be the same as JFORMR) are as follows:
+
+        \begin{tabular}{lllll}
+        & JFORM  & 1        & 2        & 3 \\ \\
+        & EPOCH  & $t_0$    & $t_0$    & $T$ \\
+        & ORBINC & $i$      & $i$      & $i$ \\
+        & ANODE  & $\Omega$ & $\Omega$ & $\Omega$ \\
+        & PERIH  & $\varpi$ & $\omega$ & $\omega$ \\
+        & AORQ   & $a$      & $a$      & $q$ \\
+        & E      & $e$      & $e$      & $e$ \\
+        & AORL   & $L$      & $M$      & - \\
+        & DM     & $n$      & -        & -
+        \end{tabular}
+
+        where:
+
+        \begin{tabular}{lll}
+        & $t_0$    & is the epoch of the elements (MJD, TT) \\
+        & $T$      & is the epoch of perihelion (MJD, TT) \\
+        & $i$      & is the inclination (radians) \\
+        & $\Omega$ & is the longitude of the ascending node (radians) \\
+        & $\varpi$ & is the longitude of perihelion (radians) \\
+        & $\omega$ & is the argument of perihelion (radians) \\
+        & $a$      & is the mean distance (AU) \\
+        & $q$      & is the perihelion distance (AU) \\
+        & $e$      & is the eccentricity \\
+        & $L$      & is the longitude (radians, $0-2\pi$) \\
+        & $M$      & is the mean anomaly (radians, $0-2\pi$) \\
+        & $n$      & is the daily motion (radians) \\
+        & - & means no value is set
+        \end{tabular}
+
+  \item At very small inclinations, the longitude of the ascending node
+        ANODE becomes indeterminate and under some circumstances may be
+        set arbitrarily to zero.  Similarly, if the orbit is close to
+        circular, the true anomaly becomes indeterminate and under some
+        circumstances may be set arbitrarily to zero.  In such cases,
+        the other elements are automatically adjusted to compensate,
+        and so the elements remain a valid description of the orbit.
+  \item The osculating epoch for the returned elements is the argument
+        DATE.
+ \end{enumerate}
+}
+\aref{Sterne, Theodore E., {\it An Introduction to Celestial Mechanics,}\/
+      Interscience Publishers, 1960.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PV2UE}{Position/Velocity to Universal Elements}
+{
+ \action{Construct a universal element set based on an instantaneous
+         position and velocity.}
+ \call{CALL sla\_PV2UE (PV, DATE, PMASS, U, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{PV}{D(6)}{heliocentric \xyzxyzd, equatorial, J2000} \\
+ \spec{}{}{\hspace{1.5em} (AU, AU/s; Note~1)} \\
+ \spec{DATE}{D}{date (TT Modified Julian Date = JD$-$2400000.5)} \\
+ \spec{PMASS}{D}{mass of the planet (Sun = 1; Note~2)}
+}
+\args{RETURNED}
+{
+ \spec{U}{D(13)}{universal orbital elements (Note~3)} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v}_0$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date, approx} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{1.95em}      0 = OK} \\
+ \spec{}{}{\hspace{1.2em}    $-$1 = illegal PMASS} \\
+ \spec{}{}{\hspace{1.2em}    $-$2 = too close to Sun} \\
+ \spec{}{}{\hspace{1.2em}    $-$3 = too slow}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The PV 6-vector can be with respect to any chosen inertial frame,
+        and the resulting universal-element set will be with respect to
+        the same frame.  A common choice will be mean equator and ecliptic
+        of epoch J2000.
+  \item The mass, PMASS, is important only for the larger planets.  For
+        most purposes ({\it e.g.}~asteroids) use 0D0.  Values less than zero
+        are illegal.
+  \item The ``universal'' elements are those which define the orbit for the
+        purposes of the method of universal variables (see reference).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+ \end{enumerate}
+}
+\aref{Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PVOBS}{Observatory Position \& Velocity}
+{
+ \action{Position and velocity of an observing station.}
+ \call{CALL sla\_PVOBS (P, H, STL, PV)}
+}
+\args{GIVEN}
+{
+ \spec{P}{D}{latitude (geodetic, radians)} \\
+ \spec{H}{D}{height above reference spheroid (geodetic, metres)} \\
+ \spec{STL}{D}{local apparent sidereal time (radians)}
+}
+\args{RETURNED}
+{
+ \spec{PV}{D(6)}{\xyzxyzd\ (AU, AU~s$^{-1}$, true equator and equinox
+                                                            of date)}
+}
+\anote{IAU 1976 constants are used.}
+%-----------------------------------------------------------------------
+\routine{SLA\_PXY}{Apply Linear Model}
+{
+ \action{Given arrays of {\it expected}\/ and {\it measured}\,
+         \xy\ coordinates, and a
+         linear model relating them (as produced by sla\_FITXY), compute
+         the array of {\it predicted}\/ coordinates and the RMS residuals.}
+ \call{CALL sla\_PXY (NP,XYE,XYM,COEFFS,XYP,XRMS,YRMS,RRMS)}
+}
+\args{GIVEN}
+{
+ \spec{NP}{I}{number of samples} \\
+ \spec{XYE}{D(2,NP)}{expected \xy\ for each sample} \\
+ \spec{XYM}{D(2,NP)}{measured \xy\ for each sample} \\
+ \spec{COEFFS}{D(6)}{coefficients of model (see below)}
+}
+\args{RETURNED}
+{
+ \spec{XYP}{D(2,NP)}{predicted \xy\ for each sample} \\
+ \spec{XRMS}{D}{RMS in X} \\
+ \spec{YRMS}{D}{RMS in Y} \\
+ \spec{RRMS}{D }{total RMS (vector sum of XRMS and YRMS)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The model is supplied in the array COEFFS.  Naming the
+        six elements of COEFFS $a,b,c,d,e$ \& $f$,
+        the model transforms {\it measured}\/ coordinates
+        $[x_{m},y_{m}\,]$ into {\it predicted}\/ coordinates
+        $[x_{p},y_{p}\,]$ as follows:
+        \begin{verse}
+         $x_{p} = a + bx_{m} + cy_{m}$ \\
+         $y_{p} = d + ex_{m} + fy_{m}$
+        \end{verse}
+  \item The residuals are $(x_{p}-x_{e})$ and $(y_{p}-y_{e})$.
+  \item If NP is less than or equal to zero, no coordinates are
+        transformed, and the RMS residuals are all zero.
+  \item See also sla\_FITXY, sla\_INVF, sla\_XY2XY, sla\_DCMPF
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_RANDOM}{Random Number}
+{
+ \action{Generate pseudo-random real number in the range $0 \leq x < 1$.}
+ \call{R~=~sla\_RANDOM (SEED)}
+}
+\args{GIVEN}
+{
+ \spec{SEED}{R}{an arbitrary real number}
+}
+\args{RETURNED}
+{
+ \spec{SEED}{R}{a new arbitrary value} \\
+ \spec{sla\_RANDOM}{R}{Pseudo-random real number $0 \leq x < 1$.}
+}
+\anote{The implementation is machine-dependent.}
+%-----------------------------------------------------------------------
+\routine{SLA\_RANGE}{Put Angle into Range $\pm\pi$}
+{
+ \action{Normalize an angle into the range $\pm\pi$ (single precision).}
+ \call{R~=~sla\_RANGE (ANGLE)}
+}
+\args{GIVEN}
+{
+ \spec{ANGLE}{R}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RANGE}{R}{ANGLE expressed in the range $\pm\pi$.}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_RANORM}{Put Angle into Range $0\!-\!2\pi$}
+{
+ \action{Normalize an angle into the range $0\!-\!2\pi$ (single precision).}
+ \call{R~=~sla\_RANORM (ANGLE)}
+}
+\args{GIVEN}
+{
+ \spec{ANGLE}{R}{angle in radians}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RANORM}{R}{ANGLE expressed in the range $0\!-\!2\pi$}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_RCC}{Barycentric Coordinate Time}
+{
+ \call{D~=~sla\_RCC (TDB, UT1, WL, U, V)}
+ \action{The relativistic clock correction:
+         the difference between {\it proper time}\/ at
+         a point on the Earth and
+         {\it coordinate time}\/ in the solar
+         system barycentric space-time frame of reference.
+         The proper time is Terrestrial Time, TT;
+         the coordinate time is an implementation of Barycentric
+         Dynamical Time, TDB.}
+}
+\args{GIVEN}
+{
+ \spec{TDB}{D}{TDB (MJD: JD$-$2400000.5)} \\
+ \spec{UT1}{D}{universal time (fraction of one day)} \\
+ \spec{WL}{D}{clock longitude (radians west)} \\
+ \spec{U}{D}{clock distance from Earth spin axis (km)} \\
+ \spec{V}{D}{clock distance north of Earth equatorial plane (km)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RCC}{D}{TDB$-$TT (sec; Note 1)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item TDB is coordinate time in the solar system barycentre frame
+        of reference, in units chosen to eliminate the scale difference
+        with respect to terrestrial time.  TT is the proper
+        time for clocks at mean sea level on the Earth.
+  \item The number returned by sla\_RCC comprises
+        a main (annual) sinusoidal term of amplitude
+        approximately 1.66ms, plus lunar and planetary terms up to about
+        20$\mu$s, and diurnal terms up to 2$\mu$s.  The
+        variation arises from the transverse Doppler effect and the
+        gravitational red-shift as the observer varies in speed and
+        moves through different gravitational potentials.
+  \item The argument TDB is, strictly, the barycentric coordinate time;
+        however, the terrestrial time (TT) can in practice be used without
+        significant loss of accuracy.
+  \item The geocentric model is that of Fairhead \& Bretagnon (1990), in
+        its full form.  It was supplied by Fairhead (private communication)
+        as a Fortran subroutine.  A number of coding changes were made to
+        this subroutine in order
+        match the calling sequence of previous versions of the present
+        routine, to comply with Starlink programming standards and to
+        avoid compilation problems on certain machines.  The
+        numerical results are essentially unaffected by the
+        changes.
+  \item The topocentric model is from Moyer (1981) and Murray (1983).
+        It is an approximation to the expression
+        \[\frac{{\bf v}_e \cdot ( {\bf x} - {\bf x}_e )}{c^2}\]
+        where ${\bf v}_e$ is the barycentric velocity of
+        the Earth, ${\bf x}$ and ${\bf x}_e$ are the barycentric positions
+        of the observer and the Earth respectively, and
+        c is the speed of light.
+        It can be disabled, if necessary, by setting the arguments
+        U and V to zero.
+  \item During the interval 1950-2050, the absolute accuracy
+        is better than $\pm3$~nanoseconds
+        relative to direct numerical integrations using the JPL DE200/LE200
+        solar system ephemeris.
+  \item The IAU 1976 definition of TDB was that it must differ from TT only by
+        periodic terms.  Though practical, this is an imprecise definition
+        which ignores the existence of very long-period and secular effects
+        in the dynamics of the solar system.  As a consequence, different
+        implementations of TDB will, in general, differ in zero-point and
+        will drift linearly relative to one other.  In 1991 the IAU introduced
+        new time scales designed to overcome these objections:  geocentric coordinate
+        time, TCG, and barycentric coordinate time, TCB.  In principle, therefore,
+        TDB is obsolete.  However, sla\_RCC
+        can be used to implement the periodic part of TCB$-$TCG.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Fairhead,\,L., \& Bretagnon,\,P., {\it Astron.\,Astrophys.,}\/
+        {\bf 229}, 240-247 (1990).
+  \item Moyer,\,T.D., {\it Cel.\,Mech.,}\/ {\bf 23}, 33 (1981).
+  \item Murray,\,C.A., {\it Vectorial Astrometry,}\/ Adam Hilger (1983).
+  \item Seidelmann,\,P.K.\ {\it et al,}\/ {\it Explanatory Supplement to the
+        Astronomical Almanac,}\/ Chapter 2, University Science Books
+        (1992).
+  \item Simon,\,J.L., Bretagnon,\,P., Chapront,\,J., Chapront-Touze,\,M.,
+        Francou,\,G.\ \& Laskar,\,J., {\it Astron.Astrophys.,}\/
+        {\bf 282}, 663-683 (1994).
+ \end{enumerate}
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_RDPLAN}{Apparent \radec\ of Planet}
+{
+ \action{Approximate topocentric apparent \radec\ and angular
+         size of a planet.}
+ \call{CALL sla\_RDPLAN (DATE, NP, ELONG, PHI, RA, DEC, DIAM)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{MJD of observation (JD$-$2400000.5)} \\
+ \spec{NP}{I}{planet:} \\
+ \spec{}{}{\hspace{1.5em} 1\,=\,Mercury} \\
+ \spec{}{}{\hspace{1.5em} 2\,=\,Venus} \\
+ \spec{}{}{\hspace{1.5em} 3\,=\,Moon} \\
+ \spec{}{}{\hspace{1.5em} 4\,=\,Mars} \\
+ \spec{}{}{\hspace{1.5em} 5\,=\,Jupiter} \\
+ \spec{}{}{\hspace{1.5em} 6\,=\,Saturn} \\
+ \spec{}{}{\hspace{1.5em} 7\,=\,Uranus} \\
+ \spec{}{}{\hspace{1.5em} 8\,=\,Neptune} \\
+ \spec{}{}{\hspace{1.5em} 9\,=\,Pluto} \\
+ \spec{}{}{\hspace{0.44em} else\,=\,Sun} \\
+ \spec{ELONG,PHI}{D}{observer's longitude (east +ve) and latitude
+                     (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RA,DEC}{D}{topocentric apparent \radec\ (radians)} \\
+ \spec{DIAM}{D}{angular diameter (equatorial, radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The date is in a dynamical time scale (TDB, formerly ET)
+        and is in the form of a Modified
+        Julian Date (JD$-$2400000.5).  For all practical purposes, TT can
+        be used instead of TDB, and for many applications UT will do
+        (except for the Moon).
+  \item The longitude and latitude allow correction for geocentric
+        parallax.  This is a major effect for the Moon, but in the
+        context of the limited accuracy of the present routine its
+        effect on planetary positions is small (negligible for the
+        outer planets).  Geocentric positions can be generated by
+        appropriate use of the routines sla\_DMOON and sla\_PLANET.
+  \item The direction accuracy (arcsec, 1000-3000\,AD) is of order:
+
+        \begin{tabular}{lll}
+         & Sun     &  \hspace{0.5em}5 \\
+         & Mercury &  \hspace{0.5em}2 \\
+         & Venus   & 10 \\
+         & Moon    & 30 \\
+         & Mars    & 50 \\
+         & Jupiter & 90 \\
+         & Saturn  & 90 \\
+         & Uranus  & 90 \\
+         & Neptune & 10 \\
+         & Pluto & \hspace{0.5em}1~~~(1885-2099\,AD only)
+        \end{tabular}
+
+        The angular diameter accuracy is about 0.4\% for the Moon,
+        and 0.01\% or better for the Sun and planets.
+        For more information on accuracy,
+        refer to the routines sla\_PLANET and sla\_DMOON,
+        which the present routine uses.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_REFCO}{Refraction Constants}
+{
+ \action{Determine the constants $a$ and $b$ in the
+         atmospheric refraction model
+         $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$,
+         where $\zeta$ is the {\it observed}\/ zenith distance
+         ({\it i.e.}\ affected by refraction) and $\Delta \zeta$ is
+         what to add to $\zeta$ to give the {\it topocentric}\,
+         ({\it i.e.\ in vacuo}) zenith distance.}
+ \call{CALL sla\_REFCO (HM, TDK, PMB, RH, WL, PHI, TLR, EPS, REFA, REFB)}
+}
+\args{GIVEN}
+{
+ \spec{HM}{D}{height of the observer above sea level (metre)} \\
+ \spec{TDK}{D}{ambient temperature at the observer K)} \\
+ \spec{PMB}{D}{pressure at the observer (mb)} \\
+ \spec{RH}{D}{relative humidity at the observer (range 0\,--\,1)} \\
+ \spec{WL}{D}{effective wavelength of the source ($\mu{\rm m}$)} \\
+ \spec{PHI}{D}{latitude of the observer (radian, astronomical)} \\
+ \spec{TLR}{D}{temperature lapse rate in the troposphere
+                                     ( K per metre)} \\
+ \spec{EPS}{D}{precision required to terminate iteration (radian)}
+}
+\args{RETURNED}
+{
+ \spec{REFA}{D}{$\tan \zeta$ coefficient (radians)} \\
+ \spec{REFB}{D}{$\tan^{3} \zeta$ coefficient (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Suggested values for the TLR and EPS arguments are 0.0065D0 and
+        1D$-$8 respectively.  The signs of both are immaterial.
+  \item The radio refraction is chosen by specifying WL $>100$~$\mu{\rm m}$.
+  \item The routine is a slower but more accurate alternative to the
+        sla\_REFCOQ routine.  The constants it produces give perfect
+        agreement with sla\_REFRO at zenith distances
+        $\tan^{-1} 1$ ($45^\circ$) and $\tan^{-1} 4$ ($\sim 76^\circ$).
+        At other zenith distances, the model achieves:
+        \arcsec{0}{5} accuracy for $\zeta<80^{\circ}$,
+        \arcsec{0}{01} accuracy for $\zeta<60^{\circ}$, and
+        \arcsec{0}{001} accuracy for $\zeta<45^{\circ}$.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_REFCOQ}{Refraction Constants (fast)}
+{
+ \action{Determine the constants $a$ and $b$ in the
+         atmospheric refraction model
+         $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$,
+         where $\zeta$ is the {\it observed}\/ zenith distance
+         ({\it i.e.}\ affected by refraction) and $\Delta \zeta$ is
+         what to add to $\zeta$ to give the {\it topocentric}\,
+         ({\it i.e.\ in vacuo}) zenith distance. (This is a fast
+         alternative to the sla\_REFCO routine -- see notes.)}
+ \call{CALL sla\_REFCOQ (TDK, PMB, RH, WL, REFA, REFB)}
+}
+\args{GIVEN}
+{
+ \spec{TDK}{D}{ambient temperature at the observer (K)} \\
+ \spec{PMB}{D}{pressure at the observer (mb)} \\
+ \spec{RH}{D}{relative humidity at the observer (range 0\,--\,1)} \\
+ \spec{WL}{D}{effective wavelength of the source ($\mu{\rm m}$)}
+}
+\args{RETURNED}
+{
+ \spec{REFA}{D}{$\tan \zeta$ coefficient (radians)} \\
+ \spec{REFB}{D}{$\tan^{3} \zeta$ coefficient (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The radio refraction is chosen by specifying WL $>100$~$\mu{\rm m}$.
+  \item The model is an approximation, for moderate zenith distances,
+        to the predictions of the sla\_REFRO routine.  The approximation
+        is maintained across a range of conditions, and applies to
+        both optical/IR and radio.
+  \item The algorithm is a fast alternative to the sla\_REFCO routine.
+        The latter calls the sla\_REFRO routine itself:  this involves
+        integrations through a model atmosphere, and is costly in
+        processor time.  However, the model which is produced is precisely
+        correct for two zenith distances ($45^\circ$ and $\sim\!76^\circ$)
+        and at other zenith distances is limited in accuracy only by the
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$ formulation
+        itself.  The present routine is not as accurate, though it
+        satisfies most practical requirements.
+  \item The model omits the effects of (i)~height above sea level (apart
+        from the reduced pressure itself), (ii)~latitude ({\it i.e.}\ the
+        flattening of the Earth) and (iii)~variations in tropospheric
+        lapse rate.
+  \item The model has been tested using the following range of conditions:
+        \begin{itemize}
+        \item [$\cdot$] lapse rates 0.0055, 0.0065, 0.0075~K per metre
+        \item [$\cdot$] latitudes $0^\circ$, $25^\circ$, $50^\circ$, $75^\circ$
+        \item [$\cdot$] heights 0, 2500, 5000 metres above sea level
+        \item [$\cdot$] pressures mean for height $-10$\% to $+5$\% in steps of $5$\%
+        \item [$\cdot$] temperatures $-10^\circ$ to $+20^\circ$ with respect to
+              $280$K at sea level
+        \item [$\cdot$] relative humidity 0, 0.5, 1
+        \item [$\cdot$] wavelength 0.4, 0.6, \ldots\ $2\mu{\rm m}$, + radio
+        \item [$\cdot$] zenith distances $15^\circ$, $45^\circ$, $75^\circ$
+        \end{itemize}
+        For the above conditions, the comparison with sla\_REFRO
+        was as follows:
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~
+        \begin{tabular}{|r|r|r|} \hline
+              & {\it worst} & {\it RMS} \\ \hline
+              optical/IR & 62 & 8 \\
+              radio & 319 & 49 \\ \hline
+              & mas & mas \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        For this particular set of conditions:
+        \begin{itemize}
+        \item [$\cdot$] lapse rate 6.5 K km$^{-1}$
+        \item [$\cdot$] latitude $50^\circ$
+        \item [$\cdot$] sea level
+        \item [$\cdot$] pressure 1005\,mb
+        \item [$\cdot$] temperature $7^\circ$C
+        \item [$\cdot$] humidity 80\%
+        \item [$\cdot$] wavelength 5740\,\.{A}
+        \end{itemize}
+        the results were as follows:
+
+        \vspace{2ex}
+
+        ~~~~~~~~~~
+        \begin{tabular}{|r|r|r|r|} \hline
+        \multicolumn{1}{|c}{$\zeta$} &
+        \multicolumn{1}{|c}{sla\_REFRO} &
+        \multicolumn{1}{|c}{sla\_REFCOQ} &
+        \multicolumn{1}{|c|}{Saastamoinen} \\ \hline
+        10 &  10.27 &  10.27 &  10.27 \\
+        20 &  21.19 &  21.20 &  21.19 \\
+        30 &  33.61 &  33.61 &  33.60 \\
+        40 &  48.82 &  48.83 &  48.81 \\
+        45 &  58.16 &  58.18 &  58.16 \\
+        50 &  69.28 &  69.30 &  69.27 \\
+        55 &  82.97 &  82.99 &  82.95 \\
+        60 & 100.51 & 100.54 & 100.50 \\
+        65 & 124.23 & 124.26 & 124.20 \\
+        70 & 158.63 & 158.68 & 158.61 \\
+        72 & 177.32 & 177.37 & 177.31 \\
+        74 & 200.35 & 200.38 & 200.32 \\
+        76 & 229.45 & 229.43 & 229.42 \\
+        78 & 267.44 & 267.29 & 267.41 \\
+        80 & 319.13 & 318.55 & 319.10 \\ \hline
+        deg & arcsec & arcsec & arcsec \\ \hline
+        \end{tabular}
+
+        \vspace{3ex}
+
+        The values for Saastamoinen's formula (which includes terms
+        up to $\tan^5$) are taken from Hohenkerk \& Sinclair (1985).
+
+        The results from the much slower but more accurate sla\_REFCO
+        routine have not been included in the tabulation as they are
+        identical to those in the sla\_REFRO column to the \arcsec{0}{01}
+        resolution used.
+  \item Outlandish input parameters are silently limited
+        to mathematically safe values.  Zero pressure is permissible,
+        and causes zeroes to be returned.
+  \item The algorithm draws on several sources, as follows:
+        \begin{itemize}
+        \item The formula for the saturation vapour pressure of water as
+              a function of temperature and temperature is taken from
+              expressions A4.5-A4.7 of Gill (1982).
+        \item The formula for the water vapour pressure, given the
+              saturation pressure and the relative humidity is from
+              Crane (1976), expression 2.5.5.
+        \item The refractivity of air is a function of temperature,
+              total pressure, water-vapour pressure and, in the case
+              of optical/IR but not radio, wavelength.  The formulae
+              for the two cases are developed from Hohenkerk \& Sinclair
+              (1985) and Rueger (2002).
+        \item The formula for $\beta~(=H_0/r_0)$ is
+              an adaption of expression 9 from Stone (1996).  The
+              adaptations, arrived at empirically, consist of (i)~a
+              small adjustment to the coefficient and (ii)~a humidity
+              term for the radio case only.
+        \item The formulae for the refraction constants as a function of
+              $n-1$ and $\beta$ are from Green (1987), expression 4.31.
+        \end{itemize}
+        The first three items are as used in the sla\_REFRO routine.
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Crane, R.K., Meeks, M.L.\ (ed), ``Refraction Effects in
+        the Neutral Atmosphere'',
+        {\it Methods of Experimental Physics: Astrophysics 12B,}\/
+        Academic Press, 1976.
+  \item Gill, Adrian E., {\it Atmosphere-Ocean Dynamics,}\/
+        Academic Press, 1982.
+  \item Green, R.M., {\it Spherical Astronomy,}\/ Cambridge
+        University Press, 1987.
+  \item Hohenkerk, C.Y., \& Sinclair, A.T., NAO Technical Note
+        No.~63, 1985.
+  \item Rueger, J.M., {\it Refractive Index Formulae for
+        Electronic Distance Measurement with Radio and Millimetre
+        Waves}, in Unisurv Report S-68, School of Surveying
+        and Spatial Information Systems, University of New South
+        Wales, Sydney, Australia, 2002.
+  \item Stone, Ronald C., P.A.S.P.~{\bf 108} 1051-1058, 1996.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_REFRO}{Refraction}
+{
+ \action{Atmospheric refraction, for radio or optical/IR wavelengths.}
+ \call{CALL sla\_REFRO (ZOBS, HM, TDK, PMB, RH, WL, PHI, TLR, EPS, REF)}
+}
+\args{GIVEN}
+{
+ \spec{ZOBS}{D}{observed zenith distance of the source (radians)} \\
+ \spec{HM}{D}{height of the observer above sea level (metre)} \\
+ \spec{TDK}{D}{ambient temperature at the observer (K)} \\
+ \spec{PMB}{D}{pressure at the observer (mb)} \\
+ \spec{RH}{D}{relative humidity at the observer (range 0\,--\,1)} \\
+    \spec{WL}{D}{effective wavelength of the source ($\mu{\rm m}$)} \\
+ \spec{PHI}{D}{latitude of the observer (radian, astronomical)} \\
+ \spec{TLR}{D}{temperature lapse rate in the troposphere
+                                     (K per metre)} \\
+ \spec{EPS}{D}{precision required to terminate iteration (radian)}
+}
+\args{RETURNED}
+{
+ \spec{REF}{D}{refraction: {\it in vacuo}\/ ZD minus observed ZD (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item A suggested value for the TLR argument is 0.0065D0 (sign immaterial).
+        The refraction is significantly affected by TLR, and if studies
+        of the local atmosphere have been carried out a better TLR
+        value may be available.
+  \item A suggested value for the EPS argument is 1D$-$8.  The result is
+        usually at least two orders of magnitude more computationally
+        precise than the supplied EPS value.
+  \item The routine computes the refraction for zenith distances up
+        to and a little beyond $90^\circ$ using the method of Hohenkerk
+        \& Sinclair (NAO Technical Notes 59 and 63, subsequently adopted
+        in the {\it Explanatory Supplement to the Astronomical Almanac,}\/
+        1992 -- see section 3.281).
+ \item The code is based on the {\tt AREF}
+       optical/IR refraction subroutine
+       (HMNAO, September 1984, RGO: Hohenkerk 1985),
+       with extensions to
+       support the radio case.  The modifications to the original HMNAO
+       optical/IR refraction code which affect the results are:
+       \begin{itemize}
+        \item The angle arguments have been changed to radians,
+              any value of ZOBS is allowed (see Note~6, below) and
+              other argument values have been limited to safe values.
+        \item Revised values for the gas constants are used, from
+              Murray (1983).
+        \item A better model for $P_s(T)$ has been adopted,
+              from Gill (1982).
+        \item More accurate expressions for $Pw_o$ have been adopted
+              (again from Gill 1982).
+        \item The formula for the water vapour pressure, given the
+              saturation pressure and the relative humidity, is from
+              Crane (1976), expression 2.5.5.
+        \item Provision for radio wavelengths has been added using
+              expressions devised by A.\,T.\,Sinclair, RGO (Sinclair 1989).
+              The refractivity model is from Rueger (2002).
+        \item The optical refractivity for dry air is from IAG (1999).
+       \end{itemize}
+  \item The radio refraction is chosen by specifying WL $>100$~$\mu{\rm m}$.
+        Because the algorithm takes no account of the ionosphere, the
+        accuracy deteriorates at low frequencies, below about 30\,MHz.
+  \item Before use, the value of ZOBS is expressed in the range $\pm\pi$.
+        If this ranged ZOBS is negative, the result REF is computed from its
+        absolute value before being made negative to match.  In addition, if
+        it has an absolute value greater than $93^\circ$, a fixed REF value
+        equal to the result for ZOBS~$=93^\circ$ is returned, appropriately
+        signed.
+  \item As in the original Hohenkerk \& Sinclair algorithm, fixed values
+        of the water vapour polytrope exponent, the height of the
+        tropopause, and the height at which refraction is negligible are
+        used.
+  \item The radio refraction has been tested against work done by
+        Iain~Coulson, JACH, (private communication 1995) for the
+        James Clerk Maxwell Telescope, Mauna Kea.  For typical conditions,
+        agreement at the \arcsec{0}{1} level is achieved for moderate ZD,
+        worsening to perhaps \arcsec{0}{5}\,--\,\arcsec{1}{0} at ZD $80^\circ$.
+        At hot and humid sea-level sites the accuracy will not be as good.
+  \item It should be noted that the relative humidity RH is formally
+        defined in terms of ``mixing ratio'' rather than pressures or
+        densities as is often stated.  It is the mass of water per unit
+        mass of dry air divided by that for saturated air at the same
+        temperature and pressure (see Gill 1982).  The familiar
+        $\nu=p_w/p_s$ or $\nu=\rho_w/\rho_s$ expressions can differ from
+        the formal definition by several percent, significant in the
+        radio case.
+  \item The algorithm is designed for observers in the troposphere.  The
+        supplied temperature, pressure and lapse rate are assumed to be
+        for a point in the troposphere and are used to define a model
+        atmosphere with the tropopause at 11km altitude and a constant
+        temperature above that.  However, in practice, the refraction
+        values returned for stratospheric observers, at altitudes up to
+        25km, are quite usable.
+  \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Coulsen, I.\ 1995, private communication.
+  \item Crane, R.K., Meeks, M.L.\ (ed), 1976,
+        ``Refraction Effects in the Neutral Atmosphere'',
+        {\it Methods of Experimental Physics: Astrophysics 12B},
+        Academic Press.
+  \item Gill, Adrian E.\ 1982, {\it Atmosphere-Ocean Dynamics},
+        Academic Press.
+  \item Hohenkerk, C.Y.\ 1985, private communication.
+  \item Hohenkerk, C.Y., \& Sinclair, A.T.\ 1985,
+        {\it NAO Technical Note}\/
+        No.~63, Royal Greenwich Observatory.
+  \item International Association of Geodesy,
+        XXIIth General Assembly, Birmingham, UK, 1999,
+        Resolution 3.
+  \item Murray, C.A.\ 1983, {\it Vectorial Astrometry,}
+        Adam Hilger, Bristol.
+  \item Seidelmann,\,P.K.\ {\it et al.}\ 1992,
+        {\it Explanatory Supplement to the
+        Astronomical Almanac}, Chapter 3, University Science Books.
+  \item Rueger, J.M.\ 2002, {\it Refractive Index Formulae for
+        Electronic Distance Measurement with Radio and Millimetre
+        Waves}, in Unisurv Report S-68, School of Surveying
+        and Spatial Information Systems, University of New South
+        Wales, Sydney, Australia.
+  \item Sinclair, A.T.\ 1989, private communication.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_REFV}{Apply Refraction to Vector}
+{
+ \action{Adjust an unrefracted Cartesian vector to include the effect of
+         atmospheric refraction, using the simple
+         $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$ model.}
+ \call{CALL sla\_REFV (VU, REFA, REFB, VR)}
+}
+\args{GIVEN}
+{
+ \spec{VU}{D}{unrefracted position of the source (\azel\ 3-vector)} \\
+ \spec{REFA}{D}{$\tan \zeta$ coefficient (radians)} \\
+ \spec{REFB}{D}{$\tan^{3} \zeta$ coefficient (radians)}
+}
+\args{RETURNED}
+{
+ \spec{VR}{D}{refracted position of the source (\azel\ 3-vector)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine applies the adjustment for refraction in the
+        opposite sense to the usual one -- it takes an unrefracted
+        ({\it in vacuo}\/) position and produces an observed (refracted)
+        position, whereas the
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$
+        model strictly
+        applies to the case where an observed position is to have the
+        refraction removed.  The unrefracted to refracted case is
+        harder, and requires an inverted form of the text-book
+        refraction models;  the algorithm used here is equivalent to
+        one iteration of the Newton-Raphson method applied to the
+        above formula.
+  \item Though optimized for speed rather than precision, the present
+        routine achieves consistency with the refracted-to-unrefracted
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$
+        model at better than 1~microarcsecond within
+        $30^\circ$ of the zenith and remains within 1~milliarcsecond to
+        $\zeta=70^\circ$.  The inherent accuracy of the model is, of
+        course, far worse than this -- see the documentation for sla\_REFCO
+        for more information.
+  \item At low elevations (below about $3^\circ$) the refraction
+        correction is held back to prevent arithmetic problems and
+        wildly wrong results.  For optical/IR wavelengths, over a wide
+        range of observer heights and corresponding temperatures and
+        pressures, the following levels of accuracy (worst case)
+        are achieved, relative to numerical integration through a model
+        atmosphere:
+        \begin{center}
+        \begin{tabular}{ccl}
+              $\zeta_{obs}$ & {\it error} \\ \\
+              $80^\circ$ & \arcsec{0}{7}  \\
+              $81^\circ$ & \arcsec{1}{3}  \\
+              $82^\circ$ & \arcsec{2}{5}  \\
+              $83^\circ$ & \arcseci{5}    \\
+              $84^\circ$ & \arcseci{10}    \\
+              $85^\circ$ & \arcseci{20}   \\
+              $86^\circ$ & \arcseci{55}   \\
+              $87^\circ$ & \arcseci{160}  \\
+              $88^\circ$ & \arcseci{360}  \\
+              $89^\circ$ & \arcseci{640}  \\
+              $90^\circ$ & \arcseci{1100} \\
+              $91^\circ$ & \arcseci{1700} & $<$ high-altitude \\
+              $92^\circ$ & \arcseci{2600} & $<$ sites only \\
+        \end{tabular}
+        \end{center}
+        The results for radio are slightly worse over most of the range,
+        becoming significantly worse below $\zeta = 88^\circ$
+        and unusable beyond $\zeta = 90^\circ$.
+  \item See also the routine sla\_REFZ, which performs the adjustment to
+        the zenith distance rather than in \xyz.
+        The present routine is faster than sla\_REFZ and,
+        except very low down,
+        is equally accurate for all practical purposes.  However, beyond
+        about $\zeta=84^\circ$ sla\_REFZ should be used, and for the utmost
+        accuracy iterative use of sla\_REFRO should be considered.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_REFZ}{Apply Refraction to ZD}
+{
+ \action{Adjust an unrefracted zenith distance to include the effect of
+         atmospheric refraction, using the simple
+         $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$ model.}
+ \call{CALL sla\_REFZ (ZU, REFA, REFB, ZR)}
+}
+\args{GIVEN}
+{
+ \spec{ZU}{D}{unrefracted zenith distance of the source (radians)} \\
+ \spec{REFA}{D}{$\tan \zeta$ coefficient (radians)} \\
+ \spec{REFB}{D}{$\tan^{3} \zeta$ coefficient (radians)}
+}
+\args{RETURNED}
+{
+ \spec{ZR}{D}{refracted zenith distance (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item This routine applies the adjustment for refraction in the
+        opposite sense to the usual one -- it takes an unrefracted
+        ({\it in vacuo}\/) position and produces an observed (refracted)
+        position, whereas the
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$
+        model strictly
+        applies to the case where an observed position is to have the
+        refraction removed.  The unrefracted to refracted case is
+        harder, and requires an inverted form of the text-book
+        refraction models;  the formula used here is based on the
+        Newton-Raphson method.  For the utmost numerical consistency
+        with the refracted to unrefracted model, two iterations are
+        carried out, achieving agreement at the $10^{-11}$~arcsecond level
+        for $\zeta=80^\circ$.  The inherent accuracy of the model
+        is, of course, far worse than this -- see the documentation for
+        sla\_REFCO for more information.
+  \item At $\zeta=83^\circ$, the rapidly-worsening
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$
+        model is abandoned and an empirical formula takes over:
+
+          \[\Delta \zeta = F \left(
+  \frac{0^\circ\hspace{-0.37em}.\hspace{0.02em}55445
+                - 0^\circ\hspace{-0.37em}.\hspace{0.02em}01133 E
+                          + 0^\circ\hspace{-0.37em}.\hspace{0.02em}00202 E^2}
+             {1 + 0.28385 E +0.02390 E^2} \right) \]
+        where $E=90^\circ-\zeta_{true}$
+        and $F$ is a factor chosen to meet the
+        $\Delta \zeta = a \tan \zeta + b \tan^{3} \zeta$
+        formula at $\zeta=83^\circ$.
+
+        For optical/IR wavelengths, over a wide range of observer heights
+        and corresponding temperatures and pressures, the following levels
+        of accuracy (worst case) are achieved,
+        relative to numerical integration through a model atmosphere:
+
+        \begin{center}
+        \begin{tabular}{ccl}
+              $\zeta_{obs}$ & {\it error} \\ \\
+              $80^\circ$ & \arcsec{0}{7}  \\
+              $81^\circ$ & \arcsec{1}{3}  \\
+              $82^\circ$ & \arcsec{2}{4}  \\
+              $83^\circ$ & \arcsec{4}{7}  \\
+              $84^\circ$ & \arcsec{6}{2}  \\
+              $85^\circ$ & \arcsec{6}{4}  \\
+              $86^\circ$ & \arcseci{8}    \\
+              $87^\circ$ & \arcseci{10}   \\
+              $88^\circ$ & \arcseci{15}   \\
+              $89^\circ$ & \arcseci{30}   \\
+              $90^\circ$ & \arcseci{60}   \\
+              $91^\circ$ & \arcseci{150} & $<$ high-altitude \\
+              $92^\circ$ & \arcseci{400} & $<$ sites only \\
+        \end{tabular}
+        \end{center}
+        For radio wavelengths the errors are typically 50\% larger than
+        the optical figures and by $\zeta = 85^\circ$ are twice as bad,
+        worsening rapidly below that.  To maintain \arcseci{1} accuracy
+        down to $\zeta = 85^\circ$ at the Green Bank site, Condon (2004)
+        has suggested amplifying the amount of refraction predicted by
+        sla\_REFZ below \degree{10}{8} elevation by the factor
+        $(1+0.00195*(10.8-E_{topo}))$, where $E_{topo}$ is the
+        unrefracted elevation in degrees.
+
+        The high-ZD model is scaled to match the normal model at the
+        transition point;  there is no glitch.
+  \item See also the routine sla\_REFV, which performs the adjustment in
+        \xyz , and with the emphasis on speed rather than numerical accuracy.
+ \end{enumerate}
+}
+\aref{Condon,\,J.J., {\it Refraction Corrections for the GBT,} PTCS/PN/35.2,
+      NRAO Green Bank, 2004.}
+%-----------------------------------------------------------------------
+\routine{SLA\_RVEROT}{RV Corrn to Earth Centre}
+{
+ \action{Velocity component in a given direction due to Earth rotation.}
+ \call{R~=~sla\_RVEROT (PHI, RA, DA, ST)}
+}
+\args{GIVEN}
+{
+ \spec{PHI}{R}{geodetic latitude of observing station (radians)} \\
+ \spec{RA,DA}{R}{apparent \radec\ (radians)} \\
+ \spec{ST}{R}{local apparent sidereal time (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RVEROT}{R}{Component of Earth rotation in
+                       direction [RA,DA]~(km~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Sign convention: the result is positive when the observatory
+        is receding from the given point on the sky.
+  \item Accuracy: the simple algorithm used assumes a spherical Earth and
+        an observing station at sea level;  for actual observing
+        sites, the error is unlikely to be greater than 0.0005~km~s$^{-1}$.
+        For applications requiring greater accuracy, use the routine
+        sla\_PVOBS.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_RVGALC}{RV Corrn to Galactic Centre}
+{
+ \action{Velocity component in a given direction due to the rotation
+         of the Galaxy.}
+ \call{R~=~sla\_RVGALC (R2000, D2000)}
+}
+\args{GIVEN}
+{
+ \spec{R2000,D2000}{R}{J2000.0 mean \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RVGALC}{R}{Component of dynamical LSR motion in direction
+                       R2000,D2000 (km~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Sign convention: the result is positive when the LSR
+        is receding from the given point on the sky.
+  \item The Local Standard of Rest used here is a point in the
+        vicinity of the Sun which is in a circular orbit around
+        the Galactic centre.  Sometimes called the {\it dynamical}\/ LSR,
+        it is not to be confused with a {\it kinematical}\/ LSR, which
+        is the mean standard of rest of star catalogues or stellar
+        populations.
+  \item The dynamical LSR velocity due to Galactic rotation is assumed to
+        be 220~km~s$^{-1}$ towards $l^{I\!I}=90^{\circ}$,
+                                   $b^{I\!I}=0$.
+ \end{enumerate}
+}
+\aref{Kerr \& Lynden-Bell (1986), MNRAS, 221, p1023.}
+%-----------------------------------------------------------------------
+\routine{SLA\_RVLG}{RV Corrn to Local Group}
+{
+ \action{Velocity component in a given direction due to the combination
+         of the rotation of the Galaxy and the motion of the Galaxy
+         relative to the mean motion of the local group.}
+ \call{R~=~sla\_RVLG (R2000, D2000)}
+}
+\args{GIVEN}
+{
+ \spec{R2000,D2000}{R}{J2000.0 mean \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RVLG}{R}{Component of {\bf solar} ({\it n.b.})
+                     motion in direction R2000,D2000 (km~s$^{-1}$)}
+}
+\anote{Sign convention: the result is positive when
+       the Sun is receding from the given point on the sky.}
+\aref{{\it IAU Trans.}\ 1976.\ {\bf 16B}, p201.}
+%-----------------------------------------------------------------------
+\routine{SLA\_RVLSRD}{RV Corrn to Dynamical LSR}
+{
+ \action{Velocity component in a given direction due to the Sun's
+         motion with respect to the ``dynamical'' Local Standard of Rest.}
+ \call{R~=~sla\_RVLSRD (R2000, D2000)}
+}
+\args{GIVEN}
+{
+ \spec{R2000,D2000}{R}{J2000.0 mean \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RVLSRD}{R}{Component of {\it peculiar}\/ solar motion
+                      in direction R2000,D2000 (km~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Sign convention: the result is positive when
+        the Sun is receding from the given point on the sky.
+  \item The Local Standard of Rest used here is the {\it dynamical}\/ LSR,
+        a point in the vicinity of the Sun which is in a circular
+        orbit around the Galactic centre.  The Sun's motion with
+        respect to the dynamical LSR is called the {\it peculiar}\/ solar
+        motion.
+  \item There is another type of LSR, called a {\it kinematical}\/ LSR.  A
+        kinematical LSR is the mean standard of rest of specified star
+        catalogues or stellar populations, and several slightly
+        different kinematical LSRs are in use.  The Sun's motion with
+        respect to an agreed kinematical LSR is known as the
+        {\it standard}\/ solar motion.
+        The dynamical LSR is seldom used by observational astronomers,
+        who conventionally use a kinematical LSR such as the one implemented
+        in the routine sla\_RVLSRK.
+  \item The peculiar solar motion is from Delhaye (1965), in {\it Stars
+        and Stellar Systems}, vol~5, p73:  in Galactic Cartesian
+        coordinates (+9,+12,+7)~km~s$^{-1}$.
+        This corresponds to about 16.6~km~s$^{-1}$
+        towards Galactic coordinates $l^{I\!I}=53^{\circ},b^{I\!I}=+25^{\circ}$.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_RVLSRK}{RV Corrn to Kinematical LSR}
+{
+ \action{Velocity component in a given direction due to the Sun's
+         motion with respect to a kinematical Local Standard of Rest.}
+ \call{R~=~sla\_RVLSRK (R2000, D2000)}
+}
+\args{GIVEN}
+{
+ \spec{R2000,D2000}{R}{J2000.0 mean \radec\ (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_RVLSRK}{R}{Component of {\it standard}\/ solar motion
+                      in direction R2000,D2000 (km~s$^{-1}$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item Sign convention: the result is positive when
+        the Sun is receding from the given point on the sky.
+  \item The Local Standard of Rest used here is one of several
+        {\it kinematical}\/ LSRs in common use.  A kinematical LSR is the
+        mean standard of rest of specified star catalogues or stellar
+        populations.  The Sun's motion with respect to a kinematical
+        LSR is known as the {\it standard}\/ solar motion.
+  \item There is another sort of LSR, seldom used by observational
+        astronomers, called the {\it dynamical}\/ LSR.  This is a
+        point in the vicinity of the Sun which is in a circular orbit
+        around the Galactic centre.  The Sun's motion with respect to
+        the dynamical LSR is called the {\it peculiar}\/ solar motion.  To
+        obtain a radial velocity correction with respect to the
+        dynamical LSR use the routine sla\_RVLSRD.
+  \item The adopted standard solar motion is 20~km~s$^{-1}$
+        towards $\alpha=18^{\rm h},\delta=+30^{\circ}$ (1900).
+ \end{enumerate}
+}
+\refs
+{
+ \begin{enumerate}
+  \item Delhaye (1965), in {\it Stars and Stellar Systems}, vol~5, p73.
+  \item {\it Methods of Experimental Physics}\/ (ed Meeks), vol~12,
+        part~C, sec~6.1.5.2, p281.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_S2TP}{Spherical to Tangent Plane}
+{
+ \action{Projection of spherical coordinates onto the tangent plane
+         (single precision).}
+ \call{CALL sla\_S2TP (RA, DEC, RAZ, DECZ, XI, ETA, J)}
+}
+\args{GIVEN}
+{
+ \spec{RA,DEC}{R}{spherical coordinates of star (radians)} \\
+ \spec{RAZ,DECZ}{R}{spherical coordinates of tangent point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{XI,ETA}{R}{tangent plane coordinates (radians)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK, star on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 1 = error, star too far from axis} \\
+ \spec{}{}{\hspace{1.5em} 2 = error, antistar on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 3 = error, antistar too far from axis}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_V2TP is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_SEP}{Angle Between 2 Points on Sphere}
+{
+ \action{Angle between two points on a sphere (single precision).}
+ \call{R~=~sla\_SEP (A1, B1, A2, B2)}
+}
+\args{GIVEN}
+{
+ \spec{A1,B1}{R}{spherical coordinates of one point (radians)} \\
+ \spec{A2,B2}{R}{spherical coordinates of the other point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{sla\_SEP}{R}{angle between [A1,B1] and [A2,B2] in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The spherical coordinates are right ascension and declination,
+  longitude and latitude, {\it etc.}\ in radians.
+  \item The result is always positive.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_SEPV}{Angle Between 2 Vectors}
+{
+ \action{Angle between two vectors (single precision).}
+ \call{R~=~sla\_SEPV (V1, V2)}
+}
+\args{GIVEN}
+{
+ \spec{V1}{R(3)}{first vector} \\
+ \spec{V2}{R(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{sla\_SEPV}{R}{angle between V1 and V2 in radians}
+}
+\notes
+{
+ \begin{enumerate}
+  \item There is no requirement for either vector to be of unit length.
+  \item If either vector is null, zero is returned.
+  \item The result is always positive.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_SMAT}{Solve Simultaneous Equations}
+{
+ \action{Matrix inversion and solution of simultaneous equations
+         (single precision).}
+ \call{CALL sla\_SMAT (N, A, Y, D, JF, IW)}
+}
+\args{GIVEN}
+{
+ \spec{N}{I}{number of unknowns} \\
+ \spec{A}{R(N,N)}{matrix} \\
+ \spec{Y}{R(N)}{vector}
+}
+\args{RETURNED}
+{
+ \spec{A}{R(N,N)}{matrix inverse} \\
+ \spec{Y}{R(N)}{solution} \\
+ \spec{D}{R}{determinant} \\
+ \spec{JF}{I}{singularity flag: 0=OK} \\
+ \spec{IW}{I(N)}{workspace}
+}
+\notes
+{
+ \begin{enumerate}
+  \item For the set of $n$ simultaneous linear equations in $n$ unknowns:
+        \begin{verse}
+         {\bf A}$\cdot${\bf y} = {\bf x}
+        \end{verse}
+        where:
+        \begin{itemize}
+         \item {\bf A} is a non-singular $n \times n$ matrix,
+         \item {\bf y} is the vector of $n$ unknowns, and
+         \item {\bf x} is the known vector,
+        \end{itemize}
+        sla\_SMAT computes:
+        \begin{itemize}
+         \item the inverse of matrix {\bf A},
+         \item the determinant of matrix {\bf A}, and
+         \item the vector of $n$ unknowns {\bf y}.
+        \end{itemize}
+        Argument N is the order $n$, A (given) is the matrix {\bf A},
+        Y (given) is the vector {\bf x} and Y (returned)
+        is the vector {\bf y}.
+        The argument A (returned) is the inverse matrix {\bf A}$^{-1}$,
+        and D is {\it det}\/({\bf A}).
+  \item JF is the singularity flag.  If the matrix is non-singular,
+        JF=0 is returned.  If the matrix is singular, JF=$-$1
+        and D=0.0 are returned.  In the latter case, the contents
+        of array A on return are undefined.
+  \item The algorithm is Gaussian elimination with partial pivoting.
+        This method is very fast;  some much slower algorithms can give
+        better accuracy, but only by a small factor.
+  \item This routine replaces the obsolete sla\_SMATRX.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_SUBET}{Remove E-terms}
+{
+ \action{Remove the E-terms (elliptic component of annual aberration)
+         from a pre IAU~1976 catalogue \radec\ to give a mean place.}
+ \call{CALL sla\_SUBET (RC, DC, EQ, RM, DM)}
+}
+\args{GIVEN}
+{
+ \spec{RC,DC}{D}{\radec\ with E-terms included (radians)} \\
+ \spec{EQ}{D}{Besselian epoch of mean equator and equinox}
+}
+\args{RETURNED}
+{
+ \spec{RM,DM}{D}{\radec\ without E-terms (radians)}
+}
+\anote{Most star positions from pre-1984 optical catalogues (or
+       obtained by astrometry with respect to such stars) have the
+       E-terms built-in.  This routine converts such a position to a
+       formal mean place (allowing, for example, comparison with a
+       pulsar timing position).}
+\aref{{\it Explanatory Supplement to the Astronomical Ephemeris},
+      section 2D, page 48.}
+%-----------------------------------------------------------------------
+\routine{SLA\_SUPGAL}{Supergalactic to Galactic}
+{
+ \action{Transformation from de Vaucouleurs supergalactic coordinates
+         to IAU 1958 galactic coordinates.}
+ \call{CALL sla\_SUPGAL (DSL, DSB, DL, DB)}
+}
+\args{GIVEN}
+{
+ \spec{DSL,DSB}{D}{supergalactic longitude and latitude (radians)}
+}
+\args{RETURNED}
+{
+ \spec{DL,DB}{D}{galactic longitude and latitude \gal\ (radians)}
+}
+\refs
+{
+ \begin{enumerate}
+  \item de Vaucouleurs, de Vaucouleurs, \& Corwin, {\it Second Reference
+    Catalogue of Bright Galaxies}, U.Texas, p8.
+  \item Systems \& Applied Sciences Corp., documentation for the
+        machine-readable version of the above catalogue,
+        Contract NAS 5-26490.
+ \end{enumerate}
+ (These two references give different values for the galactic
+ longitude of the supergalactic origin.  Both are wrong;  the
+ correct value is $l^{I\!I}=137.37$.)
+}
+%------------------------------------------------------------------------------
+\routine{SLA\_SVD}{Singular Value Decomposition}
+{
+ \action{Singular value decomposition.
+         This routine expresses a given matrix {\bf A} as the product of
+         three matrices {\bf U}, {\bf W}, {\bf V}$^{T}$:
+
+         \begin{tabular}{ll}
+         & {\bf A} = {\bf U} $\cdot$ {\bf W} $\cdot$ {\bf V}$^{T}$
+         \end{tabular}
+
+         where:
+
+         \begin{tabular}{lll}
+         & {\bf A} & is any $m$ (rows) $\times n$ (columns) matrix,
+                       where $m \geq n$ \\
+         & {\bf U} & is an $m \times n$ column-orthogonal matrix \\
+         & {\bf W} & is an $n \times n$ diagonal matrix with
+                       $w_{ii} \geq 0$ \\
+         & {\bf V}$^{T}$ & is the transpose of an $n \times n$
+                             orthogonal matrix
+         \end{tabular}
+}
+ \call{CALL sla\_SVD (M, N, MP, NP, A, W, V, WORK, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{M,N}{I}{$m$, $n$, the numbers of rows and columns in matrix {\bf A}} \\
+ \spec{MP,NP}{I}{physical dimensions of array containing matrix {\bf A}} \\
+ \spec{A}{D(MP,NP)}{array containing $m \times n$ matrix {\bf A}}
+}
+\args{RETURNED}
+{
+ \spec{A}{D(MP,NP)}{array containing $m \times n$ column-orthogonal
+                    matrix {\bf U}} \\
+ \spec{W}{D(N)}{$n \times n$ diagonal matrix {\bf W}
+               (diagonal elements only)} \\
+ \spec{V}{D(NP,NP)}{array containing $n \times n$ orthogonal
+                    matrix {\bf V} ({\it n.b.}\ not {\bf V}$^{T}$)} \\
+ \spec{WORK}{D(N)}{workspace} \\
+ \spec{JSTAT}{I}{0~=~OK, $-$1~=~array A wrong shape, $>$0~=~index of W
+                 for which convergence failed (see note~3, below)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item M and N are the {\it logical}\/ dimensions of the
+        matrices and vectors concerned, which can be located in
+        arrays of larger {\it physical}\/ dimensions, given by MP and NP.
+  \item V contains matrix V, not the transpose of matrix V.
+  \item If the status JSTAT is greater than zero, this need not
+        necessarily be treated as a failure.  It means that, due to
+        chance properties of the matrix A, the QR transformation
+        phase of the routine did not fully converge in a predefined
+        number of iterations, something that very seldom occurs.
+        When this condition does arise, it is possible that the
+        elements of the diagonal matrix W have not been correctly
+        found.  However, in practice the results are likely to
+        be trustworthy.  Applications should report the condition
+        as a warning, but then proceed normally.
+ \end{enumerate}
+}
+\refs{The algorithm is an adaptation of the routine SVD in the {\it EISPACK}\,
+      library (Garbow~{\it et~al.}\ 1977, {\it EISPACK Guide Extension},
+      Springer Verlag), which is a FORTRAN~66 implementation of the Algol
+      routine SVD of Wilkinson \& Reinsch 1971 ({\it Handbook for Automatic
+      Computation}, vol~2, ed Bauer~{\it et~al.}, Springer Verlag).  These
+      references give full details of the algorithm used here.
+      A good account of the use of SVD in least squares problems is given
+      in {\it Numerical Recipes}\/ (Press~{\it et~al.}\ 1987, Cambridge
+      University Press), which includes another variant of the EISPACK code.}
+%-----------------------------------------------------------------------
+\routine{SLA\_SVDCOV}{Covariance Matrix from SVD}
+{
+ \action{From the {\bf W} and {\bf V} matrices from the SVD
+         factorization of a matrix
+         (as obtained from the sla\_SVD routine), obtain
+         the covariance matrix.}
+ \call{CALL sla\_SVDCOV (N, NP, NC, W, V, WORK, CVM)}
+}
+\args{GIVEN}
+{
+ \spec{N}{I}{$n$, the number of rows and columns in
+             matrices {\bf W} and {\bf V}} \\
+ \spec{NP}{I}{first dimension of array containing $n \times n$
+              matrix {\bf V}} \\
+ \spec{NC}{I}{first dimension of array CVM} \\
+ \spec{W}{D(N)}{$n \times n$ diagonal matrix {\bf W}
+                (diagonal elements only)} \\
+ \spec{V}{D(NP,NP)}{array containing $n \times n$ orthogonal matrix {\bf V}}
+}
+\args{RETURNED}
+{
+ \spec{WORK}{D(N)}{workspace} \\
+ \spec{CVM}{D(NC,NC)}{array to receive covariance matrix}
+}
+\aref{{\it Numerical Recipes}, section 14.3.}
+%-----------------------------------------------------------------------
+\routine{SLA\_SVDSOL}{Solution Vector from SVD}
+{
+ \action{From a given vector and the SVD of a matrix (as obtained from
+         the sla\_SVD routine), obtain the solution vector.
+         This routine solves the equation:
+
+         \begin{tabular}{ll}
+         & {\bf A} $\cdot$ {\bf x} = {\bf b}
+         \end{tabular}
+
+         where:
+
+         \begin{tabular}{lll}
+         & {\bf A} & is a given $m$ (rows) $\times n$ (columns)
+                       matrix, where $m \geq n$ \\
+         & {\bf x} & is the $n$-vector we wish to find, and \\
+         & {\bf b} & is a given $m$-vector
+         \end{tabular}
+
+         by means of the {\it Singular Value Decomposition}\/ method (SVD).}
+ \call{CALL sla\_SVDSOL (M, N, MP, NP, B, U, W, V, WORK, X)}
+}
+\args{GIVEN}
+{
+ \spec{M,N}{I}{$m$, $n$, the numbers of rows and columns in matrix {\bf A}} \\
+ \spec{MP,NP}{I}{physical dimensions of array containing matrix {\bf A}} \\
+ \spec{B}{D(M)}{known vector {\bf b}} \\
+ \spec{U}{D(MP,NP)}{array containing $m \times n$ matrix {\bf U}} \\
+ \spec{W}{D(N)}{$n \times n$ diagonal matrix {\bf W}
+                (diagonal elements only)} \\
+ \spec{V}{D(NP,NP)}{array containing $n \times n$ orthogonal matrix {\bf V}}
+}
+\args{RETURNED}
+{
+ \spec{WORK}{D(N)}{workspace} \\
+ \spec{X}{D(N)}{unknown vector {\bf x}}
+}
+\notes
+{
+ \begin{enumerate}
+  \item In the Singular Value Decomposition method (SVD),
+        the matrix {\bf A} is first factorized (for example by
+        the routine sla\_SVD) into the following components:
+
+        \begin{tabular}{ll}
+        & {\bf A} = {\bf U} $\cdot$ {\bf W} $\cdot$ {\bf V}$^{T}$
+        \end{tabular}
+
+        where:
+
+        \begin{tabular}{lll}
+        & {\bf A} & is any $m$ (rows) $\times n$ (columns) matrix,
+                      where $m > n$ \\
+        & {\bf U} & is an $m \times n$ column-orthogonal matrix \\
+        & {\bf W} & is an $n \times n$ diagonal matrix with
+                      $w_{ii} \geq 0$ \\
+        & {\bf V}$^{T}$ & is the transpose of an $n \times n$
+                            orthogonal matrix
+        \end{tabular}
+
+        Note that $m$ and $n$ are the {\it logical}\/ dimensions of the
+        matrices and vectors concerned, which can be located in
+        arrays of larger {\it physical}\/ dimensions MP and NP.
+        The solution is then found from the expression:
+
+        \begin{tabular}{ll}
+        & {\bf x} = {\bf V} $\cdot~[diag(1/${\bf W}$_{j})]
+           \cdot (${\bf U}$^{T} \cdot${\bf b})
+        \end{tabular}
+
+  \item If matrix {\bf A} is square, and if the diagonal matrix {\bf W} is not
+        altered, the method is equivalent to conventional solution
+        of simultaneous equations.
+  \item If $m > n$, the result is a least-squares fit.
+  \item If the solution is poorly determined, this shows up in the
+        SVD factorization as very small or zero {\bf W}$_{j}$ values.  Where
+        a {\bf W}$_{j}$ value is small but non-zero it can be set to zero to
+        avoid ill effects.  The present routine detects such zero
+        {\bf W}$_{j}$ values and produces a sensible solution, with highly
+        correlated terms kept under control rather than being allowed
+        to elope to infinity, and with meaningful values for the
+       other terms.
+ \end{enumerate}
+}
+\aref{{\it Numerical Recipes}, section 2.9.}
+%-----------------------------------------------------------------------
+\routine{SLA\_TP2S}{Tangent Plane to Spherical}
+{
+ \action{Transform tangent plane coordinates into spherical
+         coordinates (single precision)}
+ \call{CALL sla\_TP2S (XI, ETA, RAZ, DECZ, RA, DEC)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{R}{tangent plane rectangular coordinates (radians)} \\
+ \spec{RAZ,DECZ}{R}{spherical coordinates of tangent point (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RA,DEC}{R}{spherical coordinates (radians)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_TP2V is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_TP2V}{Tangent Plane to Direction Cosines}
+{
+ \action{Given the tangent-plane coordinates of a star and the direction
+         cosines of the tangent point, determine the direction cosines
+         of the star
+         (single precision).}
+ \call{CALL sla\_TP2V (XI, ETA, V0, V)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{R}{tangent plane coordinates of star (radians)} \\
+ \spec{V0}{R(3)}{direction cosines of tangent point}
+}
+\args{RETURNED}
+{
+ \spec{V}{R(3)}{direction cosines of star}
+}
+\notes
+{
+ \begin{enumerate}
+  \item If vector V0 is not of unit length, the returned vector V will
+        be wrong.
+  \item If vector V0 points at a pole, the returned vector V will be
+        based on the arbitrary assumption that $\alpha=0$ at
+        the tangent point.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_TP2S.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_TPS2C}{Plate centre from $\xi,\eta$ and $\alpha,\delta$}
+{
+ \action{From the tangent plane coordinates of a star of known \radec,
+        determine the \radec\ of the tangent point (single precision)}
+ \call{CALL sla\_TPS2C (XI, ETA, RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2, N)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{R}{tangent plane rectangular coordinates (radians)} \\
+ \spec{RA,DEC}{R}{spherical coordinates (radians)}
+}
+\args{RETURNED}
+{
+ \spec{RAZ1,DECZ1}{R}{spherical coordinates of tangent point,
+                      solution 1} \\
+ \spec{RAZ2,DECZ2}{R}{spherical coordinates of tangent point,
+                      solution 2} \\
+ \spec{N}{I}{number of solutions:} \\
+ \spec{}{}{\hspace{1em} 0 = no solutions returned  (note 2)} \\
+ \spec{}{}{\hspace{1em} 1 = only the first solution is useful (note 3)} \\
+ \spec{}{}{\hspace{1em} 2 = there are two useful solutions (note 3)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The RAZ1 and RAZ2 values returned are in the range $0\!-\!2\pi$.
+  \item Cases where there is no solution can only arise near the poles.
+        For example, it is clearly impossible for a star at the pole
+        itself to have a non-zero $\xi$ value, and hence it is
+        meaningless to ask where the tangent point would have to be
+        to bring about this combination of $\xi$ and $\delta$.
+  \item Also near the poles, cases can arise where there are two useful
+        solutions.  The argument N indicates whether the second of the
+        two solutions returned is useful.  N\,=\,1
+        indicates only one useful solution, the usual case;  under
+        these circumstances, the second solution corresponds to the
+        ``over-the-pole'' case, and this is reflected in the values
+        of RAZ2 and DECZ2 which are returned.
+  \item The DECZ1 and DECZ2 values returned are in the range $\pm\pi$,
+        but in the ordinary, non-pole-crossing, case, the range is
+        $\pm\pi/2$.
+  \item RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2 are all in radians.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item When working in \xyz\ rather than spherical coordinates, the
+        equivalent Cartesian routine sla\_TPV2C is available.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_TPV2C}{Plate centre from $\xi,\eta$ and $x,y,z$}
+{
+ \action{From the tangent plane coordinates of a star of known
+         direction cosines, determine the direction cosines
+         of the tangent point (single precision)}
+ \call{CALL sla\_TPV2C (XI, ETA, V, V01, V02, N)}
+}
+\args{GIVEN}
+{
+ \spec{XI,ETA}{R}{tangent plane coordinates of star (radians)} \\
+ \spec{V}{R(3)}{direction cosines of star}
+}
+\args{RETURNED}
+{
+ \spec{V01}{R(3)}{direction cosines of tangent point, solution 1} \\
+ \spec{V01}{R(3)}{direction cosines of tangent point, solution 2} \\
+ \spec{N}{I}{number of solutions:} \\
+ \spec{}{}{\hspace{1em} 0 = no solutions returned  (note 2)} \\
+ \spec{}{}{\hspace{1em} 1 = only the first solution is useful (note 3)} \\
+ \spec{}{}{\hspace{1em} 2 = there are two useful solutions (note 3)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The vector V must be of unit length or the result will be wrong.
+  \item Cases where there is no solution can only arise near the poles.
+        For example, it is clearly impossible for a star at the pole
+        itself to have a non-zero XI value.
+  \item Also near the poles, cases can arise where there are two useful
+        solutions.  The argument N indicates whether the second of the
+        two solutions returned is useful.
+        N\,=\,1
+        indicates only one useful solution, the usual case;  under these
+        circumstances, the second solution can be regarded as valid if
+        the vector V02 is interpreted as the ``over-the-pole'' case.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_TPS2C.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_UE2EL}{Universal to Conventional Elements}
+{
+ \action{Transform universal elements into conventional heliocentric
+         osculating elements.}
+ \call{CALL sla\_UE2EL (\vtop{
+         \hbox{U, JFORMR,}
+         \hbox{JFORM, EPOCH, ORBINC, ANODE, PERIH,}
+         \hbox{AORQ, E, AORL, DM, JSTAT)}}}
+}
+\args{GIVEN}
+{
+ \spec{U}{D(13)}{universal orbital elements (updated; Note~1)} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v}_0$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date, approx} \\ \\
+ \spec{JFORMR}{I}{requested element set (1-3; Note~3)}
+}
+\args{RETURNED}
+{
+ \spec{JFORM}{I}{element set actually returned (1-3; Note~4)} \\
+ \spec{EPOCH}{D}{epoch of elements ($t_0$ or $T$, TT MJD)} \\
+ \spec{ORBINC}{D}{inclination ($i$, radians)} \\
+ \spec{ANODE}{D}{longitude of the ascending node ($\Omega$, radians)} \\
+ \spec{PERIH}{D}{longitude or argument of perihelion
+                            ($\varpi$ or $\omega$,} \\
+ \spec{}{}{\hspace{1.5em} radians)} \\
+ \spec{AORQ}{D}{mean distance or perihelion distance ($a$ or $q$, AU)} \\
+ \spec{E}{D}{eccentricity ($e$)} \\
+ \spec{AORL}{D}{mean anomaly or longitude
+                               ($M$ or $L$, radians,} \\
+ \spec{}{}{\hspace{1.5em} JFORM=1,2 only)} \\
+ \spec{DM}{D}{daily motion ($n$, radians, JFORM=1 only)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{2.3em}    0 = OK} \\
+ \spec{}{}{\hspace{1.5em} $-$1 = illegal PMASS} \\
+ \spec{}{}{\hspace{1.5em} $-$2 = illegal JFORMR} \\
+ \spec{}{}{\hspace{1.5em} $-$3 = position/velocity out of allowed range}
+}
+\notes
+{
+ \begin{enumerate}
+  \setlength{\parskip}{\medskipamount}
+  \item The ``universal'' elements are those which define the orbit for the
+        purposes of the method of universal variables (see reference 2).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+  \item The universal elements are with respect to the mean equator and
+        equinox of epoch J2000.  The orbital elements produced are with
+        respect to the J2000 ecliptic and mean equinox.
+  \item Three different element-format options are supported, as
+        follows. \\
+
+        JFORM=1, suitable for the major planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & longitude of perihelion $\varpi$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean longitude $L$ (radians) \\
+        & DM     & = & daily motion $n$ (radians)
+        \end{tabular}
+
+        JFORM=2, suitable for minor planets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of elements $t_0$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & mean distance $a$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e < 1 )$ \\
+        & AORL   & = & mean anomaly $M$ (radians)
+        \end{tabular}
+
+        JFORM=3, suitable for comets:
+
+        \begin{tabular}{llll}
+        & EPOCH  & = & epoch of perihelion $T$ (TT MJD) \\
+        & ORBINC & = & inclination $i$ (radians) \\
+        & ANODE  & = & longitude of the ascending node $\Omega$ (radians) \\
+        & PERIH  & = & argument of perihelion $\omega$ (radians) \\
+        & AORQ   & = & perihelion distance $q$ (AU) \\
+        & E      & = & eccentricity $e$ $( 0 \leq e \leq 10 )$
+        \end{tabular}
+
+  \item It may not be possible to generate elements in the form
+        requested through JFORMR.  The caller is notified of the form
+        of elements actually returned by means of the JFORM argument:
+
+        \begin{tabular}{llll}
+        & JFORMR   & JFORM   & meaning \\ \\
+        & ~~~~~1   & ~~~~~1  & OK: elements are in the requested format \\
+        & ~~~~~1   & ~~~~~2  & never happens \\
+        & ~~~~~1   & ~~~~~3  & orbit not elliptical \\
+        & ~~~~~2   & ~~~~~1  & never happens \\
+        & ~~~~~2   & ~~~~~2  & OK: elements are in the requested format \\
+        & ~~~~~2   & ~~~~~3  & orbit not elliptical \\
+        & ~~~~~3   & ~~~~~1  & never happens \\
+        & ~~~~~3   & ~~~~~2  & never happens \\
+        & ~~~~~3   & ~~~~~3  & OK: elements are in the requested format
+        \end{tabular}
+
+  \item The arguments returned for each value of JFORM ({\it cf.}\/ Note~5:
+        JFORM may not be the same as JFORMR) are as follows:
+
+        \begin{tabular}{lllll}
+        & JFORM  & 1        & 2        & 3 \\ \\
+        & EPOCH  & $t_0$    & $t_0$    & $T$ \\
+        & ORBINC & $i$      & $i$      & $i$ \\
+        & ANODE  & $\Omega$ & $\Omega$ & $\Omega$ \\
+        & PERIH  & $\varpi$ & $\omega$ & $\omega$ \\
+        & AORQ   & $a$      & $a$      & $q$ \\
+        & E      & $e$      & $e$      & $e$ \\
+        & AORL   & $L$      & $M$      & - \\
+        & DM     & $n$      & -        & -
+        \end{tabular}
+
+        where:
+
+        \begin{tabular}{lll}
+        & $t_0$    & is the epoch of the elements (MJD, TT) \\
+        & $T$      & is the epoch of perihelion (MJD, TT) \\
+        & $i$      & is the inclination (radians) \\
+        & $\Omega$ & is the longitude of the ascending node (radians) \\
+        & $\varpi$ & is the longitude of perihelion (radians) \\
+        & $\omega$ & is the argument of perihelion (radians) \\
+        & $a$      & is the mean distance (AU) \\
+        & $q$      & is the perihelion distance (AU) \\
+        & $e$      & is the eccentricity \\
+        & $L$      & is the longitude (radians, $0-2\pi$) \\
+        & $M$      & is the mean anomaly (radians, $0-2\pi$) \\
+        & $n$      & is the daily motion (radians) \\
+        & - & means no value is set
+        \end{tabular}
+
+  \item At very small inclinations, the longitude of the ascending node
+        ANODE becomes indeterminate and under some circumstances may be
+        set arbitrarily to zero.  Similarly, if the orbit is close to
+        circular, the true anomaly becomes indeterminate and under some
+        circumstances may be set arbitrarily to zero.  In such cases,
+        the other elements are automatically adjusted to compensate,
+        and so the elements remain a valid description of the orbit.
+ \end{enumerate}
+}
+\refs{
+   \begin{enumerate}
+   \item Sterne, Theodore E., {\it An Introduction to Celestial Mechanics,}\/
+         Interscience Publishers, 1960.  Section 6.7, p199.
+   \item Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.
+   \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_UE2PV}{Pos/Vel from Universal Elements}
+{
+ \action{Heliocentric position and velocity of a planet, asteroid or comet,
+         starting from orbital elements in the ``universal variables'' form.}
+ \call{CALL sla\_UE2PV (DATE, U, PV, JSTAT)}
+}
+\args{GIVEN}
+{
+ \spec{DATE}{D}{date (TT Modified Julian Date = JD$-$2400000.5)}
+}
+\args{GIVEN and RETURNED}
+{
+ \spec{U}{D(13)}{universal orbital elements (updated; Note~1)} \\
+ \specel {(1)}     {combined mass ($M+m$)} \\
+ \specel {(2)}     {total energy of the orbit ($\alpha$)} \\
+ \specel {(3)}     {reference (osculating) epoch ($t_0$)} \\
+ \specel {(4-6)}   {position at reference epoch (${\rm \bf r}_0$)} \\
+ \specel {(7-9)}   {velocity at reference epoch (${\rm \bf v}_0$)} \\
+ \specel {(10)}    {heliocentric distance at reference epoch} \\
+ \specel {(11)}    {${\rm \bf r}_0.{\rm \bf v}_0$} \\
+ \specel {(12)}    {date ($t$)} \\
+ \specel {(13)}    {universal eccentric anomaly ($\psi$) of date, approx}
+}
+\args{RETURNED}
+{
+ \spec{PV}{D(6)}{heliocentric \xyzxyzd, equatorial, J2000} \\
+ \spec{}{}{\hspace{1.5em} (AU, AU/s; Note~1)} \\
+ \spec{JSTAT}{I}{status:} \\
+ \spec{}{}{\hspace{1.95em}      0 = OK} \\
+ \spec{}{}{\hspace{1.2em}    $-$1 = radius vector zero} \\
+ \spec{}{}{\hspace{1.2em}    $-2$ = failed to converge}
+}
+\notes
+{
+ \begin{enumerate}
+  \setlength{\parskip}{\medskipamount}
+  \item The ``universal'' elements are those which define the orbit for the
+        purposes of the method of universal variables (see reference).
+        They consist of the combined mass of the two bodies, an epoch,
+        and the position and velocity vectors (arbitrary reference frame)
+        at that epoch.  The parameter set used here includes also various
+        quantities that can, in fact, be derived from the other
+        information.  This approach is taken to avoiding unnecessary
+        computation and loss of accuracy.  The supplementary quantities
+        are (i)~$\alpha$, which is proportional to the total energy of the
+        orbit, (ii)~the heliocentric distance at epoch,
+        (iii)~the outwards component of the velocity at the given epoch,
+        (iv)~an estimate of $\psi$, the ``universal eccentric anomaly'' at a
+        given date and (v)~that date.
+  \item The companion routine is sla\_EL2UE.  This takes the conventional
+        orbital elements and transforms them into the set of numbers
+        needed by the present routine.  A single prediction requires one
+        one call to sla\_EL2UE followed by one call to the present routine;
+        for convenience, the two calls are packaged as the routine
+        sla\_PLANEL.  Multiple predictions may be made by again
+        calling sla\_EL2UE once, but then calling the present routine
+        multiple times, which is faster than multiple calls to sla\_PLANEL.
+
+        It is not obligatory to use sla\_EL2UE to obtain the parameters.
+        However, it should be noted that because sla\_EL2UE performs its
+        own validation, no checks on the contents of the array U are made
+        by the present routine.
+  \item DATE is the instant for which the prediction is required.  It is
+        in the TT time scale (formerly Ephemeris Time, ET) and is a
+        Modified Julian Date (JD$-$2400000.5).
+  \item The universal elements supplied in the array U are in canonical
+        units (solar masses, AU and canonical days).  The position and
+        velocity are not sensitive to the choice of reference frame.  The
+        sla\_EL2UE routine in fact produces coordinates with respect to the
+        J2000 equator and equinox.
+  \item The algorithm was originally adapted from the EPHSLA program of
+        D.\,H.\,P.\,Jones (private communication, 1996).  The method
+        is based on Stumpff's Universal Variables.
+ \end{enumerate}
+}
+\aref{Everhart, E. \& Pitkin, E.T., Am.~J.~Phys.~51, 712, 1983.}
+%-----------------------------------------------------------------------
+\routine{SLA\_UNPCD}{Remove Radial Distortion}
+{
+ \action{Remove pincushion/barrel distortion from a distorted
+         \xy\  to give tangent-plane \xy.}
+ \call{CALL sla\_UNPCD (DISCO,X,Y)}
+}
+\args{GIVEN}
+{
+ \spec{DISCO}{D}{pincushion/barrel distortion coefficient} \\
+ \spec{X,Y}{D}{distorted \xy}
+}
+\args{RETURNED}
+{
+ \spec{X,Y}{D}{tangent-plane \xy}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The distortion is of the form $\rho = r (1 + c r^{2})$, where $r$ is
+        the radial distance from the tangent point, $c$ is the DISCO
+        argument, and $\rho$ is the radial distance in the presence of
+        the distortion.
+  \item For {\it pincushion}\/ distortion, C is +ve;  for
+        {\it barrel}\/ distortion, C is $-$ve.
+  \item For X,Y in units of one projection radius (in the case of
+        a photographic plate, the focal length), the following
+        DISCO values apply:
+
+        \vspace{2ex}
+
+        \hspace{5em}
+        \begin{tabular}{|l|c|} \hline
+         Geometry & DISCO \\ \hline \hline
+         astrograph & 0.0 \\ \hline
+         Schmidt & $-$0.3333 \\ \hline
+         AAT PF doublet & +147.069 \\ \hline
+         AAT PF triplet & +178.585 \\ \hline
+         AAT f/8 & +21.20 \\ \hline
+         JKT f/8 & +14.6 \\ \hline
+        \end{tabular}
+
+        \vspace{2ex}
+
+  \item The present routine is a rigorous inverse of the companion
+        routine sla\_PCD.  The expression for $\rho$ in Note~1
+        is rewritten in the form $x^3 + ax + b = 0$ and solved by
+        standard techniques.
+
+  \item Cases where the cubic has multiple real roots can sometimes
+        occur, corresponding to extreme instances of barrel distortion
+        where up to three different undistorted \xy s all produce the
+        same distorted \xy.  However, only one solution is returned,
+        the one that produces the smallest change in \xy.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_V2TP}{Direction Cosines to Tangent Plane}
+{
+ \action{Given the direction cosines of a star and of the tangent point,
+         determine the star's tangent-plane coordinates
+         (single precision).}
+ \call{CALL sla\_V2TP (V, V0, XI, ETA, J)}
+}
+\args{GIVEN}
+{
+ \spec{V}{R(3)}{direction cosines of star} \\
+ \spec{V0}{R(3)}{direction cosines of tangent point}
+}
+\args{RETURNED}
+{
+ \spec{XI,ETA}{R}{tangent plane coordinates (radians)} \\
+ \spec{J}{I}{status:} \\
+ \spec{}{}{\hspace{1.5em} 0 = OK, star on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 1 = error, star too far from axis} \\
+ \spec{}{}{\hspace{1.5em} 2 = error, antistar on tangent plane} \\
+ \spec{}{}{\hspace{1.5em} 3 = error, antistar too far from axis}
+}
+\notes
+{
+ \begin{enumerate}
+  \item If vector V0 is not of unit length, or if vector V is of zero
+        length, the results will be wrong.
+  \item If V0 points at a pole, the returned $\xi,\eta$
+        will be based on the
+        arbitrary assumption that $\alpha=0$ at the tangent point.
+  \item The projection is called the {\it gnomonic}\/ projection;  the
+        Cartesian coordinates \xieta\ are called
+        {\it standard coordinates.}\/  The latter
+        are in units of the distance from the tangent plane to the projection
+        point, {\it i.e.}\ radians near the origin.
+  \item This routine is the Cartesian equivalent of the routine sla\_S2TP.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_VDV}{Scalar Product}
+{
+ \action{Scalar product of two 3-vectors (single precision).}
+ \call{R~=~sla\_VDV (VA, VB)}
+}
+\args{GIVEN}
+{
+ \spec{VA}{R(3)}{first vector} \\
+ \spec{VB}{R(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{sla\_VDV}{R}{scalar product VA.VB}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_VN}{Normalize Vector}
+{
+ \action{Normalize a 3-vector, also giving the modulus (single precision).}
+ \call{CALL sla\_VN (V, UV, VM)}
+}
+\args{GIVEN}
+{
+ \spec{V}{R(3)}{vector}
+}
+\args{RETURNED}
+{
+ \spec{UV}{R(3)}{unit vector in direction of V} \\
+ \spec{VM}{R}{modulus of V}
+}
+\anote{If the modulus of V is zero, UV is set to zero as well.}
+%-----------------------------------------------------------------------
+\routine{SLA\_VXV}{Vector Product}
+{
+ \action{Vector product of two 3-vectors (single precision).}
+ \call{CALL sla\_VXV (VA, VB, VC)}
+}
+\args{GIVEN}
+{
+ \spec{VA}{R(3)}{first vector} \\
+ \spec{VB}{R(3)}{second vector}
+}
+\args{RETURNED}
+{
+ \spec{VC}{R(3)}{vector product VA$\times$VB}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_WAIT}{Time Delay}
+{
+ \action{Wait for a specified interval.}
+ \call{CALL sla\_WAIT (DELAY)}
+}
+\args{GIVEN}
+{
+ \spec{DELAY}{R}{delay in seconds}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The implementation is machine-specific.
+  \item The delay actually requested is restricted to the range
+        100ns-200s in the present implementation.
+  \item There is no guarantee of accuracy, though on almost all
+        types of computer the program will certainly not
+        resume execution {\it before}\/ the stated interval has
+        elapsed.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_XY2XY}{Apply Linear Model to an \xy}
+{
+ \action{Transform one \xy\ into another using a linear model of the type
+         produced by the sla\_FITXY routine.}
+ \call{CALL sla\_XY2XY (X1, Y1, COEFFS, X2, Y2)}
+}
+\args{GIVEN}
+{
+ \spec{X1,Y1}{D}{\xy\ before transformation} \\
+ \spec{COEFFS}{D(6)}{transformation coefficients (see note)}
+}
+\args{RETURNED}
+{
+ \spec{X2,Y2}{D}{\xy\ after transformation}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The model relates two sets of \xy\ coordinates as follows.
+        Naming the six elements of COEFFS $a,b,c,d,e$ \& $f$,
+        the present routine performs the transformation:
+        \begin{verse}
+          $x_{2} = a + bx_{1} + cy_{1}$ \\
+          $y_{2} = d + ex_{1} + fy_{1}$
+        \end{verse}
+  \item See also sla\_FITXY, sla\_PXY, sla\_INVF, sla\_DCMPF.
+ \end{enumerate}
+}
+%-----------------------------------------------------------------------
+\routine{SLA\_ZD}{$h,\delta$ to Zenith Distance}
+{
+ \action{Hour angle and declination to zenith distance
+         (double precision).}
+ \call{D~=~sla\_ZD (HA, DEC, PHI)}
+}
+\args{GIVEN}
+{
+ \spec{HA}{D}{hour angle in radians} \\
+ \spec{DEC}{D}{declination in radians} \\
+ \spec{PHI}{D}{latitude in radians}
+}
+\args{RETURNED}
+{
+ \spec{sla\_ZD}{D}{zenith distance (radians, $0\!-\!\pi$)}
+}
+\notes
+{
+ \begin{enumerate}
+  \item The latitude must be geodetic.  In critical applications,
+        corrections for polar motion should be applied (see sla\_POLMO).
+  \item In some applications it will be important to specify the
+        correct type of hour angle and declination in order to
+        produce the required type
+        of zenith distance.  In particular, it may be
+        important to distinguish between the zenith distance
+        as affected by refraction, which would require the
+        {\it observed}\/ \hadec, and the zenith distance {\it in vacuo},
+        which would require the {\it topocentric}\/ \hadec.  If
+        the effects of diurnal aberration can be neglected, the
+        {\it apparent}\/ \hadec\ may be used instead of the
+        {\it topocentric}\/ \hadec.
+  \item No range checking of arguments is done.
+  \item In applications which involve many zenith distance calculations,
+        rather than calling the present routine it will be more
+        efficient to use inline code, having previously computed fixed
+        terms such as sine and cosine of latitude, and perhaps sine and
+        cosine of declination.
+ \end{enumerate}
+}
+\vfill
+\pagebreak
+
+\section{EXPLANATION AND EXAMPLES}
+To guide the writer of positional-astronomy applications software,
+this final chapter puts the SLALIB routines into the context of
+astronomical phenomena and techniques, and presents a few
+``cookbook'' examples
+of the SLALIB calls in action.  The astronomical content of the chapter
+is not, of course, intended to be a substitute for specialist text-books on
+positional astronomy, but may help bridge the gap between
+such books and the SLALIB routines.  For further reading, the following
+cover a wide range of material and styles:
+\begin{itemize}
+\item {\it Explanatory Supplement to the Astronomical Almanac},
+      ed.\ P.\,Kenneth~Seidelmann (1992), University Science Books.
+\item {\it Vectorial Astrometry}, C.\,A.\,Murray (1983), Adam Hilger.
+\item {\it Spherical Astronomy}, Robin~M.\,Green (1985), Cambridge
+      University Press.
+\item {\it Spacecraft Attitude Determination and Control},
+      ed.\ James~R.\,Wertz (1986), Reidel.
+\item {\it Practical Astronomy with your Calculator},
+      Peter~Duffett-Smith (1981), Cambridge University Press.
+\end{itemize}
+Also of considerable value, though out of date in places, are:
+\begin{itemize}
+\item {\it Explanatory Supplement to the Astronomical Ephemeris
+      and the American Ephemeris and Nautical Almanac}, RGO/USNO (1974),
+      HMSO.
+\item {\it Textbook on Spherical Astronomy}, W.\,M.\,Smart (1977),
+      Cambridge University Press.
+\end{itemize}
+Only brief details of individual SLALIB routines are given here, and
+readers will find it useful to refer to the subprogram specifications
+elsewhere in this document.  The source code for the SLALIB routines
+(available in both Fortran and C) is also intended to be used as
+documentation.
+
+\subsection {Spherical Trigonometry}
+Celestial phenomena occur at such vast distances from the
+observer that for most practical purposes there is no need to
+work in 3D;  only the direction
+of a source matters, not how far away it is.  Things can
+therefore be viewed as if they were happening
+on the inside of sphere with the observer at the centre --
+the {\it celestial sphere}.  Problems involving
+positions and orientations in the sky can then be solved by
+using the formulae of {\it spherical trigonometry}, which
+apply to {\it spherical triangles}, the sides of which are
+{\it great circles}.
+
+Positions on the celestial sphere may be specified by using
+a spherical polar coordinate system, defined in terms of
+some fundamental plane and a line in that plane chosen to
+represent zero longitude.  Mathematicians usually work with the
+co-latitude, with zero at the principal pole, whereas most
+astronomical coordinate systems use latitude, reckoned plus and
+minus from the equator.
+Astronomical coordinate systems may be either right-handed
+({\it e.g.}\ right ascension and declination \radec,
+Galactic longitude and latitude \gal)
+or left-handed ({\it e.g.}\ hour angle and
+declination \hadec).  In some cases
+different conventions have been used in the past, a fruitful source of
+mistakes.  Azimuth and geographical longitude are examples;  azimuth
+is now generally reckoned north through east
+(making a left-handed system);  geographical longitude is now usually
+taken to increase eastwards (a right-handed system) but astronomers
+used to employ a west-positive convention.  In reports
+and program comments it is wise to spell out what convention
+is being used, if there is any possibility of confusion.
+
+When applying spherical trigonometry formulae, attention must be
+paid to
+rounding errors (for example it is a bad idea to find a
+small angle through its cosine) and to the possibility of
+problems close to poles.
+Also, if a formulation relies on inspection to establish
+the quadrant of the result, it is an indication that a vector-related
+method might be preferable.
+
+As well as providing many routines which work in terms of specific
+spherical coordinates such as \radec, SLALIB provides
+two routines which operate directly on generic spherical
+coordinates:
+sla\_SEP
+computes the separation between
+two points (the distance along a great circle) and
+sla\_BEAR
+computes the bearing (or {\it position angle})
+of one point seen from the other.  The routines
+sla\_DSEP
+and
+sla\_DBEAR
+are double precision equivalents.  As a simple demonstration
+of SLALIB, we will use these facilities to estimate the distance from
+London to Sydney and the initial compass heading:
+\goodbreak
+\begin{verbatim}
+            IMPLICIT NONE
+
+      *  Degrees to radians
+            REAL D2R
+            PARAMETER (D2R=0.01745329252)
+
+      *  Longitudes and latitudes (radians) for London and Sydney
+            REAL AL,BL,AS,BS
+            PARAMETER (AL=-0.2*D2R,BL=51.5*D2R,AS=151.2*D2R,BS=-33.9*D2R)
+
+      *  Earth radius in km (spherical approximation)
+            REAL RKM
+            PARAMETER (RKM=6375.0)
+
+            REAL sla_SEP,sla_BEAR
+
+
+      *  Distance and initial heading (N=0, E=90)
+            WRITE (*,'(1X,I5,'' km,'',I4,'' deg'')')
+           :    NINT(sla_SEP(AL,BL,AS,BS)*RKM),NINT(sla_BEAR(AL,BL,AS,BS)/D2R)
+
+            END
+\end{verbatim}
+\goodbreak
+(The result is 17011~km, $61^\circ$.)
+
+The routines
+sla\_SEPV,
+sla\_DSEPV,
+sla\_PAV,
+sla\_DPAV
+are equivalents of sla\_SEP, sla\_DSEP, sla\_BEAR and sla\_DBEAR
+but starting from vectors
+instead of spherical coordinates.
+
+\subsubsection{Formatting angles}
+SLALIB has routines for decoding decimal numbers
+from character form and for converting angles to and from
+sexagesimal form (hours, minutes, seconds or degrees,
+arcminutes, arcseconds).  These apparently straightforward
+operations contain hidden traps which the SLALIB routines
+avoid.
+
+There are five routines for decoding numbers from a character
+string, such as might be entered using a keyboard.
+They all work in the same style, and successive calls
+can work their way along a single string decoding
+a sequence of numbers of assorted types.  Number
+fields can be separated by spaces or commas, and can be defaulted
+to previous values or to preset defaults.
+
+Three of the routines decode single numbers:
+sla\_INTIN
+(integer),
+sla\_FLOTIN
+(single precision floating point) and
+sla\_DFLTIN
+(double precision).  A minus sign can be
+detected even when the number is zero;  this avoids
+the frequently-encountered ``minus zero'' bug, where
+declinations {\it etc.}\ in
+the range $0^{\circ}$ to $-1^{\circ}$ mysteriously migrate to
+the range $0^{\circ}$ to $+1^{\circ}$.
+Here is an example (in Fortran) where we wish to
+read two numbers, an integer {\tt IX} and a real, {\tt Y},
+with {\tt IX} defaulting to zero and {\tt Y} defaulting to
+{\tt IX}:
+\goodbreak
+\begin{verbatim}
+            DOUBLE PRECISION Y
+            CHARACTER*80 A
+            INTEGER IX,I,J
+
+      *  Input the string to be decoded
+            READ (*,'(A)') A
+
+      *  Preset IX to its default value
+            IX = 0
+
+      *  Point to the start of the string
+            I = 1
+
+      *  Decode an integer
+            CALL sla_INTIN(A,I,IX,J)
+            IF (J.GT.1) GO TO ... (bad IX)
+
+      *  Preset Y to its default value
+            Y = DBLE(IX)
+
+      *  Decode a double precision number
+            CALL sla_DFLTIN(A,I,Y,J)
+            IF (J.GT.1) GO TO ... (bad Y)
+\end{verbatim}
+\goodbreak
+Two additional routines decode a 3-field sexagesimal number:
+sla\_AFIN
+(degrees, arcminutes, arcseconds to single
+precision radians) and
+sla\_DAFIN
+(the same but double precision).  They also
+work using other units such as hours {\it etc}.\ if
+you multiply the result by the appropriate factor.  An example
+Fortran program which uses
+sla\_DAFIN
+was given earlier, in section 1.2.
+
+SLALIB provides four routines for expressing an angle in radians
+in a preferred range.  The function
+sla\_RANGE
+expresses an angle
+in the range $\pm\pi$;
+sla\_RANORM
+expresses an angle in the range
+$0-2\pi$.  The functions
+sla\_DRANGE
+and
+sla\_DRANRM
+are double precision versions.
+
+Several routines
+(sla\_CTF2D,
+sla\_CR2AF
+{\it etc.}) are provided to convert
+angles to and from
+sexagesimal form (hours, minute, seconds or degrees,
+arcminutes and arcseconds).
+They avoid the common
+``converting from integer to real at the wrong time''
+bug, which produces angles like \hms{24}{59}{59}{999}.
+Here is a program which displays an hour angle
+stored in radians:
+\goodbreak
+\begin{verbatim}
+            DOUBLE PRECISION HA
+            CHARACTER SIGN
+            INTEGER IHMSF(4)
+            :
+            CALL sla_DR2TF(3,HA,SIGN,IHMSF)
+            WRITE (*,'(1X,A,3I3.2,''.'',I3.3)') SIGN,IHMSF
+\end{verbatim}
+\goodbreak
+
+\subsection {Vectors and Matrices}
+As an alternative to employing a spherical polar coordinate system,
+the direction of an object can be defined in terms of the sum of any
+three vectors as long as they are different and
+not coplanar.  In practice, three vectors at right angles are
+usually chosen, forming a system
+of {\it Cartesian coordinates}.  The {\it x}- and {\it y}-axes
+lie in the fundamental plane ({\it e.g.}\ the equator in the
+case of \radec), with the {\it x}-axis pointing to zero longitude.
+The {\it z}-axis is normal to the fundamental plane and points
+towards positive latitudes.  The {\it y}-axis can lie in either
+of the two possible directions, depending on whether the
+coordinate system is right-handed or left-handed.
+The three axes are sometimes called
+a {\it triad}.  For most applications involving arbitrarily
+distant objects such as stars, the vector which defines
+the direction concerned is constrained to have unit length.
+The {\it x}-, {\it y-} and {\it z-}components
+can be regarded as the scalar (dot) product of this vector
+onto the three axes of the triad in turn.  Because the vector
+is a unit vector,
+each of the three dot-products is simply the cosine of the angle
+between the unit vector and the axis concerned, and the
+{\it x}-, {\it y-} and {\it z-}components are sometimes
+called {\it direction cosines}.
+
+For some applications, including those involving objects
+within the Solar System, unit vectors are inappropriate, and
+it is necessary to use vectors scaled in length-units such as
+AU, km {\it etc.}
+In these cases the origin of the coordinate system may not be
+the observer, but instead might be the Sun, the Solar-System
+barycentre, the centre of the Earth {\it etc.}  But whatever the application,
+the final direction in which the observer sees the object can be
+expressed as direction cosines.
+
+But where has this got us?  Instead of two numbers -- a longitude and
+a latitude -- we now have three numbers to look after
+-- the {\it x}-, {\it y-} and
+{\it z-}components -- whose quadratic sum we have somehow to contrive to
+be unity.  And, in addition to this apparent redundancy,
+most people find it harder to visualize
+problems in terms of \xyz\ than in $[\,\theta,\phi~]$.
+Despite these objections, the vector approach turns out to have
+significant advantages over the spherical trigonometry approach:
+\begin{itemize}
+\item Vector formulae tend to be much more succinct;  one vector
+      operation is the equivalent of strings of sines and cosines.
+\item The formulae are as a rule rigorous, even at the poles.
+\item Accuracy is maintained all over the celestial sphere.
+      When one Cartesian component is nearly unity and
+      therefore insensitive to direction, the others become small
+      and therefore more precise.
+\item Formulations usually deliver the quadrant of the result
+      without the need for any inspection (except within the
+      library function ATAN2).
+\end{itemize}
+A number of important transformations in positional
+astronomy turn out to be nothing more than changes of coordinate
+system, something which is especially convenient if
+the vector approach is used.  A direction with respect
+to one triad can be expressed relative to another triad simply
+by multiplying the \xyz\ column vector by the appropriate
+$3\times3$ orthogonal matrix
+(a tensor of Rank~2, or {\it dyadic}).  The three rows of this
+{\it rotation matrix}\/
+are the vectors in the old coordinate system of the three
+new axes, and the transformation amounts to obtaining the
+dot-product of the direction-vector with each of the three
+new axes.  Precession, nutation, \hadec\ to \azel,
+\radec\ to \gal\ and so on are typical examples of the
+technique.  A useful property of the rotation matrices
+is that they can be inverted simply by taking the transpose.
+
+The elements of these vectors and matrices are assorted combinations of
+the sines and cosines of the various angles involved (hour angle,
+declination and so on, depending on which transformation is
+being applied).  If you write out the matrix multiplications
+in full you get expressions which are essentially the same as the
+equivalent spherical trigonometry formulae.  Indeed, many of the
+standard formulae of spherical trigonometry are most easily
+derived by expressing the problem initially in
+terms of vectors.
+
+\subsubsection{Using vectors}
+SLALIB provides conversions between spherical and vector
+form
+(sla\_CS2C,
+sla\_CC2S
+{\it etc.}), plus an assortment
+of standard vector and matrix operations
+(sla\_VDV,
+sla\_MXV
+{\it etc.}).
+There are also routines
+(sla\_EULER
+{\it etc.}) for creating a rotation matrix
+from three {\it Euler angles}\/ (successive rotations about
+specified Cartesian axes).  Instead of Euler angles, a rotation
+matrix can be expressed as an {\it axial vector}\/ (the pole of the rotation,
+and the amount of rotation), and routines are provided for this
+(sla\_AV2M,
+sla\_M2AV
+{\it etc.}).
+
+Here is an example where spherical coordinates {\tt P1} and {\tt Q1}
+undergo a coordinate transformation and become {\tt P2} and {\tt Q2};
+the transformation consists of a rotation of the coordinate system
+through angles {\tt A}, {\tt B} and {\tt C} about the
+{\it z}, new {\it y}\/ and new {\it z}\/ axes respectively:
+\goodbreak
+\begin{verbatim}
+            REAL A,B,C,R(3,3),P1,Q1,V1(3),V2(3),P2,Q2
+             :
+      *  Create rotation matrix
+            CALL sla_EULER('ZYZ',A,B,C,R)
+
+      *  Transform position (P1,Q1) from spherical to Cartesian
+            CALL sla_CS2C(P1,Q1,V1)
+
+      *  Apply the rotation
+            CALL sla_MXV(R,V1,V2)
+
+      *  Back to spherical
+            CALL sla_CC2S(V2,P2,Q2)
+\end{verbatim}
+\goodbreak
+Small adjustments to the direction of a position
+vector are often most conveniently described in terms of
+$[\,\Delta x,\Delta y, \Delta z\,]$.  Adding the correction
+vector needs careful handling if the position
+vector is to remain of length unity, an advisable precaution which
+ensures that
+the \xyz\ components are always available to mean the cosines of
+the angles between the vector and the axis concerned.  Two types
+of shifts are commonly used,
+the first where a small vector of arbitrary direction is
+added to the unit vector, and the second where there is a displacement
+in the latitude coordinate (declination, elevation {\it etc.}) alone.
+
+For a shift produced by adding a small \xyz\ vector ${\bf d}$ to a
+unit vector ${\bf v}_1$, the resulting vector ${\bf v}_2$ has direction
+$<{\bf v}_1+{\bf d}>$ but is no longer of unit length.  A better approximation
+is available if the result is multiplied by a scaling factor of
+$(1-{\bf d}\cdot{\bf v}_1)$, where the dot
+means scalar product.  In Fortran:
+\goodbreak
+\begin{verbatim}
+            F = (1D0-(DX*V1X+DY*V1Y+DZ*V1Z))
+            V2X = F*(V1X+DX)
+            V2Y = F*(V1Y+DY)
+            V2Z = F*(V1Z+DZ)
+\end{verbatim}
+\goodbreak
+\noindent
+The correction for diurnal aberration (discussed later) is
+an example of this form of shift.
+
+As an example of the second kind of displacement
+we will apply a small change in elevation $\delta E$ to an
+\azel\ direction vector.  The direction of the
+result can be obtained by making the allowable approximation
+${\tan \delta E\approx\delta E}$ and adding a adjustment
+vector of length $\delta E$ normal
+to the direction vector in the vertical plane containing the direction
+vector.  The $z$-component of the adjustment vector is
+$\delta E \cos E$,
+and the horizontal component is
+$\delta E \sin E$ which has then to be
+resolved into $x$ and $y$ in proportion to their current sizes. To
+approximate a unit vector more closely, a correction factor of
+$\cos \delta E$ can then be applied, which is nearly
+$(1-\delta E^2 /2)$ for
+small $\delta E$.  Expressed in Fortran, for initial vector
+{\tt V1X,V1Y,V1Z}, change in elevation {\tt DEL}
+(+ve $\equiv$ upwards), and result
+vector {\tt V2X,V2Y,V2Z}:
+\goodbreak
+\begin{verbatim}
+            COSDEL = 1D0-DEL*DEL/2D0
+            R1 = SQRT(V1X*V1X+V1Y*V1Y)
+            F = COSDEL*(R1-DEL*V1Z)/R1
+            V2X = F*V1X
+            V2Y = F*V1Y
+            V2Z = COSDEL*(V1Z+DEL*R1)
+\end{verbatim}
+\goodbreak
+An example of this type of shift is the correction for atmospheric
+refraction (see later).
+Depending on the relationship between $\delta E$ and $E$, special
+handling at the pole (the zenith for our example) may be required.
+
+SLALIB includes routines for the case where both a position
+and a velocity are involved.  The routines
+sla\_CS2C6
+and
+sla\_CC62S
+convert from $[\theta,\phi,\dot{\theta},\dot{\phi}]$
+to \xyzxyzd\ and back;
+sla\_DS2C6
+and
+sla\_DC62S
+are double precision equivalents.
+
+\subsection {Celestial Coordinate Systems}
+SLALIB has routines to perform transformations
+of celestial positions between different spherical
+coordinate systems, including those shown in the following table:
+
+\begin{center}
+\begin{tabular}{|l|c|c|c|c|c|c|} \hline
+{\it system} & {\it symbols} & {\it longitude} & {\it latitude} &
+          {\it x-y plane} & {\it long.\ zero} & {\it RH/LH}
+\\ \hline \hline
+horizon & -- & azimuth & elevation & horizontal & north & L
+\\ \hline
+equatorial & $\alpha,\delta$ & R.A.\ & Dec.\ & equator & equinox & R
+\\ \hline
+local equ.\ & $h,\delta$ & H.A.\ & Dec.\ & equator & meridian & L
+\\ \hline
+ecliptic & $\lambda,\beta$ & ecl.\ long.\ & ecl.\ lat.\ &
+                                       ecliptic & equinox & R
+\\ \hline
+galactic & $l^{I\!I},b^{I\!I}$ & gal.\ long.\ & gal.\ lat.\ &
+                                       gal.\ equator & gal.\ centre & R
+\\ \hline
+supergalactic & SGL,SGB & SG long.\ & SG lat.\ &
+                                       SG equator & node w.\ gal.\ equ.\ & R
+\\ \hline
+\end{tabular}
+\end{center}
+Transformations between \hadec\ and \azel\ can be performed by
+calling
+sla\_E2H
+and
+sla\_H2E,
+or, in double precision,
+sla\_DE2H
+and
+sla\_DH2E.
+There is also a routine for obtaining
+zenith distance alone for a given \hadec,
+sla\_ZD,
+and one for determining the parallactic angle,
+sla\_PA.
+Three routines are included which relate to altazimuth telescope
+mountings.  For a given \hadec\ and latitude,
+sla\_ALTAZ
+returns the azimuth, elevation and parallactic angle, plus
+velocities and accelerations for sidereal tracking.
+The routines
+sla\_PDA2H
+and
+sla\_PDQ2H
+predict at what hour angle a given azimuth or
+parallactic angle will be reached.
+
+The routines
+sla\_EQECL
+and
+sla\_ECLEQ
+transform between ecliptic
+coordinates and \radec\/; there is also a routine for generating the
+equatorial to ecliptic rotation matrix for a given date:
+sla\_ECMAT.
+
+For conversion between Galactic coordinates and \radec\ there are
+two sets of routines, depending on whether the \radec\ is
+old-style, B1950, or new-style, J2000;
+sla\_EG50
+and
+sla\_GE50
+are \radec\ to \gal\ and {\it vice versa}\/ for the B1950 case, while
+sla\_EQGAL
+and
+sla\_GALEQ
+are the J2000 equivalents.
+
+Finally, the routines
+sla\_GALSUP
+and
+sla\_SUPGAL
+transform \gal\ to de~Vaucouleurs supergalactic longitude and latitude
+and {\it vice versa.}
+
+It should be appreciated that the table, above, constitutes
+a gross oversimplification.   Apparently
+simple concepts such as equator, equinox {\it etc.}\ are apt to be very hard to
+pin down precisely (polar motion, orbital perturbations \ldots) and
+some have several interpretations, all subtly different.  The various
+frames move in complicated ways with respect to one another or to
+the stars (themselves in motion).  And in some instances the
+coordinate system is slightly distorted, so that the
+ordinary rules of spherical trigonometry no longer strictly apply.
+
+These {\it caveats}\/
+apply particularly to the bewildering variety of different
+\radec\ systems that are in use.  Figure~1 shows how
+some of these systems are related, to one another and
+to the direction in which a celestial source actually
+appears in the sky.  At the top of the diagram are
+the various sorts of {\it mean place}\/
+found in star catalogues and papers;\footnote{One frame not included in
+Figure~1 is that of the Hipparcos catalogue.  This is currently the
+best available implementation in the optical of the {\it International
+Celestial Reference System}\/ (ICRS), which is based on extragalactic
+radio sources observed by VLBI.  The distinction between FK5 J2000
+and Hipparcos coordinates only becomes important when accuracies of
+50~mas or better are required.  More details are given in
+Section~4.14.} at the bottom is the
+{\it observed}\/ \azel, where a perfect theodolite would
+be pointed to see the source;  and in the body of
+the diagram are
+the intermediate processing steps and coordinate
+systems.  To help
+understand this diagram, and the SLALIB routines that can
+be used to carry out the various calculations, we will look at the coordinate
+systems involved, and the astronomical phenomena that
+affect them.
+
+\begin{figure}
+\begin{center}
+\begin{tabular}{|cccccc|}   \hline
+& & & & & \\
+\hspace{5em} & \hspace{5em} & \hspace{5em} &
+   \hspace{5em} & \hspace{5em} & \hspace{5em}  \\
+\multicolumn{2}{|c}{\hspace{0em}\fbox{\parbox{8.5em}{\center \vspace{-2ex}
+                                                   mean \radec, FK4, \\
+                                                   any equinox
+                                                   \vspace{0.5ex}}}} &
+ \multicolumn{2}{c}{\hspace{0em}\fbox{\parbox{8.5em}{\center \vspace{-2ex}
+                                                   mean \radec, FK4,
+                                                   no $\mu$, any equinox
+                                                   \vspace{0.5ex}}}} &
+\multicolumn{2}{c|}{\hspace{0em}\fbox{\parbox{8.5em}{\center \vspace{-2ex}
+                                                   mean \radec, FK5, \\
+                                                   any equinox
+                                                   \vspace{0.5ex}}}} \\
+& \multicolumn{2}{|c|}{} & \multicolumn{2}{c|}{} & \\
+\multicolumn{2}{|c}{space motion} & \multicolumn{1}{c|}{} & &
+   \multicolumn{2}{c|}{space motion} \\
+\multicolumn{2}{|c}{-- E-terms} &
+   \multicolumn{2}{c}{-- E-terms} & \multicolumn{1}{c|}{} & \\
+\multicolumn{2}{|c}{precess to B1950} & \multicolumn{2}{c}{precess to B1950} &
+   \multicolumn{2}{c|}{precess to J2000} \\
+\multicolumn{2}{|c}{+ E-terms} &
+   \multicolumn{2}{c}{+ E-terms} & \multicolumn{1}{c|}{} & \\
+\multicolumn{2}{|c}{FK4 to FK5, no $\mu$} &
+   \multicolumn{2}{c}{FK4 to FK5, no $\mu$} & \multicolumn{1}{c|}{} & \\
+\multicolumn{2}{|c}{parallax} & \multicolumn{1}{c|}{} & &
+   \multicolumn{2}{c|}{parallax} \\
+& \multicolumn{2}{|c|}{} & \multicolumn{2}{c|}{} & \\ \cline{2-5}
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{\parbox{18em}{\center \vspace{-2ex}
+                                   FK5, J2000, current epoch, geocentric
+                                          \vspace{0.5ex}}}} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{light deflection} & \\
+& \multicolumn{4}{c}{annual aberration} & \\
+& \multicolumn{4}{c}{precession-nutation} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{Apparent \radec}} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{Earth rotation} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{Apparent \hadec}} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{diurnal aberration} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{Topocentric \hadec}} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\hadec\ to \azel} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{Topocentric \azel}} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{refraction} & \\
+\multicolumn{3}{|c|}{} & & & \\
+& \multicolumn{4}{c}{\fbox{Observed \azel}} & \\
+& & & & & \\
+& & & & & \\ \hline
+\end{tabular}
+\end{center}
+\vspace{-0.5ex}
+\caption{\bf Relationship Between Celestial Coordinates}
+
+Star positions are published or catalogued using
+one of the mean \radec\ systems shown at
+the top.  The ``FK4'' systems
+were used before about 1980 and are usually
+equinox B1950.  The ``FK5'' system, equinox J2000, is now preferred,
+or rather its modern equivalent, the International Celestial Reference
+Frame (in the optical, the Hipparcos catalogue).
+The figure relates a star's mean \radec\ to the actual
+line-of-sight to the star.
+Note that for the conventional choices of equinox, namely
+B1950 or J2000, all of the precession and E-terms corrections
+are superfluous.
+\end{figure}
+
+\subsection{Precession and Nutation}
+{\it Right ascension and declination}, (\radec), are the names
+of the longitude and latitude in a spherical
+polar coordinate system based on the Earth's axis of rotation.
+The zero point of $\alpha$ is the point of intersection of
+the {\it celestial
+equator}\/ and the {\it ecliptic}\/ (the apparent path of the Sun
+through the year) where the Sun moves into the northern
+hemisphere.  This point is called the
+{\it first point of Aries},
+the {\it vernal equinox}\/ (with apologies to
+southern-hemisphere readers) or simply the {\it equinox}.\footnote{With
+the introduction of the International Celestial Reference System (ICRS), the
+connection between (i)~star coordinates and (ii)~the Earth's orientation
+and orbit has been broken.  However, the orientation of the
+International Celestial Reference Frame (ICRF) axes was, for convenience,
+chosen to match J2000 FK5, and for most practical purposes ICRF coordinates
+(for example entries in the Hipparcos catalogue) can be regarded as
+synonymous with J2000 FK5.  See Section 4.14 for further details.}
+
+This simple picture is unfortunately
+complicated by the difficulty of defining
+a suitable equator and equinox.  One problem is that the
+Sun's apparent diurnal and annual
+motions are not completely regular, due to the
+ellipticity of the Earth's orbit and its continuous disturbance
+by the Moon and planets.  This is dealt with by
+separating the motion into (i)~a smooth and steady {\it mean Sun}\/
+and (ii)~a set of periodic corrections and perturbations; only the former
+is involved in establishing reference systems and time scales.
+A second, far larger problem, is that
+the celestial equator and the ecliptic
+are both moving with respect to the stars.
+These motions arise because of the gravitational
+interactions between the Earth and the other solar-system bodies.
+
+By far the largest effect is the
+so-called ``precession of the equinoxes'', where the Earth's
+rotation axis sweeps out a cone centred on the ecliptic
+pole, completing one revolution in about 26,000 years.  The
+cause of the motion is the torque exerted on the distorted and
+spinning Earth by the Sun and the Moon.  Consider the effect of the
+Sun alone, at or near the northern summer solstice.  The Sun
+`sees' the top (north pole) of the Earth tilted towards it
+(by about \degree{23}{5}, the {\it obliquity of the
+ecliptic}\/),
+and sees the nearer part of the Earth's equatorial bulge
+below centre and the further part above centre.
+Although the Earth is in free fall,
+the gravitational force on the nearer part of the
+equatorial bulge is greater than that on the further part, and
+so there is a net torque acting
+as if to eliminate the tilt.  Six months later the same thing
+is happening in reverse, except that the torque is still
+trying to eliminate the tilt.  In between (at the equinoxes) the
+torque shrinks to zero.  A torque acting on a spinning body
+is gyroscopically translated
+into a precessional motion of the spin axis at right-angles to the torque,
+and this happens to the Earth.
+The motion varies during the
+year, going through two maxima, but always acts in the
+same direction.  The Moon produces the same effect,
+adding a contribution to the precession which peaks twice
+per month.  The Moon's proximity to the Earth more than compensates
+for its smaller mass and gravitational attraction, so that it
+in fact contributes most of the precessional effect.
+
+The complex interactions between the three bodies produce a
+precessional motion that is wobbly rather than completely smooth.
+However, the main 26,000-year component is on such a grand scale that
+it dwarfs the remaining terms, the biggest of
+which has an amplitude of only \arcseci{11} and a period of
+about 18.6~years.  This difference of scale makes it convenient to treat
+these two components of the motion separately.  The main 26,000-year
+effect is called {\it luni-solar precession};  the smaller,
+faster, periodic terms are called the {\it nutation}.
+
+Note that precession and nutation are simply
+different frequency components of the same physical effect.  It is
+a common misconception that precession is caused
+by the Sun and nutation is caused by the Moon.  In fact
+the Moon is responsible for two-thirds of the precession, and,
+while it is true that much of the complex detail of the nutation is
+a reflection of the intricacies of the lunar orbit, there are
+nonetheless important solar terms in the nutation.
+
+In addition to and quite separate
+from the precession-nutation effect, the orbit of the Earth-Moon system
+is not fixed in orientation, a result of the attractions of the
+planets.  This slow (about \arcsec{0}{5}~per~year)
+secular rotation of the ecliptic about a slowly-moving diameter is called,
+confusingly, {\it planetary
+precession}\/ and, along with the luni-solar precession is
+included in the {\it general precession}.  The equator and
+ecliptic as affected by general precession
+are what define the various ``mean'' \radec\ reference frames.
+
+The models for precession and nutation come from a combination
+of observation and theory, and are subject to continuous
+refinement.  Nutation models in particular have reached a high
+degree of sophistication, taking into account such things as
+the non-rigidity of the Earth and the effects of
+the planets; SLALIB's nutation
+model (SF2001) involves 194 terms in each of $\psi$ (longitude)
+and $\epsilon$ (obliquity), some as small as a few microarcseconds.
+
+\subsubsection{SLALIB support for precession and nutation}
+SLALIB offers a choice of three precession models:
+\begin{itemize}
+\item The old Bessel-Newcomb, pre IAU~1976, ``FK4'' model, used for B1950
+      star positions and other pre-1984.0 purposes
+(sla\_PREBN).
+\item The new Fricke, IAU~1976, ``FK5'' model, used for J2000 star
+      positions and other post-1984.0 purposes
+(sla\_PREC).
+\item A model published by Simon {\it et al.}\ which is more accurate than
+      the IAU~1976 model and which is suitable for long
+      periods of time
+(sla\_PRECL).
+\end{itemize}
+In each case, the named SLALIB routine generates the $(3\times3)$
+{\it precession
+matrix}\/ for a given start and finish time.  For example,
+here is the Fortran code for generating the rotation
+matrix which describes the precession between the epochs
+J2000 and J1985.372 (IAU 1976 model):
+\goodbreak
+\begin{verbatim}
+            DOUBLE PRECISION PMAT(3,3)
+             :
+            CALL sla_PREC(2000D0,1985.372D0,PMAT)
+\end{verbatim}
+\goodbreak
+It is instructive to examine the resulting matrix:
+\goodbreak
+\begin{verbatim}
+            +0.9999936402  +0.0032709208  +0.0014214694
+            -0.0032709208  +0.9999946505  -0.0000023247
+            -0.0014214694  -0.0000023248  +0.9999989897
+\end{verbatim}
+\goodbreak
+Note that the diagonal elements are close to unity, and the
+other elements are small.  This shows that over an interval as
+short as 15~years the precession isn't going to move a
+position vector very far (in this case about \degree{0}{2}).
+
+For convenience, a direct \radec\ to \radec\ precession routine is
+also provided
+(sla\_PRECES),
+suitable for either the old or the new system (but not a
+mixture of the two).
+
+SLALIB provides two nutation models, the old IAU~1980 model,
+implemented in the routine
+slaNutc80, and a much more accurate newer theory, SF2001,
+implemented in the routine
+slaNutc.
+Both return the components of nutation
+in longitude and latitude (and also provide the obliquity) from
+which a nutation matrix can be generated by calling
+slaDeuler
+(and from which the {\it equation of the equinoxes}, described
+later, can be found).  Alternatively,
+the SF2001 nutation matrix can be generated in a single call by using
+slaNut.  The SF2001 nutation theory includes components that correct
+for errors in the IAU~1976 precession and also for the
+$\sim 23\,$mas
+displacement between the mean J2000 and ICRS coordinate systems,
+achieving a final accuracy well under 1\,mas in the present era.
+
+A rotation matrix for applying the entire precession-nutation
+transformation in one go can be generated by calling
+sla\_PRENUT.
+
+\subsection{Mean Places}
+From a classical standpoint,
+the main effect of the precession-nutation is an increase of about
+\arcseci{50}/year in the ecliptic longitudes of the stars.  It is therefore
+essential, when reporting the position of an astronomical target, to
+qualify the coordinates with a date, or {\it epoch}.
+Specifying the epoch ties down the equator and
+equinox which define the \radec\ coordinate system that is
+being used.
+\footnote{An equinox is, however, not required for coordinates
+in the International Celestial Reference System.  Such coordinates must
+be labelled simply ``ICRS'', or the specific catalogue can be mentioned,
+such as ``Hipparcos'';  constructions such as ``Hipparcos, J2000'' are
+redundant and misleading.}  For simplicity, only
+the smooth and steady ``precession'' part of the
+complete precession-nutation effect is
+included, thereby defining what is called the {\it mean}\/
+equator and equinox for the epoch concerned.  We say a star
+has a mean place of (for example)
+\hms{12}{07}{58}{09}~\dms{-19}{44}{37}{1} ``with respect to the mean equator
+and equinox of epoch J2000''.  The short way of saying
+this is ``\radec\ equinox J2000'' ({\bf not} ``\radec\ epoch J2000'',
+which means something different to do with
+proper motion).
+
+\subsection{Epoch}
+The word ``epoch'' just means a significant
+moment in time, and can be supplied
+in a variety of forms, using different calendar systems and time scales.
+
+For the purpose of specifying the epochs associated with the
+mean place of a star, two conventions exist.  Both sorts of epoch
+superficially resemble years AD but are not tied to the civil
+(Gregorian) calendar;  to distinguish them from ordinary calendar-years
+there is often
+a ``.0'' suffix (as in ``1950.0''), although any other fractional
+part is perfectly legal ({\it e.g.}\ 1987.5).
+
+The older system,
+{\it Besselian epoch}, is defined in such a way that its units are
+tropical years of about 365.2422~days and its time scale is the
+obsolete {\it Ephemeris Time}.
+The start of the Besselian year is the moment
+when the ecliptic longitude of the mean Sun is
+$280^{\circ}$;  this happens near the start of the
+calendar year (which is why $280^{\circ}$ was chosen).
+
+The new system, {\it Julian epoch}, was adopted as
+part of the IAU~1976 revisions (about which more will be said
+in due course) and came formally into use at the
+beginning of 1984.  It uses the Julian year of exactly
+365.25~days; Julian epoch 2000 is defined to be 2000~January~1.5 in the
+TT time scale.
+
+For specifying mean places, various standard epochs are in use, the
+most common ones being Besselian epoch 1950.0 and Julian epoch 2000.0.
+To distinguish the two systems, Besselian epochs
+are now prefixed ``B'' and Julian epochs are prefixed ``J''.
+Epochs without an initial letter can be assumed to be Besselian
+if before 1984.0, otherwise Julian.  These details are supported by
+the SLALIB routines
+sla\_DBJIN
+(decodes numbers from a
+character string, accepting an optional leading B or J),
+sla\_KBJ
+(decides whether B or J depending on prefix or range) and
+sla\_EPCO
+(converts one epoch to match another).
+
+SLALIB has four routines for converting
+Besselian and Julian epochs into other forms.
+The functions
+sla\_EPB2D
+and
+sla\_EPJ2D
+convert Besselian and Julian epochs into MJD; the functions
+sla\_EPB
+and
+sla\_EPJ
+do the reverse.  For example, to express B1950 as a Julian epoch:
+\goodbreak
+\begin{verbatim}
+            DOUBLE PRECISION sla_EPJ,sla_EPB2D
+             :
+            WRITE (*,'(1X,''J'',F10.5)') sla_EPJ(sla_EPB2D(1950D0))
+\end{verbatim}
+\goodbreak
+(The answer is J1949.99979.)
+
+\subsection{Proper Motion}
+Stars in catalogues usually have, in addition to the
+\radec\  coordinates, a {\it proper motion} $[\mu_\alpha,\mu_\delta]$.
+This is an intrinsic motion
+of the star across the background.  Very few stars have a
+proper motion which exceeds \arcseci{1}/year, and most are
+far below this level.  A star observed as part of normal
+astronomy research will, as a rule, have a proper motion
+which is unknown.
+
+Mean \radec\ and rate of change are not sufficient to pin
+down a star;  the epoch at which the \radec\ was or will
+be correct is also needed.  Note the distinction
+between the epoch which specifies the
+coordinate system and the epoch at which the star passed
+through the given \radec.  The full specification for a star
+is \radec, proper motions, equinox and epoch (plus something to
+identify which set of models for the precession {\it etc.}\ is
+being used -- see the next section).
+For convenience, coordinates given in star catalogues are almost
+always adjusted to make the equinox and epoch the same -- for
+example B1950 in the case of the SAO~catalogue.
+
+SLALIB provides one routine to handle proper motion on its own,
+sla\_PM.
+Proper motion is also allowed for in various other
+routines as appropriate, for example
+sla\_MAP
+and
+sla\_FK425.
+Note that in all SLALIB routines which involve proper motion
+the units are radians per year and the
+$\alpha$ component is in the form $\dot{\alpha}$ ({\it i.e.}\ big
+numbers near the poles).
+Some star catalogues have proper motion per century, and
+in some catalogues the $\alpha$ component is in the form
+$\dot{\alpha}\cos\delta$ ({\it i.e.}\ angle on the sky).
+
+\subsection{Parallax and Radial Velocity}
+For the utmost accuracy and the nearest stars, allowance can
+be made for {\it annual parallax}\/ and for the effects of perspective
+on the proper motion.
+
+Parallax is appreciable only for nearby stars;  even
+the nearest, Proxima Centauri, is displaced from its average
+position by less than
+an arcsecond as the Earth revolves in its orbit.
+
+For stars with a known parallax, knowledge of the radial velocity
+allows the proper motion to be expressed as an actual space
+motion in 3~dimensions.  The proper motion is,
+in fact, a snapshot of the transverse component of the
+space motion, and in the case of nearby stars will
+change with time due to perspective.
+
+SLALIB does not provide facilities for handling parallax
+and radial-velocity on their own, but their contribution is
+allowed for in such routines as
+sla\_PM,
+sla\_MAP
+and
+sla\_FK425.
+Catalogue mean
+places do not include the effects of parallax and are therefore
+{\it barycentric};  when pointing telescopes {\it etc.}\ it is
+usually most efficient to apply the slowly-changing
+parallax correction to the mean place of the target early on
+and to work with the {\it geocentric}\/ mean place.  This latter
+approach is implied in Figure~1.
+
+\subsection{Aberration}
+The finite speed of light combined with the motion of the observer
+around the Sun during the year causes apparent displacements of
+the positions of the stars.  The effect is called
+the {\it annual aberration} (or ``stellar''
+aberration).  Its maximum size, about \arcsec{20}{5},
+occurs for stars $90^{\circ}$ from the point towards which
+the Earth is headed as it orbits the Sun;  a star exactly in line with
+the Earth's motion is not displaced.  To receive the light of
+a star, the telescope has to be offset slightly in the direction of
+the Earth's motion.  A familiar analogy is the need to tilt your
+umbrella forward when on the move, to avoid getting wet.  This
+classical model is,
+in fact, misleading in the context of light as opposed
+to rain, but happens to give the same answer as a relativistic
+treatment to first order (better than 1~milliarcsecond).
+
+Before the IAU 1976 resolutions, different
+values for the approximately
+\arcsec{20}{5} {\it aberration constant}\/ were employed
+at different times, and this can complicate comparisons
+between different catalogues.  Another complication comes from
+the so-called {\it E-terms of aberration},
+that small part of the annual aberration correction that is a
+function of the eccentricity of the Earth's orbit.  The E-terms,
+maximum amplitude about \arcsec{0}{3},
+happen to be approximately constant for a given star, and so they
+used to be incorporated in the catalogue \radec\/
+to reduce the labour of converting to and from apparent place.
+The E-terms can be removed from a catalogue \radec\/ by
+calling
+sla\_SUBET
+or applied (for example to allow a pulsar
+timing-position to be plotted on a B1950 finding chart)
+by calling
+sla\_ADDET;
+the E-terms vector itself can be obtained by calling
+sla\_ETRMS.
+Star positions post IAU 1976 are free of these distortions, and to
+apply corrections for annual aberration involves the actual
+barycentric velocity of the Earth rather than the use of
+canonical circular-orbit models.
+
+The annual aberration is the aberration correction for
+an imaginary observer at the Earth's centre.
+The motion of a real observer around the Earth's rotation axis in
+the course of the day makes a small extra contribution to the total
+aberration effect called the {\it diurnal aberration}.  Its
+maximum amplitude is about \arcsec{0}{3}.
+
+No SLALIB routine is provided for calculating the aberration on
+its own, though the required velocity vectors can be
+generated using
+sla\_EVP (or
+sla\_EPV)
+and
+sla\_GEOC.
+Annual and diurnal aberration are allowed for where required, for example in
+sla\_MAP
+{\it etc}.\ and
+sla\_AOP
+{\it etc}.  Note that this sort
+of aberration is different from the {\it planetary
+aberration}, which is the apparent displacement of a solar-system
+body, with respect to the ephemeris position, as a consequence
+of the motion of {\it both}\/ the Earth and the source.  The
+planetary aberration can be computed either by correcting the
+position of the solar-system body for light-time, followed by
+the ordinary stellar aberration correction, or more
+directly by expressing the position and velocity of the source
+in the observer's frame and correcting for light-time alone.
+
+\subsection{Different Sorts of Mean Place}
+A confusing aspect of the mean places used in the
+pre-ICRS era is that they
+are sensitive to the precise way they were determined.  A mean
+place is not directly observable, even with fundamental
+instruments such as transit circles, and to produce one
+will involve relying on some existing star catalogue,
+for example the fundamental catalogues FK4 and FK5,
+and applying given mathematical models of precession, nutation,
+aberration and so on.
+Note in particular that no star catalogue,
+even a fundamental catalogue such as FK4 or
+FK5, defines a coordinate system, strictly speaking;
+it is merely a list of star positions and proper motions.
+However, once the stars from a given catalogue
+are used as position calibrators, {\it e.g.}\ for
+transit-circle observations or for plate reductions, then a
+broader sense of there being a coordinate grid naturally
+arises, and such phrases as ``in the system of
+the FK4'' can legitimately be employed.  However,
+there is no formal link between the
+two concepts -- no ``standard least squares fit'' between
+reality and the inevitably flawed catalogues.
+All such
+catalogues suffer at some level from systematic, zonal distortions
+of both the star positions and of the proper motions,
+and include measurement errors peculiar to individual
+stars.
+
+Many of these complications are of little significance except to
+specialists.  However, observational astronomers cannot
+escape exposure to at least the two main varieties of
+mean place, loosely called
+FK4 and FK5, and should be aware of
+certain pitfalls.  For most practical purposes the more recent
+system, FK5, is free of surprises and tolerates naive
+use well.  FK4, in contrast, contains two important traps:
+\begin{itemize}
+\item The FK4 system rotates at about
+      \arcsec{0}{5} per century relative to distant galaxies.
+      This is manifested as a systematic distortion in the
+      proper motions of all FK4-derived catalogues, which will
+      in turn pollute any astrometry done using those catalogues.
+      For example, FK4-based astrometry of a QSO using plates
+      taken decades apart will reveal a non-zero {\it fictitious proper
+      motion}, and any FK4 star which happens to have zero proper
+      motion is, in fact, slowly moving against the distant
+      background.  The FK4 frame rotates because it was
+      established before the nature of the Milky Way, and hence the
+      existence of systematic motions of nearby stars, had been
+      recognized.
+\item Star positions in the FK4 system are part-corrected for
+      annual aberration (see above) and embody the so-called
+      E-terms of aberration.
+\end{itemize}
+The change from the old FK4-based system to FK5
+occurred at the beginning
+of 1984 as part of a package of resolutions made by the IAU in 1976,
+along with the adoption of J2000 as the reference epoch.  Star
+positions in the newer, FK5, system are free from the E-terms, and
+the system is a much better approximation to an
+inertial frame -- about five times better (and ICRS is hundreds
+of times better still).
+
+It may occasionally be convenient to specify the FK4 fictitious proper
+motion directly.  In FK4, the centennial proper motion of (for example)
+a QSO is:
+
+$\mu_\alpha=-$\tsec{0}{015869}$
+          +(($\tsec{0}{029032}$~\sin \alpha
+            +$\tsec{0}{000340}$~\cos \alpha ) \sin \delta
+            -$\tsec{0}{000105}$~\cos \alpha
+            -$\tsec{0}{000083}$~\sin \alpha ) \sec \delta $ \\
+$\mu_\delta\,=+$\arcsec{0}{43549}$~\cos \alpha
+              -$\arcsec{0}{00510}$~\sin \alpha +
+              ($\arcsec{0}{00158}$~\sin \alpha
+              -$\arcsec{0}{00125}$~\cos \alpha ) \sin \delta
+              -$\arcsec{0}{00066}$~\cos \delta $
+
+\subsection{Mean Place Transformations}
+Figure~1 is based upon three varieties of mean \radec\ all of which are
+of practical significance to observing astronomers in the present era:
+\begin{itemize}
+   \item Old style (FK4) with known proper motion in the FK4
+         system, and with parallax and radial velocity either
+         known or assumed zero.
+   \item Old style (FK4) with zero proper motion in FK5,
+         and with parallax and radial velocity assumed zero.
+   \item New style (FK5 or, loosely, ICRS)
+         with proper motion, parallax and
+         radial velocity either known or assumed zero.
+\end{itemize}
+The figure outlines the steps required to convert positions in
+any of these systems to a J2000 \radec\ for the current
+epoch, as might be required in a telescope-control
+program for example.
+Most of the steps can be carried out by calling a single
+SLALIB routine;  there are other SLALIB routines which
+offer set-piece end-to-end transformation routines for common cases.
+Note, however, that SLALIB does not set out to provide the capability
+for arbitrary transformations of star-catalogue data
+between all possible systems of mean \radec.
+Only in the (common) cases of FK4, equinox and epoch B1950,
+to FK5, equinox and epoch J2000, and {\it vice versa}\/ are
+proper motion, parallax and radial velocity transformed
+along with the star position itself, the
+focus of SLALIB support.
+
+As an example of using SLALIB to transform mean places, here is
+Fortran code that implements the top-left path of Figure~1.
+An FK4 \radec\ of arbitrary equinox and epoch and with
+known proper motion and
+parallax is transformed into an FK5 J2000 \radec\ for the current
+epoch.  As a test star we will use $\alpha=$\hms{16}{09}{55}{13},
+$\delta=$\dms{-75}{59}{27}{2}, equinox 1900, epoch 1963.087,
+$\mu_\alpha=$\tsec{-0}{0312}$/y$, $\mu_\delta=$\arcsec{+0}{103}$/y$,
+parallax = \arcsec{0}{062}, radial velocity = $-34.22$~km/s.  The
+date of observation is 1994.35.
+\goodbreak
+\begin{verbatim}
+            IMPLICIT NONE
+            DOUBLE PRECISION AS2R,S2R
+            PARAMETER (AS2R=4.8481368110953599D-6,S2R=7.2722052166430399D-5)
+            INTEGER J,I
+            DOUBLE PRECISION R0,D0,EQ0,EP0,PR,PD,PX,RV,EP1,R1,D1,R2,D2,R3,D3,
+           :                 R4,D4,R5,D5,R6,D6,EP1D,EP1B,W(3),EB(3),PXR,V(3)
+            DOUBLE PRECISION sla_EPB,sla_EPJ2D
+
+      *  RA, Dec etc of example star
+            CALL sla_DTF2R(16,09,55.13D0,R0,J)
+            CALL sla_DAF2R(75,59,27.2D0,D0,J)
+            D0=-D0
+            EQ0=1900D0
+            EP0=1963.087D0
+            PR=-0.0312D0*S2R
+            PD=+0.103D0*AS2R
+            PX=0.062D0
+            RV=-34.22D0
+            EP1=1994.35D0
+
+      *  Epoch of observation as MJD and Besselian epoch
+            EP1D=sla_EPJ2D(EP1)
+            EP1B=sla_EPB(EP1D)
+
+      *  Space motion to the current epoch
+            CALL sla_PM(R0,D0,PR,PD,PX,RV,EP0,EP1B,R1,D1)
+
+      *  Remove E-terms of aberration for the original equinox
+            CALL sla_SUBET(R1,D1,EQ0,R2,D2)
+
+      *  Precess to B1950
+            R3=R2
+            D3=D2
+            CALL sla_PRECES('FK4',EQ0,1950D0,R3,D3)
+
+      *  Add E-terms for the standard equinox B1950
+            CALL sla_ADDET(R3,D3,1950D0,R4,D4)
+
+      *  Transform to J2000, no proper motion
+            CALL sla_FK45Z(R4,D4,EP1B,R5,D5)
+
+      *  Parallax
+            CALL sla_EVP(sla_EPJ2D(EP1),2000D0,W,EB,W,W)
+            PXR=PX*AS2R
+            CALL sla_DCS2C(R5,D5,V)
+            DO I=1,3
+               V(I)=V(I)-PXR*EB(I)
+            END DO
+            CALL sla_DCC2S(V,R6,D6)
+             :
+\end{verbatim}
+\goodbreak
+It is interesting to look at how the \radec\ changes during the
+course of the calculation:
+\begin{tabbing}
+xxxxxxxxxxxxxx \= xxxxxxxxxxxxxxxxxxxxxxxxx \= x \= \kill
+\> {\tt 16 09 55.130 -75 59 27.20} \> \> {\it original equinox and epoch} \\
+\> {\tt 16 09 54.155 -75 59 23.98} \> \> {\it with space motion} \\
+\> {\tt 16 09 54.229 -75 59 24.18} \> \> {\it with old E-terms removed} \\
+\> {\tt 16 16 28.213 -76 06 54.57} \> \> {\it precessed to 1950.0} \\
+\> {\tt 16 16 28.138 -76 06 54.37} \> \> {\it with new E-terms} \\
+\> {\tt 16 23 07.901 -76 13 58.87} \> \> {\it J2000, current epoch} \\
+\> {\tt 16 23 07.907 -76 13 58.92} \> \> {\it including parallax}
+\end{tabbing}
+
+Other remarks about the above (unusually complicated) example:
+\begin{itemize}
+\item If the original equinox and epoch were B1950, as is quite
+      likely, then it would be unnecessary to treat space motions
+      and E-terms explicitly.  Transformation to FK5 J2000 could
+      be accomplished simply by calling
+sla\_FK425, after which
+      a call to
+sla\_PM and the parallax code would complete the
+      work.
+\item The rigorous treatment of the E-terms
+      has only a small effect on the result.  Such refinements
+      are, nevertheless, worthwhile in order to facilitate comparisons and
+      to increase the chances that star positions from different
+      suppliers are compatible.
+\item The FK4 to FK5 transformations,
+sla\_FK425
+      and
+sla\_FK45Z,
+      are not as is sometimes assumed simply 50 years of precession,
+      though this indeed accounts for most of the change.  The
+      transformations also include adjustments
+      to the equinox, a revised precession model, elimination of the
+      E-terms, a change to the proper-motion time unit and so on.
+      The reason there are two routines rather than just one
+      is that the FK4 frame rotates relative to the background, whereas
+      the FK5 frame is a much better approximation to an
+      inertial frame, and zero proper
+      motion in FK4 does not, therefore, mean zero proper motion in FK5.
+      SLALIB also provides two routines,
+sla\_FK524
+      and
+sla\_FK54Z,
+      to perform the inverse transformations.
+\item Some star catalogues (FK4 itself is one) were constructed using slightly
+      different procedures for the polar regions compared with
+      elsewhere.  SLALIB ignores this inhomogeneity and always
+      applies the standard
+      transformations, irrespective of location on the celestial sphere.
+\end{itemize}
+
+\subsection {Mean Place to Apparent Place}
+The {\it geocentric apparent place}\/ of a source, or {\it apparent place}\/
+for short,
+is the \radec\ if viewed from the centre of the Earth,
+with respect to the true equator and equinox of date.
+Transformation of an FK5 mean \radec, equinox J2000,
+current epoch, to apparent place involves the following effects:
+\goodbreak
+\begin{itemize}
+   \item Light deflection -- the gravitational lens effect of
+         the sun.
+   \item Annual aberration.
+   \item Precession-nutation.
+\end{itemize}
+The {\it light deflection}\/ is seldom significant.  Its value
+at the limb of the Sun is about
+\arcsec{1}{74};  it falls off rapidly with distance from the
+Sun and has shrunk to about
+\arcsec{0}{02} at an elongation of $20^\circ$.
+
+As already described, the {\it annual aberration}\/
+is a function of the Earth's velocity
+relative to the solar system barycentre (available through the
+SLALIB routines
+sla\_EVP and
+sla\_EPV)
+and produces shifts of up to about \arcsec{20}{5}.
+
+The {\it precession-nutation}, from J2000 to the current epoch, is
+expressed by a rotation matrix which is available through the
+SLALIB routine
+sla\_PRENUT.
+
+The whole mean-to-apparent transformation can be done using the SLALIB
+routine
+sla\_MAP.  As a demonstration, here is a program which lists the
+{\it North Polar Distance}\/ ($90^\circ-\delta$) of Polaris for
+the decade of closest approach to the Pole:
+\goodbreak
+\begin{verbatim}
+            IMPLICIT NONE
+            DOUBLE PRECISION PI,PIBY2,D2R,S2R,AS2R
+            PARAMETER (PI=3.141592653589793238462643D0)
+            PARAMETER (D2R=PI/180D0,
+           :           PIBY2=PI/2D0,
+           :           S2R=PI/(12D0*3600D0),
+           :           AS2R=PI/(180D0*3600D0))
+            DOUBLE PRECISION RM,DM,PR,PD,DATE,RA,DA
+            INTEGER J,IDS,IDE,ID,IYMDF(4),I
+
+            CALL sla_DTF2R(02,31,49.8131D0,RM,J)
+            CALL sla_DAF2R(89,15,50.661D0,DM,J)
+            PR=+21.7272D0*S2R/100D0
+            PD=-1.571D0*AS2R/100D0
+            WRITE (*,'(1X,'//
+           :            '''Polaris north polar distance (deg) 2096-2105''/)')
+            WRITE (*,'(4X,''Date'',7X''NPD''/)')
+            CALL sla_CLDJ(2096,1,1,DATE,J)
+            IDS=NINT(DATE)
+            CALL sla_CLDJ(2105,12,31,DATE,J)
+            IDE=NINT(DATE)
+            DO ID=IDS,IDE,10
+               DATE=DBLE(ID)
+               CALL sla_DJCAL(0,DATE,IYMDF,J)
+               CALL sla_MAP(RM,DM,PR,PD,0D0,0D0,2000D0,DATE,RA,DA)
+               WRITE (*,'(1X,I4,2I3.2,F9.5)') (IYMDF(I),I=1,3),(PIBY2-DA)/D2R
+            END DO
+
+            END
+\end{verbatim}
+\goodbreak
+For cases where the transformation has to be repeated for different
+times or for more than one star, the straightforward
+sla\_MAP
+approach is apt to be
+wasteful as both the Earth velocity and the
+precession-nutation matrix can be re-calculated relatively
+infrequently without ill effect.  A more efficient method is to
+perform the target-independent calculations only when necessary,
+by calling
+sla\_MAPPA,
+and then to use either
+sla\_MAPQKZ,
+when only the \radec\/ is known, or
+sla\_MAPQK,
+when full catalogue positions, including proper motion, parallax and
+radial velocity, are available.  How frequently to call
+sla\_MAPPA
+depends on the accuracy objectives;  once per
+night will deliver sub-arcsecond accuracy for example.
+
+The routines
+sla\_AMP
+and
+sla\_AMPQK
+allow the reverse transformation, from apparent to mean place.
+
+\subsection{Apparent Place to Observed Place}
+The {\it observed place}\/ of a source is its position as
+seen by a perfect theodolite at the location of the
+observer.  Transformation of an apparent \radec\ to observed
+place involves the following effects:
+\goodbreak
+\begin{itemize}
+   \item \radec\ to \hadec.
+   \item Diurnal aberration.
+   \item \hadec\ to \azel.
+   \item Refraction.
+\end{itemize}
+The transformation from apparent \radec\ to
+apparent \hadec\ is made by allowing for
+{\it Earth rotation}\/ through the {\it sidereal time}, $\theta$:
+\[ h = \theta - \alpha \]
+For this equation to work, $\alpha$ must be the apparent right
+ascension for the time of observation, and $\theta$ must be
+the {\it local apparent sidereal time}.  The latter is obtained
+as follows:
+\begin{enumerate}
+\item from civil time obtain the coordinated universal time, UTC
+      (more later on this);
+\item add the UT1$-$UTC (typically a few tenths of a second) to
+      give the UT;
+\item from the UT compute the Greenwich mean sidereal time (using
+sla\_GMST);
+\item add the observer's (east) longitude, giving the local mean
+      sidereal time;
+\item add the equation of the equinoxes (using
+sla\_EQEQX).
+\end{enumerate}
+The {\it equation of the equinoxes}\/~($=\Delta\psi\cos\epsilon$ plus
+small terms)
+is the effect of nutation on the sidereal time.
+Its value is typically a second or less.  It is
+interesting to note that if the object of the exercise is to
+transform a mean place all the way into an observed place (very
+often the case),
+then the equation of the
+equinoxes and the longitude component of nutation can both be
+omitted, removing a great deal of computation.  However, SLALIB
+follows the normal convention and  works {\it via}\/ the apparent place.
+
+Note that for very precise work the observer's longitude should
+be corrected for {\it polar motion}.  This can be done with
+sla\_POLMO.
+The corrections are always less than about \arcsec{0}{3}, and
+are futile unless the position of the observer's telescope is known
+to better than a few metres.
+
+Tables of observed and
+predicted UT1$-$UTC corrections and polar motion data
+are published every few weeks by the International Earth Rotation Service.
+
+The transformation from apparent \hadec\ to {\it topocentric}\/
+\hadec\ consists of allowing for
+{\it diurnal aberration}.  This effect, maximum amplitude \arcsec{0}{2},
+was described earlier.  There is no specific SLALIB routine
+for computing the diurnal aberration,
+though the routines
+sla\_AOP {\it etc.}\
+include it, and the required velocity vector can be
+determined by calling
+sla\_GEOC.
+
+The next stage is the major coordinate rotation from local equatorial
+coordinates \hadec\ into horizon coordinates.  The SLALIB routines
+sla\_E2H
+{\it etc.}\ can be used for this.  For high-precision
+applications the mean geodetic latitude should be corrected for polar
+motion.
+
+\subsubsection{Refraction}
+The final correction is for atmospheric refraction.
+This effect, which depends on local meteorological conditions and
+the effective colour of the source/detector combination,
+increases the observed elevation of the source by a
+significant effect even at moderate zenith distances, and near the
+horizon by over \degree{0}{5}.  The amount of refraction can by
+computed by calling the SLALIB routine
+sla\_REFRO;
+however,
+this requires as input the observed zenith distance, which is what
+we are trying to predict.  For high precision it is
+therefore necessary to iterate, using the topocentric
+zenith distance as the initial estimate of the
+observed zenith distance.
+
+The full
+sla\_REFRO refraction calculation is onerous, and for
+zenith distances of less than, say, $75^{\circ}$ the following
+model can be used instead:
+
+\[ \zeta _{vac} \approx \zeta _{obs}
+                     + A \tan \zeta _{obs}
+                     + B \tan ^{3}\zeta _{obs} \]
+where $\zeta _{vac}$ is the topocentric
+zenith distance (i.e.\ {\it in vacuo}),
+$\zeta _{obs}$ is the observed
+zenith distance (i.e.\ affected by refraction), and $A$ and $B$ are
+constants, about \arcseci{60}
+and \arcsec{-0}{06} respectively for a sea-level site.
+The two constants can be calculated for a given set of conditions
+by calling either
+sla\_REFCO or
+sla\_REFCOQ.
+
+sla\_REFCO works by calling
+sla\_REFRO for two zenith distances and fitting $A$ and $B$
+to match.  The calculation is onerous, but delivers accurate
+results whatever the conditions.
+sla\_REFCOQ uses a direct formulation of $A$ and $B$ and
+is much faster;  it is slightly less accurate than
+sla\_REFCO but more than adequate for most practical purposes.
+
+Like the full refraction model, the two-term formulation works in the wrong
+direction for our purposes, predicting
+the {\it in vacuo}\/ (topocentric) zenith distance
+given the refracted (observed) zenith distance,
+rather than {\it vice versa}.  The obvious approach of
+interchanging $\zeta _{vac}$ and $\zeta _{obs}$ and
+reversing the signs, though approximately
+correct, gives avoidable errors which are just significant in
+some applications;  for
+example about \arcsec{0}{2} at $70^\circ$ zenith distance.  A
+much better result can easily be obtained, by using one Newton-Raphson
+iteration as follows:
+
+\[ \zeta _{obs} \approx \zeta _{vac}
+    - \frac{A \tan \zeta _{vac} + B \tan ^{3}\zeta _{vac}}
+    {1 + ( A + 3 B \tan ^{2}\zeta _{vac} ) \sec ^{2}\zeta _{vac}}\]
+
+The effect of refraction can be applied to an unrefracted
+zenith distance by calling
+sla\_REFZ or to an unrefracted
+\xyz\ by calling
+sla\_REFV.
+Over most of the sky these two routines deliver almost identical
+results, but beyond $\zeta=83^\circ$
+sla\_REFV
+becomes unacceptably inaccurate while
+sla\_REFZ
+remains usable.  (However
+sla\_REFV
+is significantly faster, which may be important in some applications.)
+SLALIB also provides a routine for computing the airmass, the function
+sla\_AIRMAS.
+
+The refraction ``constants'' returned by
+sla\_REFCO and
+sla\_REFCOQ
+are slightly affected by colour, especially at the blue end
+of the spectrum.  Where values for more than one
+wavelength are needed, rather than calling
+sla\_REFCO
+several times it is more efficient to call
+sla\_REFCO
+just once, for a selected ``base'' wavelength, and then to call
+sla\_ATMDSP
+once for each wavelength of interest.
+
+All the SLALIB refraction routines work for radio wavelengths as well
+as the optical/IR band.  The radio refraction is very dependent on
+humidity, and an accurate value must be supplied.  There is no
+wavelength dependence, however.  The choice of optical/IR or
+radio is made by specifying a wavelength greater than $100\mu {\rm m}$
+for the radio case.
+
+\subsubsection{Efficiency considerations}
+The complete apparent place to observed place transformation
+can be carried out by calling
+sla\_AOP.
+For improved efficiency
+in cases of more than one star or a sequence of times, the
+target-independent calculations can be done once by
+calling
+sla\_AOPPA,
+the time can be updated by calling
+sla\_AOPPAT,
+and
+sla\_AOPQK
+can then be used to perform the
+apparent-to-observed transformation.  The reverse transformation
+is available through
+sla\_OAP
+and
+sla\_OAPQK.
+({\it n.b.}\ These routines use accurate but computationally-expensive
+refraction algorithms for zenith distances beyond about $76^\circ$.
+For many purposes, in-line code tailored to the accuracy requirements
+of the application will be preferable, for example ignoring
+polar motion,
+omitting diurnal aberration and using
+sla\_REFZ
+to apply the refraction.)
+
+\subsection{The Hipparcos Catalogue and the ICRS}
+With effect from the beginning of 1998, the IAU adopted a new
+reference system to replace FK5 J2000.  The new system, called the
+International Celestial Reference System (ICRS), differs profoundly
+from all predecessors in that the link with solar-system dynamics
+was broken;  the ICRS axes are defined in terms of the coordinates
+of a set of extragalactic sources, not in terms of the mean equator and
+equinox at a given reference epoch.  Although the ICRS and FK5 coordinates
+of any given object are almost the same, the orientation of the new frame
+was essentially arbitrary, and the close match to FK5 J2000 was contrived
+purely for reasons of continuity and convenience.
+
+A distinction is made between the reference {\it system}\/ (the ICRS)
+and {\it frame}\/ (ICRF).  The ICRS is the set of prescriptions and
+conventions together with the modelling required to define, at any
+time, a triad of axes.  The ICRF is a practical realization, and
+currently consists of a catalogue of equatorial coordinates for 608
+extragalactic radio sources observed by VLBI.
+
+The best optical realization of the ICRF currently available is the
+Hipparcos catalogue.  The extragalactic sources were not directly
+observable by the Hipparcos satellite and so the link from Hipparcos
+to ICRF was established through a variety of indirect techniques: VLBI and
+conventional interferometry of radio stars, photographic astrometry
+and so on.  The Hipparcos frame is aligned to the ICRF to within about
+0.5~mas and 0.5~mas/year (at epoch 1991.25).
+
+The Hipparcos catalogue includes all of the FK5 stars, which has enabled
+the orientation and spin of the latter to be studied.  At epoch J2000,
+the misalignment of the FK5 frame with respect to Hipparcos
+(and hence ICRS) are about 32~mas and 1~mas/year respectively.
+Consequently, for many practical purposes, including pointing
+telescopes, the IAU 1976-1982 conventions on reference frames and
+Earth orientation remain adequate and there is no need to change to
+Hipparcos coordinates, new precession-nutation models and so on.
+However, for the most exacting astrometric applications, SLALIB
+provides some support for Hipparcos coordinates in the form of
+four new routines:
+sla\_FK52H and
+sla\_H2FK5,
+which transform FK5 positions and proper motions to the Hipparcos frame
+and {\it vice versa,}\/ and
+sla\_FK5HZ and
+sla\_HFK5Z,
+where the transformations are for stars whose Hipparcos proper motion is
+zero.
+
+Further information on the ICRS can be found in the paper by M.\,Feissel
+and F.\,Mignard, Astron.\,Astrophys. 331, L33-L36 (1988).
+
+\subsection{Time Scales}
+
+SLALIB provides for transformation between several time scales, and involves
+use of one or two others.  The full list is as follows:
+\begin{itemize}
+\item TAI: International Atomic Time
+\item UTC: Coordinated Universal Time
+\item TT: Terrestrial Time
+\item TDB: Barycentric Dynamical Time.
+\item UT: Universal Time
+\item GMST: Greenwich mean sidereal time
+\item GAST (or GST): Greenwich apparent sidereal time.
+\item LAST: local apparent sidereal time
+\end{itemize}
+Strictly speaking, UT and the sidereal times are not {\it times}\/ in
+the physics sense, but {\it angles}\/ that describe Earth rotation.
+
+Three obsolete time scales should be mentioned here to avoid confusion.
+\begin{itemize}
+\item GMT: Greenwich Mean Time -- can mean either UTC or UT.
+\item ET: Ephemeris Time -- more or less the same as either TT or TDB.
+\item TDT: Terrestrial Dynamical Time -- former name of TT.
+\end{itemize}
+
+time scales that have no SLALIB support at present:
+\begin{itemize}
+\item Any form of local civil time (BST, PDT {\it etc.})
+\item TCG: geocentric coordinate time.
+\item TCB: barycentric coordinate time.
+\end{itemize}
+
+\subsubsection{Atomic Time: TAI}
+{\it International Atomic Time,} TAI, is a ``laboratory''
+time scale with no link to astronomical observations
+except in an historical sense.  Its
+unit is the SI second, which is defined in terms of a
+specific number
+of wavelengths of the radiation produced by a certain electronic
+transition in the caesium 133 atom.  It
+is realized through a changing
+population of high-precision atomic clocks held
+at standards institutes in various countries.  There is an
+elaborate process of continuous intercomparison, leading to
+a weighted average of all the clocks involved.
+
+Though TAI shares the same second as the more familiar UTC, the
+two time scales are noticeably separated in epoch because of the
+build-up of leap seconds (see the next section).
+At the time of writing, UTC
+lags over half a minute behind TAI.
+
+For any given date, the difference TAI$-$UTC
+can be obtained by calling the SLALIB function
+sla\_DAT.
+Note, however, that an up-to-date copy of the function must be used if
+the most recent leap seconds are required.  For applications
+where this is critical, mechanisms independent of SLALIB
+and under local control must
+be set up;  in such cases
+sla\_DAT
+can be useful as an
+independent check, for test dates within the range of the
+available version.  Up-to-date information on TAI$-$UTC is available
+from {\tt ftp://maia.usno.navy.mil/ser7/tai-utc.dat}.
+
+\subsubsection{Universal Time: UT, UTC}
+\label{UTC}
+{\it Universal Time,} UT, or more specifically UT1,
+is in effect mean solar time and is really an expression
+of Earth rotation rather than a measure of time.
+Originally
+defined in terms of a point in the sky called ``the fictitious
+mean Sun'', UT is now defined through its relationship
+with Earth rotation angle
+(formerly sidereal time).
+Because the Earth's rotation rate is slightly irregular and
+gradually decreasing,\footnote{The Earth is slowing
+down because of tidal effects.  The SI
+second reflects the length-of-day in the mid-19th century, when
+the astronomical observations that established modern timekeeping
+were being made.  Since then,
+the average length-of-day has increased by roughly 2~ms.
+Superimposed in this gradual slowdown are
+variations (seasonal and decadal) that are geophysical in origin,
+notably due to large scale movements of water and atmosphere.
+Because of
+conservation of angular momentum, as the Earth's rotation-rate
+decreases, the Moon moves farther away.  In 50 billion years the
+distance of the Moon will be at a maximum, 44\% greater than now, at
+which stage day and month will both equal 47 present days.}
+the UT second is not precisely
+matched to the SI second.  This makes UT itself unsuitable for
+use as a time scale.
+
+That role is instead taken by
+{\it Coordinated Universal Time,} UTC, which is clock-based and
+is the foundation of civil timekeeping.
+Most time zones differ from UTC by an integer number
+of hours, though a few ({\it e.g.}\ parts of Canada and Australia) differ
+by $n+0.5$~hours.  Since its introduction, UTC has been kept
+roughly in step with UT by a variety of adjustments that are
+agreed in advance and then carried out in a coordinated manner by
+the timekeeping communities of different countries---hence the
+name.  Though rate
+changes were used in the past, nowadays all such adjustments
+are made by occasionally inserting
+a whole second.  This procedure is called
+a {\it leap second}.  Because the day length is now slightly longer
+than 86400 SI seconds, a leap second amounts to stopping the UTC
+clock for a second to let the Earth catch up.
+
+You need UT1 in order to point a telescope or antenna at a
+celestial target.  To obtain it
+starting from UTC, you
+have to look up the value of UT1$-$UTC for the date concerned
+in tables published by the International Earth Rotation and
+reference frames
+Service;  this quantity, kept in the range
+$\pm$\tsec{0}{9} by means of leap
+seconds, is then added to the UTC.  The quantity UT1$-$UTC,
+which typically changes by of order 1~ms per day,
+can be obtained only by observation (VLBI using
+extragalactic radio sources), though seasonal trends
+are well known and the IERS listings are able to predict some way into
+the future with adequate accuracy for pointing telescopes.
+
+UTC leap seconds are introduced as necessary,
+usually at the end of December or June.
+Because on the average the solar day is slightly longer
+than the nominal 86,400~SI~seconds, leap seconds are always positive;
+however, provision exists for negative leap seconds if needed.
+The form of a leap second can be seen from the
+following description of the end of June~1994:
+
+\hspace{3em}
+\begin{tabular}{clrccc} \\
+     &      &    &   UTC    & UT1$-$UTC  &    UT1       \\ \\
+1994 & June & 30 & 23 59 58 & $-0.218$ & 23 59 57.782 \\
+     &      &    & 23 59 59 & $-0.218$ & 23 59 58.782 \\
+     &      &    & 23 59 60 & $-0.218$ & 23 59 59.782 \\
+     & July &  1 & 00 00 00 & $+0.782$ & 00 00 00.782 \\
+     &      &    & 00 00 01 & $+0.782$ & 00 00 01.782 \\
+\end{tabular}
+\goodbreak
+
+Note that UTC has to be expressed as hours, minutes and
+seconds (or at least in seconds for a given date) if leap seconds
+are to be taken into account in the
+correct manner.
+It is improper to express a UTC as a
+Julian Date, for example, because there will be an ambiguity
+during a leap second (in the above example,
+1994~June~30 \hms{23}{59}{60}{0} and
+1994~July~1 \hms{00}{00}{00}{0} would {\it both}\/ come out as
+MJD~49534.00000).  Although in the vast majority of
+cases this won't matter, there are potential problems in
+on-line data acquisition systems and in applications involving
+taking the difference between two times.  Note that although the functions
+sla\_DAT
+and
+sla\_DTT
+expect UTC in the form of an MJD, the meaning here is really a
+whole-number {\it date}\/ rather than a time.
+Though the functions will accept
+a fractional part and will almost always function correctly, on a day
+which ends with a leap
+second incorrect results would be obtained during the leap second
+itself because by then the MJD would have moved into the next day.
+
+\subsubsection{Sidereal Time: GMST, LAST {\it etc.}}
+Sidereal time is like the time of day but relative to the
+stars rather than to the Sun.  After
+one sidereal day the stars come back to the same place in the
+sky, apart from sub-arcsecond precession effects.  Because the Earth
+rotates faster relative to the stars than to the Sun by one day
+per year, the sidereal second is shorter than the solar
+second; the ratio is about 0.9973.
+
+The {\it Greenwich mean sidereal time,} GMST, is
+linked to UT1 by a numerical formula which
+is implemented in the SLALIB functions
+sla\_GMST
+and
+sla\_GMSTA.
+There are, of course, no leap seconds in GMST, but the sidereal
+second (measured in SI seconds)
+changes in length along with the UT1 second, and also varies
+over long periods of time because of slow changes in the Earth's
+orbit.  This makes sidereal time unsuitable for everything except
+predicting the apparent directions of celestial sources, in other
+words as an angle rather than a time.
+
+The {\it local apparent sidereal time,} LAST, is the apparent right
+ascension of the local meridian, from which the hour angle of any
+star can be determined knowing its right
+ascension.  LAST can be obtained from the
+GMST by adding the east longitude (corrected for polar motion
+in precise work) and the {\it equation of the equinoxes}.  The
+latter, already described, is an aspect of the nutation effect
+and can be predicted by calling the SLALIB function
+sla\_EQEQX
+or, neglecting certain very small terms, by calling
+sla\_NUTC
+and using the expression $\Delta\psi\cos\epsilon$.
+
+GAST, or plain GST, is GMST plus the equation of the equinoxes.
+
+\subsubsection{Dynamical Time: TT, TDB}
+Dynamical time (formerly Ephemeris Time, ET)
+is the independent variable in the theories
+which describe the motions of bodies in the solar system.  When
+using published formulae or
+tables that model the position of the
+Earth in its orbit, for example, or look up
+the Moon's position in a precomputed ephemeris, the date and time
+must be in terms of one of the dynamical time scales.  It
+is a common but understandable mistake to use UTC directly, in which
+case the results will be over a minute out (at the time of writing).
+
+It is not hard to see why such time scales are necessary.
+UTC would clearly be unsuitable as the argument of an
+ephemeris because of leap seconds.
+A solar-system ephemeris based on UT1 or sidereal time would somehow
+have to include the unpredictable variations of the Earth's rotation.
+TAI would work, but in principle
+the ephemeris and the ensemble of atomic clocks would
+eventually drift apart.
+In effect, the ephemeris {\it is}\/ a clock, with the bodies of
+the solar system the hands from which the ephemeris time is read.
+
+Only two of the dynamical time scales are of any great importance to
+observational astronomers, TT and TDB.
+
+{\it Terrestrial Time,} TT, is
+the theoretical time scale of apparent geocentric ephemerides of solar
+system bodies.  It applies to clocks at sea-level, and for practical purposes
+it is tied to
+Atomic Time TAI through the formula TT~$=$~TAI~$+$~\tsec{32}{184}.
+In practice, therefore, the units of TT are ordinary SI seconds, and
+the offset of \tsec{32}{184} with respect to TAI is fixed.
+The SLALIB function
+sla\_DTT
+returns TT$-$UTC for a given UTC
+({\it n.b.}~sla\_DTT
+calls
+sla\_DTT,
+and the latter must be an up-to-date version if recent leap seconds are
+to be taken into account).
+
+{\it Barycentric Dynamical Time,} TDB, is a
+{\it coordinate time,} suitable
+for labelling events that are most simply described in a context
+where the bodies of the solar system
+are absent.  Applications include
+the emission of pulsar radiation and the motions of the
+solar-system bodies themselves.  When the readings of the
+observer's TT clock are labelled using such a
+coordinate time, differences
+are seen because the clock is affected by its
+speed in the barycentric coordinate system
+and the gravitational potential in which it is immersed.  Equivalently,
+observations of pulsars
+expressed in TT would display similar variations (quite
+apart from the familiar light-time effects).
+
+TDB is defined in such a way that it keeps close to TT
+on the average, with the relativistic effects emerging as
+quasi-periodic differences of maximum amplitude rather less
+than 2\,ms.  This is
+negligible for many purposes, so that TT can act as
+a perfectly adequate surrogate for TDB in most cases,
+but unless taken into
+account would swamp
+long-term analysis of pulse arrival times from the
+millisecond pulsars.
+
+Most of the variation between TDB and TT comes from the ellipticity of
+the Earth's orbit;  the TT clock's speed and
+gravitational potential vary slightly
+during the course of the year, and as a consequence
+its rate as seen from an outside observer
+varies due to transverse Doppler effect and gravitational
+redshift.  The main component is a sinusoidal variation of
+amplitude \tsec{0}{0017};  higher harmonics, and terms
+caused by Moon and planets, lie two orders of magnitude below
+this dominant annual term.  Diurnal (topocentric) terms, a
+function of UT, are $2\,\mu$s or less.
+
+The IAU 1976 resolution defined TDB by
+stipulating that TDB$-$TT consists of periodic terms only.
+This provided
+a good qualitative description, but turned out to
+contain hidden assumptions about the form of the
+solar-system ephemeris and hence lacked dynamical
+rigour.  A later resolution, in 1991, introduced new
+coordinate time scales, TCG and TCB, and identified TDB as a
+linear transformation of one of them (TCB) with a rate
+chosen not to drift from TT on the average.  Unfortunately
+even this improved definition has proved to
+contin ambiguities.  The SLALIB
+sla\_RCC function implements TDB in the way that is
+most consistent with the 1976 definition and
+with existing practice.  It provides a model of
+TDB$-$TT accurate to a few nanoseconds.
+
+Unlike TDB, the IAU 1991 coordinate time scales TCG and TCB
+(not supported by SLALIB functions at present)
+do not have their rates adjusted to track TT and consequently
+gain on TT and TDB, by about
+\tsec{0}{02}/year and \tsec{0}{5}/year respectively.
+
+As already pointed out, the distinction between TT and TDB is
+of no practical importance for most purposes.  For
+example when calling
+sla\_PRENUT
+to generate a precession-nutation matrix, or when calling
+sla\_EVP or
+sla\_EPV
+to predict the
+Earth's position and velocity, the time argument is strictly
+TDB, but TT is entirely adequate and will require much
+less computation.
+
+The time scale used by the JPL solar-system ephemerides is called
+$T_{eph}$ and is numerically the same as TDB.
+
+Predictions of topocentric solar-system phenomena such as
+occultations and eclipses require solar time UT as well as dynamical
+time.  TT/TDB/ET is all that is required in order to compute the geocentric
+circumstances, but if horizon coordinates or geocentric parallax
+are to be tackled UT is also needed.  A rough estimate
+of $\Delta {\rm T} = {\rm ET} - {\rm UT}$ is
+available via the function
+sla\_DT.
+For a given epoch ({\it e.g.}\ 1650) this returns an approximation
+to $\Delta {\rm T}$ in seconds.
+
+
+
+
+\subsection{Calendars}
+The ordinary {\it Gregorian Calendar Date},
+together with a time of day, can be
+used to express an epoch in any desired time scale.  For many purposes,
+however, a continuous count of days is more convenient, and for
+this purpose the system of {\it Julian Day Number}\/ can be used.
+JD zero is located about 7000~years ago, well before the
+historical era, and is formally defined in terms of Greenwich noon;
+for example Julian Day Number 2449444 began at noon
+on 1994 April~1.  {\it Julian Date}\/
+is the same system but with a fractional part appended;
+Julian Date 2449443.5 was the midnight on which 1994 April~1
+commenced.  Because of the unwieldy size of Julian Dates
+and the awkwardness of the half-day offset, it is
+accepted practice to remove the leading `24' and the trailing `.5',
+producing what is called the {\it Modified Julian Date}:
+MJD~=~JD$-2400000.5$.  SLALIB routines use MJD, as opposed to
+JD, throughout, largely to avoid loss of precision.
+1994 April~1 commenced at MJD~49443.0.
+
+Despite JD (and hence MJD) being defined in terms of (in effect)
+UT, the system can be used in conjunction with other time scales
+such as TAI, TT and TDB (and even sidereal time through the
+concept of {\it Greenwich Sidereal Date}).  However, it is improper
+to express a UTC as a JD or MJD because of leap seconds.
+
+SLALIB has six routines for converting to and from dates in
+the Gregorian calendar.  The routines
+sla\_CLDJ
+and
+sla\_CALDJ
+both convert a calendar date into an MJD, the former interpreting
+years between 0 and 99 as 1st century and the latter as late 20th or
+early 21st century.  The routines sla\_DJCL
+and
+sla\_DJCAL
+both convert an MJD into calendar year, month, day and fraction of a day;
+the latter performs rounding to a specified precision, important
+to avoid dates like `{\tt 2005 04 01.***}' appearing in messages.
+Some of SLALIB's low-precision ephemeris routines
+(sla\_EARTH,
+sla\_MOON
+and
+sla\_ECOR)
+work in terms of year plus day-in-year (where
+day~1~=~January~1st, at least for the modern era).
+This form of date can be generated by
+calling
+sla\_CALYD
+(which defaults years 0-99 into 1950-2049)
+or
+sla\_CLYD
+(which covers the full range from prehistoric times).
+
+\subsection{Geocentric Coordinates}
+The location of the observer on the Earth is significant in a
+number of ways.  The most obvious, of course, is the effect of
+longitude and latitude
+on the observed \azel\ of a star.  Less obvious is the need to
+allow for geocentric parallax when finding the Moon with a
+telescope (and when doing high-precision work involving the
+Sun or planets), and the need to correct observed radial
+velocities and apparent pulsar periods for the effects
+of the Earth's rotation.
+
+The SLALIB routine
+sla\_OBS
+supplies details of groundbased observatories from an internal
+list.  This is useful when writing applications that apply to
+more than one observatory;  the user can enter a brief name,
+or browse through a list, and be spared the trouble of typing
+in the full latitude, longitude {\it etc}.  The following
+Fortran code returns the full name, longitude and latitude
+of a specified observatory:
+\goodbreak
+\begin{verbatim}
+            CHARACTER IDENT*10,NAME*40
+            DOUBLE PRECISION W,P,H
+             :
+            CALL sla_OBS(0,IDENT,NAME,W,P,H)
+            IF (NAME.EQ.'?') ...             (not recognized)
+\end{verbatim}
+\goodbreak
+(Beware of the longitude sign convention, which is west +ve
+for historical reasons.)  The following lists all
+the supported observatories:
+\goodbreak
+\begin{verbatim}
+             :
+            INTEGER N
+             :
+            N=1
+            NAME=' '
+            DO WHILE (NAME.NE.'?')
+               CALL sla_OBS(N,IDENT,NAME,W,P,H)
+               IF (NAME.NE.'?') THEN
+                  WRITE (*,'(1X,I3,4X,A,4X,A)') N,IDENT,NAME
+                  N=N+1
+               END IF
+            END DO
+\end{verbatim}
+\goodbreak
+The routine
+sla\_GEOC
+converts a {\it geodetic latitude}\/
+(one referred to the local horizon) to a geocentric position,
+taking into account the Earth's oblateness and also the height
+above sea level of the observer.  The results are expressed in
+vector form, namely as the distance of the observer from
+the spin axis and equator respectively.  The {\it geocentric
+latitude}\/ can be found be evaluating ATAN2 of the
+two numbers.  A full 3-D vector description of the position
+and velocity of the observer is available through the routine
+sla\_PVOBS.
+For a specified geodetic latitude, height above
+sea level, and local sidereal time,
+sla\_PVOBS
+generates a 6-element vector containing the position and
+velocity with respect to the true equator and equinox of
+date ({\it i.e.}\ compatible with apparent \radec).  For
+some applications it will be necessary to convert to a
+mean \radec\ frame (notably FK5, J2000) by multiplying
+elements 1-3 and 4-6 respectively with the appropriate
+precession matrix.  (In theory an additional correction to the
+velocity vector is needed to allow for differential precession,
+but this correction is always negligible.)
+
+See also the discussion of the routine
+sla\_RVEROT,
+later.
+
+\label{ephem}
+\subsection{Ephemerides}
+SLALIB includes routines for generating positions and
+velocities of Solar-System bodies.  The accuracy objectives are
+modest, and the SLALIB facilities do not attempt
+to compete with precomputed ephemerides such as
+those provided by JPL, or with models containing
+thousands of terms.  It is also worth noting
+that SLALIB's very accurate star coordinate conversion
+routines are not strictly applicable to solar-system cases,
+though they are adequate for most practical purposes.
+
+Earth/Sun ephemerides can be generated using the routines
+sla\_EVP and
+sla\_EPV,
+each of which predict Earth position and velocity with respect to both the
+solar-system barycentre and the
+Sun.  The two routines offer different trade-offs between
+accuracy and execution time.  For most purposes,
+sla\_EVP is adequate:
+maximum velocity error is 0.42~metres per second;  maximum
+heliocentric position error is 1600~km (equivalent to
+about \arcseci{2} at 1~AU), with
+barycentric position errors about 4 times worse.
+The larger and slower
+sla\_EPV
+delivers $3\sigma$ results of 0.005~metres per second in velocity
+and 15~km in position, and is particularly useful when predicting
+apparent directions of near-Earth objects.
+(The Sun's position as
+seen from the Earth can, of course, be obtained simply by
+reversing the signs of the Cartesian components of the
+Earth\,:\,Sun vector.)
+
+Geocentric Moon ephemerides are available from
+sla\_DMOON,
+which predicts the Moon's position and velocity with respect to
+the Earth's centre.  Direction accuracy is usually better than
+10~km (\arcseci{5}) and distance accuracy a little worse.
+
+Lower-precision but faster predictions for the Sun and Moon
+can be made by calling
+sla\_EARTH
+and
+sla\_MOON.
+Both are single precision and accept dates in the form of
+year, day-in-year and fraction of day
+(starting from a calendar date you need to call
+sla\_CLYD
+or
+sla\_CALYD
+to get the required year and day).
+The
+sla\_EARTH
+routine returns the heliocentric position and velocity
+of the Earth's centre for the mean equator and
+equinox of date.  The accuracy is better than 20,000~km in position
+and 10~metres per second in speed.
+The
+position and velocity of the Moon with respect to the
+Earth's centre for the mean equator and ecliptic of date
+can be obtained by calling
+sla\_MOON.
+The positional accuracy is better than \arcseci{30} in direction
+and 1000~km in distance.
+
+Approximate ephemerides for all the major planets
+can be generated by calling
+sla\_PLANET
+or
+sla\_RDPLAN.  These routines offer arcminute accuracy (much
+better for the inner planets and for Pluto) over a span of several
+millennia (but only $\pm100$ years for Pluto).
+The routine
+sla\_PLANET produces heliocentric position and
+velocity in the form of equatorial \xyzxyzd\ for the
+mean equator and equinox of J2000.  The vectors
+produced by
+sla\_PLANET
+can be used in a variety of ways according to the
+requirements of the application concerned.  The routine
+sla\_RDPLAN
+uses
+sla\_PLANET
+and
+sla\_DMOON
+to deal with the common case of predicting
+a planet's apparent \radec\ and angular size as seen by a
+terrestrial observer.
+
+Note that in predicting the position in the sky of a solar-system body
+it is necessary to allow for geocentric parallax.  This correction
+is {\it essential}\/ in the case of the Moon, where the observer's
+position on the Earth can affect the Moon's \radec\ by up to
+$1^\circ$.  The calculation can most conveniently be done by calling
+sla\_PVOBS and subtracting the resulting 6-vector from the
+one produced by
+sla\_DMOON, as is demonstrated by the following example:
+\goodbreak
+\begin{verbatim}
+      *  Demonstrate the size of the geocentric parallax correction
+      *  in the case of the Moon.  The test example is for the AAT,
+      *  before midnight, in summer, near first quarter.
+
+            IMPLICIT NONE
+            CHARACTER NAME*40,SH,SD
+            INTEGER J,I,IHMSF(4),IDMSF(4)
+            DOUBLE PRECISION SLONGW,SLAT,H,DJUTC,FDUTC,DJUT1,DJTT,STL,
+           :                 RMATN(3,3),PMM(6),PMT(6),RM,DM,PVO(6),TL
+            DOUBLE PRECISION sla_DTT,sla_GMST,sla_EQEQX,sla_DRANRM
+
+      *  Get AAT longitude and latitude in radians and height in metres
+            CALL sla_OBS(0,'AAT',NAME,SLONGW,SLAT,H)
+
+      *  UTC (1992 January 13, 11 13 59) to MJD
+            CALL sla_CLDJ(1992,1,13,DJUTC,J)
+            CALL sla_DTF2D(11,13,59.0D0,FDUTC,J)
+            DJUTC=DJUTC+FDUTC
+
+      *  UT1 (UT1-UTC value of -0.152 sec is from IERS Bulletin B)
+            DJUT1=DJUTC+(-0.152D0)/86400D0
+
+      *  TT
+            DJTT=DJUTC+sla_DTT(DJUTC)/86400D0
+
+      *  Local apparent sidereal time
+            STL=sla_GMST(DJUT1)-SLONGW+sla_EQEQX(DJTT)
+
+      *  Geocentric position/velocity of Moon (mean of date)
+            CALL sla_DMOON(DJTT,PMM)
+
+      *  Nutation to true equinox of date
+            CALL sla_NUT(DJTT,RMATN)
+            CALL sla_DMXV(RMATN,PMM,PMT)
+            CALL sla_DMXV(RMATN,PMM(4),PMT(4))
+
+      *  Report geocentric HA,Dec
+            CALL sla_DCC2S(PMT,RM,DM)
+            CALL sla_DR2TF(2,sla_DRANRM(STL-RM),SH,IHMSF)
+            CALL sla_DR2AF(1,DM,SD,IDMSF)
+            WRITE (*,'(1X,'' geocentric:'',2X,A,I2.2,2I3.2,''.'',I2.2,'//
+           :                              '1X,A,I2.2,2I3.2,''.'',I1)')
+           :                                                SH,IHMSF,SD,IDMSF
+
+      *  Geocentric position of observer (true equator and equinox of date)
+            CALL sla_PVOBS(SLAT,H,STL,PVO)
+
+      *  Place origin at observer
+            DO I=1,6
+               PMT(I)=PMT(I)-PVO(I)
+            END DO
+
+      *  Allow for planetary aberration
+            TL=499.004782D0*SQRT(PMT(1)**2+PMT(2)**2+PMT(3)**2)
+            DO I=1,3
+               PMT(I)=PMT(I)-TL*PMT(I+3)
+            END DO
+
+      *  Report topocentric HA,Dec
+            CALL sla_DCC2S(PMT,RM,DM)
+            CALL sla_DR2TF(2,sla_DRANRM(STL-RM),SH,IHMSF)
+            CALL sla_DR2AF(1,DM,SD,IDMSF)
+            WRITE (*,'(1X,''topocentric:'',2X,A,I2.2,2I3.2,''.'',I2.2,'//
+           :                              '1X,A,I2.2,2I3.2,''.'',I1)')
+           :                                                SH,IHMSF,SD,IDMSF
+            END
+\end{verbatim}
+\goodbreak
+The output produced is as follows:
+\goodbreak
+\begin{verbatim}
+       geocentric:  +03 06 55.55 +15 03 38.8
+      topocentric:  +03 09 23.76 +15 40 51.4
+\end{verbatim}
+\goodbreak
+(An easier but
+less instructive method of estimating the topocentric apparent place of the
+Moon is to call the routine
+sla\_RDPLAN.)
+
+As an example of using
+sla\_PLANET,
+the following program estimates the geocentric separation
+between Venus and Jupiter during a close conjunction
+in 2\,BC, which is a star-of-Bethlehem candidate:
+\goodbreak
+\begin{verbatim}
+      *  Compute time and minimum geocentric apparent separation
+      *  between Venus and Jupiter during the close conjunction of 2 BC.
+
+            IMPLICIT NONE
+
+            DOUBLE PRECISION SEPMIN,DJD0,FD,DJD,DJDM,PV(6),RMATP(3,3),
+           :                 PVM(6),PVE(6),TL,RV,DV,RJ,DJ,SEP
+            INTEGER IHOUR,IMIN,J,I,IHMIN,IMMIN
+            DOUBLE PRECISION sla_EPJ,sla_DSEP
+
+
+      *  Search for closest approach on the given day
+            DJD0=1720859.5D0
+            SEPMIN=1D10
+            DO IHOUR=20,22
+               DO IMIN=0,59
+                  CALL sla_DTF2D(IHOUR,IMIN,0D0,FD,J)
+
+      *        Julian date and MJD
+                  DJD=DJD0+FD
+                  DJDM=DJD-2400000.5D0
+
+      *        Earth to Moon (mean of date)
+                  CALL sla_DMOON(DJDM,PV)
+
+      *        Precess Moon position to J2000
+                  CALL sla_PRECL(sla_EPJ(DJDM),2000D0,RMATP)
+                  CALL sla_DMXV(RMATP,PV,PVM)
+
+      *        Sun to Earth-Moon Barycentre (mean J2000)
+                  CALL sla_PLANET(DJDM,3,PVE,J)
+
+      *        Correct from EMB to Earth
+                  DO I=1,3
+                     PVE(I)=PVE(I)-0.012150581D0*PVM(I)
+                  END DO
+
+      *        Sun to Venus
+                  CALL sla_PLANET(DJDM,2,PV,J)
+
+      *        Earth to Venus
+                  DO I=1,6
+                     PV(I)=PV(I)-PVE(I)
+                  END DO
+
+      *        Light time to Venus (sec)
+                  TL=499.004782D0*SQRT((PV(1)-PVE(1))**2+
+           :                           (PV(2)-PVE(2))**2+
+           :                           (PV(3)-PVE(3))**2)
+
+      *        Extrapolate backwards in time by that much
+                  DO I=1,3
+                     PV(I)=PV(I)-TL*PV(I+3)
+                  END DO
+
+      *        To RA,Dec
+                  CALL sla_DCC2S(PV,RV,DV)
+
+      *        Same for Jupiter
+                  CALL sla_PLANET(DJDM,5,PV,J)
+                  DO I=1,6
+                     PV(I)=PV(I)-PVE(I)
+                  END DO
+                  TL=499.004782D0*SQRT((PV(1)-PVE(1))**2+
+           :                           (PV(2)-PVE(2))**2+
+           :                           (PV(3)-PVE(3))**2)
+                  DO I=1,3
+                     PV(I)=PV(I)-TL*PV(I+3)
+                  END DO
+                  CALL sla_DCC2S(PV,RJ,DJ)
+
+      *        Separation (arcsec)
+                  SEP=sla_DSEP(RV,DV,RJ,DJ)
+
+      *        Keep if smallest so far
+                  IF (SEP.LT.SEPMIN) THEN
+                     IHMIN=IHOUR
+                     IMMIN=IMIN
+                     SEPMIN=SEP
+                  END IF
+               END DO
+            END DO
+
+      *  Report
+            WRITE (*,'(1X,I2.2,'':'',I2.2,F6.1)') IHMIN,IMMIN,
+           :                                      206264.8062D0*SEPMIN
+
+            END
+\end{verbatim}
+\goodbreak
+The output produced (the Ephemeris Time on the day in question, and
+the closest approach in arcseconds) is as follows:
+\goodbreak
+\begin{verbatim}
+      21:16  33.3
+\end{verbatim}
+\goodbreak
+For comparison, accurate JPL predictions
+give a separation \arcseci{8} less than
+the above estimate, occurring $30^{\rm m}$ earlier
+(see {\it Sky and Telescope,}\/ April~1987, p\,357).
+
+The following program demonstrates
+sla\_RDPLAN.
+\begin{verbatim}
+      *  For a given date, time and geographical location, output
+      *  a table of planetary positions and diameters.
+
+            IMPLICIT NONE
+            CHARACTER PNAMES(0:9)*7,B*80,S
+            INTEGER I,NP,IY,J,IM,ID,IHMSF(4),IDMSF(4)
+            DOUBLE PRECISION D15B2P,R2AS,FD,DJM,ELONG,PHI,RA,DEC,DIAM
+            PARAMETER (D15B2P=2.3873241463784300365D0,
+           :           R2AS=206264.80625D0)
+            DATA PNAMES / 'Sun','Mercury','Venus','Moon','Mars','Jupiter',
+           :              'Saturn','Uranus','Neptune', 'Pluto' /
+
+
+      *  Loop until 'end' typed
+            B=' '
+            DO WHILE (B.NE.'END'.AND.B.NE.'end')
+
+      *     Get date, time and observer's location
+               PRINT *,'Date? (Y,M,D, Gregorian)'
+               READ (*,'(A)') B
+               IF (B.NE.'END'.AND.B.NE.'end') THEN
+                  I=1
+                  CALL sla_INTIN(B,I,IY,J)
+                  CALL sla_INTIN(B,I,IM,J)
+                  CALL sla_INTIN(B,I,ID,J)
+                  PRINT *,'Time? (H,M,S, dynamical)'
+                  READ (*,'(A)') B
+                  I=1
+                  CALL sla_DAFIN(B,I,FD,J)
+                  FD=FD*D15B2P
+                  CALL sla_CLDJ(IY,IM,ID,DJM,J)
+                  DJM=DJM+FD
+                  PRINT *,'Longitude? (D,M,S, east +ve)'
+                  READ (*,'(A)') B
+                  I=1
+                  CALL sla_DAFIN(B,I,ELONG,J)
+                  PRINT *,'Latitude? (D,M,S, geodetic)'
+                  READ (*,'(A)') B
+                  I=1
+                  CALL sla_DAFIN(B,I,PHI,J)
+
+      *        Loop planet by planet
+                  DO NP=0,9
+
+      *           Get RA,Dec and diameter
+                     CALL sla_RDPLAN(DJM,NP,ELONG,PHI,RA,DEC,DIAM)
+
+      *           One line of report
+                     CALL sla_DR2TF(2,RA,S,IHMSF)
+                     CALL sla_DR2AF(1,DEC,S,IDMSF)
+                     WRITE (*,
+           : '(1X,A,2X,3I3.2,''.'',I2.2,2X,A,I2.2,2I3.2,''.'',I1,F8.1)')
+           :                          PNAMES(NP),IHMSF,S,IDMSF,R2AS*DIAM
+
+      *           Next planet
+                  END DO
+                  PRINT *,' '
+               END IF
+
+      *     Next case
+            END DO
+
+            END
+\end{verbatim}
+Entering the following data (for 1927~June~29 at $5^{\rm h}\,25^{\rm m}$~ET
+and the position of Preston, UK):
+\begin{verbatim}
+      1927 6 29
+      5 25
+      -2 42
+      53 46
+\end{verbatim}
+produces the following report:
+\begin{verbatim}
+      Sun       06 28 14.03  +23 17 17.3  1887.8
+      Mercury   08 08 58.60  +19 20 57.1     9.3
+      Venus     09 38 53.61  +15 35 32.8    22.8
+      Moon      06 28 15.95  +23 17 21.3  1902.3
+      Mars      09 06 49.33  +17 52 26.6     4.0
+      Jupiter   00 11 12.08  -00 10 57.5    41.1
+      Saturn    16 01 43.35  -18 36 55.9    18.2
+      Uranus    00 13 33.54  +00 39 36.1     3.5
+      Neptune   09 49 35.76  +13 38 40.8     2.2
+      Pluto     07 05 29.51  +21 25 04.2     0.1
+\end{verbatim}
+Inspection of the Sun and Moon data reveals that
+a total solar eclipse is in progress.
+
+SLALIB also provides for the case where orbital elements (with respect
+to the J2000 equinox and ecliptic)
+are available.  This allows predictions to be made for minor-planets and
+(if you ignore non-gravitational effects)
+comets.  Furthermore, if major-planet elements for an epoch close to the date
+in question are available, more accurate predictions can be made than
+are offered by
+sla\_RDPLAN and
+sla\_PLANET.
+
+The SLALIB planetary-prediction
+routines that work with orbital elements are
+sla\_PLANTE (the orbital-elements equivalent of
+sla\_RDPLAN), which predicts the topocentric \radec, and
+sla\_PLANEL (the orbital-elements equivalent of
+sla\_PLANET), which predicts the heliocentric \xyzxyzd\ with respect to the
+J2000 equinox and equator.  In addition, the routine
+sla\_PV2EL does the inverse of
+sla\_PLANEL, transforming \xyzxyzd\ into {\it osculating elements.}
+
+Osculating elements describe the unperturbed 2-body orbit.  Depending
+on accuracy requirements, this unperturbed orbit is an
+adequate approximation to the actual orbit for a few weeks either
+side of the specified epoch, outside which perturbations due to
+the other bodies of the Solar System lead to
+increasing errors.  Given a minor planet's osculating elements for
+a particular date, predictions for a date only
+100 days earlier or later
+are likely to be in error by several arcseconds.
+These errors can
+be reduced if new elements are generated which take account of
+the perturbations of the major planets, and this is what the routine
+sla\_PERTEL does.  Once
+sla\_PERTEL has been called, to provide osculating elements
+close to the required date, the elements can be passed to
+sla\_PLANEL or
+sla\_PLANTE in the normal way.  Predictions of arcsecond accuracy
+over a span of a decade or more are available using this
+technique.
+
+Three different combinations of orbital elements are
+provided for, matching the usual conventions
+for major planets, minor planets and
+comets respectively.  The choice is made through the
+argument {\tt JFORM}:
+
+\vspace{1ex}
+\hspace{3em}
+\begin{tabular}{|c|c|c|} \hline
+{\tt JFORM=1} & {\tt JFORM=2} & {\tt JFORM=3} \\
+\hline \hline
+$t_0$ & $t_0$ & $T$ \\
+\hline
+$i$ & $i$ & $i$ \\
+\hline
+$\Omega$ & $\Omega$ & $\Omega$ \\
+\hline
+$\varpi$ & $\omega$ & $\omega$ \\
+\hline
+$a$ & $a$ & $q$ \\
+\hline
+$e$ & $e$ & $e$ \\
+\hline
+$L$ & $M$ & \\
+\hline
+$n$ & & \\
+\hline
+\end{tabular}\\[2ex]
+The symbols have the following meanings:
+
+\vspace{-1ex}
+
+\begin{tabular}{lll}
+& $t_0$ & epoch of osculation \\
+& $T$ & epoch of perihelion passage \\
+& $i$ & inclination of the orbit \\
+& $\Omega$ & longitude of the ascending node \\
+& $\varpi$ & longitude of perihelion ($\varpi = \Omega + \omega$) \\
+& $\omega$ & argument of perihelion \\
+& $a$ & semi-major axis of the orbital ellipse \\
+& $q$ & perihelion distance \\
+& $e$ & orbital eccentricity \\
+& $L$ & mean longitude ($L = \varpi + M$) \\
+& $M$ & mean anomaly \\
+& $n$ & mean motion \\
+\end{tabular}
+
+The mean motion, $n$, tells
+sla\_PLANEL the mass of the planet.
+If it is not available, it should be calculated
+from $n^2 a^3 = k^2 (1+m)$, where $k = 0.01720209895$ and
+m is the mass of the planet ($M_\odot = 1$); $a$ is in AU.
+
+Note that for any given problem there are up to three different
+epochs in play, and it is vital to distinguish clearly between
+them:
+\begin{itemize}
+\item The epoch of observation:  the moment in time for which the
+      position of the body is to be predicted.
+\item The epoch defining the position of the body:  the moment in time
+      at which, in the absence of purturbations, the specified
+      position---mean longitude, mean anomaly, or perihelion---is
+      reached.
+\item The epoch of osculation:  the moment in time at which the given
+      elements precisely specify the body's position and velocity.
+\end{itemize}
+
+For the major-planet and minor-planet cases it is usual to make
+the epoch that defines the position of the body the same as the
+epoch of osculation.  Thus, for planets (major and
+minor) only two different epochs are
+involved:  the epoch of the elements and the epoch of observation.
+For comets, the epoch of perihelion fixes the position in the
+orbit and in general a different epoch of osculation will be
+chosen.  Thus, for comets all three types of epoch are involved.
+How many of the three elements are present in a given SLALIB
+argument list depends on the routine concerned.
+
+Two important sources for orbital elements are the {\it Horizons}\/
+service, operated by the Jet Propulsion Laboratory, Pasadena,
+and the Minor Planet Center, operated by the Center for
+Astrophysics, Harvard.
+The JPL elements (heliocentric, J2000 ecliptic and
+equinox) and MPC elements
+correspond to SLALIB arguments as shown in the following table,
+where ``(rad)'' means conversion from degrees to radians, and
+``(MJD)'' means ``subtract {\tt 2400000.5D0}'':
+
+\vspace{2ex}
+
+\begin{small}
+\begin{tabular}{|c||c|c|c||c|c|} \hline
+{\it SLALIB } & \multicolumn{3}{c||}{\it JPL}
+ & \multicolumn{2}{c|}{\it MPC} \\
+argument & major planet & minor planet & comet & minor planet & comet \\
+\hline \hline
+{\tt JFORM} & {\tt 1} & {\tt 2} & {\tt 3} & {\tt 2} & {\tt 3} \\
+{\tt EPOCH} & {\tt JDCT} (MJD) & {\tt JDCT} (MJD) & {\tt Tp} (MJD) &
+                                    {\tt Epoch} (MJD) & {\tt T} (MJD) \\
+{\tt ORBINC} & {\tt IN} (rad) & {\tt IN} (rad) & {\tt IN} (rad) &
+                                {\tt Incl.} (rad) & {\tt Incl.} (rad) \\
+{\tt ANODE} & {\tt OM} (rad) & {\tt OM} (rad) & {\tt OM} (rad) &
+                                 {\tt Node} (rad) & {\tt Node.} (rad) \\
+{\tt PERIH} & {\tt OM+W} (rad) & {\tt W} (rad) & {\tt W} (rad) &
+                              {\tt Perih.} (rad) & {\tt Perih.} (rad) \\
+{\tt AORQ} & {\tt A} & {\tt A} & {\tt QR} & {\tt a} & {\tt q} \\
+{\tt E} & {\tt EC} & {\tt EC} & {\tt EC} & {\tt e} & {\tt e} \\
+{\tt AORL} & {\tt MA+OM+W} (rad) & {\tt MA} (rad) & & {\tt M} (rad) & \\
+{\tt DM} & {\tt N} (rad) & & & & \\  \hline
+epoch of osculation & {\tt JDCT} (MJD)
+                    & {\tt JDCT} (MJD)
+                    & {\tt JDCT} (MJD)
+                    & {\tt Epoch} (MJD)
+                    & {\tt Epoch} (MJD) \\
+\hline
+\end{tabular}
+\end{small}\\[3ex]
+
+Conventional elements are not the only way of specifying an orbit.
+The \xyzxyzd\ state vector is an equally valid specification,
+and the so-called {\it method of universal variables}\/ allows
+orbital calculations to be made directly, bypassing angular
+quantities and avoiding Kepler's Equation.  The universal-variables
+approach has various advantages, including better handling of
+near-parabolic cases and greater efficiency.
+SLALIB uses universal variables for its internal
+calculations and also offers a number of routines which
+applications can call.
+
+The universal elements are the \xyzxyzd\ and its epoch, plus the mass
+of the body.  The SLALIB routines supplement these elements with
+certain redundant values in order to
+avoid unnecessary recomputation when the elements are next used.
+
+The routines
+sla\_EL2UE and
+sla\_UE2EL transform conventional elements into the
+universal form and {\it vice versa.}
+The routine
+sla\_PV2UE takes an \xyzxyzd\ and forms the set of universal
+elements;
+sla\_UE2PV takes a set of universal elements and predicts the \xyzxyzd\
+for a specified epoch.
+The routine
+sla\_PERTUE provides updated universal elements,
+taking into account perturbations from the major planets.
+Starting with universal elements, the routine
+sla\_PLANTU (the universal elements equivalent of
+sla\_PLANTE) predicts topocentric \radec.
+
+\subsection{Radial Velocity and Light-Time Corrections}
+When publishing high-resolution spectral observations
+it is necessary to refer them to a specified standard of rest.
+This involves knowing the component in the direction of the
+source of the velocity of the observer.  SLALIB provides a number
+of routines for this purpose, allowing observations to be
+referred to the Earth's centre, the Sun, a Local Standard of Rest
+(either dynamical or kinematical), the centre of the Galaxy, and
+the mean motion of the Local Group.
+
+The routine
+sla\_RVEROT
+corrects for the diurnal rotation of
+the observer around the Earth's axis.  This is always less than 0.5~km/s.
+
+No specific routine is provided to correct a radial velocity
+from geocentric to heliocentric, but this can easily be done by calling
+sla\_EVP
+as follows (array declarations {\it etc}.\ omitted):
+\goodbreak
+\begin{verbatim}
+             :
+      *  Star vector, J2000
+            CALL sla_DCS2C(RM,DM,V)
+
+      *  Earth/Sun velocity and position, J2000
+            CALL sla_EVP(TDB,2000D0,DVB,DPB,DVH,DPH)
+
+      *  Radial velocity correction due to Earth orbit (km/s)
+            VCORB = -sla_DVDV(V,DVH)*149.597870D6
+             :
+\end{verbatim}
+\goodbreak
+The maximum value of this correction is the Earth's orbital speed
+of about 30~km/s.  A related routine,
+sla\_ECOR,
+computes the light-time correction with respect to the Sun.  It
+would be used when reducing observations of a rapid variable-star
+for instance.
+For pulsar work the
+sla\_EVP routine is not sufficiently accurate for
+phase predictions, being limited to about 25~ms.  The
+alternative sla\_EPV routine will deliver pulse arrival times
+accurate to 50~$\mu$s, but is significantly slower.
+
+To remove the intrinsic $\sim20$~km/s motion of the Sun relative
+to other stars in the solar neighbourhood,
+a velocity correction to a
+{\it local standard of rest}\/ (LSR) is required.  There are
+opportunities for mistakes here.  There are two sorts of LSR,
+{\it dynamical}\/ and {\it kinematical}, and
+multiple definitions exist for the latter.  The
+dynamical LSR is a point near the Sun which is in a circular
+orbit around the Galactic centre;  the Sun has a ``peculiar''
+motion relative to the dynamical LSR.  A kinematical LSR is
+the mean standard of rest of specified star catalogues or stellar
+populations, and its precise definition depends on which
+catalogues or populations were used and how the analysis was
+carried out.  The Sun's motion with respect to a kinematical
+LSR is called the ``standard'' solar motion.  Radial
+velocity corrections to the dynamical LSR are produced by the routine
+sla\_RVLSRD
+and to the adopted kinematical LSR by
+sla\_RVLSRK.
+See the individual specifications for these routines for the
+precise definition of the LSR in each case.
+
+For extragalactic sources, the centre of the Galaxy can be used as
+a standard of rest.  The radial velocity correction from the
+dynamical LSR to the Galactic centre can be obtained by calling
+sla\_RVGALC.
+Its maximum value is 220~km/s.
+
+For very distant sources it is appropriate to work relative
+to the mean motion of the Local Group.  The routine for
+computing the radial velocity correction in this case is
+sla\_RVLG.
+Note that in this case the correction is with respect to the
+dynamical LSR, not the Galactic centre as might be expected.
+This conforms to the IAU definition, and confers immunity from
+revisions of the Galactic rotation speed.
+
+\subsection{Focal-Plane Astrometry}
+The relationship between the position of a star image in
+the focal plane of a telescope and the star's celestial
+coordinates is usually described in terms of the {\it tangent plane}\/
+or {\it gnomonic}\/ projection.  This is the projection produced
+by a pin-hole camera and is a good approximation to the projection
+geometry of a traditional large {\it f}\/-ratio astrographic refractor.
+SLALIB includes a group of routines which transform
+star positions between their observed places on the celestial
+sphere and their \xy\ coordinates in the tangent plane.  The
+spherical coordinate system does not have to be \radec\ but
+usually is.  The so-called {\it standard coordinates}\/ of a star
+are the tangent plane \xy, in radians, with respect to an origin
+at the tangent point, with the $y$-axis pointing north and
+the $x$-axis pointing east (in the direction of increasing $\alpha$).
+The factor relating the standard coordinates to
+the actual \xy\ coordinates in, say, millimetres is simply
+the focal length of the telescope.
+
+Given the \radec\ of the {\it plate centre}\/ (the tangent point)
+and the \radec\ of a star within the field, the standard
+coordinates can be determined by calling
+sla\_S2TP
+(single precision) or
+sla\_DS2TP
+(double precision).  The reverse transformation, where the
+\xy\ is known and we wish to find the \radec, is carried out by calling
+sla\_TP2S
+or
+sla\_DTP2S.
+Occasionally we know the both the \xy\ and the \radec\ of a
+star and need to deduce the \radec\ of the tangent point;
+this can be done by calling
+sla\_TPS2C
+or
+sla\_DTPS2C.
+(All of these transformations apply not just to \radec\ but to
+other spherical coordinate systems, of course.)
+Equivalent (and faster)
+routines are provided which work directly in \xyz\ instead of
+spherical coordinates:
+sla\_V2TP and
+sla\_DV2TP,
+sla\_TP2V and
+sla\_DTP2V,
+sla\_TPV2C and
+sla\_DTPV2C.
+
+Even at the best of times, the tangent plane projection is merely an
+approximation.  Some telescopes and cameras exhibit considerable pincushion
+or barrel distortion and some have a curved focal surface.
+For example, neither Schmidt cameras nor (especially)
+large reflecting telescopes with wide-field corrector lenses
+are adequately modelled by tangent-plane geometry.  In such
+cases, however, it is still possible to do most of the work
+using the (mathematically convenient) tangent-plane
+projection by inserting an extra step which applies or
+removes the distortion peculiar to the system concerned.
+A simple $r_1=r_0(1+Kr_0^2)$ law works well in the
+majority of cases; $r_0$ is the radial distance in the
+tangent plane, $r_1$ is the radial distance after adding
+the distortion, and $K$ is a constant which depends on the
+telescope ($\theta$ is unaffected).  The routine
+sla\_PCD
+applies the distortion to an \xy\ and
+sla\_UNPCD
+removes it.  For \xy\ in radians, $K$ values range from $-1/3$ for the
+tiny amount of barrel distortion in Schmidt geometry to several
+hundred for the serious pincushion distortion
+produced by wide-field correctors in big reflecting telescopes
+(the AAT prime focus triplet corrector is about $K=+178.6$).
+
+SLALIB includes a group of routines which can be put together
+to build a simple plate-reduction program.  The heart of the group is
+sla\_FITXY,
+which fits a linear model to relate two sets of \xy\ coordinates,
+in the case of a plate reduction the measured positions of the
+images of a set of
+reference stars and the standard
+coordinates derived from their catalogue positions.  The
+model is of the form:
+\[x_{p} = a + bx_{m} + cy_{m}\]
+\[y_{p} = d + ex_{m} + fy_{m}\]
+
+where the {\it p}\/ subscript indicates ``predicted'' coordinates
+(the model's approximation to the ideal ``expected'' coordinates) and the
+{\it m}\/ subscript indicates ``measured coordinates''.  The
+six coefficients {\it a--f}\/ can optionally be
+constrained to represent a ``solid body rotation'' free of
+any squash or shear distortions.  Without this constraint
+the model can, to some extent, accommodate effects like refraction,
+allowing mean places to be used directly and
+avoiding the extra complications of a
+full mean-apparent-observed transformation for each star.
+Having obtained the linear model,
+sla\_PXY
+can be used to process the set of measured and expected
+coordinates, giving the predicted coordinates and determining
+the RMS residuals in {\it x}\/ and {\it y}.
+The routine
+sla\_XY2XY
+transforms one \xy\ into another using the linear model.  A model
+can be inverted by calling
+sla\_INVF,
+and decomposed into zero points, scales, $x/y$ nonperpendicularity
+and orientation by calling
+sla\_DCMPF.
+
+\subsection{Numerical Methods}
+SLALIB contains a small number of simple, general-purpose
+numerical-methods routines.  They have no specific
+connection with positional astronomy but have proved useful in
+applications to do with simulation and fitting.
+
+At the heart of many simulation programs is the generation of
+pseudo-random numbers, evenly distributed in a given range:
+sla\_RANDOM
+does this.  Pseudo-random normal deviates, or ``Gaussian
+residuals'', are often required to simulate noise and
+can be generated by means of the function
+sla\_GRESID.
+Neither routine will pass super-sophisticated
+statistical tests, but they work adequately for most
+practical purposes and avoid the need to call non-standard
+library routines peculiar to one sort of computer.
+
+Applications which perform a least-squares fit using a traditional
+normal-equations methods can accomplish the required matrix-inversion
+by calling either
+sla\_SMAT
+(single precision) or
+sla\_DMAT
+(double).  A generally better way to perform such fits is
+to use singular value decomposition.  SLALIB provides a routine
+to do the decomposition itself,
+sla\_SVD,
+and two routines to use the results:
+sla\_SVDSOL
+generates the solution, and
+sla\_SVDCOV
+produces the covariance matrix.
+A simple demonstration of the use of the SLALIB SVD
+routines is given below.  It generates 500 simulated data
+points and fits them to a model which has 4 unknown coefficients.
+(The arrays in the example are sized to accept up to 1000
+points and 20 unknowns.)  The model is:
+\[ y = C_{1} +C_{2}x +C_{3}sin{x} +C_{4}cos{x} \]
+The test values for the four coefficients are
+$C_1\!=\!+50.0$,
+$C_2\!=\!-2.0$,
+$C_3\!=\!-10.0$ and
+$C_4\!=\!+25.0$.
+Gaussian noise, $\sigma=5.0$, is added to each ``observation''.
+\goodbreak
+\begin{verbatim}
+            IMPLICIT NONE
+
+      *  Sizes of arrays, physical and logical
+            INTEGER MP,NP,NC,M,N
+            PARAMETER (MP=1000,NP=10,NC=20,M=500,N=4)
+
+      *  The unknowns we are going to solve for
+            DOUBLE PRECISION C1,C2,C3,C4
+            PARAMETER (C1=50D0,C2=-2D0,C3=-10D0,C4=25D0)
+
+      *  Arrays
+            DOUBLE PRECISION A(MP,NP),W(NP),V(NP,NP),
+           :                 WORK(NP),B(MP),X(NP),CVM(NC,NC)
+
+            DOUBLE PRECISION VAL,BF1,BF2,BF3,BF4,SD2,D,VAR
+            REAL sla_GRESID
+            INTEGER I,J
+
+      *  Fill the design matrix
+            DO I=1,M
+
+      *     Dummy independent variable
+               VAL=DBLE(I)/10D0
+
+      *     The basis functions
+               BF1=1D0
+               BF2=VAL
+               BF3=SIN(VAL)
+               BF4=COS(VAL)
+
+      *     The observed value, including deliberate Gaussian noise
+               B(I)=C1*BF1+C2*BF2+C3*BF3+C4*BF4+DBLE(sla_GRESID(5.0))
+
+      *     Fill one row of the design matrix
+               A(I,1)=BF1
+               A(I,2)=BF2
+               A(I,3)=BF3
+               A(I,4)=BF4
+            END DO
+
+      *  Factorize the design matrix, solve and generate covariance matrix
+            CALL sla_SVD(M,N,MP,NP,A,W,V,WORK,J)
+            CALL sla_SVDSOL(M,N,MP,NP,B,A,W,V,WORK,X)
+            CALL sla_SVDCOV(N,NP,NC,W,V,WORK,CVM)
+
+      *  Compute the variance
+            SD2=0D0
+            DO I=1,M
+               VAL=DBLE(I)/10D0
+               BF1=1D0
+               BF2=VAL
+               BF3=SIN(VAL)
+               BF4=COS(VAL)
+               D=B(I)-(X(1)*BF1+X(2)*BF2+X(3)*BF3+X(4)*BF4)
+               SD2=SD2+D*D
+            END DO
+            VAR=SD2/DBLE(M)
+
+      *  Report the RMS and the solution
+            WRITE (*,'(1X,''RMS ='',F5.2/)') SQRT(VAR)
+            DO I=1,N
+               WRITE (*,'(1X,''C'',I1,'' ='',F7.3,'' +/-'',F6.3)')
+           :                                         I,X(I),SQRT(VAR*CVM(I,I))
+            END DO
+            END
+\end{verbatim}
+\goodbreak
+The program produces output like the following:
+\goodbreak
+\begin{verbatim}
+            RMS = 4.88
+
+            C1 = 50.192 +/- 0.439
+            C2 = -2.002 +/- 0.015
+            C3 = -9.771 +/- 0.310
+            C4 = 25.275 +/- 0.310
+\end{verbatim}
+\goodbreak
+In this above example, essentially
+identical results would be obtained if the more
+commonplace normal-equations method had been used, and the large
+$1000\times20$ array would have been avoided.  However, the SVD method
+comes into its own when the opportunity is taken to edit the W-matrix
+(the so-called ``singular values'') in order to control
+possible ill-conditioning.  The procedure involves replacing with
+zeroes any W-elements smaller than a nominated value, for example
+0.001 times the largest W-element.  Small W-elements indicate
+ill-conditioning, which in the case of the normal-equations
+method would produce spurious large coefficient values and
+possible arithmetic overflows.  Using SVD, the effect on the solution
+of setting suspiciously small W-elements to zero is to restrain
+the offending coefficients from moving very far.  The
+fact that action was taken can be reported to show the program user that
+something is amiss.  Furthermore, if element W(J) was set to zero,
+the row numbers of the two biggest elements in the Jth column of the
+V-matrix identify the pair of solution coefficients that are
+dependent.
+
+A more detailed description of SVD and its use in least-squares
+problems would be out of place here, and the reader is urged
+to refer to the relevant sections of the book {\it Numerical Recipes}
+(Press {\it et al.}, Cambridge University Press, 1987).
+
+The routines
+sla\_COMBN
+and
+sla\_PERMUT
+are useful for problems which involve combinations (different subsets)
+and permutations (different orders).
+Both return the next in a sequence of results, cycling through all the
+possible results as the routine is called repeatedly.
+
+\vfill
+
+\pagebreak
+
+\section{SUMMARY OF CALLS}
+The basic trigonometrical and numerical facilities are supplied in both single
+and double precision versions.
+Most of the more esoteric position and time routines use double precision
+arguments only, even in cases where single precision would normally be adequate
+in practice.
+Certain routines with modest accuracy objectives are supplied in
+single precision versions only.
+In the calling sequences which follow, no attempt has been made
+to distinguish between single and double precision argument names,
+and frequently the same name is used on different occasions to
+mean different things.
+However, none of the routines uses a mixture of single and
+double precision arguments;  each routine is either wholly
+single precision or wholly double precision.
+
+In the classified list, below,
+{\it subroutine}\/ subprograms are those whose names and argument lists
+are preceded by `CALL', whereas {\it function}\/ subprograms are
+those beginning `R=' (when the result is REAL) or `D=' (when
+the result is DOUBLE~PRECISION).
+
+The list is, of course, merely for quick reference;  inexperienced
+users {\bf must} refer to the detailed specifications given later.
+In particular, {\bf don't guess} whether arguments are single or
+double precision; the result could be a program that happens to
+works on one sort of machine but not on another.
+
+\callhead{String Decoding}
+\begin{callset}
+\subp{CALL sla\_INTIN (STRING, NSTRT, IRESLT, JFLAG)}
+   Convert free-format string into integer
+\subq{CALL sla\_FLOTIN (STRING, NSTRT, RESLT, JFLAG)}
+     {CALL sla\_DFLTIN (STRING, NSTRT, DRESLT, JFLAG)}
+   Convert free-format string into floating-point number
+\subq{CALL sla\_AFIN (STRING, NSTRT, RESLT, JFLAG)}
+     {CALL sla\_DAFIN (STRING, NSTRT, DRESLT, JFLAG)}
+   Convert free-format string from deg,arcmin,arcsec to radians
+\end{callset}
+
+\callhead{Sexagesimal Conversions}
+\begin{callset}
+\subq{CALL sla\_CTF2D (IHOUR, IMIN, SEC, DAYS, J)}
+     {CALL sla\_DTF2D (IHOUR, IMIN, SEC, DAYS, J)}
+   Hours, minutes, seconds to days
+\subq{CALL sla\_CD2TF (NDP, DAYS, SIGN, IHMSF)}
+     {CALL sla\_DD2TF (NDP, DAYS, SIGN, IHMSF)}
+   Days to hours, minutes, seconds
+\subq{CALL sla\_CTF2R (IHOUR, IMIN, SEC, RAD, J)}
+     {CALL sla\_DTF2R (IHOUR, IMIN, SEC, RAD, J)}
+   Hours, minutes, seconds to radians
+\subq{CALL sla\_CR2TF (NDP, ANGLE, SIGN, IHMSF)}
+     {CALL sla\_DR2TF (NDP, ANGLE, SIGN, IHMSF)}
+   Radians to hours, minutes, seconds
+\subq{CALL sla\_CAF2R (IDEG, IAMIN, ASEC, RAD, J)}
+     {CALL sla\_DAF2R (IDEG, IAMIN, ASEC, RAD, J)}
+   Degrees, arcminutes, arcseconds to radians
+\subq{CALL sla\_CR2AF (NDP, ANGLE, SIGN, IDMSF)}
+     {CALL sla\_DR2AF (NDP, ANGLE, SIGN, IDMSF)}
+   Radians to degrees, arcminutes, arcseconds
+\end{callset}
+
+\callhead{Angles, Vectors and Rotation Matrices}
+\begin{callset}
+\subq{R~=~sla\_RANGE (ANGLE)}
+     {D~=~sla\_DRANGE (ANGLE)}
+   Normalize angle into range $\pm\pi$
+\subq{R~=~sla\_RANORM (ANGLE)}
+     {D~=~sla\_DRANRM (ANGLE)}
+   Normalize angle into range $0\!-\!2\pi$
+\subq{CALL sla\_CS2C (A, B, V)}
+     {CALL sla\_DCS2C (A, B, V)}
+   Spherical coordinates to \xyz
+\subq{CALL sla\_CC2S (V, A, B)}
+     {CALL sla\_DCC2S (V, A, B)}
+   \xyz\ to spherical coordinates
+\subq{R~=~sla\_VDV (VA, VB)}
+     {D~=~sla\_DVDV (VA, VB)}
+   Scalar product of two 3-vectors
+\subq{CALL sla\_VXV (VA, VB, VC)}
+     {CALL sla\_DVXV (VA, VB, VC)}
+   Vector product of two 3-vectors
+\subq{CALL sla\_VN (V, UV, VM)}
+     {CALL sla\_DVN (V, UV, VM)}
+   Normalize a 3-vector also giving the modulus
+\subq{R~=~sla\_SEP (A1, B1, A2, B2)}
+     {D~=~sla\_DSEP (A1, B1, A2, B2)}
+   Angle between two points on a sphere
+\subq{R~=~sla\_SEPV (V1, V2)}
+     {D~=~sla\_DSEPV (V1, V2)}
+   Angle between two \xyz\ vectors
+\subq{R~=~sla\_BEAR (A1, B1, A2, B2)}
+     {D~=~sla\_DBEAR (A1, B1, A2, B2)}
+   Direction of one point on a sphere seen from another
+\subq{R~=~sla\_PAV (V1, V2)}
+     {D~=~sla\_DPAV (V1, V2)}
+   Position-angle of one \xyz\ with respect to another
+\subq{CALL sla\_EULER (ORDER, PHI, THETA, PSI, RMAT)}
+     {CALL sla\_DEULER (ORDER, PHI, THETA, PSI, RMAT)}
+   Form rotation matrix from three Euler angles
+\subq{CALL sla\_AV2M (AXVEC, RMAT)}
+     {CALL sla\_DAV2M (AXVEC, RMAT)}
+   Form rotation matrix from axial vector
+\subq{CALL sla\_M2AV (RMAT, AXVEC)}
+     {CALL sla\_DM2AV (RMAT, AXVEC)}
+   Determine axial vector from rotation matrix
+\subq{CALL sla\_MXV (RM, VA, VB)}
+     {CALL sla\_DMXV (DM, VA, VB)}
+   Rotate vector forwards
+\subq{CALL sla\_IMXV (RM, VA, VB)}
+     {CALL sla\_DIMXV (DM, VA, VB)}
+   Rotate vector backwards
+\subq{CALL sla\_MXM (A, B, C)}
+     {CALL sla\_DMXM (A, B, C)}
+   Product of two 3x3 matrices
+\subq{CALL sla\_CS2C6 (A, B, R, AD, BD, RD, V)}
+     {CALL sla\_DS2C6 (A, B, R, AD, BD, RD, V)}
+   Conversion of position and velocity in spherical
+     coordinates to Cartesian coordinates
+\subq{CALL sla\_CC62S (V, A, B, R, AD, BD, RD)}
+     {CALL sla\_DC62S (V, A, B, R, AD, BD, RD)}
+   Conversion of position and velocity in Cartesian
+     coordinates to spherical coordinates
+\end{callset}
+
+\callhead{Calendars}
+\begin{callset}
+\subp{CALL sla\_CLDJ (IY, IM, ID, DJM, J)}
+   Gregorian Calendar to Modified Julian Date
+\subp{CALL sla\_CALDJ (IY, IM, ID, DJM, J)}
+   Gregorian Calendar to Modified Julian Date,
+     permitting century default
+\subp{CALL sla\_DJCAL (NDP, DJM, IYMDF, J)}
+   Modified Julian Date to Gregorian Calendar,
+     in a form convenient for formatted output
+\subp{CALL sla\_DJCL (DJM, IY, IM, ID, FD, J)}
+   Modified Julian Date to Gregorian Year, Month, Day, Fraction
+\subp{CALL sla\_CALYD (IY, IM, ID, NY, ND, J)}
+   Calendar to year and day in year, permitting century default
+\subp{CALL sla\_CLYD (IY, IM, ID, NY, ND, J)}
+   Calendar to year and day in year
+\subp{D~=~sla\_EPB (DATE)}
+   Modified Julian Date to Besselian Epoch
+\subp{D~=~sla\_EPB2D (EPB)}
+   Besselian Epoch to Modified Julian Date
+\subp{D~=~sla\_EPJ (DATE)}
+   Modified Julian Date to Julian Epoch
+\subp{D~=~sla\_EPJ2D (EPJ)}
+   Julian Epoch to Modified Julian Date
+\end{callset}
+
+\callhead{Time Scales}
+\begin{callset}
+\subp{D~=~sla\_GMST (UT1)}
+   Conversion from Universal Time to sidereal time
+\subp{D~=~sla\_GMSTA (DATE, UT1)}
+   Conversion from Universal Time to sidereal time, rounding errors minimized
+\subp{D~=~sla\_EQEQX (DATE)}
+   Equation of the equinoxes
+\subp{D~=~sla\_DAT (DJU)}
+   Offset of Atomic Time from Coordinated Universal Time: TAI$-$UTC
+\subp{D~=~sla\_DT (EPOCH)}
+   Approximate offset between dynamical time and universal time
+\subp{D~=~sla\_DTT (DJU)}
+   Offset of Terrestrial Time from Coordinated Universal Time: TT$-$UTC
+\subp{D~=~sla\_RCC (TDB, UT1, WL, U, V)}
+   Relativistic clock correction: TDB$-$TT
+\end{callset}
+
+\callhead{Precession and Nutation}
+\begin{callset}
+\subp{CALL sla\_NUT (DATE, RMATN)}
+   Nutation matrix
+\subp{CALL sla\_NUTC (DATE, DPSI, DEPS, EPS0)}
+   Longitude and obliquity components of nutation, and
+     mean obliquity
+\subp{CALL sla\_NUTC80 (DATE, DPSI, DEPS, EPS0)}
+   Longitude and obliquity components of nutation, and
+     mean obliquity, IAU 1980
+\subp{CALL sla\_PREC (EP0, EP1, RMATP)}
+   Precession matrix (IAU)
+\subp{CALL sla\_PRECL (EP0, EP1, RMATP)}
+   Precession matrix (suitable for long periods)
+\subp{CALL sla\_PRENUT (EPOCH, DATE, RMATPN)}
+   Combined precession-nutation matrix
+\subp{CALL sla\_PREBN (BEP0, BEP1, RMATP)}
+   Precession matrix, old system
+\subp{CALL sla\_PRECES (SYSTEM, EP0, EP1, RA, DC)}
+   Precession, in either the old or the new system
+\end{callset}
+
+\callhead{Proper Motion}
+\begin{callset}
+\subp{CALL sla\_PM (R0, D0, PR, PD, PX, RV, EP0, EP1, R1, D1)}
+   Adjust for proper motion
+\end{callset}
+
+\callhead{FK4/FK5/Hipparcos Conversions}
+\begin{callset}
+\subp{CALL sla\_FK425 (\vtop
+                       {\hbox{R1950, D1950, DR1950, DD1950, P1950, V1950,}
+                        \hbox{R2000, D2000, DR2000, DD2000, P2000, V2000)}}}
+   Convert B1950.0 FK4 star data to J2000.0 FK5
+\subp{CALL sla\_FK45Z (R1950, D1950, EPOCH, R2000, D2000)}
+   Convert B1950.0 FK4 position to J2000.0 FK5 assuming zero
+   FK5 proper motion and no parallax
+\subp{CALL sla\_FK524 (\vtop
+                       {\hbox{R2000, D2000, DR2000, DD2000, P2000, V2000,}
+                        \hbox{R1950, D1950, DR1950, DD1950, P1950, V1950)}}}
+   Convert J2000.0 FK5 star data to B1950.0 FK4
+\subp{CALL sla\_FK54Z (R2000, D2000, BEPOCH,
+               R1950, D1950, DR1950, DD1950)}
+   Convert J2000.0 FK5 position to B1950.0 FK4 assuming zero
+   FK5 proper motion and no parallax
+\subp{CALL sla\_FK52H (R5, D5, DR5, DD5, RH, DH, DRH, DDH)}
+   Convert J2000.0 FK5 star data to Hipparcos
+\subp{CALL sla\_FK5HZ (R5, D5, EPOCH, RH, DH )}
+   Convert J2000.0 FK5 position to Hipparcos assuming zero Hipparcos
+   proper motion
+\subp{CALL sla\_H2FK5 (RH, DH, DRH, DDH, R5, D5, DR5, DD5)}
+   Convert Hipparcos star data to J2000.0 FK5
+\subp{CALL sla\_HFK5Z (RH, DH, EPOCH, R5, D5, DR5, DD5)}
+   Convert Hipparcos position to J2000.0 FK5 assuming zero Hipparcos
+   proper motion
+\subp{CALL sla\_DBJIN (STRING, NSTRT, DRESLT, J1, J2)}
+   Like sla\_DFLTIN but with extensions to accept leading `B' and `J'
+\subp{CALL sla\_KBJ (JB, E, K, J)}
+   Select epoch prefix `B' or `J'
+\subp{D~=~sla\_EPCO (K0, K, E)}
+   Convert an epoch into the appropriate form -- `B' or `J'
+\end{callset}
+
+\callhead{Elliptic Aberration}
+\begin{callset}
+\subp{CALL sla\_ETRMS (EP, EV)}
+   E-terms
+\subp{CALL sla\_SUBET (RC, DC, EQ, RM, DM)}
+   Remove the E-terms
+\subp{CALL sla\_ADDET (RM, DM, EQ, RC, DC)}
+   Add the E-terms
+\end{callset}
+
+\callhead{Geographical and Geocentric Coordinates}
+\begin{callset}
+\subp{CALL sla\_OBS (NUMBER, ID, NAME, WLONG, PHI, HEIGHT)}
+   Interrogate list of observatory parameters
+\subp{CALL sla\_GEOC (P, H, R, Z)}
+   Convert geodetic position to geocentric
+\subp{CALL sla\_POLMO (ELONGM, PHIM, XP, YP, ELONG, PHI, DAZ)}
+   Polar motion
+\subp{CALL sla\_PVOBS (P, H, STL, PV)}
+   Position and velocity of observatory
+\end{callset}
+
+\callhead{Apparent and Observed Place}
+\begin{callset}
+\subp{CALL sla\_MAP (RM, DM, PR, PD, PX, RV, EQ, DATE, RA, DA)}
+   Mean place to geocentric apparent place
+\subp{CALL sla\_MAPPA (EQ, DATE, AMPRMS)}
+   Precompute mean to apparent parameters
+\subp{CALL sla\_MAPQK (RM, DM, PR, PD, PX, RV, AMPRMS, RA, DA)}
+   Mean to apparent using precomputed parameters
+\subp{CALL sla\_MAPQKZ (RM, DM, AMPRMS, RA, DA)}
+   Mean to apparent using precomputed parameters, for zero proper
+     motion, parallax and radial velocity
+\subp{CALL sla\_AMP (RA, DA, DATE, EQ, RM, DM)}
+   Geocentric apparent place to mean place
+\subp{CALL sla\_AMPQK (RA, DA, AMPRMS, RM, DM)}
+   Apparent to mean using precomputed parameters
+\subp{CALL sla\_AOP (\vtop
+                      {\hbox{RAP, DAP, UTC, DUT, ELONGM, PHIM, HM, XP, YP,}
+                       \hbox{TDK, PMB, RH, WL, TLR, AOB, ZOB, HOB, DOB, ROB)}}}
+   Apparent place to observed place
+\subp{CALL sla\_AOPPA (\vtop
+                        {\hbox{UTC, DUT, ELONGM, PHIM, HM, XP, YP,}
+                         \hbox{TDK, PMB, RH, WL, TLR, AOPRMS)}}}
+   Precompute apparent to observed parameters
+\subp{CALL sla\_AOPPAT (UTC, AOPRMS)}
+   Update sidereal time in apparent to observed parameters
+\subp{CALL sla\_AOPQK (RAP, DAP, AOPRMS, AOB, ZOB, HOB, DOB, ROB)}
+   Apparent to observed using precomputed parameters
+\subp{CALL sla\_OAP (\vtop
+                     {\hbox{TYPE, OB1, OB2, UTC, DUT, ELONGM, PHIM, HM, XP, YP,}
+                      \hbox{TDK, PMB, RH, WL, TLR, RAP, DAP)}}}
+   Observed to apparent
+\subp{CALL sla\_OAPQK (TYPE, OB1, OB2, AOPRMS, RA, DA)}
+   Observed to apparent using precomputed parameters
+\end{callset}
+
+\callhead{Azimuth and Elevation}
+\begin{callset}
+\subp{CALL sla\_ALTAZ (\vtop
+               {\hbox{HA, DEC, PHI,}
+                \hbox{AZ, AZD, AZDD, EL, ELD, ELDD, PA, PAD, PADD)}}}
+   Positions, velocities {\it etc.}\ for an altazimuth mount
+\subq{CALL sla\_E2H (HA, DEC, PHI, AZ, EL)}
+     {CALL sla\_DE2H (HA, DEC, PHI, AZ, EL)}
+   \hadec\ to \azel
+\subq{CALL sla\_H2E (AZ, EL, PHI, HA, DEC)}
+     {CALL sla\_DH2E (AZ, EL, PHI, HA, DEC)}
+   \azel\ to \hadec
+\subp{CALL sla\_PDA2H (P, D, A, H1, J1, H2, J2)}
+   Hour Angle corresponding to a given azimuth
+\subp{CALL sla\_PDQ2H (P, D, Q, H1, J1, H2, J2)}
+   Hour Angle corresponding to a given parallactic angle
+\subp{D~=~sla\_PA (HA, DEC, PHI)}
+   \hadec\ to parallactic angle
+\subp{D~=~sla\_ZD (HA, DEC, PHI)}
+   \hadec\ to zenith distance
+\end{callset}
+
+\callhead{Refraction and Air Mass}
+\begin{callset}
+\subp{CALL sla\_REFRO (ZOBS, HM, TDK, PMB, RH, WL, PHI, TLR, EPS, REF)}
+   Change in zenith distance due to refraction
+\subp{CALL sla\_REFCO (HM, TDK, PMB, RH, WL, PHI, TLR, EPS, REFA, REFB)}
+   Constants for simple refraction model (accurate)
+\subp{CALL sla\_REFCOQ (TDK, PMB, RH, WL, REFA, REFB)}
+   Constants for simple refraction model (fast)
+\subp{CALL sla\_ATMDSP ( TDK, PMB, RH, WL1, REFA1, REFB1, WL2, REFA2, REFB2 )}
+   Adjust refraction constants for colour
+\subp{CALL sla\_REFZ (ZU, REFA, REFB, ZR)}
+   Unrefracted to refracted ZD, simple model
+\subp{CALL sla\_REFV (VU, REFA, REFB, VR)}
+   Unrefracted to refracted \azel\ vector, simple model
+\subp{D~=~sla\_AIRMAS (ZD)}
+   Air mass
+\end{callset}
+
+\callhead{Ecliptic Coordinates}
+\begin{callset}
+\subp{CALL sla\_ECMAT (DATE, RMAT)}
+   Equatorial to ecliptic rotation matrix
+\subp{CALL sla\_EQECL (DR, DD, DATE, DL, DB)}
+   J2000.0 `FK5' to ecliptic coordinates
+\subp{CALL sla\_ECLEQ (DL, DB, DATE, DR, DD)}
+   Ecliptic coordinates to J2000.0 `FK5'
+\end{callset}
+
+\callhead{Galactic Coordinates}
+\begin{callset}
+\subp{CALL sla\_EG50 (DR, DD, DL, DB)}
+   B1950.0 `FK4' to galactic
+\subp{CALL sla\_GE50 (DL, DB, DR, DD)}
+   Galactic to B1950.0 `FK4'
+\subp{CALL sla\_EQGAL (DR, DD, DL, DB)}
+   J2000.0 `FK5' to galactic
+\subp{CALL sla\_GALEQ (DL, DB, DR, DD)}
+   Galactic to J2000.0 `FK5'
+\end{callset}
+
+\callhead{Supergalactic Coordinates}
+\begin{callset}
+\subp{CALL sla\_GALSUP (DL, DB, DSL, DSB)}
+   Galactic to supergalactic
+\subp{CALL sla\_SUPGAL (DSL, DSB, DL, DB)}
+   Supergalactic to galactic
+\end{callset}
+
+\callhead{Ephemerides}
+\begin{callset}
+\subp{CALL sla\_DMOON (DATE, PV)}
+   Approximate geocentric position and velocity of the Moon
+\subp{CALL sla\_EARTH (IY, ID, FD, PV)}
+   Approximate heliocentric position and velocity of the Earth
+\subp{CALL sla\_EPV (DATE, DPH, DVH, DPB, DVB )}
+   Heliocentric and barycentric position and velocity of the Earth
+\subp{CALL sla\_EVP (DATE, DEQX, DVB, DPB, DVH, DPH)}
+   Barycentric and heliocentric velocity and position of the Earth
+\subp{CALL sla\_MOON (IY, ID, FD, PV)}
+   Approximate geocentric position and velocity of the Moon
+\subp{CALL sla\_PLANET (DATE, NP, PV, JSTAT)}
+   Approximate heliocentric position and velocity of a planet
+\subp{CALL sla\_RDPLAN (DATE, NP, ELONG, PHI, RA, DEC, DIAM)}
+   Approximate topocentric apparent place of a planet
+\subp{CALL sla\_PLANEL (\vtop
+                       {\hbox{DATE, JFORM, EPOCH, ORBINC, ANODE, PERIH,}
+                      \hbox{AORQ, E, AORL, DM, PV, JSTAT)}}}
+   Heliocentric position and velocity of a planet, asteroid or
+   comet, starting from orbital elements
+\subp{CALL sla\_PLANTE (\vtop
+                       {\hbox{DATE, ELONG, PHI, JFORM, EPOCH, ORBINC, ANODE,}
+                      \hbox{PERIH, AORQ, E, AORL, DM, RA, DEC, R, JSTAT)}}}
+   Topocentric apparent place of a Solar-System object whose
+   heliocentric orbital elements are known
+\subp{CALL sla\_PLANTU (DATE, ELONG, PHI, U, RA, DEC, R, JSTAT)}
+   Topocentric apparent place of a Solar-System object whose
+   heliocentric universal orbital elements are known
+\subp{CALL sla\_PV2EL (\vtop
+                      {\hbox{PV, DATE, PMASS, JFORMR, JFORM, EPOCH, ORBINC,}
+                     \hbox{ANODE, PERIH, AORQ, E, AORL, DM, JSTAT)}}}
+   Orbital elements of a planet from instantaneous position and velocity
+\subp{CALL sla\_PERTEL (\vtop
+                       {\hbox{JFORM, DATE0, DATE1,}
+                     \hbox{EPOCH0, ORBI0, ANODE0, PERIH0, AORQ0, E0, AM0,}
+                     \hbox{EPOCH1, ORBI1, ANODE1, PERIH1, AORQ1, E1, AM1,}
+                     \hbox{JSTAT)}}}
+   Update elements by applying perturbations
+\subp{CALL sla\_EL2UE (\vtop
+                      {\hbox{DATE, JFORM, EPOCH, ORBINC, ANODE,}
+                     \hbox{PERIH, AORQ, E, AORL, DM,}
+                     \hbox{U, JSTAT)}}}
+   Transform conventional elements to universal elements
+\subp{CALL sla\_UE2EL (\vtop
+                      {\hbox{U, JFORMR,}
+                     \hbox{JFORM, EPOCH, ORBINC, ANODE, PERIH,}
+                     \hbox{AORQ, E, AORL, DM, JSTAT)}}}
+   Transform universal elements to conventional elements
+\subp{CALL sla\_PV2UE (PV, DATE, PMASS, U, JSTAT)}
+   Package a position and velocity for use as universal elements
+\subp{CALL sla\_UE2PV (DATE, U, PV, JSTAT)}
+   Extract the position and velocity from universal elements
+\subp{CALL sla\_PERTUE (DATE, U, JSTAT)}
+   Update universal elements by applying perturbations
+\subp{R~=~sla\_RVEROT (PHI, RA, DA, ST)}
+   Velocity component due to rotation of the Earth
+\subp{CALL sla\_ECOR (RM, DM, IY, ID, FD, RV, TL)}
+   Components of velocity and light time due to Earth orbital motion
+\subp{R~=~sla\_RVLSRD (R2000, D2000)}
+   Velocity component due to solar motion wrt dynamical LSR
+\subp{R~=~sla\_RVLSRK (R2000, D2000)}
+   Velocity component due to solar motion wrt kinematical LSR
+\subp{R~=~sla\_RVGALC (R2000, D2000)}
+   Velocity component due to rotation of the Galaxy
+\subp{R~=~sla\_RVLG (R2000, D2000)}
+   Velocity component due to rotation and translation of the
+   Galaxy, relative to the mean motion of the local group
+\end{callset}
+
+\callhead{Astrometry}
+\begin{callset}
+\subq{CALL sla\_S2TP (RA, DEC, RAZ, DECZ, XI, ETA, J)}
+     {CALL sla\_DS2TP (RA, DEC, RAZ, DECZ, XI, ETA, J)}
+   Transform spherical coordinates into tangent plane
+\subq{CALL sla\_V2TP (V, V0, XI, ETA, J)}
+     {CALL sla\_DV2TP (V, V0, XI, ETA, J)}
+   Transform \xyz\ into tangent plane coordinates
+\subq{CALL sla\_DTP2S (XI, ETA, RAZ, DECZ, RA, DEC)}
+     {CALL sla\_TP2S (XI, ETA, RAZ, DECZ, RA, DEC)}
+   Transform tangent plane coordinates into spherical coordinates
+\subq{CALL sla\_DTP2V (XI, ETA, V0, V)}
+     {CALL sla\_TP2V (XI, ETA, V0, V)}
+   Transform tangent plane coordinates into \xyz
+\subq{CALL sla\_DTPS2C (XI, ETA, RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2, N)}
+     {CALL sla\_TPS2C (XI, ETA, RA, DEC, RAZ1, DECZ1, RAZ2, DECZ2, N)}
+   Get plate centre from star \radec\ and tangent plane coordinates
+\subq{CALL sla\_DTPV2C (XI, ETA, V, V01, V02, N)}
+     {CALL sla\_TPV2C (XI, ETA, V, V01, V02, N)}
+   Get plate centre from star \xyz\ and tangent plane coordinates
+\subp{CALL sla\_PCD (DISCO, X, Y)}
+   Apply pincushion/barrel distortion
+\subp{CALL sla\_UNPCD (DISCO, X, Y)}
+   Remove pincushion/barrel distortion
+\subp{CALL sla\_FITXY (ITYPE, NP, XYE, XYM, COEFFS, J)}
+   Fit a linear model to relate two sets of \xy\ coordinates
+\subp{CALL sla\_PXY (NP, XYE, XYM, COEFFS, XYP, XRMS, YRMS, RRMS)}
+   Compute predicted coordinates and residuals
+\subp{CALL sla\_INVF (FWDS, BKWDS, J)}
+   Invert a linear model
+\subp{CALL sla\_XY2XY (X1, Y1, COEFFS, X2, Y2)}
+   Transform one \xy
+\subp{CALL sla\_DCMPF (COEFFS, XZ, YZ, XS, YS, PERP, ORIENT)}
+   Decompose a linear fit into scales {\it etc.}
+\end{callset}
+
+\callhead{Numerical Methods}
+\begin{callset}
+\subp{CALL sla\_COMBN (NSEL, NCAND, LIST, J)}
+   Next combination (subset from a specified number of items)
+\subp{CALL sla\_PERMUT (N, ISTATE, IORDER, J)}
+   Next permutation of a specified number of items
+\subq{CALL sla\_SMAT (N, A, Y, D, JF, IW)}
+     {CALL sla\_DMAT (N, A, Y, D, JF, IW)}
+   Matrix inversion and solution of simultaneous equations
+\subp{CALL sla\_SVD (M, N, MP, NP, A, W, V, WORK, JSTAT)}
+   Singular value decomposition of a matrix
+\subp{CALL sla\_SVDSOL (M, N, MP, NP, B, U, W, V, WORK, X)}
+   Solution from given vector plus SVD
+\subp{CALL sla\_SVDCOV (N, NP, NC, W, V, WORK, CVM)}
+   Covariance matrix from SVD
+\subp{R~=~sla\_RANDOM (SEED)}
+   Generate pseudo-random real number in the range {$0 \leq x < 1$}
+\subp{R~=~sla\_GRESID (S)}
+   Generate pseudo-random normal deviate ($\equiv$ `Gaussian residual')
+\end{callset}
+
+\callhead{Real-time}
+\begin{callset}
+\subp{CALL sla\_WAIT (DELAY)}
+    Interval wait
+\end{callset}
+
+\end{document}
-- 
cgit 

