⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qiebi xuefu.f90

📁 计算卫星位置的fortran程序
💻 F90
字号:
PROGRAM QIE_BXF   !PRN卫星号,N几皆拟合,X还是Y坐标
implicit none
integer prn,nian,yue,ri,i,nj,k,toc,shi,fen,WN,J
integer::status=0,NHS=3,PRN1,NN,OT
REAL*8 wpian,wpiao,wpsu,iode,crs,on,m0,cuc,e,cus,sqrta,toe,cic,omEga,cis,i0,crc,w,omegad,miao
REAL*8 idot,l2,l2p,wjing,wjian,tgd,iodc,fassk,nhqj,x,y,z,gm,Gpszh,T,TOW
REAL*8 n,n0,M,F,U,SU,SR,SI,R,IL,JD,EK,WE,L,XK,YK,ZK,TX,TQ,XXX(1,1),YYY(1,1),ZZZ(1,1)
REAL*8 ,ALLOCATABLE::XS(:,:),YS(:,:),ZS(:,:),CX(:),SJ(:),TT(:,:),TTT(:,:),TTTT(:,:)
REAL*8 ,ALLOCATABLE::XXS(:,:),YYS(:,:),ZZS(:,:),TTTTT(:,:),TTX(:,:),TTXX(:,:),TXXX(:,:)
character(len=79):: string,forr
character(13):: chara,for
logical::tuichu=.false.
parameter(gm=3.9860047e14,We=.72921151467E-04,PRN1=10) !TQ=551412 !gm地球引力常数,WE地球自传角速度
for="END OF HEADER"

    open(unit=10,file="acor1000.08n",iostat=status)
    open(unit=11,file="f17390700.nav",status="replace",iostat=status)
	   I=0
    do while(.true.)
	   if(.not.tuichu)then       !遇到给定值时开始录如数据
         read(10,'(a79)',iostat=status)string
	          chara=string(61:73)
	   	      if(chara==for)then  !判断条件,符合即开始录入数据
                tuichu=.true.
		      endif
	   end if
	   if(tuichu)then   

       !数据赋值顺序意义同 P192(GPS测量与数据处理)
       read(10,'(i2,1x,i2.2,4(1x,i2),f5.1,3d19.12/,3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,&
       3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,3x,2d19.12)',iostat=status)prn,nian,yue,&
       ri,shi,fen,miao,wpian,wpiao,wpsu,iode,crs,on,m0,cuc,e,cus,sqrta,toe,cic,omEga,cis,&
       i0,crc,w,omegad,idot,l2,gpszh,l2p,wjing,wjian,tgd,iodc,fassk,nhqj

        IF(PRN1==PRN)THEN
          I=I+1
        ENDIF
        IF(STATUS/=0)EXIT
	  ENDIF

   end do
       NN=I
       !WRITE(*,*)"数量为:",NN
	   TUICHU=.FALSE.
!       NN=40

       ALLOCATE(XS(NN,1))
	   ALLOCATE(YS(NN,1))
	   ALLOCATE(ZS(NN,1))
	   ALLOCATE(SJ(NN))   ! 纪录起始和结束时间

	IF(NN<=NHS)THEN
	  WRITE(*,*)"阶数大于观测数,无法计算系数"
	  STOP
    END IF

   REWIND(unit=10,iostat=status)     !读取位置重置文件头

	   I=0
    do while(.true.)
	   if(.not.tuichu)then       !遇到给定值时开始录如数据
         read(10,'(a79)',iostat=status)string
	          chara=string(61:73)
	   	      if(chara==for)then  !判断条件,符合即开始录入数据
                 tuichu=.true.
		      endif
	   end if
	   if(tuichu)then   

         read(10,'(i2,1x,i2.2,4(1x,i2),f5.1,3d19.12/,3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,&
             3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,3x,2d19.12)',iostat=status)prn,nian,yue,&
             ri,shi,fen,miao,wpian,wpiao,wpsu,iode,crs,on,m0,cuc,e,cus,sqrta,toe,cic,omEga,&
             cis,i0,crc,w,omegad,idot,l2,gpszh,l2p,wjing,wjian,tgd,iodc,fassk,nhqj
 	         IF(STATUS/=0)EXIT
        IF(PRN1==PRN)THEN
          I=I+1

!        write(*,'(i2,1x,i2.2,4(1x,i2),f5.1,3d19.12/,3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,&
!              3x,4d19.12/,3x,4d19.12/,3x,4d19.12/,3x,2d19.12)')prn,nian,yue,ri,shi,fen,&
!              miao,wpian,wpiao,wpsu,iode,crs,on,m0,cuc,e,cus,sqrta,toe,cic,omega,cis,i0,&
!              crc,w,omegad,idot,l2,gpszh,l2p,wjing,wjian,tgd,iodc,fassk,nhqj

!       WRITE(*,'(A,D18.12)')"M0=",M0
!第一轨道参数   平均角速度        
	     N0=SQRT(GM)/(SQRTA**3)
	     N=N0+ON
!	   WRITE(*,'(A,I2,A,D18.12)')"第",PRN,"颗卫星的平均角速度n:",n
          
          CALL G_GPS(NIAN,YUE,RI,SHI,FEN,MIAO,WN,T)
!	         IF(WN/=GPSZH)THEN
!	            WN=WN-1
!		        T=T+604800
!	         END IF
!             WRITE(*,*)T   
!          DO I=1,40
!		    T=T-180+180*I
             SJ(I)=T       !把时间赋给数组SJ(NN)
!			 TOE=SJ(I)
             WRITE(*,*)"******",T,"*****"
			 WRITE(*,*)TOE
!	         WRITE(10,'(D18.12)')M0
             M=M0+N*(T-TOE)
!	          WRITE(*,'(A,D18.12)')"平近点角M:",M
          !计算偏近点角
          CALL P_JDJ(M,E,EK)
!	      WRITE(*,'(A,D18.12)')"偏近点角E:",EK

          !计算真近点角
          F=ATAN(SQRT(1-E*E)*SIN(EK)/(COS(EK)-E))
!         WRITE(*,'(A,D18.12)')"真近点角F:",F

          !计算生交距角U'
          U=W+F
!         WRITE(*,'(A,D18.12)')"生交距角U:",u

          !计算摄动改正项SU,SR,SI
          SU=CUC*COS(2*U)+CUS*SIN(2*U)
	      SR=CRC*COS(2*U)+CRS*SIN(2*U)
	      SI=CIC*COS(2*U)+CIS*SIN(2*U)
!	      WRITE(*,'(3(A,D21.15))')"SU:",SU,"SR:",SR,"SI:",SI
	   	  !对u',r',i0'进行摄动改正
	      U=U+SU
          R=SQRTA*SQRTA*(1-E*COS(EK))+SR
		  IL=I0+SI+OMEGAD*(T-TOE)      !IL即i0
!         WRITE(*,'(3(A,D21.15))')"摄动改正项U':",U,"R:",R,"I:",IL

          !计算卫星在轨道面坐标系中的位置:
          XK=R*COS(U)
	      YK=R*SIN(U)
!         WRITE(*,'(A/,A,D20.12,2X,A,D20.11)')"卫星在轨道平面直角坐标系中的坐标为:","X=",XK,"Y=",YK

          !计算观测瞬间升交点的经度L:
          L=OMEGA+(OMEGAD-WE)*T-OMEGAD*TOE
!         WRITE(*,'(A,D19.12)')"升交点经度L:",L

          !计算卫星在瞬时地球坐标系中的位置
          X=XK*COS(L)-YK*COS(IL)*SIN(L)
	      Y=XK*SIN(L)+YK*COS(IL)*COS(L)
	      Z=YK*SIN(IL)
!         WRITE(*,'(3(A,D18.12/))')"X=",X,"Y=",Y,"Z=",Z
	      XS(I,1)=X
	      YS(I,1)=Y
	      ZS(I,1)=Z
!		  END DO
        ENDIF  
     ENDIF


    end do

!	DO J=1,NN
!	   XS(J,1)=J
!	END DO

	WRITE(*,*)"*********************************************"
	WRITE(*,*)XS
	WRITE(*,*)"*********************************************"
	WRITE(*,*)YS
	WRITE(*,*)"*********************************************"
	WRITE(*,*)ZS

	ALLOCATE(TT(NN,NHS+1))
	ALLOCATE(TTT(NHS+1,NN))
	ALLOCATE(TTTT(NHS+1,NHS+1))
	ALLOCATE(TXXX(NHS+1,NHS+1))
	ALLOCATE(TTXX(NHS+1,NHS+1))
	ALLOCATE(TTTTT(NHS+1,NN))
    ALLOCATE(XXS(NHS+1,1))
	ALLOCATE(YYS(NHS+1,1))
	ALLOCATE(ZZS(NHS+1,1))
    ALLOCATE(TTX(1,NHS+1))

	!N阶切比雪夫多项式系数计算

	OT=SJ(NN)-SJ(1)      !求计算的时间差,用末时间-最初时间OT=T-TO   P36(GPS测量与数据处理)
