📄 controlf.c
字号:
controlf.c
void r_con(fp_rinex,fp_orbit,fp_docu,conf_name,icon,i_con,x0,
idN00,N00,N0tb,m00,ici,docux)
/* 函数 r_con 读取一个数据文件的控制信息并打开它 */
FILE *fp_rinex[Ista],*fp_orbit[Ista],*fp_docu[6];
char conf_name[I50];
char docux[I50];
int icon[I10*Isat],i_con,ici[Iunknown];
double x0[3*Ista];
long idN00[Iunknown],N0tb[Iunknown];
double N00[Iunknown],*m00;
{ FILE *fp,*fp_r[Ista];
int id,i_rf,i_of,i_rf1,i,j,k,k1,ih,im,is,idebug,idocu=0,iresu=0,I=0;
int iresu1=0;
char orbitf_name[Ista][I50],rinexf_name[Ista][I50];
char str[Iline],str1[Iline],docuf_name[I50],resuf_name[I50];
double f,f1,f2,f3,f4;
/* 打开并读控制文件 */
if(i_con<=1)
{ printf("input control data file_name please\n");
scanf("%s",conf_name); printf("file name is: %s\n",conf_name); }
if((fp = fopen(conf_name,"r")) == NULL)
{ printf("Cannot open the file : %s\n",conf_name);
exit(0); }
/* 对 rinex,orbit 文件数设置初始值 i_rf,i_of */
i_rf=0;i_of=0;i_rf1=0;
for(i=0;i<I10*Isat;i++) icon[i]=-2;
/* 读取控制数据文件 */
nextline:;
k1 = getline(fp,str); if(k1<=1) goto nextline;
if(strstr(str,"EOF")) goto dataend;
if(strstr(str,"*")) goto nextline;
if(O_rcon==0) printf("%s",str);
/* 求出指标 ':',拷贝‘:’前的 str 为 str1 */
id = indexx(str,':'); strncpy(str1,str,id); str1[id]='\0';
/* gps 数据文件名 */
if(strstr(str,"RINEX data"))
{ repeat:;
for(i=0;i<id;i++) if(str1[i]==' ')
{ for(j=i+1;j<=id;j++) str1[j-1]=str1[j];
id -= 1; goto repeat; }
strncpy(rinexf_name[i_rf],str1,id); rinexf_name[i_rf][id]='\0'; i_rf+=1;
icon[0] = i_rf; /* 记录在 icon[0] 中的测站名 */
goto nextline; }
/* igs 数据文件名 */
if(strstr(str,"IGS"))
{ if(icon[1]==2)
printf("error : not allowed to use both IGS,Broad orbit\n");
icon[1]=1; /* icon[1]=1,2 应用的IGS,广播星历 */
repeat1:;
for(i=0;i<id;i++) if(str1[i]==' ')
{ for(j=i+1;j<=id;j++) str1[j-1]=str1[j];
id -= 1; goto repeat1; }
strncpy(orbitf_name[i_of],str1,id); orbitf_name[i_of][id]='\0';i_of+=1;
icon[2]=i_of; goto nextline; }
/* 广播星历文件名 */
if(strstr(str,"Broadcast"))
{ if(icon[1]==1)
printf("error : not allowed to use both IGS,Broad orbit\n");
icon[1]=2;
repeat2:;
for(i=0;i<id;i++) if(str1[i]==' ')
{ for(j=i+1;j<=id;j++) str1[j-1]=str1[j];
id -= 1; goto repeat2; }
/* 在函数中strncpy 加上id */
strncpy(orbitf_name[i_of],str1,id); orbitf_name[i_of][id]='\0';i_of+=1;
icon[2]=i_of; goto nextline; }
if(strstr(str,"Document"))
{ idocu+=1;
repeat3:;
for(i=0;i<id;i++) if(str1[i]==' ')
{ for(j=i+1;j<=id;j++) str1[j-1]=str1[j];
id -= 1; goto repeat3; }
strncpy(docuf_name,str1,id); docuf_name[id]='\0';
goto nextline; }
/* 每个测站的坐标 x,y,z */
if(strstr(str,"Coordinates"))
{ sscanf(str,"%lf %lf %lf %lf",&f,&f1,&f2,&f3);
x0[0+i_rf1*3]=f; x0[1+i_rf1*3]=f1; x0[2+i_rf1*3]=f2;
TropCoef[i_rf1]=1.; i_rf1+=1;
goto nextline; }
/* 应用上述坐标 x,y,z 或应用 Rinex 数据的输入 */
if(strstr(str,"Icoordinates"))
{ sscanf(str,"%d",&i); icon[3]=i; Icoord=i;
goto nextline; }
/* 年 月 日 */
if(strstr(str,"Year"))
{ sscanf(str,"%d %d %d",&ih,&im,&is);
icon[16]=ih; icon[17]=im; icon[18]=is;
goto nextline; }
/* 开始时间 */
if(strstr(str,"Begin"))
{ sscanf(str,"%d %d %d",&ih,&im,&is);
icon[4]=ih; icon[5]=im; icon[6]=is;
goto nextline; }
/* 结束时间 */
if(strstr(str,"End"))
{ sscanf(str,"%d %d %d",&ih,&im,&is);
icon[7]=ih; icon[8]=im; icon[9]=is;
goto nextline; }
/* 时间间隔 */
if(strstr(str,"Time"))
{ sscanf(str,"%d %d",&ih,&im);
icon[10]=ih; icon[11]=im;
goto nextline; }
/* 静态测量/动态测量 */
icon[12]=1;
/* 参考卫星Ref_sv */
if(strstr(str,"Ref_sv"))
{ sscanf(str,"%d",&ih); icon[14]=ih;
goto nextline; }
/* 对流层模型 */
icon[15]=1;
/* 双频组合方法 */
if(strstr(str,"Dual"))
{ if(strstr(str,"Factor1")) /* 组合因子 Factor1,2 */
{ sscanf(str,"%d %d",&ih,&im); icon[21]=ih; icon[22]=im;
Factor1=ih*1./im; goto nextline; }
if(strstr(str,"Factor2"))
{ sscanf(str,"%d %d",&ih,&im); icon[23]=ih; icon[24]=im;
Factor2=ih*1./im; goto nextline; }}
if(strstr(str,"DD"))
{ sscanf(str,"%d",&ih); icon[20]=ih; goto nextline; }
/* 拉格朗日多项式 */
icon[25]=7;
/* 参数 Trop_, Clock_, Tide_, Rela_ */
icon[30]=0; icon[31]=1; icon[32]=0; icon[33]=0;
if(strstr(str,"Cycleslip"))
{ sscanf(str,"%d %d",&ih,&im); Cycleslip=ih+im/10.;
Cycleslip=twoi2f(ih,im); goto nextline; }
if(strstr(str,"M_cyctest"))
{ sscanf(str,"%d",&ih); M_cyctest=ih; goto nextline; }
if(strstr(str,"Igs_v"))
{ sscanf(str,"%d",&ih); Igs_v=ih; goto nextline; }
if(strstr(str,"Run_n"))
{ sscanf(str,"%d",&ih); Run_n=ih; goto nextline; }
if(strstr(str,"Ambiguity"))
{ sscanf(str,"%d",&ih); Ambiguity=ih; goto nextline; }
/* 打开和关闭 Debug 函数 */
if(strstr(str,"EOF")) goto dataend;
else goto nextline;
dataend:;
rewind(fp);
/* 检查输入参数,打开报告文件 */
if(idocu!=0) {
if((fp_docu[0] = fopen(docuf_name,"w")) == NULL)
{printf("Cannot open output file : %s\n",docuf_name);
exit(0);} }
else
{ if((fp_docu[0] = fopen("docu","w")) == NULL)
{printf("Cannot open output file : docu\n");
exit(0);} }
/* 输出和输入控制文件到 docuf 文件 */
nextline1:;
k1 = getline(fp,str); if(k1<=1) goto nextline1;
if(!strstr(str,"EOF")) { fprintf(fp_docu[0],"%s",str); goto nextline1;}
fprintf(fp_docu[0],"%s",str); fclose(fp);
/* 输出信息到报告文件中 */
Tsta=icon[0];
/* 将 debug 开关参数放入公共变量,打开有关文件 */
for (i=0;i<icon[0];i++)
{ if((fp_rinex[i] = fopen(rinexf_name[i],"r")) == NULL)
{printf("Cannot open input file : %s\n",rinexf_name[i]);
exit(0); }}
for (i=0;i<icon[2];i++)
{ if((fp_orbit[i] = fopen(orbitf_name[i],"r")) == NULL)
{printf("Cannot open input file : %s\n",orbitf_name[i]);
exit(0); } }
/* 打开控制数据文件 */
for(i=200;i<210;i++) icon[i]=0;
/* 如果run_n==2,3 从 keybord,file Ncancel读 N00id,N00tb,N00te */
if(Run_n==2)
{ printf("input to be canceled N number\n");
scanf("%d",&Ncancel_n); printf("input is: %d\n",Ncancel_n);
for(i=0;i<Ncancel_n;i++)
{ printf("input integer N00id N00tb N00te \n");
scanf("%ld %ld %ld",&N00id[i],&N00tb[i],&N00te[i]);
printf("N00idtbte= %8d %8d %8d",N00id[i],N00tb[i],N00te[i]);} }
if(Run_n>=3)
{ if(icon[12]==1)
{ if((fp = fopen("ncancel","r")) == NULL)
{ printf("Cannot open the file : ncancel\n");
exit(0); }
k1 = getline(fp,str); if(k1<=1)printf("file Ncancel error\n");
sscanf(str,"%d",&Ncancel_n); printf("Ncancel_n is: %d\n",Ncancel_n);
for(i=0;i<Ncancel_n;i++)
{ k1 = getline(fp,str); if(k1<=1)printf("file Ncancel error\n");
sscanf(str,"%ld %ld %ld",&N00id[i],&N00tb[i],&N00te[i]);
printf("N00idtbte= %8d %8d %8d\n",N00id[i],N00tb[i],N00te[i]); }
fclose(fp); }}}
void wr_condat(fp,idN00,N0tb,N00,m00,ici,iunknown,icon_)
/* 写/读 (icon_1=1/2) 数据 idN00, N0tb, N00, m00, iunknown
到 fp (file con_dat), iunknown = icon[201] */
FILE *fp;
long idN00[Iunknown],N0tb[Iunknown];
double N00[Iunknown],*m00;
int ici[Iunknown],*iunknown,icon_;
{ int i,j,j1,k; char s[Iline]; long i1,i2; double f1;
if(icon_==1)
{ fprintf(fp," %d %lf\n",*iunknown,*m00);
for(i=0;i<*iunknown;i++)
{ fprintf(fp,"0 %8d %8d %lf\n",idN00[i],N0tb[i],N00[i]);} }
else
{ i=getline(fp,s);
sscanf(s,"%d %lf",&j,&f1); printf("%d %lf\n",j,f1);
for(k=0;k<j;k++)
{ i=getline(fp,s); sscanf(s,"%d %ld %ld %lf",&j1,&i1,&i2,&f1);
printf("%d %ld %ld %lf\n",j1,i1,i2,f1);
ici[k]=j1; idN00[k]=i1; N0tb[k]=i2; N00[k]=f1; }}
fclose(fp);}
int indexx(s,c)
/* 在字串s中搜索字母c,如无发现返回-1,s的最大维数为 Iline */
char s[Iline],c;
{ int i,i1,j,j1,k=-1;
i1 = strlen(s);
for (i=0;i<i1;i++)
{ if (s[i]==c) {k = i; return(k);} }
return(k);}
void DOP(fp,icon,Fi,La,an,idN0)
FILE *fp;
int icon[I10*Isat];
double Fi[Ista],La[Ista];
double an[Nlow];
long idN0[Iunknown];
/* 计算DOP */
{ long i,j,k,l,m;
double sum,sum1,sum2,phi,lambda,h,X[3],Q[6];
for(sum=0.,i=0;i<icon[201];i++) sum += an[i+i*(i+1)/2]; /* GDOP */
sum = sqrt(sum);
fprintf(fp,"GDOP = %lf\n",sum);
for(sum1=0.,i=0;i<icon[201];i++) /* PDOP */
{ j=idN0[i]-(idN0[i]/10)*10;
if(j==1||j==2||j==3) sum1 += an[i+i*(i+1)/2]; }
sum1 = sqrt(sum1);
fprintf(fp,"PDOP = %lf\n",sum1);
for (sum2=0.,i=0;i<icon[201];i++) /* ADOP */
{ if(idN0[i] > 1000000) sum2 += an[i+i*(i+1)/2]; }
sum2 = sqrt(sum2);
fprintf(fp,"ADOP = %lf\n",sum2);
/*for(i=0;i<icon[201]*(icon[201]+1)/2;i++) /* HDOP,VDOP */
{ printf("an[%d]=%lf \n",i,an[i]); }*/
for(k=0;k<icon[201];k++)
{ j=idN0[k]-(idN0[k]/10)*10;
i=(idN0[k]-j)/10;
if(i<=icon[0] && j==1)
{ /*printf("k=%d\n",k);*/
phi=Fi[k]; lambda=La[k];
X[0]=0.;X[1]=0.;X[2]=0.;
Q[0] = an[k+k*(k+1)/2];
l=k+1;
Q[2] = an[l+l*(l+1)/2];
Q[1] = an[l+l*(l+1)/2-1];
l=k+2;
Q[5] = an[l+l*(l+1)/2];
Q[4] = an[l+l*(l+1)/2-1];
Q[3] = an[l+l*(l+1)/2-2];
/*printf("Q= ");
for(l=0;l<6;l++) printf("%lf ",Q[l]);
printf("\n");*/
rotation(stdout,phi,lambda,X,Q,1);
/*printf("rQrT= ");
for(l=0;l<6;l++) printf("%lf ",Q[l]);
printf("\n");*/
sum1=Q[0]+Q[2]; sum2=Q[5];
sum1 = sqrt(sum1); sum2 = sqrt(sum2);
fprintf(fp,"%d-th HDOP = %lf\n",i,sum1);
fprintf(fp,"%d-th VDOP = %lf\n",i,sum2); }}}
void w_info(fp,x0,b1,p,m0,icon,Fi0,idN0,N0,N0t)
FILE *fp;
double x0[3*Ista],b1[Iunknown],p[Iunknown],m0;
int icon[I10*Isat];
long Fi0[Iunknown],idN0[Iunknown],N0[Iunknown],N0t[Iunknown];
{ long i,j,k,l,m;
/* 将信息写入缓冲区 fp */
fprintf(fp,"total obs. number %ld\n",icon[207]*10000+icon[202]);
fprintf(fp,"total unknowns number %d\n",icon[201]);
fprintf(fp,"total stations number %d\n",icon[0]);
fprintf(fp,"total epoches. number %d\n",icon[211]);
fprintf(fp,"iterations number %d\n",icon[210]);
fprintf(fp,"initial coordinates used :\n");
for (i=0;i<icon[0];i++)
{ for (j=0;j<3;j++) fprintf(fp,"%16.4f",x0[j+i*3]);
fprintf(fp,"\n"); }
fprintf(fp,"m0 = %10.4f\n",m0);
fprintf(fp,"solutions vectors are :\n");
fprintf(fp," b1, p, idN0, N0, N0t, Fi0, Fi0-N0+b1, N00_n:\n");
for (i=0;i<icon[201];i++)
{ fprintf(fp,"%10.4f %10.4f %8d %8d %8d %10d %16.4f %5d\n",
b1[i],p[i],idN0[i],N0[i],N0t[i],Fi0[i],Fi0[i]-N0[i]+b1[i],N00_n[i]);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -