/* convrt.f -- translated by f2c (version 19980913).
   You must link the resulting object file with the libraries:
	-lf2c -lm   (in that order)
*/

#include "f2c.h"

/* Table of constant values */

static integer c__27 = 27;
static integer c__5 = 5;
static integer c__3 = 3;
static integer c__9 = 9;

/* $Procedure      CONVRT ( Convert Units ) */
/* Subroutine */ int convrt_(doublereal *x, char *in, char *out, doublereal *
	y, ftnlen in_len, ftnlen out_len)
{
    /* Initialized data */

    static logical first = TRUE_;
    static char units[16*27] = "RADIANS         " "DEGREES         " "ARCMIN"
	    "UTES      " "ARCSECONDS      " "HOURANGLE       " "MINUTEANGLE  "
	    "   " "SECONDANGLE     " "METERS          " "KM              " 
	    "CM              " "MM              " "LIGHTSECS       " "AU    "
	    "          " "FEET            " "INCHES          " "STATUTE_MILES"
	    "   " "NAUTICAL_MILES  " "YARDS           " "LIGHTYEARS      " 
	    "PARSECS         " "SECONDS         " "MINUTES         " "HOURS "
	    "          " "DAYS            " "JULIAN_YEARS    " "TROPICAL_YEAR"
	    "S  " "YEARS           ";
    static doublereal cnvrtn[27] = { 0.0,1.,.016666666666666666,
	    2.7777777777777778e-4,15.,.25,.0041666666666666666,1.,1e3,.01,
	    .001,299792458.,149597870613.68887,.3048,.0254,1609.344,1852.,
	    .9144,9460730472580800.,30856775797231604.,1.,60.,3600.,86400.,
	    31557600.,31556925.976319999,31557600. };
    static char type__[8*27] = "ANGLE   " "ANGLE   " "ANGLE   " "ANGLE   " 
	    "ANGLE   " "ANGLE   " "ANGLE   " "DISTANCE" "DISTANCE" "DISTANCE" 
	    "DISTANCE" "DISTANCE" "DISTANCE" "DISTANCE" "DISTANCE" "DISTANCE" 
	    "DISTANCE" "DISTANCE" "DISTANCE" "DISTANCE" "TIME    " "TIME    " 
	    "TIME    " "TIME    " "TIME    " "TIME    " "TIME    ";

    /* System generated locals */
    address a__1[5], a__2[3], a__3[9];
    integer i__1[5], i__2[3], i__3, i__4, i__5[9];
    char ch__1[101], ch__2[56], ch__3[57], ch__4[123];

    /* Builtin functions */
    /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen);
    integer s_rnge(char *, integer, char *, integer), s_cmp(char *, char *, 
	    ftnlen, ftnlen);

    /* Local variables */
    doublereal temp;
    char outu[16];
    integer i__, j;
    extern /* Subroutine */ int chkin_(char *, ftnlen), ucase_(char *, char *,
	     ftnlen, ftnlen);
    extern integer isrchc_(char *, integer *, char *, ftnlen, ftnlen);
    extern /* Subroutine */ int sigerr_(char *, ftnlen), chkout_(char *, 
	    ftnlen), setmsg_(char *, ftnlen);
    extern logical return_(void);
    extern doublereal dpr_(void);
    char inu[16];

/* $ Abstract */

/*      Take a measurement X, the units associated with */
/*      X, and units to which X should be converted; return Y --- */
/*      the value of the measurement in the output units. */

/* $ Disclaimer */

/*     THIS SOFTWARE AND ANY RELATED MATERIALS WERE CREATED BY THE */
/*     CALIFORNIA INSTITUTE OF TECHNOLOGY (CALTECH) UNDER A U.S. */
/*     GOVERNMENT CONTRACT WITH THE NATIONAL AERONAUTICS AND SPACE */
/*     ADMINISTRATION (NASA). THE SOFTWARE IS TECHNOLOGY AND SOFTWARE */
/*     PUBLICLY AVAILABLE UNDER U.S. EXPORT LAWS AND IS PROVIDED "AS-IS" */
/*     TO THE RECIPIENT WITHOUT WARRANTY OF ANY KIND, INCLUDING ANY */
/*     WARRANTIES OF PERFORMANCE OR MERCHANTABILITY OR FITNESS FOR A */
/*     PARTICULAR USE OR PURPOSE (AS SET FORTH IN UNITED STATES UCC */
/*     SECTIONS 2312-2313) OR FOR ANY PURPOSE WHATSOEVER, FOR THE */
/*     SOFTWARE AND RELATED MATERIALS, HOWEVER USED. */

