/* tidal displacement ---------------------------------------------------------- * displacements by earth tides * args : gtime_t tutc I time in utc * double *rr I site position (ecef) (m) * int opt I options (or of the followings) * 1: solid earth tide * 2: ocean tide loading * 4: pole tide * 8: elimate permanent deformation * double *erp I earth rotation parameters (NULL: not used) * double *odisp I ocean loading parameters (NULL: not used) * odisp[0+i*6]: consituent i amplitude radial(m) * odisp[1+i*6]: consituent i amplitude west (m) * odisp[2+i*6]: consituent i amplitude south (m) * odisp[3+i*6]: consituent i phase radial (deg) * odisp[4+i*6]: consituent i phase west (deg) * odisp[5+i*6]: consituent i phase south (deg) * (i=0:M2,1:S2,2:N2,3:K2,4:K1,5:O1,6:P1,7:Q1, * 8:Mf,9:Mm,10:Ssa) * double *dr O displacement by earth tides (ecef) (m) * return : none * notes : see ref [1], [2] chap 7 * see ref [4] 5.2.1, 5.2.2, 5.2.3 * ver.2.4.0 does not use ocean loading and pole tide corrections *-----------------------------------------------------------------------------*/ extern void tidedisp(gtime_t tutc, const double *rr, int opt, const erp_t *erp, const double *odisp, double *dr) { gtime_t tut; double pos[2],E[9],drt[3],denu[3],rs[3],rm[3],gmst,erpv[5]={0}; int i; #ifdef IERS_MODEL double ep[6],fhr; int year,mon,day; #endif trace(3,"tidedisp: tutc=%s\n",time_str(tutc,0)); if (erp) geterp(erp,tutc,erpv); tut=timeadd(tutc,erpv[2]); dr[0]=dr[1]=dr[2]=0.0; if (norm(rr,3)<=0.0) return; pos[0]=asin(rr[2]/norm(rr,3)); pos[1]=atan2(rr[1],rr[0]); xyz2enu(pos,E); if (opt&1) { /* solid earth tides */ /* sun and moon position in ecef */ sunmoonpos(tutc,erpv,rs,rm,&gmst); #ifdef IERS_MODEL time2epoch(tutc,ep); year=(int)ep[0]; mon =(int)ep[1]; day =(int)ep[2]; fhr =ep[3]+ep[4]/60.0+ep[5]/3600.0; /* call DEHANTTIDEINEL */ dehanttideinel_((double *)rr,&year,&mon,&day,&fhr,rs,rm,drt); #else tide_solid(rs,rm,pos,E,gmst,opt,drt); #endif for (i=0;i<3;i++) dr[i]+=drt[i]; } if ((opt&2)&&odisp) { /* ocean tide loading */ tide_oload(tut,odisp,denu); matmul("TN",3,1,3,1.0,E,denu,0.0,drt); for (i=0;i<3;i++) dr[i]+=drt[i]; } if ((opt&4)&&erp) { /* pole tide */ tide_pole(pos,erpv,denu); matmul("TN",3,1,3,1.0,E,denu,0.0,drt); for (i=0;i<3;i++) dr[i]+=drt[i]; } trace(5,"tidedisp: dr=%.3f %.3f %.3f\n",dr[0],dr[1],dr[2]); }
/* doppler residuals ---------------------------------------------------------*/ static int resdop(const obsd_t *obs, int n, const double *rs, const double *dts, const nav_t *nav, const double *rr, const double *x, const double *azel, const int *vsat, double *v, double *H) { double lam,rate,pos[3],E[9],a[3],e[3],vs[3],cosel; int i,j,nv=0; trace(3,"resdop : n=%d\n",n); ecef2pos(rr,pos); xyz2enu(pos,E); fprintf(output, " Begin doppler residuals calculation\n"); for (i=0;i<n&&i<MAXOBS;i++) { fprintf(output, " Satellite %i:\n", obs[i].sat); lam=nav->lam[obs[i].sat-1][0]; if (obs[i].D[0]==0.0||lam==0.0||!vsat[i]||norm(rs+3+i*6,3)<=0.0) { continue; } /* line-of-sight vector in ecef */ cosel=cos(azel[1+i*2]); a[0]=sin(azel[i*2])*cosel; a[1]=cos(azel[i*2])*cosel; a[2]=sin(azel[1+i*2]); matmul("TN",3,1,3,1.0,E,a,0.0,e); /* satellite velocity relative to receiver in ecef */ for (j=0;j<3;j++) vs[j]=rs[j+3+i*6]-x[j]; /* range rate with earth rotation correction */ rate=dot(vs,e,3)+OMGE/CLIGHT*(rs[4+i*6]*rr[0]+rs[1+i*6]*x[0]- rs[3+i*6]*rr[1]-rs[ i*6]*x[1]); fprintf(output, " rate = %f\n", rate); /* doppler residual */ v[nv]=-lam*obs[i].D[0]-(rate+x[3]-CLIGHT*dts[1+i*2]); fprintf(output, " Residual = %f", v[nv]); /* design matrix */ for (j=0;j<4;j++) H[j+nv*4]=j<3?-e[j]:1.0; nv++; } fprintf(output, " End residuals calculation, total %i residuals\n", nv); return nv; }