!	WRITE(*,*)"OT=",OT
    DO I=1,NN
       TX=2*(SJ(I)-SJ(1))/OT-1
!	   WRITE(*,*)TX
	   TT(I,1)=1
	   TT(I,2)=TX
	   DO J=3,NHS+1
	      TT(I,J)=2*TX*TT(I,J-1)-TT(I,J-2)
	   END DO
	END DO   
!	   CALL XIANSHI(TT,NN,NHS+1)
!	   WRITE(*,*)"********************************"

   	   TTT=TRANSPOSE(TT)   !转置库函数TRANSPOSE()   
!       CALL XIANSHI(TTT,NHS+1,NN)
!	   WRITE(*,*)"********************************"
       
	   CALL MATMUL(TTTT,TTT,NHS+1,NN,TT,NN,NHS+1)
!       WRITE(*,'(4D19.12)')TTTT
!	   WRITE(*,*)"********************************"

       DO I=1,NHS+1
	      DO J=1,NHS+1
		     TXXX(J,I)=TTTT(J,I)
		  END DO
	  END DO
!       CALL XIANSHI(TXXX,NHS+1,NHS+1)
!	   WRITE(*,*)"********************************"

       CALL INV(TTTT,NHS+1)
!	   CALL XIANSHI(TTTT,NHS+1,NHS+1)
!       WRITE(*,'(4D19.12)')TTTT
!	   WRITE(*,*)"********************************"

       CALL MATMUL(TTXX,TXXX,NHS+1,NHS+1,TTTT,NHS+1,NHS+1)
!	   CALL XIANSHI(TXXX,NHS+1,NHS+1)
!       WRITE(*,'(4D19.12)')TTXX
!	   WRITE(*,*)"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
       CALL MATMUL(TTTTT,TTTT,NHS+1,NHS+1,TTT,NHS+1,NN)
!	   CALL XIANSHI(TTTTT,NHS+1,NN)
!       WRITE(*,'(4D19.12)')TTTTT
!	   WRITE(*,*)"********************************"
       
	   CALL MATMUL(XXS,TTTTT,NHS+1,NN,XS,NN,1)
	   CALL MATMUL(YYS,TTTTT,NHS+1,NN,YS,NN,1)
	   CALL MATMUL(ZZS,TTTTT,NHS+1,NN,ZS,NN,1)
!	   write(*,*)"********************************"
!	   WRITE(*,*)XXS
!	   WRITE(*,*)YYS
!	   WRITE(*,*)ZZS

       TQ=SJ(3)
!	   WRITE(*,*)"TQ=",TQ
       TX=2*(TQ-SJ(1))/OT-1
!	   WRITE(*,*)TX
	   TTX(1,1)=1
	   TTX(1,2)=TX
	   DO J=3,NHS+1
	      TTX(1,J)=2*TX*TTX(1,J-1)-TTX(1,J-2)
	   END DO
	   WRITE(*,*)"***************************************************************"
!	   CALL XIANSHI(TTX,1,NHS+1)
!	   WRITE(*,*)"********************************"

	   CALL MATMUL(XXX,TTX,1,NHS+1,XXS,NHS+1,1)
       CALL MATMUL(YYY,TTX,1,NHS+1,YYS,NHS+1,1)
	   CALL MATMUL(ZZZ,TTX,1,NHS+1,ZZS,NHS+1,1)
	   WRITE(*,*)XXX,YYY,ZZZ

	DEALLOCATE(XS)
	DEALLOCATE(YS)
	DEALLOCATE(ZS)
	DEALLOCATE(TT)
	DEALLOCATE(TTT)
	DEALLOCATE(TTTT)
	DEALLOCATE(TTTTT)
	DEALLOCATE(XXS)
	DEALLOCATE(YYS)
	DEALLOCATE(ZZS)
	DEALLOCATE(SJ)
	DEALLOCATE(TTX)
 close(10)

! close(11)
 stop
end 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -