示例#1
0
文件: spkezp_c.c 项目: haisamido/GMAT
   void spkezp_c ( SpiceInt            targ,
                   SpiceDouble         et,
                   ConstSpiceChar    * ref,
                   ConstSpiceChar    * abcorr,
                   SpiceInt            obs,
                   SpiceDouble         ptarg[3],
                   SpiceDouble       * lt        ) 

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   targ       I   Target body NAIF ID code. 
   et         I   Observer epoch. 
   ref        I   Reference frame of output position vector. 
   abcorr     I   Aberration correction flag. 
   obs        I   Observing body NAIF ID code. 
   ptarg      O   Position of target. 
   lt         O   One way light time between observer and target. 
 
-Detailed_Input
 
   targ        is the NAIF ID code for a target body.  The target 
               and observer define a position vector which points 
               from the observer to the target. 
 
   et          is the ephemeris time, expressed as seconds past 
               J2000 TDB, at which the position of the target body 
               relative to the observer is to be computed. 'et' 
               refers to time at the observer's location. 
 
   ref         is the name of the reference frame relative to which 
               the output position vector should be expressed. This 
               may be any frame supported by the SPICE system, 
               including built-in frames (documented in the Frames 
               Required Reading) and frames defined by a loaded 
               frame kernel (FK). 
 
               When 'ref' designates a non-inertial frame, the 
               orientation of the frame is evaluated at an epoch 
               dependent on the selected aberration correction. See 
               the description of the output position vector 'ptarg' 
               for details. 
 
   abcorr      indicates the aberration corrections to be applied to 
               the position of the target body to account for 
               one-way light time and stellar aberration.  See the 
               discussion in the Particulars section for 
               recommendations on how to choose aberration 
               corrections. 
                 
               abcorr may be any of the following: 
 
                  "NONE"     Apply no correction. Return the  
                             geometric position of the target body  
                             relative to the observer.   
 
               The following values of abcorr apply to the 
               "reception" case in which photons depart from the 
               target's location at the light-time corrected epoch 
               et-lt and *arrive* at the observer's location at 'et': 
 
                  "LT"       Correct for one-way light time (also 
                             called "planetary aberration") using a 
                             Newtonian formulation. This correction 
                             yields the position of the target at 
                             the moment it emitted photons arriving 
                             at the observer at 'et'. 
 
                             The light time correction uses an
                             iterative solution of the light time 
                             equation (see Particulars for details). 
                             The solution invoked by the "LT" option 
                             uses one iteration. 
  
                  "LT+S"     Correct for one-way light time and 
                             stellar aberration using a Newtonian 
                             formulation. This option modifies the 
                             position obtained with the "LT" option 
                             to account for the observer's velocity 
                             relative to the solar system 
                             barycenter. The result is the apparent 
                             position of the target---the position 
                             as seen by the observer. 
 
                  "CN"       Converged Newtonian light time 
                             correction.  In solving the light time 
                             equation, the "CN" correction iterates 
                             until the solution converges (three 
                             iterations on all supported platforms). 
 
                             The "CN" correction typically does not 
                             substantially improve accuracy because 
                             the errors made by ignoring 
                             relativistic effects may be larger than 
                             the improvement afforded by obtaining 
                             convergence of the light time solution. 
                             The "CN" correction computation also 
                             requires a significantly greater number 
                             of CPU cycles than does the 
                             one-iteration light time correction. 
 
                  "CN+S"     Converged Newtonian light time 
                             and stellar aberration corrections. 
 
 
               The following values of abcorr apply to the 
               "transmission" case in which photons *depart* from 
               the observer's location at 'et' and arrive at the 
               target's location at the light-time corrected epoch 
               et+lt: 
 
                  "XLT"      "Transmission" case:  correct for 
                             one-way light time using a Newtonian 
                             formulation. This correction yields the 
                             position of the target at the moment it 
                             receives photons emitted from the 
                             observer's location at 'et'. 
 
                  "XLT+S"    "Transmission" case:  correct for one-way
                             light time and stellar aberration using a
                             Newtonian formulation.  This option
                             modifies the position obtained with the
                             "XLT" option to account for the observer's
                             velocity relative to the solar system
                             barycenter. The computed target position
                             indicates the direction that photons
                             emitted from the observer's location must
                             be "aimed" to hit the target.
 
                  "XCN"      "Transmission" case:  converged  
                             Newtonian light time correction. 
 
                  "XCN+S"    "Transmission" case:  converged  
                             Newtonian light time and stellar  
                             aberration corrections. 
 
 
               Neither special nor general relativistic effects are 
               accounted for in the aberration corrections applied 
               by this routine. 
 
               Case and blanks are not significant in the string 
               abcorr. 
 
   obs         is the NAIF ID code for an observing body. 
 
-Detailed_Output
 
   ptarg       is a Cartesian 3-vector representing the position of 
               the target body relative to the specified observer. 
               'ptarg' is corrected for the specified aberrations, and 
               is expressed with respect to the reference frame 
               specified by 'ref'.  The three components of 'ptarg' 
               represent the x-, y- and z-components of the target's 
               position. 
 
               Units are always km. 

               'ptarg' points from the observer's location at 'et' to 
               the aberration-corrected location of the target. 
               Note that the sense of this position vector is 
               independent of the direction of radiation travel 
               implied by the aberration correction. 
 
               Non-inertial frames are treated as follows: letting
               ltcent be the one-way light time between the observer
               and the central body associated with the frame, the
               orientation of the frame is evaluated at et-ltcent,
               et+ltcent, or 'et' depending on whether the requested
               aberration correction is, respectively, for received
               radiation, transmitted radiation, or is omitted. ltcent
               is computed using the method indicated by abcorr.
 
   lt          is the one-way light time between the observer and 
               target in seconds. If the target position is corrected
               for aberrations, then 'lt' is the one-way light time
               between the observer and the light time corrected
               target location.
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If name of target or observer cannot be translated to its 
      NAIF ID code, the error SPICE(IDCODENOTFOUND) is signaled. 
 
   2) If the reference frame 'ref' is not a recognized reference 
      frame the error SPICE(UNKNOWNFRAME) is signaled. 
 
   3) If the loaded kernels provide insufficient data to  
      compute the requested position vector, the deficiency will 
      be diagnosed by a routine in the call tree of this routine. 
 
   4) 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. 
 
-Files
 
   This routine computes positions using SPK files that have been 
   loaded into the SPICE system, normally via the kernel loading 
   interface routine furnsh_c. See the routine furnsh_c and the SPK 
   and KERNEL Required Reading for further information on loading 
   (and unloading) kernels. 
 
   If the output position 'ptarg' is to be expressed relative to a 
   non-inertial frame, or if any of the ephemeris data used to 
   compute 'ptarg' are expressed relative to a non-inertial frame in 
   the SPK files providing those data, additional kernels may be 
   needed to enable the reference frame transformations required to 
   compute the position.  These additional kernels may be C-kernels, PCK 
   files or frame kernels.  Any such kernels must already be loaded 
   at the time this routine is called. 


-Particulars
 
   This routine is part of the user interface to the SPICE ephemeris 
   system.  It allows you to retrieve position information for any 
   ephemeris object relative to any other in a reference frame that 
   is convenient for further computations. 
 
 
   Aberration corrections 
   ====================== 
 
   In space science or engineering applications one frequently 
   wishes to know where to point a remote sensing instrument, such 
   as an optical camera or radio antenna, in order to observe or 
   otherwise receive radiation from a target.  This pointing problem 
   is complicated by the finite speed of light:  one needs to point 
   to where the target appears to be as opposed to where it actually 
   is at the epoch of observation.  We use the adjectives 
   "geometric," "uncorrected," or "true" to refer to an actual 
   position or state of a target at a specified epoch.  When a 
   geometric position or state vector is modified to reflect how it 
   appears to an observer, we describe that vector by any of the 
   terms "apparent," "corrected," "aberration corrected," or "light 
   time and stellar aberration corrected." The SPICE Toolkit can
   correct for two phenomena affecting the apparent location of an
   object:  one-way light time (also called "planetary aberration") and
   stellar aberration.

   One-way light time
   ------------------

   Correcting for one-way light time is done by computing, given an
   observer and observation epoch, where a target was when the observed
   photons departed the target's location.  The vector from the
   observer to this computed target location is called a "light time
   corrected" vector.  The light time correction depends on the motion
   of the target relative to the solar system barycenter, but it is
   independent of the velocity of the observer relative to the solar
   system barycenter. Relativistic effects such as light bending and
   gravitational delay are not accounted for in the light time
   correction performed by this routine.
 
   Stellar aberration
   ------------------

   The velocity of the observer also affects the apparent location 
   of a target:  photons arriving at the observer are subject to a 
   "raindrop effect" whereby their velocity relative to the observer 
   is, using a Newtonian approximation, the photons' velocity 
   relative to the solar system barycenter minus the velocity of the 
   observer relative to the solar system barycenter.  This effect is 
   called "stellar aberration."  Stellar aberration is independent 
   of the velocity of the target.  The stellar aberration formula 
   used by this routine does not include (the much smaller)
   relativistic effects.
 
   Stellar aberration corrections are applied after light time 
   corrections:  the light time corrected target position vector is  
   used as an input to the stellar aberration correction. 
 
   When light time and stellar aberration corrections are both 
   applied to a geometric position vector, the resulting position  
   vector indicates where the target "appears to be" from the 
   observer's location.   
 
   As opposed to computing the apparent position of a target, one 
   may wish to compute the pointing direction required for 
   transmission of photons to the target.  This also requires correction 
   of the geometric target position for the effects of light time 
   and stellar aberration, but in this case the corrections are 
   computed for radiation traveling *from* the observer to the target. 
   We will refer to this situation as the "transmission" case.

   The "transmission" light time correction yields the target's 
   location as it will be when photons emitted from the observer's 
   location at `et' arrive at the target.  The transmission stellar 
   aberration correction is the inverse of the traditional stellar 
   aberration correction:  it indicates the direction in which 
   radiation should be emitted so that, using a Newtonian 
   approximation, the sum of the velocity of the radiation relative 
   to the observer and of the observer's velocity, relative to the  
   solar system barycenter, yields a velocity vector that points in  
   the direction of the light time corrected position of the target. 
  
   One may object to using the term "observer" in the transmission
   case, in which radiation is emitted from the observer's location.
   The terminology was retained for consistency with earlier
   documentation.
 
   Below, we indicate the aberration corrections to use for some 
   common applications: 
 
      1) Find the apparent direction of a target.  This is 
         the most common case for a remote-sensing observation.
 
            Use "LT+S":  apply both light time and stellar  
            aberration corrections. 
 
         Note that using light time corrections alone ("LT") is 
         generally not a good way to obtain an approximation to an 
         apparent target vector:  since light time and stellar 
         aberration corrections often partially cancel each other, 
         it may be more accurate to use no correction at all than to 
         use light time alone. 
 
 
      2) Find the corrected pointing direction to radiate a signal 
         to a target.  This computation is often applicable for 
         implementing communications sessions.
 
            Use "XLT+S":  apply both light time and stellar  
            aberration corrections for transmission. 
 
  
      3) Compute the apparent position of a target body relative 
         to a star or other distant object.
 
            Use "LT" or "LT+S" as needed to match the correction 
            applied to the position of the distant object.  For 
            example, if a star position is obtained from a catalog, 
            the position vector may not be corrected for stellar 
            aberration.  In this case, to find the angular 
            separation of the star and the limb of a planet, the 
            vector from the observer to the planet should be 
            corrected for light time but not stellar aberration. 
 

      4) Obtain an uncorrected position vector derived directly from  
         data in an SPK file.
 
            Use "NONE". 
 

      5) Use a geometric position vector as a low-accuracy estimate 
         of the apparent position for an application where execution  
         speed is critical.
 
            Use "NONE". 
 
 
      6) While this routine cannot perform the relativistic 
         aberration corrections required to compute positions 
         with the highest possible accuracy, it can supply the 
         geometric positions required as inputs to these computations.
 
            Use "NONE", then apply relativistic aberration 
            corrections (not available in the SPICE Toolkit). 
 
 
   Below, we discuss in more detail how the aberration corrections 
   applied by this routine are computed.      
 
      Geometric case 
      ============== 
 
      spkezp_c begins by computing the geometric position T(et) of the 
      target body relative to the solar system barycenter (SSB). 
      Subtracting the geometric position of the observer O(et) gives 
      the geometric position of the target body relative to the 
      observer. The one-way light time, 'lt', is given by 
 
                | T(et) - O(et) | 
         lt = ------------------- 
                        c 
 
      The geometric relationship between the observer, target, and 
      solar system barycenter is as shown: 
 
 
         SSB ---> O(et) 
          |      / 
          |     / 
          |    /                            
          |   /  T(et) - O(et)   
          V  V                                   
         T(et) 
 
 
      The returned position is 
 
         T(et) - O(et) 
 
 
      Reception case 
      ============== 
 
      When any of the options "LT", "CN", "LT+S", "CN+S" is selected
      for `abcorr', spkezp_c computes the position of the target body at
      epoch et-lt, where 'lt' is the one-way light time.  Let T(t) and
      O(t) represent the positions of the target and observer 
      relative to the solar system barycenter at time t; then 'lt' is 
      the solution of the light-time equation 
 
                | T(et-lt) - O(et) | 
         lt = ------------------------                            (1) 
                         c 
 
      The ratio  
 
          | T(et) - O(et) | 
        ---------------------                                     (2) 
                  c 
 
      is used as a first approximation to 'lt'; inserting (2) into the
      right hand side of the light-time equation (1) yields the
      "one-iteration" estimate of the one-way light time ("LT").
      Repeating the process until the estimates of 'lt' converge yields
      the "converged Newtonian" light time estimate ("CN").
      
      Subtracting the geometric position of the observer O(et) gives 
      the position of the target body relative to the observer: 
      T(et-lt) - O(et). 
 
         SSB ---> O(et) 
          | \     | 
          |  \    | 
          |   \   | T(et-lt) - O(et) 
          |    \  | 
          V     V V 
         T(et)  T(et-lt) 
       
      The light time corrected position vector is
 
         T(et-lt) - O(et) 
  
      If correction for stellar aberration is requested, the target 
      position is rotated toward the solar system 
      barycenter-relative velocity vector of the observer.  The 
      rotation is computed as follows: 
 
         Let r be the light time corrected vector from the observer 
         to the object, and v be the velocity of the observer with 
         respect to the solar system barycenter. Let w be the angle 
         between them. The aberration angle phi is given by 
 
            sin(phi) = v sin(w) / c 
 
         Let h be the vector given by the cross product 
 
            h = r X v 
 
         Rotate r by phi radians about h to obtain the apparent 
         position of the object. 
 
 
      Transmission case 
      ================== 
 
      When any of the options "XLT", "XCN", "XLT+S", "XCN+S" is 
      selected, spkezp_c computes the position of the target body T at 
      epoch et+lt, where 'lt' is the one-way light time. 'lt' is the 
      solution of the light-time equation 
 
                | T(et+lt) - O(et) | 
         lt = ------------------------                            (3) 
                          c 
 
      Subtracting the geometric position of the observer, O(et), 
      gives the position of the target body relative to the 
      observer: T(et-lt) - O(et). 
 
                 SSB --> O(et) 
                / |    *  
               /  |  *  T(et+lt) - O(et)   
              /   |*      
             /   *|     
            V  V  V      
        T(et+lt)  T(et)     
 
      The position component of the light-time corrected position  
      is the vector 
 
         T(et+lt) - O(et) 
 
      If correction for stellar aberration is requested, the target 
      position is rotated away from the solar system barycenter- 
      relative velocity vector of the observer. The rotation is 
      computed as in the reception case, but the sign of the 
      rotation angle is negated.  
 
   Precision of light time corrections 
   =================================== 
 
      Corrections using one iteration of the light time solution 
      ---------------------------------------------------------- 
 
      When the requested aberration correction is "LT", "LT+S", 
      "XLT", or "XLT+S", only one iteration is performed in the 
      algorithm used to compute 'lt'. 
 
      The relative error in this computation 
 
         | LT_ACTUAL - LT_COMPUTED |  /  LT_ACTUAL 
 
      is at most  
 
          (V/C)**2 
         ---------- 
          1 - (V/C) 
 
      which is well approximated by (V/C)**2, where V is the 
      velocity of the target relative to an inertial frame and C is 
      the speed of light. 
 
      For nearly all objects in the solar system V is less than 60 
      km/sec.  The value of C is 300000 km/sec.  Thus the one 
      iteration solution for 'lt' has a potential relative error of 
      not more than 4*10**-8.  This is a potential light time error 
      of approximately 2*10**-5 seconds per astronomical unit of 
      distance separating the observer and target.  Given the bound 
      on V cited above: 
 
         As long as the observer and target are 
         separated by less than 50 astronomical units, 
         the error in the light time returned using 
         the one-iteration light time corrections 
         is less than 1 millisecond. 
 
 
      Converged corrections  
      --------------------- 
 
      When the requested aberration correction is "CN", "CN+S", 
      "XCN", or "XCN+S", three iterations are performed in the 
      computation of 'lt'.  The relative error present in this 
      solution is at most 
 
          (V/C)**4 
         ---------- 
          1 - (V/C) 
 
      which is well approximated by (V/C)**4.  Mathematically the 
      precision of this computation is better than a nanosecond for 
      any pair of objects in the solar system. 
 
      However, to model the actual light time between target and 
      observer one must take into account effects due to general 
      relativity.  These may be as high as a few hundredths of a 
      millisecond for some objects. 
 
      When one considers the extra time required to compute the
      converged Newtonian light time (the state of the target relative
      to the solar system barycenter is looked up three times instead
      of once) together with the real gain in accuracy, it seems
      unlikely that you will want to request either the "CN" or "CN+S"
      light time corrections.  However, these corrections can be useful
      for testing situations where high precision (as opposed to
      accuracy) is required.
 
 
   Relativistic Corrections 
   ========================= 
 
   This routine does not attempt to perform either general or 
   special relativistic corrections in computing the various 
   aberration corrections.  For many applications relativistic 
   corrections are not worth the expense of added computation 
   cycles.  If however, your application requires these additional 
   corrections we suggest you consult the astronomical almanac (page 
   B36) for a discussion of how to carry out these corrections.
 
 
-Examples
 
   1)  Load a planetary ephemeris SPK, then look up a series of 
       geometric positions of the moon relative to the earth, 
       referenced to the J2000 frame. 
 
       #include <stdio.h>
       #include "SpiceUsr.h"

       void main()
       {

          #define        ABCORR        "NONE"
          #define        FRAME         "J2000"

          /.
          The name of the SPK file shown here is fictitious;
          you must supply the name of an SPK file available 
          on your own computer system.
          ./
          #define        SPK           "planetary_spk.bsp"

          /.
          ET0 represents the date 2000 Jan 1 12:00:00 TDB.
          ./
          #define        ET0           0.0

          /.
          Use a time step of 1 hour; look up 100 states.
          ./
          #define        STEP          3600.0
          #define        MAXITR        100 

          /.
          The NAIF IDs of the earth and moon are 399 and 301 respectively.
          ./
          #define        OBSERVER      399
          #define        TARGET        301

          /.
          Local variables
          ./
          SpiceInt       i;

          SpiceDouble    et;
          SpiceDouble    lt;
          SpiceDouble    pos [3];


          /.
          Load the spk file.
          ./
          furnsh_c ( SPK );

          /.
          Step through a series of epochs, looking up a position vector
          at each one.
          ./
          for ( i = 0;  i < MAXITR;  i++ )
          {
             et  =  ET0 + i*STEP;

             spkezp_c ( TARGET,    et,   FRAME,  ABCORR,
                        OBSERVER,  pos,  &lt             );

             printf( "\net = %20.10f\n\n",                 et     );
             printf( "J2000 x-position (km):   %20.10f\n", pos[0] );
             printf( "J2000 y-position (km):   %20.10f\n", pos[1] );
             printf( "J2000 z-position (km):   %20.10f\n", pos[2] );
          }
       }


-Restrictions

   None.
 
-Literature_References
 
   SPK Required Reading.
 
-Author_and_Institution
 
   C.H. Acton      (JPL)
   B.V. Semenov    (JPL) 
   N.J. Bachman    (JPL) 
   W.L. Taber      (JPL) 
 
-Version
 
   -CSPICE Version 2.0.5, 04-APR-2008 (NJB)

       Corrected minor error in description of XLT+S aberration
       correction.

   -CSPICE Version 2.0.4, 17-APR-2005 (NJB)

       Error was corrected in example program:  variable name `state'
       was changed to `pos' in printf calls.

   -CSPICE Version 2.0.3, 12-DEC-2004 (NJB)

       Minor header error was corrected.

   -CSPICE Version 2.0.2, 13-OCT-2003 (EDW)

       Various minor header changes were made to improve clarity.
       Added mention that 'lt' returns a value in seconds.

   -CSPICE Version 2.0.1, 29-JUL-2003 (NJB) (CHA)

       Various minor header changes were made to improve clarity. 

   -CSPICE Version 2.0.0, 31-DEC-2001 (NJB)

       Updated to handle aberration corrections for transmission
       of radiation.  Formerly, only the reception case was
       supported.  The header was revised and expanded to explain
       the functionality of this routine in more detail.

   -CSPICE Version 1.0.0, 29-MAY-1999 (NJB) (WLT)

-Index_Entries
 
   get target position relative to an observer 
   get position relative observer corrected for aberrations 
   read ephemeris data 
   read trajectory data 
 
-&
*/

{ /* Begin spkezp_c */


   /*
   Participate in error tracing.
   */
   chkin_c ( "spkezp_c" );


   /*
   Check the input strings to make sure the pointers are non-null 
   and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spkezp_c", ref    );
   CHKFSTR ( CHK_STANDARD, "spkezp_c", abcorr );


   /*
   Call the f2c'd Fortran routine.  Use explicit type casts for every
   type defined by f2c.
   */
   spkezp_ ( ( integer    * )  &targ, 
             ( doublereal * )  &et, 
             ( char       * )  ref, 
             ( char       * )  abcorr, 
             ( integer    * )  &obs,
             ( doublereal * )  ptarg,
             ( doublereal * )  lt,
             ( ftnlen       )  strlen(ref), 
             ( ftnlen       )  strlen(abcorr) );


   chkout_c ( "spkezp_c" );

} /* End spkezp_c */
示例#2
0
文件: spk14b_c.c 项目: Dbelsa/coft
   void spk14b_c (  SpiceInt           handle,
                    ConstSpiceChar   * segid,
                    SpiceInt           body,
                    SpiceInt           center,
                    ConstSpiceChar   * frame,
                    SpiceDouble        first,
                    SpiceDouble        last,
                    SpiceInt           chbdeg  )
/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   handle     I   The handle of an SPK file open for writing. 
   segid      I   The string to use for segment identifier. 
   body       I   The NAIF ID code for the body of the segment. 
   center     I   The center of motion for body. 
   frame      I   The reference frame for this segment. 
   first      I   The first epoch for which the segment is valid. 
   last       I   The last epoch for which the segment is valid. 
   chbdeg     I   The degree of the Chebyshev Polynomial used. 
 
-Detailed_Input
 
   handle         is the file handle of an SPK file that has been 
                  opened for writing. 
 
   segid          is the segment identifier. An SPK segment identifier 
                  may contain up to 40 printing ASCII characters. 
 
   body           is the NAIF ID for the body whose states are 
                  to be recorded in an SPK file. 
 
   center         is the NAIF ID for the center of motion associated 
                  with body. 
 
   frame          is the reference frame that states are referenced to, 
                  for example "J2000". 
 
   first          is the starting epoch, in TDB seconds past J2000, for 
                  the ephemeris data to be placed into the segment. 
 
   last           is the ending epoch, in TDB seconds past J2000, for 
                  the ephemeris data to be placed into the segment. 
 
   chbdeg         is the degree of the Chebyshev Polynomials used to 
                  represent the ephemeris information stored in the 
                  segment. 
 
-Detailed_Output
 
   None.          The input data is used to create the segment summary 
                  for the segment being started in the SPK file 
                  associated with handle. 
 
                  See the Particulars section for details about the 
                  structure of a type 14 SPK segment. 
 
-Parameters
 
   None.
    
-Particulars
 
   This routine begins writing a type 14 SPK segment to the open SPK 
   file that is associated with handle. The file must have been 
   opened with write access. 
 
   This routine is one of a set of three routines for creating and 
   adding data to type 14 SPK segments. These routines are: 
 
      spk14b_c: Begin a type 14 SPK segment. This routine must be 
                called before any data may be added to a type 14 
                segment. 
 
      spk14a_c: Add data to a type 14 SPK segment. This routine may be 
                called any number of times after a call to spk14b_c to 
                add type 14 records to the SPK segment that was 
                started. 
 
      spk14e_c: End a type 14 SPK segment. This routine is called to 
                make the type 14 segment a permanent addition to the 
                SPK file. Once this routine is called, no further type 
                14 records may be added to the segment. A new segment 
                must be started. 
 
   A type 14 SPK segment consists of coefficient sets for fixed order 
   Chebyshev polynomials over consecutive time intervals, where the 
   time intervals need not all be of the same length. The Chebyshev 
   polynomials represent the position, X, Y, and Z coordinates, and 
   the velocities, dX/dt, dY/dt, and dZ/dt, of body relative to 
   center. 
 
   The ephemeris data supplied to the type 14 SPK writer is packed 
   into an array as a sequence of records, 
 
      ----------------------------------------------------- 
      | Record 1 | Record 2 | ... | Record N-1 | Record N | 
      ----------------------------------------------------- 
 
   with each record has the following format. 
 
         ------------------------------------------------ 
         |  The midpoint of the approximation interval  | 
         ------------------------------------------------ 
         |  The radius of the approximation interval    | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the X coordinate  | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the Y coordinate  | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the Z coordinate  | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the X velocity    | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the Y velocity    | 
         ------------------------------------------------ 
         |  chbdeg+1 coefficients for the Z velocity    | 
         ------------------------------------------------ 
 
-Examples
 
   Assume we have the following for each of the examples that 
   follow. 
 
      handle   is the handle of an SPK file opened with write 
               access. 
 
      segid    is a character string of no more than 40 characters 
               which provides a pedigree for the data in the SPK 
               segment we will create. 
 
      body     is the NAIF ID code for the body whose ephemeris 
               is to be placed into the file. 
 
      center   is the center of motion for the ephemeris of body. 
 
      reffrm   is the name of the SPICE reference frame for the 
               ephemeris. 
 
      first    is the starting epoch, in seconds past J2000, for 
               the ephemeris data to be placed into the segment. 
 
      last     is the ending epoch, in seconds past J2000, for 
               the ephemeris data to be placed into the segment. 
 
   Example 1: 
 
      For this example, we also assume that: 
 
         n        is the number of type 14 records that we want to 
                  put into a segment in an SPK file. 
 
         recrds   contains n type 14 records packaged for the SPK 
                  file. 
 
         etstrt   contains the initial epochs for each of the 
                  records contained in RECRDS, where 
 
                     etstrt[i] < etstrt[i+1], i = 0, n-2 
 
                     etstrt[1] <= first, etstrt[n-1] < last 
 
                     etstrt[i+1], i = 0, n-2, is the ending epoch for 
                     record i as well as the initial epoch for record 
                     i+1. 
 
      Then the following code fragment demonstrates how to create a 
      type 14 SPK segment if all of the data for the segment is 
      available at one time. 
 
         #include "SpiceUsr.h"
            .
            .
            .
         
         #define SPK  "example.bsp"
            
         /.
         If the segment is to be appended to an existing file, open
         that file for "append" access.  Otherwise, create a new file.
         ./
         
         if ( exists_c(SPK) )
         {
            spkopa_c ( SPK, &handle );
         } 
         else
         {
            /.
            New files are supplied with an internal file name.  
            Comment area space may be reserved at this time; the
            units are characters.
            ./
            ifname = "Sample type 14 SPK file.";
            ncomch = 1024;
            
            spkopn_c ( SPK, ifname, ncomch, &handle );
         }
          
          
         /.
         Begin the segment. 
         ./
         spk14b_c ( handle, segid, body, center, reffrm, 
                    first,  last,  chbdeg               );
       
         /.
         Add the data to the segment all at once. 
         ./
         spk14a_c ( handle, n, recrds, etstrt ); 
      
         /.
         End the segment, making the segment a permanent addition 
         to the SPK file. 
         ./
         spk14e_c ( handle ); 
         
             .
             .
             .
         /.
         After all segments have been loaded, close the SPK file.
         ./
         spkcls_c ( handle );
         
 
   Example 2: 
 
      In this example we want to add type 14 SPK records, as described
      above in the Particulars section, to the segments being written
      as they are generated.  The ability to write the records in this
      way is useful if computer memory is limited. It may also be
      convenient from a programming perspective to write the records
      one at a time.
 
      For this example, assume that we want to generate n type 14 SPK 
      records, one for each of n time intervals, writing them all to 
      the same segment in the SPK file. Let 
 
         n        be the number of type 14 records that we want to 
                  generate and put into a segment in an SPK file. 
 
         record   be an array with enough room to hold a single type 
                  14 record, i.e. record should have dimension at 
                  least 6 * (chbdeg + 1 ) + 2. 
 
         start    be an array of n times that are the beginning 
                  epochs for each of the intervals of interest. The 
                  times should be in increasing order and the start 
                  time for the first interval should equal the 
                  starting time for the segment. 
 
                     start[i] < start[i+1], i = 0, n-2 
 
                     start[0] = first 
 
         stop     be an array of n times that are the ending epochs 
                  for each of the intervals of interest. The times 
                  should be in increasing order and the stop time for 
                  interval i should equal the start time for interval 
                  i+1, i.e., we want to have continuous coverage in 
                  time across all of the records. Also, the stop time 
                  for the last interval should equal the ending time 
                  for the segment. 
 
                     stop[i]   < stop [i+1], i = 0, n-2 
 
                     stop[i]   = start[i+1], i = 0, n-2 
 
                     stop[n-1] = last 
 

         genrec( time1, time2, record ) 
 
                  be a subroutine that generates a type 14 SPK record 
                  for a time interval specified by time1 and time2. 
 

      Then the following code fragment demonstrates how to create a 
      type 14 SPK segment if all of the data for the segment is not 
      available at one time. 
 
         #include "SpiceUsr.h"
            .
            .
            .
        
         /.
         Begin the segment. 
         ./
         spk14b_c ( handle, segid, body, center, reffrm, 
                    first,  last,  chbdeg                ); 
 
        
         /.
         Generate the records and write them to the segment in the 
         SPK file one at at time. 
         ./   
         
         for ( i = 0;  i < n;  i++ )
         {
            genrec   ( start[i],    stop[i], record  ); 
            spk14a_c ( handle,   1, record,  start+i );
         }
 
         /.
         End the segment, making the segment a permanent addition 
         to the SPK file. 
         ./   
         spk14e_c ( handle );
         
 
-Restrictions
 
   The SPK file must be open with write access. 
 
   Only one segment may be written to a particular SPK file at a 
   time. All of the data for the segment must be written and the 
   segment must be ended before another segment may be started in 
   the file. 
 
-Exceptions
 
   1) If the degree of the Chebyshev Polynomial to be used for this 
      segment is negative, the error SPICE(INVALIDARGUMENT) will 
      be signaled. 
 
   2) Errors in the structure or content of the inputs other than the 
      degree of the Chebyshev Polynomial are diagnosed by routines 
      called by this one. 
 
   3) File access errors are diagnosed by routines in the call tree 
      of this routine. 
 
   4) If either the input frame or segment ID string pointer is null,
      the error SPICE(NULLPOINTER) is signaled.
   
   5) If either the input frame or segment ID string is empty,
      the error SPICE(EMPTYSTRING) is signaled.
   
-Files
 
   See handle in the Detailed_Input section. 
 
-Author_and_Institution
 
   N.J. Bachman        (JPL)
   K.R. Gehringer      (JPL) 
 
-Literature_References
 
   None. 
 
-Version
 
   -CSPICE Version 1.0.1, 30-OCT-2006 (BVS)

      Deleted "inertial" from the FRAME description in the Brief_I/O
      section of the header.

   -CSPICE Version 1.0.0, 29-JUL-1999 (NJB) (KRG)

-Index_Entries
 
   begin writing a type_14 spk segment 
 
-&
*/

{ /* Begin spk14b_c */


   /*
   Participate in error tracing.
   */
   chkin_c ( "spk14b_c" );


   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spk14b_c", frame );
   CHKFSTR ( CHK_STANDARD, "spk14b_c", segid );


   /*
   Call the f2c'd routine.
   */
   spk14b_ (  ( integer     * ) &handle,
              ( char        * ) segid,
              ( integer     * ) &body, 
              ( integer     * ) &center, 
              ( char        * ) frame, 
              ( doublereal  * ) &first, 
              ( doublereal  * ) &last, 
              ( integer     * ) &chbdeg,
              ( ftnlen        ) strlen(segid),
              ( ftnlen        ) strlen(frame)   );
               

   chkout_c ( "spk14b_c" );

} /* End spk14b_c */
示例#3
0
文件: pckcov_c.c 项目: Dbelsa/coft
   void pckcov_c ( ConstSpiceChar   * pck,
                   SpiceInt           idcode,
                   SpiceCell        * cover   ) 
/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   pck        I   Name of PCK file. 
   idcode     I   Class ID code of PCK reference frame. 
   cover     I/O  Window giving coverage in `pck' for `idcode'. 
 
-Detailed_Input
 
   pck            is the name of a binary PCK file.
 
   idcode         is the integer frame class ID code of a PCK reference
                  frame for which data are expected to exist in the
                  specified PCK file.
 
   cover          is an initialized CSPICE window data structure.
                  `cover' optionally may contain coverage data on
                  input; on output, the data already present in `cover'
                  will be combined with coverage found for the
                  reference frame designated by `idcode' in the file
                  `pck'.
 
                  If `cover' contains no data on input, its size and
                  cardinality still must be initialized.
                   
-Detailed_Output
 
   cover          is a CSPICE window data structure which represents
                  the merged coverage for the reference frame having
                  frame class ID `idcode'. This is the set of time
                  intervals for which data for `idcode' are present in
                  the file `pck', merged with the set of time intervals
                  present in `cover' on input.  The merged coverage is
                  represented as the union of one or more disjoint time
                  intervals. The window `cover' contains the pairs of
                  endpoints of these intervals.
 
                  The interval endpoints contained in `cover' are 
                  ephemeris times, expressed as seconds past J2000 
                  TDB. 
 
                  See the Examples section below for a complete 
                  example program showing how to retrieve the 
                  endpoints from `cover'. 
                                     
-Parameters
 
   None. 
 
-Exceptions
 
   1)  If the input file has transfer format, the error  
       SPICE(INVALIDFORMAT) is signaled. 
 
   2)  If the input file is not a transfer file but has architecture 
       other than DAF, the error SPICE(BADARCHTYPE) is signaled. 
 
   3)  If the input file is a binary DAF file of type other than 
       PCK, the error SPICE(BADFILETYPE) is signaled. 
 
   4)  If the PCK file cannot be opened or read, the error will 
       be diagnosed by routines called by this routine. The output 
       window will not be modified. 
 
   5)  If the size of the output window argument COVER is 
       insufficient to contain the actual number of intervals in the 
       coverage window for IDCODE, the error will be diagnosed by 
       routines called by this routine.   
 
   6)  The error SPICE(EMPTYSTRING) is signaled if the input
       string `pck' does not contain at least one character, since the
       input string cannot be converted to a Fortran-style string in
       this case.
      
   7)  The error SPICE(NULLPOINTER) is signaled if the input string
       pointer `pck' is null.

-Files
 
   This routine reads a PCK file. 
 
-Particulars
 
   This routine provides an API via which applications can determine 
   the coverage a specified PCK file provides for a specified 
   PCK class reference frame. 
 
-Examples
 
   1)  This example demonstrates combined usage of pckcov_c and the 
       related PCK utility pckfrm_c. 
 
       Display the coverage for each object in a specified PCK file. 
       Find the set of objects in the file; for each object, find 
       and display the coverage. 
 

          #include <stdio.h>
          #include "SpiceUsr.h"

          int main()
          {
             /.
             Local parameters
             ./
             #define  FILSIZ         256
             #define  MAXIV          1000
             #define  WINSIZ         ( 2 * MAXIV )
             #define  TIMLEN         51
             #define  MAXOBJ         1000

             /.
             Local variables
             ./
             SPICEDOUBLE_CELL        ( cover, WINSIZ );
             SPICEINT_CELL           ( ids,   MAXOBJ );

             SpiceChar               lsk     [ FILSIZ ];
             SpiceChar               pck     [ FILSIZ ];
             SpiceChar               timstr  [ TIMLEN ];

             SpiceDouble             b;
             SpiceDouble             e;

             SpiceInt                i;
             SpiceInt                j;
             SpiceInt                niv;
             SpiceInt                obj;


             /.
             Load a leapseconds kernel for output time conversion.
             PCKCOV itself does not require a leapseconds kernel.
             ./
             prompt_c ( "Name of leapseconds kernel > ", FILSIZ, lsk );
             furnsh_c ( lsk );

             /.
             Get name of PCK file.
             ./
             prompt_c ( "Name of PCK file           > ", FILSIZ, pck    );

             /.
             Find the set of frames in the PCK file. 
             ./
             pckfrm_c ( pck, &ids );

             /.
             We want to display the coverage for each frame. Loop over
             the contents of the ID code set, find the coverage for
             each item in the set, and display the coverage.
             ./
             for ( i = 0;  i < card_c( &ids );  i++  )
             {
                /.
                Find the coverage window for the current frame. 
                Empty the coverage window each time so we don't
                include data for the previous frame.
                ./
                obj  =  SPICE_CELL_ELEM_I( &ids, i );

                scard_c  ( 0,        &cover );
                pckcov_c ( pck, obj, &cover );

                /.
                Get the number of intervals in the coverage window.
                ./
                niv = wncard_c ( &cover );

                /.
                Display a simple banner.
                ./
                printf ( "%s\n", "========================================" );

                printf ( "Coverage for frame %ld\n", obj );

                /.
                Convert the coverage interval start and stop times to TDB
                calendar strings.
                ./
                for ( j = 0;  j < niv;  j++  )
                {
                   /.
                   Get the endpoints of the jth interval.
                   ./
                   wnfetd_c ( &cover, j, &b, &e );

                   /.
                   Convert the endpoints to TDB calendar
                   format time strings and display them.
                   ./
                   timout_c ( b, 
                              "YYYY MON DD HR:MN:SC.### (TDB) ::TDB",  
                              TIMLEN,
                              timstr                                  );

                   printf ( "\n"
                            "Interval:  %ld\n"
                            "Start:     %s\n",
                            j,
                            timstr            );

                   timout_c ( e, 
                              "YYYY MON DD HR:MN:SC.### (TDB) ::TDB",  
                              TIMLEN,
                              timstr                                  );
                   printf ( "Stop:      %s\n", timstr );

                }

             }
             return ( 0 );
          } 
 

   2) Find the coverage for the frame designated by `idcode' 
      provided by the set of PCK files loaded via a metakernel. 
      (The metakernel must also specify a leapseconds kernel.) 
        
         #include <stdio.h>
         #include "SpiceUsr.h"

         int main()
         {

            /.
            Local parameters
            ./
            #define  FILSIZ         256
            #define  LNSIZE         81 
            #define  MAXCOV         100000
            #define  WINSIZ         ( 2 * MAXCOV )
            #define  TIMLEN         51

            /.
            Local variables
            ./
            SPICEDOUBLE_CELL        ( cover, WINSIZ );

            SpiceBoolean            found;

            SpiceChar               file    [ FILSIZ ];
            SpiceChar               idch    [ LNSIZE ];
            SpiceChar               meta    [ FILSIZ ];
            SpiceChar               source  [ FILSIZ ];
            SpiceChar               timstr  [ TIMLEN ];
            SpiceChar               type    [ LNSIZE ];

            SpiceDouble             b;
            SpiceDouble             e;

            SpiceInt                count;
            SpiceInt                handle;
            SpiceInt                i;
            SpiceInt                idcode;
            SpiceInt                niv;


            /.
            Prompt for the metakernel name; load the metakernel.
            The metakernel lists the PCK files whose coverage
            for `idcode' we'd like to determine.  The metakernel
            must also specify a leapseconds kernel.
            ./
            prompt_c ( "Name of metakernel > ", FILSIZ, meta );
            furnsh_c ( meta );

            /.
            Get the ID code of interest. 
            ./
            prompt_c ( "Enter ID code      > ", LNSIZE, idch );
            prsint_c ( idch,  &idcode );

            /.
            Find out how many kernels are loaded.  Loop over the
            kernels:  for each loaded PCK file, add its coverage
            for `idcode', if any, to the coverage window.
            ./
            ktotal_c ( "PCK", &count );

            for ( i = 0;  i < count;  i++  )
            {
               kdata_c  ( i,     "PCK",   FILSIZ,  LNSIZE,   FILSIZ, 
                          file,  type,    source,  &handle,  &found );

               pckcov_c ( file,  idcode,  &cover );
            }

            /.
            Display results. 

            Get the number of intervals in the coverage window.
            ./
            niv = wncard_c ( &cover );

            /.
            Display a simple banner.
            ./
            printf ( "\nCoverage for frame %ld\n", idcode );

            /.
            Convert the coverage interval start and stop times to TDB
            calendar strings.
            ./
            for ( i = 0;  i < niv;  i++  )
            {
               /.
               Get the endpoints of the ith interval.
               ./
               wnfetd_c ( &cover, i, &b, &e );

               /.
               Convert the endpoints to TDB calendar
               format time strings and display them.
               ./
               timout_c ( b, 
                          "YYYY MON DD HR:MN:SC.### (TDB) ::TDB",  
                          TIMLEN,
                          timstr                                  );

               printf ( "\n"
                        "Interval:  %ld\n"
                        "Start:     %s\n",
                        i,
                        timstr            );

               timout_c ( e, 
                          "YYYY MON DD HR:MN:SC.### (TDB) ::TDB",  
                          TIMLEN,
                          timstr                                  );
               printf ( "Stop:      %s\n", timstr );

            }
            return ( 0 );
         }


 
-Restrictions
 
   1) If an error occurs while this routine is updating the window 
      `cover', the window may be corrupted. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
 
-Version
 
   -CSPICE Version 1.0.1, 01-JUL-2014 (NJB)

       Updated index entries.

   -CSPICE Version 1.0.0, 30-NOV-2007 (NJB)

-Index_Entries
 
   get coverage window for binary pck reference frame
   get coverage start and stop time for binary pck frame 

-&
*/

{ /* Begin pckcov_c */


   /*
   Participate in error tracing.
   */
   if ( return_c() )
   {
      return; 
   }
   chkin_c ( "pckcov_c" );


   /*
   Check the input string `pck' to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "pckcov_c", pck );
   
   /*
   Make sure cell data type is d.p. 
   */
   CELLTYPECHK ( CHK_STANDARD, "pckcov_c", SPICE_DP, cover );

   /*
   Initialize the cell if necessary. 
   */
   CELLINIT ( cover );   

   /*
   Call the f2c'd Fortran routine.
   */
   pckcov_ ( ( char       * ) pck,
             ( integer    * ) &idcode,
             ( doublereal * ) (cover->base),
             ( ftnlen       ) strlen(pck)   );

   /*
   Sync the output cell. 
   */
   if ( !failed_c() )
   {
      zzsynccl_c ( F2C, cover );
   }


   chkout_c ( "pckcov_c" );

} /* End pckcov_c */
示例#4
0
void kdata_c ( SpiceInt          which,
               ConstSpiceChar  * kind,
               SpiceInt          fillen,
               SpiceInt          typlen,
               SpiceInt          srclen,
               SpiceChar       * file,
               SpiceChar       * filtyp,
               SpiceChar       * source,
               SpiceInt        * handle,
               SpiceBoolean    * found  )
/*

-Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   which      I   Index of kernel to fetch from the list of kernels.
   kind       I   The kind of kernel to which fetches are limited.
   fillen     I   Available space in output file string.
   typlen     I   Available space in output kernel type string.
   srclen     I   Available space in output source string.
   file       O   The name of the kernel file.
   filtyp     O   The type of the kernel.
   source     O   Name of the source file used to load file.
   handle     O   The handle attached to file.
   found      O   SPICETRUE if the specified file could be located.

-Detailed_Input

   which      is the number of the kernel to fetch (matching the
              type specified by kind) from the list of kernels that
              have been loaded through the entry point furnsh_c but
              that have not been unloaded through the entry point
              unload_c.

              The range of which is 0 to count-1, where count is
              the number of kernels loaded via furnsh_c.  This
              count may be obtained by calling ktotal_c.  See the
              Examples section for an illustrative code fragment.


   kind       is a list of types of kernels to be considered when
              fetching kernels from the list of loaded kernels. KIND
              should consist of a list of words of kernels to
              examine.  Recognized types are

                 SPK  --- All SPK files are counted in the total.
                 CK   --- All CK files are counted in the total.
                 PCK  --- All binary PCK files are counted in the
                          total.
                 EK   --- All EK files are counted in the total.
                 TEXT --- All text kernels that are not meta-text
                          kernels are included in the total.
                 META --- All meta-text kernels are counted in the
                          total.
                 ALL  --- Every type of kernel is counted in the
                          total.

               kind is case insensitive.  If a word appears in kind
               that is not one of those listed above it is ignored.

               See the entry point ktotal_c for examples of the use
               of kind.

   fillen      is the amount of available space in the output file
               string, including room for the terminating null.
               Normally, this is the declared length of the output
               string.

   typlen      is the amount of available space in the output kernel
               type string.

   srclen      is the amount of available space in the output kernel
               source string.


-Detailed_Output


   file        is the name of the file having index which in the
               sequence of files of type kind currently loaded via
               furnsh_c.  file will be blank if there is no such kernel
               is loaded.

   filtyp      is the type of the kernel specified by file.  filtyp
               will be empty if there is no file matching the
               specification of which and kind.

   source      is the name of the source file that was used to
               specify file as one to load.  If file was loaded
               directly via a call to furnsh_c, source will be empty.
               If there is no file matching the specification of
               which and kind, source will be empty.

   handle      is the handle attached to file if it is a binary
               kernel.  If file is a text kernel or meta-text kernel
               handle will be zero.  If there is no file matching
               the specification of which and kind, handle will be
               set to zero.

   found       is returned SPICETRUE if a file matching the
               specification of which and kind exists.  If there is no
               such file, found will be set to SPICEFALSE.

-Parameters

   None.

-Exceptions

   1) If a file is not loaded matching the specification of which
      and kind, found will be SPICEFALSE; file, filtyp, and source
      will be empty and handle will be set to zero.

   2) If any input or output character argument pointer is null, the
      error SPICE(NULLPOINTER) will be signaled.

   3) If any of the output string length arguments are less than 1, the
      error SPICE(STRINGTOOSHORT) will be signaled.

   4) If any output string has length at least 1 but is too short to
      contain the output string, the corresponding is truncated on the
      right.  The output string is still null-terminated.

-Files

   None.

-Particulars

   This entry point allows you to determine which kernels have
   been loaded via furnsh_c and to obtain information sufficient
   to directly query those files.

-Examples

   The following example shows how you could print a summary
   of SPK files that have been loaded through the interface
   furnsh_c.

      #include <stdio.h>
      #include "SpiceUsr.h"

      #define  FILLEN   128
      #define  TYPLEN   32
      #define  SRCLEN   128

      SpiceInt        which;
      SpiceInt        count;
      SpiceInt        handle;

      SpiceChar       file  [FILLEN];
      SpiceChar       filtyp[TYPLEN];
      SpiceChar       source[SRCLEN];

      SpiceBoolean    found;

      int main()
         {
         furnsh_c( "/kernels/standard.tm" );

         ktotal_c ( "spk", &count );

         if ( count == 0 )
            {
            printf ( "No SPK files loaded at this time.\n" );
            }
         else
            {
            printf ( "The loaded SPK files are: \n\n" );
            }

         for ( which = 0;  which < count;  which++ )
            {
            kdata_c ( which,  "spk",    FILLEN,   TYPLEN, SRCLEN,
                      file,   filtyp,  source,  &handle,  &found );
            printf ( "%s\n",  file   );
            }

         }

-Restrictions

   None.

-Literature_References

   None.

-Author_and_Institution

   N.J. Bachman    (JPL)
   W.L. Taber      (JPL)

-Version

   -CSPICE Version 1.1.3, 02-MAY-2008 (EDW)

      standard.ker renamed standard.tm

   -CSPICE Version 1.1.2, 05-SEP-2007 (EDW)

      Expanded Examples section to a full, compilable program.

   -CSPICE Version 1.1.1, 29-DEC-2004 (LSE)

      Corrected example code to match routine's argument list.
      (2 arguments reversed)

   -CSPICE Version 1.1.0, 02-FEB-2003 (EDW)

      Corrected example code to match routine's argument list.

   -CSPICE Version 1.0.0, 12-SEP-1999 (NJB) (WLT)

-Index_Entries

   Retrieve information on loaded SPICE kernels

-&
*/

{   /* Begin kdata_c */


    /*
    Local variables
    */
    logical                 fnd;


    /*
    Participate in error tracing.
    */
    chkin_c ( "kdata_c" );


    /*
    Check the input string kind to make sure the pointer is non-null
    and the string length is non-zero.
    */
    CHKFSTR ( CHK_STANDARD, "kdata_c", kind );


    /*
    Make sure the output string file has at least enough room for one
    output character and a null terminator.  Also check for a null
    pointer.
    */
    CHKOSTR ( CHK_STANDARD, "kdata_c", file, fillen );


    /*
    Make sure the output string filtyp has at least enough room for one
    output character and a null terminator.  Also check for a null
    pointer.
    */
    CHKOSTR ( CHK_STANDARD, "kdata_c", filtyp, typlen );


    /*
    Make sure the output string source has at least enough room for one
    output character and a null terminator.  Also check for a null
    pointer.
    */
    CHKOSTR ( CHK_STANDARD, "kdata_c", source, srclen );


    /*
    Map the input index from C to Fortran style.
    */

    which++;


    /*
    Call the f2c'd routine.
    */
    kdata_ (  ( integer   * ) &which,
              ( char      * ) kind,
              ( char      * ) file,
              ( char      * ) filtyp,
              ( char      * ) source,
              ( integer   * ) handle,
              ( logical   * ) &fnd,
              ( ftnlen      ) strlen(kind),
              ( ftnlen      ) fillen-1,
              ( ftnlen      ) typlen-1,
              ( ftnlen      ) srclen-1     );


    /*
    Convert the output strings from Fortran style to C style.  Set
    the SpiceBoolean output found flag.
    */
    F2C_ConvertStr( fillen, file   );
    F2C_ConvertStr( typlen, filtyp );
    F2C_ConvertStr( srclen, source );

    *found = fnd;


    chkout_c ( "kdata_c" );

} /* End kdata_c */
示例#5
0
文件: spkw02_c.c 项目: haisamido/GMAT
   void spkw02_c ( SpiceInt                handle,
                   SpiceInt                body,
                   SpiceInt                center,
                   ConstSpiceChar        * frame,
                   SpiceDouble             first,
                   SpiceDouble             last,
                   ConstSpiceChar        * segid,
                   SpiceDouble             intlen,
                   SpiceInt                n,
                   SpiceInt                polydg,
                   ConstSpiceDouble        cdata [],
                   SpiceDouble             btime     )

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   Handle of an SPK file open for writing. 
   body       I   Body code for ephemeris object. 
   center     I   Body code for the center of motion of the body. 
   frame      I   The reference frame of the states. 
   first      I   First valid time for which states can be computed. 
   last       I   Last valid time for which states can be computed. 
   segid      I   Segment identifier. 
   intlen     I   Length of time covered by logical record. 
   n          I   Number of coefficient sets. 
   polydg     I   Chebyshev polynomial degree. 
   cdata      I   Array of Chebyshev coefficients. 
   btime      I   Begin time of first logical record. 
 
-Detailed_Input
 
   handle         DAF handle of an SPK file to which a type 2 segment 
                  is to be added.  The SPK file must be open for 
                  writing. 
 
   body           NAIF integer code for an ephemeris object whose 
                  state relative to another body is described by the 
                  segment to be created. 
 
   center         NAIF integer code for the center of motion of the 
                  object identified by body. 
 
   frame          NAIF name for a reference frame relative to which 
                  the state information for body is specified. 
 
   first, 
   last           Start and stop times of the time interval over 
                  which the segment defines the state of body. 
 
   segid          Segment identifier.  An SPK segment identifier may 
                  contain up to 40 characters. 
 
   intlen         Length of time, in seconds, covered by each set of 
                  Chebyshev polynomial coefficients (each logical 
                  record).  Each set of Chebyshev coefficients must 
                  cover this fixed time interval, intlen. 
 
   n              Number of sets of Chebyshev polynomial coefficients 
                  for coordinates (number of logical records) to be 
                  stored in the segment.  There is one set of 
                  Chebyshev coefficients for each time period. 
 
   polydg         Degree of each set of Chebyshev polynomials, i.e. 
                  the number of Chebyshev coefficients per coordinate 
                  minus one. 
 
   cdata          Array containing all the sets of Chebyshev 
                  polynomial coefficients to be placed in the 
                  segment of the SPK file.  The coefficients are 
                  stored in cdata in order as follows: 
 
                     the (degree + 1) coefficients for the first 
                     coordinate of the first logical record 
 
                     the coefficients for the second coordinate 
 
                     the coefficients for the third coordinate 
 
                     the coefficients for the first coordinate for 
                     the second logical record, ... 
 
                     and so on. 
 
 
   btime          Begin time (seconds past J2000 TDB) of first set 
                  of Chebyshev polynomial coefficients (first 
                  logical record).  first is an appropriate value 
                  for btime. 
 
-Detailed_Output
 
   None. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If the number of sets of coefficients is not positive 
      SPICE(NUMCOEFFSNOTPOS) is signalled. 
 
   2) If the interval length is not positive, SPICE(INTLENNOTPOS) 
      is signalled. 
 
   3) If the integer code for the reference frame is not recognized, 
      SPICE(INVALIDREFFRAME) is signalled. 
 
   4) If segment stop time is not greater then the begin time, 
       SPICE(BADDESCRTIMES) is signalled. 
 
   5) If the start time of the first record is not less than 
      or equal to the descriptor begin time, SPICE(BADDESCRTIMES) 
      is signalled. 
 
   6) If the end time of the last record is not greater than 
      or equal to the descriptor end time, SPICE(BADDESCRTIMES) is 
      signalled. 
 
   7) The error SPICE(EMPTYSTRING) is signaled if either input
      string does not contain at least one character, since the
      input strings cannot be converted to a Fortran-style string
      in this case.
      
   8) The error SPICE(NULLPOINTER) is signaled if either input string
      pointer is null.

-Files
 
   A new type 2 SPK segment is written to the SPK file attached 
   to handle. 
 
-Particulars
 
   This routine writes an SPK type 2 data segment to the designated 
   SPK file, according to the format described in the SPK Required 
   Reading. 
 
   Each segment can contain data for only one target, central body, 
   and reference frame.  The Chebyshev polynomial degree and length 
   of time covered by each logical record are also fixed.  However, 
   an arbitrary number of logical records of Chebyshev polynomial 
   coefficients can be written in each segment.  Minimizing the 
   number of segments in an SPK file will help optimize how the SPICE 
   system accesses the file. 
 
-Examples
 
   Suppose that you have sets of Chebyshev polynomial coefficients 
   in an array CDATA pertaining to the position of the moon (NAIF ID 
   = 301), relative to the Earth-moon barycenter (NAIF ID = 3), in 
   the J2000 reference frame, and want to put these into a type 2 
   segment in an existing SPK file.  The following code could be used 
   to add one new type 2 segment.  To add multiple segments, put the 
   call to spkw02_c in a loop. 
 
      #include "SpiceUsr.h"
           .
           .
           .
           
      /.
      First open the SPK file and get a handle for it. 
      ./
      spkopa_c ( spknam, &handle ); 

      /.
      Create a segment identifier. 
      ./
      segid = "MY_SAMPLE_SPK_TYPE_2_SEGMENT";

      /.
      Write the segment. 
      ./
      spkw02_c ( handle, 301,    3,      "J2000", 
                 first,  last,   segid,  intlen, 
                 n,      polydg, cdata,  btime   ); 

      /.
      Close the file. 
      ./
      spkcls_c ( handle );
      
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL)
   K.S. Zukor     (JPL) 
 
-Version
 
   -CSPICE Version 1.0.0, 21-JUL-1999 (NJB) (KSZ)

-Index_Entries
 
   write spk type_2 data segment 
 
-&
*/

{ /* Begin spkw02_c */

   /*
   Participate in error tracing.
   */
   chkin_c ( "spkw02_c" );

 
   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spkw02_c", frame );
   CHKFSTR ( CHK_STANDARD, "spkw02_c", segid );
 

   /*
   Write the segment. 
   */
   
   spkw02_ ( ( integer    * ) &handle,
             ( integer    * ) &body,
             ( integer    * ) &center,
             ( char       * ) frame,
             ( doublereal * ) &first,
             ( doublereal * ) &last,
             ( char       * ) segid,
             ( doublereal * ) &intlen,
             ( integer    * ) &n,
             ( integer    * ) &polydg,
             ( doublereal * ) cdata,
             ( doublereal * ) &btime,
             ( ftnlen       ) strlen(frame),
             ( ftnlen       ) strlen(segid)  );


   chkout_c ( "spkw02_c" );

} /* End spkw02_c */
示例#6
0
   void dtpool_c ( ConstSpiceChar   * name,
                   SpiceBoolean     * found,
                   SpiceInt         * n,
                   SpiceChar          type [1] ) 

/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   name       I   Name of the variable whose value is to be returned. 
   found      O   True if variable is in pool. 
   n          O   Number of values returned for name. 
   type       O   Type of the variable:  'C', 'N', or 'X' 
 
-Detailed_Input
 
   name       is the name of the variable whose values are to be 
              returned. 
  
-Detailed_Output
 
 
   found      is SPICETRUE if the variable is in the pool;
              SPICEFALSE if it is not. 
 
   n          is the number of values associated with name. 
              If name is not present in the pool n will be returned 
              with the value 0. 
 
   type       is a single character indicating the type of the variable
              associated with name. 
 
                  'C' if the data is character data 
                  'N' if the data is numeric. 
                  'X' if there is no variable name in the pool. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If the name requested is not in the kernel pool, found 
      will be set to SPICEFALSE, n to zero and type to 'X'. 
 
   2) If the input string pointer is null, the error SPICE(NULLPOINTER) 
      will be signaled.
      
   3) If the input string has length zero, the error SPICE(EMPTYSTRING) 
      will be signaled.
      
 
-Files
 
   None. 
 
-Particulars
 
   This routine allows you to determine whether or not a kernel 
   pool variable is present and to determine its size and type 
   if it is. 
 
 
-Examples
 
 
   The following code fragment demonstrates how to determine the 
   properties of a stored kernel variable. 
 
      #include <stdio.h>
      #include "SpiceUsr.h"
            .
            .
            .
      dtpool_c ( varnam, &found, &n, &type );
 
      if ( found ) 
      {
         printf ( "\n"
                  "Properties of variable %s:\n"
                  "\n"
                  "   Size: %d\n",
                  varnam,
                  n                           );
         
         if ( type == 'C' )
         {
            printf ( "   Type:  Character\n" );
         }
         else
         {
            printf ( "   Type:  Numeric\n" );
         }
      }
      
      else
      { 
         printf ( "%s is not present in the kernel pool.\n", varnam );
      } 
 
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   W.L. Taber  (JPL) 
 
-Version
 
   -CSPICE Version 1.1.0, 17-OCT-1999 (NJB)  
   
      Local type logical variable now used for found flag used in
      interface of dtpool_.
            
   -CSPICE Version 1.0.0, 10-MAR-1999 (NJB)

-Index_Entries
 
   return summary information about a kernel pool variable
 
-&
*/

{ /* Begin dtpool_c */

   /*
   Local variables
   */
   logical                 fnd;
   
   
   /*
   Participate in error tracing.
   */
   chkin_c ( "dtpool_c" );


   /*
   Check the input string name to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "dtpool_c", name );


   /*
   Call the f2c'd routine.
   */
   dtpool_ ( ( char     * ) name,
             ( logical  * ) &fnd,
             ( integer  * ) n,
             ( char     * ) type,
             ( ftnlen     ) strlen(name), 
             ( ftnlen     ) 1             );
   
   /*
   Assign the SpiceBoolean found flag.
   */
   
   *found = fnd;
   
   
   chkout_c ( "dtpool_c" );

} /* End dtpool_c */
示例#7
0
   void prsdp_c ( ConstSpiceChar     * string,
                  SpiceDouble        * dpval  )

/*

-Brief_I/O

   Variable  I/O  Description
   --------  ---  --------------------------------------------------
   string     I   String representing a d.p. number.
   dpval      O   D.p. value obtained by parsing string.

-Detailed_Input

   string         is a string representing a double precision
                  number.  Any string acceptable to the CSPICE
                  routine nparsd.c is allowed.

-Detailed_Output

   dpval          is the double precision number obtained by parsing
                  string.

-Parameters

   None.

-Exceptions

 
   1) If the input string pointer is null, the error 
      SPICE(NULLPOINTER) will be signaled.
       
   2) If the input string does not contain at least one character, 
      the error SPICE(EMPTYSTRING) will be signaled.

   3) If the input string cannot be parsed, the error
      SPICE(NOTADPNUMBER) is signalled.

-Files

   None.

-Particulars

   The purpose of this routine is to enable safe parsing of double
   precision numbers without the necessity of in-line error checking.
   This routine is based on the CSPICE routine nparsd.c.

-Examples

   See the routine NPARSD for an examples of allowed strings.

-Restrictions

   None.

-Literature_References

   None.

-Author_and_Institution

   N.J. Bachman       (JPL)

-Version

   -CSPICE Version 1.1.2, 26-AUG-1999 (NJB)  
   
      Header was updated to list string exceptions.
   
   -CSPICE Version 1.1.1, 25-MAR-1998 (EDW)
     
      Minor corrections to header.

   -CSPICE Version 1.1.0, 08-FEB-1998 (NJB)

      References to C2F_CreateStr_Sig were removed; code was
      cleaned up accordingly.  String checks are now done using
      the macro CHKFSTR.

   -CSPICE Version 1.0.0, 25-OCT-1997

      Based on SPICELIB Version 1.0.0, 22-JUL-1997 (NJB)

-Index_Entries

   parse d.p. number with encapsulated error handling

-&
*/

{ /* Begin prsdp_c */

   /*
   Participate in error handling.
   */
   chkin_c ( "prsdp_c");


   /*
   Check the input string to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "prsdp_c", string );


   prsdp_ ( ( char         * ) string,
            ( doublereal   * ) dpval,
            ( ftnlen         ) strlen(string)  );


   chkout_c ( "prsdp_c");

} /* End prsdp_c */
示例#8
0
   void gfsubc_c ( ConstSpiceChar     * target,
                   ConstSpiceChar     * fixref,
                   ConstSpiceChar     * method,
                   ConstSpiceChar     * abcorr,
                   ConstSpiceChar     * obsrvr,
                   ConstSpiceChar     * crdsys,
                   ConstSpiceChar     * coord,
                   ConstSpiceChar     * relate,
                   SpiceDouble          refval,
                   SpiceDouble          adjust,
                   SpiceDouble          step,
                   SpiceInt             nintvls,
                   SpiceCell          * cnfine,
                   SpiceCell          * result  )

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  --------------------------------------------------
   SPICE_GF_CNVTOL     
              P   Convergence tolerance. 
   target     I   Name of the target body
   fixref     I   Body fixed frame associated with 'target'
   method     I   Name of method type for subpoint calculation
   abcorr     I   Aberration correction flag
   obsrvr     I   Name of the observing body
   crdsys     I   Name of the coordinate system containing 'coord'
   coord      I   Name of the coordinate of interest
   relate     I   Operator that either looks for an extreme value
                  (max, min, local, absolute) or compares the
                  coordinate value and refval
   refval     I   Reference value
   adjust     I   Adjustment value for absolute extrema searches
   step       I   Step size used for locating extrema and roots
   nintvls    I   Workspace window interval count
   cnfine    I-O  SPICE window to which the search is restricted
   result     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.

              The target and observer define a position vector
              that points from the observer to the target.

   fixref     the string name of the body-fixed, body-centered
              reference frame associated with the target body target.

              The SPICE frame subsystem must recognize the 'fixref' name.

   method     the string name of the method to use for the subpoint
              calculation. The accepted values for method:

                 'Near point: ellipsoid'   The sub-observer point
                                           computation uses a
                                           triaxial ellipsoid to
                                           model the surface of the
                                           target body. The
                                           sub-observer point is
                                           defined as the nearest
                                           point on the target
                                           relative to the
                                           observer. 

                 'Intercept: ellipsoid'    The sub-observer point
                                           computation uses a
                                           triaxial ellipsoid to
                                           model the surface of the
                                           target body. The
                                           sub-observer point is
                                           defined as the target
                                           surface intercept of the
                                           line containing the
                                           observer and the
                                           target's center.

              The method string lacks sensitivity to case, embedded, leading 
              and trailing blanks.

   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 the same aberration corrections as does 
              the SPICE routine SPKEZR. See the header of SPKEZR for a
              detailed description of the aberration correction options.
              For convenience, the options are listed below:

                  'NONE'     Apply no correction.   

                  '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.

                  'XLT'      "Transmission" case:  correct for
                             one-way light time using a Newtonian
                             formulation.

                  'XLT+S'    "Transmission" case:  correct for
                             one-way light time and stellar
                             aberration using a Newtonian
                             formulation.

                  'XCN'      "Transmission" case:  converged
                             Newtonian light time correction.

                  'XCN+S'    "Transmission" case:  converged
                             Newtonian light time and stellar
                             aberration corrections.

              The abcorr string lacks sensitivity to case, and to embedded, 
              leading and trailing blanks.

     obsrvr   the string naming the observing body. Optionally, you
              may supply the ID code of the object as an integer
              string. For example, both 'EARTH' and '399' are
              legitimate strings to supply to indicate the
              observer is Earth.

     crdsys   the string name of the coordinate system for which the
              coordinate of interest is a member.

     coord    the string name of the coordinate of interest in crdsys.
                            
              The supported coordinate systems and coordinate names are:

              The supported coordinate systems and coordinate names are:

              Coordinate System (CRDSYS)    Coordinates (COORD)      Range

                 'RECTANGULAR'                  'X'
                                                'Y'
                                                'Z'

                 'LATITUDINAL'                  'RADIUS'
                                                'LONGITUDE'        (-Pi,Pi]
                                                'LATITUDE'         [-Pi/2,Pi/2]

                 'RA/DEC'                       'RANGE'
                                                'RIGHT ASCENSION'  [0,2Pi)
                                                'DECLINATION'      [-Pi/2,Pi/2]

                 'SPHERICAL'                    'RADIUS'
                                                'COLATITUDE'       [0,Pi]
                                                'LONGITUDE'        (-Pi,Pi]

                 'CYLINDRICAL'                  'RADIUS'
                                                'LONGITUDE'        [0,2Pi)
                                                'Z'

                 'GEODETIC'                     'LONGITUDE'        (-Pi,Pi]
                                                'LATITUDE'         [-Pi/2,Pi/2]
                                                'ALTITUDE' 

                 'PLANETOGRAPHIC'               'LONGITUDE'        [0,2Pi)
                                                'LATITUDE'         [-Pi/2,Pi/2]
                                                'ALTITUDE'

                  The ALTITUDE coordinates have a constant value
                  of zero +/- roundoff for ellipsoid targets.

                  Limit searches for coordinate events in the GEODETIC and 
                  PLANETOGRAPHIC coordinate systems to TARGET bodies with
                  axial symmetry in the equatorial plane, i.e. equality
                  of the body X and Y radii (oblate or prolate spheroids).

     relate    the string or character describing the relational operator 
               used to define a constraint on the selected coordinate of the 
               subpoint 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:

                  '>'      Separation is greater than the reference
                           value refval.

                  '='      Separation is equal to the reference
                           value refval.

                  '<'      Separation is less than the reference
                           value refval.

                 'ABSMAX'  Separation is at an absolute maximum.

                 'ABSMIN'  Separation is at an absolute  minimum.

                 'LOCMAX'  Separation is at a local maximum.

                 'LOCMIN'  Separation 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.

              The relate string lacks sensitivity to case, leading 
              and trailing blanks.

   refval     the double precision reference value used together with
              relate argument to define an equality or inequality to
              satisfy by the selected coordinate of the subpoint
              vector. See the discussion of relate above for
              further information.

              The units of refval correspond to the type as defined
              by coord, radians for angular measures, kilometers for
              distance measures.

   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, gfsubc_c finds times 
              when the position vector coordinate is within adjust 
              radians/kilometers of the specified extreme value.

              For 'relate' set to ABSMAX, the result window contains
              time intervals when the position vector coordinate has
              values between ABSMAX - adjust and ABSMAX.

              For 'relate' set to ABSMIN, the result window contains
              time intervals when the position vector coordinate 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 coordinate function
              of the subpoint vector 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.

              step has units of TDB seconds. 

   nintvls    an integer value specifying the number of intervals in the 
              the internal workspace array used by this routine. 'nintvls'
              should be at least as large as the number of intervals
              within the search region on which the specified observer-target
              vector coordinate function is monotone increasing or decreasing. 
              It does no harm to pick a value of 'nintvls' larger than the
              minimum required to execute the specified search, but if chosen 
              too small, the search will fail.

   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.
               
-Detailed_Output

   cnfine     is the input confinement window, updated if necessary
              so the control area of its data array indicates the
              window's size and cardinality. The window data are
              unchanged.

   result     the SPICE window of intervals, contained within the
              confinement window cnfine, on which the specified
              constraint is satisfied.
 
              If result is non-empty on input, its contents
              will be discarded before gfsubc_c conducts its
              search.
              
              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 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 be returned with a
              cardinality of zero.

-Parameters
 
   SPICE_GF_CNVTOL     

              is the convergence tolerance used for finding endpoints
              of the intervals comprising the result window.
              SPICE_GF_CNVTOL is used to determine when binary searches
              for roots should terminate: when a root is bracketed
              within an interval of length SPICE_GF_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.
 
              SPICE_GF_CNVTOL has the value 1.0e-6. Units are TDB
              seconds.

-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, an error is signaled 
       by a routine in the call tree of this routine. 
 
   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_c can be used to contract the result window. 
 
   3)  If an error (typically cell overflow) occurs while performing  
       window arithmetic, the error will be diagnosed by a routine 
       in the call tree of this routine. 
 
   4)  If the relational operator `relate' is not recognized, an  
       error is signaled by a routine in the call tree of this 
       routine. 
 
   5)   If the aberration correction specifier contains an
        unrecognized value, an error is signaled by a routine in the
        call tree of this routine.
 
   6)  If `adjust' is negative, an error is signaled by a routine in 
       the call tree of this routine. 
 
   7)  If either of the input body names do not map to NAIF ID 
       codes, an error is signaled by a routine in the call tree of 
       this routine. 
 
   8)  If required ephemerides or other kernel data are not 
       available, an error is signaled by a routine in the call tree 
       of this routine. 
 
   9)  If any input string argument pointer is null, the error
       SPICE(NULLPOINTER) will be signaled.

   10) If any input string argument is empty, the error 
       SPICE(EMPTYSTRING) will be signaled.

   11) If the workspace interval count 'nintvls' is less than 1, the
       error SPICE(VALUEOUTOFRANGE) will be signaled.

   12) If the required amount of workspace memory cannot be
       allocated, the error SPICE(MALLOCFAILURE) will be
       signaled.
              
-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.

      - PCK data: bodies modeled as triaxial ellipsoids must have
        semi-axis lengths provided by variables in the kernel pool.
        Typically these data are made available by loading a text
        PCK file using FURNSH.

      - If non-inertial reference frames are used, then PCK
        files, frame kernels, C-kernels, and SCLK kernels may be
        needed.

   Such kernel data are normally loaded once per program
   run, NOT every time this routine is called. 

-Particulars


   This routine provides a simpler, but less flexible interface
   than does the routine gfevnt_c for conducting searches for
   subpoint position vector coordinate value events. 
   Applications that require support for progress reporting, interrupt 
   handling, non-default step or refinement functions, or non-default 
   convergence tolerance should call gfevnt_c rather than this routine.

   This routine determines a set of one or more time intervals
   within the confinement window when the selected coordinate of 
   the subpoint position vector satisfies a caller-specified
   constraint. The resulting set of intervals is returned as a SPICE
   window.

   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 specified
   coordinate 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 coordinate
   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 coordinate 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 coordinate 
   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 coordinate 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 target 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 distance 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 convergence tolerance used by this
   routine is set by the parameter SPICE_GF_CNVTOL.

   The value of SPICE_GF_CNVTOL is set to a "tight" value in the f2c'd 
   routine 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 gfevnt_c must be called. Making the tolerance tighter than
   SPICE_GF_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.

   Practical use of the coordinate search capability would likely
   consist of searches over multiple coordinate constraints to find
   time intervals that satisfies the constraints. An effective 
   technique to accomplish such a search is to use the result
   window from one search as the confinement window of the next.

   Longitude and Right Ascension
   =============================

   The cyclic nature of the longitude and right ascension coordinates
   produces branch cuts at +/- 180 degrees longitude and 0-360
   longitude. Round-off error may cause solutions near these branches
   to cross the branch. Use of the SPICE routine wncond_c will contract
   solution windows by some epsilon, reducing the measure of the
   windows and eliminating the branch crossing. A one millisecond
   contraction will in most cases eliminate numerical round-off caused
   branch crossings.

