logical function Time2eph_smei(tt,rr) implicit double precision (A-H,O-Z) integer tt(2) real*8 rr(6) character cSay*8 /'smei_pos'/ include 'openfile.h' include 'dirspec.h' include 'filparts.h' !include 'planet.h' !include 'math.h' logical bOpenFile integer Time2Differ integer Time2Str character cStr*(FIL__LENGTH) integer uu(2) logical bFind parameter (NBUF=2000) character cBuf(2,NBUF)*69 integer tBuf(2,NBUF) integer iBuf /0/ save iFlag, iBuf, iBufLast, tBuf, cBuf common /E1/ XMO,XNODEO,OMEGAO,EO,XINCL,XNO,XNDT2O,XNDD6O,BSTAR,X,Y,Z,XDOT,YDOT,ZDOT,EPOCH,DS50 common /C1/ CK2,CK4,E6A,QOMS2T,S,TOTHRD,XJ3,XKE,XKMPER,XMNPDA,AE common /C2/ DE2RA,PI,PIO2,TWOPI,X3PIO2 data DE2RA /0.174532925d-1/ data E6A / 1d-6/ data PI / 3.14159265d0 / data PIO2 / 1.57079633d0 / data QO / 120d0 / data SO / 78d0 / data TOTHRD / 0.66666667d0 / data TWOPI / 6.2831853d0 / data X3PIO2 / 4.71238898d0 / data XJ2 / 1.082616d-3/ data XJ3 / -0.253881d-5/ data XJ4 / -1.65597d-6/ data XKE /0.743669161d-1/ data XKMPER / 6378.135d0 / ! Radius Earth data XMNPDA / 1440d0 / ! # minutes per day data AE / 1d0 / if (iBuf .eq. 0) then iFlag = 1 iBufLast = 1 CK2 = 0.5d0*XJ2*AE**2d0 CK4 = -0.375d0*XJ4*AE**4d0 QOMS2T= ((QO-SO)*AE/XKMPER)**4d0 S = AE*(1d0+SO/XKMPER) i = iFilePath(cEnvi(:iEnvi)//'EPHEM',1,'sgp','sat27640.txt',cStr) i = 0 if (bOpenFile(OPN__TEXT+OPN__REOPEN+OPN__STOP,iU,cStr,i)) then read (iU,'(A)') cStr read (iU,'(A)') cStr read (iU,'(A)') cStr read (iU,'(A)') cStr read (iU,'(A)') cStr read (iU,'(A)') cStr do while (cStr(:13) .ne. '') if (iBuf .ge. NBUF) call Say(cSay,'E','NBUF','parameter too small') read (cStr(19:20),'(I2.2)' ) iYr read (cStr(21:32),'(D12.8)') Doy call Time2Day8(1,uu,Doy) call Time2YDoy(1,uu,2000+iYr,uu) if (iBuf .eq. 0) then iBuf = iBuf+1 tBuf(1,iBuf) = uu(1) tBuf(2,iBuf) = uu(2) cBuf(1,iBuf) = cStr read (iU,'(A)') cBuf(2,iBuf) else if (Time2Differ(uu,tBuf(1,iBuf-1)) .gt. 0) then iBuf = iBuf+1 tBuf(1,iBuf) = uu(1) tBuf(2,iBuf) = uu(2) cBuf(1,iBuf) = cStr read (iU,'(A)') cBuf(2,iBuf) else if (Time2Differ(uu,tBuf(1,iBuf-1)) .lt. 0) then write (*,'(1X,A)') cStr(:itrim(cStr)) call Say(cSay,'E','tle','not chronologically ordered') else write (*,'(1X,A)') cStr(:itrim(cStr)) read (iU,'(A)') cStr write (*,'(1X,A)') cStr(:itrim(cStr)) call Say(cSay,'W','tle','skipping duplicate entry') end if read (iU,'(A)') cStr end do end if end if bFind = .TRUE. i = iBufLast j = Time2Differ(tBuf(1,i),tt) do while (bFind) k = Time2Differ(tBuf(1,i),tt) if ( k .eq. 0 .or. ! Exact match & (i .eq. 1 .and. k .eq. 1) .or. ! tt before earliest tBuf & (i .eq. iBuf .and. k .eq. -1) ) then ! tt after latest tBuf bFind = .FALSE. j = 0 else if (k .ne. j) then ! Found times bracketing tt bFind = .FALSE. else ! k = j (+1 or -1) i = i-j end if end do if (j .eq. 0) then call Time2Delta(tt,tBuf(1,i),uu) call Time2Day8(0,uu,dt1) else !print *, i ,tBuf(1,i ),tBuf(2,i ) !print *, i+j,tBuf(1,i+j),tBuf(2,i+j) ! tBuf(*,i) and tBuf(*,i+j) bracket tt call Time2Delta(tt,tBuf(1,i ),uu) call Time2Day8(0,uu,dt1) ! dt1 <= 0 call Time2Delta(tt,tBuf(1,i+j),uu) call Time2Day8(0,uu,dt2) ! dt2 > 0 if (dabs(dt2) .lt. dabs(dt1)) then i = i+j dt1 = dt2 end if end if iBufLast = i read (cBuf(1,i),'(18X,D14.8,1X,F10.8,2(1X,F6.5,I2))') EPOCH,XNDT2O,XNDD6O,IEXP,BSTAR,IBEXP read (cBuf(2,i),'(7X,2(1X,F8.4),1X,F7.7,2(1X,F8.4),1X,F11.8)') XINCL,XNODEO,EO,OMEGAO,XMO,XNO XNDD6O = XNDD6O*(10d0**IEXP) XNODEO = XNODEO*DE2RA OMEGAO = OMEGAO*DE2RA XMO = XMO*DE2RA XINCL = XINCL*DE2RA TEMP = TWOPI/XMNPDA/XMNPDA XNO = XNO*TEMP*XMNPDA XNDT2O = XNDT2O*TEMP XNDD6O = XNDD6O*TEMP/XMNPDA A1 = (XKE/XNO)**TOTHRD TEMP = 1.5d0*CK2*(3d0*dcos(XINCL)**2d0-1d0)/(1d0-EO*EO)**1.5d0 DEL1 = TEMP/(A1*A1) AO = A1*(1d0-DEL1*(0.5d0*TOTHRD+DEL1*(1d0+134d0/81d0*DEL1))) DELO = TEMP/(AO*AO) XNODP = XNO/(1d0+DELO) BSTAR = BSTAR*(10d0**IBEXP)/AE call SGP4D(iFlag,dt1*1440d0) !call SGP8D(iFlag,dt1*1440d0) rr(1) = X*XKMPER/AE rr(2) = Y*XKMPER/AE rr(3) = Z*XKMPER/AE rr(4) = XDOT*XKMPER/AE*XMNPDA/86400d0 rr(5) = YDOT*XKMPER/AE*XMNPDA/86400d0 rr(6) = ZDOT*XKMPER/AE*XMNPDA/86400d0 return end