Đây là đoạn code C++ trong thư viện GNSSTK, ứng dụng thuyết tương đối rộng và hẹp và dùng để tính sự chênh lệch thời gian giữa vệ tinh GPS và đồng hồ trên Trái Đất, gây ra bởi sự giãn nở thời gian do chênh lệch thế hấp dẫn và quỹ đạo chuyển động của vệ tinh. Giá trị dtr sau khi tính được sẽ được cộng vào thời gian đo bởi đồng hồ vệ tinh (do giãn nở thời gian nên đồng hồ vệ tinh chạy nhanh hơn đồng hồ Trái Đất), để đồng bộ hóa với thời gian của đồng hồ trên Trái Đất. Hiện tượng này giống với khi người ta nói rằng một phi hành gia trong quỹ đạo sẽ trẻ hơn so với người trên bề mặt Trái Đất. Giãn nở thời gian là hiện tượng hoàn toàn có thật và ảnh hưởng đến mọi quá trình vật lý (bao gồm việc người trong không gian sẽ trẻ hơn khoảng một phần vạn giây), chứ không chỉ là ảo giác (nếu không có hàm này để đồng bộ đồng hồ giữa hai nơi, sai số của GPS sau mỗi ngày sẽ tích tụ thêm khoảng 10km, khiến nó không còn ý nghĩa gì để chúng ta sử dụng hàng ngày nữa).

// gnsstk/core/1tb/GNSSEph/BrcKeplerOrbit.cpp
double BrcKeplerOrbit::svRelativity(const CommonTime& t) const {
    GPSEllipsoid ell;
    double twoPI  = 2.0e0 * PI;
    double sqrtgm = SQRT(ell.gm()); // √(GM)
    double elapte = t - getOrbitEpoch(); // thời gian trôi qua kể từ thời điểm mốc
    double amm    = (sqrtgm / (A * Ahalf)) + dn;
    double meana, F, G, delea;
    
    meana = M0 + elapte * amm; // dị thường trung bình
    meana = fmod(meana, twoPI);
    double ea = meana + ecc * ::sin(meana); // dị thường tâm sai
    
    int loop_cnt = 1;
    // Giải xấp xỉ giá trị E bằng Newton-Raphson
    do {
        F     = meana - (ea - ecc * ::sin(ea));
	G     = 1.0 - ecc * ::cos(ea);
	delea = F / G;
	ea    = ea + delea;
	loop_cnt++;
    } while ((ABS(delea) > 1.0e-11) && (loop_cnt <= 20));
  
    double dtr = REL_CONST * ecc * Ahalf * ::sin(ea);
    // REL_CONST là hằng số cho trước, tính bảng(-2√(GM)/c²)
    // = -4.443-10^(-10) s/√m
    return dtr; // độ chênh lệch gây ra bởi sự giãn nở thời gian
}

Categorized in: