NAME:
     ephem
 PURPOSE: (one line)
     Ephemeris generator for solar system objects.
 DESCRIPTION:
     This program pipes the input data to an external FORTRAN program
     written by Larry Wasserman.  The external program looks up the orbital
     elements of each object and computes the positions requested by the
     output code.  The output code options are:

        Code  Meaning
        -----------------------------------------------------------------------
         0    Topocentric RA, Dec, of date of object.
         1    Topocentric RA, Dec,  B1950  of object.
         2    Topocentric RA, Dec,  J2000  of object.
         3    Topocentric x, y, z, of date of object.
         4    Topocentric x, y, z,  B1950  of object.
         5    Topocentric x, y, z,  J2000  of object.
         6    Topocentric x, y, z, of date of Sun.
         7    Topocentric x, y, z,  B1950  of Sun.
         8    Topocentric x, y, z,  J2000  of Sun.
         9    B1950 x, y, z, of object with respect to solar system barycenter.
        10    J2000 x, y, z, of object with respect to solar system barycenter.
        11    J2000 osculating orbital elements for the object
                0 - mean anomaly (M)
                1 - argument of perihelion
                2 - longitude of the asending node
                3 - inclination (i)
                4 - eccentricity (e)
                5 - semi-major axis (a)
                6 - perihelion distance (q)
                7 - aphelion distance (Q)
                8 - Orbital period
                9 - epoch of elements
               10 - line of variations (delta RA)
               11 - line of variations (delta Dec)
               12 - semi-major axis of error ellipse
               13 - semi-minor axis of error ellipse
               14 - Julian Date of last astrometric measurement
               15 - Arc length of astrometry
               16 - Number of astrometric observations

                 VRA, VDec, line of variations for +1 deg change in M (radians)
                 JDlast - date of last astrometric measurement (nearest day)
                 arc - Arc length of astrometric observations (days)
                 nobs - Number of observations used to generate orbit.
        12    Errors on osculating orbital elements for the object
                 M, arg peri, node, i, e, a, q, Q, Period,
                 (9 values)

        20    Code 0 and Code 3 and Code 6 information.
        21    Code 1 and Code 4 and Code 7 information.
        22    Code 2 and Code 5 and Code 8 information.
        23    Code 2, 5, 8, and 11 information.

           all of the following include errors for all quantities, the
             errors are all together and follow the main quantities.
        31    Barycentric ecliptic x,y,z and velocities, no light time, of date.
        32    Barycentric ecliptic x,y,z and velocities, no light time, B1950.
        33    Barycentric ecliptic x,y,z and velocities, no light time, J2000.
        34    Heliocentric ecliptic x,y,z and velocities, no light time, of date.
        35    Heliocentric ecliptic x,y,z and velocities, no light time, B1950.
        36    Heliocentric ecliptic x,y,z and velocities, no light time, J2000.
        37    Barycentric equatorial x,y,z and velocities, no light time, of date.
        38    Barycentric equatorial x,y,z and velocities, no light time, B1950.
        39    Barycentric equatorial x,y,z and velocities, no light time, J2000.
        40    Heliocentric equatorial x,y,z and velocities, no light time, of date.
        41    Heliocentric equatorial x,y,z and velocities, no light time, B1950.
        42    Heliocentric equatorial x,y,z and velocities, no light time, J2000.
        43    Invariable plane x,y,z and velocities, no light time, of date.
        44    Invariable plane x,y,z and velocities, no light time, B1950.
        45    Invariable plane x,y,z and velocities, no light time, J2000.
        46    Same as 36, plus covariance matrix (48 values total).
        47    x,y,z,xdot,ydot,zdot J2000 equatorial with respect to the
                 center of the Earth

     The object code depends on the type of object requested.
     All asteroids are preceeded by A, comets by C, planets and satellites
     by P, and topocentric locations by T.  For asteroids, either the number
     of the asteroid or its provisional designation will work.  Comets
     are recognized by either provisional or final designations, not names.
     Planets and satellites use the NAIF coding scheme for objects.  For
     example, the Pluto-Charon barycenter is 9, Charon is 901 and the
     center of Pluto is 999.  Topocentric locations use the same code as
     for the observatory codes, for example, Anderson Mesa would be T688.
     None of the names allow spaces.  If the object isn't recognized or
     supported by the external databases, RA and Dec values (if requested)
     are returned as -99 and the x,y,z values are returned as 0.  Elements
     will return as zero for invalid input.

 CATEGORY:
  Astronomy
 CALLING SEQUENCE:
     ephem,jd,obs,code,object,ephemeris
 INPUTS:
     jd     - Julian Date (UT) of position to calculate (scalar or vector).
     obs    - Observatory code, Marsden's IAUC codes (scalar). (or pre-built structure)
     code   - Output format code (see description) (scalar).
     object - Object code (see description) (string or string array).

 OPTIONAL INPUT PARAMETERS:
 KEYWORD PARAMETERS:
     CACHE  - Flag, if set, indicates that the ephemeris calculations should
                 be saved in a file for possible later use.  The file name
                 used will be code+'.eph'.  The file will be written
                 to the current directory.  If the cache file exists in
                 the current directory and its length matches the length
                 of the input ephemeris generation request, then the file
                 will be read instead of making the call to the external
                 program, geteph.  If there is no file or if the file isn't
                 the right length, the ephemeris generation will proceed
                 normally.
     FNCACHE - If you need to provide a better (or more unique) file name
                 than the default algorithm, set this keyword to a string
                 to be used as the file name for the cached data.
     PIPE    - If you pass in a valid lun for the geteph pipe, then
                 ephem will use this pipe rather than open up a new one.
                 This can dramatically decrease execution time for numerous
                 "short" calls to ephem.  In this case, the calling program\
                 must open and close the pipe itself.
 OUTPUTS:
     ephemeris - 2-D double precision array of values requested by code.
                         array is NxM where M is equal to the number of
                         times in the input jd array.  N varies depending
                         on the output code (ie., for code=2, N=2)

 COMMON BLOCKS:
 SIDE EFFECTS:
 RESTRICTIONS:
 PROCEDURE:
 MODIFICATION HISTORY:
     3/24/93 - IDL interface written by Marc W. Buie, Lowell Observatory.
     99/07/25, MWB, added CACHE and FNCACHE keyword
     01/04/06, DBT, added PIPE keyword
     01/04/03, MWB, changed to support two error numbers in information
     02/06/28, MWB, added support for codes 31-45
     02/07/01, MWB, added support for code 12
     2002/09/09, MWB, added support for string obscode values
     2002/10/31, MWB, added support for code 46
     2003/04/25, MWB, changed test for bad return on code 12
     2013/03/06, MWB, changed to allow one input time and multiple objects
     2015/03/17, MWB, added support for non-standard observatories
     2017/12/02, MWB, added code 47 support
     2024/07/06, MWB, rework for new obs tools, dropped OBSPOS keyword, dropped
                         support for more than one observatory per call