61#define SQR(x) ((x) * (x))
64#define NF_RTK(opt) ((opt)->nf)
65#define NP_RTK(opt) ((opt)->dynamics == 0 ? 3 : 9)
66#define NI_RTK(opt) (((opt)->ionoopt == IONOOPT_EST || (opt)->ionoopt == IONOOPT_EST_ADPT) ? MAXSAT : 0)
72#define NR_RTK(opt) (NP_RTK(opt) + NI_RTK(opt) + NT_RTK(opt))
73#define IB_RTK(s, f, opt) (NR_RTK(opt) + MAXSAT * (f) + (s) - 1)
76#define GME 3.986004415E+14
93 if (code1 == code2)
return 1;
94 if (code1 == 0 || code2 == 0)
return 0;
97 return (f1 >= 0 && f1 == f2);
101 return pcv && 0 <= slot && slot <
NFREQPCV && (
norm(pcv->
off[slot], 3) > 0.0 ||
norm(pcv->
var[slot], 19) > 0.0);
123 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
124 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
125 2, 2, 2, 2, 3, 3, 3, 5, 5, 5,
126 4, 4, 4, 4, 4, 4, 4, 6, 6, 6,
127 2, 2, 4, 4, 3, 3, 3, 1, 1, 0
142static double shapiro(
const double* rsat,
const double* rrcv) {
143 double rs, rr, rrs, rsr[3];
148 for (i = 0; i < 3; i++) {
149 rsr[i] = rsat[i] - rrcv[i];
153 return 2.0 *
GME /
CLIGHT /
CLIGHT * log((rs + rr + rrs) / (rs + rr - rrs));
170 double ek[3], exs[3], eys[3], ezs[3], ess[3], exr[3], eyr[3];
171 double eks[3], ekr[3], E[9];
172 double dr[3], ds[3], drs[3], r[3], pos[3], rsun[3], cosp, ph;
173 double erpv[5] = {0};
174 double we[3] = {0.0, 0.0,
OMGE},
satpos[3], o_cross_r[3];
181 for (i = 0; i < 3; i++) {
182 r[i] = rr[i] - rs[i];
189 for (i = 0; i < 3; i++) {
196 for (i = 0; i < 3; i++) {
200 for (i = 0; i < 3; i++) {
201 r[i] = rs[i + 3] + o_cross_r[i];
226 for (i = 0; i < 3; i++) {
227 ds[i] = exs[i] - ek[i] *
dot(ek, exs, 3) - eks[i];
228 dr[i] = exr[i] - ek[i] *
dot(ek, exr, 3) + ekr[i];
233 }
else if (cosp > 1.0) {
236 ph = acos(cosp) / 2.0 /
PI;
238 if (
dot(ek, drs, 3) < 0.0) {
242 *phw = ph + floor(*phw - ph + 0.5);
252extern double sat2freq(
int sat, uint8_t code,
const nav_t* nav);
264 for (f = 0; f < NFREQ + NEXOBS; f++) {
266 lam[f] = (freq > 0.0) ?
CLIGHT / freq : 0.0;
281 for (i = 0; i <
MAXCODE; i++) {
301 for (i = 0; i <
MAXSAT; i++) {
329 double m_d, m_w, tdvd, twvd, gh;
337 extern int get_stTv(
gtime_t t,
const double lat,
const double hs,
const double hg,
double* tdv,
double* twv);
338 if (
get_stTv(time, pos[0], pos[2], gh, &tdvd, &twvd)) {
343 m_d =
tropmapf(time, pos, azel, &m_w);
345 return m_d * tdvd * ztd + m_w * twvd * zwd;
378 if (obs->
L[2] != 0.0 || obs->
P[2] != 0.0) {
384 if (NFREQ == 1 || optf ==
POSL1) {
393 if (optf ==
POSL1L5_L2 && obs->
L[2] != 0.0 && obs->
P[2] != 0.0) {
397 if (obs->
L[1] != 0.0 || obs->
P[1] != 0.0) {
431 const double* pb,
double* compL,
int* pbreset,
const prcopt_t* opt,
ssat_t ssat,
int ch,
434 int i, k, qi, qj, isat = sat - 1, oft = isat * NFREQ, oft_b;
435 double lam[NFREQ + NEXOBS];
436 double disp0, dispm, dt, dgf, fi;
437 int nf = opt->
nf, flag, fqi, fqj;
443 oft_b = isat * NFREQ;
446 for (k = flag = 0; k < corr->
stec[index[0]].
n; k++) {
454 if (opt->
posopt[5] == 1) {
462 for (i = 0; i < nf; i++) {
463 if (
osr_ctx->comp_b0[ch][oft_b + i] == 0.0 ||
osr_ctx->comp_iono0[ch][isat] == 0.0) {
464 osr_ctx->comp_b0[ch][oft_b + i] = pb[i];
465 osr_ctx->comp_iono0[ch][isat] = iono;
471 for (i = 0; i < nf; i++) {
472 osr_ctx->comp_bm[ch][oft_b + i] =
osr_ctx->comp_b0[ch][oft_b + i];
473 osr_ctx->comp_b0[ch][oft_b + i] = pb[i];
477 osr_ctx->comp_iono0[ch][isat] = iono;
479 for (i = 1; i < nf; i++) {
485 if (fqi < 0 || fqj < 0) {
488 fi = (lam[fqi] > 0.0 && lam[fqj] > 0.0) ? lam[fqj] / lam[fqi] : 0.0;
494 osr_ctx->comp_bm[ch][oft_b + qi] -
osr_ctx->comp_bm[ch][oft_b + qj];
496 osr_ctx->comp_b0[ch][oft_b + qi] -
osr_ctx->comp_b0[ch][oft_b + qj];
497 osr_ctx->comp_coef[ch][isat + (i - 1) *
MAXSAT] = (disp0 - dispm) / dt;
500 for (i = 0; i < nf; i++) {
501 osr_ctx->comp_b0[ch][oft_b + i] = obs->
L[i] * lam[i];
502 osr_ctx->comp_slip[ch][oft + i] = 0;
511 if (opt->
posopt[5] == 1) {
512 for (i = 1; i < nf; i++) {
517 if (fqi < 0 || fqj < 0) {
520 fi = (lam[fqi] > 0.0 && lam[fqj] > 0.0) ? lam[fqj] / lam[fqi] : 0.0;
525 if (pbreset[qi] || pbreset[qj]) {
526 osr_ctx->comp_coef[ch][isat] = 0.0;
529 compL[qi] = (compL[qi] == 0.0)
530 ? (1.0 / (1.0 -
SQR(fi)) *
osr_ctx->comp_coef[ch][isat + (i - 1) *
MAXSAT] * dt)
532 compL[qj] =
SQR(fi) / (1.0 -
SQR(fi)) *
osr_ctx->comp_coef[ch][isat + (i - 1) *
MAXSAT] * dt;
535 for (i = 0; i < nf; i++) {
536 if (ssat.
slip[i] > 0) {
537 osr_ctx->comp_slip[ch][oft + i] = 1;
540 for (i = 1; i < nf; i++) {
543 fi = (lam[qi] > 0.0 && lam[qj] > 0.0) ? lam[qj] / lam[qi] : 0.0;
544 if (
osr_ctx->comp_slip[ch][oft + qi] ||
osr_ctx->comp_slip[ch][oft + qj] || obs->
L[qi] * lam[qi] == 0.0 ||
545 obs->
L[qj] * lam[qj] == 0.0 || pbreset[qi] || pbreset[qj]) {
548 dgf = obs->
L[qi] * lam[qi] - obs->
L[qj] * lam[qj] -
549 (
osr_ctx->comp_b0[ch][oft_b + qi] -
osr_ctx->comp_b0[ch][oft_b + qj]);
550 compL[qi] = (compL[qi] == 0.0) ? (1.0 / (1.0 -
SQR(fi)) * dgf) : compL[qi];
551 compL[qj] =
SQR(fi) / (1.0 -
SQR(fi)) * dgf;
585 double lam[NFREQ + NEXOBS];
586 double vari, dant[
NFREQPCV] = {0}, compL[NFREQ + NEXOBS] = {0};
587 double stec = 0.0, rate, t5, t6;
588 double pbias[NFREQ + NEXOBS] = {0}, cbias[NFREQ + NEXOBS] = {0};
589 int i, j, sat, smode, nsig, nf = opt->
nf;
598 for (i = 0; i < nf; i++) {
607 trace(NULL, 2,
"age of ssr bias error: time=%s sat=%2d tc,tp=%.0f,%.0f\n",
time_str(obs->
time, 0), sat, t5, t6);
608 memset(&nav->
ssr_ch[ch][sat - 1].
t0[4], 0x00,
sizeof(nav->
ssr_ch[ch][sat - 1].
t0[4]));
609 memset(&nav->
ssr_ch[ch][sat - 1].
t0[5], 0x00,
sizeof(nav->
ssr_ch[ch][sat - 1].
t0[5]));
616 int sys =
satsys(sat, NULL);
617 for (i = 0; i < nf; i++) {
619 for (j = 0; j < nsig && j <
MAXCODE; j++) {
620 smode = corr->
smode[sat - 1][j];
621 if (smode == 0)
continue;
622 if (obs->
code[i] == smode) {
623 pbias[i] = nav->
ssr_ch[ch][sat - 1].
pbias[smode - 1];
624 cbias[i] = nav->
ssr_ch[ch][sat - 1].
cbias[smode - 1];
630 for (j = 0; j < nsig && j <
MAXCODE; j++) {
631 smode = corr->
smode[sat - 1][j];
632 if (smode == 0)
continue;
634 pbias[i] = nav->
ssr_ch[ch][sat - 1].
pbias[smode - 1];
635 cbias[i] = nav->
ssr_ch[ch][sat - 1].
cbias[smode - 1];
644 &rate, &vari, brk)) {
645 trace(NULL, 2,
"clas_osr_corrmeas: iono correction error: time=%s sat=%2d\n",
time_str(obs->
time, 2), obs->
sat);
650 for (i = flag = 0; i < corr->
stec[grid->
index[0]].
n; i++) {
659 if (dt < 0.0 || dt >= 30.0) {
661 "inconsist ssr correction (iono-pbias): time=%s sat=%2d "
667 if (dt < -30.0 || dt > 30.0) {
669 "inconsist ssr correction (iono-orbit): time=%s sat=%2d "
679 "clas_osr_corrmeas: pbias_tow=%.1f, cbias_tow=%.1f, "
684 if (dt > 0.0 || dt < -30.0) {
685 trace(NULL, 2,
"inconsist correction (pbias-cbias): time=%s sat=%2d dt=%.2f\n",
time_str(obs->
time, 0), sat,
692 clas_osr_compensatedisp(corr, grid->
index, obs, sat, stec, pbias, compL, pbreset, opt, ssat, ch,
osr_ctx, nav);
699 for (i = 0; i < nf; i++) {
700 osr->
cbias[i] = cbias[i];
701 osr->
pbias[i] = pbias[i];
702 osr->
compL[i] = compL[i];
705 for (i = 0; i < nf; i++) {
707 osr->
wupL[i] = lam[i] * ssat.
phw;
708 osr->
antr[i] = (0 <= ant_idx && ant_idx <
NFREQPCV) ? dant[ant_idx] : 0.0;
737 const double* Emat,
const double* Gmat,
const double* weight,
double* dr) {
739 double drt[3], val[4], val_[4], denu_grid[4][3], denu[3] = {0};
742 for (i = 0; i < nn && i < 4; i++) {
746 if (nn == 4 && Gmat && Emat) {
748 for (i = 0; i < 3; i++) {
749 for (j = 0; j < nn; j++) {
750 val[j] = denu_grid[j][i];
752 matmul(
"NN", nn, 1, nn, 1.0, Gmat, val, 0.0, val_);
753 denu[i] =
dot(Emat, val_, 4);
757 for (i = 0; i < nn; i++) {
758 for (j = 0; j < 3; j++) {
759 denu[j] += denu_grid[i][j] * weight[i];
764 matmul(
"TN", 3, 1, 3, 1.0, E, denu, 0.0, drt);
765 for (i = 0; i < 3; i++) {
769 trace(NULL, 5,
"ocean_tide_clasgrid: denu=%.4f %.4f %.4f\n", denu[0], denu[1], denu[2]);
781#define MAXAGESSR_SIS 60.0
782#define MAXECORSSR_SIS 10.0
783#define MAXCCORSSR_SIS (1E-6 * CLIGHT)
796 double t1, t2, t3, deph[3], dclk, dorb[3], orbit;
797 double rs[6], dts[2], var, sig[3], nsig[3];
798 double er[3], ea[3], ec[3], rc[3];
804 ssr = nav->
ssr_ch[ch] + sat - 1;
805 sc = &ctx->
satcorr[ch][sat - 1];
822 if (ssr->
udi[0] >= 1.0) {
823 t1 -= ssr->
udi[0] / 2.0;
825 if (ssr->
udi[1] >= 1.0) {
826 t2 -= ssr->
udi[1] / 2.0;
829 for (i = 0; i < 3; i++) {
830 deph[i] = ssr->
deph[i] + ssr->
ddeph[i] * t1;
832 dclk = ssr->
dclk[0] + ssr->
dclk[1] * t2 + ssr->
dclk[2] * t2 * t2;
834 if (ssr->
iod[0] == ssr->
iod[2] && ssr->
t0[2].
time && fabs(t3) < 10.0) {
842 if (!
ephpos(time, teph, sat, nav, ssr->
iode, rs, dts, &var, &svh)) {
847 if (!
normv3(rs + 3, ea)) {
857 for (i = 0; i < 3; i++) {
858 dorb[i] = -(er[i] * deph[0] + ea[i] * deph[1] + ec[i] * deph[2]);
865 for (i = 0; i < 3; i++) {
871 orbit =
dot(nsig, dorb, 3);
878 "satcorr_update: tow=%.1f sat=%2d clk_tow=%.1f clk=%.6f "
879 "orb_tow=%.1f orb=%.6f prev_tow=%.1f\n",
896 "prevsis: tow=%.1f clk_tow=%.1f orb_tow=%.1f sat=%2d "
897 "iode=%3d prevsis=%f clk=%f orb=%f\n",
914 "currsis: tow=%.1f clk_tow=%.1f orb_tow=%.1f sat=%2d "
915 "currsis=%f clk=%f orb=%f\n",
945 "adjust_cpc: IODE diff tow=%.1f sat=%2d orb_tow=%.1f "
946 "%3d sis_tow=%.1f %3d\n",
953 "adjust_cpc: tow=%.1f sat=%2d pb_tow=%.1f sis_tow=%.1f "
954 "sig=%d sis=%f cpc=%.6f-->%.6f\n",
985 "adjust_prc: tow=%.1f sat=%2d pb_tow=%.1f sis_tow=%.1f "
986 "sig=%d sis=%f prc=%.6f-->%.6f\n",
1001 double rs[6] = {0}, dts[2] = {0}, e[3], var;
1002 double er[3], ea[3], ec[3], rc[3];
1003 int sys =
satsys(sat, NULL), svh0, i;
1011 double dt =
eph2clk(dts_time, eph);
1012 dts_time =
timeadd(dts_time, -dt);
1016 if (!
ephpos(dts_time, teph, sat, nav, sc->
previode, rs, dts, &var, &svh0)) {
1017 trace(NULL, 2,
"adjust_r_dts: old ephemeris unavailable tow=%.1f sat=%d iode=%d\n",
time2gpst(teph, NULL), sat,
1021 if (!
normv3(rs + 3, ea)) {
1031 for (i = 0; i < 3; i++) {
1032 rs[i] += -(er[i] * ssr->
deph[0] + ea[i] * ssr->
deph[1] + ec[i] * ssr->
deph[2]);
1036 trace(NULL, 2,
"adjust_r_dts: tow=%.1f sat=%d r=%.8f dts=%.8f\n",
time2gpst(teph, NULL), sat, *retr, *retdts);
1080int clas_osr_zdres(
const obsd_t* obs,
int n,
const double* rs,
const double* dts,
const double* vare,
const int* svh,
1081 nav_t* nav,
double* x,
double* y,
double* e,
double* azel,
rtk_t* rtk,
int osrlog,
1084 double r, rr[3], disp[3], pos[3], meas[NFREQ * 2], zwd, ztd;
1085 double lam[NFREQ + NEXOBS], fi;
1086 int i, j, f, qj, sat, sys, brk, nf = opt->
nf, nftmp;
1088 double modl[NFREQ * 2];
1094 double tmp_r, tmp_dts;
1101 memset(osrtmp, 0,
sizeof(osrtmp));
1111 for (i = 0; i < n * nf * 2; i++) {
1116 trace(NULL, 3,
"clas_osr_zdres: n=%d\n", n);
1118 for (i = 0; i < 3; i++) {
1122 if (
norm(rr, 3) <= 0.0) {
1130 for (i = 0; i < n && i <
MAXOBS; i++) {
1131 obs_copy[i] = obs[i];
1139 trace(NULL, 2,
"trop correction error: time=%s\n",
time_str(obs_copy[0].time, 2));
1160 double erpv[5] = {0}, pos_[2], E_[9];
1161 if (nav->
erp.
n > 0) {
1165 pos_[0] = asin(rr[2] /
norm(rr, 3));
1166 pos_[1] = atan2(rr[1], rr[0]);
1179 for (i = 0; i < 3; i++) {
1185 for (i = 0; i < n && i <
MAXOBS; i++) {
1186 sat = obs_copy[i].
sat;
1205 if (y == NULL && sat > 0 && sat <=
MAXSAT) {
1206 for (j = 0; j < nf; j++) {
1207 obs_copy[i].
code[j] = corr->
smode[sat - 1][j];
1213 for (j = nf; j < NFREQ + NEXOBS; j++) {
1214 obs_copy[i].
code[j] = 0;
1221 for (j = 0; j < nf * 2; j++) {
1222 meas[j] = modl[j] = 0.0;
1226 if ((r =
geodist(rs + i * 6, rr, e + i * 3)) <= 0.0) {
1229 if (
satazel(pos, e + i * 3, azel + i * 2) < opt->
elmin) {
1230 trace(NULL, 3,
"elevation mask rejection: sat=%2d, el=%4.1f\n", sat, azel[i * 2 + 1] *
R2D);
1251 if (!
clas_osr_corrmeas(obs_copy + i, nav, pos, azel + i * 2, opt, grid, corr, ssat[sat - 1], &brk, osr + i,
1252 ssat[sat - 1].pbreset, ch,
osr_ctx)) {
1267 for (j = 1; j < nf; j++) {
1268 if (corr->
smode[sat - 1][j] != 0) {
1278 for (j = 0; j < nf; j++) {
1281 fi = (lam[0] > 0.0) ? lam[f] / lam[0] : 0.0;
1310 tmp_dts = dts[i * 2];
1313 modl[j] = tmp_r -
CLIGHT * tmp_dts + osr[i].
CPC[j];
1314 modl[nftmp + j] = tmp_r -
CLIGHT * tmp_dts + osr[i].
PRC[j];
1315 osr[i].
CPC[j] += tmp_r -
CLIGHT * tmp_dts - (r -
CLIGHT * dts[i * 2]);
1316 osr[i].
PRC[j] += tmp_r -
CLIGHT * tmp_dts - (r -
CLIGHT * dts[i * 2]);
1318 modl[j] = r -
CLIGHT * dts[i * 2] + osr[i].
CPC[j];
1319 modl[nftmp + j] = r -
CLIGHT * dts[i * 2] + osr[i].
PRC[j];
1322 osr[i].
p[j] = modl[nftmp + j];
1323 osr[i].
c[j] = modl[j];
1326 tow =
time2gpst(obs_copy[i].time, NULL);
1328 if (tow ==
osr_ctx->satcorr[ch][sat - 1].tow) {
1329 osr[i].
orb =
osr_ctx->satcorr[ch][sat - 1].orb;
1330 osr[i].
clk =
osr_ctx->satcorr[ch][sat - 1].clk;
1340 if (dcpc >= 95.0 * lam[f] && dcpc < 105.0 * lam[f]) {
1347 x[
IB_RTK(sat, f, opt)] -= 100.0;
1350 "pbias slip detected t=%s sat=%2d f=%1d "
1351 "dcpc[cycle]=%.1f\n",
1352 time_str(obs_copy[i].time, 0), sat, f, lam[f] > 0.0 ? dcpc / lam[f] : 0.0);
1353 }
else if (dcpc <= -95.0 * lam[f] && dcpc > -105.0 * lam[f]) {
1356 x[
IB_RTK(sat, f, opt)] += 100.0;
1359 "pbias slip detected t=%s sat=%2d f=%1d "
1360 "dcpc[cycle]=%.1f\n",
1361 time_str(obs_copy[i].time, 0), sat, f, lam[f] > 0.0 ? dcpc / lam[f] : 0.0);
1371 double isb_val[NFREQ][2] = {{0}};
1373 for (f = 0; f < nf; f++) {
1374 meas[f] -= isb_val[f][0];
1376 for (f = 0; f < nf; f++) {
1377 meas[f + nf] -= isb_val[f][1];
1384 for (jj = 0; jj < nav->
sfts.
n; jj++) {
1390 meas[1] += ydif * lam[1];
1394 for (f = 0; f < nf; f++) {
1395 if (lam[f] == 0.0 || obs_copy[i].L[f] == 0.0 || obs_copy[i].P[f] == 0.0) {
1398 if (obs_copy[i].SNR[f] > 0.0 &&
testsnr(0, f, azel[i * 2 + 1], obs_copy[i].SNR[f] * 0.25, &opt->
snrmask)) {
1399 trace(NULL, 2,
"snr error: sat=%2d f=%d el=%.2f SNR=%.2f\n", sat, f, azel[i * 2 + 1] *
R2D,
1400 obs_copy[i].SNR[f] * 0.25);
1401 meas[f] = meas[f + nf] = 0.0;
1404 meas[f] += obs_copy[i].
L[f] * lam[f];
1405 meas[f + nf] += obs_copy[i].
P[f];
1409 for (j = 0; j < 2; j++) {
1410 for (f = 0; f < nf; f++) {
1411 if (meas[nf * j + f] == 0.0) {
1415 ssat[sat - 1].
code[f] = obs_copy[i].
code[f];
1417 if (f > 0 && !(f & qj)) {
1425 trace(NULL, 2,
"invalid pbias sat=%2d f=%1d\n", sat, f);
1429 trace(NULL, 2,
"invalid cbias sat=%2d f=%1d\n", sat, f);
1432 y[nf * i * 2 + nf * j + f] = meas[nf * j + f] - modl[nf * j + f];
1445 osr[i].
antr[1] = 0.0;
1446 osr[i].
wupL[1] = 0.0;
1447 osr[i].
CPC[1] = 0.0;
1448 osr[i].
PRC[1] = 0.0;
1452 tow =
time2gpst(obs_copy[i].time, NULL);
1454 "OSRRES(ch%d),%.1f,%d,%d,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,"
1455 "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,"
1456 "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,"
1457 "%.3f,%.9f,%.9f,%.3f\n",
1458 ch, tow, sys, prn, osr[i].pbias[0], osr[i].pbias[1], osr[i].pbias[2], osr[i].cbias[0],
1459 osr[i].cbias[1], osr[i].cbias[2], osr[i].trop, osr[i].iono, osr[i].antr[0], osr[i].antr[1],
1460 osr[i].antr[2], osr[i].relatv, osr[i].wupL[0], osr[i].wupL[1], osr[i].wupL[2], osr[i].compL[0],
1461 osr[i].compL[1], osr[i].compL[2], osr[i].sis, osr[i].CPC[0], osr[i].CPC[1], osr[i].CPC[2],
1462 osr[i].PRC[0], osr[i].PRC[1], osr[i].PRC[2], osr[i].orb, osr[i].clk, pos[0] *
R2D, pos[1] *
R2D,
1494 double *rs, *dts, *var, *e, *azel;
1495 int i, j, k = 0, nf = rtk->
opt.
nf, sati;
1503 static int osr_ctx_init = 0;
1505 if (!osr_ctx_init) {
1524 for (di = 0; di <
MAXOBS; di++) {
1526 for (dj = 0; dj < NFREQ + NEXOBS; dj++) {
1527 osr[di].
p[dj] = 0.0;
1528 osr[di].
c[dj] = 0.0;
1539 for (i = 0; i <
MAXSAT; i++) {
1541 for (j = 0; j < NFREQ; j++) {
1545 for (i = 0; i <
MAXSAT; i++) {
1551 for (i = 0; i < 3; i++) {
1552 rtk->
x[i] = opt->
ru[i];
1556 for (i = 0; i < 3; i++) {
1557 rtk->
x[i] = rtk->
sol.
rr[i];
1564 grid = &clas->
grid[ch];
1569 trace(NULL, 2,
"clas_ssr2osr: no valid grid\n");
1586 trace(NULL, 2,
"clas_ssr2osr: bank lookup failed\n");
1602 for (i = 0; i < n && i <
MAXOBS; i++) {
1606 if (rtk->
sol.
age > age_d) {
1616 k =
clas_osr_zdres(obs, n, rs, dts, var, svh, nav, rtk->
x, NULL, e, azel, rtk, 1, &
osr_ctx, grid, corr, rtk->
ssat,
1617 opt, &rtk->
sol, osr, ch);
1619 trace(NULL, 2,
"clas_ssr2osr: zdres failed\n");
1625 for (i = 0; i < n && i <
MAXOBS; i++) {
1626 double lam_v[NFREQ + NEXOBS];
1632 if (osr[i].sat <= 0) {
1645 for (j = 0; j < nf; j++) {
1646 if (osr[i].p[j] != 0.0 || osr[i].c[j] != 0.0) {
1655 sys_v =
satsys(sati, NULL);
1662 for (j = 0; j < nf; j++) {
1663 obs[ko].
code[j] = corr->
smode[sati - 1][j];
1668 for (j = 0; j < nf; j++) {
1670 if (osr[i].p[j] == 0.0 && osr[i].c[j] == 0.0) {
1677 obs[ko].
P[j] = osr[i].
p[j];
1687 (lam_v[f] > 0.0) ? osr[i].c[j] / lam_v[f] +
osr_ctx.pbias_ofst[j *
MAXSAT + sati - 1] : 0.0;
1688 obs[ko].
LLI[j] = (rtk->
ssat[sati - 1].
slip[j] & 1) ? 1 : 0;
1694 double el = azel[i * 2 + 1];
1695 double snr_db = (opt->
posopt[11] > 0.0) ? opt->
posopt[11] : 25.0 + 20.0 * sin(el);
1700 for (j = nf; j < NFREQ + NEXOBS; j++) {
1704 obs[ko].
code[j] = 0;
1713 for (i = 0; i < k; i++) {
1714 for (j = 0; j < nf; j++) {
1715 if (obs[i].L[j] == 0.0) {
1719 rtk->
ssat[obs[i].
sat - 1].
ph[obs[i].
rcv - 1][j] = obs[i].
L[j];
1722 for (i = 0; i < k; i++) {
1723 for (j = 0; j < nf; j++) {
1727 for (i = 0; i <
MAXSAT; i++) {
1728 for (j = 0; j < nf; j++) {
1729 if (rtk->
ssat[i].
fix[j] == 2) {
void antmodel(const pcv_t *pcv, const double *del, const double *azel, int opt, double *dant)
Compute receiver antenna offset by antenna phase center parameters.
MRTKLIB Antenna Module — Antenna phase center model and parameter I/O.
void sunmoonpos(gtime_t tutc, const double *erpv, double *rsun, double *rmoon, double *gmst)
Compute sun and moon position in ECEF.
MRTKLIB Astronomy Module — Sun and moon position computation.
double tropmapf(gtime_t time, const double pos[], const double azel[], double *mapfw)
MRTKLIB Atmosphere Module — Ionospheric and tropospheric models.
void clas_check_grid_status(clas_ctx_t *ctx, const clas_corr_t *corr, int ch)
Check and update grid status flags based on correction availability.
int clas_bank_get_close(const clas_ctx_t *ctx, gtime_t time, int network, int ch, clas_corr_t *corr)
Merge closest corrections from all banks into a clas_corr_t snapshot.
void clas_update_global(nav_t *nav, const clas_corr_t *corr, int ch)
Apply global corrections (orbit/clock/bias) to nav_t.ssr[].
void clas_update_local(nav_t *nav, const clas_corr_t *corr, int ch)
Apply local corrections (trop/STEC) to nav_t.
CLAS (QZSS L6D) CSSR decoder and grid correction type definitions.
#define CLAS_MAXAGESSR_BIAS
int clas_trop_grid_data(clas_corr_t *corr, const int *index, gtime_t time, int n, const double *weight, const double *Gmat, const double *Emat, double *zwd, double *ztd, int *tbrk)
Interpolate troposphere delay from grid points.
int clas_get_grid_index(clas_ctx_t *ctx, const double *pos, clas_grid_t *grid, int gridsel, gtime_t obstime)
Select surrounding grid points and compute interpolation weights.
int clas_stec_grid_data(clas_corr_t *corr, const int *index, gtime_t time, int sat, int n, const double *weight, const double *Gmat, const double *Emat, double *iono, double *rate, double *var, int *brk)
Interpolate STEC (ionosphere delay) from grid points.
int get_stTv(gtime_t t, const double lat, const double hs, const double hg, double *tdv, double *twv)
void chk_isb(int sysno, const prcopt_t *opt, const sta_t *sta, double y[5][2])
Get ISB correction values for a satellite system.
int isL2C(int code)
Check if observation code is L2C.
static double clas_osr_adjust_prc(gtime_t teph, int sat, const ssr_t *ssr, int sig, double prc, double *sis, int *flag, int ch, clas_osr_ctx_t *ctx)
Adjust pseudorange correction for SIS discontinuity.
int clas_osr_selfreqpair(int sat, const prcopt_t *opt, const obsd_t *obs)
Select frequency pair for multi-frequency processing.
static double clas_osr_adjust_cpc(gtime_t teph, int sat, const ssr_t *ssr, int sig, double cpc, double *sis, int *flag, int ch, clas_osr_ctx_t *ctx)
Adjust carrier-phase correction for SIS discontinuity.
int clas_osr_corrmeas(const obsd_t *obs, nav_t *nav, const double *pos, const double *azel, const prcopt_t *opt, clas_grid_t *grid, clas_corr_t *corr, ssat_t ssat, int *brk, clas_osrd_t *osr, int *pbreset, int ch, clas_osr_ctx_t *osr_ctx)
Assemble per-satellite ionosphere/bias/antenna corrections.
static int pcv_slot_has_data(const pcv_t *pcv, int slot)
static int claslib_pcv_slot(const pcv_t *pcv, int f)
int clas_osr_zdres(const obsd_t *obs, int n, const double *rs, const double *dts, const double *vare, const int *svh, nav_t *nav, double *x, double *y, double *e, double *azel, rtk_t *rtk, int osrlog, clas_osr_ctx_t *osr_ctx, clas_grid_t *grid, clas_corr_t *corr, ssat_t *ssat, prcopt_t *opt, sol_t *sol, clas_osrd_t *osr, int ch)
Compute zero-differenced phase/code residuals with CLAS corrections.
static const unsigned char obsfreqs[]
int clas_osr_satcorr_update(gtime_t time, gtime_t teph, int sat, const prcopt_t *opt, const nav_t *nav, int ch, clas_osr_ctx_t *ctx)
Update per-satellite SIS correction state for IODE adjustment.
static void sat_wavelengths(int sat, const obsd_t *obs, const nav_t *nav, double *lam)
Fill wavelength array for a satellite from observation codes.
static void clas_osr_adjust_r_dts(double *retr, double *retdts, gtime_t teph, int sat, nav_t *nav, const double *rr, gtime_t dts_time, int ch, clas_osr_ctx_t *ctx)
Recompute geometric range and clock on IODE change.
int clas_ssr2osr(rtk_t *rtk, obsd_t *obs, int n, nav_t *nav, clas_osrd_t *osr, int mode, clas_ctx_t *clas)
Convert compact SSR corrections to observation-space representations.
static int code_on_same_freq(int sys, uint8_t code1, uint8_t code2)
Check if two obs codes are on the same frequency band.
void clas_osr_ctx_init(clas_osr_ctx_t *ctx)
Initialize OSR conversion context (zero all persistent state).
static int count_nsig(const int smode[MAXCODE])
Count non-zero entries in a signal mode array (equivalent to nsig).
void clas_osr_compensatedisp(clas_corr_t *corr, const int *index, const obsd_t *obs, int sat, double iono, const double *pb, double *compL, int *pbreset, const prcopt_t *opt, ssat_t ssat, int ch, clas_osr_ctx_t *osr_ctx, const nav_t *nav)
Compensate time variation of signal bias and ionosphere delay.
static void ocean_tide_clasgrid(gtime_t tut, const clas_oload_t *oload, const int *index, int nn, const double *E, const double *Emat, const double *Gmat, const double *weight, double *dr)
Compute ocean tide loading displacement using CLAS grid interpolation.
#define IB_RTK(s, f, opt)
static double shapiro(const double *rsat, const double *rrcv)
Compute Shapiro (relativistic) time delay correction.
static void windupcorr(gtime_t time, const double *rs, const double *rr, double *phw)
Compute phase windup correction.
double sat2freq(int sat, uint8_t code, const nav_t *nav)
double clas_osr_prectrop(gtime_t time, const double *pos, const double *azel, double zwd, double ztd)
Precise troposphere model for CLAS (MOPS standard + mapping function).
MRTKLIB Constants — Physical, navigation, and system constants.
double geodist(const double *rs, const double *rr, double *e)
Compute geometric distance and receiver-to-satellite unit vector.
double satazel(const double *pos, const double *e, double *azel)
Compute satellite azimuth/elevation angle.
void xyz2enu(const double *pos, double *E)
Compute ECEF to local coordinate transformation matrix.
void ecef2pos(const double *r, double *pos)
Transform ECEF position to geodetic position.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
int satsys(int sat, int *prn)
void set_ssr_ch_idx(int ch)
Set SSR channel index for satpos_ssr() (multi-L6E).
int ephpos(gtime_t time, gtime_t teph, int sat, const nav_t *nav, int iode, double *rs, double *dts, double *var, int *svh)
Satellite position and clock by broadcast ephemeris.
int satpos(gtime_t time, gtime_t teph, int sat, int ephopt, const nav_t *nav, double *rs, double *dts, double *var, int *svh)
Compute satellite position, velocity and clock.
void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav, int ephopt, double *rs, double *dts, double *var, int *svh)
Compute satellite positions, velocities and clocks.
double eph2clk(gtime_t time, const eph_t *eph)
Compute satellite clock bias with broadcast ephemeris (GPS/GAL/QZS).
eph_t * seleph(gtime_t time, int sat, int iode, const nav_t *nav)
Select broadcast ephemeris by satellite and IODE.
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
double geoidh(const double *pos)
Get geoid height from geoid model.
MRTKLIB Geoid Module — Geoid height models.
double * mat(int n, int m)
Allocate memory for a double matrix.
double * zeros(int n, int m)
Allocate a new zero matrix.
void cross3(const double *a, const double *b, double *c)
Cross product of 3D vectors.
double norm(const double *a, int n)
Euclidean norm of vector.
int normv3(const double *a, double *b)
Normalize 3D vector.
void matmul(const char *tr, int n, int k, int m, double alpha, const double *A, const double *B, double beta, double *C)
Multiply matrix by matrix (C = alpha*A*B + beta*C).
double dot(const double *a, const double *b, int n)
Inner product of vectors.
MRTKLIB Matrix Module — Matrix/vector operations and estimation.
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
int code2freq_num(uint8_t code)
Extract frequency number from obs code.
int code2freq_idx(int sys, uint8_t code)
Convert system and obs code to frequency index (obsdef-based).
int testsnr(int base, int idx, double el, double snr, const snrmask_t *mask)
Test SNR mask.
MRTKLIB Observation Module — Observation data types and utility functions.
MRTKLIB Options Module — Processing and solution option types.
#define PMODE_SSR2OSR_FIXED
int geterp(const erp_t *erp, gtime_t time, double *erpv)
Get earth rotation parameter values at specified time.
double cpc[SSR_CH_NUM][MAXSAT *5]
PPP-RTK positioning engine declarations.
MRTKLIB RTK Positioning Module — relative and precise positioning.
MRTKLIB Solution Module — Solution data types and I/O functions.
void tidedisp(gtime_t tutc, const double *rr, int opt, const erp_t *erp, const double *odisp, double *dr)
Compute displacements by earth tides.
void tide_oload(gtime_t tut, const double *odisp, double *denu)
Compute displacement by ocean tide loading (11 constituents).
MRTKLIB Tides Module — Tidal displacement corrections.
gtime_t gpst2utc(gtime_t t)
Convert GPS time to UTC considering leap seconds.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
gtime_t timeadd(gtime_t t, double sec)
Add seconds to gtime_t.
char * time_str(gtime_t t, int n)
Get time string (not reentrant).
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
MRTKLIB Time Module — GNSS time types and conversion functions.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
int smode[MAXSAT][MAXCODE]
clas_satcorr_t satcorr[2][MAXSAT]
GPS/GAL/QZS/BDS/IRN broadcast ephemeris type.
GNSS time representation.
ssr_t ssr_ch[SSR_CH_NUM][MAXSAT]