Skip to content

Commit bdb5af2

Browse files
Merge pull request #832 from ourairquality/sp3-prec-clks
satposs: fix to work with precise clocks from sp3 files
2 parents 28ad77c + 5c9cd9d commit bdb5af2

2 files changed

Lines changed: 38 additions & 11 deletions

File tree

src/ephemeris.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,8 +808,13 @@ extern void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
808808
time[i]=timeadd(obs[i].time,-pr/CLIGHT);
809809

810810
/* satellite clock offset from precise products or broadcast ephemeris */
811-
if (ephopt==EPHOPT_PREC&&nav->nc>0) {
812-
if(!pephclk(time[i],obs[i].sat,nav,&dt,NULL)) {
811+
812+
// Note: this uses as input the estimated satellite clock time without
813+
// correction but the precise clock corrections are wrt GPST. The
814+
// satellite clock drift over this small period is considered
815+
// negligible to the clock offset lookup here.
816+
if (ephopt == EPHOPT_PREC) {
817+
if (!pephclk(time[i], obs[i].sat, nav, &dt, NULL)) {
813818
trace(3,"no precise clock %s sat=%2d\n",time2str(time[i],tstr,3),obs[i].sat);
814819
continue;
815820
}

src/preceph.c

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
#define NMAX 10 /* order of polynomial interpolation */
5757
#define MAXDTE 900.0 /* max time difference to ephem time (s) */
58-
#define EXTERR_CLK 1E-3 /* extrapolation error for clock (m/s) */
58+
#define EXTERR_CLK 0.4E-3 /* extrapolation error for clock (m/s) */
5959
#define EXTERR_EPH 5E-7 /* extrapolation error for ephem (m/s^2) */
6060
#define MAX_BIAS_SYS 6 /* # of constellations supported */
6161

@@ -639,17 +639,18 @@ static int pephpos(gtime_t time, int sat, const nav_t *nav, double *rs,
639639
else if (c[0]!=0.0&&c[1]!=0.0) {
640640
dts[0]=(c[1]*t[0]-c[0]*t[1])/(t[0]-t[1]);
641641
i=t[0]<-t[1]?0:1;
642-
std=nav->peph[index+i].std[sat-1][3]+EXTERR_CLK*fabs(t[i]);
642+
std = nav->peph[index+i].std[sat-1][3] * CLIGHT + EXTERR_CLK * fabs(t[i]);
643643
}
644644
else {
645645
dts[0]=0.0;
646646
}
647647
if (varc) *varc=SQR(std);
648648
return 1;
649649
}
650+
650651
/* satellite clock by precise clock ------------------------------------------*/
651-
extern int pephclk(gtime_t time, int sat, const nav_t *nav, double *dts,
652-
double *varc)
652+
static int pephclk1(gtime_t time, int sat, const nav_t *nav, double *dts,
653+
double *varc)
653654
{
654655
double t[2],c[2],std;
655656
int i,j,k,index;
@@ -661,7 +662,7 @@ extern int pephclk(gtime_t time, int sat, const nav_t *nav, double *dts,
661662
timediff(time,nav->pclk[0].time)<-MAXDTE||
662663
timediff(time,nav->pclk[nav->nc-1].time)>MAXDTE) {
663664
trace(3,"no prec clock %s sat=%2d\n",time2str(time,tstr,0),sat);
664-
return 1;
665+
return 0;
665666
}
666667
/* binary search */
667668
for (i=0,j=nav->nc-1;i<j;) {
@@ -696,6 +697,27 @@ extern int pephclk(gtime_t time, int sat, const nav_t *nav, double *dts,
696697
if (varc) *varc=SQR(std);
697698
return 1;
698699
}
700+
// Precise clock -------------------------------------------------------------
701+
// Search for a precise clock in either the precise clock or the precise
702+
// ephemeris data, in this order.
703+
// Args : gtime_t time I time (GPST)
704+
// int sat I satellite number
705+
// nav_t *nav I navigation data
706+
// double *dts O satellite clock bias (s)
707+
// double *var O satellite clock variance (m^2)
708+
// Return : 1 in success; 0 on failure.
709+
//
710+
// Note: the dts and varc outputs are not modified on failure.
711+
extern int pephclk(gtime_t time, int sat, const nav_t *nav, double *dts, double *varc) {
712+
713+
if (pephclk1(time, sat, nav, dts, varc)) return 1;
714+
double rs[3], dts2;
715+
if (!pephpos(time, sat, nav, rs, &dts2, NULL, varc)) return 0;
716+
if (dts2 == 0.0) return 0;
717+
*dts = dts2;
718+
return 1;
719+
}
720+
699721
/* satellite antenna phase center offset ---------------------------------------
700722
* compute satellite antenna phase center offset in ecef
701723
* args : gtime_t time I time (gpst)
@@ -803,12 +825,12 @@ extern int peph2pos(gtime_t time, int sat, const nav_t *nav, int opt,
803825
if (sat<=0||MAXSAT<sat) return 0;
804826

805827
/* satellite position and clock bias */
806-
if (!pephpos(time,sat,nav,rss,dtss,&vare,&varc)||
807-
!pephclk(time,sat,nav,dtss,&varc)) return 0;
828+
if (!pephpos(time,sat,nav,rss,dtss,&vare,&varc)) return 0;
829+
pephclk1(time, sat, nav, dtss, &varc);
808830

809831
time_tt=timeadd(time,tt);
810-
if (!pephpos(time_tt,sat,nav,rst,dtst,NULL,NULL)||
811-
!pephclk(time_tt,sat,nav,dtst,NULL)) return 0;
832+
if (!pephpos(time_tt,sat,nav,rst,dtst,NULL,NULL)) return 0;
833+
pephclk1(time_tt, sat, nav, dtst, NULL);
812834

813835
/* satellite antenna offset correction */
814836
if (opt) {

0 commit comments

Comments
 (0)