-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.

   The example shown below requires a "standard" set of SPICE
   kernels. We list these kernels in a meta kernel named 'standard.tm'.
   
      KPL/MK

            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
               ---------                     --------
               de414.bsp                     Planetary ephemeris
               pck00008.tpc                  Planet orientation and
                                             radii
               naif0008.tls                  Leapseconds
   

      \begindata

      KERNELS_TO_LOAD = ( '/kernels/gen/lsk/naif0008.tls'
                          '/kernels/gen/spk/de414.bsp'
                          '/kernels/gen/pck/pck00008.tpc' 
                        )


      Example:

      Find the time during 2007 for which the subpoint position vector
      of the sun on earth in the IAU_EARTH frame lies within a geodetic
      latitude-longitude "box" defined as

         16 degrees <= latitude  <= 17 degrees
         85 degrees <= longitude <= 86 degrees

      This problem requires four searches, each search on one of the
      box restrictions. The user needs also realize the temporal 
      behavior of latitude greatly differs from that of the longitude. The
      sub-observer point latitude varies between approximately 23.44 degrees
      and -23.44 degrees during the year. The sub-observer point longitude 
      varies between -180 degrees and 180 degrees in one day.

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      #include "SpiceUsr.h"

      #define   MAXWIN   100
      #define   TIMFMT   "YYYY-MON-DD HR:MN:SC.###### (TDB) ::TDB ::RND"
      #define   STRLEN   64

      int main( int argc, char **argv )
         {

         /.
         Create the needed windows. Note, one window
         consists of two values, so the total number
         of cell values to allocate equals twice
         the number of intervals.
         ./
         SPICEDOUBLE_CELL ( result1, 2*MAXWIN );
         SPICEDOUBLE_CELL ( result2, 2*MAXWIN );
         SPICEDOUBLE_CELL ( result3, 2*MAXWIN );
         SPICEDOUBLE_CELL ( result4, 2*MAXWIN );
         SPICEDOUBLE_CELL ( cnfine, 2       );

         SpiceDouble       begtim;
         SpiceDouble       endtim;
         SpiceDouble       step;
         SpiceDouble       adjust;
         SpiceDouble       refval;
         SpiceDouble       beg;
         SpiceDouble       end;

         SpiceChar         begstr [ STRLEN ];
         SpiceChar         endstr [ STRLEN ];
         SpiceChar       * target = "EARTH";
         SpiceChar       * obsrvr = "SUN";
         SpiceChar       * fixref = "IAU_EARTH";
         SpiceChar       * method = "Near point: ellipsoid";
         SpiceChar       * crdsys = "GEODETIC";
         SpiceChar       * abcorr = "NONE";
   
         SpiceInt          count;
         SpiceInt          i;

         /.  
         Load kernels.
         ./
         furnsh_c( "standard.tm" );
   
         /.  
         Store the time bounds of our search interval in
         the cnfine confinement window.
         ./
         str2et_c( "2007 JAN 01", &begtim );
         str2et_c( "2008 JAN 01", &endtim );
   
         wninsd_c ( begtim, endtim, &cnfine );
      
         /.
         Perform four searches to determine the times when the 
         latitude-longitude box restriction conditions apply to 
         the subpoint vector.
      
         Perform the searches such that the result window of a search
         serves as the confinement window of the subsequent search.
   
         Since the latitude coordinate varies slowly and is well behaved 
         over the time of the confinement window, search first for the
         windows satisfying the latitude requirements, then use that result
         as confinement for the longitude search.
         ./
      
         /.  
         The latitude varies relatively slowly, ~46 degrees during the 
         year. The extrema occur approximately every six months.
         Search using a step size less than half that value (180 days).
         For this example use ninety days (in units of seconds).
         ./

         step   = (90.)*spd_c();
         adjust = 0.;
      
         {
         SpiceChar       * coord  = "LATITUDE";
         SpiceChar       * relate = ">";

         refval = 16. *rpd_c();

         gfsubc_c (  target,  fixref,
                     method,  abcorr, obsrvr,
                     crdsys,  coord,
                     relate,  refval,
                     adjust,  step, 
                     MAXWIN,
                     &cnfine, &result1 );
         }


         {
         SpiceChar       * coord  = "LATITUDE";
         SpiceChar       * relate = "<";

         refval = 17. *rpd_c();

         gfsubc_c (  target,  fixref,
                     method,  abcorr, obsrvr,
                     crdsys,  coord,
                     relate,  refval,
                     adjust,  step, 
                     MAXWIN,
                     &result1, &result2 );
         }


         /.
         Now the longitude search.
         ./

         /.
         Reset the stepsize to something appropriate for the 360
         degrees in 24 hours domain. The longitude shows near
         linear behavior so use a stepsize less than half the period
         of twelve hours. Ten hours will suffice in this case.
         ./
         step   = (10./24.)*spd_c();
      
         {
         SpiceChar       * coord  = "LONGITUDE";
         SpiceChar       * relate = ">";

         refval = 85. *rpd_c();

         gfsubc_c (  target,  fixref,
                     method,  abcorr, obsrvr,
                     crdsys,  coord,
                     relate,  refval,
                     adjust,  step, 
                     MAXWIN,
                     &result2, &result3 );

         /.
         Contract the endpoints of each window to account
         for possible round-off error at the -180/180 degree branch.
 
         A contraction value of a millisecond should eliminate
         any round-off caused branch crossing.
         ./
 
         wncond_c( 1e-3, 1e-3, &result3 );
         }


         {
         SpiceChar       * coord  = "LONGITUDE";
         SpiceChar       * relate = "<";

         refval = 86. *rpd_c();

         gfsubc_c (  target,  fixref,
                     method,  abcorr, obsrvr,
                     crdsys,  coord,
                     relate,  refval,
                     adjust,  step, 
                     MAXWIN,
                     &result3, &result4 );
         }


         /.  
         List the beginning and ending points in each interval
         if result contains data.
         ./
         count = wncard_c( &result4 );

         /.
         Display the results.
         ./
         if (count == 0 ) 
            {
            printf ( "Result window is empty.\n\n" );
            }
         else
            {
            for ( i = 0;  i < count;  i++ )
               {

               /.
               Fetch the endpoints of the Ith interval
               of the result window.
               ./
               wnfetd_c ( &result4, i, &beg, &end );

               timout_c ( beg, TIMFMT, STRLEN, begstr ); 
               timout_c ( end, TIMFMT, STRLEN, endstr );

               printf ( "Interval %d\n", i + 1);
               printf ( "Beginning TDB %s \n",   begstr );
               printf ( "Ending TDB    %s \n\n", endstr );

               }
            }
            
         kclear_c();
         return( 0 );
         }
   
      The program outputs:

         Interval 1
         Beginning TDB 2007-MAY-05 06:14:04.637735 (TDB) 
         Ending TDB    2007-MAY-05 06:18:04.621908 (TDB) 

         Interval 2
         Beginning TDB 2007-MAY-06 06:13:59.583483 (TDB) 
         Ending TDB    2007-MAY-06 06:17:59.569239 (TDB) 

         Interval 3
         Beginning TDB 2007-MAY-07 06:13:55.102939 (TDB) 
         Ending TDB    2007-MAY-07 06:17:55.090299 (TDB) 

         Interval 4
         Beginning TDB 2007-MAY-08 06:13:51.202604 (TDB) 
         Ending TDB    2007-MAY-08 06:17:51.191583 (TDB) 

         Interval 5
         Beginning TDB 2007-AUG-06 06:23:17.282927 (TDB) 
         Ending TDB    2007-AUG-06 06:27:17.264009 (TDB) 

         Interval 6
         Beginning TDB 2007-AUG-07 06:23:10.545441 (TDB) 
         Ending TDB    2007-AUG-07 06:27:10.524926 (TDB) 

         Interval 7
         Beginning TDB 2007-AUG-08 06:23:03.233996 (TDB) 
         Ending TDB    2007-AUG-08 06:27:03.211889 (TDB) 

-Restrictions
 
   1) The kernel files to be used by this routine must be loaded 
      (normally via the CSPICE routine furnsh_c) before this routine 
      is called. 
 
   2) This routine has the side effect of re-initializing the
      coordinate quantity utility package.  Callers may 
      need to re-initialize the package after calling this routine.
 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
   E.D. Wright    (JPL) 
 
-Version

   -CSPICE Version 1.0.1, 26-AUG-2009, EDW (JPL)

      Edit to Example description, replaced "intercept" with
      "sub-observer point."
      
      Correction of several typos.
      
   -CSPICE Version 1.0.0, 10-FEB-2009 (NJB) (EDW)

-Index_Entries

   GF subpoint coordinate search

-&
*/

   { /* Begin gfsubc_c */

   /*
   Local variables 
   */   
   doublereal            * work;

   SpiceInt                nBytes;
   
   static SpiceInt         nw = SPICE_GF_NWMAX;


   
   /*
   Participate in error tracing.
   */
   if ( return_c() )
      {
      return;
      }
   chkin_c ( "gfsubc_c" );


   /*
   Make sure cell data types are d.p. 
   */
   CELLTYPECHK2 ( CHK_STANDARD, "gfsubc_c", SPICE_DP, cnfine, result );
   
   /* 
   Initialize the input cells if necessary. 
   */
   CELLINIT2 ( cnfine, result );

   /*
   Check the input strings to make sure each pointer is non-null 
   and each string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", target );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", fixref );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", method );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", abcorr );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", obsrvr );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", crdsys );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", coord  );
   CHKFSTR ( CHK_STANDARD, "gfsubc_c", relate );

   /*
   Check the workspace size; some mallocs have a violent
   dislike for negative allocation amounts. To be safe,
   rule out a count of zero intervals as well.
   */

   if ( nintvls < 1 )
      {
      setmsg_c ( "The specified workspace interval count # was "
                 "less than the minimum allowed value of one (1)." );
      errint_c ( "#",  nintvls                              );
      sigerr_c ( "SPICE(VALUEOUTOFRANGE)"                   );
      chkout_c ( "gfposc_c"                                 );
      return;
      } 

   /*
   Allocate the workspace. 'nintvls' indicates the maximum number of
   intervals returned in 'result'. An interval consists of
   two values.
   */

   nintvls = 2 * nintvls;
   
   nBytes = ( nintvls + SPICE_CELL_CTRLSZ ) * nw * sizeof(SpiceDouble);

   work   = (doublereal *) alloc_SpiceMemory( nBytes );

   if ( !work ) 
      {
      setmsg_c ( "Workspace allocation of # bytes failed due to "
                 "malloc failure"                               );
      errint_c ( "#",  nBytes                                   );
      sigerr_c ( "SPICE(MALLOCFAILED)"                          );
      chkout_c ( "gfsubc_c"                                     );
      return;
      }


   /*
   Let the f2'd routine do the work.
   */

   gfsubc_ ( ( char          * ) target, 
             ( char          * ) fixref, 
             ( char          * ) method, 
             ( char          * ) abcorr, 
             ( char          * ) obsrvr, 
             ( char          * ) crdsys, 
             ( char          * ) coord, 
             ( char          * ) relate, 
             ( doublereal    * ) &refval, 
             ( doublereal    * ) &adjust, 
             ( doublereal    * ) &step, 
             ( doublereal    * ) (cnfine->base),
             ( integer       * ) &nintvls, 
             ( integer       * ) &nw, 
             ( doublereal    * ) work, 
             ( doublereal    * ) (result->base),
             ( ftnlen          ) strlen(target), 
             ( ftnlen          ) strlen(fixref), 
             ( ftnlen          ) strlen(method), 
             ( ftnlen          ) strlen(abcorr), 
             ( ftnlen          ) strlen(obsrvr), 
             ( ftnlen          ) strlen(crdsys), 
             ( ftnlen          ) strlen(coord), 
             ( ftnlen          ) strlen(relate) );

   /*
   De-allocate the workspace. 
   */
   free_SpiceMemory( work );

   /*
   Sync the output cell. 
   */
   if ( !failed_c() )
      {
      zzsynccl_c ( F2C, result ) ;
      }

   ALLOC_CHECK;

   chkout_c ( "gfsubc_c" );

   } /* End gfsubc_c */
示例#9
0
   void sxform_c ( ConstSpiceChar  * from, 
                   ConstSpiceChar  * to, 
                   SpiceDouble       et, 
                   SpiceDouble       xform[6][6] ) 
/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   from       I   Name of the frame to transform from.
   to         I   Name of the frame to transform to.
   et         I   Epoch of the state transformation matrix.
   xform      O   A state transformation matrix.
 
-Detailed_Input
 
   from        is the name of a reference frame in which a state is
               known.
 
   to          is the name of a reference frame in which it is desired
               to represent the state.
 
   et          is the epoch in ephemeris seconds past the epoch of
               J2000 (TDB) at which the state transformation matrix
               should be evaluated.

-Detailed_Output
 
   xform       is the matrix that transforms states from the reference
               frame `from' to the frame `to' at epoch `et'. If (x, y,
               z, dx, dy, dz) is a state relative to the frame `from'
               then the vector ( x', y', z', dx', dy', dz' ) is the
               same state relative to the frame `to' at epoch `et'.
               Here the vector ( x', y', z', dx', dy', dz' ) is defined
               by the equation:
 
                  -   -       -          -     -  - 
                 | x'  |     |            |   | x  | 
                 | y'  |     |            |   | y  | 
                 | z'  |  =  |   xform    |   | z  | 
                 | dx' |     |            |   | dx | 
                 | dy' |     |            |   | dy | 
                 | dz' |     |            |   | dz | 
                  -   -       -          -     -  - 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If sufficient information has not been supplied via loaded 
      SPICE kernels to compute the transformation between the 
      two frames, the error will be diagnosed by a routine 
      in the call tree of this routine. 
 
   2) If either frame `from' or `to' is not recognized the error 
      SPICE(UNKNOWNFRAME) will be signaled. 
 
-Files
 
   None. 
 
-Particulars
 
   This routine provides the user level interface for computing 
   state transformations from one reference frame to another. 
 
   Note that the reference frames may be inertial or non-inertial. 
   However, the user must take care that sufficient SPICE kernel 
   information is loaded to provide a complete state transformation 
   path from the `from' frame to the `to' frame. 
 
-Examples
 
   Suppose that you have geodetic coordinates of a station on 
   the surface of the earth and that you need the inertial 
   (J2000) state of this station.  The following code fragment 
   illustrates how to transform the position of the station to 
   a J2000 state. 
 
      #include "SpiceUsr.h"
          .
          .
          .
      bodvcd_c ( 399, radii, 3, &n, abc  ); 
 
      equatr   =  abc[0]; 
      polar    =  abc[2]; 
      f        = (equatr - polar) / equatr; 
 
      georec_c ( long, lat, 0.0,  equatr, f,  estate ); 
 
      estate[3] = 0.0; 
      estate[4] = 0.0; 
      estate[5] = 0.0; 
 
      sxform_c ( "IAU_EARTH", "J2000",   et,    xform  ); 
      mxvg_c   (  xform,       estate,   6,  6, jstate ); 
 
   The state `jstate' is the desired J2000 state of the station. 
 
 
-Restrictions
 
   None. 
 
-Literature_References
 
    None. 
 
-Author_and_Institution
 
   C.H. Acton      (JPL)
   N.J. Bachman    (JPL)
   B.V. Semenov    (JPL)
   W.L. Taber      (JPL) 
 
-Version
 
   -CSPICE Version 1.1.3, 27-FEB-2008 (BVS)

       Added FRAMES to the Required_Reading section of the header.

   -CSPICE Version 1.1.2, 24-OCT-2005 (NJB)

       Header updates: example had invalid flattening factor
       computation; this was corrected.  Reference to bodvar_c was
       replaced with reference to bodvcd_c.

   -CSPICE Version 1.1.1, 03-JUL-2003 (NJB) (CHA)

       Various header corrections were made.
   
   -CSPICE Version 1.1.0, 08-FEB-1998 (NJB)  
   
       References to C2F_CreateStr_Sig were removed; code was
       cleaned up accordingly.  String checks are now done using
       the macro CHKFSTR.
       
   -CSPICE Version 1.0.0, 25-OCT-1997 (NJB)
   
      Based on SPICELIB Version 1.0.0, 19-SEP-1995 (WLT)

-Index_Entries
 
   Find a state transformation matrix 
 
-&
*/

{ /* Begin sxform_c */

   /*
   Participate in error tracing.
   */
   chkin_c ( "sxform_c");
   

   /*
   Check the input strings to make sure the pointers are non-null 
   and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "sxform_c", from );
   CHKFSTR ( CHK_STANDARD, "sxform_c", to   );

   
   /*
   Get the desired matrix from sxform_.
   */
   sxform_ (  ( char           * ) from,
              ( char           * ) to,
              ( doublereal     * ) &et,
              ( doublereal     * ) xform,
              ( ftnlen           ) strlen(from),
              ( ftnlen           ) strlen(to)    );

   /*
   Transpose the matrix on output.
   */ 
   xpose6_c ( xform, xform );
   
   
   chkout_c ( "sxform_c");

} /* End sxform_c */
示例#10
0
文件: gfoclt_c.c 项目: Dbelsa/coft
   void gfoclt_c ( ConstSpiceChar   * occtyp,
                   ConstSpiceChar   * front,
                   ConstSpiceChar   * fshape,
                   ConstSpiceChar   * fframe,
                   ConstSpiceChar   * back,
                   ConstSpiceChar   * bshape,
                   ConstSpiceChar   * bframe,
                   ConstSpiceChar   * abcorr,
                   ConstSpiceChar   * obsrvr,
                   SpiceDouble        step,
                   SpiceCell        * cnfine,
                   SpiceCell        * result )
/*

-Brief_I/O
 
   VARIABLE        I/O  DESCRIPTION 
   --------------- ---  -------------------------------------------------
   SPICE_GF_CNVTOL  P   Convergence tolerance. 
   occtyp           I   Type of occultation. 
   front            I   Name of body occulting the other. 
   fshape           I   Type of shape model used for front body. 
   fframe           I   Body-fixed, body-centered frame for front body. 
   back             I   Name of body occulted by the other. 
   bshape           I   Type of shape model used for back body. 
   bframe           I   Body-fixed, body-centered frame for back body. 
   abcorr           I   Aberration correction flag. 
   obsrvr           I   Name of the observing body. 
   step             I   Step size in seconds for finding occultation  
                        events. 
   cnfine          I-O  SPICE window to which the search is restricted. 
   result           O   SPICE window containing results. 
    
-Detailed_Input
 
 
   occtyp     indicates the type of occultation that is to be found. 
              Note that transits are considered to be a type of
              occultation.

              Supported values and corresponding definitions are: 
 
                 "FULL"               denotes the full occultation 
                                      of the body designated by  
                                      `back' by the body designated 
                                      by `front', as seen from 
                                      the location of the observer. 
                                      In other words, the occulted 
                                      body is completely invisible 
                                      as seen from the observer's 
                                      location. 
 
                 "ANNULAR"            denotes an annular 
                                      occultation: the body 
                                      designated by `front' blocks 
                                      part of, but not the limb of, 
                                      the body designated by `back', 
                                      as seen from the location of 
                                      the observer. 
 
                 "PARTIAL"            denotes a partial, non-annular
                                      occultation: the body designated
                                      by `front' blocks part, but not
                                      all, of the limb of the body
                                      designated by `back', as seen
                                      from the location of the
                                      observer.
 
                 "ANY"                denotes any of the above three 
                                      types of occultations: 
                                      "PARTIAL", "ANNULAR", or 
                                      "FULL". 
 
                                      "ANY" should be used to search 
                                      for times when the body  
                                      designated by `front' blocks 
                                      any part of the body designated 
                                      by `back'. 
 
                                      The option "ANY" must be used 
                                      if either the front or back 
                                      target body is modeled as 
                                      a point. 
 
              Case and leading or trailing blanks are not 
              significant in the string `occtyp'. 
 
 
   front      is the name of the target body that occults---that is, 
              passes in front of---the other. Optionally, you may 
              supply the integer NAIF ID code for the body as a 
              string. For example both "MOON" and "301" are 
              legitimate strings that designate the Moon. 
 
              Case and leading or trailing blanks are not 
              significant in the string `front'. 
 
 
   fshape     is a string indicating the geometric model used to
              represent the shape of the front target body. The
              supported options are:
 
                 "ELLIPSOID"     Use a triaxial ellipsoid model
                                 with radius values provided via the 
                                 kernel pool. A kernel variable  
                                 having a name of the form 
 
                                    "BODYnnn_RADII"  
 
                                 where nnn represents the NAIF 
                                 integer code associated with the 
                                 body, must be present in the kernel 
                                 pool. This variable must be 
                                 associated with three numeric 
                                 values giving the lengths of the 
                                 ellipsoid's X, Y, and Z semi-axes. 
 
                 "POINT"         Treat the body as a single point. 
                                 When a point target is specified, 
                                 the occultation type must be 
                                 set to "ANY". 
                                  
              At least one of the target bodies `front' and `back' must 
              be modeled as an ellipsoid. 
 
              Case and leading or trailing blanks are not 
              significant in the string `fshape'. 
 
 
   fframe     is the name of the body-fixed, body-centered reference 
              frame associated with the front target body. Examples 
              of such names are "IAU_SATURN" (for Saturn) and 
              "ITRF93" (for the Earth). 
 
              If the front target body is modeled as a point, `fframe' 
              should be left empty or blank. 
 
              Case and leading or trailing blanks bracketing a
              non-blank frame name are not significant in the string
              `fframe'.

 
   back       is the name of the target body that is occulted 
              by---that is, passes in back of---the other. 
              Optionally, you may supply the integer NAIF ID code 
              for the body as a string. For example both "MOON" and 
              "301" are legitimate strings that designate the Moon. 
 
              Case and leading or trailing blanks are not 
              significant in the string `back'. 
 
 
   bshape     is the shape specification for the body designated by
              `back'. The supported options are those for `fshape'. See
              the description of `fshape' above for details.
               
 
   bframe     is the name of the body-fixed, body-centered reference 
              frame associated with the ``back'' target body. 
              Examples of such names are "IAU_SATURN" (for Saturn) 
              and "ITRF93" (for the Earth). 
 
              If the back target body is modeled as a point, `bframe' 
              should be left empty or blank. 
 
              Case and leading or trailing blanks bracketing a 
              non-blank frame name are not significant in the string 
              `bframe'. 
 
 
   abcorr     indicates the aberration corrections to be applied to 
              the state of each target body to account for one-way 
              light time.  Stellar aberration corrections are 
              ignored if specified, since these corrections don't 
              improve the accuracy of the occultation determination. 
 
              See the header of the SPICE routine spkezr_c for a 
              detailed description of the aberration correction 
              options. For convenience, the options supported by 
              this routine are listed below: 
 
                 "NONE"     Apply no correction.    
 
                 "LT"       "Reception" case:  correct for 
                            one-way light time using a Newtonian 
                            formulation. 
 
                 "CN"       "Reception" case:  converged 
                            Newtonian light time correction. 
 
                 "XLT"      "Transmission" case:  correct for 
                            one-way light time using a Newtonian 
                            formulation. 
 
                 "XCN"      "Transmission" case:  converged 
                            Newtonian light time correction. 
 
              Case and blanks are not significant in the string 
              `abcorr'. 
 
 
   obsrvr     is the name of the body from which the occultation is 
              observed. 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
              occultation event that the user wishes to detect; `step'
              must also be shorter than the shortest time interval
              between two occultation events that occur within the
              confinement window (see below). 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 SPICE_GF_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.  
 
              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. 
 
 
-Detailed_Output
 
   cnfine     is the input confinement window, updated if necessary
              so the control area of its data array indicates the
              window's size and cardinality. The window data are
              unchanged.


   result     is a SPICE window representing the set of time 
              intervals, within the confinement period, when the 
              specified occultation occurs. 
 
              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 gfoclt_c conducts its 
              search. 
 
-Parameters
  
   SPICE_GF_CNVTOL     

              is the convergence tolerance used for finding endpoints
              of the intervals comprising the result window.
              SPICE_GF_CNVTOL is used to determine when binary searches
              for roots should terminate: when a root is bracketed
              within an interval of length SPICE_GF_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. 
 
              SPICE_GF_CNVTOL is declared in the header file
             
                 SpiceGF.h
 
-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_c can be used to contract the result window. 
 
   3)  If name of either target or the observer cannot be translated 
       to a NAIF ID code, the error will be diagnosed by a routine 
       in the call tree of this routine. 
        
   4)  If the radii of a target body modeled as an ellipsoid cannot 
       be determined by searching the kernel pool for a kernel 
       variable having a name of the form 
 
          "BODYnnn_RADII"  
 
       where nnn represents the NAIF integer code associated with 
       the body, the error will be diagnosed by a routine in the 
       call tree of this routine. 
 
   5)  If either of the target bodies `front' or `back' coincides with 
       the observer body `obsrvr', the error will be diagnosed by a 
       routine in the call tree of this routine. 
 
   6)  If the body designated by `front' coincides with that 
       designated by `back', the error will be diagnosed by a routine 
       in the call tree of this routine. 
        
   7)  If either of the body model specifiers `fshape' or `bshape' 
       is not recognized, the error will be diagnosed by a routine 
       in the call tree of this routine. 
 
   8)  If both of the body model specifiers `fshape' and `bshape' 
       specify point targets, the error will be diagnosed by a 
       routine in the call tree of this routine. 
 
   9)  If a target body-fixed reference frame associated with a  
       non-point target is not recognized, the error will be 
       diagnosed by a routine in the call tree of this routine. 
 
   10) If a target body-fixed reference frame is not centered at 
       the corresponding target body,  the error will be 
       diagnosed by a routine in the call tree of this routine. 
 
   11) If the loaded kernels provide insufficient data to  
       compute any required state vector, the deficiency will 
       be diagnosed by a routine in the call tree of this routine. 
 
   12) 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. 
 
   13) If the output SPICE window `result' has insufficient capacity 
       to contain the number of intervals on which the specified 
       occultation condition is met, the error will be diagnosed 
       by a routine in the call tree of this routine. 
 
   14) If a point target is specified and the occultation 
       type is set to a valid value other than "ANY", the 
       error will be diagnosed by a routine in the call tree  
       of this routine. 
 
   15) Invalid occultation types will be diagnosed by a routine in
       the call tree of this routine.

   16) Invalid aberration correction specifications will be
       diagnosed by a routine in the call tree of this routine.

   17) If any input string argument pointer is null, the error
       SPICE(NULLPOINTER) will be signaled.

   18) If any input string argument, other than `fframe' or `bframe',
       is empty, the error SPICE(EMPTYSTRING) will be signaled.

-Files
 
   Appropriate SPICE 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 target, source 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 via 
        furnsh_c. 
 
      - PCK data: bodies modeled as triaxial ellipsoids must have 
        semi-axis lengths provided by variables in the kernel pool. 
        Typically these data are made available by loading a text 
        PCK file via furnsh_c. 
 
      - FK data: if either of the reference frames designated by
        `bframe' or `fframe' are not built in to the SPICE system,
        one or more FKs specifying these frames must be loaded. 

   Kernel data are normally loaded once per program run, NOT every time
   this routine is called.
 
-Particulars
 
   This routine provides a simpler, but less flexible, interface 
   than does the CSPICE routine gfocce_c for conducting searches for 
   occultation events. Applications that require support for 
   progress reporting, interrupt handling, non-default step or 
   refinement functions, or non-default convergence tolerance should 
   call gfocce_c rather than this routine. 
 
   This routine determines a set of one or more time intervals 
   within the confinement window when a specified type of 
   occultation occurs. The resulting set of intervals is returned as 
   a SPICE window. 
 
   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 occultations is treated as a search for state 
   transitions: times are sought when the state of the `back' body 
   changes from "not occulted" to "occulted" 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 occultation state will be sampled. Starting at the left
   endpoint of the interval, samples of the occultation state 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 occultation state is constant: 
   the step size should be shorter than the shortest occultation 
   duration and the shortest period between occultations, within 
   the confinement window. 
 
   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 convergence tolerance used by this routine is set
   via the parameter SPICE_GF_CNVTOL.
 
   The value of SPICE_GF_CNVTOL is set to a "tight" value so that the
   tolerance doesn't limit 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
   gfocce_c must be called. Making the tolerance tighter than
   SPICE_GF_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. 

   The confinement window also can be used to restrict a search to
   a time window over which required data (typically ephemeris
   data, in the case of occultation searches) are known to be
   available.

   In some cases, the confinement window 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. See the "CASCADE"
   example program in gf.req for a demonstration.
 
-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) Find occultations of the Sun by the Moon (that is, solar
      eclipses) as seen from the center of the Earth over the month
      December, 2001.
 
      Use light time corrections to model apparent positions of Sun 
      and Moon. Stellar aberration corrections are not specified 
      because they don't affect occultation computations. 
 
      We select a step size of 3 minutes, which means we 
      ignore occultation events lasting less than 3 minutes, 
      if any exist. 
 
      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 = ( 'de421.bsp',
                                'pck00008.tpc',
                                'naif0009.tls'  )

         \begintext
 
 

      Example code begins here.


         #include <stdio.h>
         #include "SpiceUsr.h"

         int main()
         {
            /.
            Local constants 
            ./

            #define TIMFMT          "YYYY MON DD HR:MN:SC.###### (TDB)::TDB"
            #define MAXWIN          200
            #define TIMLEN          41

            /.
            Local variables 
            ./
            SPICEDOUBLE_CELL      ( cnfine, MAXWIN );
            SPICEDOUBLE_CELL      ( result, MAXWIN );

            SpiceChar             * win0;
            SpiceChar             * win1;
            SpiceChar               begstr [ TIMLEN ];
            SpiceChar               endstr [ TIMLEN ];

            SpiceDouble             et0;
            SpiceDouble             et1;
            SpiceDouble             left;
            SpiceDouble             right;
            SpiceDouble             step;

            SpiceInt                i;

            /.
            Load kernels. 
            ./
            furnsh_c ( "standard.tm" );

            /.
            Obtain the TDB time bounds of the confinement
            window, which is a single interval in this case.
            ./
            win0 = "2001 DEC 01 00:00:00 TDB";
            win1 = "2002 JAN 01 00:00:00 TDB";

            str2et_c ( win0, &et0 );
            str2et_c ( win1, &et1 );

            /.
            Insert the time bounds into the confinement
            window.
            ./
            wninsd_c ( et0, et1, &cnfine );

            /.
            Select a 3-minute step. We'll ignore any occultations
            lasting less than 3 minutes.  Units are TDB seconds.
            ./
            step = 180.0;

            /.
            Perform the search.
            ./
            gfoclt_c ( "any",                            
                       "moon",    "ellipsoid",  "iau_moon", 
                       "sun",     "ellipsoid",  "iau_sun", 
                       "lt",      "earth",      step, 
                       &cnfine,   &result                 );

            if ( wncard_c(&result) == 0 )
            {
               printf ( "No occultation was found.\n" ); 
            }
            else
            {
               for ( i = 0;  i < wncard_c(&result); i++ )
               { 
                  /.
                  Fetch and display each occultation interval.
                  ./
                  wnfetd_c ( &result, i, &left, &right );

                  timout_c ( left,  TIMFMT, TIMLEN, begstr );
                  timout_c ( right, TIMFMT, TIMLEN, endstr );

                  printf ( "Interval %ld\n"
                           "   Start time: %s\n" 
                           "   Stop time:  %s\n",
                           i, begstr, endstr      );
               }
            }

            return ( 0 );
         }

 
      When this program was executed on a PC/Linux/gcc platform, the
      output was:
 
         Interval 0
            Start time: 2001 DEC 14 20:10:14.195952 (TDB)
            Stop time:  2001 DEC 14 21:35:50.317994 (TDB)

 
   2) Find occultations of Titan by Saturn or of Saturn by
      Titan as seen from the center of the Earth over the
      last four months of 2008. Model both target bodies as
      ellipsoids. Search for every type of occultation.

      Use light time corrections to model apparent positions of
      Saturn and Titan. Stellar aberration corrections are not
      specified because they don't affect occultation computations.

      We select a step size of 15 minutes, which means we
      ignore occultation events lasting less than 15 minutes,
      if any exist.

      Use the meta-kernel shown below to load the required SPICE
      kernels.


         KPL/MK

         File name: gfoclt_ex2.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
            sat288.bsp                    Satellite ephemeris for
                                          Saturn
            pck00008.tpc                  Planet orientation and
                                          radii
            naif0009.tls                  Leapseconds

         \begindata

            KERNELS_TO_LOAD = ( 'de421.bsp',
                                'sat288.bsp',
                                'pck00008.tpc',
                                'naif0009.tls'  )

         \begintext

         End of meta-kernel


     Example code begins here.
      
        #include <stdio.h>
        #include <string.h>
        #include "SpiceUsr.h"

        int main()
        {
           /.
           Local constants 
           ./
           #define TIMFMT          "YYYY MON DD HR:MN:SC.###### (TDB)::TDB"
           #define MAXWIN          200
           #define TIMLEN          41
           #define LNSIZE          81
           #define NTYPES          4

           /.
           Local variables 
           ./
           SPICEDOUBLE_CELL      ( cnfine, MAXWIN );
           SPICEDOUBLE_CELL      ( result, MAXWIN );

           SpiceChar             * back;
           SpiceChar             * bframe;
           SpiceChar             * front;
           SpiceChar             * fframe;
           SpiceChar               line   [ LNSIZE ];
           SpiceChar             * obsrvr;   

           SpiceChar             * occtyp [ NTYPES ] =
                                   {
                                      "FULL",
                                      "ANNULAR",
                                      "PARTIAL",
                                      "ANY"
                                   };

           SpiceChar             * templt [ NTYPES ] =
                                   {
                                      "Condition: # occultation of # by #",
                                      "Condition: # occultation of # by #",
                                      "Condition: # occultation of # by #",
                                      "Condition: # occultation of # by #"
                                   };

           SpiceChar               timstr [ TIMLEN ];
           SpiceChar               title  [ LNSIZE ];
           SpiceChar             * win0;
           SpiceChar             * win1;

           SpiceDouble             et0;
           SpiceDouble             et1;
           SpiceDouble             finish;
           SpiceDouble             start;
           SpiceDouble             step;

           SpiceInt                i;
           SpiceInt                j;
           SpiceInt                k;

           /.
           Load kernels. 
           ./
           furnsh_c ( "gfoclt_ex2.tm" );

           /.
           Obtain the TDB time bounds of the confinement
           window, which is a single interval in this case.
           ./
           win0 = "2008 SEP 01 00:00:00 TDB";
           win1 = "2009 JAN 01 00:00:00 TDB";

           str2et_c ( win0, &et0 );
           str2et_c ( win1, &et1 );

           /.
           Insert the time bounds into the confinement
           window.
           ./
           wninsd_c ( et0, et1, &cnfine );

           /.
           Select a 15-minute step. We'll ignore any occultations
           lasting less than 15 minutes. Units are TDB seconds.
           ./
           step = 900.0;

           /.
           The observation location is the Earth.
           ./
           obsrvr = "Earth";

           /.
           Loop over the occultation types.
           ./
           for ( i = 0;  i < NTYPES;  i++ )
           {
              /.
              For each type, do a search for both transits of
              Titan across Saturn and occultations of Titan by
              Saturn.
              ./
              for ( j = 0;  j < 2;  j++ )
              {
                 if ( j == 0 )
                 {
                    front  = "TITAN";
                    fframe = "IAU_TITAN";
                    back   = "SATURN";
                    bframe = "IAU_SATURN";
                 }
                 else
                 {
                    front  = "SATURN";
                    fframe = "IAU_SATURN";
                    back   = "TITAN";
                    bframe = "IAU_TITAN";
                 }

                 /.
                 Perform the search. The target body shapes
                 are modeled as ellipsoids.
                 ./
                 gfoclt_c ( occtyp[i],                            
                            front,    "ellipsoid",  fframe, 
                            back,     "ellipsoid",  bframe,  
                            "lt",     obsrvr,       step,   
                            &cnfine,  &result               );

                 /.
                 Display the results. 
                 ./
                 printf ( "\n" );

                 /.
                 Substitute the occultation type and target
                 body names into the title string:
                 ./
                 repmc_c ( templt[i], "#", occtyp[i], LNSIZE, title );
                 repmc_c ( title,     "#", back,      LNSIZE, title );
                 repmc_c ( title,     "#", front,     LNSIZE, title );

                 printf ( "%s\n", title );

                 if ( wncard_c(&result) == 0 )
                 {
                    printf ( " Result window is empty: "
                             "no occultation was found.\n" );
                 }
                 else
                 {
                    printf ( " Result window start, stop times:\n" );

                    for ( k = 0;  k < wncard_c(&result);  k++ )
                    { 
                       /.
                       Fetch the endpoints of the kth interval
                       of the result window.
                       ./
                       wnfetd_c ( &result, k, &start, &finish );

                       /.
                       Call strncpy with a length of 7 to include
                       a terminating null. 
                       ./
                       strncpy ( line, "  #  #", 7 );

                       timout_c ( start,  TIMFMT, TIMLEN, timstr );

                       repmc_c  ( line, "#", timstr, LNSIZE, line );

                       timout_c ( finish, TIMFMT, TIMLEN, timstr );

                       repmc_c  ( line, "#", timstr, LNSIZE, line );

                       printf ( "%s\n", line );
                    }
                 }
                 /.
                 We've finished displaying the results of the
                 current search.
                 ./
              }
              /.
              We've finished displaying the results of the
              searches using the current occultation type.
              ./
           }
           printf ( "\n" );

           return ( 0 );
        }

 
      When this program was executed on a PC/Linux/gcc platform, the
      output was:


         Condition: FULL occultation of SATURN by TITAN
          Result window is empty: no occultation was found.

         Condition: FULL occultation of TITAN by SATURN
          Result window start, stop times:
           2008 OCT 27 22:08:01.627053 (TDB)  2008 OCT 28 01:05:03.375236 (TDB)
           2008 NOV 12 21:21:59.252262 (TDB)  2008 NOV 13 02:06:05.053051 (TDB)
           2008 NOV 28 20:49:02.402832 (TDB)  2008 NOV 29 02:13:58.986344 (TDB)
           2008 DEC 14 20:05:09.246177 (TDB)  2008 DEC 15 01:44:53.523002 (TDB)
           2008 DEC 30 19:00:56.577073 (TDB)  2008 DEC 31 00:42:43.222909 (TDB)

         Condition: ANNULAR occultation of SATURN by TITAN
          Result window start, stop times:
           2008 OCT 19 21:29:20.599087 (TDB)  2008 OCT 19 22:53:34.518737 (TDB)
           2008 NOV 04 20:15:38.620368 (TDB)  2008 NOV 05 00:18:59.139978 (TDB)
           2008 NOV 20 19:38:59.647712 (TDB)  2008 NOV 21 00:35:26.725908 (TDB)
           2008 DEC 06 18:58:34.073268 (TDB)  2008 DEC 07 00:16:17.647040 (TDB)
           2008 DEC 22 18:02:46.288289 (TDB)  2008 DEC 22 23:26:52.712459 (TDB)

         Condition: ANNULAR occultation of TITAN by SATURN
          Result window is empty: no occultation was found.

         Condition: PARTIAL occultation of SATURN by TITAN
          Result window start, stop times:
           2008 OCT 19 20:44:30.326771 (TDB)  2008 OCT 19 21:29:20.599087 (TDB)
           2008 OCT 19 22:53:34.518737 (TDB)  2008 OCT 19 23:38:26.250580 (TDB)
           2008 NOV 04 19:54:40.339331 (TDB)  2008 NOV 04 20:15:38.620368 (TDB)
           2008 NOV 05 00:18:59.139978 (TDB)  2008 NOV 05 00:39:58.612935 (TDB)
           2008 NOV 20 19:21:46.689523 (TDB)  2008 NOV 20 19:38:59.647712 (TDB)
           2008 NOV 21 00:35:26.725908 (TDB)  2008 NOV 21 00:52:40.604703 (TDB)
           2008 DEC 06 18:42:36.100544 (TDB)  2008 DEC 06 18:58:34.073268 (TDB)
           2008 DEC 07 00:16:17.647040 (TDB)  2008 DEC 07 00:32:16.324244 (TDB)
           2008 DEC 22 17:47:10.776722 (TDB)  2008 DEC 22 18:02:46.288289 (TDB)
           2008 DEC 22 23:26:52.712459 (TDB)  2008 DEC 22 23:42:28.850542 (TDB)

         Condition: PARTIAL occultation of TITAN by SATURN
          Result window start, stop times:
           2008 OCT 27 21:37:16.970175 (TDB)  2008 OCT 27 22:08:01.627053 (TDB)
           2008 OCT 28 01:05:03.375236 (TDB)  2008 OCT 28 01:35:49.266506 (TDB)
           2008 NOV 12 21:01:47.105498 (TDB)  2008 NOV 12 21:21:59.252262 (TDB)
           2008 NOV 13 02:06:05.053051 (TDB)  2008 NOV 13 02:26:18.227357 (TDB)
           2008 NOV 28 20:31:28.522707 (TDB)  2008 NOV 28 20:49:02.402832 (TDB)
           2008 NOV 29 02:13:58.986344 (TDB)  2008 NOV 29 02:31:33.691598 (TDB)
           2008 DEC 14 19:48:27.094229 (TDB)  2008 DEC 14 20:05:09.246177 (TDB)
           2008 DEC 15 01:44:53.523002 (TDB)  2008 DEC 15 02:01:36.360243 (TDB)
           2008 DEC 30 18:44:23.485898 (TDB)  2008 DEC 30 19:00:56.577073 (TDB)
           2008 DEC 31 00:42:43.222909 (TDB)  2008 DEC 31 00:59:17.030568 (TDB)

         Condition: ANY occultation of SATURN by TITAN
          Result window start, stop times:
           2008 OCT 19 20:44:30.326771 (TDB)  2008 OCT 19 23:38:26.250580 (TDB)
           2008 NOV 04 19:54:40.339331 (TDB)  2008 NOV 05 00:39:58.612935 (TDB)
           2008 NOV 20 19:21:46.689523 (TDB)  2008 NOV 21 00:52:40.604703 (TDB)
           2008 DEC 06 18:42:36.100544 (TDB)  2008 DEC 07 00:32:16.324244 (TDB)
           2008 DEC 22 17:47:10.776722 (TDB)  2008 DEC 22 23:42:28.850542 (TDB)

         Condition: ANY occultation of TITAN by SATURN
          Result window start, stop times:
           2008 OCT 27 21:37:16.970175 (TDB)  2008 OCT 28 01:35:49.266506 (TDB)
           2008 NOV 12 21:01:47.105498 (TDB)  2008 NOV 13 02:26:18.227357 (TDB)
           2008 NOV 28 20:31:28.522707 (TDB)  2008 NOV 29 02:31:33.691598 (TDB)
           2008 DEC 14 19:48:27.094229 (TDB)  2008 DEC 15 02:01:36.360243 (TDB)
           2008 DEC 30 18:44:23.485898 (TDB)  2008 DEC 31 00:59:17.030568 (TDB)


-Restrictions
 
   The kernel files to be used by gfoclt_c must be loaded (normally via 
   the CSPICE routine furnsh_c) before gfoclt_c is called. 
 
-Literature_References
 
  None. 
 
-Author_and_Institution
 
  N. J. Bachman  (JPL) 
  L. S. Elson    (JPL) 
  E. D. Wright   (JPL) 
 
-Version
 
   -CSPICE Version 1.0.0, 07-APR-2009 (NJB) (LSE) (EDW)

-Index_Entries
 
   GF occultation search

-&
*/

{ /* Begin gfoclt_c */


   /*
   Local variables 
   */
   static const SpiceChar  * blankStr = " ";

   SpiceChar               * bFrameStr;
   SpiceChar               * fFrameStr;


   /*
   Participate in error tracing.
   */
   if ( return_c() )
   {
      return;
   }
   chkin_c ( "gfoclt_c" );


   /*
   Make sure cell data types are d.p. 
   */
   CELLTYPECHK2 ( CHK_STANDARD, "gfoclt_c", SPICE_DP, cnfine, result );

   /*
   Initialize the input cells if necessary. 
   */
   CELLINIT2 ( cnfine, result );

   /*
   The input frame names are special cases because we allow the caller
   to pass in empty strings. If either of these strings are empty,
   we pass a null-terminated string containing one blank character to
   the underlying f2c'd routine. 

   First make sure the frame name pointers are non-null.
   */
   CHKPTR ( CHK_STANDARD, "gfoclt_c", bframe );
   CHKPTR ( CHK_STANDARD, "gfoclt_c", fframe );

   /*
   Use the input frame strings if they're non-empty; otherwise
   use blank strings for the frame names.
   */
  
   if ( bframe[0] )
   {
      bFrameStr = (SpiceChar *) bframe;
   }
   else
   {
      bFrameStr = (SpiceChar *) blankStr;
   }

   if ( fframe[0] )
   {
      fFrameStr = (SpiceChar *) fframe;
   }
   else
   {
      fFrameStr = (SpiceChar *) blankStr;
   }


   /*
   Check the other input strings to make sure each pointer is non-null 
   and each string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", occtyp );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", front  );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", fshape );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", back   );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", bshape );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", abcorr );
   CHKFSTR ( CHK_STANDARD, "gfoclt_c", obsrvr );


   /*
   Let the f2c'd routine do the work. 
   */
   gfoclt_ ( (char         *) occtyp,
             (char         *) front,
             (char         *) fshape,
             (char         *) fFrameStr,
             (char         *) back,
             (char         *) bshape,
             (char         *) bFrameStr,
             (char         *) abcorr,
             (char         *) obsrvr,
             (doublereal   *) &step,
             (doublereal   *) cnfine->base,
             (doublereal   *) result->base,
             (ftnlen        ) strlen(occtyp),
             (ftnlen        ) strlen(front),
             (ftnlen        ) strlen(fshape),
             (ftnlen        ) strlen(fframe),
             (ftnlen        ) strlen(back),
             (ftnlen        ) strlen(bshape),
             (ftnlen        ) strlen(bframe),
             (ftnlen        ) strlen(abcorr),
             (ftnlen        ) strlen(obsrvr)  );

   /*
   Sync the output result cell. 
   */
   if ( !failed_c() )
   {
      zzsynccl_c ( F2C, result );
   }


   chkout_c ( "gfoclt_c" );

} /* End gfoclt_c */
示例#11
0
   void ekrcec_c ( SpiceInt           handle,
                   SpiceInt           segno,
                   SpiceInt           recno,
                   ConstSpiceChar   * column,
                   SpiceInt           lenout,
                   SpiceInt         * nvals,
                   void             * cvals,
                   SpiceBoolean     * isnull )

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   Handle attached to EK file. 
   segno      I   Index of segment containing record. 
   recno      I   Record from which data is to be read. 
   column     I   Column name. 
   lenout     I   Maximum length of output strings.
   nvals      O   Number of values in column entry. 
   cvals      O   Character values in column entry. 
   isnull     O   Flag indicating whether column entry is null. 
 
-Detailed_Input
 
   handle         is an EK file handle.  The file may be open for 
                  read or write access.   
 
   segno          is the index of the segment from which data is to 
                  be read.  The first segment in the file has index 0.
 
   recno          is the index of the record from which data is to be 
                  read.  This record number is relative to the start 
                  of the segment indicated by segno; the first 
                  record in the segment has index 0. 
 
   column         is the name of the column from which data is to be 
                  read. 
 
   lenout         is the maximum string length that can be accommodated in
                  the output array cvals.  This length must large enough to 
                  hold the longest element of the specified column entry, 
                  including a null terminator.  If the column element contains
                  strings of length up to n characters, lenout should be set
                  to n + 1. 


-Detailed_Output
 
   nvals, 
   cvals          are, respectively, the number of values found in 
                  the specified column entry and the set of values 
                  themselves.  The array cvals must have sufficient 
                  string length to accommodate the longest string 
                  in the returned column entry. The calling application
                  should declare cvals with dimension

                     [nelts][lenout]
                  
                  where nelts is the maximum number of elements that 
                  occur in any entry of the specified column. 

                  For columns having fixed-size entries, when a  
                  a column entry is null, nvals is still set to the 
                  column entry size.  For columns having variable- 
                  size entries, nvals is set to 1 for null entries. 
 
   isnull         is a logical flag indicating whether the returned  
                  column entry is null.   
 
-Parameters
 
   None. 
 
-Exceptions
 
   1)  If handle is invalid, the error will be diagnosed by routines 
       called by this routine. 
 
   2)  If segno is out of range, the error will diagnosed by routines 
       called by this routine. 
 
   3)  If recno is out of range, the error will diagnosed by routines 
       called by this routine. 
 
   4)  If column is not the name of a declared column, the error 
       will be diagnosed by routines called by this routine. 
 
   5)  If column specifies a column of whose data type is not 
       character, the error SPICE(WRONGDATATYPE) will be 
       signaled. 
 
   6)  If column specifies a column of whose class is not 
       a character class known to this routine, the error 
       SPICE(NOCLASS) will be signaled. 
 
   7)  If an attempt is made to read an uninitialized column entry, 
       the error will be diagnosed by routines called by this  
       routine.  A null entry is considered to be initialized, but 
       entries do not contain null values by default. 
 
   8)  If an I/O error occurs while reading or writing the indicated 
       file, the error will be diagnosed by routines called by this 
       routine. 
 
   9)  If any element of the column entry would be truncated when 
       assigned to an element of cvals, the error will be diagnosed 
       by routines called by this routine. 

   10) If the input column name string pointer is null, the error
       SPICE(NULLPOINTER) will be signaled.

   11) If the input column name string has length zero, the error 
       SPICE(EMPTYSTRING) will be signaled.

   12) If the output string pointer cvals is null, the error SPICE(NULLPOINTER)
       will be signaled.

   13) If the output string length indicated by lenout is less than two 
       characters, it is too short to contain one character of output data
       plus a null terminator, so it cannot be passed to the underlying Fortran
       routine.  In this event, the error SPICE(STRINGTOOSHORT) is
       signaled.
 
-Files
 
   See the EK Required Reading for a discussion of the EK file 
   format. 
 
-Particulars
 
   This routine is a utility that allows an EK file to be read 
   directly without using the high-level query interface. 
 
-Examples
 
   1)  Read the value in the third record of the column ccol in 
       the fifth segment of an EK file designated by handle. 
 
          #include "SpiceUsr.h"
             .
             .
             .
          ekrcec_c ( handle, 4, 2, "CCOL", lenout, &nvals, &cval, &isnull );
 
-Restrictions
 
   1) EK files open for write access are not necessarily readable. 
      In particular, a column entry can be read only if it has been 
      initialized. The caller is responsible for determining 
      when it is safe to read from files open for write access. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
 
-Version

   -CSPICE Version 1.1.0, 21-MAY-2001 (WLT)

       Added a cast to (char *) in the call to  F2C_ConvertStrArr to
       support compilation under C++.
   
   -CSPICE Version 1.0.0, 04-JUL-2000 (NJB)

-Index_Entries
 
   read character data from EK column 
 
-&
*/

{ /* Begin ekrcec_c */


   /*
   Local variables
   */
   logical                 null;


   /*
   Participate in error tracing.
   */
   chkin_c ( "ekrcec_c" );


   /*
   Check the column name to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ekrcec_c", column );


   /*
   Make sure the output array has at least enough room for one output
   character and a null terminator.  Also check for a null pointer.
   */
   CHKOSTR ( CHK_STANDARD, "ekrcec_c", cvals, lenout );

   /*
   Map the segment and record numbers to their Fortran-style
   values.  Pass a flag of type logical to ekrced_.
   */
    
   segno++;
   recno++;


   ekrcec_ ( ( integer * ) &handle,
             ( integer * ) &segno,
             ( integer * ) &recno,
             ( char    * ) column,
             ( integer * ) nvals,
             ( char    * ) cvals,
             ( logical * ) &null,
             ( ftnlen    ) strlen(column),
             ( ftnlen    ) lenout-1        );

   /*
   Convert the output array from Fortran to C style. 
   */
   F2C_ConvertStrArr ( *nvals, lenout, (char *) cvals );


   /*
   Cast the null flag back to a SpiceBoolean. 
   */
   *isnull = null;


   chkout_c ( "ekrcec_c" );

} /* End ekrcec_c */
示例#12
0
   void spkw10_c ( SpiceInt           handle,
                   SpiceInt           body, 
                   SpiceInt           center, 
                   ConstSpiceChar   * frame, 
                   SpiceDouble        first,
                   SpiceDouble        last,
                   ConstSpiceChar   * segid, 
                   ConstSpiceDouble   consts [8],
                   SpiceInt           n,
                   ConstSpiceDouble   elems  [],
                   ConstSpiceDouble   epochs []  )
                   
/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   handle     I   The handle of a DAF file open for writing. 
   body       I   The NAIF ID code for the body of the segment. 
   center     I   The center of motion for body. 
   frame      I   The reference frame for this segment. 
   first      I   The first epoch for which the segment is valid. 
   last       I   The last  epoch for which the segment is valid. 
   segid      I   The string to use for segment identifier. 
   consts     I   The array of geophysical constants for the segment 
   n          I   The number of element/epoch pairs to be stored 
   elems      I   The collection of "two-line" element sets. 
   epochs     I   The epochs associated with the element sets. 
 
-Detailed_Input
 
   handle      is the file handle of an SPK file that has been 
               opened for writing by spcopn, dafopn, or dafopw. 
 
   body        is the NAIF ID for the body whose states are 
               to be recorded in an SPK file. 
 
   center      is the NAIF ID for the center of motion associated 
               with body. 
 
   frame       is the reference frame that states are referenced to, 
               for example "J2000". 
 
   first       are the bounds on the ephemeris times, expressed as 
   last        seconds past J2000, for which the states can be used 
               to interpolate a state for body. 
 
   segid       is the segment identifier. An SPK segment identifier 
               may contain up to 40 characters. 
 
   consts      are the geophysical constants needed for evaluation 
               of the two line elements sets.  The order of these 
               constants must be: 
 
               consts[0] = J2 gravitational harmonic for earth 
               consts[1] = J3 gravitational harmonic for earth 
               consts[2] = J4 gravitational harmonic for earth 
               consts[3] = Square root of the GM for earth where GM 
                           is expressed in earth radii cubed per 
                           minutes squared 
               consts[4] = Equatorial radius of the earth in km 
               consts[5] = Low altitude bound for atmospheric 
                           model in km 
               consts[6] = High altitude bound for atmospheric 
                           model in km 
               consts[7] = Distance units/earth radius (normally 1) 
 
   n           is the number of "two-line" element sets  and epochs 
               to be stored in the segment. 
 
   elems       contains a time-ordered array of two-line elements 
               as supplied in NORAD two-line element files.  The 
               i'th set of elements (where i ranges from 1 to n)
               should be stored as shown here: 
 
                  base = (i-1)*10 
 
                  elems ( base + 0 ) = NDT20 
                  elems ( base + 1 ) = NDD60 
                  elems ( base + 2 ) = BSTAR 
                  elems ( base + 3 ) = INCL 
                  elems ( base + 4 ) = NODE0 
                  elems ( base + 5 ) = ECC 
                  elems ( base + 6 ) = OMEGA 
                  elems ( base + 7 ) = MO 
                  elems ( base + 8 ) = NO 
                  elems ( base + 9 ) = EPOCH 
 
               The meaning of these variables is defined by the 
               format of the two-line element files available from 
               NORAD.
 
   epochs      contains the epochs (ephemeris seconds past J2000) 
               corresponding to the elements in elems.  The I'th 
               epoch must equal the epoch of the I'th element set 
               Epochs must form a strictly increasing sequence. 
 
-Detailed_Output
 
   None.       The data input is stored in an SPK segment in the 
               DAF connected to the input handle. 
 
-Parameters
 
   None. 
 
-Particulars
 
   This routine writes a type 10 SPK segment to the DAF open 
   for writing that is attached to handle.  A routine, GETELM, that 
   reads two-line element data from files distributed by 
   NORAD is available from NAIF. 
 
-Examples
 
   Suppose that you have collected the two-line element data 
   and geophysical constants as prescribed above.  The following 
   code fragment demonstrates how you could go about creating 
   a type 10 SPK segment. 
 
      #include "SpiceUsr.h"
          .
          .
          .
      /.
      Open a new SPK file using DAF and get a file handle. 
      ./
      body   = <integer code for the body>;
      center = <integer code for central body for the trajectory>; 
      frame  = "J2000";
      segid  = <string that gives the bodies name>; 
 
      fname  = "SAMPLE.SPK"; 
      ifname = "SAMPLE SPK FILE FOR PRIVATE USE"; 
      ncomch =  0;
 
      void spkopn_c ( fname, ifname, ncomch, &handle );
 
      /.
      Add the type 10 data. 
      ./
      spkw10_c ( handle, body,   center, frame,  first, last, 
                 segid,  consts, n,      elems,  epochs      ); 
 
      /.
      Close the SPK properly. 
      ./
      spkcls_c ( handle );
      
       
 
-Restrictions
 
   None. 
 
-Exceptions
 
   1) Errors in the structure or content of the inputs must be 
      diagnosed by routines called by this one. 
 
   2) File access errors are diagnosed by routines in the 
      call tree of this routine. 
 
   3) If either the input frame or segment ID string pointer is null,
      the error SPICE(NULLPOINTER) is signaled.
   
   4) If either the input frame or segment ID string is empty,
      the error SPICE(EMPTYSTRING) is signaled.
   
-Files
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman    (JPL)
   W.L. Taber      (JPL) 
 
-Literature_References
 
   None. 
 
-Version
 
   -CSPICE Version 1.0.1, 30-OCT-2006 (BVS)

      Deleted "inertial" from the FRAME description in the Brief_I/O
      section of the header.

   -CSPICE Version 1.0.0, 29-JUN-1999 (NJB) (WLT)

-Index_Entries
 
   write a type_10 spk segment 
 
-&
*/

{ /* Begin spkw10_c */



   /*
   Participate in error tracing.
   */
   chkin_c ( "spkw10_c" );


   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spkw10_c", frame );
   CHKFSTR ( CHK_STANDARD, "spkw10_c", segid );


   /*
   Write the segment. 
   */
   spkw10_ ( ( integer    * ) &handle,
             ( integer    * ) &body,
             ( integer    * ) &center,
             ( char       * ) frame,
             ( doublereal * ) &first,
             ( doublereal * ) &last,
             ( char       * ) segid,
             ( doublereal * ) consts,
             ( integer    * ) &n,
             ( doublereal * ) elems,
             ( doublereal * ) epochs,
             ( ftnlen       ) strlen(frame),
             ( ftnlen       ) strlen(segid)  );


   chkout_c ( "spkw10_c" );

} /* End spkw10_c */
示例#13
0
   void bodvrd_c ( ConstSpiceChar   * bodynm,
                   ConstSpiceChar   * item,
                   SpiceInt           maxn,
                   SpiceInt         * dim,
                   SpiceDouble      * values ) 

/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   bodynm     I   Body name. 
   item       I   Item for which values are desired. ("RADII", 
                  "NUT_PREC_ANGLES", etc. ) 
   maxn       I   Maximum number of values that may be returned. 
   dim        O   Number of values returned. 
   values     O   Values. 
 
-Detailed_Input
 
   bodynm     is the name of the body for which `item' is requested. 
              `bodynm' is case-insensitive, and leading and trailing 
              blanks in `bodynm' are not significant. 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 body 
              of interest. 
 
   item       is the item to be returned. Together, the NAIF ID 
              code of the body and the item name combine to form a 
              kernel variable name, e.g., 
 
                 "BODY599_RADII"      
                 "BODY401_POLE_RA"  
 
              The values associated with the kernel variable having 
              the name constructed as shown are sought.  Below 
              we'll take the shortcut of calling this kernel variable 
              the "requested kernel variable." 
 
              Note that `item' *is* case-sensitive.  This attribute 
              is inherited from the case-sensitivity of kernel 
              variable names. 
 
   maxn       is the maximum number of values that may be returned. 
              The output array `values' must be declared with size at 
              least `maxn'.  It's an error to supply an output array 
              that is too small to hold all of the values associated 
              with the requested kernel variable. 
 
-Detailed_Output
 
   dim        is the number of values returned; this is always the 
              number of values associated with the requested kernel 
              variable unless an error has been signaled. 
 
   values     is the array of values associated with the requested 
              kernel variable.  If `values' is too small to hold all 
              of the values associated with the kernel variable, the 
              returned values of `dim' and `values' are undefined. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If the input body name cannot be translated to an ID code, 
      and if the name is not a string representation of an integer 
      (for example, "399"), the error SPICE(NOTRANSLATION) is 
      signaled. 
 
   2) If the requested kernel variable is not found in the kernel 
      pool, the error SPICE(KERNELVARNOTFOUND) is signaled. 
 
   3) If the requested kernel variable is found but the associated 
      values aren't numeric, the error SPICE(TYPEMISMATCH) is 
      signaled. 
 
   4) The output array `values' must be declared with sufficient size
      to contain all of the values associated with the requested kernel
      variable.  If the dimension of `values' indicated by `maxn' is
      too small to contain the requested values, the error
      SPICE(ARRAYTOOSMALL) is signaled.
 
   5) If the input dimension `maxn' indicates there is more room 
      in `values' than there really is---for example, if `maxn' is 
      10 but `values' is declared with dimension 5---and the dimension 
      of the requested kernel variable is larger than the actual 
      dimension of `values', then this routine may overwrite  
      memory.  The results are unpredictable. 
 
   6) If either of the input string pointers `bodynm' or `item' 
      are null, the error SPICE(NULLPOINTER) will be signaled.

   7) If either of the input strings referred to by `bodynm' or `item' 
      contain no data characters, the error SPICE(EMPTYSTRING) will 
      be signaled.

-Files
 
   None. 
 
-Particulars
 
   This routine simplifies looking up PCK kernel variables by
   constructing names of requested kernel variables and by performing
   error checking.
 
   This routine is intended for use in cases where the maximum number
   of values that may be returned is known at compile time.  The caller
   fetches all of the values associated with the specified kernel
   variable via a single call to this routine.  If the number of values
   to be fetched cannot be known until run time, the lower-level
   routine  gdpool_c should be used instead. gdpool_c supports fetching
   arbitrary amounts of data in multiple "chunks."
 
   This routine is intended for use in cases where the requested kernel
   variable is expected to be present in the kernel pool.  If the
   variable is not found or has the wrong data type, this routine
   signals an error.  In cases where it is appropriate to indicate
   absence of an expected kernel variable by returning a boolean "found
   flag" with the value SPICEFALSE, again the routine gdpool_c should
   be used.
 
-Examples
 
   1)  When the kernel variable  
 
          BODY399_RADII 
 
       is present in the kernel pool---normally because a PCK 
       defining this variable has been loaded---the call 
 
          bodvrd_c ( "EARTH", "RADII", 3, &dim, values );
 
       returns the dimension and values associated with the variable 
       "BODY399_RADII", for example, 
 
          dim      == 3 
          value[0] == 6378.140 
          value[1] == 6378.140 
          value[2] == 6356.755 
 
 
   2)  The call  
 
          bodvrd_c ( "earth", "RADII", 3, &dim, values ); 
 
       will produce the same results shown in example (1), 
       since the case of the input argument `bodynm' is 
       not significant. 
 
 
   3)  The call  
 
          bodvrd_c ( "399", "RADII", 3, &dim, values ); 
 
       will produce the same results shown in example (1), 
       since strings containing integer codes are accepted 
       by this routine. 
 
 
   4) The call  
 
         bodvrd_c ( "EARTH", "radii", 3, &dim, values ); 
 
      usually will cause a SPICE(KERNELVARNOTFOUND) error to be 
      signaled, because this call will attempt to look up the 
      values associated with a kernel variable of the name 
 
         "BODY399_radii" 
 
      Since kernel variable names are case sensitive, this 
      name is not considered to match the name 
 
         "BODY399_RADII" 
 
      which normally would be present after a text PCK 
      containing data for all planets and satellites has  
      been loaded. 
  
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman    (JPL) 
   B.V. Semenov    (JPL) 
   W.L. Taber      (JPL) 
   I.M. Underwood  (JPL) 
 
-Version
 
   -CSPICE Version 1.0.1, 12-APR-2006 (NJB)

       Header fix:  output argument `dim' is now preceded by
       an ampersand in example calls to bodvrd_c.c.

   -CSPICE Version 1.0.0, 22-FEB-2004 (NJB)

-Index_Entries
 
   fetch constants for a body from the kernel pool 
   physical constants for a body 
 
-&
*/

{ /* Begin bodvrd_c */


   /*
   Participate in error tracing.
   */
   if ( return_c() )
   {
      return;
   }
   chkin_c ( "bodvrd_c" );


   /*
   Check the input strings.
   */
   CHKFSTR ( CHK_STANDARD, "bodvrd_c", bodynm );
   CHKFSTR ( CHK_STANDARD, "bodvrd_c", item   );


   /*
   Call the f2c'd SPICELIB function.
   */
   bodvrd_ ( (char       *) bodynm,
             (char       *) item,
             (integer    *) &maxn,
             (integer    *) dim,
             (doublereal *) values,
             (ftnlen      ) strlen(bodynm),
             (ftnlen      ) strlen(item)    );

   chkout_c ( "bodvrd_c" );

} /* End bodvrd_c */
示例#14
0
   void ekbseg_c ( SpiceInt           handle,
                   ConstSpiceChar   * tabnam,
                   SpiceInt           ncols,
                   SpiceInt           cnmlen,
                   const void       * cnames,
                   SpiceInt           declen,
                   const void       * decls,
                   SpiceInt         * segno  ) 
/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   File handle. 
   tabnam     I   Table name. 
   ncols      I   Number of columns in the segment. 
   cnmlen     I   Length of names in in column name array.
   cnames     I   Names of columns. 
   declen     I   Length of declaration strings in declaration array.
   decls      I   Declarations of columns. 
   segno      O   Segment number. 
  
-Detailed_Input
 
   handle         the handle of an EK file that is open for writing. 
 
   tabnam         is the name of the EK table to which the current 
                  segment belongs.  All segments in the EK file 
                  designated by handle must have identical column 
                  attributes. tabnam must not exceed SPICE_EK_TNAMSZ
                  characters (see SpiceEK.h) in length.  Case is not 
                  significant. Table names must start with a letter and
                  contain only characters from the set
                  {A-Z,a-z,0-9,$,_}. 
 
   ncols          is the number of columns in a new segment. 

   cnmlen,
   cnames         are, respectively, the length of the column name
                  strings in the column name array, and the base
                  address of the array itself.  The array should have
                  dimensions
                  
                     [ncols][cnmlen]
                     
   declen,
   decls          are, respectively, the length of the declaration
                  strings in the declaration array, and the base 
                  address of the array itself.  The array should have
                  dimensions
                  
                     [ncols][declen]
                      
                  The Ith element of cnames and the Ith element of decls
                  apply to the Ith column in the segment. 
 
                  Column names must not exceed CSPICE_EK_CNAMSZ
                  characters (see SpiceEK.h) in length.  Case is not
                  significant.  Column names must start with a letter 
                  and contain only characters from the set 
                  {A-Z,a-z,0-9,$,_}. 
 
                  The declarations are strings that contain 
                  "keyword=value" assignments that define the 
                  attributes of the columns to which they apply.  The 
                  column attributes that are defined by a column 
                  declaration are: 
 
                     DATATYPE 
                     SIZE 
                     <is the column indexed?> 
                     <does the column allow null values?> 
 
                  The form of a declaration is 
 
                     "DATATYPE  = <type>, 
                      SIZE      = <size>, 
                      INDEXED   = <boolean>, 
                      NULLS_OK  = <boolean>" 
 
                  For example, an indexed, scalar, integer column 
                  that allows null values would have the declaration 
 
                     "DATATYPE  = INTEGER, 
                      SIZE      = 1, 
                      INDEXED   = TRUE, 
                      NULLS_OK  = TRUE" 
 
                  Commas are required to separate the assignments 
                  within declarations; white space is optional; 
                  case is not significant. 
 
                  The order in which the attribute keywords are 
                  listed in declaration is not significant. 
 
                  Every column in a segment must be declared. 
 
                  Each column entry is effectively an array, each 
                  element of which has the declared data type.  The 
                  SIZE keyword indicates how many elements are in 
                  each entry of the column in whose declaration the 
                  keyword appears.  Note that only scalar-valued 
                  columns (those for which SIZE = 1) may be 
                  referenced in query constraints.  A size 
                  assignment has the syntax 
 
                     SIZE = <integer> 
 
                  or 
                     SIZE = VARIABLE 
 
                  The size value defaults to 1 if omitted. 
 
                  The DATATYPE keyword defines the data type of 
                  column entries.  The DATATYPE assignment syntax 
                  has any of the forms 
 
                     DATATYPE = CHARACTER*(<length>) 
                     DATATYPE = CHARACTER*(*) 
                     DATATYPE = DOUBLE PRECISION 
                     DATATYPE = INTEGER 
                     DATATYPE = TIME 
 
                  As the datatype declaration syntax suggests, 
                  character strings may have fixed or variable 
                  length.  Variable-length strings are allowed only 
                  in columns of size 1. 
 
                  Optionally, scalar-valued columns may be indexed. 
                  To create an index for a column, use the assignment 
 
                     INDEXED = TRUE 
 
                  By default, columns are not indexed. 
 
                  Optionally, any column can allow null values.  To 
                  indicate that a column may allow null values, use 
                  the assigment 
 
                     NULLS_OK = TRUE 
 
                  in the column declaration.  By default, null 
                  values are not allowed in column entries. 

  


-Detailed_Output
 
   segno          is the number of the segment to which data is to be
                  added. Segments are numbered from 0 to nseg-1, where
                  nseg is the count of segments in the file.  Segment
                  numbers are used as unique identifiers by other EK
                  access routines.
  
-Parameters
 
   None. 
 
-Exceptions
 
   1)  If handle is invalid, the error will be diagnosed by routines 
       called by this routine. 
 
   2)  If tabnam is more than SPICE_EK_TNAMSZ characters long, the 
       error is diagnosed by routines called by this routine. 
 
   3)  If tabnam contains any nonprintable characters, the error 
       is diagnosed by routines called by this routine. 
 
   4)  If ncols is non-positive or greater than the maximum allowed 
       number SPICE_EK_MXCLSG, the error SPICE(INVALIDCOUNT) is 
       signaled. 
 
   5)  If any column name exceeds SPICE_EK_CNAMSZ characters in 
       length, the error is diagnosed by routines called by this 
       routine. 
 
   6)  If any column name contains non-printable characters, the 
       error is diagnosed by routines called by this routine. 
 
   7)  If a declaration cannot be understood by this routine, the 
       error is diagnosed by routines called by this routine. 
 
   8)  If an non-positive string length or element size is specified, 
       the error is diagnosed by routines called by this routine. 
 
   9)  If an I/O error occurs while reading or writing the indicated 
       file, the error will be diagnosed by routines called by this 
       routine. 

   10) If the input string pointer for the table name is null, the 
       error SPICE(NULLPOINTER) will be signaled.
      
   12) If the input tablen name string has length zero, the error 
       SPICE(EMPTYSTRING) will be signaled.
 
   13) If the string pointer for cnames is null, the error
       SPICE(NULLPOINTER) will be signaled.
   
   14) If the string length cnmlen is less than 2, the error 
       SPICE(STRINGTOOSHORT) will be signaled.

   15) If the string pointer for decls is null, the error
       SPICE(NULLPOINTER) will be signaled.
   
   16) If the string length declen is less than 2, the error 
       SPICE(STRINGTOOSHORT) will be signaled.
   
-Files
 
   See the EK Required Reading for a discussion of the EK file 
   format. 
 
-Particulars
 
   This routine operates by side effects:  it prepares an EK for 
   the addition of a new segment.  It is not necessary to take 
   any special action to `complete' a segment; segments are readable 
   after the completion of any record insertion, deletion, write, 
   or update operation. 
 
-Examples
 
   1)  Suppose we have an E-kernel named ORDER_DB.EK which contains 
       records of orders for data products.  The E-kernel has a 
       table called DATAORDERS that consists of the set of columns 
       listed below: 
 
          DATAORDERS 
 
             Column Name     Data Type 
             -----------     --------- 
             ORDER_ID        INTEGER 
             CUSTOMER_ID     INTEGER 
             LAST_NAME       CHARACTER*(*) 
             FIRST_NAME      CHARACTER*(*) 
             ORDER_DATE      TIME 
             COST            DOUBLE PRECISION 
 
       The order database also has a table of items that have been 
       ordered.  The columns of this table are shown below: 
 
          DATAITEMS 
 
             Column Name     Data Type 
             -----------     --------- 
             ITEM_ID         INTEGER 
             ORDER_ID        INTEGER 
             ITEM_NAME       CHARACTER*(*) 
             DESCRIPTION     CHARACTER*(*) 
             PRICE           DOUBLE PRECISION 
 
 
       We'll suppose that the file ORDER_DB.EK contains two segments, 
       the first containing the DATAORDERS table and the second 
       containing the DATAITEMS table. 
 
       Below, we show how we'd open a new EK file and start the 
       first of the segments described above. 
 
       
       #include "SpiceUsr.h"
       #include <stdio.h>
       
       
       void main()
       {
          /.
          Constants
          ./
          #define  CNMLEN        SPICE_EK_CSTRLN
          #define  DECLEN        201
          #define  EKNAME        "order_db.ek"
          #define  FNMLEN        50
          #define  IFNAME        "Test EK/Created 20-SEP-1995"
          #define  LNMLEN        50
          #define  LSK           "leapseconds.ker"
          #define  NCOLS         6
          #define  NRESVC        0
          #define  TABLE         "DATAORDERS"
          #define  TNMLEN        CSPICE_EK_TAB_NAM_LEN
          #define  UTCLEN        30
          
          
          /.
          Local variables
          ./
          SpiceBoolean            nlflgs [ NROWS  ];
       
          SpiceChar               cdecls  [ NCOLS ] [ DECLEN ];
          SpiceChar               cnames  [ NCOLS ] [ CNMLEN ];
          SpiceChar               fnames  [ NROWS ] [ FNMLEN ];
          SpiceChar               lnames  [ NROWS ] [ LNMLEN ];
          SpiceChar               dateStr [ UTCLEN ];
        
          SpiceDouble             costs  [ NROWS ];
          SpiceDouble             ets    [ NROWS ];
       
          SpiceInt                cstids [ NROWS ];
          SpiceInt                ordids [ NROWS ];
          SpiceInt                handle;
          SpiceInt                i;
          SpiceInt                segno;
          SpiceInt                sizes  [ NROWS ];
          
          
          /.
          Load a leapseconds kernel for UTC/ET conversion.
          ./
          furnsh_c ( LSK );
          
          /.
          Open a new EK file.  For simplicity, we will not 
          reserve any space for the comment area, so the 
          number of reserved comment characters is zero. 
          The constant IFNAME is the internal file name. 
          ./
          ekopn_c ( EKNAME, IFNAME, NRESVC, &handle );
       
          /.
          Set up the table and column names and declarations 
          for the DATAORDERS segment.  We'll index all of 
          the columns.  All columns are scalar, so we omit 
          the size declaration.  Only the COST column may take 
          null values. 
          ./
          strcpy ( cnames[0], "ORDER_ID"                           );
          strcpy ( cdecls[0], "DATATYPE = INTEGER, INDEXED = TRUE" );
       
          strcpy ( cnames[1], "CUSTOMER_ID"                        );
          strcpy ( cdecls[1], "DATATYPE = INTEGER, INDEXED = TRUE" );
       
          strcpy ( cnames[2], "LAST_NAME"                          ); 
          strcpy ( cdecls[2], "DATATYPE = CHARACTER*(*),"
                              "INDEXED  = TRUE"                    );
       
          strcpy ( cnames[3], "FIRST_NAME"                         );
          strcpy ( cdecls[3], "DATATYPE = CHARACTER*(*),"   
                              "INDEXED  = TRUE"                    );
       
          strcpy ( cnames[4], "ORDER_DATE"                         );
          strcpy ( cdecls[4], "DATATYPE = TIME, INDEXED  = TRUE"   );
       
          strcpy ( cnames[5], "COST"                               );
          strcpy ( cdecls[5], "DATATYPE = DOUBLE PRECISION,"   
                              "INDEXED  = TRUE,"             
                              "NULLS_OK = TRUE"                    );
          /.
          Start the segment. 
          ./
          ekbseg_c ( handle,  TABLE,   NCOLS,   CNMLEN,  
                     cnames,  DECLEN,  cdecls,  &segno  );

          /. 
          Add data to the segment.  No special action 
          is required to finish the segment. 
          ./
             [Data are added via calls to ekappr_c and the 
              ekacec_c, ekaced_c, and ekacei_c routines.  See any 
              of these routines for examples.] 
 
          /.
          At this point, the second segment could be 
          created by an analogous process.  In fact, the 
          second segment could be created at any time; it is 
          not necessary to populate the first segment with 
          data before starting the second segment. 
          ./ 

 
          /. 
          The file must be closed by a call to ekcls_c. 
          ./
          ekcls_c ( handle ); 
       }
  
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
 
-Version
 
   -CSPICE Version 1.1.0, 12-JUL-2002 (NJB)

      Call to C2F_CreateStrArr_Sig replaced with call to C2F_MapStrArr.

   -CSPICE Version 1.0.0, 17-NOV-2001 (NJB)

-Index_Entries
 
   start new E-kernel segment 
   start new EK segment 
 
-&
*/

{ /* Begin ekbseg_c */



   /*
   Local variables
   */
   SpiceChar             * fCnameArr;
   SpiceChar             * fCdeclArr;

   SpiceInt                fCnameLen;
   SpiceInt                fCdeclLen;

   /*
   Participate in error tracing.
   */
   chkin_c ( "ekbseg_c" );

   /*
   Check the table name to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ekbseg_c", tabnam );

   /*
   Check the column name array to make sure the pointer is non-null 
   and the string length is non-zero.  Note:  this check is normally
   done for output strings:  CHKOSTR is the macro that does the job.
   */
   CHKOSTR ( CHK_STANDARD, "ekbseg_c", cnames, cnmlen );

   /*
   Check the declaration array to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKOSTR ( CHK_STANDARD, "ekbseg_c", decls, declen );

   C2F_MapStrArr ( "ekbseg_c", 
                   ncols, cnmlen, cnames, &fCnameLen, &fCnameArr );
   
   if ( failed_c() )
   {
      chkout_c ( "ekbseg_c" );
      return;
   }


   C2F_MapStrArr ( "ekbseg_c", 
                   ncols, declen, decls, &fCdeclLen, &fCdeclArr );
   
   if ( failed_c() )
   {
      free ( fCnameArr );
      
      chkout_c ( "ekbseg_c" );
      return;
   }
   

   /*
   Call the f2c'd Fortran routine.  Use explicit type casts for every
   type defined by f2c.
   */
   ekbseg_ ( ( integer  * ) &handle,
             ( char     * ) tabnam,
             ( integer  * ) &ncols,
             ( char     * ) fCnameArr,
             ( char     * ) fCdeclArr,
             ( integer  * ) segno,
             ( ftnlen     ) strlen(tabnam),
             ( ftnlen     ) fCnameLen,
             ( ftnlen     ) fCdeclLen       );

   /*
   Clean up all of our dynamically allocated arrays.
   */
   free ( fCnameArr );
   free ( fCdeclArr );

   /*
   Map segno to C style range.
   */
   
   (*segno)--;
   
   
   chkout_c ( "ekbseg_c" );

} /* End ekbseg_c */
示例#15
0
文件: gfuds_c.c 项目: haisamido/GMAT
   void gfuds_c (  void             ( * udfunc ) ( SpiceDouble       et,
                                                   SpiceDouble     * value ),

                   void             ( * udqdec ) ( void ( * udfunc ) 
                                                        ( SpiceDouble   et,
                                                          SpiceDouble * value ),

                                                   SpiceDouble       et,
                                                   SpiceBoolean    * isdecr ),

                   ConstSpiceChar     * relate,
                   SpiceDouble          refval,
                   SpiceDouble          adjust,
                   SpiceDouble          step,
                   SpiceInt             nintvls,
                   SpiceCell          * cnfine,
                   SpiceCell          * result )

/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------

   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.
   nintvls    I   Workspace window interval count
   cnfine    I-O  SPICE window to which the search is restricted.
   result     O   SPICE window containing results.
 
-Detailed_Input

   udfunc     the name of the external routine that returns the 
              value of the scalar quantity of interest at time ET.
              The calling sequence for "udfunc" is:

                 udfunc ( et, &value )

              where:

                 et      an input double precision value 
                         representing the TDB ephemeris seconds time 
                         at which to determine the scalar value.

                 value   is the value of the geometric quantity 
                         at 'et'.

   udqdec     the name of the external routine that determines if
              the scalar quantity calculated by "udfunc" is decreasing.

              The calling sequence:

                 udqdec ( et, &isdecr )

              where:

                 et       an input double precision value representing
                          the TDB ephemeris seconds time at at which
                          to determine the time derivative of 'udfunc'.

                 isdecr   a logical variable 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 

              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 SPICE_GF_CNVTOL for
              details.

              'step' has units of TDB seconds.

   nintvls    an integer value specifying the number of intervals in the 
              the internal workspace array used by this routine. 'nintvls'
              should be at least as large as the number of intervals
              within the search region on which the specified observer-target
              vector coordinate function is monotone increasing or decreasing. 
              It does no harm to pick a value of 'nintvls' larger than the
              minimum required to execute the specified search, but if chosen 
              too small, the search will fail.

   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.

-Detailed_Output
 
   cnfine     is the input confinement window, updated if necessary
              so the control area of its data array indicates the
              window's size and cardinality. The window data are
              unchanged.

   result     is a SPICE window representing the set of time 
              intervals, within the confinement period, when the 
              specified geometric event occurs. 
 
              If `result' is non-empty on input, its contents 
              will be discarded before gfuds_c conducts its 
              search. 
 
-Parameters
 
   None.
 
-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, an error is signaled 
       by a routine in the call tree of this routine. 
 
   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_c can be used to contract the result window. 
 
   3)  If an error (typically cell overflow) occurs while performing  
       window arithmetic, the error will be diagnosed by a routine 
       in the call tree of this routine. 
 
   4)  If the relational operator `relate' is not recognized, an  
       error is signaled by a routine in the call tree of this 
       routine. 
       
   5)  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. 
  
   6)  If required ephemerides or other kernel data are not 
       available, an error is signaled by a routine in the call tree 
       of this routine. 
 
   7)  If the workspace interval count is less than 1, the error
       SPICE(VALUEOUTOFRANGE) will be signaled.

   8)  If the required amount of workspace memory cannot be
       allocated, the error SPICE(MALLOCFAILURE) will be
       signaled.

   9)  If any input string argument pointer is null, the error
       SPICE(NULLPOINTER) will be signaled.

   10) If any input string argument is empty, the error 
       SPICE(EMPTYSTRING) will be signaled.

   11) If either input cell has type other than SpiceDouble,
       the error SPICE(TYPEMISMATCH) is signaled.

-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_c.

      - 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 provides a simpler, but less flexible interface
   than does the routine zzgfrel_ for conducting searches for events
   corresponding to an arbitrary user defined scalar quantity 
   function. Applications that require support for progress 
   reporting, interrupt handling, non-default step or refinement
   functions, or non-default convergence tolerance should call
   zzgfrel_ rather than this routine.

   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_c determines the truth of the expression

      d (udfunc)
      --         < 0
      dt

   using the library routine uddf_c to numerically calculate the
   derivative of udfunc using a three-point estimation. Use
   of gfdecr requires only changing the "udfunc" argument
   to that of the user provided scalar function passed to gfuds_c
   and defining the differential interval size, 'dt'. Please see 
   the Examples section for an example of gfdecr use.

   void gfdecr ( SpiceDouble et, SpiceBoolean * isdecr )
      {

      SpiceDouble         dt = h, double precision interval size;

      uddc_c( udfunc, uddf_c, et, dt, isdecr );

      return;
      }

   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 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 convergence tolerance used by this 
   routine is set via the parameter SPICE_GF_CNVTOL. 

   The value of SPICE_GF_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. 
   
   Making the tolerance tighter than SPICE_GF_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:

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>

   #include "SpiceUsr.h"
   #include "SpiceZfc.h"
   #include "SpiceZad.h"


   #define       MAXWIN    20000
   #define       TIMFMT    "YYYY-MON-DD HR:MN:SC.###"
   #define       TIMLEN    41
   #define       NLOOPS    7

   void    gfq     ( SpiceDouble et, SpiceDouble * value );
   void    gfdecrx ( void ( * udfunc ) ( SpiceDouble    et,
                                         SpiceDouble  * value ),
                     SpiceDouble    et, 
                     SpiceBoolean * isdecr );

   doublereal dvnorm_(doublereal *state);


   int main( int argc, char **argv )
      {

      /.
      Create the needed windows. Note, one interval
      consists of two values, so the total number
      of cell values to allocate is twice
      the number of intervals.
      ./
      SPICEDOUBLE_CELL ( result, 2*MAXWIN );
      SPICEDOUBLE_CELL ( cnfine, 2        );

      SpiceDouble       begtim;
      SpiceDouble       endtim;
      SpiceDouble       step;
      SpiceDouble       adjust;
      SpiceDouble       refval;
      SpiceDouble       beg;
      SpiceDouble       end;

      SpiceChar         begstr [ TIMLEN ];
      SpiceChar         endstr [ TIMLEN ];
      
      SpiceInt          count;
      SpiceInt          i;
      SpiceInt          j;

      ConstSpiceChar * relate [NLOOPS] = { "=",
                                           "<",
                                           ">",
                                           "LOCMIN",
                                           "ABSMIN",
                                           "LOCMAX",
                                           "ABSMAX"
                                         };

      printf( "Compile date %s, %s\n\n", __DATE__, __TIME__ );

      /.  
      Load kernels.
      ./
      furnsh_c( "standard.tm" );
   
      /.  
      Store the time bounds of our search interval in the 'cnfine' 
      confinement window.
      ./
      str2et_c( "2007 JAN 01", &begtim );
      str2et_c( "2007 APR 01", &endtim );
   
      wninsd_c ( begtim, endtim, &cnfine );

      /.  
      Search using a step size of 1 day (in units of seconds). The reference
      value is .3365 km/s. We're not using the adjustment feature, so
      we set 'adjust' to zero.
      ./
      step   = spd_c();
      adjust = 0.;
      refval = .3365;

      for ( j = 0;  j < NLOOPS;  j++ )
         {

         printf ( "Relation condition: %s \n",  relate[j] );

         /.
         Perform the search. The SPICE window 'result' contains 
         the set of times when the condition is met. 
         ./

         gfuds_c ( gfq, 
                   gfdecrx,
                   relate[j],
                   refval,
                   adjust,
                   step,
                   MAXWIN,
                   &cnfine,
                   &result );

         count = wncard_c( &result );

         /.
         Display the results.
         ./
         if (count == 0 ) 
            {
            printf ( "Result window is empty.\n\n" );
            }
         else
            {
            for ( i = 0;  i < count;  i++ )
               {

               /.
               Fetch the endpoints of the Ith interval
               of the result window.
               ./
               wnfetd_c ( &result, i, &beg, &end );

               timout_c ( beg, TIMFMT, TIMLEN, begstr ); 
               timout_c ( end, TIMFMT, TIMLEN, endstr );

               printf ( "Start time, drdt = %s \n", begstr );
               printf ( "Stop time,  drdt = %s \n", endstr );

               }
               
            }

         printf("\n");
         
         }

      kclear_c();
      return( 0 );
      }



   /.
   The user defined functions required by GFUDS.
      
      gfq    for udfunc
      gfdecr for udqdec
   ./



   /.
   -Procedure Procedure gfq
   ./

   void gfq ( SpiceDouble et, SpiceDouble * value )

   /.
   -Abstract

      User defined geometric quantity function. In this case,
      the range from the sun to the Moon at TDB time 'et'.
   
   ./
      {
      
      /. Initialization ./
      SpiceInt             targ   = 301;
      SpiceInt             obs    = 10;

      SpiceChar          * ref    = "J2000";
      SpiceChar          * abcorr = "NONE";

      SpiceDouble          state [6];
      SpiceDouble          lt;

      /.
      Retrieve the vector from the Sun to the Moon in the J2000 
      frame, without aberration correction.
      ./
      spkez_c ( targ, et, ref, abcorr, obs, state, &lt );

      /.
      Calculate the scalar range rate corresponding the
     'state' vector.   
      ./

      *value = dvnorm_( state );

      return;
      }



   /.
   -Procedure gfdecrx
   ./
   
   void gfdecrx ( void ( * udfunc ) ( SpiceDouble    et,
                                      SpiceDouble  * value ),
                  SpiceDouble    et, 
                  SpiceBoolean * isdecr )

   /.
   -Abstract

      User defined function to detect if the function derivative
      is negative (the function is decreasing) at TDB time 'et'.
   ./
      {
         
      SpiceDouble         dt = 10.;
     
      /.
      Determine if "udfunc" is decreasing at 'et'.

      uddc_c - the GF function to determine if
                 the derivative of the user defined
                 function is negative at 'et'.

      uddf_c   - the SPICE function to numerically calculate the 
                 derivative of 'udfunc' at 'et' for the 
                 interval [et-dt, et+dt].
      ./

      uddc_c( udfunc, et, dt, isdecr );

      return;
      }


   The program outputs:

      Relation condition: = 
      Start time, drdt = 2007-JAN-02 00:35:19.574 
      Stop time,  drdt = 2007-JAN-02 00:35:19.574 
      Start time, drdt = 2007-JAN-19 22:04:54.899 
      Stop time,  drdt = 2007-JAN-19 22:04:54.899 
      Start time, drdt = 2007-FEB-01 23:30:13.428 
      Stop time,  drdt = 2007-FEB-01 23:30:13.428 
      Start time, drdt = 2007-FEB-17 11:10:46.540 
      Stop time,  drdt = 2007-FEB-17 11:10:46.540 
      Start time, drdt = 2007-MAR-04 15:50:19.929 
      Stop time,  drdt = 2007-MAR-04 15:50:19.929 
      Start time, drdt = 2007-MAR-18 09:59:05.959 
      Stop time,  drdt = 2007-MAR-18 09:59:05.959 
      
      Relation condition: < 
      Start time, drdt = 2007-JAN-02 00:35:19.574 
      Stop time,  drdt = 2007-JAN-19 22:04:54.899 
      Start time, drdt = 2007-FEB-01 23:30:13.428 
      Stop time,  drdt = 2007-FEB-17 11:10:46.540 
      Start time, drdt = 2007-MAR-04 15:50:19.929 
      Stop time,  drdt = 2007-MAR-18 09:59:05.959 
      
      Relation condition: > 
      Start time, drdt = 2007-JAN-01 00:00:00.000 
      Stop time,  drdt = 2007-JAN-02 00:35:19.574 
      Start time, drdt = 2007-JAN-19 22:04:54.899 
      Stop time,  drdt = 2007-FEB-01 23:30:13.428 
      Start time, drdt = 2007-FEB-17 11:10:46.540 
      Stop time,  drdt = 2007-MAR-04 15:50:19.929 
      Start time, drdt = 2007-MAR-18 09:59:05.959 
      Stop time,  drdt = 2007-APR-01 00:00:00.000 
      
      Relation condition: LOCMIN 
      Start time, drdt = 2007-JAN-11 07:03:58.988 
      Stop time,  drdt = 2007-JAN-11 07:03:58.988 
      Start time, drdt = 2007-FEB-10 06:26:15.439 
      Stop time,  drdt = 2007-FEB-10 06:26:15.439 
      Start time, drdt = 2007-MAR-12 03:28:36.404 
      Stop time,  drdt = 2007-MAR-12 03:28:36.404 
      
      Relation condition: ABSMIN 
      Start time, drdt = 2007-JAN-11 07:03:58.988 
      Stop time,  drdt = 2007-JAN-11 07:03:58.988 
      
      Relation condition: LOCMAX 
      Start time, drdt = 2007-JAN-26 02:27:33.766 
      Stop time,  drdt = 2007-JAN-26 02:27:33.766 
      Start time, drdt = 2007-FEB-24 09:35:07.816 
      Stop time,  drdt = 2007-FEB-24 09:35:07.816 
      Start time, drdt = 2007-MAR-25 17:26:56.150 
      Stop time,  drdt = 2007-MAR-25 17:26:56.150 
      
      Relation condition: ABSMAX 
      Start time, drdt = 2007-MAR-25 17:26:56.150 
      Stop time,  drdt = 2007-MAR-25 17:26:56.150 

-Restrictions

   1) Any kernel files required by this routine must be loaded
      before this routine is called.

-Literature_References

   None.

-Author_and_Institution

   N.J. Bachman   (JPL)
   E.D. Wright    (JPL)
 
-Version

   -CSPICE Version 1.0.0, 22-FEB-2010 (EDW) 

-Index_Entries

   GF user defined scalar function search

-&
*/

  { /* Begin gfuds_c */

   /*
   Local variables 
   */
   
   doublereal              * work;

   static SpiceInt           nw = SPICE_GF_NWMAX;

   SpiceInt                  nBytes;


   /*
   Participate in error tracing.
   */
   if ( return_c() )
     {
      return;
      }
   chkin_c ( "gfuds_c" );


   /*
   Make sure cell data types are d.p. 
   */
   CELLTYPECHK2 ( CHK_STANDARD, "gfuds_c", SPICE_DP, cnfine, result );

   /* 
   Initialize the input cells if necessary. 
   */
   CELLINIT2 ( cnfine, result );

   /*
   Check the other input strings to make sure each pointer is non-null 
   and each string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "gfuds_c", relate );

   /*
   Store the input function pointers so these functions can be
   called by the GF adapters. 
   */
   zzadsave_c ( UDFUNC,  (void *)(udfunc)  );
   zzadsave_c ( UDQDEC,  (void *)(udqdec)  );

   /*
   Check the workspace size; some mallocs have a violent
   dislike for negative allocation amounts. To be safe,
   rule out a count of zero intervals as well.
   */

   if ( nintvls < 1 )
      {
      setmsg_c ( "The specified workspace interval count # was "
                 "less than the minimum allowed value of one (1)." );
      errint_c ( "#",  nintvls                              );
      sigerr_c ( "SPICE(VALUEOUTOFRANGE)"                   );
      chkout_c ( "gfuds_c"                                  );
      return;
      } 
      

   /*
   Allocate the workspace. 'nintvls' indicates the maximum number of
   intervals returned in 'result'. An interval consists of
   two values.
   */

   nintvls = 2 * nintvls;
   
   nBytes = (nintvls + SPICE_CELL_CTRLSZ ) * nw * sizeof(SpiceDouble);

   work   = (doublereal *) alloc_SpiceMemory( nBytes );

   if ( !work ) 
      {
      setmsg_c ( "Workspace allocation of # bytes failed due to "
                 "malloc failure"                               );
      errint_c ( "#",  nBytes                                   );
      sigerr_c ( "SPICE(MALLOCFAILED)"                          );
      chkout_c ( "gfuds_c"                                      );
      return;
      }


   /*
   Let the f2c'd routine do the work. 

   We pass the adapter functions, not those provided as inputs,
   to the f2c'd routine:

      zzadfunc_c  adapter for  udfunc
      zzadqdec_c     ''        udqdec

   */

   (void) gfuds_( ( U_fp            ) zzadfunc_c,
                  ( U_fp            ) zzadqdec_c,
                  ( char          * ) relate,
                  ( doublereal    * ) &refval,
                  ( doublereal    * ) &adjust,
                  ( doublereal    * ) &step,
                  ( doublereal    * ) (cnfine->base),
                  ( integer       * ) &nintvls,
                  ( integer       * ) &nw,
                  ( doublereal    * ) work,
                  ( doublereal    * ) (result->base),
                  ( ftnlen          ) strlen(relate) );


   /*
   Always free dynamically allocated memory.
   */
   free_SpiceMemory( work );

   /*
   Sync the output cell.
   */
   if ( !failed_c() )
     {
     zzsynccl_c ( F2C, result );
     }

   ALLOC_CHECK;

   chkout_c ( "gfuds_c" );

   } /* End gfuds_c */
示例#16
0
   void pxform_c ( ConstSpiceChar   * from,
                   ConstSpiceChar   * to,
                   SpiceDouble        et,
                   SpiceDouble        rotate[3][3] )
 
/*
 
-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   from       I   Name of the frame to transform from.
   to         I   Name of the frame to transform to.
   et         I   Epoch of the rotation matrix.
   rotate     O   A rotation matrix.
 
-Detailed_Input
 
   from        is the name of a reference frame in which a position
               vector is known.
 
   to          is the name of a reference frame in which it is desired
               to represent a position vector.
 
   et          is the epoch in ephemeris seconds past the epoch of
               J2000 (TDB) at which the position transformation matrix
               `rotate' should be evaluated.
 
-Detailed_Output
 
   rotate      is the matrix that transforms position vectors from the
               reference frame `from' to the frame `to' at epoch `et'.
               If (x, y, z) is a position relative to the frame `from'
               then the vector ( x', y', z') is the same position
               relative to the frame `to' at epoch `et'.  Here the
               vector ( x', y', z' ) is defined by the equation:
 
                   -   -       -        -     -  -
                  | x'  |     |          |   | x  |
                  | y'  |  =  |  rotate  |   | y  |
                  | z'  |     |          |   | z  |
                   -   -       -        -     -  - 
-Parameters
 
   None.
 
-Exceptions
 
   1) If sufficient information has not been supplied via loaded SPICE
      kernels to compute the transformation between the two frames, the
      error will be diagnosed by a routine in the call tree of this
      routine.
 
   2) If either frame `from' or `to' is not recognized the error
      SPICE(UNKNOWNFRAME) will be signaled.
 
-Files
 
   None.
 
-Particulars
 
   This routine provides the user level interface to computing
   position transformations from one reference frame to another.
 
   Note that the reference frames may be inertial or non-inertial.
   However, the user must take care that sufficient SPICE kernel
   information is loaded to provide a complete position
   transformation path from the from frame to the to frame.
 
-Examples
 
   Suppose that you have geodetic coordinates of a station on the
   surface of the earth and that you need the inertial (J2000)
   position of this station.  The following code fragment
   illustrates how to transform the position of the station to a
   J2000 position.
 
      #include "SpiceUsr.h"
            .
            .
            .
      bodvcd_c ( 399, radii, 3, &n, abc );
 
      equatr   =  abc[0];
      polar    =  abc[2];
      f        =  ( equatr - polar ) / equatr;
 
      georec_c ( long,        lat,      0.0,   equatr,   f,   epos );
      pxform_c ( "IAU_EARTH", "J2000",  et,    rotate              );
      mxv_c    (  rotate,   epos,     jpos                         );
 
 
   The position jpos is the desired J2000 position of the station.
 
-Restrictions
 
   None.
 
-Literature_References
 
    None.
 
-Author_and_Institution
 
   C.H. Acton      (JPL)
   N.J. Bachman    (JPL)
   B.V. Semenov    (JPL)
   W.L. Taber      (JPL)
 
-Version
 
   -CSPICE Version 1.0.4, 27-FEB-2008 (BVS)

       Added FRAMES to the Required_Reading section of the header.

   -CSPICE Version 1.0.3, 24-OCT-2005 (NJB)

       Header updates: example had invalid flattening factor
       computation; this was corrected.  Reference to bodvar_c was
       replaced with reference to bodvcd_c.

   -CSPICE Version 1.0.2, 07-JAN-2004 (EDW)

       Trivial typo correction to example section.

   -CSPICE Version 1.0.1, 29-JUL-2003 (NJB) (CHA)

       Various header corrections were made.   
   
   -CSPICE Version 1.0.0, 20-JUN-1999 (NJB) (WLT)
 
-Index_Entries
 
   Find a position transformation matrix
 
-&
*/
 
{ /* Begin pxform_c */
 
 
   /*
   Participate in error tracing.
   */
   chkin_c ( "pxform_c" );
 
 
   /*
   Check the input strings to make sure the pointers are non-null
   and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "pxform_c", from );
   CHKFSTR ( CHK_STANDARD, "pxform_c", to   );
 
   /*
   Call the f2c'd routine.
   */
   pxform_ ( ( char       * ) from,
             ( char       * ) to,
             ( doublereal * ) &et,
             ( doublereal * ) rotate,
             ( ftnlen       ) strlen(from),
             ( ftnlen       ) strlen(to)    );
 
 
   /*
   Transpose the output to obtain row-major order.
   */
   xpose_c ( rotate, rotate );
   
   
   chkout_c ( "pxform_c" );
 
} /* End pxform_c */
示例#17
0
文件: ckcov_c.c 项目: haisamido/GMAT
   void ckcov_c ( ConstSpiceChar    * ck,
                  SpiceInt            idcode,
                  SpiceBoolean        needav,
                  ConstSpiceChar    * level,
                  SpiceDouble         tol,
                  ConstSpiceChar    * timsys,
                  SpiceCell         * cover   ) 
/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   ck         I   Name of CK file. 
   idcode     I   ID code of object. 
   needav     I   Flag indicating whether angular velocity is needed. 
   level      I   Coverage level:  "SEGMENT" OR "INTERVAL". 
   tol        I   Tolerance in ticks. 
   timsys     I   Time system used to represent coverage. 
   cover     I/O  Window giving coverage for `idcode'. 
 
-Detailed_Input
 
   ck             is the name of a C-kernel. 
    
   idcode         is the integer ID code of an object, normally a
                  spacecraft structure or instrument, for which
                  pointing data are expected to exist in the specified
                  CK file.
 
   needav         is a logical variable indicating whether only
                  segments having angular velocity are to be considered
                  when determining coverage.  When `needav' is
                  SPICETRUE, segments without angular velocity don't
                  contribute to the coverage window; when `needav' is
                  SPICEFALSE, all segments for `idcode' may contribute
                  to the coverage window.
 
 
   level          is the level (granularity) at which the coverage 
                  is examined.  Allowed values and corresponding 
                  meanings are: 
 
                     "SEGMENT"    The output coverage window contains
                                  intervals defined by the start and
                                  stop times of segments for the object
                                  designated by `idcode'.
 
                     "INTERVAL"   The output coverage window contains
                                  interpolation intervals of segments
                                  for the object designated by
                                  `idcode'.  For type 1 segments, which
                                  don't have interpolation intervals,
                                  each epoch associated with a pointing
                                  instance is treated as a singleton
                                  interval; these intervals are added
                                  to the coverage window.

                                  All interpolation intervals are
                                  considered to lie within the segment
                                  bounds for the purpose of this
                                  summary:  if an interpolation
                                  interval extends beyond the segment
                                  coverage interval, only its
                                  intersection with the segment
                                  coverage interval is considered to
                                  contribute to the total coverage.
 
   tol            is a tolerance value expressed in ticks of the
                  spacecraft clock associated with IDCODE.  Before each
                  interval is inserted into the coverage window, the
                  interval is intersected with the segment coverage
                  interval, then if the intersection is non-empty, it
                  is expanded by `tol': the left endpoint of the
                  intersection interval is reduced by `tol' and the
                  right endpoint is increased by `tol'. Adjusted
                  interval endpoints, when expressed as encoded SCLK,
                  never are less than zero ticks.  Any intervals that
                  overlap as a result of the expansion are merged.
 
                  The coverage window returned when tol > 0 indicates
                  the coverage provided by the file to the CK readers
                  ckgpav_c and ckgp_c when that value of `tol' is
                  passed to them as an input.
 
               
   timsys         is a string indicating the time system used in the
                  output coverage window.  `timsys' may have the
                  values:
  
                      "SCLK"    Elements of `cover' are expressed in 
                                encoded SCLK ("ticks"), where the 
                                clock is associated with the object 
                                designated by `idcode'. 
 
                      "TDB"     Elements of `cover' are expressed as 
                                seconds past J2000 TDB. 
 
 
   cover          is an initialized CSPICE window data structure.
                  `cover' optionally may contain coverage data on
                  input; on output, the data already present in `cover'
                  will be combined with coverage found for the object
                  designated by `idcode' in the file `ck'.
 
                  If `cover' contains no data on input, its size and
                  cardinality still must be initialized.
 
-Detailed_Output
 
   cover          is a CSPICE window data structure which represents
                  the merged coverage for `idcode'. When the coverage
                  level is "INTERVAL", this is the set of time
                  intervals for which data for `idcode' are present in
                  the file `ck', merged with the set of time intervals
                  present in `cover' on input.  The merged coverage is
                  represented as the union of one or more disjoint time
                  intervals.  The window `cover' contains the pairs of
                  endpoints of these intervals.
 
                  When the coverage level is "SEGMENT", `cover' is
                  computed in a manner similar to that described above,
                  but the coverage intervals used in the computation
                  are those of segments rather than interpolation
                  intervals within segments.  
 
                  When `tol' is > 0, the intervals comprising the
                  coverage window for `idcode' are expanded by `tol'
                  and any intervals overlapping as a result are merged.
                  The resulting window is returned in `cover'. The
                  expanded window in no case extends beyond the segment
                  bounds in either direction by more than `tol'.
 
                  The interval endpoints contained in `cover' are
                  encoded spacecraft clock times if `timsys' is "SCLK";
                  otherwise the times are converted from encoded
                  spacecraft clock to seconds past J2000 TDB.
 
                  See the Examples section below for a complete example
                  program showing how to retrieve the endpoints from
                  `cover'.
                                     
-Parameters
 
   None. 
 
-Exceptions
 
   1)  If the input file has transfer format, the error  
       SPICE(INVALIDFORMAT) is signaled. 
 
   2)  If the input file is not a transfer file but has architecture 
       other than DAF, the error SPICE(BADARCHTYPE) is signaled. 
 
   3)  If the input file is a binary DAF file of type other than 
       CK, the error SPICE(BADFILETYPE) is signaled. 
 
   4)  If the CK file cannot be opened or read, the error will 
       be diagnosed by routines called by this routine. The output 
       window will not be modified. 
 
   5)  If the size of the output window argument `cover' is 
       insufficient to contain the actual number of intervals in the 
       coverage window for `idcode', the error will be diagnosed by 
       routines called by this routine.   
 
   6)  If `tol' is negative, the error SPICE(VALUEOUTOFRANGE) is 
       signaled. 
 
   7)  If `level' is not recognized, the error SPICE(INVALIDOPTION) 
       is signaled. 
 
   8)  If `timsys' is not recognized, the error SPICE(INVALIDOPTION) 
       is signaled. 
 
   9)  If a time conversion error occurs, the error will be  
       diagnosed by a routine in the call tree of this routine. 
 
   10) If the output time system is TDB, the CK subsystem must be 
       able to map `idcode' to the ID code of the associated 
       spacecraft clock.  If this mapping cannot be performed, the 
       error will be diagnosed by a routine in the call tree of this 
       routine. 
  
   11) The error SPICE(EMPTYSTRING) is signaled if any of the input
       strings `ck', `level', or `timsys' do not contain at least one
       character, since such an input string cannot be converted to a
       Fortran-style string in this case.
      
   12) The error SPICE(NULLPOINTER) is signaled if the if any of the input
       strings `ck', `level', or `timsys' are null.


-Files
 
   This routine reads a C-kernel. 
 
   If the output time system is "TDB", then a leapseconds kernel 
   and an SCLK kernel for the spacecraft clock associated with 
   `idcode' must be loaded before this routine is called. 
 
   If the ID code of the clock associated with `idcode' is not  
   equal to  
 
      idcode / 1000 
 
   then the kernel variable  
 
      CK_<idcode>_SCLK 
  
   must be present in the kernel pool to identify the clock 
   associated with `idcode'.  This variable must contain the ID code 
   to be used for conversion between SCLK and TDB. Normally this 
   variable is provided in a text kernel loaded via furnsh_c. 
 
-Particulars
 
   This routine provides an API via which applications can determine 
   the coverage a specified CK file provides for a specified 
   object. 
 
-Examples
 
   1)  Display the interval-level coverage for each object in a
       specified CK file. Use tolerance of zero ticks. Do not request
       angular velocity. Express the results in the TDB time system.
 
       Find the set of objects in the file. Loop over the contents of
       the ID code set:  find the coverage for each item in the set and
       display the coverage.


          #include <stdio.h>
          #include "SpiceUsr.h"

          int main()
          {

             /.
             Local parameters
             ./
             #define  FILSIZ         256
             #define  MAXIV          100000
             #define  WINSIZ         ( 2 * MAXIV )
             #define  TIMLEN         51
             #define  MAXOBJ         1000

             /.
             Local variables
             ./
             SPICEDOUBLE_CELL        ( cover, WINSIZ );
             SPICEINT_CELL           ( ids,   MAXOBJ );

             SpiceChar               ck      [ FILSIZ ];
             SpiceChar               lsk     [ FILSIZ ];
             SpiceChar               sclk    [ FILSIZ ];
             SpiceChar               timstr  [ TIMLEN ];

             SpiceDouble             b;
             SpiceDouble             e;

             SpiceInt                i;
             SpiceInt                j;
             SpiceInt                niv;
             SpiceInt                obj;


             /.
             Load a leapseconds kernel and SCLK kernel for output time
             conversion.  Note that we assume a single spacecraft clock is
             associated with all of the objects in the CK.
             ./
             prompt_c ( "Name of leapseconds kernel > ", FILSIZ, lsk );
             furnsh_c ( lsk );

             prompt_c ( "Name of SCLK kernel        > ", FILSIZ, sclk );
             furnsh_c ( sclk );

             /.
             Get name of CK file.
             ./
             prompt_c ( "Name of CK file            > ", FILSIZ, ck );

             /.
             Find the set of objects in the CK file. 
             ./
             ckobj_c ( ck, &ids );

             /.
             We want to display the coverage for each object. Loop over
             the contents of the ID code set, find the coverage for
             each item in the set, and display the coverage.
             ./
             for ( i = 0;  i < card_c( &ids );  i++  )
             {
                /.
                Find the coverage window for the current object. 
                Empty the coverage window each time so we don't
                include data for the previous object.
                ./
                obj  =  SPICE_CELL_ELEM_I( &ids, i );

                scard_c ( 0,  &cover );  
                ckcov_c ( ck,          obj,  SPICEFALSE, 
                          "INTERVAL",  0.0,  "TDB",       &cover );

                /.
                Get the number of intervals in the coverage window.
                ./
                niv = wncard_c( &cover );

                /.
                Display a simple banner.
                ./
                printf ( "%s\n", "========================================" );

                printf ( "Coverage for object %ld\n", obj );

                /.
                Convert the coverage interval start and stop times to TDB
                calendar strings.
                ./
                for ( j = 0;  j < niv;  j++  )
                {
                   /.
                   Get the endpoints of the jth interval.
                   ./
                   wnfetd_c ( &cover, j, &b, &e );

                   /.
                   Convert the endpoints to TDB calendar
                   format time strings and display them.
                   ./
                   timout_c ( b, 
                              "YYYY MON DD HR:MN:SC.###### (TDB) ::TDB",  
                              TIMLEN,
                              timstr                                    );

                   printf ( "\n"
                            "Interval:  %ld\n"
                            "Start:     %s\n",
                            j,
                            timstr            );

                   timout_c ( e, 
                              "YYYY MON DD HR:MN:SC.###### (TDB) ::TDB",  
                              TIMLEN,
                              timstr                                    );
                   printf ( "Stop:      %s\n", timstr );

                }
                printf ( "%s\n", "========================================" );

             }
             return ( 0 );
          } 


   2)  Find the segment-level coverage for the object designated by
       IDCODE provided by the set of CK files loaded via a metakernel.
       (The metakernel must also specify leapseconds and SCLK kernels.)
       Use tolerance of zero ticks. Do not request angular velocity.
       Express the results in the TDB time system.
 

          #include <stdio.h>
          #include "SpiceUsr.h"

          int main()
          {

             /.
             Local parameters
             ./
             #define  FILSIZ         256
             #define  LNSIZE         81 
             #define  MAXCOV         100000
             #define  WINSIZ         ( 2 * MAXCOV )
             #define  TIMLEN         51

             /.
             Local variables
             ./
             SPICEDOUBLE_CELL        ( cover, WINSIZ );

             SpiceBoolean            found;

             SpiceChar               file    [ FILSIZ ];
             SpiceChar               idch    [ LNSIZE ];
             SpiceChar               meta    [ FILSIZ ];
             SpiceChar               source  [ FILSIZ ];
             SpiceChar               timstr  [ TIMLEN ];
             SpiceChar               type    [ LNSIZE ];

             SpiceDouble             b;
             SpiceDouble             e;

             SpiceInt                count;
             SpiceInt                handle;
             SpiceInt                i;
             SpiceInt                idcode;
             SpiceInt                niv;


             /.
             Prompt for the metakernel name; load the metakernel.
             The metakernel lists the CK files whose coverage
             for `idcode' we'd like to determine.  The metakernel
             must also specify a leapseconds kernel and an SCLK
             kernel for the clock associated with `idcode'.
             ./
             prompt_c ( "Name of metakernel > ", FILSIZ, meta );
             furnsh_c ( meta );

             /.
             Get the ID code of interest. 
             ./
             prompt_c ( "Enter ID code      > ", LNSIZE, idch );
             prsint_c ( idch,  &idcode );

             /.
             Find out how many kernels are loaded.  Loop over the
             kernels:  for each loaded CK file, add its coverage
             for `idcode', if any, to the coverage window.
             ./
             ktotal_c ( "CK", &count );

             for ( i = 0;  i < count;  i++  )
             {
                kdata_c  ( i,           "CK",     FILSIZ,  
                           LNSIZE,      FILSIZ,   file,  
                           type,        source,   &handle,     &found );

                ckcov_c  ( file,        idcode,   SPICEFALSE,
                           "SEGMENT",   0.0,      "TDB",       &cover );
             }

             /.
             Display results. 

             Get the number of intervals in the coverage window.
             ./
             niv = wncard_c( &cover );

             /.
             Display a simple banner.
             ./
             printf ( "\nCoverage for object %ld\n", idcode );

             /.
             Convert the coverage interval start and stop times to TDB
             calendar strings.
             ./
             for ( i = 0;  i < niv;  i++  )
             {
                /.
                Get the endpoints of the ith interval.
                ./
                wnfetd_c ( &cover, i, &b, &e );

                /.
                Convert the endpoints to TDB calendar
                format time strings and display them.
                ./
                timout_c ( b, 
                           "YYYY MON DD HR:MN:SC.###### (TDB) ::TDB",  
                           TIMLEN,
                           timstr                                  );

                printf ( "\n"
                         "Interval:  %ld\n"
                         "Start:     %s\n",
                         i,
                         timstr            );

                timout_c ( e, 
                           "YYYY MON DD HR:MN:SC.###### (TDB) ::TDB",  
                           TIMLEN,
                           timstr                                  );
                printf ( "Stop:      %s\n", timstr );

             }
             return ( 0 );
          }


-Restrictions
 
   1) When this routine is used to accumulate coverage for `idcode' 
      provided by multiple CK files, the inputs `needav', `level', `tol', 
      and `timsys'  must have the same values for all files in order 
      for the result to be meaningful. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
 
-Version
 
   -CSPICE Version 1.0.1, 30-NOV-2007 (NJB)

       Corrected bug in first example program in header:
       program now empties result window prior to collecting
       data for each object. Updated examples to use wncard_c 
       rather than card_c. Updated second example to demonstrate
       segment-level summary capability.

   -CSPICE Version 1.0.0, 07-JAN-2005 (NJB)

-Index_Entries
 
   get coverage window for ck object 
 
-&
*/

{ /* Begin ckcov_c */


   /*
   Local variables 
   */
   logical                 need;


   /*
   Participate in error tracing.
   */
   if ( return_c() )
   {
      return; 
   }
   chkin_c ( "ckcov_c" );

   /*
   Check the input string `ck' to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ckcov_c", ck );
   
   /*
   Check the input string `level' to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ckcov_c", level );

   /*
   Check the input string `timsys' to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ckcov_c", timsys );

   /*
   Make sure cell data type is d.p. 
   */
   CELLTYPECHK ( CHK_STANDARD, "ckcov_c", SPICE_DP, cover );

   /*
   Initialize the cell if necessary. 
   */
   CELLINIT ( cover );   

   /*
   Call the f2c'd Fortran routine.
   */
   need = needav;

   ckcov_ ( ( char       * ) ck,
            ( integer    * ) &idcode,
            ( logical    * ) &need,
            ( char       * ) level,
            ( doublereal * ) &tol,
            ( char       * ) timsys,
            ( doublereal * ) (cover->base),
            ( ftnlen       ) strlen(ck),
            ( ftnlen       ) strlen(level),
            ( ftnlen       ) strlen(timsys)  );

   /*
   Sync the output cell. 
   */
   if ( !failed_c() )
   {
      zzsynccl_c ( F2C, cover );
   }

   chkout_c ( "ckcov_c" );

} /* End ckcov_c */
示例#18
0
   void spkw18_c ( SpiceInt             handle,
                   SpiceSPK18Subtype    subtyp,
                   SpiceInt             body,
                   SpiceInt             center, 
                   ConstSpiceChar     * frame,
                   SpiceDouble          first,
                   SpiceDouble          last,
                   ConstSpiceChar     * segid,
                   SpiceInt             degree,
                   SpiceInt             n,
                   const void         * packts,
                   ConstSpiceDouble     epochs[]     )

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   Handle of an SPK file open for writing. 
   subtyp     I   SPK type 18 subtype code.
   body       I   NAIF code for an ephemeris object. 
   center     I   NAIF code for center of motion of body. 
   frame      I   Reference frame name. 
   first      I   Start time of interval covered by segment. 
   last       I   End time of interval covered by segment. 
   segid      I   Segment identifier. 
   degree     I   Degree of interpolating polynomials. 
   n          I   Number of states. 
   states     I   Array of states. 
   epochs     I   Array of epochs corresponding to states. 
   MAXDEG     P   Maximum allowed degree of interpolating polynomial. 
 
