Fortran 读取gps广播星历和精密星历

更新时间:2020/5/12
星历下载见博客:
https://blog.csdn.net/Gou_Hailong/article/details/100809806

广播星历结构体:
Fortran 读取gps广播星历和精密星历_第1张图片
精密星历结构体:
Fortran 读取gps广播星历和精密星历_第2张图片
源码:
1.结构体+读文件

    !fortran read file
module typedef_and_read
    implicit none
    !igs - sp3
    type POINT
        real::x,y,z,det
        character(len=5)::prn
    end type
    type EPOCH
        integer sec_day         !the second of a day
        type(point):: pt(50)    !the number of sat in an epoch
    end type
    type SP3
        integer:: year,month,day
        integer:: num_epoch,num_sat
        integer:: gpsweek,gpssec
        integer:: ep_sec    !the time between two epochs
        integer:: julian_day_whole
        real julian_day_round
        character:: typ     !P or V
        type(epoch) ep(100)
    end type
    !Brdc - renix
    type DATANODE
        integer prn
        integer gps_week,toe,time
        real iode,a0,a1,a2,sec_day
        real a_sqrt,e
        real Cuc,Cus,Crc,Crs,Cic,Cis
        real Dn,OMEGA_,omega,i0,M0
        real i_dot,OMEGA_dot,TGD
    end type
    type DATALINE
        integer year,month,day,hour,minute,second,toc
        type(datanode) nod(35)
    end type
    type BRDC
        type(dataline) lin(30)
        real a(4),b(4),A0,A1
        integer T,W,leap_sec,year,mon,day
    end type
    
    
    contains 
        subroutine read_brdc(filename,brd)
            implicit none
            character(len=80),intent(in) ::filename !input
            type(BRDC),intent(out) :: brd           !output
            character(len=80)::buf
            integer,parameter::fileid=10
            integer::status=0,i=1,j=1
            logical alive
            
            integer prn,sec_day                    !temp data
            real gps_week,toe,time
            real iode,a0,a1,a2
            real a_sqrt,e
            real Cuc,Cus,Crc,Crs,Cic,Cis
            real Dn,OMEGA_,omega,i0,M0
            real i_dot,OMEGA_dot,TGD,second,toc
            integer year,month,day,hour,minute
            real a                                !unuseful data
            
            inquire(file=filename,exist=alive)!exist?
    
            if(alive)then!exist!
                write(*,*) 'BRDC Reading...'
                open(unit=fileid,file=filename,access="sequential",status="old")
                read(unit=fileid,fmt="(A80)",iostat=status)buf!1
                read(unit=fileid,fmt="(A80)",iostat=status)buf!2
                read(unit=fileid,fmt="(A80)",iostat=status)buf!3
                read(unit=fileid,fmt="(2X,4D12.4)",iostat=status)brd.a(1),brd.a(2),brd.a(3),brd.a(4)!4
                read(unit=fileid,fmt="(3X,4D12.4)",iostat=status)brd.b(1),brd.b(2),brd.b(3),brd.b(4)!5
                read(unit=fileid,fmt="(3X,2D19.12,2I9)",iostat=status)brd.A0,brd.A1,brd.T,brd.W!6
                read(unit=fileid,fmt="(I6)",iostat=status)brd.leap_sec!7
                read(unit=fileid,fmt="(A80)",iostat=status)buf!8 end of head
                
                do while(.true.)
                    !read(unit=fileid,fmt="()",iostat=status),prn
                    read(unit=fileid,fmt="(I2,1X,I2.2,4(1X,I2),F5.1,3D19.12)",iostat=status)prn,year,&!1
                    &month,day,hour,minute,second,a0,a1,a2
                    if(status==-1)then !read over?
                        write(*,*) 'Read over!'
                        exit
                    endif
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) iode,Crs,Dn,M0        !2
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) Cuc,e,Cus,a_sqrt      !3
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) TOE,Cic,OMEGA_,Cis    !4
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) i0,Crc,omega,OMEGA_dot!5
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) i_dot,a,gps_week,a    !6
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) a,a,TGD,a             !7
                    read(unit=fileid,fmt="(3X,4D19.12)",iostat=status) time,a,a,a            !8
                    if(j>1)then
                        if(prn<=brd.lin(i).nod(j-1).prn)then
                            i=i+1;j=1
                        endif
                    endif
                    if(j==1)then
                        brd.lin(i).year=year
                        brd.lin(i).month=month
                        brd.lin(i).day=day
                        brd.lin(i).hour=hour
                        brd.lin(i).minute=minute
                        brd.lin(i).second=second
                        brd.lin(i).toc=TOE
                    end if
                    brd.lin(i).nod(j).prn=prn; brd.lin(i).nod(j).a0=a0; brd.lin(i).nod(j).a1=a1; brd.lin(i).nod(j).a2=a2
                    brd.lin(i).nod(j).iode=iode; brd.lin(i).nod(j).Crs=Crs; brd.lin(i).nod(j).Dn=Dn; brd.lin(i).nod(j).M0=M0
                    brd.lin(i).nod(j).Cuc=Cuc; brd.lin(i).nod(j).e=e; brd.lin(i).nod(j).Cus=Cus; brd.lin(i).nod(j).a_sqrt=a_sqrt
                    brd.lin(i).nod(j).TOE=TOE; brd.lin(i).nod(j).Cic=Cic; brd.lin(i).nod(j).OMEGA_=OMEGA_; brd.lin(i).nod(j).Cis=Cis
                    brd.lin(i).nod(j).i0=i0; brd.lin(i).nod(j).Crc=Crc; brd.lin(i).nod(j).omega=omega; brd.lin(i).nod(j).OMEGA_dot=OMEGA_dot
                    brd.lin(i).nod(j).i_dot=i_dot; brd.lin(i).nod(j).gps_week=gps_week
                    brd.lin(i).nod(j).TGD=TGD; brd.lin(i).nod(j).time=time
                    brd.lin(i).nod(j).sec_day=brd.lin(i).hour*3600+ brd.lin(i).minute*60+ brd.lin(i).second
                    j=j+1                  
                end do
                close(fileid)
                brd.year=brd.lin(1).year;brd.mon=brd.lin(1).month;brd.day=brd.lin(1).day
            else!don't exist!
                write(*,*)trim(filename),"File doesn't exist."
            end if
        end subroutine
        
        subroutine read_sp3(filename,sp)
            implicit none
            character(len=80),intent(in) ::filename !input
            type(SP3),intent(out) :: sp           !output
            character(len=80)::buf
            integer,parameter::fileid=10
            integer::status=0,i=1,j=1
            logical alive
            
            inquire(file=filename,exist=alive)!exist?
            if(alive)then!exist!
                write(*,*) 'SP3 Reading...'
                open(unit=fileid,file=filename,access="sequential",status="old")
                
                
            else!don't exist!
                write(*,*)trim(filename),"File doesn't exist."
            end if
        end subroutine   
    end module

2.主程序

!main program   
program main
    use typedef_and_read
    implicit none
    character(len=80)::filename1,filename2,st
    character(len=80)::buffer
    integer,parameter::fileid=10
    integer::status=0,points
    logical alive
    real a
    type(POINT),allocatable::pt(:)
    type(brdc) brd
    type(sp3) sp
    
    filename1='data\brdc2400.19n'
    call read_brdc(filename1,brd)
    
    filename2='data\igs20683.sp3'
    call read_sp3(filename2,sp)
    
    st='-0.110050197691D-03'
    read(st,'(D19.12)'),a
    write(*,*) st,a
    pause
end      

此坑待填:精密星历没写!

你可能感兴趣的:(Fortran)