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

📄 rel_pos.c

📁 国内外搜集的GPS程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
ssgsoft.c

/* Main program of kinematic/static GPS data processing software */
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "xu.h"

main(argc,argv)
int argc;
char *argv[];
{
     long ifp,In0,I,Itend,iter=0,Iequa_n,Iequa_n1,Iequa_n2,Iequa_n3;
     char conf_name[I50],str[Iline],docuname[2][I50];
     char docux[I50];
     FILE *fp_rinex[Ista],*fp_orbit[Ista],*fp_docu[6],*fp,*fpd,*fpd1;
     long xhidat[2*Isat*Ista]; /* r_rinexh */
     double rt,dt; /* getdat, odat_tc */
     double odat[Isato*10*Ista*Iepoches],odat1[Isato*10*Ista*Iepoches];
     double odat_t[Iepoches],odat_dt[Ista*Iepoches];
     long odat_n[Iepoches],id_odat[I10*Ista*Iepoches];
     unsigned int iodat[Isato*10*Ista*Iepoches],iodat1[Isato*10*Ista*Iepoches];
     double sdat[Isato*10*Ista*Iepoches],ddat[Isato*10*Ista*Iepoches],
            tdat[Isato*10*Ista*Iepoches]; /* sdtdat */
     long id_sdat[I10*Ista*Iepoches],id_ddat[I10*Ista*Iepoches],
          id_tdat[I10*Ista*Iepoches],
          sdat_n[Iepoches],ddat_n[Iepoches],tdat_n[Iepoches];
     unsigned int isdat[Isato*10*Ista*Iepoches],iddat[Isato*10*Ista*Iepoches],
                  itdat[Isato*10*Ista*Iepoches];
     double slips_t[Islips],ion_r[Isato*10*Ista*Iepoches];/*cycle slips_test*/
     long id_slips[Islips];
     unsigned int iion_r[Isato*10*Ista*Iepoches];
     int hour,minute; /* t_hms */
     double sec;
     int icon[I10*Isat],ici[Iunknown],icon20,icon201,icon231; /* r_con */
     double x0[3*Ista];  
     long itborb[8],isat_id,I_la,deltat=900,itb,ista; /* orbit */
     double borb[Isat*I96*8],rtb,rte,dt_interval;
     double Tr1[I3*Ista*I96]; /* tide */
     long Fi0[Iunknown],N0[Iunknown],idN0[Iunknown],N0t[Iunknown],
          idlo[Iunknown],idN00[Iunknown],N0tb[Iunknown];/*eq*/
     long N0te1[Iunknown],N0te2[Iunknown];/*add to eq*/
     double am[Isato*Ista*Iunknown],lo[Isato*Ista];
     double an_s[Nlow],b1_s[N],an[Nlow],b1[N],c_dd[Nlow],ltpl_s;/*norm.c*/
     double N00[Iunknown],m00,ltpl,accur[N]
            ,accur_[N],N00ac[Iunknown],dx01ac,b1_[N];
     double Nfixed1[N],Nfixed2[N],Nfixed3[N];

     double an_k[Nlow],b1_k[N],an_s1[Nlow],b1_s1[N],ltpl_k,ltpl_s1;
     double ltpl1,lctplc1,lptplp1,lctplc2,lptplp2;
     long i,i1,i2,i3,i4,i5,j,j1,j2,j3,j4,j5,k,k1,k2,k3,k4,k5;/* local */
     double phi,lambda,height,xi,yi,zi,xj,yj,zj;
     double pi[3],pj[6],m0,m0_,t00,t00_,t00_1;
     double Fi[Ista],La[Ista],Height[Ista],x01[3*Ista];
     double T=18.,P=1013.,rh=0.5,zdis,trop,Hour,phi0,lambda0;
     double z01[3*Ista];/*phase*/
     double dx01[3*Ista];/*phase*/
     long year,month,day; 
     double min,max,ave,var,min1,max1,ave1,var1;
     double mi1[Isat],ma1[Isat],av1[Isat],va1[Isat];
     double Dx,Dy,Dz,Cfi,Cla,Sfi,Sla,Dfi,Dla,A1,A2,A3,B1,B2,B3; char c2;
     double disx,wn,dttt;
     double singlex[3*Ista*Iepoches],singlet[Ista*Iepoches];
     double singlx[3*Ista],singlt[Ista];

/* 输入文件名 */
     printf("Command Line should be: command <conf_name> \n");
     printf("used command components : %d\n",argc);
     Run_n4:;
     for(i=0;i<argc;i++) { printf("%s\n",argv[i]);
     if(i==1) strcpy(conf_name,argv[i]); 
     }
/* 读控制文件和打开文件 */
     for(i=0;i<Ista;i++) TropCoef[i]=1.0;

     r_con(fp_rinex,fp_orbit,fp_docu,conf_name,icon,argc,x0,
           idN00,N00,N0tb,&m00,ici,docux);

     ifp=icon[0]; 
/* 检查定义 */
/* 运行run_n>=3, 第二次运行, 读模糊度向量 */
     if(icon[12]!=1) { /* 动态情况 */
       ;
     } else { /* 精态情况 */
        /* 如果 Run_n==4,读数据 */
        if(Run_n==4){
           if((fp_docu[3] = fopen("nfiles","r")) == NULL)
           { printf("Cannot open the file : nfiles\n");
           exit(0); }
           i=0;
           onelinemores:;   
           k1 = getline(fp_docu[3],str); if(k1<20) goto nomores;
           sscanf(str,"%ld %ld %ld %lf %ld %ld %ld",
           &N0xid[i],&N0xtb[i],&N0xte[i],&N00f[i],&N00n[i],&N0x[i],&Fi0x[i]); 
           printf("N0xidtbtevnN0Fi0= %8d %8d %8d %10.4f %6d %8d %9d\n",
           N0xid[i],N0xtb[i],N0xte[i],N00f[i],N00n[i],N0x[i],Fi0x[i]);
           i+=1; if(k1>=20) goto onelinemores;
           nomores:; Nfix=i; printf("Nfix=%d\n",Nfix);
           fclose(fp_docu[3]);
        }
     }
/* 读GPS数据字头 */
     r_rinexh(fp_rinex,ifp,xhidat); Ob_num = (int)xhidat[0];
     for(i1=0;i1<ifp;i1++) {
        for (i=0;i<=34;i++) fprintf(stdout,"%ld ",xhidat[i+i1*2*Isat]);
        fprintf(stdout,"\n"); 
     }
     if(xhidat[14]==0 && xhidat[15]==0) {
        printf("input data interval\n");
        scanf("%lf",&dt); printf("input: %lf\n",dt);
        xhidat[14]=(int)dt; xhidat[15]=(int)(10*(dt-xhidat[14]));
     }
     id_obs(xhidat,&C1,&C2,&L1,&L2,&P1,&P2,&D1,&D2);
     /* 确定 PC1 和 PC2 */
     PC12(&PC1,&PC2,&PD1,&PD2);
/* 确定所采用的坐标 */
     if(icon[3]==2) {
        printf("coordinates in RINEX files used:\n");
        fprintf(fp_docu[0],"coordinates in RINEX files used:\n");
        for(i=0;i<icon[0];i++) {
           x0[0+i*3]=xhidat[23+i*2*Isat]+xhidat[24+i*2*Isat]/1000.;
           x0[1+i*3]=xhidat[25+i*2*Isat]+xhidat[26+i*2*Isat]/1000.;
           x0[2+i*3]=xhidat[27+i*2*Isat]+xhidat[28+i*2*Isat]/1000.;
           printf("%14.3f %14.3f %14.3f\n",x0[0+i*3],x0[1+i*3],x0[2+i*3]);
           fprintf(fp_docu[0],"%14.3f %14.3f %14.3f\n",
                   x0[0+i*3],x0[1+i*3],x0[2+i*3]);
        }
     }
/* 迭代计算初始化 */
     for(i=0;i<icon[0];i++) { /* 为了迭代 */
        x01[0+i*3]=x0[0+i*3];x01[1+i*3]=x0[1+i*3]; x01[2+i*3]=x0[2+i*3];
     }
/* 计算每个测站的相对高程 */
     fprintf(fp_docu[0],"coordinates in WGS84 geodetic ellipsoid:\n");
     for(i=0;i<icon[0];i++) {
        xi=x0[0+i*3]; yi=x0[1+i*3]; zi=x0[2+i*3];
        if(O_main==0) printf("xyz=%lf %lf %lf\n",xi,yi,zi);
        TRANF(2,&phi,&lambda,&height,&xi,&yi,&zi,0.,0.);
        Fi[i]=phi; La[i]=lambda; Height[i]=height;
        fprintf(fp_docu[0],"%14.8f %14.8f %14.3f\n",
                Fi[i]*180/PI,La[i]*180/PI,Height[i]);
     }
     for(i=0;i<Kstation;i++) Height[i]=0.;/*set kinematic Height as zero*/
     if(icon[12]==2) lambda0=La[0];
/* 时间 */
     rtb = icon[4]*3600 + icon[5]*60. + icon[6]; 
     rte = icon[7]*3600 + icon[8]*60. + icon[9]; 
      dt = xhidat[14]+xhidat[15]/10.; /*  RINEX 数据中的dt  */
      dt = icon[10]*1.0/icon[11]; /* 想要的 dt */
     rt=rtb; dt_interval=dt; Itend = (long)((rte-rtb)/dt)+1; 
     printf("rtb,rte,dt,Itend= %7.1f %7.1f %4.1f %7d\n",rtb,rte,dt,Itend);
/* 得到轨道数据并决定参考卫星 Ref_sv */
     I_la = icon[25]; 
     if(icon[1]==1) igs(fp_orbit[0],borb,itborb,I_la);
     else broadcast(fp_orbit,icon[2],borb,itborb);
     Ref_sv=icon[14];
     if(icon[14]<=0 || icon[14]>31) 
     Ref_sv=refsat(itborb,borb,icon[0],x0,rtb,rte);
     printf("refsat= %d\n",Ref_sv);
     for(i=0;i<8;i++) printf("%d ",itborb[i]); printf("\n");
     i1=icon[0];
     for(i=0;i<I96;i++) for(j=0;j<3*Kstation;j++) Tr1[j+i*3*i1] = 0.;
/* 为得到GPS数据的初始化 */
     In0=-1;
/* 为计算矩阵 an_s[],向量 b1_s[]、 ltpl_s 的初始化 */
     for (i=0;i<Iunknown;i++) { 
        for(j=0;j<=i;j++) {an_s[j+i*(i+1)/2] = 0.; }
        b1_s[i] = 0.; accur[i]=0.; N00_n[i]=0; Nk[i]=0.;
     } ltpl_s = 0.; icon[202]=0; icon[207]=0; icon20=icon[20];
/* 每个历元数据进行循环 */ 
     for(I=1;I<Itend;I++) { /* 历元间数据循环,求得GPS数据,数据标号为In0 */
        In0+=1; 
        icon[206]=0; if(In0==Iswitch) icon[206]=1;
        gps_dat(fp_rinex,ifp,xhidat,odat_t,odat_dt,odat_n,&In0,rt,dt,odat,
                id_odat,iodat,odat1,iodat1,
                sdat,id_sdat,isdat,sdat_n,ddat,id_ddat,iddat,ddat_n,
                tdat,id_tdat,itdat,tdat_n,Ref_sv,
                slips_t,id_slips,ion_r,iion_r
                ,icon,x0,Height,borb,itborb,Tr1,singlex,singlet,singlx,singlt
        );
        t_hms(odat_t[In0],&hour,&minute,&sec);
        if(I==1) t00_1=odat_t[In0-1]; else t00_1=t00_;

⌨️ 快捷键说明

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