jplephtest.pro 5.88 KB
;+
; NAME:
;   JPLEPHTEST
;
; AUTHOR:
;   Craig B. Markwardt, NASA/GSFC Code 662, Greenbelt, MD 20770
;   craigm@lheamail.gsfc.nasa.gov
;   UPDATED VERSIONs can be found on my WEB PAGE: 
;      http://cow.physics.wisc.edu/~craigm/idl/idl.html
;
; PURPOSE:
;   Test JPLEPHTEST with JPL test data set
;
; MAJOR TOPICS:
;   Planetary Orbits, Interpolation
;
; CALLING SEQUENCE:
;   JPLEPHTEST, EPHFILE, TESTFILE
;
; DESCRIPTION:
;
;   JPLEPHTEST tests the JPLEPHINTERP procedure for precision.  In
;   order to function, you must have the JPLEPHREAD and JPLEPHINTERP
;   procedures, as well as the IDL Astronomy Libary for reading FITS
;   files.  In addition, you must have a JPL ephemeris test data set,
;   which is available by FTP.
;
;   The procedure opens and reads the test set, which contains
;   precomputed data.  Every tenth value is printed on the screen.
;   Any deviations that exceed 1.5d-13 AU = 1.5 cm are reported.
;
;   The columns are labelled according to the input file, except for
;   the final column, which is the deviation between the input file
;   and the computed value.
;
;
; PARAMETERS: 
;
;   EPHFILE - a scalar string, specifies the name of the ephemeris
;             file, in FITS format.
;
;   TESTFILE - a scalar string, specifies JPL test data set to compare
;              against.
;
;   THRESHOLD - threshold (cm) above which deviations are reported as
;               too large.
;
;
; EXAMPLE:
;
;   Test JPL DE200 and DE405 ephemerides.  Assumes files are in the
;   current directory.
;
;   JPLEPHTEST, 'JPLEPH.200', 'testpo.200'
;   JPLEPHTEST, 'JPLEPH.405', 'testpo.405'
;     
;
; REFERENCES:
;
;   JPL Export Ephmeris FTP Site
;      ftp://navigator.jpl.nasa.gov/pub/ephem/export/
;      (see test-data/ for test data sets)
;   
;   HORIZONS, JPL Web-based ephermis calculator (Ephemeris DE406)
;      http://ssd.jpl.nasa.gov/horizons.html
;
;
; SEE ALSO
;   JPLEPHREAD, JPLEPHINTERP, JPLEPHTEST
;   
; MODIFICATION HISTORY:
;   Written and Documented, CM, Jun 2001
;   Removed TRANSREAD, improved output, improved docs, CM, 9 Jul 2001
;   Add THRESHOLD keyword, CM, 30 Jan 2005
;
;  $Id: jplephtest.pro,v 1.5 2005/01/31 04:20:50 craigm Exp $
;
;-
; Copyright (C) 2001, Craig Markwardt
; This software is provided as is without any warranty whatsoever.
; Permission to use, copy and distribute unmodified copies for
; non-commercial purposes, and to modify and use for personal or
; internal use, is granted.  All other rights are reserved.
;-

pro jplephtest, ephfile, testfile, pause=pause, threshold=thresh0

  if n_params() EQ 0 then begin
      message, 'USAGE: JPLEPHTEST, EPHFILE, TESTFILE', /info
      return
  endif

  if n_elements(thresh0) EQ 0 then begin
      thresh = 1.0d/1.5d13
  endif else begin
      thresh = thresh0(0)/1.5d13
  endelse

  openr, unit, testfile, /get_lun, error=err
  if err NE 0 then begin
      message, 'ERROR: could not open '+testfile
      return
  endif

  ;; Read header of file, up to and including the EOT line
  repeat begin
      line = ''
      readf, unit, line
  endrep until strupcase(strmid(line,0,3)) EQ 'EOT'

  ;; Read at least 20000 lines from file
  data = replicate({denum:0L, caldate: '', jd: 0D, targ: 0L, $
                    cent: 0L, coord: 0L, value: 0D}, 20000)
  on_ioerror, DONE
  readf, unit, data, format='(I5,A10,D0,I0,I0,I0,D0)'
  DONE:
  rc = floor((fstat(unit)).transfer_count/7)
  on_ioerror, NULL
  free_lun, unit

  if rc LT 10 then begin
      message, 'ERROR: could not read input data'
  endif

  ;; Cull the data out of the structure
  data = data(0:rc-1)
  denum = data.denum & caldate = data.caldate & jd = data.jd 
  targ = data.targ & cent = data.cent & coord = data.coord
  value = data.value
  data = 0
      
  bad = cent*0

  jplephread, ephfile, pinfo, pdata, status=st, errmsg=errmsg
  if st EQ 0 then begin
      message, errmsg
  endif
  if denum(0) NE pinfo.denum then begin
      message, 'ERROR: test file and ephemeris are not of same version'
  endif

  wh = where(jd GE pinfo.tstart AND jd LE pinfo.tstop, totct)
  if totct EQ 0 then begin
      message, 'ERROR: test file and ephemeris do not overlap'
  endif

  j = 0L
  for i = 0L, totct-1 do begin

      if coord(wh(i)) GE 4 then vel = 1 else vel = 0
      if targ(wh(i)) GE 14 then vel = 1  ;; Always for nut. & libr.
      jplephinterp, pinfo, pdata, jd(wh(i)), x, y, z, vx, vy, vz, $
        objectname=targ(wh(i)), center=cent(wh(i)), $
        posunits='AU', velunits='AU/DAY', velocity=vel

      case coord(wh(i)) of 
          1: newval = x
          2: newval = y
          3: newval = z
          4: newval = vx
          5: newval = vy
          6: newval = vz
          else: message, 'ERROR: coordinate '+coord(wh(i))+' does not exist'
      endcase

      ;; Nutations are handled differently than PLEPH
      if targ(wh(i)) EQ 14 AND coord(wh(i)) GT 2 then begin
          if coord(wh(i)) EQ 3 then newval = vx $
          else                      newval = vy
      endif

      thresh = 1.0d/1.5d13

      del = abs(newval - value(wh(i)))
      if targ(wh(i)) EQ 15 AND coord(wh(i)) EQ 3 then $
        del = del/(0.23d0*(jd(wh(i))-2451545.d0))
      if del GE thresh OR (i MOD 10) EQ 0 then begin
          if del GE thresh then begin
              print, '****** WARNING: Large difference ******'
              bad(wh(i)) = 1
          endif
          if j GT 300 then j = 0L
          if j EQ 0 then $
            print, 'REC#', 'Jul. Day', 'Targ', 'Cent', 'Coor', $
            'Value', 'Deviation', format='(A6,A10,3(A5),1(A20),A22)'
          print, i+1, jd(wh(i)), targ(wh(i)), cent(wh(i)), coord(wh(i)), $
            value(wh(i)), del, $
            format='(I6,D10.1,3(I5),1(D20.13),E22.13)'
      endif

      j = j + 1
  endfor

  if keyword_set(pause) AND total(bad) NE 0 then stop
  wh = where(bad, ct)
  print, ''
  print, '***********************************'
  print, ' Time Range (Julian Days): ', minmax(jd)
  print, ' Number of Records: ', totct
  print, ' Erroneous Records: ', ct

end