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