/*     IN NO EVENT SHALL CALTECH, ITS JET PROPULSION LABORATORY, OR NASA */
/*     BE LIABLE FOR ANY DAMAGES AND/OR COSTS, INCLUDING, BUT NOT */
/*     LIMITED TO, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND, */
/*     INCLUDING ECONOMIC DAMAGE OR INJURY TO PROPERTY AND LOST PROFITS, */
/*     REGARDLESS OF WHETHER CALTECH, JPL, OR NASA BE ADVISED, HAVE */
/*     REASON TO KNOW, OR, IN FACT, SHALL KNOW OF THE POSSIBILITY. */

/*     RECIPIENT BEARS ALL RISK RELATING TO QUALITY AND PERFORMANCE OF */
/*     THE SOFTWARE AND ANY RELATED MATERIALS, AND AGREES TO INDEMNIFY */
/*     CALTECH AND NASA FOR ALL THIRD-PARTY CLAIMS RESULTING FROM THE */
/*     ACTIONS OF RECIPIENT IN THE USE OF THE SOFTWARE. */

/* $ Required_Reading */

/*     None. */

/* $ Keywords */

/*      CONVERSION, UNITS */

/* $ Declarations */
/* $ Brief_I/O */

/*      VARIABLE  I/O  DESCRIPTION */
/*      --------  ---  ------------------------------------------------- */
/*      X          I   Number representing a measurement in some units. */
/*      IN         I   The units in which X is measured. */
/*      OUT        I   Desired units for the measurement. */
/*      Y          O   The measurment in the desired units. */

/* $ Detailed_Input */

/*      X          is a number representing a measurement in the units */
/*                 specified by IN. */

/*      IN         represents the units associated with a measurement X. */
/*                 Acceptable units are: */

/*                 Angles:                 'RADIANS' */
/*                                         'DEGREES' */
/*                                         'ARCMINUTES' */
/*                                         'ARCSECONDS' */
/*                                         'HOURANGLE' */
/*                                         'MINUTEANGLE' */
/*                                         'SECONDANGLE' */

/*                 Metric Distances:       'METERS' */
/*                                         'KM' */
/*                                         'CM' */
/*                                         'MM' */

/*                 English Distances:      'FEET' */
/*                                         'INCHES' */
/*                                         'YARDS' */
/*                                         'STATUTE_MILES' */
/*                                         'NAUTICAL_MILES' */

/*                 Astrometric Distances:  'AU' */
/*                                         'PARSECS' */
/*                                         'LIGHTSECS' */
/*                                         'LIGHTYEARS' julian lightyears */

/*                 Time:                   'SECONDS' */
/*                                         'MINUTES' */
/*                                         'HOURS' */
/*                                         'DAYS' */
/*                                         'JULIAN_YEARS' */
/*                                         'TROPICAL_YEARS' */
/*                                         'YEARS' (same as julian years) */

/*      OUT        represents the units desired for the measurement X. */
/*                 See the description of IN. */

/* $ Detailed_Output */

/*      Y          is the input measurement converted to the desired */
/*                 units. */


/* $ Parameters */

/*     None. */

/* $ Particulars */

/*      This routine converts a measurement X given in units specified by */
/*      IN to the equivalent value Y in units specified by OUT. */

/*      If a unit is not recognized, an error message is produced that */
/*      indicates which one was not recognized. */

/*      If input and output units are incompatible (for example ANGLE */
/*      and DISTANCE units) and error message will be produced stating */
/*      the requested units and associated types. */

/* $ Examples */

/*      To convert 1 meter to statute miles and feet you could */

/*         CALL CONVRT ( 1.0D0, 'METERS',        'STATUTE_MILES', MILES ) */
/*         CALL CONVRT ( MILES, 'STATUTE_MILES', 'FEET',          FEET  ) */

/*      or */

/*         CALL CONVRT ( 1.0D0, 'METERS', 'STATUTE_MILES', MILES ) */
/*         CALL CONVRT ( 1.0D0, 'METERS', 'FEET',          FEET  ) */


/* $ Restrictions */

/*      You should make sure that your units are appropriate for the */
/*      measurement. This routine does not do any checking for over- */
/*      flow. Something like */

