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

#include "f2c.h"

/* $Procedure    DLATDR ( Derivative of latitudinal w.r.t. rectangular ) */
/* Subroutine */ int dlatdr_(doublereal *x, doublereal *y, doublereal *z__, 
	doublereal *jacobi)
{
    doublereal long__, r__;
    extern /* Subroutine */ int chkin_(char *, ftnlen), vpack_(doublereal *, 
	    doublereal *, doublereal *, doublereal *);
    doublereal injacb[9]	/* was [3][3] */;
    extern /* Subroutine */ int reclat_(doublereal *, doublereal *, 
	    doublereal *, doublereal *);
    doublereal rectan[3];
    extern /* Subroutine */ int drdlat_(doublereal *, doublereal *, 
	    doublereal *, doublereal *), sigerr_(char *, ftnlen), chkout_(
	    char *, ftnlen), setmsg_(char *, ftnlen);
    extern logical return_(void);
    extern /* Subroutine */ int invort_(doublereal *, doublereal *);
    doublereal lat;

/* $ Abstract */

/*     This routine computes the Jacobian of the transformation from */
/*     rectangular to latitudinal coordinates. */

/* $ 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 */

/*     COORDINATES */
/*     DERIVATIVES */
/*     MATRIX */

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

/*     Variable  I/O  Description */
/*     --------  ---  -------------------------------------------------- */
/*     X          I   X-coordinate of point. */
/*     Y          I   Y-coordinate of point. */
/*     Z          I   Z-coordinate of point. */
/*     JACOBI     O   Matrix of partial derivatives. */

/* $ Detailed_Input */

/*     X, */
/*     Y, */
/*     Z          are the rectangular coordinates of the point at */
/*                which the Jacobian of the map from rectangular */
/*                to latitudinal coordinates is desired. */

/* $ Detailed_Output */

/*     JACOBI     is the matrix of partial derivatives of the conversion */
/*                between rectangular and latitudinal coordinates.  It */
/*                has the form */

/*                    .-                              -. */
/*                    |  dr/dx     dr/dy     dr/dz     | */
/*                    |  dlong/dx  dlong/dy  dlong/dz  | */
/*                    |  dlat/dx   dlat/dy   dlat/dz   | */
/*                    `-                              -' */

/*               evaluated at the input values of X, Y, and Z. */

/* $ Parameters */

/*     None. */

/* $ Exceptions */

/*     1) If the input point is on the z-axis ( X and Y = 0 ), the */
/*        Jacobian is undefined.  The error SPICE(POINTONZAXIS) */
/*        will be signaled. */

/* $ Files */

/*     None. */

/* $ Particulars */

/*     When performing vector calculations with velocities it is */
/*     usually most convenient to work in rectangular coordinates. */
/*     However, once the vector manipulations have been performed */
/*     it is often desirable to convert the rectangular representations */
/*     into latitudinal coordinates to gain insights about phenomena */
/*     in this coordinate frame. */

/*     To transform rectangular velocities to derivatives of coordinates */
/*     in a latitudinal system, one uses the Jacobian of the */
/*     transformation between the two systems. */

/*     Given a state in rectangular coordinates */

/*          ( x, y, z, dx, dy, dz ) */

/*     the corresponding latitudinal coordinate derivatives are given by */
/*     the matrix equation: */

/*                         t          |                     t */
/*        (dr, dlong, dlat)   = JACOBI|        * (dx, dy, dz) */
/*                                    |(x,y,z) */

/*     This routine computes the matrix */

/*              | */
/*        JACOBI| */
/*              |(x, y, z) */

/* $ Examples */

/*     Suppose one is given the bodyfixed rectangular state of an object */
/*     ( x(t), y(t), z(t), dx(t), dy(t), dz(t) ) as a function of time t. */

/*     To find the derivatives of the coordinates of the object in */
/*     bodyfixed latitudinal coordinates, one simply multiplies the */
/*     Jacobian of the transformation from rectangular to latitudinal */
/*     (evaluated at x(t), y(t), z(t) ) by the rectangular velocity */
/*     vector of the object at time t. */

/*     In code this looks like: */

/*        C */
/*        C     Load the rectangular velocity vector vector RECV. */
/*        C */
/*              RECV(1) = DX_DT ( T ) */
/*              RECV(3) = DY_DT ( T ) */
/*              RECV(2) = DZ_DT ( T ) */

/*        C */
/*        C     Determine the Jacobian of the transformation from */
/*        C     rectangular to latitudinal at the rectangular */
/*        C     coordinates at time T. */
/*        C */
/*              CALL DLATDR ( X(T), Y(T), Z(T), JACOBI ) */

/*        C */
/*        C     Multiply the Jacobian on the right by the rectangular */
/*        C     velocity to obtain the latitudinal coordinate */
/*        C     derivatives LATV. */
/*        C */
/*              CALL MXV ( JACOBI, RECV, LATV ) */


/* $ Restrictions */

/*     None. */

/* $ Literature_References */

/*     None. */

/* $ Author_and_Institution */

/*     W.L. Taber     (JPL) */

/* $ Version */

/* -    SPICELIB Version 1.0.0, 16-JUL-2001 (WLT) */

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

/*     Jacobian of latitudinal w.r.t. rectangular coordinates */

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

/*     None. */

/* -& */

/*     SPICELIB functions */


/*     Local variables */


/*     Standard SPICE error handling. */

    if (return_()) {
	return 0;
    } else {
	chkin_("DLATDR", (ftnlen)6);
    }

/*     There is a singularity of the Jacobian for points on the z-axis. */

    if (*x == 0. && *y == 0.) {
	setmsg_("The Jacobian of the transformation from rectangular to lati"
		"tudinal coordinates is not defined for points on the z-axis.",
		 (ftnlen)119);
	sigerr_("SPICE(POINTONZAXIS)", (ftnlen)19);
	chkout_("DLATDR", (ftnlen)6);
	return 0;
    }

/*     We will get the Jacobian of the transformation from rectangular */
/*     to latitudinal coordinates by implicit differentiation. */

/*     First move the X,Y and Z coordinates into a vector. */

    vpack_(x, y, z__, rectan);

/*     Convert from rectangular to latitudinal coordinates. */

    reclat_(rectan, &r__, &long__, &lat);

/*     Get the Jacobian of the transformation from latitudinal to */
/*     rectangular coordinates at R, LONG, LAT. */

    drdlat_(&r__, &long__, &lat, injacb);

/*     Now invert INJACB to get the Jacobian of the transformation from */
/*     rectangular to latitudinal coordinates. */

    invort_(injacb, jacobi);
    chkout_("DLATDR", (ftnlen)6);
    return 0;
} /* dlatdr_ */

