Main Page
Geometric Event Finding Hands-On Lesson, using MEX (FORTRAN)

Table of Contents


   Geometric Event Finding Hands-On Lesson, using MEX (FORTRAN)
      Overview
      Note About HTML Links
      References
         Tutorials
         Required Readings
         The Permuted Index
         API Documentation
      Kernels Used
      SPICE Modules Used

   Find View Periods
      Task Statement
      Learning Goals
      Approach
         Solution steps
      Solution
         Solution Meta-Kernel
         Solution Code
         Solution Sample Output

   Find Times when Target is Visible
      Task Statement
      Learning Goals
      Approach
         Solution steps
      Solution
         Solution Meta-Kernel
         Solution Code
         Solution Sample Output

   Extra Credit
      Task statements
      Solutions




Top

Geometric Event Finding Hands-On Lesson, using MEX (FORTRAN)





March 01, 2023



Top

Overview




This lesson illustrates how the Geometry Finder (GF) subsystem of the SPICE Toolkit can be used to find time intervals when specified geometric conditions are satisfied.

In this lesson the student is asked to construct a program that finds the time intervals, within a specified time range, when the Mars Express Orbiter (MEX) is visible from the DSN station DSS-14. Possible occultation of the spacecraft by Mars is to be considered.



Top

Note About HTML Links




The HTML version of this lesson contains links pointing to various HTML documents provided with the Toolkit. All of these links are relative and, in order to function, require this document to be in a certain location in the Toolkit HTML documentation directory tree.

In order for the links to be resolved, if not done already by installing the lessons package under the Toolkit's ``doc/html'' directory, create a subdirectory called ``lessons'' under the ``doc/html'' directory of the ``toolkit/'' tree and copy this document to that subdirectory before loading it into a Web browser.



Top

References




This section lists SPICE documents referred to in this lesson.

Of these documents, the ``Tutorials'' contains the highest level descriptions with the least number of details while the ``Required Reading'' documents contain much more detailed specifications. The most complete specifications are provided in the ``API Documentation''.

In some cases the lesson explanations also refer to the information provided in the meta-data area of the kernels used in the lesson examples. It is especially true in case of the FK and IK files, which often contain comprehensive descriptions of the frames, instrument FOVs, etc. Since both FK and IK are text kernels, the information provided in them can be viewed using any text editor, while the meta information provided in binary kernels -- SPKs and CKs -- can be viewed using ``commnt'' or ``spacit'' utility programs located in ``toolkit/exe'' of Toolkit installation tree.



Top

Tutorials



The following SPICE tutorials serve as references for the discussions in this lesson:

 
   Name              Lesson steps/routines it describes
   ----------------  -----------------------------------------------
   Time              Time Conversion
   SCLK and LSK      Time Conversion
   SPK               Obtaining Ephemeris Data
   Frames            Reference Frames
   Using Frames      Reference Frames
   PCK               Planetary Constants Data
   Lunar-Earth PCK   Lunar and Earth Orientation Data
   GF                The SPICE Geometry Finder (GF) subsystem
   DSK               Detailed Target Shape (Topography) Data
These tutorials are available from the NAIF server at JPL:

   https://naif.jpl.nasa.gov/naif/tutorials.html


Top

Required Readings



The Required Reading documents are provided with the Toolkit and are located under the ``toolkit/doc'' directory in the SPICE Toolkit installation tree.

   Name             Lesson steps/routines that it describes
   ---------------  -----------------------------------------
   cells.req        Cell/window initialization
   frames.req       Using reference frames
   gf.req           The SPICE geometry finder (GF) subsystem
   kernel.req       Loading SPICE kernels
   naif_ids.req     Body and reference frame names
   pck.req          Obtaining planetary constants data
   spk.req          Computing positions and velocities
   time.req         UTC to ET time conversion
   windows.req      The SPICE window data type


Top

The Permuted Index



Another useful document distributed with the Toolkit is the permuted index. It is located under the ``toolkit/doc'' directory in the FORTRAN installation tree.

This text document provides a simple mechanism by which users can discover which SPICE routines perform functions of interest, as well as the names of the source files that contain these routines. It is particularly useful for FORTRAN programmers because some of the routines are entry points; the names of these routines do not translate directly into the name of the respective source files that contain them.



Top

API Documentation



The most detailed specification of a given SPICE FORTRAN routine is contained in the header section of its source code. The source code is distributed with the Toolkit and is located under the ``toolkit/src/spicelib'' path.

For example the path of the source code of the STR2ET routine is

   toolkit/src/spicelib/str2et.for
Since some of the FORTRAN routines are entry points they may be part of a source file that has different name. The ``Permuted Index'' document mentioned above can be used to locate the name of their source file.



Top

Kernels Used




The following kernels are used in examples provided in this lesson:

   #  FILE NAME                      TYPE DESCRIPTION
   -- ------------------------------ ---- ------------------------------
   1  de405xs.bsp                    SPK  Planetary ephemeris SPK,
                                          subsetted to cover only time
                                          range of interest
   2  earthstns_itrf93_050714.bsp    SPK  DSN station SPK
   3  earth_topo_050714.tf           FK   DSN station frame definitions
   4  earth_000101_060525_060303.bpc PCK  Binary PCK for Earth
   5  naif0008.tls                   LSK  Generic LSK
   6  ORMM__040501000000_00076XS.BSP SPK  MEX Orbiter trajectory SPK,
                                          subsetted to cover only time
                                          range of interest
   7  pck00008.tpc                   PCK  Generic PCK
   8  mars_lowres.bds                DSK  Low-resolution Mars DSK
These SPICE kernels are included in the lesson package.



Top

SPICE Modules Used




This section provides a complete list of the routines and kernels that are suggested for usage in each of the exercises in this lesson. (You may wish to not look at this list unless/until you ``get stuck'' while working on your own.)

   CHAPTER EXERCISE   ROUTINES   FUNCTIONS  KERNELS
   ------- ---------  ---------  ---------  ----------
      1    viewpr     FURNSH     RPD        1-7
                      TOSTDO     WNCARD
                      REPMC
                      REPMF
                      STR2ET
                      TIMOUT
                      SSIZED
                      WNINSD
                      GFPOSC
                      WNFETD
 
      2    visibl     FURNSH     RPD        1-8
                      TOSTDO     WNCARD
                      REPMC
                      REPMF
                      STR2ET
                      TIMOUT
                      SSIZED
                      WNINSD
                      GFPOSC
                      GFOCLT
                      WNDIFD
                      WNFETD
 
           extra (*)  GFDIST                1,5-7
                      KCLEAR
 
 
      (*) Additional APIs and kernels used in Extra Credit tasks.
Refer to the headers of the various routines listed above, as detailed interface specifications are provided with the source code.



Top

Find View Periods







Top

Task Statement




Write a program that finds the set of time intervals, within the time range

   2004 MAY 2 TDB
   2004 MAY 6 TDB
when the Mars Express Orbiter (MEX) is visible from the DSN station DSS-14. These time intervals are frequently called ``view periods.''

The spacecraft is considered visible if its apparent position (that is, its position corrected for light time and stellar aberration) has elevation of at least 6 degrees in the topocentric reference frame DSS-14_TOPO. In this exercise, we ignore the possibility of occultation of the spacecraft by Mars.

Use a search step size that ensures that no view periods of duration 5 minutes or longer will be missed by the search.

Display the start and stop times of these intervals using TDB calendar dates and millisecond precision.



Top

Learning Goals




Exposure to SPICE GF event finding routines. Familiarity with SPICE windows and routines that manipulate them. Exposure to SPICE time parsing and output formatting routines.



Top

Approach






Top

Solution steps



A possible solution could consist of the following steps:

Preparation:

    1. Review the SPICELIB cell and window Required Reading.

    2. Decide what SPICE kernels are necessary. Use the SPICE summary tool BRIEF to examine the coverage of the binary kernels and verify the availability of required data.

    3. Create a meta-kernel listing the SPICE kernels to be loaded. (Hint: consult a programming example tutorial, or the Introduction to Kernels tutorial, for a reminder of how to do this.)

    Name the meta-kernel 'viewpr.tm'.

Next, write a program that performs the following steps:

    1. Use FURNSH to load the meta-kernel.

    2. Declare confinement and output SPICELIB windows and initialize them using SSIZED.

    3. Insert the given time bounds into the confinement window using WNINSD.

    4. Select a step size for searching for visibility state transitions: in this case, each target rise or set event is a state transition.

    The step size must be large enough so the search proceeds with reasonable speed, but small enough so that no visibility transition events---that is, target rise or set events---are missed.

    5. Use the GF routine GFPOSC to find the window of times, within the confinement window, during which the MEX spacecraft is above the elevation limit as seen from DSN station DSS-14, in the reference frame DSS-14_TOPO.

    Use light time and stellar aberration corrections for the apparent position of the spacecraft as seen from the station.

    6. Fetch and display the contents of the result window. Use WNFETD to extract from the result window the start and stop times of each time interval. Display each of the intervals in the result window as a pair of start and stop times. Express each time as a TDB calendar date using the routine TIMOUT.

    The SPICELIB ``replace marker'' routines REPxxx are useful for substituting values into output strings. Consult, for example, the header of REPMC.

You may find it useful to consult the references listed above. In particular, the header of the SPICE GF routine GFPOSC contains pertinent documentation.



Top

Solution






Top

Solution Meta-Kernel



The meta-kernel we created for the solution to this exercise is named 'viewpr.tm'. Its contents follow:

   KPL/MK
 
      Example meta-kernel for geometric event finding hands-on
      coding lesson.
 
         Version 2.0.0 13-JUL-2017 (JDR)
 
      The names and contents of the kernels referenced by this
      meta-kernel are as follows:
 
      File Name                       Description
      ------------------------------  ------------------------------
      de405xs.bsp                     Planetary ephemeris SPK,
                                      subsetted to cover only
                                      time range of interest.
      earthstns_itrf93_050714.bsp     DSN station SPK.
      earth_topo_050714.tf            DSN station frame definitions.
      earth_000101_060525_060303.bpc  Binary PCK for Earth.
      naif0008.tls                    Generic LSK.
      ORMM__040501000000_00076XS.BSP  MEX Orbiter trajectory SPK,
                                      subsetted to cover only
                                      time range of interest.
      pck00008.tpc                    Generic PCK.
 
 
   \begindata
 
      KERNELS_TO_LOAD = (
 
              'kernels/spk/de405xs.bsp'
              'kernels/spk/earthstns_itrf93_050714.bsp'
              'kernels/fk/earth_topo_050714.tf'
              'kernels/pck/earth_000101_060525_060303.bpc'
              'kernels/lsk/naif0008.tls'
              'kernels/spk/ORMM__040501000000_00076XS.BSP'
              'kernels/pck/pck00008.tpc'
                        )
 
   \begintext


Top

Solution Code



