/* exclude meas of eclipsing satellite (block IIA) ---------------------------*/ static void testeclipse(const obsd_t *obs, int n, const nav_t *nav, double *rs) { double rsun[3],esun[3],r,ang,erpv[5]={0},cosa; int i,j; const char *type; trace(3,"testeclipse:\n"); /* unit vector of sun direction (ecef) */ sunmoonpos(gpst2utc(obs[0].time),erpv,rsun,NULL,NULL); normv3(rsun,esun); for (i=0;i<n;i++) { type=nav->pcvs[obs[i].sat-1].type; if ((r=norm(rs+i*6,3))<=0.0) continue; #if 1 /* only block IIA */ if (*type&&!strstr(type,"BLOCK IIA")) continue; #endif /* sun-earth-satellite angle */ cosa=dot(rs+i*6,esun,3)/r; cosa=cosa<-1.0?-1.0:(cosa>1.0?1.0:cosa); ang=acos(cosa); /* test eclipse */ if (ang<PI/2.0||r*sin(ang)>RE_WGS84) continue; trace(2,"eclipsing sat excluded %s sat=%2d\n",time_str(obs[0].time,0), obs[i].sat); for (j=0;j<3;j++) rs[j+i*6]=0.0; } }
/* 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]); }
/* satellite antenna phase center offset --------------------------------------- * compute satellite antenna phase center offset in ecef * args : gtime_t time I time (gpst) * double *rs I satellite position and velocity (ecef) * {x,y,z,vx,vy,vz} (m|m/s) * pcv_t *pcv I satellite antenna parameter * double *dant I satellite antenna phase center offset (ecef) * {dx,dy,dz} (m) * return : none *-----------------------------------------------------------------------------*/ extern void satantoff(gtime_t time, const double *rs, const pcv_t *pcv, double *dant) { double ex[3],ey[3],ez[3],es[3],r[3],rsun[3],gmst; int i; trace(4,"satantoff: time=%s\n",time_str(time,3)); /* sun position in ecef */ sunmoonpos(gpst2utc(time),NULL,rsun,NULL,&gmst); /* unit vectors of satellite fixed coordinates */ for (i=0;i<3;i++) r[i]=-rs[i]; if (!normv3(r,ez)) return; for (i=0;i<3;i++) r[i]=rsun[i]-rs[i]; if (!normv3(r,es)) return; cross3(ez,es,r); if (!normv3(r,ey)) return; cross3(ey,ez,ex); for (i=0;i<3;i++) { /* use L1 value */ dant[i]=pcv->off[0][0]*ex[i]+pcv->off[0][1]*ey[i]+pcv->off[0][2]*ez[i]; } }