#include #include "bncconst.h" #include "windup.h" #include "bncutils.h" #include "bnctides.h" using namespace std; using namespace BNC; // Constructor /////////////////////////////////////////////////////////////////////////// t_windUp::t_windUp() { for (unsigned ii = 0; ii <= t_prn::MAXPRN; ii++) { sumWind[ii] = 0.0; lastEtime[ii] = 0.0; } } // Phase Wind-Up Correction /////////////////////////////////////////////////////////////////////////// double t_windUp::value(const bncTime& etime, const ColumnVector& rRec, t_prn prn, const ColumnVector& rSat) { if (etime.mjddec() != lastEtime[prn.toInt()]) { // Unit Vector GPS Satellite --> Receiver // -------------------------------------- ColumnVector rho = rRec - rSat; rho /= rho.norm_Frobenius(); // GPS Satellite unit Vectors sz, sy, sx // ------------------------------------- ColumnVector sz = -rSat / rSat.norm_Frobenius(); ColumnVector xSun = Sun(etime.mjddec()); xSun /= xSun.norm_Frobenius(); ColumnVector sy = crossproduct(sz, xSun); ColumnVector sx = crossproduct(sy, sz); // Effective Dipole of the GPS Satellite Antenna // --------------------------------------------- ColumnVector dipSat = sx - rho * DotProduct(rho,sx) - crossproduct(rho, sy); // Receiver unit Vectors rx, ry // ---------------------------- ColumnVector rx(3); ColumnVector ry(3); double recEll[3]; xyz2ell(rRec.data(), recEll) ; double neu[3]; neu[0] = 1.0; neu[1] = 0.0; neu[2] = 0.0; neu2xyz(recEll, neu, rx.data()); neu[0] = 0.0; neu[1] = -1.0; neu[2] = 0.0; neu2xyz(recEll, neu, ry.data()); // Effective Dipole of the Receiver Antenna // ---------------------------------------- ColumnVector dipRec = rx - rho * DotProduct(rho,rx) + crossproduct(rho, ry); // Resulting Effect // ---------------- double alpha = DotProduct(dipSat,dipRec) / (dipSat.norm_Frobenius() * dipRec.norm_Frobenius()); if (alpha > 1.0) alpha = 1.0; if (alpha < -1.0) alpha = -1.0; double dphi = acos(alpha) / 2.0 / M_PI; // in cycles if ( DotProduct(rho, crossproduct(dipSat, dipRec)) < 0.0 ) { dphi = -dphi; } if (lastEtime[prn.toInt()] == 0.0) { sumWind[prn.toInt()] = dphi; } else { sumWind[prn.toInt()] = nint(sumWind[prn.toInt()] - dphi) + dphi; } lastEtime[prn.toInt()] = etime.mjddec(); } return sumWind[prn.toInt()]; }