The example program below shows one possible solution.

         PROGRAM VIEWPR
         IMPLICIT NONE
   C
   C     Find and display the window of times when the MEX
   C     spacecraft is above a specified elevation limit in the
   C     topocentric reference frame of DSN station DSS-14.
   C
 
   C
   C     SPICELIB functions
   C
         DOUBLE PRECISION      RPD
         INTEGER               WNCARD
 
   C
   C     Global GF parameters: we import from this file
   C     the definition of the GF workspace size parameter
   C
   C        NWMAX
   C
         INCLUDE 'gf.inc'
 
   C
   C     Local parameters
   C
   C     Format string for time output:
   C
         CHARACTER*(*)         TDBFMT
         PARAMETER           ( TDBFMT =
        .                    'YYYY MON DD HR:MN:SC.### (TDB) ::TDB' )
 
   C
   C     The meta-kernel:
   C
         CHARACTER*(*)         METAKR
         PARAMETER           ( METAKR = 'viewpr.tm' )
 
 
   C
   C     Maximum number of intervals in any window:
   C
         INTEGER               MAXIVL
         PARAMETER           ( MAXIVL = 1000 )
 
   C
   C     Maximum result window size:
   C
         INTEGER               MAXWIN
         PARAMETER           ( MAXWIN = 2 * MAXIVL )
 
   C
   C     SPICELIB cell bound:
   C
         INTEGER               LBCELL
         PARAMETER           ( LBCELL = -5 )
 
   C
   C     String length parameters:
   C
         INTEGER               CORLEN
         PARAMETER           ( CORLEN = 10 )
 
         INTEGER               FRNMLN
         PARAMETER           ( FRNMLN = 32 )
 
         INTEGER               LNSIZE
         PARAMETER           ( LNSIZE = 200 )
 
         INTEGER               NAMLEN
         PARAMETER           ( NAMLEN = 32 )
 
         INTEGER               OPLEN
         PARAMETER           ( OPLEN  = 50 )
 
         INTEGER               TIMLEN
         PARAMETER           ( TIMLEN = 50 )
 
   C
   C     Local variables
   C
         CHARACTER*(CORLEN)    ABCORR
         CHARACTER*(NAMLEN)    CRDSYS
         CHARACTER*(NAMLEN)    COORD
         CHARACTER*(LNSIZE)    LINE
         CHARACTER*(FRNMLN)    OBSFRM
         CHARACTER*(OPLEN)     RELATE
         CHARACTER*(NAMLEN)    SRFPT
         CHARACTER*(TIMLEN)    START
         CHARACTER*(TIMLEN)    STOP
         CHARACTER*(NAMLEN)    TARGET
         CHARACTER*(TIMLEN)    TIMSTR
         CHARACTER*(LNSIZE)    TITLE
 
         DOUBLE PRECISION      ADJUST
 
   C
   C     Confinement window used to store interval to be searched:
   C
         DOUBLE PRECISION      CNFINE ( LBCELL : MAXWIN )
         DOUBLE PRECISION      ELVLIM
         DOUBLE PRECISION      ETBEG
         DOUBLE PRECISION      ETEND
         DOUBLE PRECISION      INTBEG
         DOUBLE PRECISION      INTEND
         DOUBLE PRECISION      REVLIM
 
   C
   C     STEPSZ is the step size, measured in seconds, used to search
   C     for times bracketing a state transition.
   C
         DOUBLE PRECISION      STEPSZ
 
   C
   C     Result window used to store rise/set times:
   C
         DOUBLE PRECISION      RISWIN ( LBCELL : MAXWIN )
 
   C
   C     Workspace array:
   C
         DOUBLE PRECISION      WORK   ( LBCELL : MAXWIN,  NWMAX )
 
 
         INTEGER               I
         INTEGER               WINSIZ
 
   C
   C     Load the meta-kernel.
   C
         CALL FURNSH ( METAKR )
 
   C
   C     Assign the inputs for our search.
   C
   C     Since we're interested in the apparent location of the
   C     target, we use light time and stellar aberration
   C     corrections.  We use the "converged Newtonian" form
   C     of the light time correction because this choice may
   C     increase the accuracy of the occultation times we'll
   C     compute using GFOCLT.
   C
         SRFPT  = 'DSS-14'
         OBSFRM = 'DSS-14_TOPO'
         TARGET = 'MEX'
         ABCORR = 'CN+S'
         START  = '2004 MAY 2 TDB'
         STOP   = '2004 MAY 6 TDB'
         ELVLIM =  6.0D0
   C
   C     The elevation limit above has units of degrees; we convert
   C     this value to radians for computation using SPICE routines.
   C     We'll store the equivalent value in radians in REVLIM.
   C
         REVLIM = RPD() * ELVLIM
 
   C
   C     Since SPICE doesn't directly support the AZ/EL coordinate
   C     system, we use the equivalent constraint
   C
   C        latitude > REVLIM
   C
   C     in the latitudinal coordinate system, where the reference
   C     frame is topocentric and is centered at the viewing location.
   C
         CRDSYS = 'LATITUDINAL'
         COORD  = 'LATITUDE'
         RELATE = '>'
 
   C
   C     The adjustment value only applies to absolute extrema
   C     searches; simply give it an initial value of zero
   C     for this inequality search.
   C
         ADJUST = 0.D0
 
   C
   C     STEPSZ is the step size, measured in seconds, used to search
   C     for times bracketing a state transition. Since we don't expect
   C     any events of interest to be shorter than five minutes, and
   C     since the separation between events is well over 5 minutes,
   C     we'll use this value as our step size. Units are seconds.
   C
         STEPSZ = 300.D0
 
   C
   C     Display a banner for the output report:
   C
         TITLE  = 'Inputs for target visibility search:'
         CALL TOSTDO ( ' '   )
         CALL TOSTDO ( TITLE )
         CALL TOSTDO ( ' '   )
 
         LINE   = '   Target                       = #'
         CALL REPMC  ( LINE, '#', TARGET, LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Observation surface location = #'
         CALL REPMC  ( LINE, '#', SRFPT,  LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Observer''s reference frame   = #'
         CALL REPMC  ( LINE, '#', OBSFRM,  LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Elevation limit (degrees)    = #'
         CALL REPMF ( LINE, '#', ELVLIM, 7, 'F', LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Aberration correction        = #'
         CALL REPMC  ( LINE, '#', ABCORR, LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Step size (seconds)          = #'
         CALL REPMF ( LINE, '#', STEPSZ, 9, 'F', LINE )
         CALL TOSTDO ( LINE )
 
   C
   C     Convert the start and stop times to ET.
   C
         CALL STR2ET ( START, ETBEG )
         CALL STR2ET ( STOP,  ETEND )
 
   C
   C     Display the search interval start and stop times
   C     using the format shown below.
   C
   C        2004 MAY 06 20:15:00.000 (TDB)
   C
         CALL TIMOUT ( ETBEG, TDBFMT, TIMSTR )
         LINE = '   Start time                   = '//TIMSTR
         CALL TOSTDO ( LINE )
 
         CALL TIMOUT ( ETEND, TDBFMT, TIMSTR )
         LINE = '   Stop time                    = '//TIMSTR
         CALL TOSTDO ( LINE )
 
         CALL TOSTDO ( ' ' )
 
   C
   C     Every SPICELIB window must have its size initialized.
   C
   C     Initialize the "confinement" window with the interval
   C     over which we'll conduct the search.
   C
         CALL SSIZED ( MAXWIN, CNFINE )
 
         CALL WNINSD ( ETBEG,  ETEND, CNFINE )
 
   C
   C     Initialize the result window; this window will contain
   C     the rise/set times found by our search.
   C
         CALL SSIZED ( MAXWIN, RISWIN )
 
   C
   C     In the call below, the workspace dimensions are
   C
   C        ( MAXWIN, NWMAX )
   C
   C     Now search for the time period, within our confinement
   C     window, during which the apparent target has elevation
   C     at least equal to the elevation limit.
   C
         CALL GFPOSC ( TARGET, OBSFRM, ABCORR, SRFPT,
        .              CRDSYS, COORD,  RELATE, REVLIM,
        .              ADJUST, STEPSZ, CNFINE, MAXWIN,
        .              NWMAX,  WORK,   RISWIN         )
 
   C
   C     The function WNCARD returns the number of intervals
   C     in a SPICE window.
   C
         WINSIZ = WNCARD( RISWIN )
 
         IF ( WINSIZ .EQ. 0 ) THEN
 
            WRITE (*,*) 'No events were found.'
 
         ELSE
   C
   C        Display the view periods.
   C
            LINE = 'Visibility times of # as seen from #:'
            CALL REPMC ( LINE, '#', TARGET, LINE )
            CALL REPMC ( LINE, '#', SRFPT,  LINE )
 
            CALL TOSTDO ( LINE )
            CALL TOSTDO ( ' '  )
 
            DO I = 1, WINSIZ
   C
   C           Fetch the start and stop times of the Ith interval
   C           from the search result window RISWIN.
   C
               CALL WNFETD ( RISWIN, I, INTBEG, INTEND )
 
   C
   C           Convert the rise time to a TDB calendar string.
   C
               CALL TIMOUT ( INTBEG, TDBFMT, TIMSTR )
 
   C
   C           Write the string to standard output.
   C
               IF ( I .EQ. 1 ) THEN
                  LINE = 'Visibility or window start time:  #'
               ELSE
                  LINE = 'Visibility start time:            #'
               END IF
 
               CALL REPMC ( LINE, '#', TIMSTR, LINE )
               CALL TOSTDO ( LINE )
 
   C
   C           Convert the set time to a TDB calendar string.
   C
               CALL TIMOUT ( INTEND, TDBFMT, TIMSTR )
   C
   C           Write the string to standard output.
   C
               IF ( I .EQ. WINSIZ ) THEN
                  LINE = 'Visibility or window stop time:   #'
               ELSE
                  LINE = 'Visibility stop time:             #'
               END IF
 
               CALL REPMC ( LINE, '#', TIMSTR, LINE )
               CALL TOSTDO ( LINE )
 
               CALL TOSTDO ( ' ' )
 
            END DO
 
         END IF
 
         END


Top

Solution Sample Output



Numerical results shown for this example may differ across platforms since the results depend on the SPICE kernels used as input and on the host platform's arithmetic implementation.

After compiling the program, execute it. The output is:

 
   Inputs for target visibility search:
 
      Target                       = MEX
      Observation surface location = DSS-14
      Observer's reference frame   = DSS-14_TOPO
      Elevation limit (degrees)    = 6.000000
      Aberration correction        = CN+S
      Step size (seconds)          = 300.000000
      Start time                   = 2004 MAY 02 00:00:00.000 (TDB)
      Stop time                    = 2004 MAY 06 00:00:00.000 (TDB)
 
   Visibility times of MEX as seen from DSS-14:
 
   Visibility or window start time:  2004 MAY 02 00:00:00.000 (TDB)
   Visibility stop time:             2004 MAY 02 05:35:03.096 (TDB)
 
   Visibility start time:            2004 MAY 02 16:09:14.078 (TDB)
   Visibility stop time:             2004 MAY 03 05:33:57.257 (TDB)
 
   Visibility start time:            2004 MAY 03 16:08:02.279 (TDB)
   Visibility stop time:             2004 MAY 04 05:32:50.765 (TDB)
 
   Visibility start time:            2004 MAY 04 16:06:51.259 (TDB)
   Visibility stop time:             2004 MAY 05 05:31:43.600 (TDB)
 
   Visibility start time:            2004 MAY 05 16:05:40.994 (TDB)
   Visibility or window stop time:   2004 MAY 06 00:00:00.000 (TDB)
 


Top

Find Times when Target is Visible







Top

Task Statement




Extend the program of the previous chapter to find times when the MEX orbiter is:

    -- Above the elevation limit in the DSS-14_TOPO topocentric reference frame.

    -- and is not occulted by Mars

Finding time intervals that satisfy the second condition requires a search for occultations of the spacecraft by Mars. Perform this search twice: once using an ellipsoidal shape model for Mars, and once using a DSK shape model.

Compute the final results twice as well, using the results of both occultation searches.

For each of the two shape model cases, store the set of time intervals when the spacecraft is visible in a SPICELIB window. We'll call this the ``result window.''

Display each of the intervals in each result window as a pair of start and stop times. Express each time as a TDB calendar date using the same format as in the previous program.



Top

Learning Goals




Familiarity with the GF occultation finding routine GFOCLT. Experience with Digital Shape Kernel (DSK) shape models. Further experience with the SPICELIB window routines.



Top

Approach






Top

Solution steps



A possible solution would consist of the following steps:

    1. Use the meta-kernel from the previous chapter as the starting point. Add more kernels to it as needed.

    Name the meta-kernel 'visibl.tm'.

    2. Include the code from the program of the previous chapter in a new source file; modify this code to create the new program.

    3. Your program will need additional windows to capture the results of occultation searches performed using both ellipsoidal and DSK shape models. Additional windows will be needed to compute the set differences of the elevation search (``view period'') window and each of the occultation search windows. Further details are provided below.

    Declare additional output SPICELIB windows and initialize them using SSIZED.

    4. The remaining steps can be performed twice: once using an ellipsoidal shape model for Mars, and once using a DSK Mars shape model. Alternatively, two copies of the entire solution program can be created: one for each shape model.

    5. Search for occultations of the MEX orbiter as seen from DSS-14 using GFOCLT. Use as the confinement window for this search the result window from the elevation search performed by GFPOSC.

    Since occultations occur when the apparent MEX spacecraft position is behind the apparent figure of Mars, light time correction must be performed for the occultation search. To improve accuracy of the occultation state determination, use ``converged Newtonian'' light time correction.

    6. Use the SPICELIB window subtraction routine WNDIFD to subtract the window of times when the spacecraft is occulted from the window of times when the spacecraft is above the elevation limit. The difference window is the final result.

    7. Modify the code to display the contents of the difference window.

This completes the assignment.



Top

Solution






Top

Solution Meta-Kernel



The meta-kernel we created for the solution to this exercise is named 'visibl.tm'. Its contents follow:

   KPL/MK
 
      Example meta-kernel for geometric event finding hands-on
      coding lesson.
 
         Version 3.0.0 26-OCT-2017 (BVS)
 
      The names and contents of the kernels referenced by this
      meta-kernel are as follows:
 
      File Name                       Description
      ------------------------------  ------------------------------
      de405xs.bsp                     Planetary ephemeris SPK,
                                      subsetted to cover only
                                      time range of interest.
      earthstns_itrf93_050714.bsp     DSN station SPK.
      earth_topo_050714.tf            DSN station frame definitions.
      earth_000101_060525_060303.bpc  Binary PCK for Earth.
      naif0008.tls                    Generic LSK.
      ORMM__040501000000_00076XS.BSP  MEX Orbiter trajectory SPK,
                                      subsetted to cover only
                                      time range of interest.
      pck00008.tpc                    Generic PCK.
      mars_lowres.bds                 Low-resolution Mars DSK.
 
 
   \begindata
 
      KERNELS_TO_LOAD = (
 
              'kernels/spk/de405xs.bsp'
              'kernels/spk/earthstns_itrf93_050714.bsp'
              'kernels/fk/earth_topo_050714.tf'
              'kernels/pck/earth_000101_060525_060303.bpc'
              'kernels/lsk/naif0008.tls'
              'kernels/spk/ORMM__040501000000_00076XS.BSP'
              'kernels/pck/pck00008.tpc'
              'kernels/dsk/mars_lowres.bds'
                        )
 
   \begintext


Top

Solution Code



         PROGRAM VISIBL
         IMPLICIT NONE
   C
   C     Find and display the window of times when the MEX
   C     spacecraft is above a specified elevation limit in the
   C     topocentric reference frame of DSN station DSS-14
   C     and is not occulted by Mars.
   C
 
   C
   C     SPICELIB functions
   C
         DOUBLE PRECISION      RPD
         INTEGER               WNCARD
 
   C
   C     Global GF parameters: we import from this file
   C     the definition of the GF workspace size parameter
   C
   C        NWMAX
   C
   C     and the occultation parameters
   C
   C        OCCLN
   C        SHPLEN
   C
         INCLUDE 'gf.inc'
 
   C
   C     Local parameters
   C
   C     Format string for time output:
   C
         CHARACTER*(*)         TDBFMT
         PARAMETER           ( TDBFMT =
        .                    'YYYY MON DD HR:MN:SC.### TDB ::TDB' )
   C
   C     The meta-kernel:
   C
         CHARACTER*(*)         METAKR
         PARAMETER           ( METAKR = 'visibl.tm' )
 
   C
   C     Maximum number of events we can handle in our event set:
   C
         INTEGER               MAXEVT
         PARAMETER           ( MAXEVT = 1000 )
 
   C
   C     Maximum result window size:
   C
         INTEGER               MAXWIN
         PARAMETER           ( MAXWIN = 2 * MAXEVT )
 
   C
   C     SPICELIB cell bound:
   C
         INTEGER               LBCELL
         PARAMETER           ( LBCELL = -5 )
 
   C
   C     String length parameters:
   C
         INTEGER               BDNMLN
         PARAMETER           ( BDNMLN = 36 )
 
         INTEGER               CORLEN
         PARAMETER           ( CORLEN = 10 )
 
         INTEGER               FRNMLN
         PARAMETER           ( FRNMLN = 32 )
 
         INTEGER               LNSIZE
         PARAMETER           ( LNSIZE = 78 )
 
         INTEGER               MTHLEN
         PARAMETER           ( MTHLEN = 100 )
 
         INTEGER               NAMLEN
         PARAMETER           ( NAMLEN = 32 )
 
         INTEGER               OPLEN
         PARAMETER           ( OPLEN  = 50 )
 
         INTEGER               TIMLEN
         PARAMETER           ( TIMLEN = 28 )
 
   C
   C     Local variables
   C
         CHARACTER*(CORLEN)    ABCORR
         CHARACTER*(BDNMLN)    BACK
         CHARACTER*(FRNMLN)    BFRAME
         CHARACTER*(MTHLEN)    BSHAPE
         CHARACTER*(TIMLEN)    BTMSTR
         CHARACTER*(NAMLEN)    CRDSYS
         CHARACTER*(NAMLEN)    COORD
         CHARACTER*(TIMLEN)    ETMSTR
         CHARACTER*(FRNMLN)    FFRAME
         CHARACTER*(FRNMLN)    FRAME
         CHARACTER*(BDNMLN)    FRONT
         CHARACTER*(MTHLEN)    FSHAPE
         CHARACTER*(LNSIZE)    LINE
         CHARACTER*(OCLLN)     OCCTYP
         CHARACTER*(OPLEN)     RELATE
         CHARACTER*(NAMLEN)    SRFPT
         CHARACTER*(TIMLEN)    START
         CHARACTER*(TIMLEN)    STOP
         CHARACTER*(NAMLEN)    TARGET
         CHARACTER*(LNSIZE)    TITLE
 
         DOUBLE PRECISION      ADJUST
 
   C
   C     Confinement window used to store interval to be searched:
   C
         DOUBLE PRECISION      CNFINE ( LBCELL : MAXEVT )
         DOUBLE PRECISION      DINTBG
         DOUBLE PRECISION      DINTEN
         DOUBLE PRECISION      ELVLIM
         DOUBLE PRECISION      ETBEG
         DOUBLE PRECISION      ETEND
         DOUBLE PRECISION      INTBEG
         DOUBLE PRECISION      INTEND
         DOUBLE PRECISION      REVLIM
 
   C
   C     STEPSZ is the step size, measured in seconds, used to search
   C     for times bracketing a state transition.
   C
         DOUBLE PRECISION      STEPSZ
 
   C
   C     Result window used to store occultation times:
   C
         DOUBLE PRECISION      OCCWIN ( LBCELL : MAXWIN )
 
   C
   C     Result window used to store occultation times
   C     computed using DSK data:
   C
         DOUBLE PRECISION      DOCWIN ( LBCELL : MAXWIN )
 
   C
   C     Result window used to store rise/set times:
   C
         DOUBLE PRECISION      RISWIN ( LBCELL : MAXWIN )
 
   C
   C     Result windows used to store visibility periods:
   C
         DOUBLE PRECISION      DVISWN ( LBCELL : MAXWIN )
         DOUBLE PRECISION      EVISWN ( LBCELL : MAXWIN )
 
   C
   C     Workspace array:
   C
         DOUBLE PRECISION      WORK   ( LBCELL : MAXWIN,  NWMAX )
 
 
         INTEGER               I
         INTEGER               WINSIZ
 
   C
   C     Load the meta-kernel.
   C
         CALL FURNSH ( METAKR )
 
   C
   C     Assign the inputs for our search.
   C
         SRFPT  = 'DSS-14'
         FRAME  = 'DSS-14_TOPO'
         TARGET = 'MEX'
         ABCORR = 'CN+S'
         START  = '2004 MAY 2 TDB'
         STOP   = '2004 MAY 6 TDB'
         ELVLIM =  6.0D0
 
   C
   C     The elevation limit above has units of degrees; we convert
   C     this value to radians for computation using SPICE routines.
   C     We'll store the equivalent value in radians in REVLIM.
   C
         REVLIM = RPD() * ELVLIM
 
   C
   C     Since we're interested in the apparent location of the
   C     target, we use light time and stellar aberration
   C     corrections.
   C
   C     Since SPICE doesn't directly support the AZ/EL coordinate
   C     system, we use the equivalent constraint
   C
   C        latitude > REVLIM
   C
   C     in the latitudinal coordinate system, where the reference
   C     frame is topocentric and is centered at the viewing location.
   C
         CRDSYS = 'LATITUDINAL'
         COORD  = 'LATITUDE'
         RELATE = '>'
 
   C
   C     STEPSZ is the step size, measured in seconds, used to search
   C     for times bracketing a state transition. Since we don't expect
   C     any events of interest to be shorter than five minutes, and
   C     since the separation between events is well over 5 minutes,
   C     we'll use this value as our step size. Units are seconds.
   C
         STEPSZ = 300.D0
 
   C
   C     We model the target shape as a point. We either model the
   C     blocking body's shape as an ellipsoid, or we represent its shap
   e
   C     using actual topographic data. No body-fixed reference frame is
   C     required for the target since its orientation is not used.
   C
   C     We'll set the shape specifications just before our calls to
   C     the GF occultation finding routine GFOCLT.
   C
         BACK   = TARGET
         BSHAPE = 'POINT'
         BFRAME = ' '
         FRONT  = 'MARS'
         FFRAME = 'IAU_MARS'
 
   C
   C     The occultation type should be set to 'ANY' for a point
   C     target.
   C
         OCCTYP = 'ANY'
 
   C
   C     Display a banner for the output report:
   C
         TITLE  = 'Inputs for target visibility search:'
         CALL TOSTDO ( ' '   )
         CALL TOSTDO ( TITLE )
         CALL TOSTDO ( ' '   )
 
         LINE   = '   Target                       = #'
         CALL REPMC  ( LINE, '#', TARGET, LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Observation surface location = #'
         CALL REPMC  ( LINE, '#', SRFPT,  LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Observer''s reference frame   = #'
         CALL REPMC  ( LINE, '#', FRAME,  LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Blocking body                = #'
         CALL REPMC  ( LINE, '#', FRONT, LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Blocker''s reference frame    = #'
         CALL REPMC  ( LINE, '#', FFRAME,  LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Elevation limit (degrees)    = #'
         CALL REPMF ( LINE, '#', ELVLIM, 7, 'F', LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Aberration correction        = #'
         CALL REPMC  ( LINE, '#', ABCORR, LINE )
         CALL TOSTDO ( LINE )
 
         LINE   = '   Step size (seconds)          = #'
         CALL REPMF ( LINE, '#', STEPSZ, 9, 'F', LINE )
         CALL TOSTDO ( LINE )
 
   C
   C     Convert the start and stop times to ET.
   C
         CALL STR2ET ( START, ETBEG )
         CALL STR2ET ( STOP,  ETEND )
 
   C
   C     Display the search interval start and stop times
   C     using the format shown below.
   C
   C        2004 MAY 06 20:15:00.000 (TDB)
   C
         CALL TIMOUT ( ETBEG, TDBFMT, BTMSTR )
         LINE = '   Start time                   = '//BTMSTR
         CALL TOSTDO ( LINE )
 
         CALL TIMOUT ( ETEND, TDBFMT, ETMSTR )
         LINE = '   Stop time                    = '//ETMSTR
         CALL TOSTDO ( LINE )
 
         CALL TOSTDO ( ' ' )
 
   C
   C     Every SPICELIB window must have its size initialized.
   C
   C     Initialize the "confinement" window with the interval
   C     over which we'll conduct the search.
   C
         CALL SSIZED ( MAXWIN, CNFINE )
 
         CALL WNINSD ( ETBEG,  ETEND, CNFINE )
 
   C
   C     Initialize the result window; this window will contain
   C     the rise/set times found by our search.
   C
         CALL SSIZED ( MAXWIN, RISWIN )
 
   C
   C     Initialize the occultation and visibility windows.
   C
         CALL SSIZED ( MAXWIN, OCCWIN )
         CALL SSIZED ( MAXWIN, DOCWIN )
         CALL SSIZED ( MAXWIN, EVISWN )
         CALL SSIZED ( MAXWIN, DVISWN )
 
   C
   C     The adjustment value only applies to absolute extrema
   C     searches;  simply give it an initial value of zero
   C     for this inequality search.
   C
         ADJUST = 0.D0
 
   C
   C     Note that the workspace dimensions are ( MAXWIN, NWMAX ).
   C
   C     Now search for the time period, within our confinement
   C     window, during which the apparent target has elevation
   C     at least equal to the elevation limit.
   C
         CALL GFPOSC ( TARGET, FRAME,  ABCORR, SRFPT,
        .              CRDSYS, COORD,  RELATE, REVLIM,
        .              ADJUST, STEPSZ, CNFINE, MAXWIN,
        .              NWMAX,  WORK,   RISWIN         )
 
   C
   C     Now find the times when the apparent target is above
   C     the elevation limit and is not occulted by the
   C     blocking body (Mars). We'll find the times when the target
   C     is above the elevation limit and *is* occulted, then subtract
   C     that window from the view period window RISWIN found above.
   C
   C     For this occultation search, we can use RISWIN as
   C     the confinement window because we're not interested in
   C     occultations that occur when the target is below the
   C     elevation limit.
   C
   C     Find occultations within the view period window.
   C
         FSHAPE = 'ELLIPSOID'
 
         WRITE (*,*) 'Searching using ellipsoid target shape model...'
 
         CALL GFOCLT ( OCCTYP, FRONT,  FSHAPE, FFRAME,
        .              BACK,   BSHAPE, BFRAME, ABCORR,
        .              SRFPT,  STEPSZ, RISWIN, OCCWIN )
         WRITE (*,*) 'Done.'
 
   C
   C     Subtract the occultation window from the view period
   C     window: this yields the time periods when the target
   C     is visible.
   C
         CALL WNDIFD ( RISWIN, OCCWIN, EVISWN )
 
   C
   C     Repeat the search using low-resolution DSK data
   C     for the front body.
   C
         FSHAPE = 'DSK/UNPRIORITIZED'
 
         WRITE (*,*) 'Searching using DSK target shape model...'
 
         CALL GFOCLT ( OCCTYP, FRONT,  FSHAPE, FFRAME,
        .              BACK,   BSHAPE, BFRAME, ABCORR,
        .              SRFPT,  STEPSZ, RISWIN, DOCWIN )
         WRITE (*,*) 'Done.'
 
         CALL WNDIFD ( RISWIN, DOCWIN, DVISWN )
 
   C
   C     The function WNCARD returns the number of intervals
   C     in a SPICE window.
   C
         WINSIZ = WNCARD( EVISWN )
 
         IF ( WINSIZ .EQ. 0 ) THEN
 
            WRITE (*,*) 'No events were found.'
 
         ELSE
   C
   C        Display the visibility time periods.
   C
            WRITE (*,*) ' '
            LINE = 'Visibility start and stop times of '
        .   //     '# as seen from #'
            CALL REPMC ( LINE, '#', TARGET, LINE )
            CALL REPMC ( LINE, '#', SRFPT,  LINE )
 
            WRITE (*, '(A)') LINE
            WRITE (*, '(A)') 'using both ellipsoidal and DSK '
        .   //               'target shape models:'
            WRITE (*,*) ' '
 
            DO I = 1, WINSIZ
   C
   C           Fetch the start and stop times of the Ith interval
   C           from the ellipsoid search result window EVISWN.
   C
               CALL WNFETD ( EVISWN, I, INTBEG, INTEND )
   C
   C           Convert the start and stop times to TDB calendar
   C           strings. Write the results.
   C
               CALL TIMOUT ( INTBEG, TDBFMT, BTMSTR )
               CALL TIMOUT ( INTEND, TDBFMT, ETMSTR )
 
               WRITE (*,'('' Ell: '',A, '' : '', A)' ) BTMSTR, ETMSTR
   C
   C           Fetch the start and stop times of the Ith interval
   C           from the DSK search result window DVISWN.
   C
               CALL WNFETD ( DVISWN, I, DINTBG, DINTEN )
   C
   C           Convert the start and stop times to TDB calendar
   C           strings. Write the results.
   C
               CALL TIMOUT ( DINTBG, TDBFMT, BTMSTR )
               CALL TIMOUT ( DINTEN, TDBFMT, ETMSTR )
 
               WRITE (*,'('' DSK: '',A, '' : '', A)' ) BTMSTR, ETMSTR
               WRITE (*,*) ' '
 
            END DO
 
         END IF
 
         END
 
 


Top

Solution Sample Output



Numerical results shown for this example may differ across platforms since the results depend on the SPICE kernels used as input and on the host platform's arithmetic implementation.

After compiling the program, execute it. The output is:

 
   Inputs for target visibility search:
 
      Target                       = MEX
      Observation surface location = DSS-14
      Observer's reference frame   = DSS-14_TOPO
      Blocking body                = MARS
      Blocker's reference frame    = IAU_MARS
      Elevation limit (degrees)    = 6.000000
      Aberration correction        = CN+S
      Step size (seconds)          = 300.000000
      Start time                   = 2004 MAY 02 00:00:00.000 TDB
      Stop time                    = 2004 MAY 06 00:00:00.000 TDB
 
    Searching using ellipsoid target shape model...
    Done.
    Searching using DSK target shape model...
    Done.
 
   Visibility start and stop times of MEX as seen from DSS-14
   using both ellipsoidal and DSK target shape models:
 
    Ell: 2004 MAY 02 00:00:00.000 TDB : 2004 MAY 02 04:49:30.827 TDB
    DSK: 2004 MAY 02 00:00:00.000 TDB : 2004 MAY 02 04:49:32.645 TDB
 
    Ell: 2004 MAY 02 16:09:14.078 TDB : 2004 MAY 02 20:00:22.514 TDB
    DSK: 2004 MAY 02 16:09:14.078 TDB : 2004 MAY 02 20:00:23.980 TDB
 
    Ell: 2004 MAY 02 21:01:38.222 TDB : 2004 MAY 03 03:35:42.256 TDB
    DSK: 2004 MAY 02 21:01:43.206 TDB : 2004 MAY 03 03:35:44.140 TDB
 
    Ell: 2004 MAY 03 04:36:42.484 TDB : 2004 MAY 03 05:33:57.257 TDB
    DSK: 2004 MAY 03 04:36:46.868 TDB : 2004 MAY 03 05:33:57.257 TDB
 
    Ell: 2004 MAY 03 16:08:02.279 TDB : 2004 MAY 03 18:46:26.013 TDB
    DSK: 2004 MAY 03 16:08:02.279 TDB : 2004 MAY 03 18:46:27.306 TDB
 
    Ell: 2004 MAY 03 19:46:54.618 TDB : 2004 MAY 04 02:21:44.562 TDB
    DSK: 2004 MAY 03 19:46:59.734 TDB : 2004 MAY 04 02:21:46.574 TDB
 
    Ell: 2004 MAY 04 03:21:56.347 TDB : 2004 MAY 04 05:32:50.765 TDB
    DSK: 2004 MAY 04 03:22:00.862 TDB : 2004 MAY 04 05:32:50.765 TDB
 
    Ell: 2004 MAY 04 16:06:51.259 TDB : 2004 MAY 04 17:32:25.809 TDB
    DSK: 2004 MAY 04 16:06:51.259 TDB : 2004 MAY 04 17:32:27.118 TDB
 
    Ell: 2004 MAY 04 18:32:05.975 TDB : 2004 MAY 05 01:07:48.264 TDB
    DSK: 2004 MAY 04 18:32:11.057 TDB : 2004 MAY 05 01:07:50.061 TDB
 
    Ell: 2004 MAY 05 02:07:11.601 TDB : 2004 MAY 05 05:31:43.600 TDB
    DSK: 2004 MAY 05 02:07:16.253 TDB : 2004 MAY 05 05:31:43.600 TDB
 
    Ell: 2004 MAY 05 16:05:40.994 TDB : 2004 MAY 05 16:18:35.560 TDB
    DSK: 2004 MAY 05 16:05:40.994 TDB : 2004 MAY 05 16:18:36.994 TDB
 
    Ell: 2004 MAY 05 17:17:27.717 TDB : 2004 MAY 05 23:54:04.672 TDB
    DSK: 2004 MAY 05 17:17:32.385 TDB : 2004 MAY 05 23:54:06.221 TDB
 


Top

Extra Credit





In this ``extra credit'' section you will be presented with more complex tasks, aimed at improving your understanding of the geometry event finding subsystem and particularly the GFPOSC and GFDIST routines.

These ``extra credit'' tasks are provided as task statements, and unlike the regular tasks, no approach or solution source code is provided. In the next section, you will find the numeric solutions to the questions asked in these tasks.



Top

Task statements




    1. Write a program that finds the times, within the time range

         2004 MAY 2 TDB
         2004 MAY 6 TDB
    when the MEX spacecraft crosses Mars' equator. Display the results using TDB calendar dates and millisecond precision.

    2. Write a program that finds the times, within the time range

         2004 MAY 2 TDB
         2004 MAY 6 TDB
    when the MEX spacecraft is at periapsis. Display the results using TDB calendar dates and millisecond precision.

    3. Write a program that finds the times, within the time range

         2004 MAY 2 TDB
         2004 MAY 6 TDB
    when the MEX spacecraft is at apoapsis. Display the results using TDB calendar dates and millisecond precision.



Top

Solutions




    1. Solution for the equator crossing search, using GFPOSC for the MEX spacecraft latitude in the Mars body-fixed frame equal to 0 degrees:

 
   Inputs for equator crossing search:
 
      Target                       = MEX
      Observer                     = MARS
      Observer's reference frame   = IAU_MARS
      Latitude limit (degrees)     = 0.000000
      Aberration correction        = NONE
      Step size (seconds)          = 300.000000
      Start time                   = 2004 MAY 02 00:00:00.000 (TDB)
      Stop time                    = 2004 MAY 06 00:00:00.000 (TDB)
 
   MEX MARS equator crossing times:
 
    Equator crossing or start time:  2004 MAY 02 05:00:08.334 (TDB)
    Equator crossing time:           2004 MAY 02 06:15:13.074 (TDB)
    Equator crossing time:           2004 MAY 02 12:35:14.856 (TDB)
    Equator crossing time:           2004 MAY 02 13:50:09.161 (TDB)
    Equator crossing time:           2004 MAY 02 20:10:24.439 (TDB)
    Equator crossing time:           2004 MAY 02 21:25:10.344 (TDB)
    Equator crossing time:           2004 MAY 03 03:45:26.758 (TDB)
    Equator crossing time:           2004 MAY 03 05:00:04.086 (TDB)
    Equator crossing time:           2004 MAY 03 11:20:32.419 (TDB)
    Equator crossing time:           2004 MAY 03 12:34:57.968 (TDB)
    Equator crossing time:           2004 MAY 03 18:55:34.883 (TDB)
    Equator crossing time:           2004 MAY 03 20:09:53.063 (TDB)
    Equator crossing time:           2004 MAY 04 02:30:35.509 (TDB)
    Equator crossing time:           2004 MAY 04 03:44:42.753 (TDB)
    Equator crossing time:           2004 MAY 04 10:05:41.638 (TDB)
    Equator crossing time:           2004 MAY 04 11:19:38.397 (TDB)
    Equator crossing time:           2004 MAY 04 17:40:41.405 (TDB)
    Equator crossing time:           2004 MAY 04 18:54:31.413 (TDB)
    Equator crossing time:           2004 MAY 05 01:15:45.967 (TDB)
    Equator crossing time:           2004 MAY 05 02:29:25.294 (TDB)
    Equator crossing time:           2004 MAY 05 08:50:53.931 (TDB)
    Equator crossing time:           2004 MAY 05 10:04:26.915 (TDB)
    Equator crossing time:           2004 MAY 05 16:25:58.350 (TDB)
    Equator crossing or stop time:   2004 MAY 05 17:39:23.889 (TDB)
    2. Solution for the periapsis search, using GFDIST for the MEX spacecraft distance from Mars at a local minimum:

 
   Inputs for periapsis search:
 
      Target                       = MEX
      Observer                     = MARS
      Aberration correction        = NONE
      Step size (seconds)          = 300.000000
      Start time                   = 2004 MAY 02 00:00:00.000 (TDB)
      Stop time                    = 2004 MAY 06 00:00:00.000 (TDB)
 
   MEX periapsis times:
 
    Periapsis or start time:         2004 MAY 02 05:57:51.000 (TDB)
    Periapsis time:                  2004 MAY 02 13:32:43.325 (TDB)
    Periapsis time:                  2004 MAY 02 21:07:41.124 (TDB)
    Periapsis time:                  2004 MAY 03 04:42:30.648 (TDB)
    Periapsis time:                  2004 MAY 03 12:17:21.143 (TDB)
    Periapsis time:                  2004 MAY 03 19:52:12.267 (TDB)
    Periapsis time:                  2004 MAY 04 03:26:57.755 (TDB)
    Periapsis time:                  2004 MAY 04 11:01:49.826 (TDB)
    Periapsis time:                  2004 MAY 04 18:36:38.448 (TDB)
    Periapsis time:                  2004 MAY 05 02:11:28.558 (TDB)
    Periapsis time:                  2004 MAY 05 09:46:26.309 (TDB)
    Periapsis or end time:           2004 MAY 05 17:21:18.875 (TDB)
    3. Solution for the apoapsis search, using GFDIST for the MEX spacecraft distance from Mars at a local maximum:

 
   Inputs for apoapsis search:
 
      Target                       = MEX
      Observer                     = MARS
      Aberration correction        = NONE
      Step size (seconds)          = 300.000000
      Start time                   = 2004 MAY 02 00:00:00.000 (TDB)
      Stop time                    = 2004 MAY 06 00:00:00.000 (TDB)
 
   MEX apoapsis times:
 
    Apoapsis or start time:          2004 MAY 02 02:10:24.948 (TDB)
    Apoapsis time:                   2004 MAY 02 09:45:19.189 (TDB)
    Apoapsis time:                   2004 MAY 02 17:20:14.194 (TDB)
    Apoapsis time:                   2004 MAY 03 00:55:07.633 (TDB)
    Apoapsis time:                   2004 MAY 03 08:29:57.890 (TDB)
    Apoapsis time:                   2004 MAY 03 16:04:48.524 (TDB)
    Apoapsis time:                   2004 MAY 03 23:39:36.745 (TDB)
    Apoapsis time:                   2004 MAY 04 07:14:25.662 (TDB)
    Apoapsis time:                   2004 MAY 04 14:49:15.904 (TDB)
    Apoapsis time:                   2004 MAY 04 22:24:05.351 (TDB)
    Apoapsis time:                   2004 MAY 05 05:58:59.270 (TDB)
    Apoapsis time:                   2004 MAY 05 13:33:54.433 (TDB)
    Apoapsis or stop time:           2004 MAY 05 21:08:50.211 (TDB)