The ORBIT file contains all the information needed to reconstruct the orbital parameters of the ISO spacecraft. As it is not merely a tabulation of data conforming to the FITS standard but also contains, for example, variable numbers of interpolation coefficients, some accompanying software is required for its proper use. The subroutine MC_ORBIT, listed at the end of this section may be used for this purpose.
This file holds also compressed and detailed information about the complete history of the spacecraft's geocentric position and velocity. For the convenience of observers, at three times during an observation (at the start, middle and end) ISO's heliocentric velocity and velocity towards the target is determined from this file and inserted in the headers of the corresponding instrument data files as described in the instrument specific volumes (II to V) of this Handbook. These data are kept in two sets of three keywords, TREFHEL1,2,3 and TREFDOP1,2,3, along with the corresponding UTC and orbital phase, kept in the TREFCOR1,2,3 and TREFPHA1,2,3 keywords. Note that the spacecraft velocities reported do not include any component of the velocity of the target, SSO or otherwise.
The ORBIT file contains a primary header with the fields described in Table D.36. In this example non-mandatory fields are filled with example values.
Keyword | Value | Description |
SIMPLE = | T | / |
BITPIX = | 8 | / |
NAXIS = | 0 | / |
EXTEND = | T | / |
ORIGIN = | 'ESA ' | / European Space Agency |
TELESCOP = | 'ISO ' | / Infrared Space Observatory |
COMMENT | Compressed orbit file | |
FILENAME = | 'ORBIT' | / File name in ISO archive |
DATE = | '07/07/98' | / Creation date |
FILEVERS = | '1350 ' | / Version ID in ISO archive |
OLPVERS = | 'OLP_632 ' | / SOC OLP system version |
CALGVERS = | 'CALG_31 ' | / SOC OLP CAL-G files version |
USERNAME = | 'PIPELINE' | / |
COMMENT | This file contains ISO orbit data. It can only be interpreted | |
using the software `MCRORB' within the MC package, | ||
or using similar software supplied directly by ESOC. |
The ORBIT file contains records described in Table D.37.
Keyword | Number | Format | Description |
ORBITDAT | 1 | A80 | Orbit parameters (composite structure) |
This section lists the FORTRAN subroutine used to read the ORBIT file above described. There is only one call in this subroutine that needs explanation, that of MCRPR.
CALL MCRPR (LFILE, RECORD, 80, EOF, BUFFER)
reads from unit number LFILE (I*4) record number RECORD (I*4). This record is expected to be 80 bytes long. If, on return, the logical EOF is true it indicates that the requested record was out of the range of the file, otherwise the record is placed in BUFFER (in this case C*80).
SUBROUTINE MC_ORBIT(DAY,KODE,LFILE,IERROR,NSAT,X,REVNUM) C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CP ORBIT: RETRIEVAL ROUTINE FOR COMPRESSED LTOF/STOF ORBIT FILE, C delivered under the original name of "ORBIT" by ESOC/OAD. C C The following changes have been made by J. Sternberg to the original C routine supplied by ESOC/OAD in March 1995. C 1. Name changed to MC_ORBIT (= MC package convention). C 2. Every formatted READ statement was converted to an UNformatted READ C (MCRPR) followed by an internal READ, keeping the same statement C numbers for the FORMAT, "END=" and "ERR=" labels. C 3. NEXT_RECORD was introduced, to keep track of file position, C because ORBIT is a direct access file instead of sequential. C 4. A REWIND statement was replaced by an assignment of NEXT_RECORD to 1. C 5. IMPLICIT statement was completed for all initial letters, due to C /WARNINGS option being in use. C Anyone outside the SOC trying to use this routine could de-integrate it C from the MC package, by reversing the above-mentioned changes, i.e. by C removing everything to do with MCRPR, LFILE_BUFFER, and NEXT_RECORD. C C OAD's UPDATE OF 1994/08/30 C OAD's UPDATE OF 1995/03/24: REMOVE REFERENCE TO CLUSTER C CHANGE SEARCH FOR FIRST BLOCK RECORD C RETURN EARLIEST/LATEST DATES IF INVALID DAY C C INPUT: CI DAY (R*8) = MODIFIED JULIAN DAY, FROM 2000, FOR THE STATE VECTOR CI KODE (I*4) = NUMBER OF COMPONENTS OF STATE VECTOR = DIM. OF ARRAY C X(); = 3 FOR S/C POSITION, = 6 FOR POSITION & VELOCITY CI LFILE (I*4) = LOGICAL NUMBER OF INPUT DATA FILE C OUTPUT: CO IERROR (I*4) = RETURN CODE: 0=NO ERROR, 1='DAY' TOO EARLY, 2=TOO C LATE, 3=TIME GAP IN DATA, 4=WRONG VALUE OF 'KODE', C 5=FILE CONTENT INCONSISTENT, 6=READ ERROR FROM DATA FILE CO NSAT (I*4) = SATELLITE NUMBER: FROM 1 to 99 CO X(KODE) (R*8) = SPACECRAFT POSITION, KM (AND VELOCITY, KM/S) CO IF 'IERROR' = 1 THEN X(2) = EARLIEST TIME (MJD2000) CO IF 'IERROR' = 2 THEN X(3) = LATEST TIME (MJD2000) CO REVNUM (R*8) = REVOLUTION NUMBER C CF READS A SEQUENTIAL FORMATTED FILE WITH LOGICAL NUMBER 'LFILE' C-------------------------------------------------------------------- IMPLICIT REAL*8(A-H,O-Z), INTEGER*4(I-N) DIMENSION Y(6),COEFF(10,6),X(KODE) CHARACTER*3 CH3 INTEGER*4 LFILE_BUFFER(20) !added by JRS, for integration with MC CHARACTER*80 CFILE_BUFFER !added by JRS, for integration with MC EQUIVALENCE (LFILE_BUFFER, CFILE_BUFFER) ! for integration with MC INTEGER*4 NEXT_RECORD !added by JRS, for integration with MC LOGICAL*4 EOF !added by JRS, for integration with MC C INITIALISE FILE NUMBER TO FORCE FILE READING AT FIRST CALL DATA MFILE/-9999/ C C PARAMETERS SAVED INSIDE ROUTINE: NSATIN,MFILE,DAYFIR,DAYLAS,Y(), C RDIST,COEFF(,),KOEFF,DAYBEG,DAYEND,EPOCH,REVEPO,SMAXIS,OMOTIN SAVE C C INITIALISE ERROR CODES IERROR = 0 IF(KODE .LE. 0) GOTO 504 IF(KODE .GT. 6) GOTO 504 C C ALWAYS REWIND IF A NEW FILE NUMBER IS USED IF(LFILE .NE. MFILE) GOTO 10 C C CHECK IF 'DAY' IS INSIDE LAST READ RECORD BLOCK IF(DAY .GT. DAYEND + 1.D-4) GOTO 20 IF(DAY .GE. DAYBEG - 1.D-4) GOTO 70 C C INITIALISE THE READING FROM THE FILE 10 DAYFIR = 99.D9 DAYLAS = 99.D9 MFILE = LFILE C REWIND LFILE !Commented out by JRS, since not correct for MC NEXT_RECORD = 1 !Added by JRS, to replace REWIND C 20 CONTINUE C READ 1ST RECORD IN A BLOCK CALL MCRPR (LFILE, NEXT_RECORD, 80, EOF, LFILE_BUFFER) NEXT_RECORD = NEXT_RECORD + 1 IF (EOF) GOTO 509 READ (CFILE_BUFFER,41,ERR=506) NSATIN, CH3 41 FORMAT(I3,A3) C IF: CH3 IS ' P' OR ' R' THEN THIS IS 1ST RECORD IN A BLOCK IF(CH3.NE.' P' .AND. CH3.NE.' R') GOTO 20 NSAT = NSATIN C C READ 2ND RECORD IN THE BLOCK CF NREC = RECORD IDENTIFICATION, SHALL BE = 200 + NSATIN CF DAYBEG = BEGIN TIME OF THE RECORD (MJD) CF DAYEND = END TIME OF THE RECORD (MJD) CF EPOCH = EPOCH OF REFERENCE STATE VECTOR (MJD) CF REVEPO = REVOLUTION NUMBER AT EPOCH CF SMAXIS = SEMIMAJOR AXIS FOR THE KEPLER ORBIT CF OMOTIN = INVERSE MEAN MOTION FOR THE KEPLER ORBIT CALL MCRPR (LFILE, NEXT_RECORD, 80, EOF, LFILE_BUFFER) NEXT_RECORD = NEXT_RECORD + 1 IF (EOF) GOTO 509 READ (CFILE_BUFFER,42,ERR=506) &NREC,DAYBEG,DAYEND,EPOCH,REVEPO,SMAXIS,OMOTIN 42 FORMAT(I3,2F12.6,F15.9,F11.3,2F13.5) C CHECK CONSISTENCY OF FILE IF(NREC .NE. 200 + NSATIN) GOTO 505 IF(DAYBEG .GT. DAYEND) GOTO 505 C C DAYFIR = START TIME OF 1ST RECORD ON 1ST BLOCK ON THE FILE - MARGIN DAYFIR = DMIN1(DAYFIR,DAYBEG - 1.D-4) C ERROR RETURN IF 'DAY' IS BEFORE START OF FILE (WITH MARGIN) IF(DAY .LT. DAYFIR) THEN X(2) = DAYFIR GO TO 501 ENDIF C ERROR RETURN IF THERE IS A GAP FROM LAST BLOCK (WITH MARGIN) IF(DAYBEG .GT. DAYLAS) GOTO 503 C DAYLAS = END TIME OF LAST READ RECORD BLOCK + MARGIN DAYLAS = DAYEND + 2.D-4 C C CONTINUE READ IF 'DAY' IS AFTER END OF THIS RECORD BLOCK IF(DAY .GT. DAYEND + 1.D-4) GOTO 20 C REWIND WHEN 'DAY' IS EARLIER THAN START OF PRESENT RECORD BLOCK IF(DAY .LT. DAYBEG - 1.D-4) GOTO 10 C C READ 3RD RECORD IN THE BLOCK CF NREC = RECORD IDENTIFICATION, SHALL BE = 300 + NUMBER OF POL.COEFF. CF Y(6) = REFERENCE STATE VECTOR FOR KEPLER ORBIT (KM, KM/S) CF RDIST = S/C EARTH CENTRE DISTANCE AT EPOCH CALL MCRPR (LFILE, NEXT_RECORD, 80, EOF, LFILE_BUFFER) NEXT_RECORD = NEXT_RECORD + 1 IF (EOF) GOTO 505 READ (CFILE_BUFFER,43,ERR=506) NREC,Y,RDIST 43 FORMAT(I3,3F11.3,3F11.7,F11.3) C CHECK CONSISTENCY OF FILE IF(NREC .GT. 310) GOTO 505 IF(NREC .LT. 300) GOTO 505 C KOEFF = NUMBER OF POLYNOMIAL COEFFICIENTS, BETWEEN 0 AND 10 KOEFF = NREC - 300 C C IF THERE ARE NO COEFFICIENTS IN THIS BLOCK IF(KOEFF. LE. 0) GOTO 70 DO 60 K = 1,KOEFF CF NREC = RECORD IDENT. = KOEFF + 11*K CF COEFF(10,6) = MATRIX WITH UP TO 10 COEFFICIENTS OF THE CHEBYSHEV CF POLYNOMIAL FOR EACH OF THE 6 COMPONENTS OF THE STATE VECTOR CALL MCRPR (LFILE, NEXT_RECORD, 80, EOF, LFILE_BUFFER) NEXT_RECORD = NEXT_RECORD + 1 IF (EOF) GOTO 505 READ (CFILE_BUFFER,44,ERR=506) NREC,(COEFF(K,I),I=1,6) 44 FORMAT(I3,3F11.3,3F11.7) C C CHECK CONSISTENCY OF FILE IF(11*K + KOEFF .NE. NREC) GOTO 505 60 CONTINUE C END OF BLOCK READING SEQUENCE, PROVIDE OUTPUT DATA 70 CONTINUE C C TIME CONVERTED TO DIFFERENCE IN MEAN ANOMALY DMANOM = (DAY - EPOCH)*864.D2/OMOTIN C ORBIT NUMBER REVNUM = REVEPO + DMANOM/6.2831853072D0 C C START MODELLING KEPLER ORBIT ARIN = SMAXIS/RDIST ARM = (RDIST - SMAXIS)/SMAXIS RVWAM = (Y(1)*Y(4) + Y(2)*Y(5) + Y(3)*Y(6))*OMOTIN/SMAXIS**2 C CALC. OF ECC. ANOMALY BY NEWTON'S ITERATION TAM = DMANOM - RVWAM COMP = 1.D-7 + 1.D-10*DABS(TAM) B = TAM C ITERATIONS TO SOLVE KEPLER'S EQUATION: DO 130 ITER = 1,15 GO = DCOS(B) G1 = DSIN(B) BET = TAM - ARM*G1 + RVWAM*GO D = (BET - B)/(1.D0 + ARM*GO + RVWAM*G1) B = B + D C THIS GIVES THE ACCURACY 1.D-14 IN B & THE G'S IF(DABS(D) .LE. COMP) GOTO 140 130 CONTINUE C NO CONVERGENCE, ERROR RETURN GOTO 505 140 CONTINUE GO = GO - D*G1 G1 = G1 + D*GO G2 = 1.D0 - GO G3 = B - G1 FX = 1.D0 - G2*ARIN GX = (DMANOM - G3)*OMOTIN C K = MIN0(KODE,3) DO 150 J = 1,K 150 X(J) = FX*Y(J) + GX*Y(J+3) C IF(KODE .LE. 3) GOTO 170 RX = DSQRT(X(1)**2 + X(2)**2 + X(3)**2) FT = -G1*SMAXIS*ARIN/(OMOTIN*RX) GT = 1.D0 - G2*SMAXIS/RX DO 160 J = 4,KODE 160 X(J) = FT*Y(J-3) + GT*Y(J) C END OF MODELLING KEPLER ORBIT 170 CONTINUE C C CHECK IF POLYNOMIAL COEFFICIENTS ARE REQUIRED (1 IS NOT WORTH WHILE) IF(KOEFF .LE. 1) GOTO 600 C MID-POINT & SCALE FACTOR FOR CHEBYSHEV POLYNOMIAL DAYMID = 0.5D0*(DAYBEG + DAYEND) SCALE = 4.D0/(DAYEND - DAYBEG) C ADD CHEBYSHEV POLYNOMIAL TO KEPLER STATE VECTOR S = SCALE*(DAY - DAYMID) PA = 1.D0 P = S*0.5D0 C C 'KODE' = NUMBER OF COMPONENTS OF THE STATE VECTOR DO 200 J = 1,KODE 200 X(J) = X(J) + COEFF(1,J) + COEFF(2,J)*P C IF(KOEFF .LE. 2) GOTO 600 DO 210 L = 3,KOEFF PB = PA PA = P P = S*PA - PB DO 210 J = 1,KODE 210 X(J) = X(J) + COEFF(L,J)*P 230 CONTINUE C GOTO 600 C ERROR RETURNS; IERROR = 5, 6, 4, 3, 2 OR 1 509 CONTINUE C END-OF-FILE ONLY IF AT LEAST ONE RECORD HAS BEEN READ IF(DAYLAS .LT. 1.D9) THEN X(3) = DAYLAS GOTO 502 ENDIF 505 IERROR = -1 506 IERROR = IERROR + 2 504 IERROR = IERROR + 1 503 IERROR = IERROR + 1 502 IERROR = IERROR + 1 501 IERROR = IERROR + 1 C FORCE A RE-INITIALISATION OF READ AT NEXT CALL AFTER AN ERROR MFILE = -9999 600 RETURN END