/*            CALL ( 10.0D22, 'LIGHTYEARS', 'MM', Y ) */

/*      will cause a floating point overflow. */

/*      Some of the units are not "defined" quantities.  In such a case */
/*      a best estimate is provided as of the date of the current version */
/*      of this routine.  Those estimated quantities are: */

/*         1 AU    --- the astronomical unit  is taken from the JPL */
/*                     ephemeris DE125.  It is believed to be accurate to */
/*                     about 40 meters. */

/*         The tropical year is the time from equinox to equinox.  This */
/*         varies slightly with time. */

/*         1 PARSEC --- is dependent upon the value of the astronomical */
/*                      unit. */

/* $ Exceptions */

/*         1) If the input units, output units, or both input and */
/*            output units are not recognized, the error */
/*            SPICE(UNITSNOTREC) is signalled. */

/*         2) If the units being converted between are incompatible, the */
/*            error SPICE(INCOMPATIBLEUNITS) is signalled. */

/* $ Files */

/*      None. */

/* $ Author_and_Institution */

/*      C.A. Curzon     (JPL) */
/*      H.A. Neilan     (JPL) */
/*      W.M. Owen       (JPL) */
/*      W.L. Taber      (JPL) */
/*      I.M. Underwood  (JPL) */

/* $ Literature_References */

/*      None. */

/* $ Version */

/* -     SPICELIB Version 1.0.1, 10-MAR-1992 (WLT) */

/*         Comment section for permuted index source lines was added */
/*         following the header. */

/* -     SPICELIB Version 1.0.0, 31-JAN-1990 (CAC) (WMO) (WLT) (IMU) */

/* -& */
/* $ Index_Entries */

/*     convert units */

/* -& */
/* $ Revisions */

/* -     Beta Version 1.2.0, 05-JAN-1990 (WLT) */

/*         Data statements for double precision values were changed */
/*         to include a 'D' so that this routine would function properly */
/*         on the Univac. */

/* -    Beta Version 1.1.0, 02-MAR-1989 (HAN) */

/*        The variable LIGHTYEAR was changed to LTYEAR in order to */
/*        comply with the ANSI Fortran Standard six character */
/*        variable name length restriction. */

/* -& */

/*     SPICELIB functions */


/*     Local variables */


/*     1.0d0 divided by the sin of 1 arc second */


/*     Angular Conversions: */

/*                 (1)  Degrees/Radians */
/*                 (2)  Degrees/Degrees */
/*                 (3)  Degrees/ARCMINUTES */
/*                 (4)  Degrees/ARCSECONDS */

/*                 ()   Degrees/HOURANGLE */
/*                 ()   Degrees/MINUTEANGLE */
/*                 ()   Degrees/SECONDANGLE */


/*     DATA CNVRTN (ANG + 1)  /      DPR()   / */

/*     This value will be loaded using the SPICELIB function DPR() */
/*     on the first execution of this routine. */


/*     Distance Conversions ( 5 through 17 ) */

/*                 ( 5) Meters/Meter */
/*                 ( 6) Meters/Km */
/*                 ( 7) Meters/Cm */
/*                 ( 8) Meters/mm */
/*                 ( 9) Meters/Lightsecs */
/*                 (10) Meters/AU */


/*     Distance Conversions */

/*                 (+ 7 ) Meters/Foot */
/*                 (+ 8 ) Meters/inch */
/*                 (+ 9 ) Meters/Statute Mile */
/*                 (+ 10) Meters/Nautical Mile */
/*                 (+ 11) Meters/Yard */


/*     Distance Conversions */

/*                 (+ 12) Meters/LightYear */
/*                 (+ 13) Meters/Parsec */


/*     Time Conversions */

/*                 (+ 1 ) seconds / second */
/*                 (+ 2 ) seconds / minute */
/*                 (+ 3 ) seconds / hour */
/*                 (+ 4 ) seconds / day */
/*                 (+ 5 ) Seconds / Julian year */
/*                 (+ 6 ) Seconds / Tropical year */
/*                 (+ 7 ) Seconds / year          --- same as Julian year */


