void gfsstp_c ( SpiceDouble step ) /* -Brief_I/O VARIABLE I/O DESCRIPTION -------- --- -------------------------------------------------- step I Time step to take. -Detailed_Input step is the output step size to be returned by the next call to gfstep_c. Units are TDB seconds. `step' is used in the GF search root-bracketing process. `step' indicates how far to advance the gfstep_c input argument `time' so that `time' and time+step may bracket a state transition and definitely do not bracket more than one state transition. -Detailed_Output None. -Parameters None. -Exceptions 1) If the input step size is non-positive, the error SPICE(INVALIDSTEP) is signaled. The stored step value is not updated. -Files None. -Particulars This routine sets the step size to be returned by the next call to gfstep_c. -Examples 1) User applications can pass gfstep_c to mid-level GF API routines expecting a step size routine as an input argument. Before such a call is made, the value of the step to be returned by gfstep_c must be set via a call to this routine. For example, the GF API routine gfocce_c can be called as shown in the code fragment below. /. Select a twenty-second step. We'll ignore any occultations lasting less than 20 seconds. ./ step = 20.0; gfsstp_c ( step ); /. Perform the search. ./ gfocce_c ( "ANY", "MOON", "ellipsoid", "IAU_MOON", "SUN", "ellipsoid", "IAU_SUN", "LT", "EARTH", CNVTOL, gfstep_c, gfrefn_c, rpt, gfrepi_c, gfrepu_c, gfrepf_c, bail, gfbail_c, cnfine, &result ); -Restrictions None. -Literature_References None. -Author_and_Institution N.J. Bachman (JPL) W.L. Taber (JPL) I.M. Underwood (JPL) L.S. Elson (JPL) E.D. Wright (JPL) -Version -CSPICE Version 2.0.1, 15-APR-2009 (LSE) (NJB) -Index_Entries GF set constant step size -& */ { /* Begin gfsstp_c */ /* Participate in error tracing. */ if ( return_c() ) { return; } chkin_c ( "gfsstp_c" ); /* Let the f2c'd routine do the work. */ gfsstp_ ( (doublereal * ) &step ); chkout_c ( "gfsstp_c" ); } /* End gfsstp_c */
/* $Procedure GFRFOV ( GF, is ray in FOV? ) */ /* Subroutine */ int gfrfov_(char *inst, doublereal *raydir, char *rframe, char *abcorr, char *obsrvr, doublereal *step, doublereal *cnfine, doublereal *result, ftnlen inst_len, ftnlen rframe_len, ftnlen abcorr_len, ftnlen obsrvr_len) { /* System generated locals */ integer i__1; /* Local variables */ extern /* Subroutine */ int chkin_(char *, ftnlen), errdp_(char *, doublereal *, ftnlen); extern integer sized_(doublereal *); extern logical gfbail_(); extern /* Subroutine */ int gfrefn_(), gfrepf_(), gfrepi_(); extern /* Subroutine */ int gffove_(char *, char *, doublereal *, char *, char *, char *, char *, doublereal *, U_fp, U_fp, logical *, U_fp, U_fp, U_fp, logical *, L_fp, doublereal *, doublereal *, ftnlen, ftnlen, ftnlen, ftnlen, ftnlen, ftnlen); extern /* Subroutine */ int gfrepu_(), gfstep_(); extern /* Subroutine */ int setmsg_(char *, ftnlen), errint_(char *, integer *, ftnlen), sigerr_(char *, ftnlen); extern logical return_(void); extern /* Subroutine */ int chkout_(char *, ftnlen), gfsstp_(doublereal *) ; /* $ Abstract */ /* Determine time intervals when a specified ray intersects the */ /* space bounded by the field-of-view (FOV) of a specified */ /* instrument. */ /* $ 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 */ /* CK */ /* FRAMES */ /* GF */ /* KERNEL */ /* NAIF_IDS */ /* PCK */ /* SPK */ /* TIME */ /* WINDOWS */ /* $ Keywords */ /* EVENT */ /* FOV */ /* GEOMETRY */ /* INSTRUMENT */ /* SEARCH */ /* WINDOW */ /* $ Declarations */ /* $ Abstract */ /* This file contains public, global parameter declarations */ /* for the SPICELIB Geometry Finder (GF) subsystem. */ /* $ 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 */ /* GF */ /* $ Keywords */ /* GEOMETRY */ /* ROOT */ /* $ Restrictions */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* L.E. Elson (JPL) */ /* E.D. Wright (JPL) */ /* $ Literature_References */ /* None. */ /* $ Version */ /* - SPICELIB Version 1.0.0, 08-SEP-2009 (EDW) */ /* Added NWRR parameter. */ /* Added NWUDS parameter. */ /* - SPICELIB Version 1.0.0, 21-FEB-2009 (NJB) (LSE) (EDW) */ /* -& */ /* Root finding parameters: */ /* CNVTOL is the default convergence tolerance used by the */ /* high-level GF search API routines. This tolerance is */ /* used to terminate searches for binary state transitions: */ /* when the time at which a transition occurs is bracketed */ /* by two times that differ by no more than CNVTOL, the */ /* transition time is considered to have been found. */ /* Units are TDB seconds. */ /* NWMAX is the maximum number of windows allowed for user-defined */ /* workspace array. */ /* DOUBLE PRECISION WORK ( LBCELL : MW, NWMAX ) */ /* Currently no more than twelve windows are required; the three */ /* extra windows are spares. */ /* Callers of GFEVNT can include this file and use the parameter */ /* NWMAX to declare the second dimension of the workspace array */ /* if necessary. */ /* Callers of GFIDST should declare their workspace window */ /* count using NWDIST. */ /* Callers of GFSEP should declare their workspace window */ /* count using NWSEP. */ /* Callers of GFRR should declare their workspace window */ /* count using NWRR. */ /* Callers of GFUDS should declare their workspace window */ /* count using NWUDS. */ /* ADDWIN is a parameter used to expand each interval of the search */ /* (confinement) window by a small amount at both ends in order to */ /* accommodate searches using equality constraints. The loaded */ /* kernel files must accommodate these expanded time intervals. */ /* FRMNLN is a string length for frame names. */ /* NVRMAX is the maximum number of vertices if FOV type is "POLYGON" */ /* FOVTLN -- maximum length for FOV string. */ /* Specify the character strings that are allowed in the */ /* specification of field of view shapes. */ /* Character strings that are allowed in the */ /* specification of occultation types: */ /* Occultation target shape specifications: */ /* Specify the number of supported occultation types and occultation */ /* type string length: */ /* Instrument field-of-view (FOV) parameters */ /* Maximum number of FOV boundary vectors: */ /* FOV shape parameters: */ /* circle */ /* ellipse */ /* polygon */ /* rectangle */ /* End of file gf.inc. */ /* $ Brief_I/O */ /* VARIABLE I/O DESCRIPTION */ /* -------- --- -------------------------------------------------- */ /* MARGIN P Minimum complement of FOV cone angle. */ /* LBCELL P SPICE Cell lower bound. */ /* CNVTOL P Convergence tolerance. */ /* MAXVRT P Maximum number of FOV boundary vertices. */ /* INST I Name of the instrument. */ /* RAYDIR I Ray's direction vector. */ /* RFRAME I Reference frame of ray's direction vector. */ /* ABCORR I Aberration correction flag. */ /* OBSRVR I Name of the observing body. */ /* STEP I Step size in seconds for finding FOV events. */ /* CNFINE I SPICE window to which the search is restricted. */ /* RESULT O SPICE window containing results. */ /* $ Detailed_Input */ /* INST indicates the name of an instrument, such as a */ /* spacecraft-mounted framing camera, the field of view */ /* (FOV) of which is to be used for an target intersection */ /* search: the direction from the observer to a target */ /* is represented by a ray, and times when the specified */ /* ray intersects the region of space bounded by the FOV */ /* are sought. */ /* The position of the instrument designated by INST is */ /* considered to coincide with that of the ephemeris */ /* object designated by the input argument OBSRVR (see */ /* description below). */ /* INST must have a corresponding NAIF ID and a frame */ /* defined, as is normally done in a frame kernel. It */ /* must also have an associated reference frame and a FOV */ /* shape, boresight and boundary vertices (or reference */ /* vector and reference angles) defined, as is usually */ /* done in an instrument kernel. */ /* See the header of the SPICELIB routine GETFOV for a */ /* description of the required parameters associated with */ /* an instrument. */ /* RAYDIR is the direction vector associated with a ray */ /* representing a target. The ray emanates from the */ /* location of the ephemeris object designated by the */ /* input argument OBSRVR and is expressed relative to the */ /* reference frame designated by RFRAME (see descriptions */ /* below). */ /* RFRAME is the name of the reference frame associated with */ /* the input ray's direction vector RAYDIR. */ /* Since light time corrections are not supported for */ /* rays, the orientation of the frame is always evaluated */ /* at the epoch associated with the observer, as opposed */ /* to the epoch associated with the light-time corrected */ /* position of the frame center. */ /* Case and leading or trailing blanks bracketing a */ /* non-blank frame name are not significant in the string */ /* RFRAME. */ /* ABCORR indicates the aberration corrections to be applied */ /* when computing the ray's direction. */ /* The supported aberration correction options are */ /* 'NONE' No correction. */ /* 'S' Stellar aberration correction, */ /* reception case. */ /* 'XS' Stellar aberration correction, */ /* transmission case. */ /* For detailed information, see the geometry finder */ /* required reading, gf.req. */ /* Case, leading and trailing blanks are not significant */ /* in the string ABCORR. */ /* OBSRVR is the name of the body from which the target */ /* represented by RAYDIR is observed. The instrument */ /* designated by INST is treated as if it were co-located */ /* with the observer. */ /* Optionally, you may supply the integer NAIF ID code */ /* for the body as a string. */ /* Case and leading or trailing blanks are not */ /* significant in the string OBSRVR. */ /* STEP is the step size to be used in the search. STEP must */ /* be shorter than any interval, within the confinement */ /* window, over which the specified condition is met. In */ /* other words, STEP must be shorter than the shortest */ /* visibility event that the user wishes to detect. STEP */ /* also must be shorter than the minimum duration */ /* separating any two visibility events. However, STEP */ /* must not be *too* short, or the search will take an */ /* unreasonable amount of time. */ /* The choice of STEP affects the completeness but not */ /* the precision of solutions found by this routine; the */ /* precision is controlled by the convergence tolerance. */ /* See the discussion of the parameter CNVTOL for */ /* details. */ /* STEP has units of seconds. */ /* CNFINE is a SPICE window that confines the time period over */ /* which the specified search is conducted. CNFINE may */ /* consist of a single interval or a collection of */ /* intervals. */ /* The endpoints of the time intervals comprising CNFINE */ /* are interpreted as seconds past J2000 TDB. */ /* See the Examples section below for a code example */ /* that shows how to create a confinement window. */ /* CNFINE must be initialized by the caller via the */ /* SPICELIB routine SSIZED. */ /* $ Detailed_Output */ /* RESULT is a SPICE window representing the set of time */ /* intervals, within the confinement period, when the */ /* input ray is "visible"; that is, when the ray is */ /* contained in the space bounded by the specified */ /* instrument's field of view. */ /* The endpoints of the time intervals comprising RESULT */ /* are interpreted as seconds past J2000 TDB. */ /* If RESULT is non-empty on input, its contents */ /* will be discarded before GFRFOV conducts its */ /* search. */ /* $ Parameters */ /* LBCELL is the lower bound for SPICE cell arrays. */ /* CNVTOL is the convergence tolerance used for finding */ /* endpoints of the intervals comprising the result */ /* window. CNVTOL is used to determine when binary */ /* searches for roots should terminate: when a root is */ /* bracketed within an interval of length CNVTOL; the */ /* root is considered to have been found. */ /* The accuracy, as opposed to precision, of roots found */ /* by this routine depends on the accuracy of the input */ /* data. In most cases, the accuracy of solutions will be */ /* inferior to their precision. */ /* MAXVRT is the maximum number of vertices that may be used */ /* to define the boundary of the specified instrument's */ /* field of view. */ /* MARGIN is a small positive number used to constrain the */ /* orientation of the boundary vectors of polygonal */ /* FOVs. Such FOVs must satisfy the following constraints: */ /* 1) The boundary vectors must be contained within */ /* a right circular cone of angular radius less */ /* than than (pi/2) - MARGIN radians; in other */ /* words, there must be a vector A such that all */ /* boundary vectors have angular separation from */ /* A of less than (pi/2)-MARGIN radians. */ /* 2) There must be a pair of boundary vectors U, V */ /* such that all other boundary vectors lie in */ /* the same half space bounded by the plane */ /* containing U and V. Furthermore, all other */ /* boundary vectors must have orthogonal */ /* projections onto a specific plane normal to */ /* this plane (the normal plane contains the angle */ /* bisector defined by U and V) such that the */ /* projections have angular separation of at least */ /* 2*MARGIN radians from the plane spanned by U */ /* and V. */ /* MARGIN is currently set to 1.D-12. */ /* See INCLUDE file gf.inc for declarations and descriptions of */ /* parameters used throughout the GF system. */ /* $ Exceptions */ /* 1) In order for this routine to produce correct results, */ /* the step size must be appropriate for the problem at hand. */ /* Step sizes that are too large may cause this routine to miss */ /* roots; step sizes that are too small may cause this routine */ /* to run unacceptably slowly and in some cases, find spurious */ /* roots. */ /* This routine does not diagnose invalid step sizes, except */ /* that if the step size is non-positive, the error */ /* SPICE(INVALIDSTEPSIZE) will be signaled. */ /* 2) Due to numerical errors, in particular, */ /* - Truncation error in time values */ /* - Finite tolerance value */ /* - Errors in computed geometric quantities */ /* it is *normal* for the condition of interest to not always be */ /* satisfied near the endpoints of the intervals comprising the */ /* result window. */ /* The result window may need to be contracted slightly by the */ /* caller to achieve desired results. The SPICE window routine */ /* WNCOND can be used to contract the result window. */ /* 3) If the observer's name cannot be mapped to an ID code, the */ /* error SPICE(IDCODENOTFOUND) is signaled. */ /* 4) If the aberration correction flag calls for light time */ /* correction, the error SPICE(INVALIDOPTION) is signaled. */ /* 5) If the ray's direction vector is zero, the error */ /* SPICE(ZEROVECTOR) is signaled. */ /* 6) If the instrument name INST does not have corresponding NAIF */ /* ID code, the error will be diagnosed by a routine in the call */ /* tree of this routine. */ /* 7) If the FOV parameters of the instrument are not present in */ /* the kernel pool, the error will be be diagnosed by routines */ /* in the call tree of this routine. */ /* 8) If the FOV boundary has more than MAXVRT vertices, the error */ /* will be be diagnosed by routines in the call tree of this */ /* routine. */ /* 9) If the instrument FOV is polygonal, and this routine cannot */ /* find a ray R emanating from the FOV vertex such that maximum */ /* angular separation of R and any FOV boundary vector is within */ /* the limit (pi/2)-MARGIN radians, the error will be diagnosed */ /* by a routine in the call tree of this routine. If the FOV */ /* is any other shape, the same error check will be applied with */ /* the instrument boresight vector serving the role of R. */ /* 10) If the loaded kernels provide insufficient data to compute a */ /* requested state vector, the error will be diagnosed by a */ /* routine in the call tree of this routine. */ /* 11) If an error occurs while reading an SPK or other kernel file, */ /* the error will be diagnosed by a routine in the call tree */ /* of this routine. */ /* 12) If the output SPICE window RESULT has insufficient capacity */ /* to contain the number of intervals on which the specified */ /* visibility condition is met, the error will be diagnosed */ /* by a routine in the call tree of this routine. If the result */ /* window has size less than 2, the error SPICE(WINDOWTOOSMALL) */ /* will be signaled by this routine. */ /* $ Files */ /* Appropriate SPICE kernels must be loaded by the calling program */ /* before this routine is called. */ /* The following data are required: */ /* - SPK data: ephemeris data for the observer for the period */ /* defined by the confinement window 'CNFINE' must be loaded. */ /* If aberration corrections are used, the state of the */ /* observer relative to the solar system barycenter must be */ /* calculable from the available ephemeris data. Typically */ /* ephemeris data are made available by loading one or more SPK */ /* files via FURNSH. */ /* - Data defining the reference frame associated with the */ /* instrument designated by INST must be available in the kernel */ /* pool. Additionally the name INST must be associated with an */ /* ID code. Normally these data are made available by loading */ /* a frame kernel via FURNSH. */ /* - IK data: the kernel pool must contain data such that */ /* the SPICELIB routine GETFOV may be called to obtain */ /* parameters for INST. Normally such data are provided by */ /* an IK via FURNSH. */ /* The following data may be required: */ /* - CK data: if the instrument frame is fixed to a spacecraft, */ /* at least one CK file will be needed to permit transformation */ /* of vectors between that frame and the J2000 frame. */ /* - SCLK data: if a CK file is needed, an associated SCLK */ /* kernel is required to enable conversion between encoded SCLK */ /* (used to time-tag CK data) and barycentric dynamical time */ /* (TDB). */ /* - Since the input ray direction may be expressed in any */ /* frame, FKs, CKs, SCLK kernels, PCKs, and SPKs may be */ /* required to map the direction to the J2000 frame. */ /* Kernel data are normally loaded once per program run, NOT every */ /* time this routine is called. */ /* $ Particulars */ /* This routine determines a set of one or more time intervals when */ /* the specified ray in contained within the field of view of a */ /* specified instrument. We'll use the term "visibility event" to */ /* designate such an appearance. The set of time intervals resulting */ /* from the search is returned as a SPICE window. */ /* This routine provides a simpler, but less flexible, interface */ /* than does the SPICELIB routine GFFOVE for conducting searches for */ /* visibility events. Applications that require support for progress */ /* reporting, interrupt handling, non-default step or refinement */ /* functions, or non-default convergence tolerance should call */ /* GFFOVE rather than this routine. */ /* Below we discuss in greater detail aspects of this routine's */ /* solution process that are relevant to correct and efficient use */ /* of this routine in user applications. */ /* The Search Process */ /* ================== */ /* The search for visibility events is treated as a search for state */ /* transitions: times are sought when the state of the ray */ /* changes from "not visible" to "visible" or vice versa. */ /* Step Size */ /* ========= */ /* Each interval of the confinement window is searched as follows: */ /* first, the input step size is used to determine the time */ /* separation at which the visibility state will be sampled. */ /* Starting at the left endpoint of an interval, samples will be */ /* taken at each step. If a state change is detected, a root has */ /* been bracketed; at that point, the "root"--the time at which the */ /* state change occurs---is found by a refinement process, for */ /* example, via binary search. */ /* Note that the optimal choice of step size depends on the lengths */ /* of the intervals over which the visibility state is constant: */ /* the step size should be shorter than the shortest visibility event */ /* duration and the shortest period between visibility events, within */ /* the confinement window. */ /* Having some knowledge of the relative geometry of the ray and */ /* observer can be a valuable aid in picking a reasonable step size. */ /* In general, the user can compensate for lack of such knowledge by */ /* picking a very short step size; the cost is increased computation */ /* time. */ /* Note that the step size is not related to the precision with which */ /* the endpoints of the intervals of the result window are computed. */ /* That precision level is controlled by the convergence tolerance. */ /* Convergence Tolerance */ /* ===================== */ /* Once a root has been bracketed, a refinement process is used to */ /* narrow down the time interval within which the root must lie. */ /* This refinement process terminates when the location of the root */ /* has been determined to within an error margin called the */ /* "convergence tolerance." The convergence tolerance used by this */ /* routine is set via the parameter CNVTOL. */ /* The value of CNVTOL is set to a "tight" value so that the */ /* tolerance doesn't become the limiting factor in the accuracy of */ /* solutions found by this routine. In general the accuracy of input */ /* data will be the limiting factor. */ /* To use a different tolerance value, a lower-level GF routine such */ /* as GFFOVE must be called. Making the tolerance tighter than */ /* CNVTOL is unlikely to be useful, since the results are unlikely */ /* to be more accurate. Making the tolerance looser will speed up */ /* searches somewhat, since a few convergence steps will be omitted. */ /* However, in most cases, the step size is likely to have a much */ /* greater effect on processing time than would the convergence */ /* tolerance. */ /* The Confinement Window */ /* ====================== */ /* The simplest use of the confinement window is to specify a time */ /* interval within which a solution is sought. However, the */ /* confinement window can, in some cases, be used to make searches */ /* more efficient. Sometimes it's possible to do an efficient search */ /* to reduce the size of the time period over which a relatively */ /* slow search of interest must be performed. For an example, see */ /* the program CASCADE in the GF Example Programs chapter of the GF */ /* Required Reading, gf.req. */ /* $ Examples */ /* The numerical results shown for these examples may differ across */ /* platforms. The results depend on the SPICE kernels used as */ /* input, the compiler and supporting libraries, and the machine */ /* specific arithmetic implementation. */ /* 1) This example is an extension of example #1 in the */ /* header of */ /* GFTFOV */ /* The problem statement for that example is */ /* Search for times when Saturn's satellite Phoebe is within */ /* the FOV of the Cassini narrow angle camera */ /* (CASSINI_ISS_NAC). To simplify the problem, restrict the */ /* search to a short time period where continuous Cassini bus */ /* attitude data are available. */ /* Use a step size of 10 seconds to reduce chances of missing */ /* short visibility events. */ /* Here we search the same confinement window for times when a */ /* selected background star is visible. We use the FOV of the */ /* Cassini ISS wide angle camera (CASSINI_ISS_WAC) to enhance the */ /* probability of viewing the star. */ /* The star we'll use has catalog number 6000 in the Hipparcos */ /* Catalog. The star's J2000 right ascension and declination, */ /* proper motion, and parallax are taken from that catalog. */ /* Use the meta-kernel from the GFTFOV example: */ /* KPL/MK */ /* File name: gftfov_ex1.tm */ /* This meta-kernel is intended to support operation of SPICE */ /* example programs. The kernels shown here should not be */ /* assumed to contain adequate or correct versions of data */ /* required by SPICE-based user applications. */ /* In order for an application to use this meta-kernel, the */ /* kernels referenced here must be present in the user's */ /* current working directory. */ /* The names and contents of the kernels referenced */ /* by this meta-kernel are as follows: */ /* File name Contents */ /* --------- -------- */ /* naif0009.tls Leapseconds */ /* cpck05Mar2004.tpc Satellite orientation and */ /* radii */ /* 981005_PLTEPH-DE405S.bsp Planetary ephemeris */ /* 020514_SE_SAT105.bsp Satellite ephemeris */ /* 030201AP_SK_SM546_T45.bsp Spacecraft ephemeris */ /* cas_v37.tf Cassini FK */ /* 04135_04171pc_psiv2.bc Cassini bus CK */ /* cas00084.tsc Cassini SCLK kernel */ /* cas_iss_v09.ti Cassini IK */ /* \begindata */ /* KERNELS_TO_LOAD = ( 'naif0009.tls', */ /* 'cpck05Mar2004.tpc', */ /* '981005_PLTEPH-DE405S.bsp', */ /* '020514_SE_SAT105.bsp', */ /* '030201AP_SK_SM546_T45.bsp', */ /* 'cas_v37.tf', */ /* '04135_04171pc_psiv2.bc', */ /* 'cas00084.tsc', */ /* 'cas_iss_v09.ti' ) */ /* \begintext */ /* Example code begins here. */ /* PROGRAM EX1 */ /* IMPLICIT NONE */ /* C */ /* C SPICELIB functions */ /* C */ /* DOUBLE PRECISION J1950 */ /* DOUBLE PRECISION J2000 */ /* DOUBLE PRECISION JYEAR */ /* DOUBLE PRECISION RPD */ /* INTEGER WNCARD */ /* C */ /* C Local parameters */ /* C */ /* CHARACTER*(*) META */ /* PARAMETER ( META = 'gftfov_ex1.tm' ) */ /* CHARACTER*(*) TIMFMT */ /* PARAMETER ( TIMFMT = */ /* . 'YYYY-MON-DD HR:MN:SC.######::TDB (TDB)' ) */ /* DOUBLE PRECISION AU */ /* PARAMETER ( AU = 149597870.693D0 ) */ /* INTEGER LBCELL */ /* PARAMETER ( LBCELL = -5 ) */ /* INTEGER MAXWIN */ /* PARAMETER ( MAXWIN = 10000 ) */ /* INTEGER CORLEN */ /* PARAMETER ( CORLEN = 10 ) */ /* INTEGER BDNMLN */ /* PARAMETER ( BDNMLN = 36 ) */ /* INTEGER FRNMLN */ /* PARAMETER ( FRNMLN = 32 ) */ /* INTEGER TIMLEN */ /* PARAMETER ( TIMLEN = 35 ) */ /* INTEGER LNSIZE */ /* PARAMETER ( LNSIZE = 80 ) */ /* C */ /* C Local variables */ /* C */ /* CHARACTER*(CORLEN) ABCORR */ /* CHARACTER*(BDNMLN) INST */ /* CHARACTER*(LNSIZE) LINE */ /* CHARACTER*(BDNMLN) OBSRVR */ /* CHARACTER*(FRNMLN) RFRAME */ /* CHARACTER*(TIMLEN) TIMSTR ( 2 ) */ /* DOUBLE PRECISION CNFINE ( LBCELL : MAXWIN ) */ /* DOUBLE PRECISION DEC */ /* DOUBLE PRECISION DECEPC */ /* DOUBLE PRECISION DECPM */ /* DOUBLE PRECISION DECDEG */ /* DOUBLE PRECISION DECDG0 */ /* DOUBLE PRECISION DTDEC */ /* DOUBLE PRECISION DTRA */ /* DOUBLE PRECISION ENDPT ( 2 ) */ /* DOUBLE PRECISION ET0 */ /* DOUBLE PRECISION ET1 */ /* DOUBLE PRECISION LT */ /* DOUBLE PRECISION PARLAX */ /* DOUBLE PRECISION PLXDEG */ /* DOUBLE PRECISION POS ( 3 ) */ /* DOUBLE PRECISION PSTAR ( 3 ) */ /* DOUBLE PRECISION RA */ /* DOUBLE PRECISION RADEG */ /* DOUBLE PRECISION RADEG0 */ /* DOUBLE PRECISION RAEPC */ /* DOUBLE PRECISION RAPM */ /* DOUBLE PRECISION RAYDIR ( 3 ) */ /* DOUBLE PRECISION RESULT ( LBCELL : MAXWIN ) */ /* DOUBLE PRECISION RSTAR */ /* DOUBLE PRECISION STEPSZ */ /* DOUBLE PRECISION T */ /* INTEGER CATNO */ /* INTEGER I */ /* INTEGER J */ /* INTEGER N */ /* C */ /* C Load kernels. */ /* C */ /* CALL FURNSH ( META ) */ /* C */ /* C Initialize windows. */ /* C */ /* CALL SSIZED ( MAXWIN, CNFINE ) */ /* CALL SSIZED ( MAXWIN, RESULT ) */ /* C */ /* C Insert search time interval bounds into the */ /* C confinement window. */ /* C */ /* CALL STR2ET ( '2004 JUN 11 06:30:00 TDB', ET0 ) */ /* CALL STR2ET ( '2004 JUN 11 12:00:00 TDB', ET1 ) */ /* CALL WNINSD ( ET0, ET1, CNFINE ) */ /* C */ /* C Initialize inputs for the search. */ /* C */ /* INST = 'CASSINI_ISS_WAC' */ /* C */ /* C Create a unit direction vector pointing from */ /* c observer to star. We'll assume the direction */ /* C is constant during the confinement window, and */ /* C we'll use et0 as the epoch at which to compute the */ /* C direction from the spacecraft to the star. */ /* C */ /* C The data below are for the star with catalog */ /* C number 6000 in the Hipparcos catalog. Angular */ /* C units are degrees; epochs have units of Julian */ /* C years and have a reference epoch of J1950. */ /* C The reference frame is J2000. */ /* C */ /* CATNO = 6000 */ /* PLXDEG = 0.000001056D0 */ /* RADEG0 = 19.290789927D0 */ /* RAPM = -0.000000720D0 */ /* RAEPC = 41.2000D0 */ /* DECDG0 = 2.015271007D0 */ /* DECPM = 0.000001814D0 */ /* DECEPC = 41.1300D0 */ /* RFRAME = 'J2000' */ /* C */ /* C Correct the star's direction for proper motion. */ /* C */ /* C The argument t represents et0 as Julian years */ /* C past J1950. */ /* C */ /* T = ET0/JYEAR() */ /* . + ( J2000()- J1950() ) / 365.25D0 */ /* DTRA = T - RAEPC */ /* DTDEC = T - DECEPC */ /* RADEG = RADEG0 + DTRA * RAPM */ /* DECDEG = DECDG0 + DTDEC * DECPM */ /* RA = RADEG * RPD() */ /* DEC = DECDEG * RPD() */ /* CALL RADREC ( 1.D0, RA, DEC, PSTAR ) */ /* C */ /* C Correct star position for parallax applicable at */ /* C the Cassini orbiter's position. (The parallax effect */ /* C is negligible in this case; we're simply demonstrating */ /* C the computation.) */ /* C */ /* PARLAX = PLXDEG * RPD() */ /* RSTAR = AU / TAN(PARLAX) */ /* C */ /* C Scale the star's direction vector by its distance from */ /* C the solar system barycenter. Subtract off the position */ /* C of the spacecraft relative to the solar system barycenter; */ /* C the result is the ray's direction vector. */ /* C */ /* CALL VSCLIP ( RSTAR, PSTAR ) */ /* CALL SPKPOS ( 'CASSINI', ET0, 'J2000', 'NONE', */ /* . 'SOLAR SYSTEM BARYCENTER', POS, LT ) */ /* CALL VSUB ( PSTAR, POS, RAYDIR ) */ /* C */ /* C Correct the star direction for stellar aberration when */ /* C we conduct the search. */ /* C */ /* ABCORR = 'S' */ /* OBSRVR = 'CASSINI' */ /* STEPSZ = 10.D0 */ /* WRITE (*,*) ' ' */ /* WRITE (*,*) 'Instrument: '//INST */ /* WRITE (*,*) 'Star''s catalog number: ', CATNO */ /* WRITE (*,*) ' ' */ /* C */ /* C Perform the search. */ /* C */ /* CALL GFRFOV ( INST, RAYDIR, RFRAME, ABCORR, */ /* . OBSRVR, STEPSZ, CNFINE, RESULT ) */ /* N = WNCARD( RESULT ) */ /* IF ( N .EQ. 0 ) THEN */ /* WRITE (*,*) 'No FOV intersection found.' */ /* ELSE */ /* WRITE (*,*) */ /* . ' Visibility start time Stop time' */ /* DO I = 1, N */ /* CALL WNFETD ( RESULT, I, ENDPT(1), ENDPT(2) ) */ /* DO J = 1, 2 */ /* CALL TIMOUT ( ENDPT(J), TIMFMT, TIMSTR(J) ) */ /* END DO */ /* LINE( :3) = ' ' */ /* LINE(2: ) = TIMSTR(1) */ /* LINE(37:) = TIMSTR(2) */ /* WRITE (*,*) LINE */ /* END DO */ /* END IF */ /* WRITE (*,*) ' ' */ /* END */ /* When this program was executed on a PC/Linux/g77 platform, the */ /* output was: */ /* Instrument: CASSINI_ISS_WAC */ /* Star's catalog number: 6000 */ /* Visibility start time Stop time */ /* 2004-JUN-11 06:30:00.000000 (TDB) 2004-JUN-11 12:00:00.000000 (TDB) */ /* The star is visible throughout the confinement window. */ /* $ Restrictions */ /* The kernel files to be used by GFRFOV must be loaded (normally via */ /* the SPICELIB routine FURNSH) before GFRFOV is called. */ /* $ Literature_References */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* L.S. Elson (JPL) */ /* E.D. Wright (JPL) */ /* $ Version */ /* - SPICELIB Version 1.0.0 15-APR-2009 (NJB) (LSE) (EDW) */ /* -& */ /* $ Index_Entries */ /* GF ray in instrument FOV search */ /* -& */ /* $ Revisions */ /* None. */ /* -& */ /* SPICELIB functions */ /* External routines */ /* Interrupt handler: */ /* Routines to set step size, refine transition times */ /* and report work: */ /* Local parameters */ /* Geometric quantity bail switch: */ /* Progress report switch: */ /* Local variables */ /* Standard SPICE error handling. */ if (return_()) { return 0; } chkin_("GFRFOV", (ftnlen)6); /* Note to maintenance programmer: input exception checks */ /* are delegated to GFFOVE. If the implementation of that */ /* routine changes, or if this routine is modified to call */ /* a different routine in place of GFFOVE, then the error */ /* handling performed by GFFOVE will have to be performed */ /* here or in a routine called by this routine. */ /* Check the result window's size. */ if (sized_(result) < 2) { setmsg_("Result window size must be at least 2 but was #.", (ftnlen) 48); i__1 = sized_(result); errint_("#", &i__1, (ftnlen)1); sigerr_("SPICE(WINDOWTOOSMALL)", (ftnlen)21); chkout_("GFRFOV", (ftnlen)6); return 0; } /* Check step size. */ if (*step <= 0.) { setmsg_("Step size must be positive but was #.", (ftnlen)37); errdp_("#", step, (ftnlen)1); sigerr_("SPICE(INVALIDSTEP)", (ftnlen)18); chkout_("GFRFOV", (ftnlen)6); return 0; } /* Set the step size. */ gfsstp_(step); /* Look for solutions. */ gffove_(inst, "RAY", raydir, " ", rframe, abcorr, obsrvr, &c_b13, (U_fp) gfstep_, (U_fp)gfrefn_, &c_false, (U_fp)gfrepi_, (U_fp)gfrepu_, ( U_fp)gfrepf_, &c_false, (L_fp)gfbail_, cnfine, result, inst_len, ( ftnlen)3, (ftnlen)1, rframe_len, abcorr_len, obsrvr_len); chkout_("GFRFOV", (ftnlen)6); return 0; } /* gfrfov_ */
/* $Procedure GFUDS ( GF, user defined scalar ) */ /* Subroutine */ int gfuds_(U_fp udfunc, U_fp udqdec, char *relate, doublereal *refval, doublereal *adjust, doublereal *step, doublereal * cnfine, integer *mw, integer *nw, doublereal *work, doublereal * result, ftnlen relate_len) { /* System generated locals */ integer work_dim1, work_offset, i__1; /* Local variables */ extern /* Subroutine */ int zzgfudlt_(); extern /* Subroutine */ int zzgfrelx_(U_fp, U_fp, U_fp, U_fp, U_fp, S_fp, char *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, logical *, U_fp, U_fp, U_fp, char *, char *, logical *, L_fp, doublereal *, ftnlen, ftnlen, ftnlen), chkin_(char *, ftnlen), errdp_(char *, doublereal *, ftnlen); extern integer sized_(doublereal *); extern logical gfbail_(); extern /* Subroutine */ int scardd_(integer *, doublereal *); extern /* Subroutine */ int gfrefn_(), gfrepf_(), gfrepi_(), gfrepu_(), gfstep_(); char rptpre[1*2], rptsuf[1*2]; extern /* Subroutine */ int setmsg_(char *, ftnlen), sigerr_(char *, ftnlen), chkout_(char *, ftnlen), errint_(char *, integer *, ftnlen), gfsstp_(doublereal *); extern logical odd_(integer *); doublereal tol; extern /* Subroutine */ int zzgfref_(doublereal *); /* $ Abstract */ /* Perform a GF search on a user defined scalar quantity. */ /* $ 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 */ /* GF */ /* SPK */ /* TIME */ /* WINDOWS */ /* $ Keywords */ /* EVENT */ /* EPHEMERIS */ /* SEARCH */ /* WINDOW */ /* $ Declarations */ /* $ Abstract */ /* This file contains public, global parameter declarations */ /* for the SPICELIB Geometry Finder (GF) subsystem. */ /* $ 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 */ /* GF */ /* $ Keywords */ /* GEOMETRY */ /* ROOT */ /* $ Restrictions */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* L.E. Elson (JPL) */ /* E.D. Wright (JPL) */ /* $ Literature_References */ /* None. */ /* $ Version */ /* - SPICELIB Version 1.0.0, 08-SEP-2009 (EDW) */ /* Added NWRR parameter. */ /* Added NWUDS parameter. */ /* - SPICELIB Version 1.0.0, 21-FEB-2009 (NJB) (LSE) (EDW) */ /* -& */ /* Root finding parameters: */ /* CNVTOL is the default convergence tolerance used by the */ /* high-level GF search API routines. This tolerance is */ /* used to terminate searches for binary state transitions: */ /* when the time at which a transition occurs is bracketed */ /* by two times that differ by no more than CNVTOL, the */ /* transition time is considered to have been found. */ /* Units are TDB seconds. */ /* NWMAX is the maximum number of windows allowed for user-defined */ /* workspace array. */ /* DOUBLE PRECISION WORK ( LBCELL : MW, NWMAX ) */ /* Currently no more than twelve windows are required; the three */ /* extra windows are spares. */ /* Callers of GFEVNT can include this file and use the parameter */ /* NWMAX to declare the second dimension of the workspace array */ /* if necessary. */ /* Callers of GFIDST should declare their workspace window */ /* count using NWDIST. */ /* Callers of GFSEP should declare their workspace window */ /* count using NWSEP. */ /* Callers of GFRR should declare their workspace window */ /* count using NWRR. */ /* Callers of GFUDS should declare their workspace window */ /* count using NWUDS. */ /* ADDWIN is a parameter used to expand each interval of the search */ /* (confinement) window by a small amount at both ends in order to */ /* accommodate searches using equality constraints. The loaded */ /* kernel files must accommodate these expanded time intervals. */ /* FRMNLN is a string length for frame names. */ /* NVRMAX is the maximum number of vertices if FOV type is "POLYGON" */ /* FOVTLN -- maximum length for FOV string. */ /* Specify the character strings that are allowed in the */ /* specification of field of view shapes. */ /* Character strings that are allowed in the */ /* specification of occultation types: */ /* Occultation target shape specifications: */ /* Specify the number of supported occultation types and occultation */ /* type string length: */ /* Instrument field-of-view (FOV) parameters */ /* Maximum number of FOV boundary vectors: */ /* FOV shape parameters: */ /* circle */ /* ellipse */ /* polygon */ /* rectangle */ /* End of file gf.inc. */ /* $ Abstract */ /* SPICE private include file intended solely for the support of */ /* SPICE routines. Users should not include this routine in their */ /* source code due to the volatile nature of this file. */ /* This file contains private, global parameter declarations */ /* for the SPICELIB Geometry Finder (GF) subsystem. */ /* $ 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 */ /* GF */ /* $ Keywords */ /* GEOMETRY */ /* ROOT */ /* $ Restrictions */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* E.D. Wright (JPL) */ /* $ Literature_References */ /* None. */ /* $ Version */ /* - SPICELIB Version 1.0.0, 17-FEB-2009 (NJB) (EDW) */ /* -& */ /* The set of supported coordinate systems */ /* System Coordinates */ /* ---------- ----------- */ /* Rectangular X, Y, Z */ /* Latitudinal Radius, Longitude, Latitude */ /* Spherical Radius, Colatitude, Longitude */ /* RA/Dec Range, Right Ascension, Declination */ /* Cylindrical Radius, Longitude, Z */ /* Geodetic Longitude, Latitude, Altitude */ /* Planetographic Longitude, Latitude, Altitude */ /* Below we declare parameters for naming coordinate systems. */ /* User inputs naming coordinate systems must match these */ /* when compared using EQSTR. That is, user inputs must */ /* match after being left justified, converted to upper case, */ /* and having all embedded blanks removed. */ /* Below we declare names for coordinates. Again, user */ /* inputs naming coordinates must match these when */ /* compared using EQSTR. */ /* Note that the RA parameter value below matches */ /* 'RIGHT ASCENSION' */ /* when extra blanks are compressed out of the above value. */ /* Parameters specifying types of vector definitions */ /* used for GF coordinate searches: */ /* All string parameter values are left justified, upper */ /* case, with extra blanks compressed out. */ /* POSDEF indicates the vector is defined by the */ /* position of a target relative to an observer. */ /* SOBDEF indicates the vector points from the center */ /* of a target body to the sub-observer point on */ /* that body, for a given observer and target. */ /* SOBDEF indicates the vector points from the center */ /* of a target body to the surface intercept point on */ /* that body, for a given observer, ray, and target. */ /* Number of workspace windows used by ZZGFREL: */ /* Number of additional workspace windows used by ZZGFLONG: */ /* Index of "existence window" used by ZZGFCSLV: */ /* Progress report parameters: */ /* MXBEGM, */ /* MXENDM are, respectively, the maximum lengths of the progress */ /* report message prefix and suffix. */ /* Note: the sum of these lengths, plus the length of the */ /* "percent complete" substring, should not be long enough */ /* to cause wrap-around on any platform's terminal window. */ /* Total progress report message length upper bound: */ /* End of file zzgf.inc. */ /* $ Brief_I/O */ /* Variable I/O Description */ /* -------- --- -------------------------------------------------- */ /* LBCELL P SPICE Cell lower bound. */ /* CNVTOL P Convergence tolerance. */ /* UDFUNC I Name of the routine that computes the scalar value */ /* of interest at some time. */ /* UDQDEC I Name of the routine that computes whether the */ /* current state is decreasing. */ /* RELATE I Operator that either looks for an extreme value */ /* (max, min, local, absolute) or compares the */ /* geometric quantity value and a number. */ /* REFVAL I Value used as reference for geometric quantity */ /* condition. */ /* ADJUST I Allowed variation for absolute extremal */ /* geometric conditions. */ /* STEP I Step size used for locating extrema and roots. */ /* CNFINE I SPICE window to which the search is confined. */ /* MW I Size of workspace windows. */ /* NW I Number of workspace windows. */ /* WORK I Array containing workspace windows. */ /* RESULT I-O SPICE window containing results. */ /* $ Detailed_Input */ /* UDFUNC the routine that returns the value of the scalar */ /* quantity of interest at time ET. The calling sequence */ /* for UDFUNC is: */ /* CALL UDFUNC ( ET, VALUE ) */ /* where: */ /* ET a double precision value representing */ /* ephemeris time, expressed as seconds past */ /* J2000 TDB, at which to determine the scalar */ /* value. */ /* VALUE is the value of the scalar quantity */ /* at ET. */ /* UDQDEC the name of the routine that determines if the scalar */ /* quantity calculated by UDFUNC is decreasing. */ /* The calling sequence: */ /* CALL UDQDEC ( UDFUNC, ET, ISDECR ) */ /* where: */ /* ET a double precision value representing */ /* ephemeris time, expressed as seconds past */ /* J2000 TDB, at which to determine the time */ /* derivative of UDFUNC. */ /* ISDECR a logical return indicating whether */ /* or not the scalar value returned by UDFUNC */ /* is decreasing. ISDECR returns true if the */ /* time derivative of UDFUNC at ET is */ /* negative. */ /* RELATE the scalar string comparison operator indicating */ /* the numeric constraint of interest. Values are: */ /* '>' value of scalar quantity greater than some */ /* reference (REFVAL). */ /* '=' value of scalar quantity equal to some */ /* reference (REFVAL). */ /* '<' value of scalar quantity less than some */ /* reference (REFVAL). */ /* 'ABSMAX' The scalar quantity is at an absolute */ /* maximum. */ /* 'ABSMIN' The scalar quantity is at an absolute */ /* minimum. */ /* 'LOCMAX' The scalar quantity is at a local */ /* maximum. */ /* 'LOCMIN' The scalar quantity is at a local */ /* minimum. */ /* The caller may indicate that the region of interest */ /* is the set of time intervals where the quantity is */ /* within a specified distance of an absolute extremum. */ /* The argument ADJUST (described below) is used to */ /* specified this distance. */ /* Local extrema are considered to exist only in the */ /* interiors of the intervals comprising the confinement */ /* window: a local extremum cannot exist at a boundary */ /* point of the confinement window. */ /* RELATE is insensitive to case, leading and */ /* trailing blanks. */ /* REFVAL is the reference value used to define an equality or */ /* inequality to satisfied by the scalar quantity. */ /* The units of REFVAL are those of the scalar quantity. */ /* ADJUST the amount by which the quantity is allowed to vary */ /* from an absolute extremum. */ /* If the search is for an absolute minimum is performed, */ /* the resulting window contains time intervals when the */ /* geometric quantity value has values between */ /* ABSMIN and ABSMIN + ADJUST. */ /* If the search is for an absolute maximum, the */ /* corresponding range is between ABSMAX - ADJUST and */ /* ABSMAX. */ /* ADJUST is not used for searches for local extrema, */ /* equality or inequality conditions and must have value */ /* zero for such searches. */ /* STEP the double precision time step size to use in */ /* the search. */ /* STEP must be short enough to for a search using this */ /* step size to locate the time intervals where the */ /* scalar quantity function is monotone increasing or */ /* decreasing. However, STEP must not be *too* short, */ /* or the search will take an unreasonable amount of time. */ /* The choice of STEP affects the completeness but not */ /* the precision of solutions found by this routine; the */ /* precision is controlled by the convergence tolerance. */ /* See the discussion of the parameter CNVTOL for */ /* details. */ /* STEP has units of TDB seconds. */ /* CNFINE is a SPICE window that confines the time period over */ /* which the specified search is conducted. CNFINE may */ /* consist of a single interval or a collection of */ /* intervals. */ /* In some cases the confinement window can be used to */ /* greatly reduce the time period that must be searched */ /* for the desired solution. See the Particulars section */ /* below for further discussion. */ /* See the Examples section below for a code example */ /* that shows how to create a confinement window. */ /* CNFINE must be initialized by the caller via the */ /* SPICELIB routine SSIZED. */ /* MW is a parameter specifying the length of the SPICE */ /* windows in the workspace array WORK (see description */ /* below) used by this routine. */ /* MW should be set to a number at least twice as large */ /* as the maximum number of intervals required by any */ /* workspace window. In many cases, it's not necessary to */ /* compute an accurate estimate of how many intervals are */ /* needed; rather, the user can pick a size considerably */ /* larger than what's really required. */ /* However, since excessively large arrays can prevent */ /* applications from compiling, linking, or running */ /* properly, sometimes MW must be set according to */ /* the actual workspace requirement. A rule of thumb */ /* for the number of intervals NINTVLS needed is */ /* NINTVLS = 2*N + ( M / STEP ) */ /* where */ /* N is the number of intervals in the confinement */ /* window */ /* M is the measure of the confinement window, in */ /* units of seconds */ /* STEP is the search step size in seconds */ /* MW should then be set to */ /* 2 * NINTVLS */ /* NW is a parameter specifying the number of SPICE windows */ /* in the workspace array WORK (see description below) */ /* used by this routine. (The reason this dimension is */ /* an input argument is that this allows run-time */ /* error checking to be performed.) */ /* NW must be at least as large as the parameter NWUDS. */ /* WORK is an array used to store workspace windows. This */ /* array should be declared by the caller as shown: */ /* DOUBLE PRECISION WORK ( LBCELL : MW, NW ) */ /* WORK need not be initialized by the caller. */ /* RESULT a double precision SPICE window which will contain the */ /* search results. RESULT must be declared and initialized */ /* with sufficient size to capture the full set of time */ /* intervals within the search region on which the */ /* specified constraint is satisfied. */ /* RESULT must be initialized by the caller via the */ /* SPICELIB routine SSIZED. */ /* If RESULT is non-empty on input, its contents */ /* will be discarded before GFUDS conducts its search. */ /* $ Detailed_Output */ /* WORK the input workspace array, modified by this */ /* routine. */ /* RESULT is a SPICE window containing the time intervals within */ /* the confinement window, during which the specified */ /* condition on the scalar quantity is met. */ /* If the search is for local extrema, or for absolute */ /* extrema with ADJUST set to zero, then normally each */ /* interval of RESULT will be a singleton: the left and */ /* right endpoints of each interval will be identical. */ /* If no times within the confinement window satisfy the */ /* search, RESULT will be returned with a cardinality */ /* of zero. */ /* $ Parameters */ /* LBCELL the integer value defining the lower bound for */ /* SPICE Cell arrays (a SPICE window is a kind of cell). */ /* CNVTOL is the convergence tolerance used for finding */ /* endpoints of the intervals comprising the result */ /* window. CNVTOL is also used for finding intermediate */ /* results; in particular, CNVTOL is used for finding the */ /* windows on which the range rate is increasing */ /* or decreasing. CNVTOL is used to determine when binary */ /* searches for roots should terminate: when a root is */ /* bracketed within an interval of length CNVTOL; the */ /* root is considered to have been found. */ /* The accuracy, as opposed to precision, of roots found */ /* by this routine depends on the accuracy of the input */ /* data. In most cases, the accuracy of solutions will be */ /* inferior to their precision. */ /* See INCLUDE file gf.inc for declarations and descriptions of */ /* parameters used throughout the GF system. */ /* $ Exceptions */ /* 1) In order for this routine to produce correct results, */ /* the step size must be appropriate for the problem at hand. */ /* Step sizes that are too large may cause this routine to miss */ /* roots; step sizes that are too small may cause this routine */ /* to run unacceptably slowly and in some cases, find spurious */ /* roots. */ /* This routine does not diagnose invalid step sizes, except */ /* that if the step size is non-positive, the error */ /* SPICE(INVALIDSTEP) is signaled. */ /* 2) Due to numerical errors, in particular, */ /* - truncation error in time values */ /* - finite tolerance value */ /* - errors in computed geometric quantities */ /* it is *normal* for the condition of interest to not always be */ /* satisfied near the endpoints of the intervals comprising the */ /* RESULT window. One technique to handle such a situation, */ /* slightly contract RESULT using the window routine WNCOND. */ /* 3) If the workspace window size MW is less than 2 or not an even */ /* value, the error SPICE(INVALIDDIMENSION) will signal. If the */ /* size of the workspace is too small, an error is signaled by a */ /* routine in the call tree of this routine. */ /* 4) If the size of the SPICE window RESULT is less than 2 or */ /* not an even value, the error SPICE(INVALIDDIMENSION) will */ /* signal. If RESULT has insufficient capacity to contain the */ /* number of intervals on which the specified distance condition */ /* is met, the error will be diagnosed by a routine in the call */ /* tree of this routine. */ /* 5) If the window count NW is less than NWUDS, the error */ /* SPICE(INVALIDDIMENSION) will be signaled. */ /* 6) If an error (typically cell overflow) occurs during */ /* window arithmetic, the error will be diagnosed by a routine */ /* in the call tree of this routine. */ /* 7) If the relational operator RELATE is not recognized, an */ /* error is signaled by a routine in the call tree of this */ /* routine. */ /* 8) If ADJUST is negative, the error SPICE(VALUEOUTOFRANGE) will */ /* signal from a routine in the call tree of this routine. */ /* A non-zero value for ADJUST when RELATE has any value other */ /* than "ABSMIN" or "ABSMAX" causes the error SPICE(INVALIDVALUE) */ /* to signal from a routine in the call tree of this routine. */ /* 9) If required ephemerides or other kernel data are not */ /* available, an error is signaled by a routine in the call tree */ /* of this routine. */ /* $ Files */ /* Appropriate kernels must be loaded by the calling program before */ /* this routine is called. */ /* If the scalar function requires access to ephemeris data: */ /* - SPK data: ephemeris data for any body over the */ /* time period defined by the confinement window must be */ /* loaded. If aberration corrections are used, the states of */ /* target and observer relative to the solar system barycenter */ /* must be calculable from the available ephemeris data. */ /* Typically ephemeris data are made available by loading one */ /* or more SPK files via FURNSH. */ /* - If non-inertial reference frames are used, then PCK */ /* files, frame kernels, C-kernels, and SCLK kernels may be */ /* needed. */ /* In all cases, kernel data are normally loaded once per program */ /* run, NOT every time this routine is called. */ /* $ Particulars */ /* This routine determines a set of one or more time intervals */ /* within the confinement window when the scalar function */ /* satisfies a caller-specified constraint. The resulting set of */ /* intervals is returned as a SPICE window. */ /* UDQDEC Default Template */ /* ======================= */ /* The user must supply a routine to determine whether sign of the */ /* time derivative of UDFUNC is positive or negative at ET. For */ /* cases where UDFUNC is numerically well behaved, the user */ /* may find it convenient to use a routine based on the below */ /* template. UDDC determines the truth of the expression */ /* d (UDFUNC) */ /* -- < 0 */ /* dt */ /* using the library routine UDDF to numerically calculate the */ /* derivative of UDFUNC using a three-point estimation. */ /* Please see the Examples section for an example of GFDECR use. */ /* SUBROUTINE GFDECR ( UDFUNC, ET, ISDECR ) */ /* IMPLICIT NONE */ /* EXTERNAL UDFUNC */ /* EXTERNAL UDDF */ /* DOUBLE PRECISION ET */ /* LOGICAL ISDECR */ /* DOUBLE PRECISION DT */ /* DT = h, double precision interval size */ /* CALL UDDC ( UDFUNC, ET, DT, ISDECR ) */ /* END */ /* The Search Process */ /* ================== */ /* Regardless of the type of constraint selected by the caller, this */ /* routine starts the search for solutions by determining the time */ /* periods, within the confinement window, over which the specified */ /* scalar function is monotone increasing and monotone */ /* decreasing. Each of these time periods is represented by a SPICE */ /* window. Having found these windows, all of the quantity */ /* function's local extrema within the confinement window are known. */ /* Absolute extrema then can be found very easily. */ /* Within any interval of these "monotone" windows, there will be at */ /* most one solution of any equality constraint. Since the boundary */ /* of the solution set for any inequality constraint is the set */ /* of points where an equality constraint is met, the solutions of */ /* both equality and inequality constraints can be found easily */ /* once the monotone windows have been found. */ /* Step Size */ /* ========= */ /* The monotone windows (described above) are found using a two-step */ /* search process. Each interval of the confinement window is */ /* searched as follows: first, the input step size is used to */ /* determine the time separation at which the sign of the rate of */ /* change of quantity function will be sampled. Starting at */ /* the left endpoint of an interval, samples will be taken at each */ /* step. If a change of sign is found, a root has been bracketed; at */ /* that point, the time at which the time derivative of the quantity */ /* function is zero can be found by a refinement process, for */ /* example, using a binary search. */ /* Note that the optimal choice of step size depends on the lengths */ /* of the intervals over which the quantity function is monotone: */ /* the step size should be shorter than the shortest of these */ /* intervals (within the confinement window). */ /* The optimal step size is *not* necessarily related to the lengths */ /* of the intervals comprising the result window. For example, if */ /* the shortest monotone interval has length 10 days, and if the */ /* shortest result window interval has length 5 minutes, a step size */ /* of 9.9 days is still adequate to find all of the intervals in the */ /* result window. In situations like this, the technique of using */ /* monotone windows yields a dramatic efficiency improvement over a */ /* state-based search that simply tests at each step whether the */ /* specified constraint is satisfied. The latter type of search can */ /* miss solution intervals if the step size is shorter than the */ /* shortest solution interval. */ /* Having some knowledge of the relative geometry of the targets and */ /* observer can be a valuable aid in picking a reasonable step size. */ /* In general, the user can compensate for lack of such knowledge by */ /* picking a very short step size; the cost is increased computation */ /* time. */ /* Note that the step size is not related to the precision with which */ /* the endpoints of the intervals of the result window are computed. */ /* That precision level is controlled by the convergence tolerance. */ /* Convergence Tolerance */ /* ===================== */ /* Once a root has been bracketed, a refinement process is used to */ /* narrow down the time interval within which the root must lie. */ /* This refinement process terminates when the location of the root */ /* has been determined to within an error margin called the */ /* "convergence tolerance." */ /* The GF subsystem defines a parameter, CNVTOL (from gf.inc), as a */ /* default tolerance. This represents a "tight" tolerance value */ /* so that the tolerance doesn't become the limiting factor in the */ /* accuracy of solutions found by this routine. In general the */ /* accuracy of input data will be the limiting factor. */ /* Making the tolerance tighter than CNVTOL is unlikely to */ /* be useful, since the results are unlikely to be more accurate. */ /* Making the tolerance looser will speed up searches somewhat, */ /* since a few convergence steps will be omitted. However, in most */ /* cases, the step size is likely to have a much greater affect */ /* on processing time than would the convergence tolerance. */ /* The Confinement Window */ /* ====================== */ /* The simplest use of the confinement window is to specify a time */ /* interval within which a solution is sought. However, the */ /* confinement window can, in some cases, be used to make searches */ /* more efficient. Sometimes it's possible to do an efficient search */ /* to reduce the size of the time period over which a relatively */ /* slow search of interest must be performed. */ /* $ Examples */ /* The numerical results shown for these examples may differ across */ /* platforms. The results depend on the SPICE kernels used as */ /* input, the compiler and supporting libraries, and the machine */ /* specific arithmetic implementation. */ /* Conduct a search on the range-rate of the vector from the Sun */ /* to the Moon. Define a function to calculate the value. */ /* Use the meta-kernel shown below to load the required SPICE */ /* kernels. */ /* KPL/MK */ /* File name: standard.tm */ /* This meta-kernel is intended to support operation of SPICE */ /* example programs. The kernels shown here should not be */ /* assumed to contain adequate or correct versions of data */ /* required by SPICE-based user applications. */ /* In order for an application to use this meta-kernel, the */ /* kernels referenced here must be present in the user's */ /* current working directory. */ /* \begindata */ /* KERNELS_TO_LOAD = ( 'de414.bsp', */ /* 'pck00008.tpc', */ /* 'naif0009.tls' ) */ /* \begintext */ /* Code: */ /* PROGRAM GFUDS_T */ /* IMPLICIT NONE */ /* C */ /* C Include GF parameter declarations: */ /* C */ /* INCLUDE 'gf.inc' */ /* EXTERNAL GFQ */ /* EXTERNAL GFDECR */ /* C */ /* C SPICELIB functions */ /* C */ /* DOUBLE PRECISION SPD */ /* DOUBLE PRECISION DVNORM */ /* INTEGER WNCARD */ /* C */ /* C Local parameters */ /* C */ /* INTEGER LBCELL */ /* PARAMETER ( LBCELL = -5 ) */ /* C */ /* C Use the parameter MAXWIN for both the result window size */ /* C and the workspace size. */ /* C */ /* INTEGER MAXWIN */ /* PARAMETER ( MAXWIN = 20000 ) */ /* C */ /* C Length of strings: */ /* C */ /* INTEGER TIMLEN */ /* PARAMETER ( TIMLEN = 26 ) */ /* INTEGER NLOOPS */ /* PARAMETER ( NLOOPS = 7 ) */ /* C */ /* C Local variables */ /* C */ /* CHARACTER*(TIMLEN) TIMSTR */ /* CHARACTER*(TIMLEN) RELATE (NLOOPS) */ /* DOUBLE PRECISION ADJUST */ /* DOUBLE PRECISION CNFINE ( LBCELL : 2 ) */ /* DOUBLE PRECISION DRDT */ /* DOUBLE PRECISION ET0 */ /* DOUBLE PRECISION ET1 */ /* DOUBLE PRECISION FINISH */ /* DOUBLE PRECISION LT */ /* DOUBLE PRECISION POS ( 6 ) */ /* DOUBLE PRECISION REFVAL */ /* DOUBLE PRECISION RESULT ( LBCELL : MAXWIN ) */ /* DOUBLE PRECISION START */ /* DOUBLE PRECISION STEP */ /* DOUBLE PRECISION WORK ( LBCELL : MAXWIN, NWUDS ) */ /* INTEGER I */ /* INTEGER J */ /* DATA RELATE / '=', */ /* . '<', */ /* . '>', */ /* . 'LOCMIN', */ /* . 'ABSMIN', */ /* . 'LOCMAX', */ /* . 'ABSMAX' / */ /* C */ /* C Load kernels. */ /* C */ /* CALL FURNSH ( 'standard.tm' ) */ /* C */ /* C Initialize windows. */ /* C */ /* CALL SSIZED ( MAXWIN, RESULT ) */ /* CALL SSIZED ( 2, CNFINE ) */ /* CALL SCARDD ( 0, CNFINE ) */ /* C */ /* C Store the time bounds of our search interval in */ /* C the confinement window. */ /* C */ /* CALL STR2ET ( '2007 JAN 1', ET0 ) */ /* CALL STR2ET ( '2007 APR 1', ET1 ) */ /* CALL WNINSD ( ET0, ET1, CNFINE ) */ /* C */ /* C Search using a step size of 1 day (in units of seconds). */ /* C The reference value is .3365 km/s - a range rate value known */ /* C to exist during the confinement window. We're not using the */ /* C adjustment feature, so we set ADJUST to zero. */ /* C */ /* STEP = SPD() */ /* REFVAL = .3365D0 */ /* ADJUST = 0.D0 */ /* DO J=1, NLOOPS */ /* WRITE(*,*) 'Relation condition: ', RELATE(J) */ /* C */ /* C Perform the search. The SPICE window RESULT contains */ /* C the set of times when the condition is met. */ /* C */ /* CALL GFUDS ( GFQ, GFDECR, */ /* . RELATE(J), REFVAL, ADJUST, STEP, CNFINE, */ /* . MAXWIN, NWUDS, WORK, RESULT ) */ /* C */ /* C Display the results. */ /* C */ /* IF ( WNCARD(RESULT) .EQ. 0 ) THEN */ /* WRITE (*, '(A)') 'Result window is empty.' */ /* ELSE */ /* DO I = 1, WNCARD(RESULT) */ /* C */ /* C Fetch the endpoints of the Ith interval */ /* C of the result window. */ /* C */ /* CALL WNFETD ( RESULT, I, START, FINISH ) */ /* CALL SPKEZR ( 'MOON', START, 'J2000', 'NONE', */ /* . 'SUN', POS, LT ) */ /* DRDT = DVNORM(POS) */ /* CALL TIMOUT ( START, 'YYYY-MON-DD HR:MN:SC.###', */ /* . TIMSTR ) */ /* WRITE (*, '(A,F16.9)' ) 'Start time, drdt = '// */ /* . TIMSTR, DRDT */ /* CALL SPKEZR ( 'MOON', FINISH, 'J2000', 'NONE', */ /* . 'SUN', POS, LT ) */ /* DRDT = DVNORM(POS) */ /* CALL TIMOUT ( FINISH, 'YYYY-MON-DD HR:MN:SC.###', */ /* . TIMSTR ) */ /* WRITE (*, '(A,F16.9)' ) 'Stop time, drdt = '// */ /* . TIMSTR, DRDT */ /* END DO */ /* END IF */ /* WRITE(*,*) ' ' */ /* END DO */ /* END */ /* C-Procedure GFQ */ /* SUBROUTINE GFQ ( ET, VALUE ) */ /* IMPLICIT NONE */ /* C- Abstract */ /* C */ /* C User defined geometric quantity function. In this case, */ /* C the range from the sun to the Moon at TDB time ET. */ /* C */ /* DOUBLE PRECISION ET */ /* DOUBLE PRECISION VALUE */ /* C */ /* C Local variables. */ /* C */ /* INTEGER TARG */ /* INTEGER OBS */ /* CHARACTER*(12) REF */ /* CHARACTER*(12) ABCORR */ /* DOUBLE PRECISION STATE ( 6 ) */ /* DOUBLE PRECISION LT */ /* DOUBLE PRECISION DVNORM */ /* C */ /* C Initialization. Retrieve the vector from the Sun to */ /* C the Moon in the J2000 frame, without aberration */ /* C correction. */ /* C */ /* TARG = 301 */ /* REF = 'J2000' */ /* ABCORR = 'NONE' */ /* OBS = 10 */ /* CALL SPKEZ ( TARG, ET, REF, ABCORR, OBS, STATE, LT ) */ /* C */ /* C Calculate the scalar range rate corresponding the */ /* C STATE vector. */ /* C */ /* VALUE = DVNORM( STATE ) */ /* END */ /* C-Procedure GFDECR */ /* SUBROUTINE GFDECR ( UDFUNC, ET, ISDECR ) */ /* IMPLICIT NONE */ /* C- Abstract */ /* C */ /* C User defined function to detect if the function derivative */ /* C is negative (the function is decreasing) at TDB time ET. */ /* C */ /* EXTERNAL UDFUNC */ /* EXTERNAL UDDF */ /* DOUBLE PRECISION ET */ /* LOGICAL ISDECR */ /* DOUBLE PRECISION DT */ /* DT = 1.D0 */ /* C */ /* C Determine if GFQ is decreasing at ET. */ /* C */ /* C UDDC - the default GF function to determine if */ /* C the derivative of the user defined */ /* C function is negative at ET. */ /* C */ /* C UDFUNC - the user defined scalar quantity function. */ /* C */ /* CALL UDDC ( UDFUNC, ET, DT, ISDECR ) */ /* END */ /* The program outputs: */ /* Relation condition: = */ /* Start time, drdt = 2007-JAN-02 00:35:19.574 0.336500000 */ /* Stop time, drdt = 2007-JAN-02 00:35:19.574 0.336500000 */ /* Start time, drdt = 2007-JAN-19 22:04:54.899 0.336500000 */ /* Stop time, drdt = 2007-JAN-19 22:04:54.899 0.336500000 */ /* Start time, drdt = 2007-FEB-01 23:30:13.428 0.336500000 */ /* Stop time, drdt = 2007-FEB-01 23:30:13.428 0.336500000 */ /* Start time, drdt = 2007-FEB-17 11:10:46.540 0.336500000 */ /* Stop time, drdt = 2007-FEB-17 11:10:46.540 0.336500000 */ /* Start time, drdt = 2007-MAR-04 15:50:19.929 0.336500000 */ /* Stop time, drdt = 2007-MAR-04 15:50:19.929 0.336500000 */ /* Start time, drdt = 2007-MAR-18 09:59:05.959 0.336500000 */ /* Stop time, drdt = 2007-MAR-18 09:59:05.959 0.336500000 */ /* Relation condition: < */ /* Start time, drdt = 2007-JAN-02 00:35:19.574 0.336500000 */ /* Stop time, drdt = 2007-JAN-19 22:04:54.899 0.336500000 */ /* Start time, drdt = 2007-FEB-01 23:30:13.428 0.336500000 */ /* Stop time, drdt = 2007-FEB-17 11:10:46.540 0.336500000 */ /* Start time, drdt = 2007-MAR-04 15:50:19.929 0.336500000 */ /* Stop time, drdt = 2007-MAR-18 09:59:05.959 0.336500000 */ /* Relation condition: > */ /* Start time, drdt = 2007-JAN-01 00:00:00.000 0.515522367 */ /* Stop time, drdt = 2007-JAN-02 00:35:19.574 0.336500000 */ /* Start time, drdt = 2007-JAN-19 22:04:54.899 0.336500000 */ /* Stop time, drdt = 2007-FEB-01 23:30:13.428 0.336500000 */ /* Start time, drdt = 2007-FEB-17 11:10:46.540 0.336500000 */ /* Stop time, drdt = 2007-MAR-04 15:50:19.929 0.336500000 */ /* Start time, drdt = 2007-MAR-18 09:59:05.959 0.336500000 */ /* Stop time, drdt = 2007-APR-01 00:00:00.000 0.793546222 */ /* Relation condition: LOCMIN */ /* Start time, drdt = 2007-JAN-11 07:03:58.988 -0.803382743 */ /* Stop time, drdt = 2007-JAN-11 07:03:58.988 -0.803382743 */ /* Start time, drdt = 2007-FEB-10 06:26:15.439 -0.575837623 */ /* Stop time, drdt = 2007-FEB-10 06:26:15.439 -0.575837623 */ /* Start time, drdt = 2007-MAR-12 03:28:36.404 -0.441800446 */ /* Stop time, drdt = 2007-MAR-12 03:28:36.404 -0.441800446 */ /* Relation condition: ABSMIN */ /* Start time, drdt = 2007-JAN-11 07:03:58.988 -0.803382743 */ /* Stop time, drdt = 2007-JAN-11 07:03:58.988 -0.803382743 */ /* Relation condition: LOCMAX */ /* Start time, drdt = 2007-JAN-26 02:27:33.766 1.154648992 */ /* Stop time, drdt = 2007-JAN-26 02:27:33.766 1.154648992 */ /* Start time, drdt = 2007-FEB-24 09:35:07.816 1.347132236 */ /* Stop time, drdt = 2007-FEB-24 09:35:07.816 1.347132236 */ /* Start time, drdt = 2007-MAR-25 17:26:56.150 1.428141707 */ /* Stop time, drdt = 2007-MAR-25 17:26:56.150 1.428141707 */ /* Relation condition: ABSMAX */ /* Start time, drdt = 2007-MAR-25 17:26:56.150 1.428141707 */ /* Stop time, drdt = 2007-MAR-25 17:26:56.150 1.428141707 */ /* $ Restrictions */ /* 1) Any kernel files required by this routine must be loaded */ /* (normally via the SPICELIB routine FURNSH) before this routine */ /* is called. */ /* $ Literature_References */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* E.D. Wright (JPL) */ /* $ Version */ /* - SPICELIB Version 1.0.0 16-FEB-2010 (EDW) */ /* -& */ /* $ Index_Entries */ /* GF user defined scalar function search */ /* -& */ /* SPICELIB functions. */ /* Local variables. */ /* Dummy variables. */ /* Parameter adjustments */ work_dim1 = *mw + 6; work_offset = work_dim1 - 5; /* Function Body */ chkin_("GFUDS", (ftnlen)5); /* Check the step size. */ if (*step <= 0.) { setmsg_("Step size was #; step size must be positive.", (ftnlen)44); errdp_("#", step, (ftnlen)1); sigerr_("SPICE(INVALIDSTEP)", (ftnlen)18); chkout_("GFUDS", (ftnlen)5); return 0; } /* Confirm minimum number of windows. */ if (*nw < 5) { setmsg_("Workspace window count was #; count must be at least #.", ( ftnlen)55); errint_("#", nw, (ftnlen)1); errint_("#", &c__5, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFUDS", (ftnlen)5); return 0; } /* Confirm minimum window sizes. */ if (*mw < 2 || odd_(mw)) { setmsg_("Workspace window size was #; size must be at least 2 and an" " even value.", (ftnlen)71); errint_("#", mw, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFUDS", (ftnlen)5); return 0; } /* Check the result window size. */ i__1 = sized_(result); if (sized_(result) < 2 || odd_(&i__1)) { setmsg_("Result window size was #; size must be at least 2 and an ev" "en value.", (ftnlen)68); i__1 = sized_(result); errint_("#", &i__1, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFUDS", (ftnlen)5); return 0; } /* Set the step size. */ gfsstp_(step); /* Set the reference value. */ zzgfref_(refval); /* Use the default GF convergence tolerance. */ tol = 1e-6; /* Initialize the RESULT window to empty. */ scardd_(&c__0, result); /* Call ZZGFRELX to do the event detection work. */ zzgfrelx_((U_fp)gfstep_, (U_fp)gfrefn_, (U_fp)udqdec, (U_fp)zzgfudlt_, ( U_fp)udfunc, (S_fp)zzgfref_, relate, refval, &tol, adjust, cnfine, mw, nw, work, &c_false, (U_fp)gfrepi_, (U_fp)gfrepu_, (U_fp) gfrepf_, rptpre, rptsuf, &c_false, (L_fp)gfbail_, result, relate_len, (ftnlen)1, (ftnlen)1); chkout_("GFUDS", (ftnlen)5); return 0; } /* gfuds_ */
/* $Procedure GFPA ( GF, phase angle search ) */ /* Subroutine */ int gfpa_(char *target, char *illmn, char *abcorr, char * obsrvr, char *relate, doublereal *refval, doublereal *adjust, doublereal *step, doublereal *cnfine, integer *mw, integer *nw, doublereal *work, doublereal *result, ftnlen target_len, ftnlen illmn_len, ftnlen abcorr_len, ftnlen obsrvr_len, ftnlen relate_len) { /* System generated locals */ integer work_dim1, work_offset, i__1; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); /* Local variables */ extern /* Subroutine */ int chkin_(char *, ftnlen); extern integer sized_(doublereal *); extern logical gfbail_(); logical ok; extern /* Subroutine */ int scardd_(integer *, doublereal *); extern /* Subroutine */ int gfrefn_(), gfrepi_(), gfrepf_(), gfrepu_(), gfstep_(); char qcpars[80*4], qpnams[80*4]; extern logical return_(void); doublereal qdpars[4]; integer qipars[4]; logical qlpars[4]; extern /* Subroutine */ int setmsg_(char *, ftnlen), errint_(char *, integer *, ftnlen), sigerr_(char *, ftnlen), chkout_(char *, ftnlen), gfsstp_(doublereal *), gfevnt_(U_fp, U_fp, char *, integer *, char *, char *, doublereal *, integer *, logical *, char *, doublereal *, doublereal *, doublereal *, doublereal *, logical *, U_fp, U_fp, U_fp, integer *, integer *, doublereal *, logical *, L_fp, doublereal *, ftnlen, ftnlen, ftnlen, ftnlen); extern logical odd_(integer *); doublereal tol; extern /* Subroutine */ int zzholdd_(integer *, integer *, logical *, doublereal *); /* $ Abstract */ /* Determine time intervals for which a specified constraint */ /* on the phase angle between an illumination source, a target, */ /* and observer body centers is met. */ /* $ 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 */ /* GF */ /* NAIF_IDS */ /* SPK */ /* TIME */ /* WINDOWS */ /* $ Keywords */ /* EVENT */ /* GEOMETRY */ /* EPHEMERIS */ /* SEARCH */ /* WINDOW */ /* $ Declarations */ /* $ Abstract */ /* This file contains public, global parameter declarations */ /* for the SPICELIB Geometry Finder (GF) subsystem. */ /* $ 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 */ /* GF */ /* $ Keywords */ /* GEOMETRY */ /* ROOT */ /* $ Restrictions */ /* None. */ /* $ Author_and_Institution */ /* N.J. Bachman (JPL) */ /* L.E. Elson (JPL) */ /* E.D. Wright (JPL) */ /* $ Literature_References */ /* None. */ /* $ Version */ /* - SPICELIB Version 1.3.0, 01-OCT-2011 (NJB) */ /* Added NWILUM parameter. */ /* - SPICELIB Version 1.2.0, 14-SEP-2010 (EDW) */ /* Added NWPA parameter. */ /* - SPICELIB Version 1.1.0, 08-SEP-2009 (EDW) */ /* Added NWRR parameter. */ /* Added NWUDS parameter. */ /* - SPICELIB Version 1.0.0, 21-FEB-2009 (NJB) (LSE) (EDW) */ /* -& */ /* Root finding parameters: */ /* CNVTOL is the default convergence tolerance used by the */ /* high-level GF search API routines. This tolerance is */ /* used to terminate searches for binary state transitions: */ /* when the time at which a transition occurs is bracketed */ /* by two times that differ by no more than CNVTOL, the */ /* transition time is considered to have been found. */ /* Units are TDB seconds. */ /* NWMAX is the maximum number of windows allowed for user-defined */ /* workspace array. */ /* DOUBLE PRECISION WORK ( LBCELL : MW, NWMAX ) */ /* Currently no more than twelve windows are required; the three */ /* extra windows are spares. */ /* Callers of GFEVNT can include this file and use the parameter */ /* NWMAX to declare the second dimension of the workspace array */ /* if necessary. */ /* Callers of GFIDST should declare their workspace window */ /* count using NWDIST. */ /* Callers of GFSEP should declare their workspace window */ /* count using NWSEP. */ /* Callers of GFRR should declare their workspace window */ /* count using NWRR. */ /* Callers of GFUDS should declare their workspace window */ /* count using NWUDS. */ /* Callers of GFPA should declare their workspace window */ /* count using NWPA. */ /* Callers of GFILUM should declare their workspace window */ /* count using NWILUM. */ /* ADDWIN is a parameter used to expand each interval of the search */ /* (confinement) window by a small amount at both ends in order to */ /* accommodate searches using equality constraints. The loaded */ /* kernel files must accommodate these expanded time intervals. */ /* FRMNLN is a string length for frame names. */ /* NVRMAX is the maximum number of vertices if FOV type is "POLYGON" */ /* FOVTLN -- maximum length for FOV string. */ /* Specify the character strings that are allowed in the */ /* specification of field of view shapes. */ /* Character strings that are allowed in the */ /* specification of occultation types: */ /* Occultation target shape specifications: */ /* Specify the number of supported occultation types and occultation */ /* type string length: */ /* Instrument field-of-view (FOV) parameters */ /* Maximum number of FOV boundary vectors: */ /* FOV shape parameters: */ /* circle */ /* ellipse */ /* polygon */ /* rectangle */ /* End of file gf.inc. */ /* $ Abstract */ /* SPICE private routine intended solely for the support of SPICE */ /* routines. Users should not call this routine directly due to the */ /* volatile nature of this routine. */ /* This file contains parameter declarations for the ZZHOLDD */ /* routine. */ /* $ 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 */ /* None. */ /* $ Declarations */ /* None. */ /* $ Brief_I/O */ /* None. */ /* $ Detailed_Input */ /* None. */ /* $ Detailed_Output */ /* None. */ /* $ Parameters */ /* GEN general value, primarily for testing. */ /* GF_REF user defined GF reference value. */ /* GF_TOL user defined GF convergence tolerance. */ /* GF_DT user defined GF step for numeric differentiation. */ /* $ Exceptions */ /* None. */ /* $ Files */ /* None. */ /* $ Particulars */ /* None. */ /* $ Examples */ /* None. */ /* $ Restrictions */ /* None. */ /* $ Literature_References */ /* None. */ /* $ Author_and_Institution */ /* E.D. Wright (JPL) */ /* $ Version */ /* - SPICELIB Version 1.0.0 03-DEC-2013 (EDW) */ /* -& */ /* OP codes. The values exist in the integer domain */ /* [ -ZZNOP, -1], */ /* Current number of OP codes. */ /* ID codes. The values exist in the integer domain */ /* [ 1, NID], */ /* General use, primarily testing. */ /* The user defined GF reference value. */ /* The user defined GF convergence tolerance. */ /* The user defined GF step for numeric differentiation. */ /* Current number of ID codes, dimension of array */ /* in ZZHOLDD. Bad things can happen if this parameter */ /* does not have the proper value. */ /* End of file zzholdd.inc. */ /* $ Brief_I/O */ /* Variable I/O Description */ /* -------- --- -------------------------------------------------- */ /* LBCELL P SPICE Cell lower bound. */ /* CNVTOL P Default convergence tolerance. */ /* TARGET I Name of the target body. */ /* ILLMN I Name of the illuminating body. */ /* ABCORR I Aberration correction flag. */ /* OBSRVR I Name of the observing body. */ /* RELATE I Relational operator. */ /* REFVAL I Reference value. */ /* ADJUST I Adjustment value for absolute extrema searches. */ /* STEP I Step size used for locating extrema and roots. */ /* CNFINE I SPICE window to which the search is confined. */ /* MW I Workspace window size. */ /* NW I The number of workspace windows needed for */ /* the search. */ /* WORK I-O Array of workspace windows. */ /* RESULT I-O SPICE window containing results. */ /* $ Detailed_Input */ /* TARGET the string name of a target body. Optionally, you may */ /* supply the integer ID code for the object as an */ /* integer string. For example both 'MOON' and '301' */ /* are legitimate strings that indicate the moon is the */ /* target body. */ /* Case and leading or trailing blanks are not significant */ /* in the string TARGET. */ /* ILLMN the string name of the illuminating body. This will */ /* normally be 'SUN' but the algorithm can use any */ /* ephemeris object */ /* Case and leading or trailing blanks are not significant */ /* in the string ILLMN. */ /* ABCORR the string description of the aberration corrections to */ /* apply to the state evaluations to account for one-way */ /* light time and stellar aberration. */ /* This routine accepts only reception mode aberration */ /* corrections. See the header of SPKEZR for a detailed */ /* description of the aberration correction options. */ /* For convenience, the allowed aberation options are */ /* listed below: */ /* 'NONE' Apply no correction. Returns the "true" */ /* geometric state. */ /* 'LT' "Reception" case: correct for */ /* one-way light time using a Newtonian */ /* formulation. */ /* 'LT+S' "Reception" case: correct for */ /* one-way light time and stellar */ /* aberration using a Newtonian */ /* formulation. */ /* 'CN' "Reception" case: converged */ /* Newtonian light time correction. */ /* 'CN+S' "Reception" case: converged */ /* Newtonian light time and stellar */ /* aberration corrections. */ /* Case and leading or trailing blanks are not significant */ /* in the string ABCORR. */ /* OBSRVR the string name of an observing body. Optionally, you */ /* may supply the ID code of the object as an integer */ /* string. For example both "MOON" and "301" are legitimate */ /* strings that indicate the Moon is the observer. */ /* Case and leading or trailing blanks are not significant */ /* in the string OBSRVR. */ /* RELATE the string or character describing the relational */ /* operator that defines the constraint on the */ /* phase angle of the observer-target vector. The result */ /* window found by this routine indicates the time intervals */ /* where the constraint is satisfied. Supported values of */ /* RELATE and corresponding meanings are shown below: */ /* '>' The phase angle value is greater than the */ /* reference value REFVAL. */ /* '=' The phase angle value is equal to the */ /* reference value REFVAL. */ /* '<' The phase angle value is less than the */ /* reference value REFVAL. */ /* 'ABSMAX' The phase angle value is at an absolute */ /* maximum. */ /* 'ABSMIN' The phase angle value is at an absolute */ /* minimum. */ /* 'LOCMAX' The phase angle value is at a local */ /* maximum. */ /* 'LOCMIN' The phase angle value is at a local */ /* minimum. */ /* The caller may indicate that the region of interest */ /* is the set of time intervals where the quantity is */ /* within a specified measure of an absolute extremum. */ /* The argument ADJUST (described below) is used to */ /* specify this measure. */ /* Local extrema are considered to exist only in the */ /* interiors of the intervals comprising the confinement */ /* window: a local extremum cannot exist at a boundary */ /* point of the confinement window. */ /* Case and leading or trailing blanks are not */ /* significant in the string RELATE. */ /* REFVAL the double precision reference value used together with */ /* the argument RELATE to define an equality or inequality */ /* to satisfy by the phase angle of the observer-target */ /* vector. See the discussion of RELATE above for */ /* further information. */ /* The units of REFVAL are radians. */ /* ADJUST a double precision value used to modify searches for */ /* absolute extrema: when RELATE is set to ABSMAX or ABSMIN */ /* and ADJUST is set to a positive value, GFPA finds */ /* times when the phase angle is within */ /* ADJUST radians of the specified extreme value. */ /* For RELATE set to ABSMAX, the RESULT window contains */ /* time intervals when the phase angle has */ /* values between ABSMAX - ADJUST and ABSMAX. */ /* For RELATE set to ABSMIN, the RESULT window contains */ /* time intervals when the phase angle has */ /* values between ABSMIN and ABSMIN + ADJUST. */ /* ADJUST is not used for searches for local extrema, */ /* equality or inequality conditions. */ /* STEP the double precision time step size to use in the search. */ /* STEP must be short enough for a search using this step */ /* size to locate the time intervals where the phase angle */ /* function is monotone increasing or decreasing. However, */ /* STEP must not be *too* short, or the search will take an */ /* unreasonable amount of time. */ /* The choice of STEP affects the completeness but not */ /* the precision of solutions found by this routine; the */ /* precision is controlled by the convergence tolerance. */ /* See the discussion of the parameter CNVTOL for */ /* details. */ /* STEP has units of TDB seconds. */ /* CNFINE a double precision SPICE window that confines the time */ /* period over which the specified search is conducted. */ /* CNFINE may consist of a single interval or a collection */ /* of intervals. */ /* In some cases the confinement window can be used to */ /* greatly reduce the time period that must be searched */ /* for the desired solution. See the Particulars section */ /* below for further discussion. */ /* See the Examples section below for a code example */ /* that shows how to create a confinement window. */ /* CNFINE must be initialized by the caller using the */ /* SPICELIB routine SSIZED. */ /* MW is a parameter specifying the length of the SPICE */ /* windows in the workspace array WORK (see description */ /* below) used by this routine. */ /* MW should be set to a number at least twice as large */ /* as the maximum number of intervals required by any */ /* workspace window. In many cases, it's not necessary to */ /* compute an accurate estimate of how many intervals are */ /* needed; rather, the user can pick a size considerably */ /* larger than what's really required. */ /* However, since excessively large arrays can prevent */ /* applications from compiling, linking, or running */ /* properly, sometimes MW must be set according to */ /* the actual workspace requirement. A rule of thumb */ /* for the number of intervals NINTVLS needed is */ /* NINTVLS = 2*N + ( M / STEP ) */ /* where */ /* N is the number of intervals in the confinement */ /* window */ /* M is the measure of the confinement window, in */ /* units of seconds */ /* STEP is the search step size in seconds */ /* MW should then be set to */ /* 2 * NINTVLS */ /* NW is a parameter specifying the number of SPICE windows */ /* in the workspace array WORK (see description below) */ /* used by this routine. NW should be set to the */ /* parameter NWPA; this parameter is declared in the */ /* include file gf.inc. (The reason this dimension is */ /* an input argument is that this allows run-time */ /* error checking to be performed.) */ /* WORK is an array used to store workspace windows. This */ /* array should be declared by the caller as shown: */ /* INCLUDE 'gf.inc' */ /* ... */ /* DOUBLE PRECISION WORK ( LBCELL : MW, NWPA ) */ /* where MW is a constant declared by the caller and */ /* NWPA is a constant defined in the SPICELIB INCLUDE */ /* file gf.inc. See the discussion of MW above. */ /* WORK need not be initialized by the caller. */ /* RESULT a double precision SPICE window that will contain the */ /* search results. RESULT must be initialized using */ /* a call to SSIZED. RESULT must be declared and initialized */ /* with sufficient size to capture the full set of time */ /* intervals within the search region on which the specified */ /* constraint is satisfied. */ /* If RESULT is non-empty on input, its contents */ /* will be discarded before GFPA conducts its */ /* search. */ /* $ Detailed_Output */ /* WORK the input workspace array, modified by this */ /* routine. */ /* RESULT the SPICE window of intervals, contained within the */ /* confinement window CNFINE, on which the specified */ /* constraint is satisfied. */ /* If the search is for local extrema, or for absolute */ /* extrema with ADJUST set to zero, then normally each */ /* interval of RESULT will be a singleton: the left and */ /* right endpoints of each interval will be identical. */ /* If no times within the confinement window satisfy the */ /* constraint, RESULT will return with a cardinality of */ /* zero. */ /* $ Parameters */ /* LBCELL the integer value defining the lower bound for */ /* SPICE Cell arrays (a SPICE window is a kind of cell). */ /* CNVTOL is the default convergence tolerance used for finding */ /* endpoints of the intervals comprising the result */ /* window. CNVTOL is also used for finding intermediate */ /* results; in particular, CNVTOL is used for finding the */ /* windows on which the phase angle is increasing */ /* or decreasing. CNVTOL is used to determine when binary */ /* searches for roots should terminate: when a root is */ /* bracketed within an interval of length CNVTOL; the */ /* root is considered to have been found. */ /* The accuracy, as opposed to precision, of roots found */ /* by this routine depends on the accuracy of the input */ /* data. In most cases, the accuracy of solutions will be */ /* inferior to their precision. */ /* See INCLUDE file gf.inc for declarations and descriptions of */ /* parameters used throughout the GF system. */ /* $ Exceptions */ /* 1) In order for this routine to produce correct results, */ /* the step size must be appropriate for the problem at hand. */ /* Step sizes that are too large may cause this routine to miss */ /* roots; step sizes that are too small may cause this routine */ /* to run unacceptably slowly and in some cases, find spurious */ /* roots. */ /* This routine does not diagnose invalid step sizes, except */ /* that if the step size is non-positive, the error */ /* SPICE(INVALIDSTEP) is signaled. */ /* 2) Due to numerical errors, in particular, */ /* - truncation error in time values */ /* - finite tolerance value */ /* - errors in computed geometric quantities */ /* it is *normal* for the condition of interest to not always be */ /* satisfied near the endpoints of the intervals comprising the */ /* RESULT window. One technique to handle such a situation, */ /* slightly contract RESULT using the window routine WNCOND. */ /* 3) SPICE(INVALIDDIMENSION) signals if workspace window size, MW, */ /* is not at least 2 and an even value. */ /* 4) SPICE(INVALIDDIMENSION) signals if workspace window count, */ /* NW, is not at least NWPA. */ /* 5) SPICE(INVALIDDIMENSION) signals if result window, RESULT, */ /* is not at least 2 and an even value. */ /* 6) If RESULT has insufficient capacity to contain the */ /* number of intervals on which the specified angle condition */ /* is met, the error will be diagnosed by a routine in the call */ /* tree of this routine. */ /* 7) If an error (typically cell overflow) occurs during */ /* window arithmetic, the error will be diagnosed by a routine */ /* in the call tree of this routine. */ /* 8) If the relational operator RELATE is not recognized, an */ /* error is signaled by a routine in the call tree of this */ /* routine. */ /* 9) If ADJUST is negative an error is signaled from a routine in */ /* the call tree of this routine. */ /* A non-zero value for ADJUST when RELATE has any value other */ /* than "ABSMIN" or "ABSMAX" causes the error SPICE(INVALIDVALUE) */ /* to signal from a routine in the call tree of this routine. */ /* 10) If any of the input body names, TARGET, ILLMN, OBSRVR, do */ /* not map to NAIF ID codes, an error is signaled by a routine */ /* in the call tree of this routine. */ /* 11) If the input body names, TARGET, ILLMN, OBSRVR, are not */ /* distinct, an error is signaled by a routine in the call */ /* tree of this routine. */ /* 12) If required ephemerides or other kernel data are not */ /* available, an error is signaled by a routine in the call tree */ /* of this routine. */ /* 13) An error signals from a routine in the call tree of */ /* this routine for any transmit mode aberration correction. */ /* $ Files */ /* Appropriate SPK and PCK kernels must be loaded by the calling */ /* program before this routine is called. */ /* The following data are required: */ /* - SPK data: the calling application must load ephemeris data */ /* for the targets, observer, and any intermediate objects in */ /* a chain connecting the targets and observer that cover the */ /* time period specified by the window CNFINE. If aberration */ /* corrections are used, the states of target and observer */ /* relative to the solar system barycenter must be calculable */ /* from the available ephemeris data. Typically ephemeris data */ /* are made available by loading one or more SPK files using */ /* FURNSH. */ /* Kernel data are normally loaded once per program run, NOT every */ /* time this routine is called. */ /* $ Particulars */ /* ILLMN OBS */ /* ILLMN as seen * / */ /* from TARG at | / */ /* ET - LT. | / */ /* >|..../< phase angle */ /* | / */ /* . | / */ /* . | / */ /* . * TARG as seen from OBS */ /* SEP . TARG at ET */ /* . / */ /* / */ /* * */ /* This routine determines if the caller-specified constraint */ /* condition on the geometric event (phase angle) is satisfied for */ /* any time intervals within the confinement window CNFINE. If one */ /* or more such time intervals exist, those intervals are added */ /* to the RESULT window. */ /* This routine provides a simpler, but less flexible interface */ /* than does the routine GFEVNT for conducting searches for */ /* illuminator-target-observer phase angle value events. */ /* Applications that require support for progress reporting, */ /* interrupt handling, non-default step or refinement functions */ /* should call GFEVNT rather than this routine. */ /* Below we discuss in greater detail aspects of this routine's */ /* solution process that are relevant to correct and efficient */ /* use of this routine in user applications. */ /* The Search Process */ /* ================== */ /* Regardless of the type of constraint selected by the caller, this */ /* routine starts the search for solutions by determining the time */ /* periods, within the confinement window, over which the */ /* phase angle function is monotone increasing and monotone */ /* decreasing. Each of these time periods is represented by a SPICE */ /* window. Having found these windows, all of the phase angle */ /* function's local extrema within the confinement window are known. */ /* Absolute extrema then can be found very easily. */ /* Within any interval of these "monotone" windows, there will be at */ /* most one solution of any equality constraint. Since the boundary */ /* of the solution set for any inequality constraint is contained in */ /* the union of */ /* - the set of points where an equality constraint is met */ /* - the boundary points of the confinement window */ /* the solutions of both equality and inequality constraints can be */ /* found easily once the monotone windows have been found. */ /* Step Size */ /* ========= */ /* The monotone windows (described above) are found using a two-step */ /* search process. Each interval of the confinement window is */ /* searched as follows: first, the input step size is used to */ /* determine the time separation at which the sign of the rate of */ /* change of phase angle will be sampled. Starting at */ /* the left endpoint of an interval, samples will be taken at each */ /* step. If a change of sign is found, a root has been bracketed; at */ /* that point, the time at which the time derivative of the */ /* phase angle is zero can be found by a refinement process, for */ /* example, using a binary search. */ /* Note that the optimal choice of step size depends on the lengths */ /* of the intervals over which the phase angle function is monotone: */ /* the step size should be shorter than the shortest of these */ /* intervals (within the confinement window). */ /* The optimal step size is *not* necessarily related to the lengths */ /* of the intervals comprising the result window. For example, if */ /* the shortest monotone interval has length 10 days, and if the */ /* shortest result window interval has length 5 minutes, a step size */ /* of 9.9 days is still adequate to find all of the intervals in the */ /* result window. In situations like this, the technique of using */ /* monotone windows yields a dramatic efficiency improvement over a */ /* state-based search that simply tests at each step whether the */ /* specified constraint is satisfied. The latter type of search can */ /* miss solution intervals if the step size is longer than the */ /* shortest solution interval. */ /* Having some knowledge of the relative geometry of the target, */ /* illumination source, and observer can be a valuable aid in */ /* picking a reasonable step size. In general, the user can */ /* compensate for lack of such knowledge by picking a very short */ /* step size; the cost is increased computation time. */ /* Note that the step size is not related to the precision with which */ /* the endpoints of the intervals of the result window are computed. */ /* That precision level is controlled by the convergence tolerance. */ /* Convergence Tolerance */ /* ===================== */ /* As described above, the root-finding process used by this routine */ /* involves first bracketing roots and then using a search process */ /* to locate them. "Roots" are both times when local extrema are */ /* attained and times when the geometric quantity function is equal */ /* to a reference value. All endpoints of the intervals comprising */ /* the result window are either endpoints of intervals of the */ /* confinement window or roots. */ /* Once a root has been bracketed, a refinement process is used to */ /* narrow down the time interval within which the root must lie. */ /* This refinement process terminates when the location of the root */ /* has been determined to within an error margin called the */ /* "convergence tolerance." The default convergence tolerance */ /* used by this routine is set by the parameter CNVTOL (defined */ /* in gf.inc). */ /* The value of CNVTOL is set to a "tight" value so that the */ /* tolerance doesn't become the limiting factor in the accuracy of */ /* solutions found by this routine. In general the accuracy of input */ /* data will be the limiting factor. */ /* The user may change the convergence tolerance from the default */ /* CNVTOL value by calling the routine GFSTOL, e.g. */ /* CALL GFSTOL( tolerance value ) */ /* Call GFSTOL prior to calling this routine. All subsequent */ /* searches will use the updated tolerance value. */ /* Setting the tolerance tighter than CNVTOL is unlikely to be */ /* useful, since the results are unlikely to be more accurate. */ /* Making the tolerance looser will speed up searches somewhat, */ /* since a few convergence steps will be omitted. However, in most */ /* cases, the step size is likely to have a much greater effect */ /* on processing time than would the convergence tolerance. */ /* The Confinement Window */ /* ====================== */ /* The simplest use of the confinement window is to specify a time */ /* interval within which a solution is sought. However, the */ /* confinement window can, in some cases, be used to make searches */ /* more efficient. Sometimes it's possible to do an efficient search */ /* to reduce the size of the time period over which a relatively */ /* slow search of interest must be performed. */ /* $ Examples */ /* The numerical results shown for these examples may differ across */ /* platforms. The results depend on the SPICE kernels used as */ /* input, the compiler and supporting libraries, and the machine */ /* specific arithmetic implementation. */ /* Use the meta-kernel shown below to load the required SPICE */ /* kernels. */ /* KPL/MK */ /* File name: standard.tm */ /* This meta-kernel is intended to support operation of SPICE */ /* example programs. The kernels shown here should not be */ /* assumed to contain adequate or correct versions of data */ /* required by SPICE-based user applications. */ /* In order for an application to use this meta-kernel, the */ /* kernels referenced here must be present in the user's */ /* current working directory. */ /* The names and contents of the kernels referenced */ /* by this meta-kernel are as follows: */ /* File name Contents */ /* --------- -------- */ /* de421.bsp Planetary ephemeris */ /* pck00009.tpc Planet orientation and */ /* radii */ /* naif0009.tls Leapseconds */ /* \begindata */ /* KERNELS_TO_LOAD = ( 'de421.bsp', */ /* 'pck00009.tpc', */ /* 'naif0009.tls' ) */ /* \begintext */ /* Determine the time windows from December 1, 2006 UTC to */ /* January 31, 2007 UTC for which the sun-moon-earth configuration */ /* phase angle satisfies the relation conditions with respect to a */ /* reference value of .57598845 radians (the phase angle at */ /* January 1, 2007 00:00:00.000 UTC, 33.001707 degrees). Also */ /* determine the time windows corresponding to the local maximum and */ /* minimum phase angles, and the absolute maximum and minimum phase */ /* angles during the search interval. The configuration defines the */ /* sun as the illuminator, the moon as the target, and the earth as */ /* the observer. */ /* PROGRAM GFPA_T */ /* IMPLICIT NONE */ /* C */ /* C Include GF parameter declarations: */ /* C */ /* INCLUDE 'gf.inc' */ /* C */ /* C SPICELIB functions */ /* C */ /* DOUBLE PRECISION SPD */ /* DOUBLE PRECISION PHASEQ */ /* INTEGER WNCARD */ /* C */ /* C Local parameters */ /* C */ /* INTEGER LBCELL */ /* PARAMETER ( LBCELL = -5 ) */ /* C */ /* C Use the parameter MAXWIN for both the result window size */ /* C and the workspace size. */ /* C */ /* INTEGER MAXWIN */ /* PARAMETER ( MAXWIN = 1000 ) */ /* C */ /* C Length of strings: */ /* C */ /* INTEGER TIMLEN */ /* PARAMETER ( TIMLEN = 26 ) */ /* INTEGER NLOOPS */ /* PARAMETER ( NLOOPS = 7 ) */ /* C */ /* C Local variables */ /* C */ /* CHARACTER*(TIMLEN) RELATE (NLOOPS) */ /* CHARACTER*(6) ABCORR */ /* CHARACTER*(6) ILLMN */ /* CHARACTER*(6) OBSRVR */ /* CHARACTER*(6) TARGET */ /* CHARACTER*(TIMLEN) TIMSTR */ /* DOUBLE PRECISION CNFINE ( LBCELL : 2 ) */ /* DOUBLE PRECISION RESULT ( LBCELL : MAXWIN ) */ /* DOUBLE PRECISION WORK ( LBCELL : MAXWIN, NWPA ) */ /* DOUBLE PRECISION ADJUST */ /* DOUBLE PRECISION ET0 */ /* DOUBLE PRECISION ET1 */ /* DOUBLE PRECISION FINISH */ /* DOUBLE PRECISION PHASE */ /* DOUBLE PRECISION REFVAL */ /* DOUBLE PRECISION START */ /* DOUBLE PRECISION STEP */ /* INTEGER I */ /* INTEGER J */ /* C */ /* C The relation values for the search. */ /* C */ /* DATA RELATE / '=', */ /* . '<', */ /* . '>', */ /* . 'LOCMIN', */ /* . 'ABSMIN', */ /* . 'LOCMAX', */ /* . 'ABSMAX' / */ /* C */ /* C Load kernels. */ /* C */ /* CALL FURNSH ( 'standard.tm' ) */ /* C */ /* C Initialize windows. */ /* C */ /* CALL SSIZED ( MAXWIN, RESULT ) */ /* CALL SSIZED ( 2, CNFINE ) */ /* C */ /* C Store the time bounds of our search interval in */ /* C the confinement window. */ /* C */ /* CALL STR2ET ( '2006 DEC 01', ET0 ) */ /* CALL STR2ET ( '2007 JAN 31', ET1 ) */ /* CALL WNINSD ( ET0, ET1, CNFINE ) */ /* C */ /* C Search using a step size of 1 day (in units of seconds). */ /* C The reference value is 0.57598845 radians. We're not */ /* C using the adjustment feature, so we set ADJUST to zero. */ /* C */ /* STEP = SPD() */ /* REFVAL = 0.57598845D0 */ /* ADJUST = 0.D0 */ /* C */ /* C Define the values for target, observer, illuminator, and */ /* C aberration correction. */ /* C */ /* TARGET = 'MOON' */ /* ILLMN = 'SUN' */ /* ABCORR = 'LT+S' */ /* OBSRVR = 'EARTH' */ /* DO J=1, NLOOPS */ /* WRITE(*,*) 'Relation condition: ', RELATE(J) */ /* C */ /* C Perform the search. The SPICE window RESULT contains */ /* C the set of times when the condition is met. */ /* C */ /* CALL GFPA ( TARGET, ILLMN, ABCORR, OBSRVR, */ /* . RELATE(J), REFVAL, ADJUST, STEP, */ /* . CNFINE, MAXWIN, NWPA, WORK, */ /* . RESULT ) */ /* C */ /* C Display the results. */ /* C */ /* IF ( WNCARD(RESULT) .EQ. 0 ) THEN */ /* WRITE (*, '(A)') 'Result window is empty.' */ /* ELSE */ /* DO I = 1, WNCARD(RESULT) */ /* C */ /* C Fetch the endpoints of the Ith interval */ /* C of the result window. */ /* C */ /* CALL WNFETD ( RESULT, I, START, FINISH ) */ /* PHASE = PHASEQ( START, TARGET, ILLMN, OBSRVR, */ /* . ABCORR ) */ /* CALL TIMOUT ( START, */ /* . 'YYYY-MON-DD HR:MN:SC.###', */ /* . TIMSTR ) */ /* WRITE (*, '(A,F16.9)') 'Start time = '//TIMSTR, */ /* . PHASE */ /* PHASE = PHASEQ( FINISH, TARGET, ILLMN, OBSRVR, */ /* . ABCORR ) */ /* CALL TIMOUT ( FINISH, */ /* . 'YYYY-MON-DD HR:MN:SC.###', */ /* . TIMSTR ) */ /* WRITE (*, '(A,F16.9)') 'Stop time = '//TIMSTR, */ /* . PHASE */ /* END DO */ /* END IF */ /* WRITE(*,*) ' ' */ /* END DO */ /* END */ /* The program outputs: */ /* Relation condition: = */ /* Start time = 2006-DEC-02 13:31:34.414 0.575988450 */ /* Stop time = 2006-DEC-02 13:31:34.414 0.575988450 */ /* Start time = 2006-DEC-07 14:07:55.470 0.575988450 */ /* Stop time = 2006-DEC-07 14:07:55.470 0.575988450 */ /* Start time = 2006-DEC-31 23:59:59.997 0.575988450 */ /* Stop time = 2006-DEC-31 23:59:59.997 0.575988450 */ /* Start time = 2007-JAN-06 08:16:25.512 0.575988450 */ /* Stop time = 2007-JAN-06 08:16:25.512 0.575988450 */ /* Start time = 2007-JAN-30 11:41:32.557 0.575988450 */ /* Stop time = 2007-JAN-30 11:41:32.557 0.575988450 */ /* Relation condition: < */ /* Start time = 2006-DEC-02 13:31:34.414 0.575988450 */ /* Stop time = 2006-DEC-07 14:07:55.470 0.575988450 */ /* Start time = 2006-DEC-31 23:59:59.997 0.575988450 */ /* Stop time = 2007-JAN-06 08:16:25.512 0.575988450 */ /* Start time = 2007-JAN-30 11:41:32.557 0.575988450 */ /* Stop time = 2007-JAN-31 00:00:00.000 0.468279091 */ /* Relation condition: > */ /* Start time = 2006-DEC-01 00:00:00.000 0.940714974 */ /* Stop time = 2006-DEC-02 13:31:34.414 0.575988450 */ /* Start time = 2006-DEC-07 14:07:55.470 0.575988450 */ /* Stop time = 2006-DEC-31 23:59:59.997 0.575988450 */ /* Start time = 2007-JAN-06 08:16:25.512 0.575988450 */ /* Stop time = 2007-JAN-30 11:41:32.557 0.575988450 */ /* Relation condition: LOCMIN */ /* Start time = 2006-DEC-05 00:16:50.416 0.086121423 */ /* Stop time = 2006-DEC-05 00:16:50.416 0.086121423 */ /* Start time = 2007-JAN-03 14:18:32.086 0.079899769 */ /* Stop time = 2007-JAN-03 14:18:32.086 0.079899769 */ /* Relation condition: ABSMIN */ /* Start time = 2007-JAN-03 14:18:32.086 0.079899769 */ /* Stop time = 2007-JAN-03 14:18:32.086 0.079899769 */ /* Relation condition: LOCMAX */ /* Start time = 2006-DEC-20 14:09:10.496 3.055062862 */ /* Stop time = 2006-DEC-20 14:09:10.496 3.055062862 */ /* Start time = 2007-JAN-19 04:27:54.694 3.074603891 */ /* Stop time = 2007-JAN-19 04:27:54.694 3.074603891 */ /* Relation condition: ABSMAX */ /* Start time = 2007-JAN-19 04:27:54.694 3.074603891 */ /* Stop time = 2007-JAN-19 04:27:54.694 3.074603891 */ /* $ Restrictions */ /* 1) The kernel files to be used by this routine must be loaded */ /* (normally using the SPICELIB routine FURNSH) before this */ /* routine is called. */ /* $ Literature_References */ /* None. */ /* $ Author_and_Institution */ /* E.D. Wright (JPL) */ /* N.J. Bachman (JPL) */ /* $ Version */ /* - SPICELIB Version 1.0.0, 15-JUL-2014 (EDW) (NJB) */ /* -& */ /* $ Index_Entries */ /* GF phase angle search */ /* -& */ /* SPICELIB functions */ /* Routines to set step size, refine transition times */ /* and report work. */ /* Local parameters */ /* Local variables */ /* Quantity definition parameter arrays: */ /* Standard SPICE error handling. */ /* Parameter adjustments */ work_dim1 = *mw + 6; work_offset = work_dim1 - 5; /* Function Body */ if (return_()) { return 0; } /* Check into the error subsystem. */ chkin_("GFPA", (ftnlen)4); /* Confirm minimum window sizes. */ if (*mw < 2 || odd_(mw)) { setmsg_("Workspace window size was #; size must be at least 2 and an" " even value.", (ftnlen)71); errint_("#", mw, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFPA", (ftnlen)4); return 0; } if (*nw < 5) { setmsg_("Workspace window count was #; count must be at least #.", ( ftnlen)55); errint_("#", nw, (ftnlen)1); errint_("#", &c__5, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFPA", (ftnlen)4); return 0; } /* Check the result window size. */ i__1 = sized_(result); if (sized_(result) < 2 || odd_(&i__1)) { setmsg_("Result window size was #; size must be at least 2 and an ev" "en value.", (ftnlen)68); i__1 = sized_(result); errint_("#", &i__1, (ftnlen)1); sigerr_("SPICE(INVALIDDIMENSION)", (ftnlen)23); chkout_("GFPA", (ftnlen)4); return 0; } /* Set up a call to GFEVNT specific to the phase angle search. */ s_copy(qpnams, "TARGET", (ftnlen)80, (ftnlen)6); s_copy(qcpars, target, (ftnlen)80, target_len); s_copy(qpnams + 80, "OBSERVER", (ftnlen)80, (ftnlen)8); s_copy(qcpars + 80, obsrvr, (ftnlen)80, obsrvr_len); s_copy(qpnams + 160, "ABCORR", (ftnlen)80, (ftnlen)6); s_copy(qcpars + 160, abcorr, (ftnlen)80, abcorr_len); s_copy(qpnams + 240, "ILLUM", (ftnlen)80, (ftnlen)5); s_copy(qcpars + 240, illmn, (ftnlen)80, illmn_len); /* Set the step size. */ gfsstp_(step); /* Retrieve the convergence tolerance, if set. */ zzholdd_(&c_n1, &c__3, &ok, &tol); /* Use the default value CNVTOL if no stored tolerance value. */ if (! ok) { tol = 1e-6; } /* Initialize the RESULT window to empty. */ scardd_(&c__0, result); /* Look for solutions. */ /* Progress report and interrupt options are set to .FALSE. */ gfevnt_((U_fp)gfstep_, (U_fp)gfrefn_, "PHASE ANGLE", &c__4, qpnams, qcpars, qdpars, qipars, qlpars, relate, refval, &tol, adjust, cnfine, &c_false, (U_fp)gfrepi_, (U_fp)gfrepu_, (U_fp)gfrepf_, mw, &c__5, work, &c_false, (L_fp)gfbail_, result, (ftnlen)11, ( ftnlen)80, (ftnlen)80, relate_len); chkout_("GFPA", (ftnlen)4); return 0; } /* gfpa_ */