-Detailed_Input
 
   handle         is the file handle of an SPK file that has been 
                  opened for writing. 
 
   subtyp         is an integer code indicating the subtype of the
                  the segment to be created.   

   body           is the NAIF integer code for an ephemeris object 
                  whose state relative to another body is described 
                  by the segment to be created. 
 
   center         is the NAIF integer code for the center of motion 
                  of the object identified by body. 
 
   frame          is the NAIF name for a reference frame 
                  relative to which the state information for body 
                  is specified. 
 
   first, 
   last           are, respectively, the start and stop times of 
                  the time interval over which the segment defines 
                  the state of body. 
 
   segid          is the segment identifier.  An SPK segment 
                  identifier may contain up to 40 characters. 
 
   degree         is the nominal degree of the polynomials used to
                  interpolate the states contained in the input
                  packets.  All components of the state vectors are 
                  interpolated by polynomials of the specified
                  degree, except near the segment boundaries, 
                  or if the total number of states in the segment
                  is too few to allow interpolation using the
                  specified degree.
 
   n              is the number of packets in the input packet
                  array. 
 
   packts         contains a time-ordered array of data packets 
                  representing geometric states of body relative  
                  to center, specified relative to frame.  The  
                  packet structure depends on the segment subtype 
                  as follows: 
 
                     Type 0 (indicated by code S18TP0): 
 
                         x,  y,  z,  dx/dt,  dy/dt,  dz/dt, 
                         vx, vy, vz, dvx/dt, dvy/dt, dvz/dt 
                   
                     where x, y, z represent Cartesian position 
                     components and  vx, vy, vz represent Cartesian 
                     velocity components.  Note well:  vx, vy, and 
                     vz *are not necessarily equal* to the time 
                     derivatives of x, y, and z.  This packet  
                     structure mimics that of the Rosetta/MEX orbit 
                     file from which the data are taken. 
                     
                     Type 1 (indicated by code S18TP1): 
 
                         x,  y,  z,  dx/dt,  dy/dt,  dz/dt 
                   
                     where x, y, z represent Cartesian position 
                     components and  vx, vy, vz represent Cartesian 
                     velocity components. 
 
                  Position units are kilometers, velocity units  
                  are kilometers per second, and acceleration units 
                  are kilometers per second per second. 
  
 
   epochs         is an array of epochs corresponding to the members 
                  of the packets array.  The epochs are specified as 
                  seconds past J2000, TDB. 
 
-Detailed_Output
 
   None.  See $Particulars for a description of the effect of this 
   routine. 
 
-Parameters
 
   MAXDEG         is the maximum allowed degree of the interpolating 
                  polynomial.  If the value of MAXDEG is increased, 
                  the CSPICE routine spkpvn_ must be changed 
                  accordingly.  In particular, the size of the 
                  record passed to SPKRnn and SPKEnn must be 
                  increased, and comments describing the record size 
                  must be changed. 
 
-Exceptions
 
   If any of the following exceptions occur, this routine will return 
   without creating a new segment. 
 
   1)  If frame is not a recognized name, the error 
       SPICE(INVALIDREFFRAME) is signaled. 
 
   2)  If the last non-blank character of segid occurs past index 40, 
       the error SPICE(SEGIDTOOLONG) is signaled. 
 
   3)  If segid contains any nonprintable characters, the error 
       SPICE(NONPRINTABLECHARS) is signaled. 
 
   4)  If degree is not at least 1 or is greater than MAXDEG, the 
       error SPICE(INVALIDDEGREE) is signaled. 
 
   5)  If the window size implied by DEGREE is odd, the error 
       SPICE(INVALIDDEGREE) is signaled. 
 
   6)  If the number of packets n is not at least 1, 
       the error SPICE(TOOFEWSTATES) will be signaled.
 
   7)  If first is greater than or equal to last then the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   8)  If the elements of the array epochs are not in strictly 
       increasing order, the error SPICE(TIMESOUTOFORDER) will be 
       signaled. 
 
   9)  If the first epoch epochs[0] is greater than first, the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   10) If the last epoch epochs[n-1] is less than last, the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   11) If either the input frame or segment ID string pointer is null,
       the error SPICE(NULLPOINTER) is signaled.
   
   12) If either the input frame or segment ID string is empty,
       the error SPICE(EMPTYSTRING) is signaled.
 
-Files
 
   A new type 18 SPK segment is written to the SPK file attached 
   to HANDLE. 
 
-Particulars
 
   This routine writes an SPK type 18 data segment to the open SPK 
   file according to the format described in the type 18 section of 
   the SPK Required Reading. The SPK file must have been opened with 
   write access. 
 
-Examples
 
  Suppose that you have states and are prepared to produce 
   a segment of type 18 in an SPK file. 
 
   The following code fragment could be used to add the new segment 
   to a previously opened SPK file attached to handle. The file must 
   have been opened with write access. 
 
      #include "SpiceUsr.h"
           .
           .
           .
        
      /.
      Create a segment identifier. 
      ./
      #define  SEGID  "MY_SAMPLE_SPK_TYPE_18_SEGMENT" 
 
        
      /.
      Write the segment. 
      ./        
      spkw18_c ( handle,  subtyp,  body,    center,   
                 frame,   first,   last,    segid,   
                 degree,  n,       states,  epochs );

-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
 
-Version
 
   -CSPICE Version 1.0.1, 29-APR-2003 (NJB)

       Description of error condition arising from invalid window
       size was corrected.

   -CSPICE Version 1.0.0, 16-AUG-2002 (NJB)

-Index_Entries
 
   write spk type_18 ephemeris data segment 
 
-&
*/

{ /* Begin spkw18_c */


   /*
   Local variables 
   */
   SpiceInt                locSubtype;



   /*
   Participate in error tracing.
   */
   if ( return_c() ) 
   {
      return;
   }
   chkin_c ( "spkw18_c" );

   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spkw18_c", frame );
   CHKFSTR ( CHK_STANDARD, "spkw18_c", segid );
 

   locSubtype = (SpiceInt) subtyp;

   /*
   Write the segment. 
   */
   spkw18_ ( ( integer    * ) &handle,
             ( integer    * ) &locSubtype,
             ( integer    * ) &body,
             ( integer    * ) &center,
             ( char       * ) frame,
             ( doublereal * ) &first,
             ( doublereal * ) &last,
             ( char       * ) segid,
             ( integer    * ) &degree,
             ( integer    * ) &n,
             ( doublereal * ) packts,
             ( doublereal * ) epochs,
             ( ftnlen       ) strlen(frame),
             ( ftnlen       ) strlen(segid)  );


   chkout_c ( "spkw18_c" );


} /* End spkw18_c */
示例#19
0
   void spkw09_c ( SpiceInt             handle,
                   SpiceInt             body,
                   SpiceInt             center, 
                   ConstSpiceChar     * frame,
                   SpiceDouble          first,
                   SpiceDouble          last,
                   ConstSpiceChar     * segid,
                   SpiceInt             degree,
                   SpiceInt             n,
                   ConstSpiceDouble     states[][6],
                   ConstSpiceDouble     epochs[]     )
/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   Handle of an SPK file open for writing. 
   body       I   NAIF code for an ephemeris object. 
   center     I   NAIF code for center of motion of body. 
   frame      I   Reference frame name. 
   first      I   Start time of interval covered by segment. 
   last       I   End time of interval covered by segment. 
   segid      I   Segment identifier. 
   degree     I   Degree of interpolating polynomials. 
   n          I   Number of states. 
   states     I   Array of states. 
   epochs     I   Array of epochs corresponding to states. 
   maxdeg     P   Maximum allowed degree of interpolating polynomial. 
 
-Detailed_Input
 
   handle         is the file handle of an SPK file that has been 
                  opened for writing. 
 
   body           is the NAIF integer code for an ephemeris object 
                  whose state relative to another body is described 
                  by the segment to be created. 
 
   center         is the NAIF integer code for the center of motion 
                  of the object identified by body. 
 
   frame          is the NAIF name for a reference frame 
                  relative to which the state information for body 
                  is specified. 
 
   first, 
   last           are, respectively, the start and stop times of 
                  the time interval over which the segment defines 
                  the state of body. 
 
   segid          is the segment identifier.  An SPK segment 
                  identifier may contain up to 40 characters. 
 
   degree         is the degree of the Lagrange polynomials used to 
                  interpolate the states.  All components of the 
                  state vectors are interpolated by polynomials of 
                  fixed degree. 
 
   n              is the number of states in the input state vector 
                  array. 
 
   states         contains a time-ordered array of geometric states 
                  ( x, y, z, dx/dt, dy/dt, dz/dt, in kilometers and 
                  kilometers per second ) of body relative to center, 
                  specified relative to frame. 
 
   epochs         is an array of epochs corresponding to the members 
                  of the state array.  The epochs are specified as 
                  seconds past J2000, TDB. 
 
-Detailed_Output
 
   None.  See $Particulars for a description of the effect of this 
   routine. 
 
-Parameters
 
   MAXDEG         is the maximum allowed degree of the interpolating 
                  polynomial.  If the value of MAXDEG is increased, 
                  the CSPICE routine spkpvn_ must be changed 
                  accordingly.  In particular, the size of the 
                  record passed to spkrNN_ and spkeNN_ must be 
                  increased, and comments describing the record size 
                  must be changed. 
                  
                  The current value of MAXDEG is 15.
 
-Exceptions
 
   If any of the following exceptions occur, this routine will return 
   without creating a new segment. 
 
   1)  If frame is not a recognized name, the error 
       SPICE(INVALIDREFFRAME) is signaled. 
 
   2)  If the last non-blank character of segid occurs past index 40, 
       the error SPICE(SEGIDTOOLONG) is signaled. 
 
   3)  If segid contains any nonprintable characters, the error 
       SPICE(NONPRINTABLECHARS) is signaled. 
 
   4)  If degree is not at least 1 or is greater than MAXDEG, the 
       error SPICE(INVALIDDEGREE) is signaled. 
 
   5)  If the number of states n is not at least degree+1, the error 
       SPICE(TOOFEWSTATES) will be signaled. 
 
   6)  If first is greater than or equal to last then the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   7)  If the elements of the array epochs are not in strictly 
       increasing order, the error SPICE(TIMESOUTOFORDER) will be 
       signaled. 
 
   8)  If the first epoch epochs[0] is greater than first, the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   9)  If the last epoch epochs[n] is less than last, the error 
       SPICE(BADDESCRTIMES) will be signaled. 
 
   10) If either the input frame or segment ID string pointer is null,
       the error SPICE(NULLPOINTER) is signaled.
   
   11) If either the input frame or segment ID string is empty,
       the error SPICE(EMPTYSTRING) is signaled.
   
-Files
 
   A new type 9 SPK segment is written to the SPK file attached 
   to handle. 
 
-Particulars
 
   This routine writes an SPK type 09 data segment to the open SPK 
   file according to the format described in the type 09 section of 
   the SPK Required Reading. The SPK file must have been opened with 
   write access. 
 
-Examples
 
   Suppose that you have states and are prepared to produce 
   a segment of type 09 in an SPK file. 
 
   The following code fragment could be used to add the new segment 
   to a previously opened SPK file attached to HANDLE. The file must 
   have been opened with write access. 
 
      #include "SpiceUsr.h"
           .
           .
           .
        
      /.
      Create a segment identifier. 
      ./
      #define  SEGID  "MY_SAMPLE_SPK_TYPE_9_SEGMENT" 
 
        
      /.
      Write the segment. 
      ./
        
      spkw09_c ( handle,  body,    center,  frame, 
                 first,   last,    segid,   degree, 
                 n,       states,  epochs          );
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   K.R. Gehringer (JPL) 
   N.J. Bachman   (JPL) 
   J.M. Lynch     (JPL) 
   W.L. Taber     (JPL) 
 
-Version
 
   -CSPICE Version 1.0.0, 21-JUN-1999 (KRG) (NJB) (JML) (WLT)

-Index_Entries
 
   write spk type_9 ephemeris data segment 
 
-&
*/

{ /* Begin spkw09_c */



   /*
   Participate in error tracing.
   */
   chkin_c ( "spkw09_c" );


   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "spkw09_c", frame );
   CHKFSTR ( CHK_STANDARD, "spkw09_c", segid );
 

   /*
   Write the segment. 
   */
   spkw09_ ( ( integer    * ) &handle,
             ( integer    * ) &body,
             ( integer    * ) &center,
             ( char       * ) frame,
             ( doublereal * ) &first,
             ( doublereal * ) &last,
             ( char       * ) segid,
             ( integer    * ) &degree,
             ( integer    * ) &n,
             ( doublereal * ) states,
             ( doublereal * ) epochs,
             ( ftnlen       ) strlen(frame),
             ( ftnlen       ) strlen(segid)  );


   chkout_c ( "spkw09_c" );

} /* End spkw09_c */
示例#20
0
文件: tpictr_c.c 项目: Dbelsa/coft
   void tpictr_c ( ConstSpiceChar * sample,
                   SpiceInt         lenout,
                   SpiceInt         lenerr,
                   SpiceChar      * pictur,
                   SpiceBoolean   * ok,
                   SpiceChar      * errmsg )
/*

-Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   sample     I   A sample time string.
   lenout     I   The length for the output picture string.
   lenerr     I   The length for the output error string.
   pictur     O   A format picture that describes sample.
   ok         O   Flag indicating whether sample parsed successfully.
   errmsg     O   Diagnostic returned if sample cannot be parsed.

-Detailed_Input


   sample     is a representative time string to use as a model to
              format time strings.

   lenout     is the allowed length for the output picture.  This length
              must large enough to hold the output string plus the null
              terminator.  If the output string is expected to have x
              characters, lenout needs to be x + 1.  80 is a reasonable
              value for lenout (79 characters plus the null
              terminator).  

   lenerr     is the allowed length for the output error string.    
   
   
-Detailed_Output


   pictur     is a format picture suitable for use with the SPICE
              routine timout_c.  This picture, when used to format an
              epoch via timout_c, will yield the same time components in
              the same order as the components in sample.

   ok         is a logical flag indicating whether the input format
              sample could be parsed. If all of the components of
              sample are recognizable, ok will be returned with the
              value SPICEFALSE.  If some part of pictur cannot be
              parsed, ok will be returned with the value SPICEFALSE.

   errmsg     is a diagnostic message that indicates what part of
              sample was not recognizable.  If sample was successfully
              parsed, ok will be SPICEFALSE and errmsg will be
              returned as an empty string.

-Parameters

   None.

-Files

   None.

-Exceptions

   Error free.

   1) All problems with the inputs are diagnosed via ok and errmsg.

   2) If a format picture can not be created from the sample
      time string, pictur is returned as a blank string.

-Particulars

   Although the routine timout_c provides CSPICE users with a great
   deal of flexibility in formatting time strings, users must
   master the means by which a time picture is constructed
   suitable for use by timout_c.

   This routine allows CSPICE users to supply a sample time string
   from which a corresponding time format picture can be created,
   freeing users from the task of mastering the intricacies of
   the routine timout_c.

   Note that timout_c can produce many time strings whose patterns
   can not be discerned by this routine.  When such outputs are
   called for, the user must consult timout_c and construct the
   appropriate format picture "by hand."  However, these exceptional
   formats are not widely used and are not generally recognizable
   to an uninitiated reader.

-Examples

   Suppose you need to print epochs corresponding to some events and
   you wish the epochs to have the same arrangement of components as in
   the string "10:23 P.M. PDT January 3, 1993".

   The following subroutine call will construct the appropriate format
   picture for use with timout_c.

   tpictr_c ( "10:23 P.M. PDT January 3, 1993",
               lenout, lenerr, pictur, &ok, errmsg );

   The resulting picture is:

      "AP:MN AMPM PDT Month DD, YYYY ::UTC-7"

   This picture can be used with timout_c to format a sequence
   of epochs, et[0],...,et[n-1] (given as ephemeris seconds past J2000)
   as shown in the loop below:

      #include "SpiceUsr.h"
          .
          .
          .
      for ( i = 0; i < n; i++ )
      {
         timout_c ( et[i], pictur, string );
         printf ( "Epoch: %d --- %s\n", i, string );
      }

-Restrictions

   None.

-Author_and_Institution
   
   W.L. Taber      (JPL)
   E.D. Wright     (JPL)

-Literature_References

   None.

-Version

   -CSPICE Version 1.0.0, 23-JUL-1999   (EDW) (WLT)

-Index_Entries

   Use a sample time string to produce a time format picture

-&
*/

{ /* Begin tpictr_c */

   /*
   Local variables
   */
   logical                 okeydoke;

   /*
   Participate in error tracing.
   */
   chkin_c ( "tpictr_c" );


   /*
   Check the input string sample to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "tpictr_c", sample );


   /*
   Make sure the output strings have at least enough room for one output
   character and a null terminator.  Also check for a null pointer.
   */
   CHKOSTR ( CHK_STANDARD, "tpictr_c",  pictur, lenout );
   CHKOSTR ( CHK_STANDARD, "tpictr_c",  errmsg, lenerr );


   /* 
   Call the f2c'd routine. 
   */
   tpictr_( ( char    * ) sample,
            ( char    * ) pictur,
            ( logical * ) &okeydoke,
            ( char    * ) errmsg,
            ( ftnlen    ) strlen( sample ),
            ( ftnlen    ) lenout - 1,
            ( ftnlen    ) lenerr - 1       );
            
   
   /* 
   Convert the output strings to C style.
   */
   F2C_ConvertStr( lenout, pictur );
   F2C_ConvertStr( lenerr, errmsg );


   /*
   Convert the status flag from logical to SpiceBoolean.
   */
   
   *ok = okeydoke;


   chkout_c ( "tpictr_c" );


} /* End tpictr_c */
示例#21
0
   void drdpgr_c ( ConstSpiceChar  * body,
                   SpiceDouble       lon,
                   SpiceDouble       lat,
                   SpiceDouble       alt,
                   SpiceDouble       re,
                   SpiceDouble       f,
                   SpiceDouble       jacobi[3][3] ) 

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   body       I   Name of body with which coordinates are associated. 
   lon        I   Planetographic longitude of a point (radians). 
   lat        I   Planetographic latitude of a point (radians). 
   alt        I   Altitude of a point above reference spheroid. 
   re         I   Equatorial radius of the reference spheroid. 
   f          I   Flattening coefficient. 
   jacobi     O   Matrix of partial derivatives. 
 
-Detailed_Input
 
   body       Name of the body with which the planetographic 
              coordinate system is associated. 
 
              `body' is used by this routine to look up from the 
              kernel pool the prime meridian rate coefficient giving 
              the body's spin sense.  See the Files and Particulars 
              header sections below for details. 
 
   lon        Planetographic longitude of the input point.  This is 
              the angle between the prime meridian and the meridian 
              containing the input point.  For bodies having 
              prograde (aka direct) rotation, the direction of 
              increasing longitude is positive west:  from the +X 
              axis of the rectangular coordinate system toward the 
              -Y axis.  For bodies having retrograde rotation, the 
              direction of increasing longitude is positive east: 
              from the +X axis toward the +Y axis. 
 
              The earth, moon, and sun are exceptions: 
              planetographic longitude is measured positive east for 
              these bodies. 
 
              The default interpretation of longitude by this 
              and the other planetographic coordinate conversion 
              routines can be overridden; see the discussion in 
              Particulars below for details. 
 
              Longitude is measured in radians. On input, the range 
              of longitude is unrestricted. 
 
   lat        Planetographic latitude of the input point.  For a 
              point P on the reference spheroid, this is the angle 
              between the XY plane and the outward normal vector at 
              P. For a point P not on the reference spheroid, the 
              planetographic latitude is that of the closest point 
              to P on the spheroid. 
 
              Latitude is measured in radians.  On input, the 
              range of latitude is unrestricted.  
 
   alt        Altitude of point above the reference spheroid. 
              Units of `alt' must match those of `re'. 
 
   re         Equatorial radius of a reference spheroid.  This 
              spheroid is a volume of revolution:  its horizontal 
              cross sections are circular.  The shape of the 
              spheroid is defined by an equatorial radius `re' and 
              a polar radius `rp'.  Units of `re' must match those of  
              `alt'. 
 
   f          Flattening coefficient =  
 
                 (re-rp) / re 
 
              where `rp' is the polar radius of the spheroid, and the 
              units of `rp' match those of `re'. 
 
-Detailed_Output
 
   JACOBI     is the matrix of partial derivatives of the conversion 
              from planetographic to rectangular coordinates.  It 
              has the form 
 
                 .-                              -. 
                 |  DX/DLON   DX/DLAT   DX/DALT   | 
                 |  DY/DLON   DY/DLAT   DY/DALT   | 
                 |  DZ/DLON   DZ/DLAT   DZ/DALT   | 
                 `-                              -' 
 
              evaluated at the input values of `lon', `lat' and `alt'. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If the body name `body' cannot be mapped to a NAIF ID code, 
      and if `body' is not a string representation of an integer, 
      the error SPICE(IDCODENOTFOUND) will be signaled. 
 
   2) If the kernel variable   
 
         BODY<ID code>_PGR_POSITIVE_LON 
 
      is present in the kernel pool but has a value other 
      than one of 
 
          'EAST' 
          'WEST' 
 
      the error SPICE(INVALIDOPTION) will be signaled.  Case 
      and blanks are ignored when these values are interpreted. 
 
   3) If polynomial coefficients for the prime meridian of `body' 
      are not available in the kernel pool, and if the kernel 
      variable BODY<ID code>_PGR_POSITIVE_LON is not present in 
      the kernel pool, the error SPICE(MISSINGDATA) will be signaled. 
       
   4) If the equatorial radius is non-positive, the error 
      SPICE(VALUEOUTOFRANGE) is signaled. 
 
   5) If the flattening coefficient is greater than or equal to one, 
      the error SPICE(VALUEOUTOFRANGE) is signaled. 

   6) The error SPICE(EMPTYSTRING) is signaled if the input
      string `body' does not contain at least one character, since the
      input string cannot be converted to a Fortran-style string in
      this case.
      
   7) The error SPICE(NULLPOINTER) is signaled if the input string
      pointer `body' is null.
 
-Files
 
   This routine expects a kernel variable giving body's prime 
   meridian angle as a function of time to be available in the 
   kernel pool.  Normally this item is provided by loading a PCK 
   file.  The required kernel variable is named  
 
      BODY<body ID>_PM  
 
   where <body ID> represents a string containing the NAIF integer  
   ID code for `body'.  For example, if `body' is "JUPITER", then  
   the name of the kernel variable containing the prime meridian  
   angle coefficients is  
 
      BODY599_PM 
 
   See the PCK Required Reading for details concerning the prime 
   meridian kernel variable. 
 
   The optional kernel variable  
    
      BODY<body ID>_PGR_POSITIVE_LON 
 
   also is normally defined via loading a text kernel. When this 
   variable is present in the kernel pool, the prime meridian 
   coefficients for `body' are not required by this routine. See the 
   Particulars section below for details. 
 
-Particulars
 
   It is often convenient to describe the motion of an object in the 
   planetographic coordinate system.  However, when performing 
   vector computations it's hard to beat rectangular coordinates. 
 
   To transform states given with respect to planetographic 
   coordinates to states with respect to rectangular coordinates, 
   one makes use of the Jacobian of the transformation between the 
   two systems. 
 
   Given a state in planetographic coordinates 
 
      ( lon, lat, alt, dlon, dlat, dalt ) 
 
   the velocity in rectangular coordinates is given by the matrix 
   equation: 
 
                  t          |                                  t 
      (dx, dy, dz)   = jacobi|              * (dlon, dlat, dalt) 
                             |(lon,lat,alt) 
 
 
   This routine computes the matrix  
 
            | 
      jacobi| 
            |(lon,lat,alt) 
 
 
   In the planetographic coordinate system, longitude is defined 
   using the spin sense of the body.  Longitude is positive to the 
   west if the spin is prograde and positive to the east if the spin 
   is retrograde.  The spin sense is given by the sign of the first 
   degree term of the time-dependent polynomial for the body's prime 
   meridian Euler angle "W":  the spin is retrograde if this term is 
   negative and prograde otherwise.  For the sun, planets, most 
   natural satellites, and selected asteroids, the polynomial 
   expression for W may be found in a SPICE PCK kernel. 
 
   The earth, moon, and sun are exceptions: planetographic longitude 
   is measured positive east for these bodies. 
 
   If you wish to override the default sense of positive longitude 
   for a particular body, you can do so by defining the kernel 
   variable 
 
      BODY<body ID>_PGR_POSITIVE_LON 
 
   where <body ID> represents the NAIF ID code of the body. This 
   variable may be assigned either of the values 
 
      'WEST' 
      'EAST' 
 
   For example, you can have this routine treat the longitude 
   of the earth as increasing to the west using the kernel 
   variable assignment 
 
      BODY399_PGR_POSITIVE_LON = 'WEST' 
       
   Normally such assignments are made by placing them in a text 
   kernel and loading that kernel via furnsh_c. 
 
   The definition of this kernel variable controls the behavior of 
   the CSPICE planetographic routines 
 
      pgrrec_c 
      recpgr_c 
      dpgrdr_c 
      drdpgr_c 
 
   It does not affect the other CSPICE coordinate conversion 
   routines. 
 
-Examples
 
   Numerical results shown for this example may differ between 
   platforms as the results depend on the SPICE kernels used as 
   input and the machine specific arithmetic implementation. 
 

     Find the planetographic state of the earth as seen from 
     Mars in the J2000 reference frame at January 1, 2005 TDB. 
     Map this state back to rectangular coordinates as a check. 


           #include <stdio.h>
           #include "SpiceUsr.h"

           int main()
        {
           /.
           Local variables 
           ./
           SpiceDouble             alt;
           SpiceDouble             drectn [3];
           SpiceDouble             et;
           SpiceDouble             f;
           SpiceDouble             jacobi [3][3];
           SpiceDouble             lat;
           SpiceDouble             lon;
           SpiceDouble             lt;
           SpiceDouble             pgrvel [3];
           SpiceDouble             radii  [3];
           SpiceDouble             re;
           SpiceDouble             rectan [3];
           SpiceDouble             rp;
           SpiceDouble             state  [6];

           SpiceInt                n;


           /.
           Load a PCK file containing a triaxial
           ellipsoidal shape model and orientation
           data for Mars.
           ./
           furnsh_c ( "pck00008.tpc" );

           /.
           Load an SPK file giving ephemerides of earth and Mars.
           ./
           furnsh_c ( "de405.bsp" );

           /.
           Load a leapseconds kernel to support time conversion.
           ./
           furnsh_c ( "naif0007.tls" );

           /.
           Look up the radii for Mars.  Although we
           omit it here, we could first call badkpv_c
           to make sure the variable BODY499_RADII
           has three elements and numeric data type.
           If the variable is not present in the kernel
           pool, bodvrd_c will signal an error.
           ./
           bodvrd_c ( "MARS", "RADII", 3, &n, radii );

           /.
           Compute flattening coefficient.
           ./
           re  =  radii[0];
           rp  =  radii[2];
           f   =  ( re - rp ) / re;

           /.
           Look up the geometric state of earth as seen from Mars at
           January 1, 2005 TDB, relative to the J2000 reference
           frame.
           ./
           str2et_c ( "January 1, 2005 TDB", &et);

           spkezr_c ( "Earth", et,    "J2000", "LT+S",    
                      "Mars",  state, &lt              );

           /.
           Convert position to planetographic coordinates.
           ./
           recpgr_c ( "mars", state, re, f, &lon, &lat, &alt );

           /.
           Convert velocity to planetographic coordinates.
           ./

           dpgrdr_c ( "MARS",  state[0],  state[1],  state[2],    
                      re,      f,         jacobi               );

           mxv_c ( jacobi, state+3, pgrvel );


           /.
           As a check, convert the planetographic state back to
           rectangular coordinates.
           ./
           pgrrec_c ( "mars", lon, lat, alt, re, f, rectan );
           drdpgr_c ( "mars", lon, lat, alt, re, f, jacobi );

           mxv_c ( jacobi, pgrvel, drectn );

           printf ( "\n"
                    "Rectangular coordinates:\n"
                    "\n"
                    "  X (km)                 = %18.9e\n"
                    "  Y (km)                 = %18.9e\n"
                    "  Z (km)                 = %18.9e\n"
                    "\n"
                    "Rectangular velocity:\n"
                    "\n"
                    "  dX/dt (km/s)           = %18.9e\n"
                    "  dY/dt (km/s)           = %18.9e\n"
                    "  dZ/dt (km/s)           = %18.9e\n"
                    "\n"
                    "Ellipsoid shape parameters:\n"
                    "\n"
                    "  Equatorial radius (km) = %18.9e\n"
                    "  Polar radius      (km) = %18.9e\n"
                    "  Flattening coefficient = %18.9e\n"
                    "\n"
                    "Planetographic coordinates:\n"
                    "\n"
                    "  Longitude (deg)        = %18.9e\n"
                    "  Latitude  (deg)        = %18.9e\n"
                    "  Altitude  (km)         = %18.9e\n"
                    "\n"
                    "Planetographic velocity:\n"
                    "\n"
                    "  d Longitude/dt (deg/s) = %18.9e\n"
                    "  d Latitude/dt  (deg/s) = %18.9e\n"
                    "  d Altitude/dt  (km/s)  = %18.9e\n"
                    "\n"
                    "Rectangular coordinates from inverse mapping:\n"
                    "\n"
                    "  X (km)                 = %18.9e\n"
                    "  Y (km)                 = %18.9e\n"
                    "  Z (km)                 = %18.9e\n"
                    "\n"
                    "Rectangular velocity from inverse mapping:\n"
                    "\n"
                    "  dX/dt (km/s)           = %18.9e\n"
                    "  dY/dt (km/s)           = %18.9e\n"
                    "  dZ/dt (km/s)           = %18.9e\n"
                    "\n",
                    state [0],
                    state [1],
                    state [2],
                    state [3],
                    state [4],
                    state [5],
                    re,
                    rp,
                    f,
                    lon / rpd_c(),
                    lat / rpd_c(),
                    alt,
                    pgrvel[0]/rpd_c(),
                    pgrvel[1]/rpd_c(),
                    pgrvel[2],
                    rectan [0],
                    rectan [1],
                    rectan [2],
                    drectn [0],
                    drectn [1],
                    drectn [2]                );

           return ( 0 );
        }

     Output from this program should be similar to the following
     (rounding and formatting differ across platforms):


        Rectangular coordinates:

          X (km)                 =    1.460397325e+08
          Y (km)                 =    2.785466068e+08
          Z (km)                 =    1.197503153e+08

        Rectangular velocity:

          dX/dt (km/s)           =   -4.704288238e+01
          dY/dt (km/s)           =    9.070217780e+00
          dZ/dt (km/s)           =    4.756562739e+00

        Ellipsoid shape parameters:

          Equatorial radius (km) =    3.396190000e+03
          Polar radius      (km) =    3.376200000e+03
          Flattening coefficient =    5.886007556e-03

        Planetographic coordinates:

          Longitude (deg)        =    2.976676591e+02
          Latitude  (deg)        =    2.084450403e+01
          Altitude  (km)         =    3.365318254e+08

        Planetographic velocity:

          d Longitude/dt (deg/s) =   -8.357386316e-06
          d Latitude/dt  (deg/s) =    1.593493548e-06
          d Altitude/dt  (km/s)  =   -1.121443268e+01

        Rectangular coordinates from inverse mapping:

          X (km)                 =    1.460397325e+08
          Y (km)                 =    2.785466068e+08
          Z (km)                 =    1.197503153e+08

        Rectangular velocity from inverse mapping:

          dX/dt (km/s)           =   -4.704288238e+01
          dY/dt (km/s)           =    9.070217780e+00
          dZ/dt (km/s)           =    4.756562739e+00

 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman   (JPL) 
   W.L. Taber     (JPL) 
 
-Version
 
   -CSPICE Version 1.0.0, 26-DEC-2004 (NJB) (WLT)

-Index_Entries
 
   Jacobian of rectangular w.r.t. planetographic coordinates 
 
-&
*/

{ /* Begin drdpgr_c */


   /*
   Participate in error tracing.
   */
   if ( return_c()  )
   {
      return; 
   }
   chkin_c ( "drdpgr_c" );


   /*
   Check the input string body to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "drdpgr_c", body );
   

   /*
   Call the f2c'd Fortran routine.
   */
   drdpgr_ ( ( char       * ) body,
             ( doublereal * ) &lon,
             ( doublereal * ) &lat,
             ( doublereal * ) &alt,
             ( doublereal * ) &re,
             ( doublereal * ) &f,
             ( doublereal * ) jacobi,
             ( ftnlen       ) strlen(body)  );

   /*
   Convert Jacobian matrix to row-major order. 
   */
   xpose_c ( jacobi, jacobi );


   chkout_c ( "drdpgr_c" );

} /* End drdpgr_c */
示例#22
0
文件: gcpool_c.c 项目: Dbelsa/coft
   void gcpool_c ( ConstSpiceChar * name,
                   SpiceInt         start,
                   SpiceInt         room,
                   SpiceInt         lenout,
                   SpiceInt       * n,
                   void           * cvals,
                   SpiceBoolean   * found )
 
/*
 
-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   name       I   Name of the variable whose value is to be returned.
   start      I   Which component to start retrieving for name
   room       I   The largest number of values to return.
   lenout     I   The length of the output string.
   n          O   Number of values returned for name.
   cvals      O   Values associated with name.
   found      O   True if variable is in pool.
 
-Detailed_Input
 
   name       is the name of the variable whose values are to be
              returned. If the variable is not in the pool with
              character type, found will be SPICEFALSE.
 
   start      is the index of the first component of name to return.
              The index follows the C convention of being 0 based.
              If start is less than 0, it will be treated as 0.  If
              start is greater than the total number of components
              available for name, no values will be returned (n will
              be set to zero).  However, found will still be set to
              SPICETRUE
 
   room       is the maximum number of components that should be
              returned for this variable.  (Usually it is the amount
              of room available in the array cvals). If room is
              less than 1 the error SPICE(BADARRAYSIZE) will be
              signaled.
 
   lenout     The allowed length of the output string.  This length
              must large enough to hold the output string plus the
              terminator.  If the output string is expected to have x
              characters, lenout needs to be x + 1. 
 
-Detailed_Output
 
   n          is the number of values associated with name that
              are returned.  It will always be less than or equal
              to room.
 
              If name is not in the pool with character type, no
              value is given to n.
 
   cvals      is the array of values associated with name.
              If name is not in the pool with character type, no
              values are given to the elements of cvals.
 
              If the length of cvals is less than the length of
              strings stored in the kernel pool (see MAXCHR) the
              values returned will be truncated on the right.
 
   found      is SPICETRUE if the variable is in the pool and has
              character type, SPICEFALSE if it is not.
 
-Parameters
 
   None.
 
-Exceptions
 
   1) If the value of room is less than one the error
      SPICE(BADARRAYSIZE) is signaled.
 
   2) If cvals has declared length less than the size of a
      string to be returned, the value will be truncated on
      the right.  See MAXCHR in pool.c for the maximum stored size of
      string variables.
 
   3) If the input string pointer is null, the error SPICE(NULLPOINTER)
      will be signaled.
 
   4) If the input string has length zero, the error SPICE(EMPTYSTRING)
      will be signaled.
 
   5) If the output string has length less than two characters, it
      is too short to contain one character of output data plus a null
      terminator, so it cannot be passed to the underlying Fortran
      routine.  In this event, the error SPICE(STRINGTOOSHORT) is
      signaled.
 
-Files
 
   None.
 
-Particulars
 
   This routine provides the user interface to retrieving
   character data stored in the kernel pool.  This interface
   allows you to retrieve the data associated with a variable
   in multiple accesses.  Under some circumstances this alleviates
   the problem of having to know in advance the maximum amount
   of space needed to accommodate all kernel variables.
 
   However, this method of access does come with a price. It is
   always more efficient to retrieve all of the data associated
   with a kernel pool data in one call than it is to retrieve
   it in sections.
 
   C requires the length of the output character array to be defined
   prior to calling the converted gcpool_c routine.  The size of the
   cvals output array is user defined and passed as the variable
   lenout.
 
   Also see the entry points gdpool_c and gipool_c.
 
-Examples
 
   The following code fragment demonstrates how the data stored
   in a kernel pool variable can be retrieved in pieces.  Using the
   kernel "test.ker" which contains
 
   \begindata
 
   CTEST_VAL = ('LARRY', 'MOE', 'CURLY' )
 
   ITEST_VAL = ( 3141, 186, 282 )
 
   DTEST_VAL = ( 3.1415, 186. , 282.397 )
 
 
   The program...
 
   #include <stdio.h>
   #include <string.h>
 
   #include "SpiceUsr.h"
   #include "SpiceZmc.h"
 
   #define LENOUT 20
   #define NUMVALS 2
   #define START   1
 
   void main()
      {
 
      SpiceInt          n;
      SpiceChar         cvals[NUMVALS][LENOUT];
      SpiceBoolean      found;
      SpiceInt          i;
 
 
       ldpool_c ( "test.ker" );
 
 
       /.
       Get 2 values (NUMVALs) starting at the second value
       in the list (START).  Each value will be of length LENOUT.
       ./
 
       gcpool_c ( "CTEST_VAL", START, NUMVALS, LENOUT, &n, cvals,
                  &found );
 
       for ( i = 0; i < NUMVALS; i++ )
          {
          printf("%s\n", cvals[i] );
          }
 
       exit(0);
      }
 
 
   Will give output of
   MOE
   CURLY
 
 
-Restrictions
 
   None.
 
-Literature_References
 
   None.
 
-Author_and_Institution
 
   W.L. Taber  (JPL)
 
-Version

   -CSPICE Version 2.2.1 07-SEP-2007   (EDW)

      Edited the 'lenout' description in the Detailed_Input to
      remove the recommendation of 32 as a general use value
      for 'lenout'.

   -CSPICE Version 2.2.0 18-MAY-2001   (WLT)

      Added a cast to (char *) in the call to F2C_ConvertStrArr.
 
   -CSPICE Version 2.1.0 22-JUN-1999   (EDW)
 
      Added local variable to return boolean/logical values.  This
      fix allows the routine to function if int and long are different
      sizes.
 
   -CSPICE Version 2.0.3 09-FEB-1998   (EDW)
 
      Removed the output dynamically allocated string.  Conversion
      of cval from string to array now accomplished via the
      F2C_ConvertStrArray call.
 
   -CSPICE Version 2.0.2 01-FEB-1998   (EDW)
 
      Removed the input and work dynamically allocated strings.
 
   -CSPICE Version 2.0.1 28-JAN-1998   (EDW)
 
      The start parameter is now zero based as per C convention.
      Adjusted the amount of memory for the strings to lenout-1.
 
   -CSPICE Version 2.0.0 07-JAN-1998   (EDW)
 
     The routine now function properly for room > 1.  Previously
     only a single value could be returned.
 
   -CSPICE Version 1.0.0 23-OCT-1997   (EDW)
 
 
-Index_Entries
 
   RETURN the character value of a pooled kernel variable
   RETURN the string value of a pooled kernel variable
 
-&
*/
 
{ /* Begin gcpool_c */
 
 
   /*
   Local variables.
   */
   logical            yes;
 
 
   /* The index is zero based here but not in gcpool_. */
   start = start + 1;
 
 
   /*
   Participate in error tracing.
   */
   chkin_c ( "gcpool_c");
 
 
   /*
   Check the input string utcstr to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "gcpool_c", name );
 
 
   /*
   Make sure the output string has at least enough room for one output
   character and a null terminator.  Also check for a null pointer.
   */
   CHKOSTR ( CHK_STANDARD, "gcpool_c", cvals, lenout );
 
 
 
   /*
   Call the f2c'd routine
   */
 
   gcpool_( ( char    * ) name,
            ( integer * ) &start,
            ( integer * ) &room,
            ( integer * ) n,
            ( char    * ) cvals,
            ( logical * ) &yes,
            ( ftnlen    ) strlen(name),
            ( ftnlen    ) lenout - 1 );
 
  
   /* Cast back to a SpiceBoolean. */
   *found = yes;

   if ( *found )
   {
      /*
      cvals now contains the requested data in a single string
      lenout * n long.  We need to reform cvals into an array
      of n strings each lenout long.
      */
      F2C_ConvertTrStrArr ( *n, lenout, (char *)cvals );
   }
 
 
   /* Done.  Checkout. */
   chkout_c ( "gcpool_c");
 
} /* End gcpool_c */
示例#23
0
void gfrr_c ( ConstSpiceChar     * target,
              ConstSpiceChar     * abcorr,
              ConstSpiceChar     * obsrvr,
              ConstSpiceChar     * relate,
              SpiceDouble          refval,
              SpiceDouble          adjust,
              SpiceDouble          step,
              SpiceInt             nintvls,
              SpiceCell          * cnfine,
              SpiceCell          * result  )

/*

-Brief_I/O

   Variable  I/O  Description
   --------  ---  --------------------------------------------------
   SPICE_GF_CNVTOL   P   Convergence tolerance
   target            I   Name of the target 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.
   nintvls           I   Workspace window interval count.
   cnfine           I-O  SPICE window to which the search is confined.
   result            O   SPICE window containing results.

-Detailed_Input

   target      is the name of a target body. The target body is
               an ephemeris object; its trajectory is given by
               SPK data.

               The string `target' is case-insensitive, and leading
               and trailing blanks in `target' are not significant.
               Optionally, you may supply a string containing the
               integer ID code for the object. For example both
               "MOON" and "301" are legitimate strings that indicate
               the Moon is the target body.

               The target and observer define a position vector which
               points from the observer to the target; the time derivative
               length of this vector is the "range rate" that serves as
               the subject of the search performed by this routine.


   abcorr      indicates the aberration corrections to be applied to
               the observer-target state vector to account for
               one-way light time and stellar aberration.

               Any aberration correction accepted by the SPICE
               routine spkezr_c is accepted here. See the header
               of spkezr_c for a detailed description of the
               aberration correction options. For convenience,
               the options are listed below:

                  "NONE"     Apply no correction.

                  "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.

                  "XLT"      "Transmission" case:  correct for
                             one-way light time using a Newtonian
                             formulation.

                  "XLT+S"    "Transmission" case:  correct for
                             one-way light time and stellar
                             aberration using a Newtonian
                             formulation.

                  "XCN"      "Transmission" case:  converged
                             Newtonian light time correction.

                  "XCN+S"    "Transmission" case:  converged
                             Newtonian light time and stellar
                             aberration corrections.

               Case and blanks are not significant in the string
               `abcorr'.

   obsrvr      is the name of the observing body. The observing body is
               an ephemeris object; its trajectory is given by SPK
               data. `obsrvr' is case-insensitive, and leading and
               trailing blanks in `obsrvr' are not significant.
               Optionally, you may supply a string containing the
               integer ID code for the object. For example both "MOON"
               and "301" are legitimate strings that indicate the Moon
               is the observer.

   relate      is a relational operator used to define a constraint
               on observer-target range rate. 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:

                  ">"      Distance is greater than the reference
                           value `refval'.

                  "="      Distance is equal to the reference
                           value `refval'.

                  "<"      Distance is less than the reference
                           value `refval'.


                 "ABSMAX"  Distance is at an absolute maximum.

                 "ABSMIN"  Distance is at an absolute  minimum.

                 "LOCMAX"  Distance is at a local maximum.

                 "LOCMIN"  Distance 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
              specify 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.

              Case is not significant in the string `relate'.

    refval    is the reference value used together with the argument
              `relate' to define an equality or inequality to be
              satisfied by the range rate between the specified target
              and observer. See the discussion of `relate' above for
              further information.

              The units of `refval' are km/sec.

   adjust     is a parameter used to modify searches for absolute
              extrema: when `relate' is set to "ABSMAX" or "ABSMIN" and
              `adjust' is set to a positive value, gfdist_c will find
              times when the observer-target range rate is within
              `adjust' km/sec of the specified extreme value.

              If `adjust' is non-zero and a search for an absolute
              minimum `min' is performed, the result window contains
              time intervals when the observer-target range rate has
              values between `min' and min+adjust.

              If the search is for an absolute maximum `max', the
              corresponding range is from max-adjust to `max'.

              `adjust' is not used for searches for local extrema,
              equality or inequality conditions.

   step       is the step size to be used in the search. `step' must
              be short enough for a search using this step size
              to locate the time intervals where the specified
              range rate 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 SPICE_GF_CNVTOL for
              details.

              `step' has units of TDB seconds.

   nintvls    is a parameter specifying the number of intervals that
              can be accommodated by each of the dynamically allocated
              windows used internally by this routine. `nintvls' should
              be at least as large as the number of intervals within
              the search region on which the specified range rate
              function is monotone increasing or decreasing. See
              the Examples section below for code examples illustrating
              the use of this parameter.

   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.

-Detailed_Output

   cnfine     is the input confinement window, updated if necessary
              so the control area of its data array indicates the
              window's size and cardinality. The window data are
              unchanged.


   result     is the window of intervals, contained within the
              confinement window `cnfine', on which the specified
              constraint is satisfied.

              If `result' is non-empty on input, its contents will be
              discarded before 'gfrr_c' conducts its search.

              `result' must be declared with sufficient size to capture
              the full set of time intervals within the search region
              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 be returned with a cardinality
              of zero.

-Parameters

   SPICE_GF_CNVTOL

              is the convergence tolerance used for finding endpoints
              of the intervals comprising the result window.
              SPICE_GF_CNVTOL is used to determine when binary searches
              for roots should terminate: when a root is bracketed
              within an interval of length SPICE_GF_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.

              SPICE_GF_CNVTOL is declared in the header file SpiceGF.h.

-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, an error is signaled
       by a routine in the call tree of this routine.

   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_c can be used to contract the result window.

   3)  If an error (typically cell overflow) occurs while performing
       window arithmetic, the error will be diagnosed by a routine
       in the call tree of this routine.

   4)  If the relational operator `relate' is not recognized, an
       error is signaled by a routine in the call tree of this
       routine.

   5)  If the aberration correction specifier contains an
       unrecognized value, an error is signaled by a routine in the
       call tree of this routine.

   6)  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.

   7)  If either of the input body names do not map to NAIF ID
       codes, an error is signaled by a routine in the call tree of
       this routine.

   8)  If required ephemerides or other kernel data are not
       available, an error is signaled by a routine in the call tree
       of this routine.

   9)  If the workspace interval count is less than 1, the error
       SPICE(VALUEOUTOFRANGE) will be signaled.

   10) If the required amount of workspace memory cannot be
       allocated, the error SPICE(MALLOCFAILURE) will be
       signaled.

   11) If any input string argument pointer is null, the error
       SPICE(NULLPOINTER) will be signaled.

   12) If any input string argument is empty, the error
       SPICE(EMPTYSTRING) will be signaled.

   13) If either input cell has type other than SpiceDouble,
       the error SPICE(TYPEMISMATCH) is signaled.

-Files

   Appropriate kernels must be loaded by the calling program before
   this routine is called.

   The following data are required:

      - SPK data: ephemeris data for target and observer for 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_c.

   In all cases, kernel data are normally loaded once per program
   run, NOT every time this routine is called.

-Particulars

   This routine determines if the caller-specified constraint condition
   on the geometric event (range rate) 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_c for conducting the searches for
   observer-target range rate value events. Applications that require
   support for progress reporting, interrupt handling, non-default step
   or refinement functions, or non-default convergence tolerance should
   call gfevnt_c 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 specified
   range rate 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 range rate 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 via 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 range rate  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 range rate is zero can be
   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 range rate 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 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" include times when extrema are attained and
   times when the geometric quantity function is equal to a reference
   value or adjusted extremum. 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 convergence tolerance used by this
   routine is set via the parameter SPICE_GF_CNVTOL.

   The value of SPICE_GF_CNVTOL is set to a "tight" value so that the
   tolerance doesn't limit 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
   SPICE_GF_CNVTOL value by calling the routine gfstol_c, e.g.

      gfstol_c( tolerance value in seconds )

   Call gfstol_c prior to calling this routine. All subsequent
   searches will use the updated tolerance value.

   Searches over time windows of long duration may require use of
   larger tolerance values than the default: the tolerance must be
   large enough so that it, when added to or subtracted from the
   confinement window's lower and upper bounds, yields distinct time
   values.

   Setting the tolerance tighter than SPICE_GF_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.

   Consider the following example: suppose one wishes to find the
   times when the range rate between Io and the Earth attains a global
   minimum over some (lengthy) time interval. There is one local
   minimum every few days. The required step size for this search
   must be smaller than the shortest interval on which the range rate
   is monotone increasing or decreasing; this step size will be less
   than half the average time between local minima. However, we know
   that a global minimum can't occur when the Jupiter-Sun-Earth
   angle is greater than 90 degrees. We can use a step size of a
   half year to find the time period, within our original time
   interval, during which this angle is less than 90 degrees; this
   time period becomes the confinement window for our Earth-Io
   range rate search. This way we've used a quick (due to the large
   step size) search to cut out about half of the search period over
   which we must perform a slower search using a small step size.

-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

   Example:

      Determine the time windows from January 1, 2007 UTC to
      April 1, 2007 UTC for which the sun-moon range rate satisfies the
      relation conditions with respect to a reference value of
      0.3365 km/s radians (this range rate known to occur within the
      search interval). Also determine the time windows corresponding
      to the local maximum and minimum range rate, and the absolute
      maximum and minimum range rate during the search interval.

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      #include "SpiceUsr.h"

      #define       MAXWIN    20000
      #define       TIMFMT    "YYYY-MON-DD HR:MN:SC.###"
      #define       TIMLEN    41
      #define       NLOOPS    7

      int main( int argc, char **argv )
         {

         /.
         Create the needed windows. Note, one window
         consists of two values, so the total number
         of cell values to allocate is twice
         the number of intervals.
         ./
         SPICEDOUBLE_CELL ( result, 2*MAXWIN );
         SPICEDOUBLE_CELL ( cnfine, 2        );

         SpiceDouble       begtim;
         SpiceDouble       endtim;
         SpiceDouble       step;
         SpiceDouble       adjust;
         SpiceDouble       refval;
         SpiceDouble       beg;
         SpiceDouble       end;

         SpiceChar         begstr [ TIMLEN ];
         SpiceChar         endstr [ TIMLEN ];

         SpiceChar       * target = "MOON";
         SpiceChar       * abcorr = "NONE";
         SpiceChar       * obsrvr = "SUN";

         SpiceInt          count;
         SpiceInt          i;
         SpiceInt          j;

         ConstSpiceChar * relate [NLOOPS] = { "=",
                                              "<",
                                              ">",
                                              "LOCMIN",
                                              "ABSMIN",
                                              "LOCMAX",
                                              "ABSMAX",
                                            };

         /.
         Load kernels.
         ./
         furnsh_c( "standard.tm" );

         /.
         Store the time bounds of our search interval in
         the cnfine confinement window.
         ./
         str2et_c( "2007 JAN 01", &begtim );
         str2et_c( "2007 APR 01", &endtim );

         wninsd_c ( begtim, endtim, &cnfine );

         /.
         Search using a step size of 1 day (in units of seconds).
         The reference value is .3365 km/s. We're not using the
         adjustment feature, so we set 'adjust' to zero.
         ./
         step   = spd_c();
         adjust = 0.;
         refval = .3365;

         for ( j = 0;  j < NLOOPS;  j++ )
            {

            printf ( "Relation condition: %s \n",  relate[j] );

            /.
            Perform the search. The SPICE window 'result' contains
            the set of times when the condition is met.
            ./
            gfrr_c ( target,
                     abcorr,
                     obsrvr,
                     relate[j],
                     refval,
                     adjust,
                     step,
                     MAXWIN,
                     &cnfine,
                     &result );

            count = wncard_c( &result );

            /.
            Display the results.
            ./
            if (count == 0 )
               {
               printf ( "Result window is empty.\n\n" );
               }
            else
               {
               for ( i = 0;  i < count;  i++ )
                  {

                  /.
                  Fetch the endpoints of the Ith interval
                  of the result window.
                  ./
                  wnfetd_c ( &result, i, &beg, &end );

                  timout_c ( beg, TIMFMT, TIMLEN, begstr );
                  timout_c ( end, TIMFMT, TIMLEN, endstr );

                  printf ( "Start time, drdt = %s \n", begstr );
                  printf ( "Stop time,  drdt = %s \n", endstr );

                  }

               }

            printf("\n");

            }

         return( 0 );
         }


   The program outputs:

      Relation condition: =
      Start time, drdt = 2007-JAN-02 00:35:19.574
      Stop time,  drdt = 2007-JAN-02 00:35:19.574
      Start time, drdt = 2007-JAN-19 22:04:54.899
      Stop time,  drdt = 2007-JAN-19 22:04:54.899
      Start time, drdt = 2007-FEB-01 23:30:13.428
      Stop time,  drdt = 2007-FEB-01 23:30:13.428
      Start time, drdt = 2007-FEB-17 11:10:46.540
      Stop time,  drdt = 2007-FEB-17 11:10:46.540
      Start time, drdt = 2007-MAR-04 15:50:19.929
      Stop time,  drdt = 2007-MAR-04 15:50:19.929
      Start time, drdt = 2007-MAR-18 09:59:05.959
      Stop time,  drdt = 2007-MAR-18 09:59:05.959

      Relation condition: <
      Start time, drdt = 2007-JAN-02 00:35:19.574
      Stop time,  drdt = 2007-JAN-19 22:04:54.899
      Start time, drdt = 2007-FEB-01 23:30:13.428
      Stop time,  drdt = 2007-FEB-17 11:10:46.540
      Start time, drdt = 2007-MAR-04 15:50:19.929
      Stop time,  drdt = 2007-MAR-18 09:59:05.959

      Relation condition: >
      Start time, drdt = 2007-JAN-01 00:00:00.000
      Stop time,  drdt = 2007-JAN-02 00:35:19.574
      Start time, drdt = 2007-JAN-19 22:04:54.899
      Stop time,  drdt = 2007-FEB-01 23:30:13.428
      Start time, drdt = 2007-FEB-17 11:10:46.540
      Stop time,  drdt = 2007-MAR-04 15:50:19.929
      Start time, drdt = 2007-MAR-18 09:59:05.959
      Stop time,  drdt = 2007-APR-01 00:00:00.000

      Relation condition: LOCMIN
      Start time, drdt = 2007-JAN-11 07:03:58.988
      Stop time,  drdt = 2007-JAN-11 07:03:58.988
      Start time, drdt = 2007-FEB-10 06:26:15.439
      Stop time,  drdt = 2007-FEB-10 06:26:15.439
      Start time, drdt = 2007-MAR-12 03:28:36.404
      Stop time,  drdt = 2007-MAR-12 03:28:36.404

      Relation condition: ABSMIN
      Start time, drdt = 2007-JAN-11 07:03:58.988
      Stop time,  drdt = 2007-JAN-11 07:03:58.988

      Relation condition: LOCMAX
      Start time, drdt = 2007-JAN-26 02:27:33.766
      Stop time,  drdt = 2007-JAN-26 02:27:33.766
      Start time, drdt = 2007-FEB-24 09:35:07.816
      Stop time,  drdt = 2007-FEB-24 09:35:07.816
      Start time, drdt = 2007-MAR-25 17:26:56.150
      Stop time,  drdt = 2007-MAR-25 17:26:56.150

      Relation condition: ABSMAX
      Start time, drdt = 2007-MAR-25 17:26:56.150
      Stop time,  drdt = 2007-MAR-25 17:26:56.150

-Restrictions

   1) The kernel files to be used by this routine must be loaded
      (normally using the CSPICE routine furnsh_c) before this
      routine is called.

   2) This routine has the side effect of re-initializing the
      range rate quantity utility package. Callers may themselves
      need to re-initialize the range rate quantity utility
      package after calling this routine.

-Literature_References

   None.

-Author_and_Institution

   N.J. Bachman   (JPL)
   E.D. Wright    (JPL)

-Version

   -CSPICE Version 1.0.1, 28-FEB-2013 (NJB) (EDW)

      Header was updated to discuss use of gfstol_c.

      Edit to comments to correct search description.

      Edits to Example section, proper description of "standard.tm"
      meta kernel.

   -CSPICE Version 1.0.0, 26-AUG-2009 (EDW) (NJB)

-Index_Entries

 GF range rate search

-&
*/

{   /* Begin gfrr_c */

    /*
    Local variables
    */
    doublereal            * work;

    static SpiceInt         nw = SPICE_GF_NWRR;
    SpiceInt                nBytes;

    /*
    Participate in error tracing.
    */

    chkin_c ( "gfrr_c" );

    /*
    Make sure cell data types are d.p.
    */
    CELLTYPECHK2 ( CHK_STANDARD, "gfrr_c", SPICE_DP, cnfine, result );

    /*
    Initialize the input cells if necessary.
    */
    CELLINIT2 ( cnfine, result );

    /*
    Check the input strings to make sure each pointer is non-null
    and each string length is non-zero.
    */
    CHKFSTR ( CHK_STANDARD, "gfrr_c", target );
    CHKFSTR ( CHK_STANDARD, "gfrr_c", abcorr );
    CHKFSTR ( CHK_STANDARD, "gfrr_c", obsrvr );
    CHKFSTR ( CHK_STANDARD, "gfrr_c", relate );

    /*
    Check the workspace size; some mallocs have a violent
    dislike for negative allocation amounts. To be safe,
    rule out a count of zero intervals as well.
    */

    if ( nintvls < 1 )
    {
        setmsg_c ( "The specified workspace interval count # was "
                   "less than the minimum allowed value of one (1)." );
        errint_c ( "#",  nintvls                              );
        sigerr_c ( "SPICE(VALUEOUTOFRANGE)"                   );
        chkout_c ( "gfrr_c"                                   );
        return;
    }

    /*
    Allocate the workspace. 'nintvls' indicates the maximum number of
    intervals returned in 'result'. An interval consists of
    two values.
    */

    nintvls = 2 * nintvls;

    nBytes  = ( nintvls + SPICE_CELL_CTRLSZ ) * nw * sizeof(SpiceDouble);

    work    = (doublereal *) alloc_SpiceMemory( nBytes );

    if ( !work )
    {
        setmsg_c ( "Workspace allocation of # bytes failed due to "
                   "malloc failure"                               );
        errint_c ( "#",  nBytes                                   );
        sigerr_c ( "SPICE(MALLOCFAILED)"                          );
        chkout_c ( "gfrr_c"                                       );
        return;
    }

    /*
    Let the f2'd routine do the work.
    */

    gfrr_( ( char          * ) target,
           ( char          * ) abcorr,
           ( char          * ) obsrvr,
           ( char          * ) relate,
           ( doublereal    * ) &refval,
           ( doublereal    * ) &adjust,
           ( doublereal    * ) &step,
           ( doublereal    * ) (cnfine->base),
           ( integer       * ) &nintvls,
           ( integer       * ) &nw,
           ( doublereal    * ) work,
           ( doublereal    * ) (result->base),
           ( ftnlen          ) strlen(target),
           ( ftnlen          ) strlen(abcorr),
           ( ftnlen          ) strlen(obsrvr),
           ( ftnlen          ) strlen(relate) );

    /*
    De-allocate the workspace.
    */
    free_SpiceMemory( work );

    /*
    Sync the output cell.
    */
    if ( !failed_c() )
    {
        zzsynccl_c ( F2C, result ) ;
    }

    ALLOC_CHECK;

    chkout_c ( "gfrr_c" );

} /* End gfrr_c */
示例#24
0
   void pcklof_c ( ConstSpiceChar * filename,
                   SpiceInt       * handle    )

/*

-Brief_I/O

   Variable  I/O  Description
   --------  ---  --------------------------------------------------
   filename   I   Name of the file to be loaded.
   handle     O   Loaded file's handle.

-Detailed_Input

   filename   Character name of the file to be loaded.

-Detailed_Output

   handle     Integer handle assigned to the file upon loading.
              Other PCK routine will subsequently use this number
              to refer to the file.

-Parameters

   None.

-Exceptions

   1) If an attempt is made to load more files than is specified
      by the paramater ftsize defined in pckbsr_, the error
      SPICE(PCKFILETABLEFULL) is signalled.

   2) The error SPICE(EMPTYSTRING) is signalled if the input
      string does not contain at least one character, since the
      input string cannot be converted to a Fortran-style string
      in this case.

   3) The error SPICE(NULLPOINTER) is signalled if the input string
      pointer is null.

   This routine makes use of DAF file system routines and is subject
   to all of the constraints imposed by the DAF fuile system. See
   the DAF Required Reading or individual DAF routines for details.

-Files

   A file specified by filename, to be loaded.  The file is assigned a
   handle by pcklof_c, which will be used by other routines to
   refer to it.

-Particulars

   If there is room for a new file in the file table, pcklof_c creates
   an entry for it, and opens the file for reading.

   Also, if the body table is empty, pcklof_c initializes it, this
   being as good a place as any.

-Examples

   Load a binary PCK kernel and return the integer handle.

      pck      = "/kernels/gen/pck/earth6.bpc";
      pcklof_c ( pck, &handle );

   Also see the Example in PCKLOF.FOR.

-Restrictions

   None.

-Literature_References

   DAF Required Reading

-Author_and_Institution

   K.S. Zukor         (JPL)
   E.D. Wright        (JPL)

-Version

   -CSPICE Version 2.0.1, 20-MAR-1998 (EDW)

      Minor correction to header.

   -CSPICE Version 2.0.0, 08-FEB-1998 (NJB)

      Input argument filename was changed to type ConstSpiceChar *.

      Re-implemented routine without dynamically allocated, temporary
      strings.

   -CSPICE Version 1.0.0, 25-OCT-1997 (EDW)

-Index_Entries

   load PCK orientation file

-&
*/

{ /* Begin pcklof_c */


   /*
   Participate in error tracing.
   */
   chkin_c ( "pcklof_c" );


   /*
   Check the input string filename to make sure the pointer is non-null
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "pcklof_c", filename );


   /*
   Call the f2c'd Fortran routine.
   */
   pcklof_ ( ( char       * )  filename,
             ( integer    * )  handle,
             ( ftnlen       )  strlen(filename)    );


   chkout_c ( "pcklof_c" );


} /* End pcklof_c */
示例#25
0
   void errch_c ( ConstSpiceChar * marker,
                  ConstSpiceChar * string )

/*

-Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  ---------------------------------------------------
   marker     I   A substring of the error message to be replaced.
   string     I   The character string to substitute for marker.

-Detailed_Input


   marker     is a character string that marks a position in
              the long error message where a character string
              is to be substituted.  Leading and trailing blanks
              in marker are not significant.

              Case IS significant:  "XX" is considered to be
              a different marker from "xx".

   string     is a character string that will be substituted for
              the first occurrence of marker in the long error
              message.  This occurrence of the substring indicated
              by marker will be removed and replaced by string.
              Leading and trailing blanks in string are not
              significant.  However, if string is completely blank,
              a single blank character will be substituted for
              the marker.

-Detailed_Output

   None.

-Parameters

   LMSGLN  is the maximum length of the long error message.  See
           the include file errhnd.inc for the value of LMSGLN.

-Exceptions

   1)  If the character string resulting from the substitution
       exceeds the maximum length of the long error message, the
       long error message is truncated on the right.  No error is
       signaled.

   2)  If marker is blank, no substitution is performed.  No error
       is signaled.

   3)  If string is blank, then the first occurrence of marker is
       replaced by a single blank.

   4)  If marker does not appear in the long error message, no
       substitution is performed.  No error is signaled.

   5)  If changes to the long error message are disabled, this
       routine has no effect.

   6) The error SPICE(EMPTYSTRING) is signaled if either input string
      does not contain at least one character, since an input string
      cannot be converted to a Fortran-style string in this case.

   7) The error SPICE(NULLPOINTER) is signalled if either string pointer
      argument is null.

-Files

   None.

-Particulars

   The purpose of this routine is to allow you to tailor the long
   error message to include specific information that is available
   only at run time.  This capability is somewhat like being able to
   put variables in your error messages.

-Examples

   1)   In this example, the marker is  "#".  We'll signal a file
        open error, and we'll include in the error message the name
        of the file we tried to open.  There are three steps:

           -- Set the long message, using a marker for the location
              where a value is to be substituted.

           -- Substitute the file name into the error message.

           -- Signal the error (causing output of error messages)
              using the CSPICE routine sigerr_c.

           /.
           Error on file open attempt.  Signal an error.
           The character string variable FILE contains the
           file name.

           After the call to errch_c, the long error message
           will contain the file name held in the string
           FILE.  For example, if FILE contains the name
           "MYFILE.DAT", the long error message will be

               "File open error.  File is MYFILE.DAT."

           ./

           setmsg_c ( "File open error.  File is #." );
           errch_c  ( "#",  FILE                     );
           sigerr_c ( "SPICE(FILEOPENFAILED)"        );


   2)   Same example as (1), except this time we'll use a better-
        looking and more descriptive marker than "#".  Instead,
        we'll use the marker "FILENAME".  This does not affect the
        long error message; it just makes the code more readable.

           /.
           Error on file open attempt.  Signal an error.
           The character string variable FILE contains the
           file name.
           ./

           setmsg_c ( "File open error. File is FILENAME.");
           errch_c  ( "FILENAME",  FILE                   );
           sigerr_c ( "SPICE(FILEOPENFAILED)"             );


   3)   Same example as (2), except this time there's a problem with
        the variable FILE: it's blank.  This time, the code fragment

           /.
           Error on file open attempt.  Signal an error.
           The character string variable FILE contains the
           file name.
           ./
           setmsg_c ( "File open error. File is FILENAME." );
           errch_c  ( "FILENAME",  FILE                    );

        sets the long error message to

           "File open error.  File is  "


-Restrictions

   1) The caller must ensure that the message length, after sub-
      stitution is performed, doesn't exceed LMSGLN characters.
      See errch.c.

-Literature_References

   None.

-Author_and_Institution

   J.E. McLean     (JPL)
   N.J. Bachman    (JPL)

-Version

   -CSPICE Version 1.2.0, 08-FEB-1998 (NJB)

      Re-implemented routine without dynamically allocated, temporary
      strings.  Made various header fixes.

   -CSPICE Version 1.0.0, 25-OCT-1997   (EDW)

-Index_Entries

   insert string into error message text

-&
*/

{ /* Begin errch_c */


   /*
   Check the input strings to make sure the pointers are non-null
   and the string lengths are non-zero.  Since we don't check in
   prior to this, use the discovery check-in option.
   */
   CHKFSTR ( CHK_DISCOVER, "errch_c", marker );
   CHKFSTR ( CHK_DISCOVER, "errch_c", string );


   /*
   Call the f2c'd Fortran routine.
   */
   errch_ ( ( char * ) marker,
            ( char * ) string,
            ( ftnlen ) strlen(marker),
            ( ftnlen ) strlen(string) );


} /* End errch_c */
示例#26
0
void pcpool_c ( ConstSpiceChar  * name,
                SpiceInt          n,
                SpiceInt          lenvals,
                const void      * cvals    )
/*

-Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   name       I   The kernel pool name to associate with cvals.
   n          I   The number of values to insert.
   lenvals    I   The lengths of the strings in the array cvals.
   cvals      I   An array of strings to insert into the kernel pool.

-Detailed_Input

   name       is the name of the kernel pool variable to associate
              with the values supplied in the array cvals. 'name' is
              restricted to a length of 32 characters or less.

   n          is the number of values to insert into the kernel pool.

   lenvals    is the length of the strings in the array cvals,
              including the null terminators.

   cvals      is an array of strings to insert into the kernel
              pool.  cvals should be declared as follows:

                 char  cvals[n][lenvals];

-Detailed_Output

   None.

-Parameters

   None.

-Exceptions

   1) If name is already present in the kernel pool and there
      is sufficient room to hold all values supplied in values,
      the old values associated with name will be overwritten.

   2) If there is not sufficient room to insert a new variable
      into the kernel pool and name is not already present in
      the kernel pool, the error SPICE(KERNELPOOLFULL) is
      signaled by a routine in the call tree to this routine.

   3) If there is not sufficient room to insert the values associated
      with name, the error SPICE(NOMOREROOM) will be signaled.

   4) If either input string pointer is null, the error
      SPICE(NULLPOINTER) will be signaled.

   5) If the input string name has length zero, the error
      SPICE(EMPTYSTRING) will be signaled.

   6) If the input cvals string length is less than 2, the error
      SPICE(STRINGTOOSHORT) will be signaled.

   7) The error 'SPICE(BADVARNAME)' signals if the kernel pool
      variable name length exceeds 32.

-Files

   None.

-Particulars

   This entry point provides a programmatic interface for inserting
   character data into the SPICE kernel pool without reading an
   external file.

-Examples

   The following example program shows how a topocentric frame for a
   point on the surface of the earth may be defined at run time using
   pcpool_c, pdpool_c, and pipool_c.  In this example, the surface
   point is associated with the body code 300000.  To facilitate
   testing, the location of the surface point coincides with that of
   the DSN station DSS-12; the reference frame MYTOPO defined here
   coincides with the reference frame DSS-12_TOPO.

      #include <stdio.h>
      #include "SpiceUsr.h"

      int main()
      {
         /.
         The first angle is the negative of the longitude of the
         surface point; the second angle is the negative of the
         point's colatitude.
         ./
         SpiceDouble             angles [3]      =  { -243.1945102442646,
                                                       -54.7000629043147,
                                                       180.0              };

         SpiceDouble             et              =    0.0;
         SpiceDouble             rmat   [3][3];

         SpiceInt                axes   [3]      =  { 3, 2, 3 };
         SpiceInt                center          =    300000;
         SpiceInt                frclass         =    4;
         SpiceInt                frclsid         =    1500000;
         SpiceInt                frcode          =    1500000;

         /.
         Define the MYTOPO reference frame.

         Note that the third argument in the pcpool_c calls is
         the length of the final string argument, including the
         terminating null character.
         ./
         pipool_c ( "FRAME_MYTOPO",            1,     &frcode   );
         pcpool_c ( "FRAME_1500000_NAME",      1, 7,  "MYTOPO"  );
         pipool_c ( "FRAME_1500000_CLASS",     1,     &frclass  );
         pipool_c ( "FRAME_1500000_CLASS_ID",  1,     &frclsid  );
         pipool_c ( "FRAME_1500000_CENTER",    1,     &center   );

         pcpool_c ( "OBJECT_300000_FRAME",     1, 7,  "MYTOPO"  );

         pcpool_c ( "TKFRAME_MYTOPO_RELATIVE", 1, 7,  "ITRF93"  );
         pcpool_c ( "TKFRAME_MYTOPO_SPEC",     1, 7,  "ANGLES"  );
         pcpool_c ( "TKFRAME_MYTOPO_UNITS",    1, 8,  "DEGREES" );
         pipool_c ( "TKFRAME_MYTOPO_AXES",     3,     axes      );
         pdpool_c ( "TKFRAME_MYTOPO_ANGLES",   3,     angles    );

         /.
         Load a high precision binary earth PCK. Also load a
         topocentric frame kernel for DSN stations. The file names
         shown here are simply examples; users should replace these
         with the names of appropriate kernels.
         ./
         furnsh_c ( "earth_000101_060207_051116.bpc" );
         furnsh_c ( "earth_topo_050714.tf"           );

         /.
         Look up transformation from DSS-12_TOPO frame to MYTOPO frame.
         This transformation should differ by round-off error from
         the identity matrix.
         ./
         pxform_c ( "DSS-12_TOPO", "MYTOPO", et, rmat );

         printf   ( "\n"
                    "DSS-12_TOPO to MYTOPO transformation at "
                    "et %23.16e = \n"
                    "\n"
                    "    %25.16f  %25.16f  %25.16f\n"
                    "    %25.16f  %25.16f  %25.16f\n"
                    "    %25.16f  %25.16f  %25.16f\n",
                    et,
                    rmat[0][0],  rmat[0][1],  rmat[0][2],
                    rmat[1][0],  rmat[1][1],  rmat[1][2],
                    rmat[2][0],  rmat[2][1],  rmat[2][2]       );

         return ( 0 );
      }


-Restrictions

   None.

-Literature_References

   None.

-Author_and_Institution

   N.J. Bachman    (JPL)
   W.L. Taber      (JPL)

-Version

   -CSPICE Version 1.3.3,  17-JAN-2014 (NJB)

      Updated Index_Entries section.

   -CSPICE Version 1.3.2,  10-FEB-2010 (EDW)

      Added mention of the restriction on kernel pool variable
      names to 32 characters or less.

      Reordered header sections to conform to SPICE convention.

   -CSPICE Version 1.3.1, 17-NOV-2005 (NJB)

      Replaced code fragment in Examples section of header with
      smaller, complete program.

   -CSPICE Version 1.3.0, 12-JUL-2002 (NJB)

      Call to C2F_CreateStrArr_Sig replaced with call to C2F_MapStrArr.

   -CSPICE Version 1.2.0, 28-AUG-2001 (NJB)

      Const-qualified input array cvals.

   -CSPICE Version 1.1.0, 14-FEB-2000 (NJB)

       Calls to C2F_CreateStrArr replaced with calls to error-signaling
       version of this routine:  C2F_CreateStrArr_Sig.

   -CSPICE Version 1.0.0, 18-JUN-1999 (NJB) (WLT)

-Index_Entries

   Set the value of a character_variable in the kernel_pool

-&
*/

{   /* Begin pcpool_c */


    /*
    Local variables
    */
    SpiceChar             * fCvalsArr;

    SpiceInt                fCvalsLen;


    /*
    Participate in error tracing.
    */
    chkin_c ( "pcpool_c" );

    /*
    Check the input kernel variable name to make sure the pointer is
    non-null and the string length is non-zero.
    */
    CHKFSTR ( CHK_STANDARD, "pcpool_c", name );


    /*
    Make sure the input string pointer for the cvals array is non-null
    and that the length lenvals is sufficient.
    */
    CHKOSTR ( CHK_STANDARD, "pcpool_c", cvals, lenvals );


    /*
    Create a Fortran-style string array.
    */
    C2F_MapStrArr ( "pcpool_c",
                    n, lenvals, cvals, &fCvalsLen, &fCvalsArr );

    if ( failed_c() )
    {
        chkout_c ( "pcpool_c" );
        return;
    }


    /*
    Call the f2c'd routine.
    */
    pcpool_ (  ( char       * ) name,
               ( integer    * ) &n,
               ( char       * ) fCvalsArr,
               ( ftnlen       ) strlen(name),
               ( ftnlen       ) fCvalsLen     );


    /*
    Free the dynamically allocated array.
    */
    free ( fCvalsArr );


    chkout_c ( "pcpool_c" );

} /* End pcpool_c */
示例#27
0
文件: cklpf_c.c 项目: Dbelsa/coft
   void cklpf_c ( ConstSpiceChar * filename,
                  SpiceInt       * handle    )

/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   filename   I   Name of the CK file to be loaded. 
   handle     O   Loaded file's handle. 
 
-Detailed_Input
 
   filename   is the name of a C-kernel file to be loaded. 
 
-Detailed_Output
 
   handle     is an integer handle assigned to the file upon loading. 
              Almost every other CK routine will subsequently use 
              this number to refer to the file. 
 
-Parameters
 
   ftsize     is the maximum number of pointing files that can 
              be loaded by CKLPF at any given time for use by the 
              readers. 
 
-Exceptions
 
   1) If an attempt is made to load more files than is specified 
      by the parameter ftsize, the error "SPICE(CKTOOMANYFILES)" 
      is signalled. 
 
   2) If an attempt is made to open more DAF files than is specified 
      by the parameter ftsize in DAFAH, an error is signalled by a 
      routine that this routine calls. 
 
   3) If the file specified by filename can not be opened, an error 
      is signalled by a routine that this routine calls. 
 
   4) If the file specified by filename has already been loaded, 
      it will become the "last-loaded" file.  (The readers 
      search the last-loaded file first.) 
 
-Files
 
   The C-kernel file specified by filename is loaded.  The file is 
   assigned an integer handle by CKLPF.  Other CK routines will refer 
   to this file by its handle. 
 
-Particulars
 
   See Particulars in ckbsr. 
 
   If there is room for a new file, CKLPF opens the file for 
   reading.  This routine must be called prior to a call to CKGP or 
   CKGPAV. 
 
   CK readers search files loaded with CKLPF in the reverse order 
   in which they were loaded.  That is, last-loaded files are 
   searched first. 
 
-Examples

   ck_kern  = "/kernels/mpf/ck/lander_nominal.bck";
   cklpf_c ( ck_kern, &hand );

   Also see the Example in ckbsr.for. 
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution

   J.M. Lynch     (JPL) 
   J.E. McLean    (JPL) 
   M.J. Spencer   (JPL) 
   R.E. Thurman   (JPL) 
   I.M. Underwood (JPL) 
   E.D. Wright    (JPL) 
   B.V. Semenov   (JPL)
   
-Version
 
   -CSPICE Version 2.0.1, 31-JAN-2008 (BVS)

       Removed '-Revisions' from the header.

   -CSPICE Version 2.0.0, 08-FEB-1998 (NJB)  
   
       Input argument filename changed to type ConstSpiceChar *;
       name was changed to "filename" from "fname."
   
       References to C2F_CreateStr_Sig were removed; code was
       cleaned up accordingly.  String checks are now done using
       the macro CHKFSTR.
       
   -CSPICE Version 1.0.0, 25-OCT-1997 (EDW)

-Index_Entries
 
   load ck pointing file 
 
-& 
*/

{ /* Begin spklef_c */


   /*
   Participate in error tracing.
   */
   chkin_c ( "cklpf_c" );


   /*
   Check the input string filename to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "cklpf_c", filename );
   

   /*
   Call the f2c'd Fortran routine.
   */
   cklpf_ ( ( char     * )  filename, 
            ( integer  * )  handle, 
            ( ftnlen     )  strlen(filename) );


   chkout_c ( "cklpf_c" );   

} /* end cklpf_c */
示例#28
0
文件: swpool_c.c 项目: Dbelsa/coft
   void swpool_c ( ConstSpiceChar    * agent,
                   SpiceInt            nnames,
                   SpiceInt            lenvals,
                   const void        * names   ) 
/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   agent      I   The name of an agent to be notified after updates. 
   nnames     I   The number of variables to associate with agent. 
   lenvals    I   Length of strings in the names array.
   names      I   Variable names whose update causes the notice. 
 
-Detailed_Input
 
   agent       is the name of a routine or entry point (agency) that 
               will want to know when a some variables in the kernel 
               pool have been updated. 
 
   nnames      is the number of kernel pool variable names that will 
               be associated with agent. 
 
   lenvals     is the length of the strings in the array names, 
               including the null terminators.  
              
   names       is an array of names of variables in the kernel pool. 
               Whenever any of these is updated, a notice will be 
               posted for agent so that one can quickly check 
               whether needed data has been modified. 
 
-Detailed_Output
 
   None. 
 
-Parameters
 
   None. 
 
-Files
 
   None. 
 
-Exceptions
 
   1) If sufficient room is not available to hold a name or new agent,
      a routine in the call tree for this routine will signal an error.
 
   2) If either of the input string pointers are null, the error 
      SPICE(NULLPOINTER) will be signaled.
      
   3) If any input string agent has length zero, the error 
      SPICE(EMPTYSTRING) will be signaled.
      
   4) The caller must pass a value indicating the length of the strings
      in the names array.  If this value is not at least 2, the error
      SPICE(STRINGTOOSHORT) will be signaled.
      
-Particulars
 
   The kernel pool is a convenient place to store a wide variety of
   data needed by routines in CSPICE and routines that interface with
   CSPICE routines.  However, when a single name has a large quantity
   of data associated with it, it becomes inefficient to constantly
   query the kernel pool for values that are not updated on a frequent
   basis.
 
   This entry point allows a routine to instruct the kernel pool to
   post a message whenever a particular value gets updated. In this
   way, a routine can quickly determine whether or not data it requires
   has been updated since the last time the data was accessed.  This
   makes it reasonable to buffer the data in local storage and update
   it only when a variable in the kernel pool that affects this data
   has been updated.
 
   Note that swpool_c has a side effect.  Whenever a call to swpool_c
   is made, the agent specified in the calling sequence is added to the
   list of agents that should be notified that an update of its
   variables has occurred.  In other words the code
 
       swpool_c ( agent, nnames, lenvals, names   ); 
       cvpool_c ( agent,                  &update ); 
 
   will always return update as SPICETRUE. 
 
   This feature allows for a slightly cleaner use of swpool_c and
   cvpool_c as shown in the example below.  Because swpool_c
   automatically loads agent into the list of agents to notify of a
   kernel pool update, you do not have to include the code for fetching
   the initial values of the kernel variables in the initialization
   portion of a subroutine.  Instead, the code for the first fetch from
   the pool is the same as the code for fetching when the pool is
   updated.
 
-Examples
 
   Suppose that you have an application subroutine, MYTASK, that 
   needs to access a large data set in the kernel pool.  If this 
   data could be kept in local storage and kernel pool queries 
   performed only when the data in the kernel pool has been 
   updated, the routine can perform much more efficiently. 
 
   The code fragment below illustrates how you might make use of this 
   feature. 
 
      #include "SpiceUsr.h"
           .
           .
           .
      /.  
      On the first call to this routine establish those variables 
      that we will want to read from the kernel pool only when 
      new values have been assigned. 
      ./
      if ( first )
      {
         first = SPICEFALSE;
         swpool_c ( "MYTASK", nnames, lenvals, names ); 
      }
 
      /.
      If any of the variables has been updated, fetch them from the
      kernel pool.
      ./    
        
      cvpool_c ( "MYTASK", &update ); 
 
      if ( update )
      {
         for ( i = 0;  i < NVAR;  i++ )
         {
            gdpool_c( MYTASK_VAR[i], 1, NMAX, n[i], val[i], &found[i] );
         }
      }
 
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   N.J. Bachman    (JPL)
   W.L. Taber      (JPL) 
 
-Version
 
   -CSPICE Version 1.3.0, 27-AUG-2002 (NJB)

      Call to C2F_CreateStrArr_Sig replaced with call to C2F_MapStrArr.

   -CSPICE Version 1.2.0, 28-AUG-2001 (NJB)

      Const-qualified input array names.

   -CSPICE Version 1.1.0, 14-FEB-2000 (NJB)

       Calls to C2F_CreateStrArr replaced with calls to error-signaling 
       version of this routine:  C2F_CreateStrArr_Sig.
      
   -CSPICE Version 1.0.0, 05-JUN-1999 (NJB) (WLT)

-Index_Entries
 
   Watch for an update to a kernel pool variable 
   Notify a routine of an update to a kernel pool variable 
-&
*/

{ /* Begin swpool_c */


   /*
   Local variables
   */

   SpiceChar             * fCvalsArr;

   SpiceInt                fCvalsLen;


   /*
   Participate in error tracing.
   */
   chkin_c ( "swpool_c" );


   /*
   Make sure the input string pointer for agent is non-null 
   and that the length is sufficient.  
   */
   CHKFSTR ( CHK_STANDARD, "swpool_c", agent );

   /*
   Make sure the input string pointer for the names array is non-null 
   and that the length lenvals is sufficient.  
   */
   CHKOSTR ( CHK_STANDARD, "swpool_c", names, lenvals );

   /*
   Create a Fortran-style string array.
   */
   C2F_MapStrArr ( "swpool_c", 
                   nnames, lenvals, names, &fCvalsLen,  &fCvalsArr );

   if ( failed_c() )
   {
      chkout_c ( "swpool_c" );
      return;
   }


   /*
   Call the f2c'd routine.
   */
   swpool_ (  ( char       * ) agent,
              ( integer    * ) &nnames,
              ( char       * ) fCvalsArr,
              ( ftnlen       ) strlen(agent),
              ( ftnlen       ) fCvalsLen      );


   /*
   Free the dynamically allocated array.
   */
   free ( fCvalsArr );


   chkout_c ( "swpool_c" );

} /* End swpool_c */
示例#29
0
   void ckw01_c ( SpiceInt            handle, 
                  SpiceDouble         begtim,
                  SpiceDouble         endtim,
                  SpiceInt            inst,
                  ConstSpiceChar    * ref,
                  SpiceBoolean        avflag,
                  ConstSpiceChar    * segid, 
                  SpiceInt            nrec,
                  ConstSpiceDouble    sclkdp [],
                  ConstSpiceDouble    quats  [][4],
                  ConstSpiceDouble    avvs   [][3]  )
/*

-Brief_I/O
 
   Variable  I/O  Description 
   --------  ---  -------------------------------------------------- 
   handle     I   Handle of an open CK file. 
   begtim     I   The beginning encoded SCLK of the segment. 
   endtim     I   The ending encoded SCLK of the segment. 
   inst       I   The NAIF instrument ID code. 
   ref        I   The reference frame of the segment. 
   avflag     I   True if the segment will contain angular velocity. 
   segid      I   Segment identifier. 
   nrec       I   Number of pointing records. 
   sclkdp     I   Encoded SCLK times. 
   quats      I   Quaternions representing instrument pointing. 
   avvs       I   Angular velocity vectors. 
 
-Detailed_Input
 
   handle     is the handle of the CK file to which the segment will 
              be written. The file must have been opened with write 
              access. 
 
   begtim     is the beginning encoded SCLK time of the segment. This 
              value should be less than or equal to the first time in 
              the segment. 
 
   endtim     is the encoded SCLK time at which the segment ends. 
              This value should be greater than or equal to the last 
              time in the segment. 
 
   inst       is the NAIF integer ID code for the instrument. 
 
   ref        is a character string which specifies the  
              reference frame of the segment. This should be one of 
              the frames supported by the SPICELIB routine NAMFRM 
              which is an entry point of FRAMEX. 
 
   avflag     is a logical flag which indicates whether or not the 
              segment will contain angular velocity. 
 
   segid      is the segment identifier.  A CK segment identifier may 
              contain up to 40 characters, excluding the terminating
              null.
 
   nrec       is the number of pointing instances in the segment. 
 
   sclkdp     are the encoded spacecraft clock times associated with 
              each pointing instance. These times must be strictly 
              increasing. 
 
   quats      is an array of SPICE-style quaternions representing a
              sequence of C-matrices. See the discussion of "Quaternion
              Styles" in the Particulars section below.
 
   avvs       are the angular velocity vectors (optional). 
 
              If avflag is FALSE then this array is ignored by the 
              routine, however it still must be supplied as part of 
              the calling sequence. 
 
-Detailed_Output
 
   None.  See Files section. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1)  If handle is not the handle of a C-kernel opened for writing 
       the error will be diagnosed by routines called by this 
       routine. 
 
   2)  If segid is more than 40 characters long, the error 
       SPICE(SEGIDTOOLONG) is signaled. 
 
   3)  If segid contains any nonprintable characters, the error 
       SPICE(NONPRINTABLECHARS) is signaled. 
 
   4)  If the first encoded SCLK time is negative then the error 
       SPICE(INVALIDSCLKTIME) is signaled. If any subsequent times 
       are negative the error SPICE(TIMESOUTOFORDER) is signaled. 
 
   5)  If the encoded SCLK times are not strictly increasing, 
       the error SPICE(TIMESOUTOFORDER) is signaled. 
 
   6)  If begtim is greater than sclkdp[0] or endtim is less than 
       sclkdp[nrec-1], the error SPICE(INVALIDDESCRTIME) is 
       signaled. 
 
   7)  If the name of the reference frame is not one of those 
       supported by the SPICELIB routine NAMFRM, the error 
       SPICE(INVALIDREFFRAME) is signaled. 
 
   8)  If nrec, the number of pointing records, is less than or 
       equal to 0, the error SPICE(INVALIDNUMRECS) is signaled. 
 
   9)  If any quaternion has magnitude zero, the error
       SPICE(ZEROQUATERNION) is signaled.


-Files
 
   This routine adds a type 1 segment to a C-kernel.  The C-kernel 
   may be either a new one or an existing one opened for writing. 
 
-Particulars
 
   For a detailed description of a type 1 CK segment please see the 
   CK Required Reading. 
 
   This routine relieves the user from performing the repetitive 
   calls to the DAF routines necessary to construct a CK segment. 
 

   Quaternion Styles
   -----------------

   There are different "styles" of quaternions used in
   science and engineering applications. Quaternion styles
   are characterized by

      - The order of quaternion elements

      - The quaternion multiplication formula

      - The convention for associating quaternions
        with rotation matrices

   Two of the commonly used styles are

      - "SPICE"

         > Invented by Sir William Rowan Hamilton
         > Frequently used in mathematics and physics textbooks

      - "Engineering"

         > Widely used in aerospace engineering applications


   CSPICE function interfaces ALWAYS use SPICE quaternions.
   Quaternions of any other style must be converted to SPICE
   quaternions before they are passed to CSPICE functions.


   Relationship between SPICE and Engineering Quaternions
   ------------------------------------------------------

   Let M be a rotation matrix such that for any vector V,

      M*V

   is the result of rotating V by theta radians in the
   counterclockwise direction about unit rotation axis vector A.
   Then the SPICE quaternions representing M are

      (+/-) (  cos(theta/2),
               sin(theta/2) A(1),
               sin(theta/2) A(2),
               sin(theta/2) A(3)  )

   while the engineering quaternions representing M are

      (+/-) ( -sin(theta/2) A(1),
              -sin(theta/2) A(2),
              -sin(theta/2) A(3),
               cos(theta/2)       )

   For both styles of quaternions, if a quaternion q represents
   a rotation matrix M, then -q represents M as well.

   Given an engineering quaternion

      QENG   = ( q0,  q1,  q2,  q3 )

   the equivalent SPICE quaternion is

      QSPICE = ( q3, -q0, -q1, -q2 )


   Associating SPICE Quaternions with Rotation Matrices
   ----------------------------------------------------

   Let FROM and TO be two right-handed reference frames, for
   example, an inertial frame and a spacecraft-fixed frame. Let the
   symbols

      V    ,   V
       FROM     TO

   denote, respectively, an arbitrary vector expressed relative to
   the FROM and TO frames. Let M denote the transformation matrix
   that transforms vectors from frame FROM to frame TO; then

      V   =  M * V
       TO         FROM

   where the expression on the right hand side represents left
   multiplication of the vector by the matrix.

   Then if the unit-length SPICE quaternion q represents M, where

      q = (q0, q1, q2, q3)

   the elements of M are derived from the elements of q as follows:

        +-                                                         -+
        |           2    2                                          |
        | 1 - 2*( q2 + q3 )   2*(q1*q2 - q0*q3)   2*(q1*q3 + q0*q2) |
        |                                                           |
        |                                                           |
        |                               2    2                      |
    M = | 2*(q1*q2 + q0*q3)   1 - 2*( q1 + q3 )   2*(q2*q3 - q0*q1) |
        |                                                           |
        |                                                           |
        |                                                   2    2  |
        | 2*(q1*q3 - q0*q2)   2*(q2*q3 + q0*q1)   1 - 2*( q1 + q2 ) |
        |                                                           |
        +-                                                         -+

   Note that substituting the elements of -q for those of q in the
   right hand side leaves each element of M unchanged; this shows
   that if a quaternion q represents a matrix M, then so does the
   quaternion -q.

   To map the rotation matrix M to a unit quaternion, we start by
   decomposing the rotation matrix as a sum of symmetric
   and skew-symmetric parts:

                                      2
      M = [ I  +  (1-cos(theta)) OMEGA  ] + [ sin(theta) OMEGA ]

                   symmetric                   skew-symmetric


   OMEGA is a skew-symmetric matrix of the form

                 +-             -+
                 |  0   -n3   n2 |
                 |               |
       OMEGA  =  |  n3   0   -n1 |
                 |               |
                 | -n2   n1   0  |
                 +-             -+

   The vector N of matrix entries (n1, n2, n3) is the rotation axis
   of M and theta is M's rotation angle.  Note that N and theta
   are not unique.

   Let

      C = cos(theta/2)
      S = sin(theta/2)

   Then the unit quaternions Q corresponding to M are

      Q = +/- ( C, S*n1, S*n2, S*n3 )

   The mappings between quaternions and the corresponding rotations
   are carried out by the CSPICE routines

      q2m_c {quaternion to matrix}
      m2q_c {matrix to quaternion}

   m2q_c always returns a quaternion with scalar part greater than
   or equal to zero.


   SPICE Quaternion Multiplication Formula
   ---------------------------------------

   Given a SPICE quaternion

      Q = ( q0, q1, q2, q3 )

   corresponding to rotation axis A and angle theta as above, we can
   represent Q using "scalar + vector" notation as follows:

      s =   q0           = cos(theta/2)

      v = ( q1, q2, q3 ) = sin(theta/2) * A

      Q = s + v

   Let Q1 and Q2 be SPICE quaternions with respective scalar
   and vector parts s1, s2 and v1, v2:

      Q1 = s1 + v1
      Q2 = s2 + v2

   We represent the dot product of v1 and v2 by

      <v1, v2>

   and the cross product of v1 and v2 by

      v1 x v2

   Then the SPICE quaternion product is

      Q1*Q2 = s1*s2 - <v1,v2>  + s1*v2 + s2*v1 + (v1 x v2)

   If Q1 and Q2 represent the rotation matrices M1 and M2
   respectively, then the quaternion product

      Q1*Q2

   represents the matrix product

      M1*M2


-Examples
 
  
   This example writes a type 1 C-kernel segment for the 
   Galileo scan platform to a previously opened file attached to 
   handle. 
 
      /.
      Include CSPICE interface definitions.
      ./
      #include "SpiceUsr.h"
                .
                .
                .
      /.
      Assume arrays of quaternions, angular velocities, and the 
      associated SCLK times are produced elsewhere. 
      ./
                . 
                . 
                . 
      /.
      The subroutine ckw01_c needs the following items for the 
      segment descriptor: 
      
         1) SCLK limits of the segment. 
         2) Instrument code. 
         3) Reference frame. 
         4) The angular velocity flag. 
      ./
      
      begtim  = (SpiceChar *) sclk[0]; 
      endtim  = (SpiceChar *) sclk[nrec-1];
 
      inst    = -77001;
      ref     = "J2000";
      avflag  = SPICETRUE;
      segid   = "GLL SCAN PLT - DATA TYPE 1"; 
 
      /.
      Write the segment. 
      ./
      ckw01_c ( handle,  begtim,  endtim,  inst,  ref,  avflag, 
                segid,   nrec,    sclkdp,  quats, avvs         );
                
                . 
                . 
                . 
             
      /.
      After all segments are written, close the C-kernel.
      ./
      ckcls_c ( handle );
      
 
-Restrictions
 
   None. 
 
-Literature_References
 
   None. 
 
-Author_and_Institution
 
   K.R. Gehringer  (JPL) 
   N.J. Bachman    (JPL) 
   J.M. Lynch      (JPL) 
 
-Version

   -CSPICE Version 2.0.0, 01-JUN-2010 (NJB)

      The check for non-unit quaternions has been replaced
      with a check for zero-length quaternions. (The
      implementation of the check is located in ckw01_.)

   -CSPICE Version 1.3.2, 27-FEB-2008 (NJB)

      Updated header; added information about SPICE 
      quaternion conventions.

   -CSPICE Version 1.3.1, 12-JUN-2006 (NJB)

      Corrected typo in example, the sclk indexes for the begtim
      and endtim assignments used FORTRAN convention.
 
   -CSPICE Version 1.3.0, 28-AUG-2001 (NJB)

      Changed prototype:  inputs sclkdp, quats, and avvs are now
      const-qualified.  Implemented interface macros for casting 
      these inputs to const.
            
   -CSPICE Version 1.2.0, 02-SEP-1999 (NJB)  
   
      Local type logical variable now used for angular velocity
      flag used in interface of ckw01_.
            
   -CSPICE Version 1.1.0, 08-FEB-1998 (NJB)  
   
      References to C2F_CreateStr_Sig were removed; code was
      cleaned up accordingly.  String checks are now done using
      the macro CHKFSTR.
       
   -CSPICE Version 1.0.0, 25-OCT-1997 (NJB)
   
      Based on SPICELIB Version 2.0.0, 28-DEC-1993 (WLT)

-Index_Entries
 
   write ck type_1 pointing data segment 
 
-&
*/

{ /* Begin ckw01_c */


   /*
   Local variables
   */
   logical                 avf;
   
   
   /*
   Participate in error handling.
   */
   chkin_c ( "ckw01_c" );

 
   /*
   Check the input strings to make sure the pointers
   are non-null and the string lengths are non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "ckw01_c", ref   );
   CHKFSTR ( CHK_STANDARD, "ckw01_c", segid );
 
   /*
   Get a type logical copy of the a.v. flag.
   */
   avf = avflag;
   
 
   /*
   Write the segment.  Note that the quaternion and angular velocity
   arrays DO NOT require transposition!
   */

   ckw01_( ( integer    * ) &handle, 
           ( doublereal * ) &begtim, 
           ( doublereal * ) &endtim, 
           ( integer    * ) &inst, 
           ( char       * ) ref, 
           ( logical    * ) &avf, 
           ( char       * ) segid, 
           ( integer    * ) &nrec, 
           ( doublereal * ) sclkdp,
           ( doublereal * ) quats, 
           ( doublereal * ) avvs, 
           ( ftnlen       ) strlen(ref), 
           ( ftnlen       ) strlen(segid)  );


   chkout_c ( "ckw01_c" );

} /* End ckw01_c */
示例#30
0
   void pgrrec_c ( ConstSpiceChar  * body,
                   SpiceDouble       lon,
                   SpiceDouble       lat,
                   SpiceDouble       alt,
                   SpiceDouble       re,
                   SpiceDouble       f,
                   SpiceDouble       rectan[3] ) 

/*

-Brief_I/O
 
   VARIABLE  I/O  DESCRIPTION 
   --------  ---  -------------------------------------------------- 
   body       I   Body with which coordinate system is associated. 
   lon        I   Planetographic longitude of a point (radians). 
   lat        I   Planetographic latitude of a point (radians). 
   alt        I   Altitude of a point above reference spheroid. 
   re         I   Equatorial radius of the reference spheroid. 
   f          I   Flattening coefficient. 
   rectan     O   Rectangular coordinates of the point. 
 
-Detailed_Input
 
   body       Name of the body with which the planetographic 
              coordinate system is associated. 
 
              `body' is used by this routine to look up from the 
              kernel pool the prime meridian rate coefficient giving 
              the body's spin sense.  See the Files and Particulars 
              header sections below for details. 
 
   lon        Planetographic longitude of the input point.  This is 
              the angle between the prime meridian and the meridian 
              containing the input point.  For bodies having 
              prograde (aka direct) rotation, the direction of 
              increasing longitude is positive west:  from the +X 
              axis of the rectangular coordinate system toward the 
              -Y axis.  For bodies having retrograde rotation, the 
              direction of increasing longitude is positive east: 
              from the +X axis toward the +Y axis. 
 
              The earth, moon, and sun are exceptions: 
              planetographic longitude is measured positive east for 
              these bodies. 
 
              The default interpretation of longitude by this 
              and the other planetographic coordinate conversion 
              routines can be overridden; see the discussion in 
              Particulars below for details. 
 
              Longitude is measured in radians. On input, the range 
              of longitude is unrestricted. 
 
   lat        Planetographic latitude of the input point.  For a 
              point P on the reference spheroid, this is the angle 
              between the XY plane and the outward normal vector at 
              P. For a point P not on the reference spheroid, the 
              planetographic latitude is that of the closest point 
              to P on the spheroid. 
 
              Latitude is measured in radians.  On input, the 
              range of latitude is unrestricted.  
 
   alt        Altitude of point above the reference spheroid. 
              Units of `alt' must match those of  `re'. 
 
   re         Equatorial radius of a reference spheroid.  This 
              spheroid is a volume of revolution:  its horizontal 
              cross sections are circular.  The shape of the 
              spheroid is defined by an equatorial radius  `re' and 
              a polar radius `rp'.  Units of  `re' must match those of  
              `alt'. 
 
   f          Flattening coefficient =  
 
                 (re-rp) / re 
 
              where `rp' is the polar radius of the spheroid, and the 
              units of `rp' match those of  `re'. 
 
-Detailed_Output
 
   rectan     The rectangular coordinates of the input point.  See 
              the discussion below in the Particulars header section 
              for details. 
 
              The units associated with `rectan' are those associated 
              with the inputs `alt' and `re'. 
 
-Parameters
 
   None. 
 
-Exceptions
 
   1) If the body name `body' cannot be mapped to a NAIF ID code, 
      and if `body' is not a string representation of an integer, 
      the error SPICE(IDCODENOTFOUND) will be signaled. 
 
   2) If the kernel variable   
 
         BODY<ID code>_PGR_POSITIVE_LON 
 
      is present in the kernel pool but has a value other 
      than one of 
 
          'EAST' 
          'WEST' 
 
      the error SPICE(INVALIDOPTION) will be signaled.  Case 
      and blanks are ignored when these values are interpreted. 
 
   3) If polynomial coefficients for the prime meridian of `body' 
      are not available in the kernel pool, and if the kernel 
      variable BODY<ID code>_PGR_POSITIVE_LON is not present in 
      the kernel pool, the error SPICE(MISSINGDATA) will be signaled. 
       
   4) If the equatorial radius is non-positive, the error 
      SPICE(VALUEOUTOFRANGE) is signaled. 
 
   5) If the flattening coefficient is greater than or equal to one, 
      the error SPICE(VALUEOUTOFRANGE) is signaled. 

   6) The error SPICE(EMPTYSTRING) is signaled if the input
      string `body' does not contain at least one character, since the
      input string cannot be converted to a Fortran-style string in
      this case.
      
   7) The error SPICE(NULLPOINTER) is signaled if the input string
      pointer `body' is null.
 
-Files
 
   This routine expects a kernel variable giving body's prime 
   meridian angle as a function of time to be available in the 
   kernel pool.  Normally this item is provided by loading a PCK 
   file.  The required kernel variable is named  
 
      BODY<body ID>_PM  
 
   where <body ID> represents a string containing the NAIF integer  
   ID code for `body'.  For example, if `body' is "JUPITER", then  
   the name of the kernel variable containing the prime meridian  
   angle coefficients is  
 
      BODY599_PM 
 
   See the PCK Required Reading for details concerning the prime 
   meridian kernel variable. 
 
   The optional kernel variable  
    
      BODY<body ID>_PGR_POSITIVE_LON 
 
   also is normally defined via loading a text kernel. When this 
   variable is present in the kernel pool, the prime meridian 
   coefficients for `body' are not required by this routine. See the 
   Particulars section below for details. 
 
-Particulars
 
   Given the planetographic coordinates of a point, this routine 
   returns the body-fixed rectangular coordinates of the point.  The 
   body-fixed rectangular frame is that having the X-axis pass 
   through the 0 degree latitude 0 degree longitude direction, the 
   Z-axis pass through the 90 degree latitude direction, and the 
   Y-axis equal to the cross product of the unit Z-axis and X-axis 
   vectors. 
 
   The planetographic definition of latitude is identical to the 
   planetodetic (also called "geodetic" in SPICE documentation) 
   definition. In the planetographic coordinate system, latitude is 
   defined using a reference spheroid.  The spheroid is 
   characterized by an equatorial radius and a polar radius. For a 
   point P on the spheroid, latitude is defined as the angle between 
   the X-Y plane and the outward surface normal at P.  For a point P 
   off the spheroid, latitude is defined as the latitude of the 
   nearest point to P on the spheroid.  Note if P is an interior 
   point, for example, if P is at the center of the spheroid, there 
   may not be a unique nearest point to P. 
 
   In the planetographic coordinate system, longitude is defined 
   using the spin sense of the body.  Longitude is positive to the 
   west if the spin is prograde and positive to the east if the spin 
   is retrograde.  The spin sense is given by the sign of the first 
   degree term of the time-dependent polynomial for the body's prime 
   meridian Euler angle "W":  the spin is retrograde if this term is 
   negative and prograde otherwise.  For the sun, planets, most 
   natural satellites, and selected asteroids, the polynomial 
   expression for W may be found in a SPICE PCK kernel. 
 
   The earth, moon, and sun are exceptions: planetographic longitude 
   is measured positive east for these bodies. 
 
   If you wish to override the default sense of positive longitude 
   for a particular body, you can do so by defining the kernel 
   variable 
 
      BODY<body ID>_PGR_POSITIVE_LON 
 
   where <body ID> represents the NAIF ID code of the body. This 
   variable may be assigned either of the values 
 
      'WEST' 
      'EAST' 
 
   For example, you can have this routine treat the longitude 
   of the earth as increasing to the west using the kernel 
   variable assignment 
 
      BODY399_PGR_POSITIVE_LON = 'WEST' 
       
   Normally such assignments are made by placing them in a text 
   kernel and loading that kernel via furnsh_c. 
 
   The definition of this kernel variable controls the behavior of 
   the CSPICE planetographic routines 
 
      pgrrec_c 
      recpgr_c 
      dpgrdr_c 
      drdpgr_c 
 
   It does not affect the other CSPICE coordinate conversion 
   routines. 
 
-Examples
 
   Numerical results shown for this example may differ between 
   platforms as the results depend on the SPICE kernels used as 
   input and the machine specific arithmetic implementation. 
 
 
   1) Find the rectangular coordinates of the point having Mars 
      planetographic coordinates: 
 
         longitude = 90 degrees west 
         latitude  = 45 degrees north 
         altitude  = 300 km 
 

               #include <stdio.h>
               #include "SpiceUsr.h"

               int main()
            {
               /.
               Local variables 
               ./
               SpiceDouble             alt;
               SpiceDouble             f;
               SpiceDouble             lat;
               SpiceDouble             lon;
               SpiceDouble             radii  [3];
               SpiceDouble             re;
               SpiceDouble             rectan [3];
               SpiceDouble             rp;

               SpiceInt                n;


               /.
               Load a PCK file containing a triaxial
               ellipsoidal shape model and orientation
               data for Mars.
               ./
               furnsh_c ( "pck00008.tpc" );

               /.
               Look up the radii for Mars.  Although we
               omit it here, we could first call badkpv_c
               to make sure the variable BODY499_RADII
               has three elements and numeric data type.
               If the variable is not present in the kernel
               pool, bodvrd_c will signal an error.
               ./
               bodvrd_c ( "MARS", "RADII", 3, &n, radii );

               /.
               Compute flattening coefficient.
               ./
               re  =  radii[0];
               rp  =  radii[2];
               f   =  ( re - rp ) / re;

               /.
               Do the conversion.  Note that we must provide
               longitude and latitude in radians.
               ./
               lon =  90.0  * rpd_c();
               lat =  45.0  * rpd_c();
               alt =   3.e2;

               pgrrec_c ( "mars", lon, lat, alt, re, f, rectan );


               printf ( "\n"
                        "Planetographic coordinates:\n"
                        "\n"
                        "  Longitude (deg)        = %18.9e\n"
                        "  Latitude  (deg)        = %18.9e\n"
                        "  Altitude  (km)         = %18.9e\n"
                        "\n"
                        "Ellipsoid shape parameters:\n"
                        "\n"
                        "  Equatorial radius (km) = %18.9e\n"
                        "  Polar radius      (km) = %18.9e\n"
                        "  Flattening coefficient = %18.9e\n"
                        "\n"
                        "Rectangular coordinates:\n"
                        "\n"
                        "  X (km)                 = %18.9e\n"
                        "  Y (km)                 = %18.9e\n"
                        "  Z (km)                 = %18.9e\n"
                        "\n",
                        lon / rpd_c(),
                        lat / rpd_c(),
                        alt,
                        re,
                        rp,
                        f,
                        rectan[0],
                        rectan[1],
                        rectan[2]              );

               return ( 0 );
            }


      Output from this program should be similar to the following 
      (rounding and formatting differ across platforms): 


         Planetographic coordinates:

           Longitude (deg)        =    9.000000000e+01
           Latitude  (deg)        =    4.500000000e+01
           Altitude  (km)         =    3.000000000e+02

         Ellipsoid shape parameters:

           Equatorial radius (km) =    3.396190000e+03
           Polar radius      (km) =    3.376200000e+03
           Flattening coefficient =    5.886007556e-03

         Rectangular coordinates:

           X (km)                 =    1.604650025e-13
           Y (km)                 =   -2.620678915e+03
           Z (km)                 =    2.592408909e+03


 
   2) Below is a table showing a variety of rectangular coordinates 
      and the corresponding Mars planetographic coordinates.  The 
      values are computed using the reference spheroid having radii 
 
         Equatorial radius:    3397 
         Polar radius:         3375 
 
      Note:  the values shown above may not be current or suitable 
             for your application. 
 
 
      Corresponding rectangular and planetographic coordinates are 
      listed to three decimal places. 
 
  rectan[0]    rectan[1]   rectan[2]    lon        lat         alt 
  ------------------------------------------------------------------ 
   3397.000      0.000      0.000       0.000      0.000       0.000  
  -3397.000      0.000      0.000     180.000      0.000       0.000  
  -3407.000      0.000      0.000     180.000      0.000      10.000  
  -3387.000      0.000      0.000     180.000      0.000     -10.000  
      0.000  -3397.000      0.000      90.000      0.000       0.000  
      0.000   3397.000      0.000     270.000      0.000       0.000  
      0.000      0.000   3375.000       0.000     90.000       0.000  
      0.000      0.000  -3375.000       0.000    -90.000       0.000  
      0.000      0.000      0.000       0.000     90.000   -3375.000 
 
 
 
   3)  Below we show the analogous relationships for the earth, 
       using the reference ellipsoid radii 
 
          Equatorial radius:    6378.140 
          Polar radius:         6356.750 
 
       Note the change in longitudes for points on the +/- Y axis 
       for the earth vs the Mars values.  
 
  rectan[0]    rectan[1]   rectan[2]    lon        lat         alt 
  ------------------------------------------------------------------ 
   6378.140      0.000      0.000       0.000      0.000       0.000  
  -6378.140      0.000      0.000     180.000      0.000       0.000  
  -6388.140      0.000      0.000     180.000      0.000      10.000  
  -6368.140      0.000      0.000     180.000      0.000     -10.000  
      0.000  -6378.140      0.000     270.000      0.000       0.000  
      0.000   6378.140      0.000      90.000      0.000       0.000  
      0.000      0.000   6356.750       0.000     90.000       0.000  
      0.000      0.000  -6356.750       0.000    -90.000       0.000  
      0.000      0.000      0.000       0.000     90.000   -6356.750 
 
 
-Restrictions
 
   None. 
 
-Author_and_Institution
 
   C.H. Acton      (JPL) 
   N.J. Bachman    (JPL) 
   H.A. Neilan     (JPL) 
   B.V. Semenov    (JPL) 
   W.L. Taber      (JPL) 
 
-Literature_References
 
   None. 
 
-Version
 
   -CSPICE Version 1.0.0, 26-DEC-2004 (CHA) (NJB) (HAN) (BVS) (WLT)

-Index_Entries
 
   convert planetographic to rectangular coordinates 
 
-&
*/

{ /* Begin pgrrec_c */

 
   /*
   Participate in error tracing.
   */
   if ( return_c() )
   {
      return; 
   }
   chkin_c ( "pgrrec_c" );


   /*
   Check the input string body to make sure the pointer is non-null 
   and the string length is non-zero.
   */
   CHKFSTR ( CHK_STANDARD, "pgrrec_c", body );
   

   /*
   Call the f2c'd Fortran routine.
   */
   pgrrec_ ( ( char       * ) body,
             ( doublereal * ) &lon,
             ( doublereal * ) &lat,
             ( doublereal * ) &alt,
             ( doublereal * ) &re,
             ( doublereal * ) &f,
             ( doublereal * ) rectan,
             ( ftnlen       ) strlen(body)  );



   chkout_c ( "pgrrec_c" );

} /* End pgrrec_c */