/*     Set up the error processing. */

    if (return_()) {
	return 0;
    }
    chkin_("CONVRT", (ftnlen)6);
    if (first) {
	cnvrtn[0] = dpr_();
	first = FALSE_;
    }
    ucase_(in, inu, in_len, (ftnlen)16);
    ucase_(out, outu, out_len, (ftnlen)16);
    i__ = isrchc_(inu, &c__27, units, (ftnlen)16, (ftnlen)16);
    j = isrchc_(outu, &c__27, units, (ftnlen)16, (ftnlen)16);
    if (i__ == 0 || j == 0) {
	if (i__ == 0 && j == 0) {
/* Writing concatenation */
	    i__1[0] = 32, a__1[0] = "CONVRT: Neither the input units ";
	    i__1[1] = 16, a__1[1] = inu;
	    i__1[2] = 21, a__1[2] = "nor the output units ";
	    i__1[3] = 16, a__1[3] = outu;
	    i__1[4] = 16, a__1[4] = "were recognized.";
	    s_cat(ch__1, a__1, i__1, &c__5, (ftnlen)101);
	    setmsg_(ch__1, (ftnlen)101);
	    sigerr_("SPICE(UNITSNOTREC)", (ftnlen)18);
	    chkout_("CONVRT", (ftnlen)6);
	    return 0;
	} else if (i__ == 0) {
/* Writing concatenation */
	    i__2[0] = 20, a__2[0] = "CONVRT: Input units ";
	    i__2[1] = 16, a__2[1] = inu;
	    i__2[2] = 20, a__2[2] = " were not recognized";
	    s_cat(ch__2, a__2, i__2, &c__3, (ftnlen)56);
	    setmsg_(ch__2, (ftnlen)56);
	    sigerr_("SPICE(UNITSNOTREC)", (ftnlen)18);
	    chkout_("CONVRT", (ftnlen)6);
	    return 0;
	} else if (j == 0) {
/* Writing concatenation */
	    i__2[0] = 21, a__2[0] = "CONVRT: Output units ";
	    i__2[1] = 16, a__2[1] = outu;
	    i__2[2] = 20, a__2[2] = " were not recognized";
	    s_cat(ch__3, a__2, i__2, &c__3, (ftnlen)57);
	    setmsg_(ch__3, (ftnlen)57);
	    sigerr_("SPICE(UNITSNOTREC)", (ftnlen)18);
	    chkout_("CONVRT", (ftnlen)6);
	    return 0;
	}
    }
    if (s_cmp(type__ + (((i__3 = i__ - 1) < 27 && 0 <= i__3 ? i__3 : s_rnge(
	    "type", i__3, "convrt_", (ftnlen)514)) << 3), type__ + (((i__4 = 
	    j - 1) < 27 && 0 <= i__4 ? i__4 : s_rnge("type", i__4, "convrt_", 
	    (ftnlen)514)) << 3), (ftnlen)8, (ftnlen)8) != 0) {
/* Writing concatenation */
	i__5[0] = 58, a__3[0] = "CONVRT: Incompatible units. You are attempt"
		"ing to convert ";
	i__5[1] = 16, a__3[1] = inu;
	i__5[2] = 6, a__3[2] = "type: ";
	i__5[3] = 8, a__3[3] = type__ + (((i__3 = i__ - 1) < 27 && 0 <= i__3 ?
		 i__3 : s_rnge("type", i__3, "convrt_", (ftnlen)516)) << 3);
	i__5[4] = 4, a__3[4] = " to ";
	i__5[5] = 16, a__3[5] = outu;
	i__5[6] = 6, a__3[6] = "type: ";
	i__5[7] = 8, a__3[7] = type__ + (((i__4 = j - 1) < 27 && 0 <= i__4 ? 
		i__4 : s_rnge("type", i__4, "convrt_", (ftnlen)516)) << 3);
	i__5[8] = 1, a__3[8] = ".";
	s_cat(ch__4, a__3, i__5, &c__9, (ftnlen)123);
	setmsg_(ch__4, (ftnlen)123);
	sigerr_("SPICE(INCOMPATIBLEUNITS)", (ftnlen)24);
	chkout_("CONVRT", (ftnlen)6);
	return 0;
    }
    temp = *x * cnvrtn[(i__3 = i__ - 1) < 27 && 0 <= i__3 ? i__3 : s_rnge(
	    "cnvrtn", i__3, "convrt_", (ftnlen)532)];
    *y = temp / cnvrtn[(i__3 = j - 1) < 27 && 0 <= i__3 ? i__3 : s_rnge("cnv"
	    "rtn", i__3, "convrt_", (ftnlen)533)];
    chkout_("CONVRT", (ftnlen)6);
    return 0;
} /* convrt_ */

