...
This commit is contained in:
@@ -51,10 +51,10 @@ static constexpr double mcc_UT1_to_sideral_ratio = 1.002737909350795; // UT1/si
|
||||
|
||||
|
||||
// modified Julian date (based on ERFA eraCal2jd)
|
||||
template <traits::mcc_real_scalar_or_real_range_c ResT>
|
||||
static int mcc_julday(const std::chrono::system_clock::time_point& start_time,
|
||||
template <traits::mcc_real_scalar_or_real_range_c ResT, traits::mcc_time_duration_c DT = std::chrono::milliseconds>
|
||||
static int mcc_julday(traits::mcc_systime_c auto const& start_time,
|
||||
ResT& mjd,
|
||||
const std::chrono::system_clock::duration& step = std::chrono::milliseconds(100))
|
||||
const DT& step = std::chrono::milliseconds(100))
|
||||
{
|
||||
size_t mjd_size = 0;
|
||||
if constexpr (std::ranges::range<ResT>) {
|
||||
@@ -124,7 +124,7 @@ static int mcc_julday(const std::chrono::system_clock::time_point& start_time,
|
||||
if constexpr (std::ranges::random_access_range<ResT>) {
|
||||
ptr += reg_size;
|
||||
} else {
|
||||
for (int k = 0; k < reg_size; ++k) {
|
||||
for (size_t k = 0; k < reg_size; ++k) {
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
@@ -156,7 +156,7 @@ double mcc_time_to_alt_limit(traits::mcc_real_or_char_range auto const& alt_limi
|
||||
traits::mcc_real_or_char_range auto const& DEC,
|
||||
traits::mcc_real_or_char_range auto const& LAT,
|
||||
traits::mcc_real_or_char_range auto const& LON,
|
||||
const std::chrono::system_clock::time_point& now,
|
||||
traits::mcc_systime_c auto const& now,
|
||||
traits::mcc_time_duration_c auto const& dut1, // UT1-UTC
|
||||
traits::mcc_time_duration_c auto const& tt_tai, // TT-TAI
|
||||
// TAI-UTC (leap seconds)
|
||||
@@ -166,51 +166,58 @@ double mcc_time_to_alt_limit(traits::mcc_real_or_char_range auto const& alt_limi
|
||||
// HA = LST - RA
|
||||
// cos(HA) = cos(LST)*cos(RA) + sin(LST)*sin(RA)
|
||||
|
||||
using AT = std::decay_t<decltype(alt_limit)>;
|
||||
using RT = std::decay_t<decltype(RA)>;
|
||||
using DT = std::decay_t<decltype(DEC)>;
|
||||
using LT = std::decay_t<decltype(LAT)>;
|
||||
using LGT = std::decay_t<decltype(LON)>;
|
||||
// using AT = std::decay_t<decltype(alt_limit)>;
|
||||
// using RT = std::decay_t<decltype(RA)>;
|
||||
// using DT = std::decay_t<decltype(DEC)>;
|
||||
// using LT = std::decay_t<decltype(LAT)>;
|
||||
// using LGT = std::decay_t<decltype(LON)>;
|
||||
|
||||
double ra, dec, lat, lon, alt;
|
||||
|
||||
if constexpr (std::floating_point<AT>) {
|
||||
alt = alt_limit * utils::deg2radCoeff;
|
||||
} else {
|
||||
alt = utils::parsAngleString(alt_limit);
|
||||
alt *= utils::deg2radCoeff;
|
||||
auto to_rads = [](const auto& v, bool hms = false) {
|
||||
// using v_t = std::remove_cvref<decltype(v)>;
|
||||
using v_t = std::remove_cvref_t<decltype(v)>;
|
||||
double res;
|
||||
if constexpr (!std::floating_point<v_t>) {
|
||||
res = utils::parsAngleString(v, hms).value_or(std::numeric_limits<double>::quiet_NaN());
|
||||
} else {
|
||||
res = v;
|
||||
}
|
||||
|
||||
if (!std::isfinite(res)) {
|
||||
return res;
|
||||
}
|
||||
|
||||
return res * utils::deg2radCoeff;
|
||||
};
|
||||
|
||||
alt = to_rads(alt_limit);
|
||||
if (!std::isfinite(alt)) {
|
||||
return alt;
|
||||
}
|
||||
|
||||
if (alt < 0.0) {
|
||||
return std::numeric_limits<double>::quiet_NaN();
|
||||
}
|
||||
|
||||
if constexpr (std::floating_point<RT>) {
|
||||
ra = RA * utils::deg2radCoeff;
|
||||
} else {
|
||||
ra = utils::parsAngleString(RA, true);
|
||||
ra *= utils::deg2radCoeff;
|
||||
ra = to_rads(RA, true);
|
||||
if (!std::isfinite(ra)) {
|
||||
return ra;
|
||||
}
|
||||
|
||||
if constexpr (std::floating_point<DT>) {
|
||||
dec = DEC * utils::deg2radCoeff;
|
||||
} else {
|
||||
dec = utils::parsAngleString(DEC);
|
||||
dec *= utils::deg2radCoeff;
|
||||
dec = to_rads(DEC);
|
||||
if (!std::isfinite(dec)) {
|
||||
return dec;
|
||||
}
|
||||
|
||||
if constexpr (std::floating_point<LT>) {
|
||||
lat = LAT * utils::deg2radCoeff;
|
||||
} else {
|
||||
lat = utils::parsAngleString(LAT);
|
||||
lat *= utils::deg2radCoeff;
|
||||
lat = to_rads(LAT);
|
||||
if (!std::isfinite(lat)) {
|
||||
return lat;
|
||||
}
|
||||
|
||||
if constexpr (std::floating_point<LGT>) {
|
||||
lon = LON * utils::deg2radCoeff;
|
||||
} else {
|
||||
lon = utils::parsAngleString(LON);
|
||||
lon *= utils::deg2radCoeff;
|
||||
lon = to_rads(LON);
|
||||
if (!std::isfinite(lon)) {
|
||||
return lon;
|
||||
}
|
||||
|
||||
if (lat >= 0.0) { // north hemisphere
|
||||
@@ -243,13 +250,18 @@ double mcc_time_to_alt_limit(traits::mcc_real_or_char_range auto const& alt_limi
|
||||
return std::numeric_limits<double>::quiet_NaN();
|
||||
}
|
||||
|
||||
double lst_now = erfa::eraGst06a(ERFA_DJM0, ut1_mjd, ERFA_DJM0, tt_mjd) + lon;
|
||||
double lst_now = erfa::eraGst06a(ERFA_DJM0, ut1_mjd, ERFA_DJM0, tt_mjd);
|
||||
lst_now += lon;
|
||||
|
||||
result = lst - lst_now;
|
||||
if (result < 0.0) { // the next sideral day
|
||||
result += 2.0 * std::numbers::pi;
|
||||
}
|
||||
|
||||
if (result > std::numbers::pi) { // object is already below the limit
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
result *= mcc_UT1_to_sideral_ratio; // to UT1 scale
|
||||
|
||||
return result;
|
||||
@@ -498,7 +510,6 @@ public:
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto el_prev = _db.front();
|
||||
for (auto const& el : _db) {
|
||||
if (ymd <= el.ymd) {
|
||||
return real_secs_t{el.dut1};
|
||||
|
||||
Reference in New Issue
Block a user