This commit is contained in:
Timur A. Fatkhullin 2026-01-15 19:11:16 +03:00
parent 09cf5f9c19
commit 01d5657b1b
8 changed files with 867 additions and 637 deletions

View File

@ -101,5 +101,10 @@ if (WITH_TESTS)
add_executable(${NETMSG_TESTS_APP} tests/netmsg_test.cpp) add_executable(${NETMSG_TESTS_APP} tests/netmsg_test.cpp)
target_link_libraries(${NETMSG_TESTS_APP} mcc) target_link_libraries(${NETMSG_TESTS_APP} mcc)
set(MCCCOORD_TEST_APP mcc_coord_test)
add_executable(${MCCCOORD_TEST_APP} tests/mcc_coord_test.cpp)
target_link_libraries(${MCCCOORD_TEST_APP} mcc ERFA_LIB)
enable_testing() enable_testing()
endif() endif()

View File

@ -273,10 +273,8 @@ public:
{ {
double ra_obs, dec_obs, az, zd, ha; double ra_obs, dec_obs, az, zd, ha;
MccCelestialCoordEpoch ep; auto err =
ep.fromMJD((radec_obs->MJD())); icrsToObs(radec_icrs.x(), radec_icrs.y(), radec_icrs.epoch(), &ra_obs, &dec_obs, &ha, &az, &zd, obj_params);
auto err = icrsToObs(radec_icrs.x(), radec_icrs.y(), ep, &ra_obs, &dec_obs, &ha, &az, &zd, obj_params);
if (!err) { if (!err) {
if (radec_obs) { if (radec_obs) {
@ -285,7 +283,7 @@ public:
} }
if (azzd) { if (azzd) {
azzd->setMJD(radec_obs->MJD()); azzd->setEpoch(radec_obs->epoch());
azzd->setX(az); azzd->setX(az);
azzd->setY(zd); azzd->setY(zd);
} }
@ -323,10 +321,8 @@ public:
{ {
double ra_app, dec_app, az, zd, ha; double ra_app, dec_app, az, zd, ha;
MccCelestialCoordEpoch ep; auto err =
ep.fromMJD((radec_app->MJD())); icrsToApp(radec_icrs.x(), radec_icrs.y(), radec_icrs.epoch(), &ra_app, &dec_app, &ha, &az, &zd, obj_params);
auto err = icrsToApp(radec_icrs.x(), radec_icrs.y(), ep, &ra_app, &dec_app, &ha, &az, &zd, obj_params);
if (!err) { if (!err) {
if (radec_app) { if (radec_app) {
@ -335,7 +331,7 @@ public:
} }
if (azzd) { if (azzd) {
azzd->setMJD(radec_app->MJD()); azzd->setEpoch(radec_app->epoch());
azzd->setX(az); azzd->setX(az);
azzd->setY(zd); azzd->setY(zd);
} }
@ -364,10 +360,7 @@ public:
{ {
double ra, dec; double ra, dec;
MccCelestialCoordEpoch ep; auto err = obsToICRS(xy_obs.pair_kind, xy_obs.epoch(), xy_obs.x(), xy_obs.y(), &ra, &dec);
ep.fromMJD((xy_obs->MJD()));
auto err = obsToICRS(xy_obs.pair_kind, ep, xy_obs.x(), xy_obs.y(), &ra, &dec);
if (err) { if (err) {
return err; return err;
} }
@ -392,6 +385,22 @@ public:
} }
error_t appToICRS(mcc_coord_pair_c auto const& xy_app, MccSkyRADEC_ICRS* radec_icrs)
{
double ra, dec;
auto err = appToICRS(xy_app.pair_kind, xy_app.epoch(), xy_app.x(), xy_app.y(), &ra, &dec);
if (!err) {
if (radec_icrs) {
radec_icrs->setX(ra);
radec_icrs->setY(dec);
}
}
return err;
}
error_t equationOrigins(const mcc_julday_c auto& mjd, mcc_angle_c auto* eo) error_t equationOrigins(const mcc_julday_c auto& mjd, mcc_angle_c auto* eo)
{ {
if (eo == nullptr) { if (eo == nullptr) {
@ -437,10 +446,35 @@ public:
} }
// Zobs must be observed zenithal distance (Zapp = Zobs + dZ -- corrected (in vacuo) zenithal distance) // Zobs must be observed zenithal distance (Zapp = Zobs + dZ -- corrected (in vacuo) zenithal distance)
template <typename ZAPP_T = std::nullptr_t>
error_t refractionCorrection(mcc_angle_c auto Zobs, mcc_angle_c auto* dZ, ZAPP_T Zapp = nullptr)
requires(std::is_null_pointer_v<ZAPP_T> ||
(std::is_pointer_v<ZAPP_T> && mcc_angle_c<std::remove_pointer_t<ZAPP_T>>))
{
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
if (dZ == nullptr) {
return MccCCTE_ERFAErrorCode::ERROR_NULLPTR;
}
refract_model_t rmodel;
ret = refractionModel(&rmodel);
if (!ret) {
ret = refractionCorrection(rmodel, Zobs, dZ, Zapp);
}
return ret;
}
// Zobs must be observed zenithal distance (Zapp = Zobs + dZ -- corrected (in vacuo) zenithal distance)
template <typename ZAPP_T = std::nullptr_t>
error_t refractionCorrection(const refract_model_t& rmodel, error_t refractionCorrection(const refract_model_t& rmodel,
mcc_angle_c auto Zobs, mcc_angle_c auto Zobs,
mcc_angle_c auto* dZ, mcc_angle_c auto* dZ,
mcc_angle_c auto* Zapp = nullptr) ZAPP_T Zapp = nullptr)
requires(std::is_null_pointer_v<ZAPP_T> ||
(std::is_pointer_v<ZAPP_T> && mcc_angle_c<std::remove_pointer_t<ZAPP_T>>))
{ {
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK; error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
@ -456,19 +490,47 @@ public:
*dZ = rmodel.refa * tanZ + rmodel.refb * tanZ * tanZ * tanZ; *dZ = rmodel.refa * tanZ + rmodel.refb * tanZ * tanZ * tanZ;
} }
if (Zapp != nullptr) { if constexpr (!std::is_null_pointer_v<ZAPP_T>) {
*Zapp = Zobs + *dZ; *Zapp = Zobs + *dZ;
} }
return ret; return ret;
} }
// Zapp must be topocentric (in vacuo) zenithal distance (Zobs = Zapp - dZ -- observed, i.e. affected by refraction, // Zapp must be topocentric (in vacuo) zenithal distance (Zobs = Zapp - dZ -- observed, i.e. affected by refraction,
// zenithal distance) // zenithal distance)
template <typename ZOBS_T = std::nullptr_t>
error_t refractionReverseCorrection(mcc_angle_c auto Zapp, mcc_angle_c auto* dZ, ZOBS_T Zobs = nullptr)
requires(std::is_null_pointer_v<ZOBS_T> ||
(std::is_pointer_v<ZOBS_T> && mcc_angle_c<std::remove_pointer_t<ZOBS_T>>))
{
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
if (dZ == nullptr) {
return MccCCTE_ERFAErrorCode::ERROR_NULLPTR;
}
refract_model_t rmodel;
ret = refractionModel(&rmodel);
if (!ret) {
ret = refractionReverseCorrection(rmodel, Zapp, dZ, Zobs);
}
return ret;
}
// Zapp must be topocentric (in vacuo) zenithal distance (Zobs = Zapp - dZ -- observed, i.e. affected by refraction,
// zenithal distance)
template <typename ZOBS_T = std::nullptr_t>
error_t refractionReverseCorrection(const refract_model_t& rmodel, error_t refractionReverseCorrection(const refract_model_t& rmodel,
mcc_angle_c auto Zapp, mcc_angle_c auto Zapp,
mcc_angle_c auto* dZ, mcc_angle_c auto* dZ,
mcc_angle_c auto* Zobs = nullptr) ZOBS_T Zobs = nullptr)
requires(std::is_null_pointer_v<ZOBS_T> ||
(std::is_pointer_v<ZOBS_T> && mcc_angle_c<std::remove_pointer_t<ZOBS_T>>))
{ {
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK; error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
@ -489,7 +551,7 @@ public:
(1.0 + rmodel.refa + tanZ2 * (rmodel.refa + b3) + b3 * tanZ2 * tanZ2); (1.0 + rmodel.refa + tanZ2 * (rmodel.refa + b3) + b3 * tanZ2 * tanZ2);
} }
if (Zobs != nullptr) { if constexpr (!std::is_null_pointer_v<ZOBS_T>) {
*Zobs = Zapp - *dZ; *Zobs = Zapp - *dZ;
} }
@ -600,7 +662,8 @@ protected:
// NOTE: according to definition of astronomical azimuth it is counted from the South through the West, but // NOTE: according to definition of astronomical azimuth it is counted from the South through the West, but
// in the ERFA the azimuth is counted from the North through the East!!! // in the ERFA the azimuth is counted from the North through the East!!!
// //
*az = MccAngle(a + std::numbers::pi).normalize<MccAngle::NORM_KIND_0_360>(); *az = MccAngle(a - std::numbers::pi).normalize<MccAngle::NORM_KIND_0_360>();
// *az = MccAngle(a + std::numbers::pi).normalize<MccAngle::NORM_KIND_0_360>();
} }
if (zd) { if (zd) {

View File

@ -15,10 +15,10 @@ static std::string MCC_DEFAULT_LEAP_SECONDS_FILE = R"--(
# Value of TAI-UTC in second valid beetween the initial value until # Value of TAI-UTC in second valid beetween the initial value until
# the epoch given on the next line. The last line reads that NO # the epoch given on the next line. The last line reads that NO
# leap second was introduced since the corresponding date # leap second was introduced since the corresponding date
# Updated through IERS Bulletin 70 issued in July 2025 # Updated through IERS Bulletin 71 issued in January 2026
# #
# #
# File expires on 28 June 2026 # File expires on 28 December 2026
# #
# #
# MJD Date TAI-UTC (s) # MJD Date TAI-UTC (s)
@ -67,7 +67,7 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
* * * *
* Rapid Service/Prediction of Earth Orientation * * Rapid Service/Prediction of Earth Orientation *
********************************************************************** **********************************************************************
27 November 2025 Vol. XXXVIII No. 048 8 January 2026 Vol. XXXIX No. 002
______________________________________________________________________ ______________________________________________________________________
GENERAL INFORMATION: GENERAL INFORMATION:
MJD = Julian Date - 2 400 000.5 days MJD = Julian Date - 2 400 000.5 days
@ -83,7 +83,7 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
* ANNOUNCEMENTS: * * ANNOUNCEMENTS: *
* * * *
* There will NOT be a leap second introduced in UTC * * There will NOT be a leap second introduced in UTC *
* at the end of December 2025. * * at the end of June 2026. *
* * * *
* The primary source for IERS Rapid Service/Prediction Center (RS/PC) * * The primary source for IERS Rapid Service/Prediction Center (RS/PC) *
* data products is the official IERS RS/PC website: * * data products is the official IERS RS/PC website: *
@ -116,13 +116,47 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
IERS Rapid Service IERS Rapid Service
MJD x error y error UT1-UTC error MJD x error y error UT1-UTC error
" " " " s s " " " " s s
25 11 21 61000 0.14376 .00009 0.31566 .00009 0.083583 0.000014 26 1 2 61042 0.10962 .00009 0.33249 .00009 0.074152 0.000020
25 11 22 61001 0.14182 .00009 0.31496 .00009 0.083767 0.000013 26 1 3 61043 0.10827 .00009 0.33355 .00009 0.074367 0.000021
25 11 23 61002 0.13974 .00009 0.31421 .00009 0.083987 0.000016 26 1 4 61044 0.10690 .00009 0.33455 .00009 0.074487 0.000020
25 11 24 61003 0.13813 .00009 0.31362 .00009 0.084205 0.000015 26 1 5 61045 0.10554 .00009 0.33551 .00009 0.074361 0.000015
25 11 25 61004 0.13714 .00009 0.31374 .00009 0.084304 0.000015 26 1 6 61046 0.10404 .00009 0.33628 .00009 0.073991 0.000015
25 11 26 61005 0.13608 .00009 0.31443 .00009 0.084178 0.000013 26 1 7 61047 0.10253 .00009 0.33692 .00009 0.073470 0.000012
25 11 27 61006 0.13507 .00009 0.31503 .00009 0.083748 0.000014 26 1 8 61048 0.10121 .00009 0.33746 .00009 0.072861 0.000008
IERS Final Values
MJD x y UT1-UTC
" " s
25 11 2 60981 0.1750 0.3194 0.09220
25 11 3 60982 0.1735 0.3187 0.09112
25 11 4 60983 0.1718 0.3187 0.09005
25 11 5 60984 0.1699 0.3183 0.08916
25 11 6 60985 0.1679 0.3182 0.08854
25 11 7 60986 0.1659 0.3179 0.08822
25 11 8 60987 0.1640 0.3171 0.08814
25 11 9 60988 0.1630 0.3163 0.08819
25 11 10 60989 0.1625 0.3158 0.08820
25 11 11 60990 0.1615 0.3153 0.08801
25 11 12 60991 0.1602 0.3151 0.08763
25 11 13 60992 0.1583 0.3154 0.08711
25 11 14 60993 0.1564 0.3157 0.08644
25 11 15 60994 0.1545 0.3160 0.08566
25 11 16 60995 0.1530 0.3163 0.08494
25 11 17 60996 0.1511 0.3167 0.08433
25 11 18 60997 0.1491 0.3165 0.08390
25 11 19 60998 0.1474 0.3163 0.08366
25 11 20 60999 0.1456 0.3161 0.08357
25 11 21 61000 0.1437 0.3157 0.08363
25 11 22 61001 0.1419 0.3149 0.08381
25 11 23 61002 0.1398 0.3143 0.08403
25 11 24 61003 0.1380 0.3136 0.08426
25 11 25 61004 0.1373 0.3137 0.08431
25 11 26 61005 0.1360 0.3146 0.08417
25 11 27 61006 0.1351 0.3149 0.08377
25 11 28 61007 0.1343 0.3153 0.08305
25 11 29 61008 0.1334 0.3153 0.08209
25 11 30 61009 0.1325 0.3157 0.08097
25 12 1 61010 0.1316 0.3160 0.07984
_______________________________________________________________________ _______________________________________________________________________
@ -130,417 +164,480 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
The following formulas will not reproduce the predictions given below, The following formulas will not reproduce the predictions given below,
but may be used to extend the predictions beyond the end of this table. but may be used to extend the predictions beyond the end of this table.
x = 0.1394 + 0.0553 cos A - 0.1352 sin A - 0.0554 cos C + 0.0383 sin C x = 0.1611 - 0.0626 cos A - 0.1221 sin A + 0.0025 cos C + 0.0585 sin C
y = 0.3901 - 0.1172 cos A - 0.0610 sin A + 0.0383 cos C + 0.0554 sin C y = 0.3836 - 0.1091 cos A + 0.0516 sin A + 0.0585 cos C - 0.0025 sin C
UT1-UTC = 0.0660 + 0.00007 (MJD - 61014) - (UT2-UT1) UT1-UTC = 0.0617 + 0.00005 (MJD - 61056) - (UT2-UT1)
where A = 2*pi*(MJD-61006)/365.25 and C = 2*pi*(MJD-61006)/435. where A = 2*pi*(MJD-61048)/365.25 and C = 2*pi*(MJD-61048)/435.
TAI-UTC(MJD 61007) = 37.0 TAI-UTC(MJD 61049) = 37.0
The accuracy may be estimated from the expressions: The accuracy may be estimated from the expressions:
S x,y = 0.00068 (MJD-61006)**0.80 S t = 0.00025 (MJD-61006)**0.75 S x,y = 0.00068 (MJD-61048)**0.80 S t = 0.00025 (MJD-61048)**0.75
Estimated accuracies are: Predictions 10 d 20 d 30 d 40 d Estimated accuracies are: Predictions 10 d 20 d 30 d 40 d
Polar coord's 0.004 0.007 0.010 0.013 Polar coord's 0.004 0.007 0.010 0.013
UT1-UTC 0.0014 0.0024 0.0032 0.0040 UT1-UTC 0.0014 0.0024 0.0032 0.0040
MJD x(arcsec) y(arcsec) UT1-UTC(sec) MJD x(arcsec) y(arcsec) UT1-UTC(sec)
2025 11 28 61007 0.1339 0.3157 0.08302 2026 1 9 61049 0.1001 0.3380 0.07228
2025 11 29 61008 0.1328 0.3161 0.08204 2026 1 10 61050 0.0993 0.3385 0.07180
2025 11 30 61009 0.1317 0.3165 0.08094 2026 1 11 61051 0.0985 0.3390 0.07149
2025 12 1 61010 0.1304 0.3167 0.07981 2026 1 12 61052 0.0978 0.3396 0.07136
2025 12 2 61011 0.1292 0.3169 0.07882 2026 1 13 61053 0.0971 0.3403 0.07142
2025 12 3 61012 0.1279 0.3172 0.07809 2026 1 14 61054 0.0964 0.3411 0.07168
2025 12 4 61013 0.1267 0.3174 0.07768 2026 1 15 61055 0.0957 0.3418 0.07209
2025 12 5 61014 0.1256 0.3177 0.07756 2026 1 16 61056 0.0949 0.3426 0.07260
2025 12 6 61015 0.1245 0.3180 0.07761 2026 1 17 61057 0.0942 0.3434 0.07313
2025 12 7 61016 0.1234 0.3183 0.07767 2026 1 18 61058 0.0935 0.3442 0.07360
2025 12 8 61017 0.1223 0.3186 0.07758 2026 1 19 61059 0.0928 0.3450 0.07391
2025 12 9 61018 0.1212 0.3189 0.07724 2026 1 20 61060 0.0921 0.3458 0.07400
2025 12 10 61019 0.1202 0.3192 0.07669 2026 1 21 61061 0.0915 0.3466 0.07380
2025 12 11 61020 0.1191 0.3196 0.07603 2026 1 22 61062 0.0909 0.3474 0.07332
2025 12 12 61021 0.1180 0.3200 0.07533 2026 1 23 61063 0.0903 0.3482 0.07264
2025 12 13 61022 0.1169 0.3203 0.07467 2026 1 24 61064 0.0897 0.3490 0.07185
2025 12 14 61023 0.1159 0.3207 0.07413 2026 1 25 61065 0.0892 0.3499 0.07110
2025 12 15 61024 0.1148 0.3211 0.07375 2026 1 26 61066 0.0886 0.3507 0.07051
2025 12 16 61025 0.1138 0.3216 0.07354 2026 1 27 61067 0.0881 0.3516 0.07015
2025 12 17 61026 0.1127 0.3220 0.07354 2026 1 28 61068 0.0876 0.3524 0.07004
2025 12 18 61027 0.1117 0.3224 0.07372 2026 1 29 61069 0.0872 0.3533 0.07016
2025 12 19 61028 0.1106 0.3229 0.07406 2026 1 30 61070 0.0867 0.3542 0.07040
2025 12 20 61029 0.1096 0.3234 0.07450 2026 1 31 61071 0.0863 0.3551 0.07062
2025 12 21 61030 0.1086 0.3239 0.07496 2026 2 1 61072 0.0858 0.3560 0.07069
2025 12 22 61031 0.1076 0.3244 0.07535 2026 2 2 61073 0.0855 0.3569 0.07052
2025 12 23 61032 0.1066 0.3249 0.07560 2026 2 3 61074 0.0851 0.3578 0.07011
2025 12 24 61033 0.1056 0.3254 0.07565 2026 2 4 61075 0.0847 0.3587 0.06952
2025 12 25 61034 0.1046 0.3260 0.07547 2026 2 5 61076 0.0844 0.3596 0.06884
2025 12 26 61035 0.1037 0.3266 0.07507 2026 2 6 61077 0.0841 0.3605 0.06818
2025 12 27 61036 0.1027 0.3272 0.07451 2026 2 7 61078 0.0838 0.3615 0.06763
2025 12 28 61037 0.1017 0.3278 0.07389 2026 2 8 61079 0.0835 0.3624 0.06723
2025 12 29 61038 0.1008 0.3284 0.07334 2026 2 9 61080 0.0832 0.3634 0.06700
2025 12 30 61039 0.0998 0.3290 0.07299 2026 2 10 61081 0.0830 0.3643 0.06696
2025 12 31 61040 0.0989 0.3297 0.07292 2026 2 11 61082 0.0828 0.3653 0.06706
2026 1 1 61041 0.0980 0.3304 0.07315 2026 2 12 61083 0.0826 0.3662 0.06727
2026 1 2 61042 0.0971 0.3311 0.07361 2026 2 13 61084 0.0824 0.3672 0.06753
2026 1 3 61043 0.0962 0.3318 0.07417 2026 2 14 61085 0.0822 0.3682 0.06774
2026 1 4 61044 0.0953 0.3325 0.07467 2026 2 15 61086 0.0821 0.3692 0.06784
2026 1 5 61045 0.0945 0.3332 0.07499 2026 2 16 61087 0.0820 0.3702 0.06774
2026 1 6 61046 0.0936 0.3340 0.07508 2026 2 17 61088 0.0819 0.3711 0.06738
2026 1 7 61047 0.0928 0.3348 0.07496 2026 2 18 61089 0.0818 0.3721 0.06675
2026 1 8 61048 0.0920 0.3355 0.07474 2026 2 19 61090 0.0818 0.3731 0.06590
2026 1 9 61049 0.0912 0.3363 0.07449 2026 2 20 61091 0.0817 0.3741 0.06493
2026 1 10 61050 0.0904 0.3372 0.07431 2026 2 21 61092 0.0817 0.3751 0.06395
2026 1 11 61051 0.0896 0.3380 0.07426 2026 2 22 61093 0.0817 0.3761 0.06311
2026 1 12 61052 0.0888 0.3388 0.07438 2026 2 23 61094 0.0818 0.3771 0.06250
2026 1 13 61053 0.0881 0.3397 0.07469 2026 2 24 61095 0.0818 0.3781 0.06215
2026 1 14 61054 0.0873 0.3405 0.07517 2026 2 25 61096 0.0819 0.3792 0.06203
2026 1 15 61055 0.0866 0.3414 0.07580 2026 2 26 61097 0.0820 0.3802 0.06204
2026 1 16 61056 0.0859 0.3423 0.07652 2026 2 27 61098 0.0821 0.3812 0.06206
2026 1 17 61057 0.0852 0.3432 0.07725 2026 2 28 61099 0.0823 0.3822 0.06196
2026 1 18 61058 0.0846 0.3442 0.07792 2026 3 1 61100 0.0824 0.3832 0.06165
2026 1 19 61059 0.0839 0.3451 0.07845 2026 3 2 61101 0.0826 0.3842 0.06111
2026 1 20 61060 0.0833 0.3461 0.07876 2026 3 3 61102 0.0828 0.3852 0.06037
2026 1 21 61061 0.0827 0.3470 0.07883 2026 3 4 61103 0.0831 0.3862 0.05951
2026 1 22 61062 0.0821 0.3480 0.07865 2026 3 5 61104 0.0833 0.3872 0.05864
2026 1 23 61063 0.0815 0.3490 0.07828 2026 3 6 61105 0.0836 0.3882 0.05787
2026 1 24 61064 0.0810 0.3500 0.07782 2026 3 7 61106 0.0839 0.3893 0.05726
2026 1 25 61065 0.0804 0.3510 0.07738 2026 3 8 61107 0.0842 0.3903 0.05686
2026 1 26 61066 0.0799 0.3520 0.07709 2026 3 9 61108 0.0846 0.3913 0.05667
2026 1 27 61067 0.0794 0.3530 0.07703 2026 3 10 61109 0.0849 0.3922 0.05667
2026 1 28 61068 0.0789 0.3541 0.07721 2026 3 11 61110 0.0853 0.3932 0.05681
2026 1 29 61069 0.0785 0.3551 0.07760 2026 3 12 61111 0.0857 0.3942 0.05703
2026 1 30 61070 0.0780 0.3562 0.07808 2026 3 13 61112 0.0861 0.3952 0.05725
2026 1 31 61071 0.0776 0.3572 0.07851 2026 3 14 61113 0.0866 0.3962 0.05737
2026 2 1 61072 0.0772 0.3583 0.07878 2026 3 15 61114 0.0870 0.3972 0.05732
2026 2 2 61073 0.0768 0.3594 0.07880 2026 3 16 61115 0.0875 0.3981 0.05703
2026 2 3 61074 0.0765 0.3605 0.07857 2026 3 17 61116 0.0880 0.3991 0.05647
2026 2 4 61075 0.0761 0.3616 0.07815 2026 3 18 61117 0.0886 0.4000 0.05564
2026 2 5 61076 0.0758 0.3627 0.07764 2026 3 19 61118 0.0891 0.4010 0.05462
2026 2 6 61077 0.0755 0.3638 0.07715 2026 3 20 61119 0.0897 0.4019 0.05355
2026 2 7 61078 0.0753 0.3649 0.07676 2026 3 21 61120 0.0903 0.4029 0.05256
2026 2 8 61079 0.0750 0.3660 0.07652 2026 3 22 61121 0.0909 0.4038 0.05180
2026 2 9 61080 0.0748 0.3672 0.07646 2026 3 23 61122 0.0916 0.4047 0.05132
2026 2 10 61081 0.0746 0.3683 0.07657 2026 3 24 61123 0.0922 0.4056 0.05111
2026 2 11 61082 0.0744 0.3695 0.07683 2026 3 25 61124 0.0929 0.4065 0.05107
2026 2 12 61083 0.0742 0.3706 0.07719 2026 3 26 61125 0.0936 0.4074 0.05108
2026 2 13 61084 0.0741 0.3718 0.07758 2026 3 27 61126 0.0943 0.4083 0.05100
2026 2 14 61085 0.0740 0.3729 0.07792 2026 3 28 61127 0.0950 0.4092 0.05075
2026 2 15 61086 0.0739 0.3741 0.07814 2026 3 29 61128 0.0958 0.4101 0.05028
2026 2 16 61087 0.0738 0.3752 0.07814 2026 3 30 61129 0.0966 0.4109 0.04959
2026 2 17 61088 0.0738 0.3764 0.07788 2026 3 31 61130 0.0974 0.4118 0.04876
2026 2 18 61089 0.0738 0.3776 0.07735 2026 4 1 61131 0.0982 0.4126 0.04787
2026 2 19 61090 0.0737 0.3788 0.07659 2026 4 2 61132 0.0990 0.4134 0.04702
2026 2 20 61091 0.0738 0.3799 0.07570 2026 4 3 61133 0.0998 0.4142 0.04629
2026 2 21 61092 0.0738 0.3811 0.07482 2026 4 4 61134 0.1007 0.4150 0.04574
2026 2 22 61093 0.0739 0.3823 0.07406 2026 4 5 61135 0.1016 0.4158 0.04540
2026 2 23 61094 0.0740 0.3835 0.07353 2026 4 6 61136 0.1025 0.4166 0.04526
2026 2 24 61095 0.0741 0.3846 0.07326 2026 4 7 61137 0.1034 0.4174 0.04528
2026 2 25 61096 0.0742 0.3858 0.07322 2026 4 8 61138 0.1044 0.4181 0.04540
2026 2 26 61097 0.0744 0.3870 0.07331 2026 4 9 61139 0.1053 0.4188 0.04556
2026 2 27 61098 0.0746 0.3882 0.07340 2026 4 10 61140 0.1063 0.4196 0.04566
2026 2 28 61099 0.0748 0.3894 0.07336 2026 4 11 61141 0.1073 0.4203 0.04563
2026 3 1 61100 0.0750 0.3905 0.07310 2026 4 12 61142 0.1083 0.4210 0.04539
2026 3 2 61101 0.0753 0.3917 0.07258 2026 4 13 61143 0.1093 0.4217 0.04489
2026 3 3 61102 0.0756 0.3929 0.07184 2026 4 14 61144 0.1103 0.4223 0.04411
2026 3 4 61103 0.0759 0.3941 0.07096 2026 4 15 61145 0.1114 0.4230 0.04311
2026 3 5 61104 0.0762 0.3952 0.07006 2026 4 16 61146 0.1124 0.4236 0.04198
2026 3 6 61105 0.0765 0.3964 0.06922 2026 4 17 61147 0.1135 0.4242 0.04088
2026 3 7 61106 0.0769 0.3976 0.06852 2026 4 18 61148 0.1146 0.4248 0.03995
2026 3 8 61107 0.0773 0.3987 0.06802 2026 4 19 61149 0.1157 0.4254 0.03929
2026 3 9 61108 0.0777 0.3999 0.06771 2026 4 20 61150 0.1168 0.4260 0.03893
2026 3 10 61109 0.0782 0.4010 0.06759 2026 4 21 61151 0.1180 0.4265 0.03881
2026 3 11 61110 0.0786 0.4022 0.06759 2026 4 22 61152 0.1191 0.4271 0.03879
2026 3 12 61111 0.0791 0.4033 0.06766 2026 4 23 61153 0.1203 0.4276 0.03874
2026 3 13 61112 0.0796 0.4044 0.06772 2026 4 24 61154 0.1214 0.4281 0.03855
2026 3 14 61113 0.0802 0.4056 0.06770 2026 4 25 61155 0.1226 0.4286 0.03815
2026 3 15 61114 0.0807 0.4067 0.06749 2026 4 26 61156 0.1238 0.4291 0.03757
2026 3 16 61115 0.0813 0.4078 0.06709 2026 4 27 61157 0.1250 0.4295 0.03685
2026 3 17 61116 0.0819 0.4089 0.06640 2026 4 28 61158 0.1262 0.4299 0.03606
2026 3 18 61117 0.0825 0.4100 0.06546 2026 4 29 61159 0.1275 0.4304 0.03532
2026 3 19 61118 0.0832 0.4111 0.06433 2026 4 30 61160 0.1287 0.4308 0.03468
2026 3 20 61119 0.0838 0.4122 0.06315 2026 5 1 61161 0.1300 0.4311 0.03422
2026 3 21 61120 0.0845 0.4132 0.06206 2026 5 2 61162 0.1312 0.4315 0.03397
2026 3 22 61121 0.0852 0.4143 0.06120 2026 5 3 61163 0.1325 0.4318 0.03394
2026 3 23 61122 0.0860 0.4154 0.06061 2026 5 4 61164 0.1338 0.4322 0.03410
2026 3 24 61123 0.0867 0.4164 0.06030 2026 5 5 61165 0.1350 0.4325 0.03439
2026 3 25 61124 0.0875 0.4174 0.06016 2026 5 6 61166 0.1363 0.4327 0.03475
2026 3 26 61125 0.0883 0.4185 0.06007 2026 5 7 61167 0.1376 0.4330 0.03509
2026 3 27 61126 0.0891 0.4195 0.05991 2026 5 8 61168 0.1389 0.4332 0.03536
2026 3 28 61127 0.0900 0.4205 0.05956 2026 5 9 61169 0.1402 0.4335 0.03547
2026 3 29 61128 0.0908 0.4215 0.05899 2026 5 10 61170 0.1416 0.4337 0.03538
2026 3 30 61129 0.0917 0.4224 0.05821 2026 5 11 61171 0.1429 0.4339 0.03505
2026 3 31 61130 0.0926 0.4234 0.05727 2026 5 12 61172 0.1442 0.4340 0.03452
2026 4 1 61131 0.0935 0.4244 0.05628 2026 5 13 61173 0.1456 0.4342 0.03383
2026 4 2 61132 0.0945 0.4253 0.05533 2026 5 14 61174 0.1469 0.4343 0.03311
2026 4 3 61133 0.0954 0.4262 0.05450 2026 5 15 61175 0.1482 0.4344 0.03249
2026 4 4 61134 0.0964 0.4271 0.05387 2026 5 16 61176 0.1496 0.4345 0.03211
2026 4 5 61135 0.0974 0.4280 0.05344 2026 5 17 61177 0.1509 0.4345 0.03204
2026 4 6 61136 0.0984 0.4289 0.05321 2026 5 18 61178 0.1523 0.4345 0.03225
2026 4 7 61137 0.0994 0.4298 0.05315 2026 5 19 61179 0.1537 0.4346 0.03262
2026 4 8 61138 0.1005 0.4306 0.05320 2026 5 20 61180 0.1550 0.4346 0.03301
2026 4 9 61139 0.1016 0.4315 0.05329 2026 5 21 61181 0.1564 0.4345 0.03328
2026 4 10 61140 0.1026 0.4323 0.05333 2026 5 22 61182 0.1577 0.4345 0.03336
2026 4 11 61141 0.1038 0.4331 0.05324 2026 5 23 61183 0.1591 0.4344 0.03325
2026 4 12 61142 0.1049 0.4339 0.05296 2026 5 24 61184 0.1605 0.4343 0.03299
2026 4 13 61143 0.1060 0.4347 0.05243 2026 5 25 61185 0.1618 0.4342 0.03268
2026 4 14 61144 0.1072 0.4354 0.05164 2026 5 26 61186 0.1632 0.4341 0.03241
2026 4 15 61145 0.1083 0.4362 0.05064 2026 5 27 61187 0.1646 0.4339 0.03224
2026 4 16 61146 0.1095 0.4369 0.04952 2026 5 28 61188 0.1659 0.4338 0.03225
2026 4 17 61147 0.1107 0.4376 0.04842 2026 5 29 61189 0.1673 0.4336 0.03246
2026 4 18 61148 0.1120 0.4383 0.04751 2026 5 30 61190 0.1686 0.4333 0.03289
2026 4 19 61149 0.1132 0.4389 0.04688 2026 5 31 61191 0.1700 0.4331 0.03352
2026 4 20 61150 0.1144 0.4396 0.04656 2026 6 1 61192 0.1713 0.4328 0.03429
2026 4 21 61151 0.1157 0.4402 0.04647 2026 6 2 61193 0.1727 0.4326 0.03515
2026 4 22 61152 0.1170 0.4408 0.04649 2026 6 3 61194 0.1740 0.4323 0.03602
2026 4 23 61153 0.1183 0.4414 0.04647 2026 6 4 61195 0.1754 0.4319 0.03683
2026 4 24 61154 0.1196 0.4420 0.04631 2026 6 5 61196 0.1767 0.4316 0.03751
2026 4 25 61155 0.1209 0.4426 0.04596 2026 6 6 61197 0.1781 0.4312 0.03801
2026 4 26 61156 0.1222 0.4431 0.04541 2026 6 7 61198 0.1794 0.4308 0.03831
2026 4 27 61157 0.1235 0.4436 0.04473 2026 6 8 61199 0.1807 0.4304 0.03841
2026 4 28 61158 0.1249 0.4441 0.04398 2026 6 9 61200 0.1820 0.4300 0.03835
2026 4 29 61159 0.1263 0.4446 0.04327 2026 6 10 61201 0.1833 0.4295 0.03823
2026 4 30 61160 0.1276 0.4451 0.04267 2026 6 11 61202 0.1846 0.4291 0.03815
2026 5 1 61161 0.1290 0.4455 0.04225 2026 6 12 61203 0.1859 0.4286 0.03824
2026 5 2 61162 0.1304 0.4459 0.04204 2026 6 13 61204 0.1872 0.4280 0.03860
2026 5 3 61163 0.1318 0.4463 0.04204 2026 6 14 61205 0.1885 0.4275 0.03924
2026 5 4 61164 0.1332 0.4467 0.04223 2026 6 15 61206 0.1897 0.4270 0.04009
2026 5 5 61165 0.1346 0.4470 0.04256 2026 6 16 61207 0.1910 0.4264 0.04101
2026 5 6 61166 0.1361 0.4473 0.04294 2026 6 17 61208 0.1922 0.4258 0.04185
2026 5 7 61167 0.1375 0.4476 0.04332 2026 6 18 61209 0.1935 0.4252 0.04250
2026 5 8 61168 0.1390 0.4479 0.04361 2026 6 19 61210 0.1947 0.4245 0.04293
2026 5 9 61169 0.1404 0.4482 0.04375 2026 6 20 61211 0.1959 0.4239 0.04317
2026 5 10 61170 0.1419 0.4484 0.04368 2026 6 21 61212 0.1971 0.4232 0.04333
2026 5 11 61171 0.1433 0.4486 0.04337 2026 6 22 61213 0.1983 0.4225 0.04352
2026 5 12 61172 0.1448 0.4488 0.04285 2026 6 23 61214 0.1995 0.4218 0.04381
2026 5 13 61173 0.1463 0.4490 0.04218 2026 6 24 61215 0.2007 0.4211 0.04428
2026 5 14 61174 0.1478 0.4492 0.04147 2026 6 25 61216 0.2018 0.4203 0.04496
2026 5 15 61175 0.1493 0.4493 0.04087 2026 6 26 61217 0.2030 0.4195 0.04586
2026 5 16 61176 0.1508 0.4494 0.04050 2026 6 27 61218 0.2041 0.4187 0.04695
2026 5 17 61177 0.1523 0.4495 0.04043 2026 6 28 61219 0.2052 0.4179 0.04820
2026 5 18 61178 0.1538 0.4495 0.04064 2026 6 29 61220 0.2063 0.4171 0.04955
2026 5 19 61179 0.1553 0.4496 0.04102 2026 6 30 61221 0.2074 0.4162 0.05092
2026 5 20 61180 0.1568 0.4496 0.04141 2026 7 1 61222 0.2085 0.4154 0.05224
2026 5 21 61181 0.1583 0.4496 0.04168 2026 7 2 61223 0.2095 0.4145 0.05344
2026 5 22 61182 0.1598 0.4495 0.04176 2026 7 3 61224 0.2106 0.4136 0.05447
2026 5 23 61183 0.1613 0.4495 0.04163 2026 7 4 61225 0.2116 0.4127 0.05530
2026 5 24 61184 0.1628 0.4494 0.04136 2026 7 5 61226 0.2126 0.4118 0.05595
2026 5 25 61185 0.1643 0.4493 0.04102 2026 7 6 61227 0.2136 0.4108 0.05644
2026 5 26 61186 0.1658 0.4492 0.04070 2026 7 7 61228 0.2146 0.4098 0.05686
2026 5 27 61187 0.1673 0.4490 0.04049 2026 7 8 61229 0.2155 0.4088 0.05730
2026 5 28 61188 0.1688 0.4488 0.04042 2026 7 9 61230 0.2164 0.4078 0.05787
2026 5 29 61189 0.1704 0.4486 0.04054 2026 7 10 61231 0.2174 0.4068 0.05866
2026 5 30 61190 0.1719 0.4484 0.04085 2026 7 11 61232 0.2183 0.4058 0.05971
2026 5 31 61191 0.1734 0.4482 0.04132 2026 7 12 61233 0.2191 0.4048 0.06099
2026 6 1 61192 0.1749 0.4479 0.04190 2026 7 13 61234 0.2200 0.4037 0.06238
2026 6 2 61193 0.1764 0.4476 0.04253 2026 7 14 61235 0.2208 0.4026 0.06374
2026 6 3 61194 0.1779 0.4473 0.04314 2026 7 15 61236 0.2217 0.4015 0.06490
2026 6 4 61195 0.1793 0.4470 0.04364 2026 7 16 61237 0.2225 0.4004 0.06580
2026 6 5 61196 0.1808 0.4466 0.04399 2026 7 17 61238 0.2232 0.3993 0.06643
2026 6 6 61197 0.1823 0.4462 0.04416 2026 7 18 61239 0.2240 0.3982 0.06686
2026 6 7 61198 0.1838 0.4458 0.04415 2026 7 19 61240 0.2247 0.3970 0.06720
2026 6 8 61199 0.1853 0.4454 0.04397 2026 7 20 61241 0.2255 0.3959 0.06757
2026 6 9 61200 0.1867 0.4449 0.04367 2026 7 21 61242 0.2262 0.3947 0.06804
2026 6 10 61201 0.1882 0.4444 0.04334 2026 7 22 61243 0.2268 0.3935 0.06865
2026 6 11 61202 0.1896 0.4439 0.04309 2026 7 23 61244 0.2275 0.3923 0.06942
2026 6 12 61203 0.1911 0.4434 0.04301 2026 7 24 61245 0.2281 0.3911 0.07035
2026 6 13 61204 0.1925 0.4429 0.04320 2026 7 25 61246 0.2287 0.3899 0.07139
2026 6 14 61205 0.1939 0.4423 0.04367 2026 7 26 61247 0.2293 0.3887 0.07253
2026 6 15 61206 0.1953 0.4417 0.04432 2026 7 27 61248 0.2299 0.3875 0.07369
2026 6 16 61207 0.1967 0.4411 0.04505 2026 7 28 61249 0.2304 0.3862 0.07483
2026 6 17 61208 0.1981 0.4405 0.04568 2026 7 29 61250 0.2309 0.3849 0.07589
2026 6 18 61209 0.1995 0.4398 0.04613 2026 7 30 61251 0.2314 0.3837 0.07681
2026 6 19 61210 0.2009 0.4391 0.04636 2026 7 31 61252 0.2319 0.3824 0.07755
2026 6 20 61211 0.2022 0.4384 0.04641 2026 8 1 61253 0.2323 0.3811 0.07812
2026 6 21 61212 0.2036 0.4377 0.04640 2026 8 2 61254 0.2327 0.3798 0.07854
2026 6 22 61213 0.2049 0.4370 0.04644 2026 8 3 61255 0.2331 0.3785 0.07889
2026 6 23 61214 0.2063 0.4362 0.04662 2026 8 4 61256 0.2335 0.3772 0.07925
2026 6 24 61215 0.2076 0.4354 0.04700 2026 8 5 61257 0.2338 0.3759 0.07972
2026 6 25 61216 0.2089 0.4346 0.04759 2026 8 6 61258 0.2342 0.3746 0.08039
2026 6 26 61217 0.2102 0.4338 0.04839 2026 8 7 61259 0.2344 0.3733 0.08130
2026 6 27 61218 0.2114 0.4329 0.04939 2026 8 8 61260 0.2347 0.3719 0.08241
2026 6 28 61219 0.2127 0.4321 0.05053 2026 8 9 61261 0.2350 0.3706 0.08365
2026 6 29 61220 0.2139 0.4312 0.05178 2026 8 10 61262 0.2352 0.3692 0.08486
2026 6 30 61221 0.2152 0.4303 0.05308 2026 8 11 61263 0.2354 0.3679 0.08590
2026 7 1 61222 0.2164 0.4293 0.05437 2026 8 12 61264 0.2355 0.3665 0.08667
2026 7 2 61223 0.2176 0.4284 0.05558 2026 8 13 61265 0.2357 0.3652 0.08710
2026 7 3 61224 0.2188 0.4274 0.05666 2026 8 14 61266 0.2358 0.3638 0.08724
2026 7 4 61225 0.2199 0.4264 0.05756 2026 8 15 61267 0.2359 0.3624 0.08725
2026 7 5 61226 0.2211 0.4254 0.05823 2026 8 16 61268 0.2359 0.3611 0.08727
2026 7 6 61227 0.2222 0.4244 0.05872 2026 8 17 61269 0.2360 0.3597 0.08741
2026 7 7 61228 0.2233 0.4234 0.05913 2026 8 18 61270 0.2360 0.3583 0.08772
2026 7 8 61229 0.2244 0.4223 0.05955 2026 8 19 61271 0.2360 0.3570 0.08823
2026 7 9 61230 0.2255 0.4212 0.06009 2026 8 20 61272 0.2359 0.3556 0.08889
2026 7 10 61231 0.2265 0.4201 0.06082 2026 8 21 61273 0.2359 0.3542 0.08975
2026 7 11 61232 0.2276 0.4190 0.06188 2026 8 22 61274 0.2358 0.3528 0.09075
2026 7 12 61233 0.2286 0.4179 0.06315 2026 8 23 61275 0.2356 0.3515 0.09173
2026 7 13 61234 0.2296 0.4168 0.06447 2026 8 24 61276 0.2355 0.3501 0.09267
2026 7 14 61235 0.2305 0.4156 0.06578 2026 8 25 61277 0.2353 0.3487 0.09354
2026 7 15 61236 0.2315 0.4144 0.06697 2026 8 26 61278 0.2351 0.3473 0.09418
2026 7 16 61237 0.2324 0.4132 0.06793 2026 8 27 61279 0.2349 0.3460 0.09450
2026 7 17 61238 0.2333 0.4120 0.06865 2026 8 28 61280 0.2346 0.3446 0.09461
2026 7 18 61239 0.2342 0.4108 0.06925 2026 8 29 61281 0.2344 0.3432 0.09454
2026 7 19 61240 0.2351 0.4096 0.06982 2026 8 30 61282 0.2340 0.3419 0.09433
2026 7 20 61241 0.2359 0.4083 0.07043 2026 8 31 61283 0.2337 0.3405 0.09408
2026 7 21 61242 0.2368 0.4071 0.07114 2026 9 1 61284 0.2334 0.3391 0.09392
2026 7 22 61243 0.2376 0.4058 0.07204 2026 9 2 61285 0.2330 0.3378 0.09389
2026 7 23 61244 0.2383 0.4045 0.07315 2026 9 3 61286 0.2326 0.3364 0.09406
2026 7 24 61245 0.2391 0.4032 0.07447 2026 9 4 61287 0.2321 0.3351 0.09437
2026 7 25 61246 0.2398 0.4019 0.07601 2026 9 5 61288 0.2317 0.3337 0.09483
2026 7 26 61247 0.2405 0.4006 0.07762 2026 9 6 61289 0.2312 0.3324 0.09533
2026 7 27 61248 0.2412 0.3992 0.07923 2026 9 7 61290 0.2306 0.3311 0.09572
2026 7 28 61249 0.2419 0.3979 0.08080 2026 9 8 61291 0.2301 0.3298 0.09587
2026 7 29 61250 0.2425 0.3965 0.08223 2026 9 9 61292 0.2295 0.3285 0.09576
2026 7 30 61251 0.2431 0.3952 0.08345 2026 9 10 61293 0.2289 0.3272 0.09541
2026 7 31 61252 0.2437 0.3938 0.08445 2026 9 11 61294 0.2283 0.3259 0.09492
2026 8 1 61253 0.2443 0.3924 0.08525 2026 9 12 61295 0.2277 0.3246 0.09452
2026 8 2 61254 0.2448 0.3910 0.08582 2026 9 13 61296 0.2270 0.3233 0.09420
2026 8 3 61255 0.2453 0.3896 0.08630 2026 9 14 61297 0.2263 0.3220 0.09410
2026 8 4 61256 0.2458 0.3882 0.08678 2026 9 15 61298 0.2256 0.3208 0.09416
2026 8 5 61257 0.2463 0.3867 0.08740 2026 9 16 61299 0.2248 0.3195 0.09433
2026 8 6 61258 0.2467 0.3853 0.08823 2026 9 17 61300 0.2241 0.3183 0.09465
2026 8 7 61259 0.2471 0.3839 0.08932 2026 9 18 61301 0.2233 0.3170 0.09510
2026 8 8 61260 0.2475 0.3824 0.09066 2026 9 19 61302 0.2225 0.3158 0.09562
2026 8 9 61261 0.2478 0.3810 0.09216 2026 9 20 61303 0.2216 0.3146 0.09615
2026 8 10 61262 0.2482 0.3795 0.09359 2026 9 21 61304 0.2208 0.3134 0.09657
2026 8 11 61263 0.2485 0.3780 0.09490 2026 9 22 61305 0.2199 0.3122 0.09690
2026 8 12 61264 0.2487 0.3766 0.09596 2026 9 23 61306 0.2190 0.3110 0.09704
2026 8 13 61265 0.2490 0.3751 0.09670 2026 9 24 61307 0.2180 0.3099 0.09702
2026 8 14 61266 0.2492 0.3736 0.09719 2026 9 25 61308 0.2171 0.3087 0.09681
2026 8 15 61267 0.2494 0.3721 0.09761 2026 9 26 61309 0.2161 0.3076 0.09642
2026 8 16 61268 0.2496 0.3706 0.09798 2026 9 27 61310 0.2151 0.3065 0.09591
2026 8 17 61269 0.2497 0.3692 0.09843 2026 9 28 61311 0.2141 0.3054 0.09537
2026 8 18 61270 0.2498 0.3677 0.09905 2026 9 29 61312 0.2130 0.3043 0.09501
2026 8 19 61271 0.2499 0.3662 0.09985 2026 9 30 61313 0.2119 0.3032 0.09489
2026 8 20 61272 0.2499 0.3647 0.10084 2026 10 1 61314 0.2109 0.3022 0.09500
2026 8 21 61273 0.2500 0.3632 0.10199 2026 10 2 61315 0.2097 0.3011 0.09526
2026 8 22 61274 0.2500 0.3617 0.10330 2026 10 3 61316 0.2086 0.3001 0.09568
2026 8 23 61275 0.2499 0.3602 0.10462 2026 10 4 61317 0.2075 0.2991 0.09602
2026 8 24 61276 0.2499 0.3587 0.10594 2026 10 5 61318 0.2063 0.2981 0.09613
2026 8 25 61277 0.2498 0.3572 0.10718 2026 10 6 61319 0.2051 0.2971 0.09602
2026 8 26 61278 0.2497 0.3557 0.10829 2026 10 7 61320 0.2039 0.2962 0.09573
2026 8 27 61279 0.2495 0.3542 0.10912 2026 10 8 61321 0.2027 0.2952 0.09526
2026 8 28 61280 0.2494 0.3527 0.10972 2026 10 9 61322 0.2014 0.2943 0.09470
2026 8 29 61281 0.2492 0.3512 0.11011 2026 10 10 61323 0.2001 0.2934 0.09420
2026 8 30 61282 0.2489 0.3497 0.11035 2026 10 11 61324 0.1989 0.2925 0.09382
2026 8 31 61283 0.2487 0.3482 0.11057 2026 10 12 61325 0.1976 0.2917 0.09360
2026 9 1 61284 0.2484 0.3467 0.11085 2026 10 13 61326 0.1962 0.2908 0.09354
2026 9 2 61285 0.2481 0.3452 0.11128 2026 10 14 61327 0.1949 0.2900 0.09367
2026 9 3 61286 0.2478 0.3437 0.11196 2026 10 15 61328 0.1935 0.2892 0.09395
2026 9 4 61287 0.2474 0.3423 0.11277 2026 10 16 61329 0.1922 0.2884 0.09436
2026 9 5 61288 0.2470 0.3408 0.11371 2026 10 17 61330 0.1908 0.2876 0.09484
2026 9 6 61289 0.2466 0.3393 0.11478 2026 10 18 61331 0.1894 0.2869 0.09525
2026 9 7 61290 0.2461 0.3379 0.11578 2026 10 19 61332 0.1880 0.2862 0.09550
2026 9 8 61291 0.2457 0.3364 0.11647 2026 10 20 61333 0.1865 0.2855 0.09558
2026 9 9 61292 0.2452 0.3350 0.11688 2026 10 21 61334 0.1851 0.2848 0.09543
2026 9 10 61293 0.2446 0.3336 0.11703 2026 10 22 61335 0.1836 0.2841 0.09503
2026 9 11 61294 0.2441 0.3321 0.11694 2026 10 23 61336 0.1821 0.2835 0.09443
2026 9 12 61295 0.2435 0.3307 0.11678 2026 10 24 61337 0.1807 0.2829 0.09372
2026 9 13 61296 0.2429 0.3293 0.11663 2026 10 25 61338 0.1792 0.2823 0.09295
2026 9 14 61297 0.2423 0.3279 0.11658 2026 10 26 61339 0.1776 0.2817 0.09229
2026 9 15 61298 0.2416 0.3265 0.11678 2026 10 27 61340 0.1761 0.2812 0.09186
2026 9 16 61299 0.2409 0.3251 0.11724 2026 10 28 61341 0.1746 0.2807 0.09174
2026 9 17 61300 0.2402 0.3237 0.11786 2026 10 29 61342 0.1730 0.2802 0.09188
2026 9 18 61301 0.2395 0.3224 0.11862 2026 10 30 61343 0.1715 0.2797 0.09217
2026 9 19 61302 0.2387 0.3210 0.11948 2026 10 31 61344 0.1699 0.2792 0.09250
2026 9 20 61303 0.2379 0.3197 0.12038 2026 11 1 61345 0.1683 0.2788 0.09272
2026 9 21 61304 0.2371 0.3184 0.12121 2026 11 2 61346 0.1667 0.2784 0.09267
2026 9 22 61305 0.2363 0.3170 0.12182 2026 11 3 61347 0.1651 0.2780 0.09243
2026 9 23 61306 0.2354 0.3157 0.12217 2026 11 4 61348 0.1635 0.2777 0.09199
2026 9 24 61307 0.2345 0.3144 0.12224 2026 11 5 61349 0.1619 0.2773 0.09144
2026 9 25 61308 0.2336 0.3132 0.12195 2026 11 6 61350 0.1603 0.2770 0.09088
2026 9 26 61309 0.2327 0.3119 0.12154 2026 11 7 61351 0.1587 0.2767 0.09046
2026 9 27 61310 0.2317 0.3107 0.12102 2026 11 8 61352 0.1571 0.2765 0.09016
2026 9 28 61311 0.2307 0.3094 0.12054 2026 11 9 61353 0.1554 0.2763 0.09004
2026 9 29 61312 0.2297 0.3082 0.12015 2026 11 10 61354 0.1538 0.2760 0.09011
2026 9 30 61313 0.2287 0.3070 0.12000 2026 11 11 61355 0.1521 0.2759 0.09033
2026 10 1 61314 0.2276 0.3058 0.12018 2026 11 12 61356 0.1505 0.2757 0.09067
2026 10 2 61315 0.2265 0.3046 0.12054 2026 11 13 61357 0.1488 0.2756 0.09106
2026 10 3 61316 0.2254 0.3035 0.12103 2026 11 14 61358 0.1471 0.2755 0.09148
2026 10 4 61317 0.2243 0.3023 0.12144 2026 11 15 61359 0.1455 0.2754 0.09178
2026 10 5 61318 0.2232 0.3012 0.12165 2026 11 16 61360 0.1438 0.2753 0.09198
2026 10 6 61319 0.2220 0.3001 0.12164 2026 11 17 61361 0.1421 0.2753 0.09203
2026 10 7 61320 0.2208 0.2990 0.12139 2026 11 18 61362 0.1405 0.2753 0.09194
2026 10 8 61321 0.2196 0.2980 0.12088 2026 11 19 61363 0.1388 0.2753 0.09161
2026 10 9 61322 0.2184 0.2969 0.12027 2026 11 20 61364 0.1371 0.2754 0.09115
2026 10 10 61323 0.2171 0.2959 0.11972 2026 11 21 61365 0.1354 0.2755 0.09063
2026 10 11 61324 0.2158 0.2949 0.11925 2026 11 22 61366 0.1338 0.2756 0.09016
2026 10 12 61325 0.2146 0.2939 0.11890 2026 11 23 61367 0.1321 0.2757 0.08988
2026 10 13 61326 0.2133 0.2929 0.11887 2026 11 24 61368 0.1304 0.2759 0.08982
2026 10 14 61327 0.2119 0.2920 0.11912 2026 11 25 61369 0.1287 0.2760 0.09000
2026 10 15 61328 0.2106 0.2910 0.11953 2026 11 26 61370 0.1271 0.2762 0.09038
2026 10 16 61329 0.2092 0.2901 0.12012 2026 11 27 61371 0.1254 0.2765 0.09073
2026 10 17 61330 0.2078 0.2892 0.12065 2026 11 28 61372 0.1237 0.2767 0.09096
2026 10 18 61331 0.2064 0.2884 0.12109 2026 11 29 61373 0.1221 0.2770 0.09110
2026 10 19 61332 0.2050 0.2875 0.12137 2026 11 30 61374 0.1204 0.2773 0.09103
2026 10 20 61333 0.2036 0.2867 0.12146 2026 12 1 61375 0.1188 0.2777 0.09070
2026 10 21 61334 0.2021 0.2859 0.12130 2026 12 2 61376 0.1171 0.2780 0.09027
2026 10 22 61335 0.2007 0.2851 0.12093 2026 12 3 61377 0.1155 0.2784 0.08987
2026 10 23 61336 0.1992 0.2844 0.12034 2026 12 4 61378 0.1139 0.2788 0.08951
2026 10 24 61337 0.1977 0.2836 0.11962 2026 12 5 61379 0.1122 0.2793 0.08932
2026 10 25 61338 0.1962 0.2829 0.11886 2026 12 6 61380 0.1106 0.2797 0.08929
2026 10 26 61339 0.1947 0.2822 0.11818 2026 12 7 61381 0.1090 0.2802 0.08941
2026 10 27 61340 0.1931 0.2816 0.11769 2026 12 8 61382 0.1074 0.2807 0.08977
2026 10 28 61341 0.1916 0.2809 0.11736 2026 12 9 61383 0.1058 0.2813 0.09031
2026 10 29 61342 0.1900 0.2803 0.11719 2026 12 10 61384 0.1042 0.2819 0.09092
2026 10 30 61343 0.1885 0.2797 0.11716 2026 12 11 61385 0.1026 0.2824 0.09153
2026 10 31 61344 0.1869 0.2792 0.11710 2026 12 12 61386 0.1011 0.2831 0.09210
2026 11 1 61345 0.1853 0.2786 0.11685 2026 12 13 61387 0.0995 0.2837 0.09261
2026 11 2 61346 0.1837 0.2781 0.11637 2026 12 14 61388 0.0980 0.2844 0.09296
2026 11 3 61347 0.1821 0.2776 0.11560 2026 12 15 61389 0.0964 0.2851 0.09308
2026 11 4 61348 0.1804 0.2771 0.11466 2026 12 16 61390 0.0949 0.2858 0.09298
2026 11 5 61349 0.1788 0.2767 0.11370 2026 12 17 61391 0.0934 0.2865 0.09271
2026 11 6 61350 0.1771 0.2763 0.11271 2026 12 18 61392 0.0919 0.2873 0.09223
2026 11 7 61351 0.1755 0.2759 0.11190 2026 12 19 61393 0.0904 0.2881 0.09183
2026 11 8 61352 0.1738 0.2755 0.11121 2026 12 20 61394 0.0889 0.2889 0.09151
2026 11 9 61353 0.1721 0.2752 0.11068 2026 12 21 61395 0.0875 0.2897 0.09140
2026 11 10 61354 0.1705 0.2749 0.11032 2026 12 22 61396 0.0860 0.2906 0.09146
2026 11 11 61355 0.1688 0.2746 0.11012 2026 12 23 61397 0.0846 0.2914 0.09172
2026 11 12 61356 0.1671 0.2743 0.11007 2026 12 24 61398 0.0832 0.2923 0.09217
2026 11 13 61357 0.1654 0.2741 0.11002 2026 12 25 61399 0.0818 0.2933 0.09256
2026 11 14 61358 0.1637 0.2739 0.10999 2026 12 26 61400 0.0804 0.2942 0.09281
2026 11 15 61359 0.1620 0.2737 0.10989 2026 12 27 61401 0.0791 0.2952 0.09278
2026 11 16 61360 0.1603 0.2736 0.10962 2026 12 28 61402 0.0777 0.2962 0.09251
2026 11 17 61361 0.1586 0.2734 0.10914 2026 12 29 61403 0.0764 0.2972 0.09213
2026 11 18 61362 0.1568 0.2733 0.10845 2026 12 30 61404 0.0751 0.2982 0.09173
2026 11 19 61363 0.1551 0.2733 0.10758 2026 12 31 61405 0.0738 0.2993 0.09140
2026 11 20 61364 0.1534 0.2732 0.10654 2027 1 1 61406 0.0725 0.3004 0.09123
2026 11 21 61365 0.1517 0.2732 0.10550 2027 1 2 61407 0.0713 0.3015 0.09132
2026 11 22 61366 0.1499 0.2732 0.10458 2027 1 3 61408 0.0700 0.3026 0.09160
2026 11 23 61367 0.1482 0.2733 0.10384 2027 1 4 61409 0.0688 0.3037 0.09200
2026 11 24 61368 0.1465 0.2733 0.10342 2027 1 5 61410 0.0676 0.3049 0.09264
2026 11 25 61369 0.1448 0.2734 0.10321 2027 1 6 61411 0.0665 0.3061 0.09344
2026 11 26 61370 0.1430 0.2735 0.10323 2027 1 7 61412 0.0653 0.3072 0.09426
2026 11 27 61371 0.1413 0.2737 0.10328 2027 1 8 61413 0.0642 0.3085 0.09509
These predictions are based on all announced leap seconds. These predictions are based on all announced leap seconds.
CELESTIAL POLE OFFSET SERIES: CELESTIAL POLE OFFSET SERIES:
NEOS Celestial Pole Offset Series NEOS Celestial Pole Offset Series
MJD dpsi error deps error MJD dpsi error deps error
(msec. of arc) (msec. of arc)
60980 -117.40 1.27 -8.99 0.02 61026 -114.45 1.33 -7.19 0.16
60981 -117.55 1.03 -8.91 0.02 61027 -114.43 1.33 -7.42 0.16
60982 -117.70 1.03 -8.71 0.02 61028 -114.48 1.33 -7.64 0.16
60983 -117.84 0.94 -8.48 0.02 61029 -114.51 1.19 -7.67 0.18
60984 -117.83 0.96 -8.48 0.17 61030 -114.39 1.19 -7.49 0.18
60985 -117.46 0.96 -8.69 0.17 61031 -114.09 1.24 -7.26 0.16
60986 -116.89 0.96 -8.77 0.17 61032 -113.74 1.35 -7.13 0.06
60987 -116.60 0.98 -8.60 0.25 61033 -113.52 1.35 -7.11 0.06
60988 -116.74 1.14 -8.42 0.18
60989 -116.95 1.14 -8.50 0.18 IERS Celestial Pole Offset Final Series
60990 -116.87 1.25 -8.71 0.08 MJD dpsi deps
(msec. of arc)
60981 -117.6 -9.0
60982 -117.8 -8.8
60983 -118.0 -8.6
60984 -117.8 -8.6
60985 -117.5 -8.8
60986 -117.1 -8.9
60987 -116.8 -8.7
60988 -116.9 -8.5
60989 -117.0 -8.6
60990 -116.9 -8.8
60991 -116.6 -8.8
60992 -116.5 -8.5
60993 -116.5 -8.0
60994 -116.6 -7.7
60995 -116.6 -7.6
60996 -116.4 -7.5
60997 -116.1 -7.5
60998 -115.6 -7.8
60999 -115.5 -8.3
61000 -115.9 -8.6
61001 -116.0 -8.6
61002 -115.9 -8.5
61003 -115.7 -8.3
61004 -115.4 -8.2
61005 -115.1 -8.2
61006 -114.7 -8.1
61007 -114.4 -7.9
61008 -114.3 -7.9
61009 -114.6 -7.8
61010 -115.2 -7.6
IAU2000A Celestial Pole Offset Series IAU2000A Celestial Pole Offset Series
MJD dX error dY error MJD dX error dY error
(msec. of arc) (msec. of arc)
60980 0.437 0.504 0.035 0.022 61026 0.512 0.531 -0.092 0.161
60981 0.432 0.411 0.041 0.021 61027 0.519 0.531 -0.101 0.161
60982 0.426 0.411 0.047 0.021 61028 0.523 0.531 -0.107 0.161
60983 0.422 0.373 0.053 0.020 61029 0.527 0.474 -0.112 0.176
60984 0.420 0.382 0.057 0.173 61030 0.530 0.474 -0.114 0.176
60985 0.421 0.382 0.060 0.173 61031 0.533 0.494 -0.114 0.156
60986 0.426 0.382 0.059 0.173 61032 0.536 0.536 -0.113 0.059
60987 0.433 0.391 0.052 0.248 61033 0.539 0.536 -0.111 0.059
60988 0.443 0.453 0.040 0.184
60989 0.454 0.453 0.025 0.184
60990 0.466 0.495 0.008 0.082 IAU2000A Celestial Pole Offset Final Series
MJD dX dY
(msec. of arc)
60981 0.40 0.03
60982 0.38 0.02
60983 0.37 0.00
60984 0.42 -0.05
60985 0.41 -0.05
60986 0.34 -0.00
60987 0.33 0.01
60988 0.36 -0.01
60989 0.41 -0.04
60990 0.46 -0.06
60991 0.45 -0.05
60992 0.42 -0.02
60993 0.39 0.01
60994 0.33 0.07
60995 0.29 0.12
60996 0.30 0.14
60997 0.38 0.10
60998 0.59 -0.02
60999 0.62 -0.11
61000 0.51 -0.14
61001 0.41 -0.14
61002 0.35 -0.10
61003 0.32 -0.06
61004 0.33 -0.03
61005 0.38 -0.07
61006 0.47 -0.10
61007 0.57 -0.11
61008 0.57 -0.10
61009 0.48 -0.08
61010 0.35 -0.06
)--"; )--";

View File

@ -1,5 +1,6 @@
#pragma once
#include "mcc_angle.h" #include "mcc_angle.h"
#include "mcc_ccte_iers.h"
#include "mcc_defaults.h" #include "mcc_defaults.h"
#include "mcc_generics.h" #include "mcc_generics.h"
@ -42,7 +43,7 @@ public:
? MccCoordPairKind::COORDS_KIND_AZZD ? MccCoordPairKind::COORDS_KIND_AZZD
// apparent AZ and ALT // apparent AZ and ALT
: (std::same_as<CO_LON_T, MccAngleAZ> && std::same_as<CO_LAT_T, MccAngleALT>) : (std::same_as<CO_LON_T, MccAngleAZ> && std::same_as<CO_LAT_T, MccAngleALT>)
? MccCoordPairKind::COORDS_KIND_AZZD ? MccCoordPairKind::COORDS_KIND_AZALT
// general purpose X and Y // general purpose X and Y
: (std::same_as<CO_LON_T, MccAngleX> && std::same_as<CO_LAT_T, MccAngleY>) : (std::same_as<CO_LON_T, MccAngleX> && std::same_as<CO_LAT_T, MccAngleY>)
? MccCoordPairKind::COORDS_KIND_XY ? MccCoordPairKind::COORDS_KIND_XY
@ -52,7 +53,7 @@ public:
: MccCoordPairKind::COORDS_KIND_UNKNOWN; : MccCoordPairKind::COORDS_KIND_UNKNOWN;
template <mcc_coord_epoch_c EpT = MccCelestialCoordEpoch> template <mcc_coord_epoch_c EpT = MccCelestialCoordEpoch>
MccCoordPair(CO_LON_T const& x, CO_LAT_T const& y, EpT const& epoch = EpT::now()) : _x(x), _y(y), _mjd(epoch.MJD) MccCoordPair(CO_LON_T const& x, CO_LAT_T const& y, EpT const& epoch = EpT::now()) : _x(x), _y(y), _epoch(epoch)
{ {
} }
@ -74,16 +75,22 @@ public:
return _y; return _y;
} }
MccCelestialCoordEpoch epoch() const
{
return _epoch;
}
double MJD() const double MJD() const
{ {
return _mjd; return _epoch.MJD();
} }
// for something like: // for something like:
// auto [ra, dec, mjd] = coord_pair; // auto [ra, dec, epoch] = coord_pair;
operator std::tuple<CO_LON_T, CO_LAT_T, double>() const operator std::tuple<CO_LON_T, CO_LAT_T, MccCelestialCoordEpoch>() const
{ {
return {_x, _y, _mjd}; return {_x, _y, _epoch};
} }
void setX(const CO_LON_T& x) void setX(const CO_LON_T& x)
@ -96,16 +103,16 @@ public:
_y = y; _y = y;
} }
void setMJD(double mjd) void setEpoch(mcc_coord_epoch_c auto const& ep)
{ {
_mjd = mjd; _epoch = ep;
} }
protected: protected:
CO_LON_T _x; CO_LON_T _x;
CO_LAT_T _y; CO_LAT_T _y;
double _mjd; MccCelestialCoordEpoch _epoch;
}; };
@ -128,7 +135,7 @@ public:
template <typename CxT, typename CyT, mcc_coord_epoch_c EpT = MccCelestialCoordEpoch> template <typename CxT, typename CyT, mcc_coord_epoch_c EpT = MccCelestialCoordEpoch>
requires(std::is_arithmetic_v<CxT> && std::is_arithmetic_v<CyT>) requires(std::is_arithmetic_v<CxT> && std::is_arithmetic_v<CyT>)
MccNamedCoordPair(CxT const& x, CyT const& y, EpT const& epoch = EpT::now()) MccNamedCoordPair(CxT const& x, CyT const& y, EpT const& epoch = EpT::now())
: MccCoordPair<CO_LON_T, CO_LAT_T>(CO_LON_T{x}, CO_LAT_T{y}, epoch) : MccCoordPair<CO_LON_T, CO_LAT_T>(CO_LON_T{(double)x}, CO_LAT_T{(double)y}, epoch)
{ {
} }
@ -148,15 +155,62 @@ public:
virtual ~MccNamedCoordPair() = default; virtual ~MccNamedCoordPair() = default;
}; };
using MccSkyRADEC_ICRS = MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS>; struct MccSkyRADEC_ICRS : MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS> {
using MccSkyRADEC_APP = MccNamedCoordPair<MccAngleRA_APP, MccAngleDEC_APP>; template <typename CxT, typename CyT>
using MccSkyRADEC_OBS = MccNamedCoordPair<MccAngleRA_OBS, MccAngleDEC_OBS>; requires(std::is_arithmetic_v<CxT> && std::is_arithmetic_v<CyT>)
using MccSkyHADEC_APP = MccNamedCoordPair<MccAngleHA_APP, MccAngleDEC_APP>; MccSkyRADEC_ICRS(CxT const& x, CyT const& y)
using MccSkyHADEC_OBS = MccNamedCoordPair<MccAngleHA_OBS, MccAngleDEC_OBS>; : MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS>(x, y, MccCelestialCoordEpoch{})
using MccSkyAZZD = MccNamedCoordPair<MccAngleAZ, MccAngleZD>; {
using MccSkyAZALT = MccNamedCoordPair<MccAngleAZ, MccAngleALT>; }
using MccGenXY = MccNamedCoordPair<MccAngleX, MccAngleY>;
using MccGeoLONLAT = MccNamedCoordPair<MccAngleLON, MccAngleLAT>; MccSkyRADEC_ICRS(MccAngle const& x, MccAngle const& y) : MccSkyRADEC_ICRS((double)x, (double)y) {}
// ignore epoch setting (it is always J2000.0)
void setEpoch(mcc_coord_epoch_c auto const& ep)
{
static_assert(false, "CANNOT SET EPOCH FOR ICRS-KIND COORDINATE PAIR!!!");
}
};
struct MccSkyRADEC_APP : MccNamedCoordPair<MccAngleRA_APP, MccAngleDEC_APP> {
using MccNamedCoordPair<MccAngleRA_APP, MccAngleDEC_APP>::MccNamedCoordPair;
};
struct MccSkyRADEC_OBS : MccNamedCoordPair<MccAngleRA_OBS, MccAngleDEC_OBS> {
using MccNamedCoordPair<MccAngleRA_OBS, MccAngleDEC_OBS>::MccNamedCoordPair;
};
struct MccSkyHADEC_APP : MccNamedCoordPair<MccAngleHA_APP, MccAngleDEC_APP> {
using MccNamedCoordPair<MccAngleHA_APP, MccAngleDEC_APP>::MccNamedCoordPair;
};
struct MccSkyHADEC_OBS : MccNamedCoordPair<MccAngleHA_OBS, MccAngleDEC_OBS> {
using MccNamedCoordPair<MccAngleHA_OBS, MccAngleDEC_OBS>::MccNamedCoordPair;
};
struct MccSkyAZZD : MccNamedCoordPair<MccAngleAZ, MccAngleZD> {
using MccNamedCoordPair<MccAngleAZ, MccAngleZD>::MccNamedCoordPair;
};
struct MccSkyAZALT : MccNamedCoordPair<MccAngleAZ, MccAngleALT> {
using MccNamedCoordPair<MccAngleAZ, MccAngleALT>::MccNamedCoordPair;
};
struct MccGenXY : MccNamedCoordPair<MccAngleX, MccAngleY> {
using MccNamedCoordPair<MccAngleX, MccAngleY>::MccNamedCoordPair;
};
struct MccGeoLONLAT : MccNamedCoordPair<MccAngleLON, MccAngleLAT> {
using MccNamedCoordPair<MccAngleLON, MccAngleLAT>::MccNamedCoordPair;
};
struct mcc_skypoint_interface_t { struct mcc_skypoint_interface_t {
@ -211,69 +265,31 @@ concept mcc_skypoint_c = std::derived_from<T, mcc_skypoint_interface_t> && requi
/* MCC-LIBRARY DEFAULT SKY POINT CLASS IMPLEMENTATION BASED ON ERFA-LIBRARY */ /* MCC-LIBRARY DEFAULT SKY POINT CLASS IMPLEMENTATION BASED ON ERFA-LIBRARY */
class MccSkyPoint : public mcc_skypoint_interface_t template <typename CCTE_T>
class MccGenericSkyPoint : public mcc_skypoint_interface_t
{ {
public: public:
typedef CCTE_T ccte_t;
static constexpr double MJD0 = 2400000.5; static constexpr double MJD0 = 2400000.5;
struct meteo_t { inline static CCTE_T cctEngine{}; // celestial coordinates transformation engine
double temperature; // Temperature in C
double humidity; // humidity in % ([0.0, 1.0])
double pressure; // atmospheric presure in hPa=mB
};
static ccte::iers::MccLeapSeconds iersLeapSeconds() MccGenericSkyPoint() {}
{
return _leapSeconds;
}
static bool updateLeapSeconds(traits::mcc_input_char_range auto const& filename)
{
std::lock_guard lock{_leapSecondsMutex};
return _leapSeconds.load(filename);
};
static bool updateIersBulletinA(traits::mcc_input_char_range auto const& filename)
{
std::lock_guard lock{_bulletinAMutex};
return _bulletinA.load(filename);
};
static ccte::iers::MccIersBulletinA iersBulletinA()
{
return _bulletinA;
}
static void setMeteo(meteo_t meteo)
{
std::lock_guard lock{_meteoMutex};
_currentMeteo = std::move(meteo);
}
static meteo_t getMeteo()
{
return _currentMeteo;
}
MccSkyPoint() {}
template <mcc_coord_pair_c PT> template <mcc_coord_pair_c PT>
MccSkyPoint(const PT& coord_pair) : MccSkyPoint() MccGenericSkyPoint(const PT& coord_pair) : MccGenericSkyPoint()
{ {
auto self = from(coord_pair); auto self = from(coord_pair);
} }
MccSkyPoint(const MccSkyPoint&) = default; MccGenericSkyPoint(const MccGenericSkyPoint&) = default;
MccSkyPoint(MccSkyPoint&&) = default; MccGenericSkyPoint(MccGenericSkyPoint&&) = default;
MccSkyPoint& operator=(const MccSkyPoint&) = default; MccGenericSkyPoint& operator=(const MccGenericSkyPoint&) = default;
MccSkyPoint& operator=(MccSkyPoint&&) = default; MccGenericSkyPoint& operator=(MccGenericSkyPoint&&) = default;
virtual ~MccSkyPoint() = default; virtual ~MccGenericSkyPoint() = default;
MccCelestialCoordEpoch epoch() const MccCelestialCoordEpoch epoch() const
{ {
@ -281,7 +297,7 @@ public:
} }
template <mcc_coord_pair_c PT> template <mcc_coord_pair_c PT>
MccSkyPoint& from(const PT& coord_pair) MccGenericSkyPoint& from(const PT& coord_pair)
{ {
_x = coord_pair.x(); _x = coord_pair.x();
_y = coord_pair.y(); _y = coord_pair.y();
@ -293,9 +309,11 @@ public:
} else { } else {
_epoch.fromMJD(coord_pair.MJD()); _epoch.fromMJD(coord_pair.MJD());
} }
return *this;
} }
MccSkyPoint& operator=(mcc_coord_pair_c auto const& coord_pair) MccGenericSkyPoint& operator=(mcc_coord_pair_c auto const& coord_pair)
{ {
return from(coord_pair); return from(coord_pair);
} }
@ -312,18 +330,6 @@ public:
} }
protected: protected:
// IERS related static members
static inline ccte::iers::MccLeapSeconds _leapSeconds{};
static inline ccte::iers::MccIersBulletinA _bulletinA{};
static inline std::mutex _leapSecondsMutex{}, _bulletinAMutex{};
// meteo related static members
static inline meteo_t _currentMeteo{.temperature = 10.0, .humidity = 0.5, .pressure = 1010.0};
static inline std::mutex _meteoMutex{};
double _x{0.0}, _y{0.0}; double _x{0.0}, _y{0.0};
MccCoordPairKind _pairKind{MccCoordPairKind::COORDS_KIND_RADEC_ICRS}; MccCoordPairKind _pairKind{MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
MccCelestialCoordEpoch _epoch{}; // J2000.0 MccCelestialCoordEpoch _epoch{}; // J2000.0
@ -331,10 +337,6 @@ protected:
template <mcc_coord_pair_c PT> template <mcc_coord_pair_c PT>
auto toHelper(PT& cpair) auto toHelper(PT& cpair)
{ {
if (this == &cpair) {
return;
}
static constexpr double half_pi = std::numbers::pi / 2.0; static constexpr double half_pi = std::numbers::pi / 2.0;
// HA, DEC to AZ, ALT (AZ from the South through the West) // HA, DEC to AZ, ALT (AZ from the South through the West)
@ -385,27 +387,62 @@ protected:
dec = std::atan2(z, r); dec = std::atan2(z, r);
}; };
double phi; typename CCTE_T::error_t ccte_err;
double phi = cctEngine.getStateERFA().lat;
double ra_icrs, dec_icrs, ra, dec, ha, az, zd, alt, lst, eo; double ra_icrs, dec_icrs, ra, dec, ha, az, zd, alt, lst, eo;
static_assert(PT::pairKind == MccCoordPairKind::COORDS_KIND_GENERIC, "UNSUPPORTED SKY POINT TRANSFORMATION!"); static_assert(PT::pairKind != MccCoordPairKind::COORDS_KIND_GENERIC, "UNSUPPORTED SKY POINT TRANSFORMATION!");
static_assert(PT::pairKind == MccCoordPairKind::COORDS_KIND_UNKNOWN, "UNSUPPORTED SKY POINT TRANSFORMATION!"); static_assert(PT::pairKind != MccCoordPairKind::COORDS_KIND_UNKNOWN, "UNSUPPORTED SKY POINT TRANSFORMATION!");
// from ICRS to ICRS - just copy and exit
if (_pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS && if (_pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { if constexpr (PT::pairKind ==
cpair = PT(PT::x_t(_x), PT::y_t(_y), _epoch); MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { // from ICRS to ICRS - just copy and exit
return; cpair = PT(typename PT::x_t(_x), typename PT::y_t(_y));
return;
} else { // from ICRS to apparent or observed
if constexpr (mccIsAppCoordPairKind<PT::pairKind>) {
ccte_err = cctEngine.icrsToApp(_x, _y, cpair.epoch(), &ra, &dec, &ha, &az, &zd);
} else if constexpr (mccIsObsCoordPairKind<PT::pairKind>) {
ccte_err = cctEngine.icrsToObs(_x, _y, cpair.epoch(), &ra, &dec, &ha, &az, &zd);
} else {
static_assert(true, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_APP ||
PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_OBS) {
cpair.setX(ra);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_APP ||
PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_OBS) {
cpair.setX(ha);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) {
cpair.setX(az);
cpair.setY(zd);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZALT) {
cpair.setX(az);
cpair.setY(half_pi - zd);
} else {
static_assert(true, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
return;
}
} }
// just copy coordinates and exit // just copy coordinates and exit
if (_pairKind == PT::pairKind && utils::isEqual(_epoch.MJD(), cpair.MJD())) { if (_pairKind == PT::pairKind && utils::isEqual(_epoch.MJD(), cpair.MJD())) {
cpair = PT(PT::x_t(_x), PT::y_t(_y), _epoch); // cpair = PT(typename PT::x_t(_x), typename PT::y_t(_y), _epoch);
cpair.setX(_x);
cpair.setY(_y);
return; return;
} }
// if epochs is not the same then // if epochs are not the same then
// 1) convert stored coordinates to ICRS ones // 1) convert stored coordinates to ICRS ones
// 2) convert from the computed ICRS coordinates to required ones // 2) convert from the computed ICRS coordinates to required ones
MccCoordPairKind pkind = _pairKind; MccCoordPairKind pkind = _pairKind;
@ -413,16 +450,17 @@ protected:
if (_pairKind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { if (_pairKind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
pkind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS; pkind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS;
// cct_engine.appToICRS(app_type, app_x, app_y, ra_icrs, dec_icrs)
// cct_engine.obsToICRS(obs_type, obs_x, obs_y, ra_icrs, dec_icrs)
if (mcc_is_obs_coordpair(_pairKind)) { if (mcc_is_obs_coordpair(_pairKind)) {
// cct_engine.obsToICRS(...) ccte_err = cctEngine.obsToICRS(_pairKind, _epoch, _x, _y, &ra_icrs, &dec_icrs);
} else if (mcc_is_app_coordpair(_pairKind)) { } else if (mcc_is_app_coordpair(_pairKind)) {
// cct_engine.appToICRS(...) ccte_err = cctEngine.appToICRS(_pairKind, _epoch, _x, _y, &ra_icrs, &dec_icrs);
} else { // unsupported transformation!!! } else { // unsupported transformation!!!
return; return;
} }
if (ccte_err) {
return;
}
} else { } else {
ra_icrs = _x; ra_icrs = _x;
dec_icrs = _y; dec_icrs = _y;
@ -432,119 +470,14 @@ protected:
// here, from APP or OBS to ICRS and exit // here, from APP or OBS to ICRS and exit
if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS && if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS &&
PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
cpair = PT(PT::x_t(ra_icrs), PT::y_t(dec_icrs), MccCelestialCoordEpoch{}); cpair = PT(typename PT::x_t(ra_icrs), typename PT::y_t(dec_icrs));
return; return;
} }
// here, the input coordinates and stored one are at the same epoch // here, the input coordinates and stored one are at the same epoch
if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
// cct_engine.icrsToObs(ra_icrs, dec_icrs, jd, ra_obs, dec_obs, ha, az, zd)
// cct_engine.icrsToApp(ra_icrs, dec_icrs, jd, ra_app, dec_app, ha)
if constexpr (mccIsObsCoordPairKind<PT::pairKind>) { ccte_err = cctEngine.equationOrigins(cpair.MJD(), &eo);
// cct_engine.icrsToObs(...) if (ccte_err) {
} else if constexpr (mccIsAppCoordPairKind<PT::pairKind>) {
// cct_engine.icrsToApp(...)
} else {
static_assert(false, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
// cct_engine.icrsToApp(...)
cpair.setX(ra);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_OBS) {
// cct_engine.icrsToObs(...)
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
// cct_engine.icrsToApp(...)
cpair.setX(ha);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_OBS) {
// cct_engine.icrsToObs(...)
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) {
// cct_engine.icrsToObs(...)
cpair.setX(az);
cpair.setY(zd);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZALT) {
// cct_engine.icrsToObs(...)
cpair.setX(az);
cpair.setY(half_pi - zd);
} else {
static_assert(false, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
} else if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
// compute EO, LST, refract model
ha = lst + eo - cpair.x(); // from CIO based RA
if constexpr (PT::pairKind != MccCoordPairKind::COORDS_KIND_HADEC_APP) {
hadec2azalt(ha, _y, phi, az, alt); // to app az, alt
// to observed zenithal distance: alt += z_corr
}
if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_OBS) {
azalt2hadec(az, alt, phi, ha, dec); // to obs ha, dec
ra = lst + eo - ha; // CIO based RA
cpair.setX(ra);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
cpair.setX(ha);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_OBS) {
azalt2hadec(az, alt, phi, ha, dec); // to obs ha, dec
cpair.setX(ha);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) {
cpair.setX(az); // ????????????!!!!!!!!!
cpair.setY(half_pi - alt);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZALT) {
cpair.setX(az); // ????????????!!!!!!!!!
cpair.setY(alt);
} else {
static_assert(false, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
} else if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_OBS) {
ha = lst + eo - cpair.x(); // from CIO based RA
if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
hadec2azalt(ha, _y, phi, az, alt);
// to apparent zenithal distance: alt -= z_corr;
azalt2hadec(az, alt, phi, ha, dec); // to app ha,dec
ra = lst + eo - ha; // CIO based RA
cpair.setX(ra);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
hadec2azalt(ha, _y, phi, az, alt);
// to apparent zenithal distance: alt -= z_corr;
azalt2hadec(az, alt, phi, ha, dec); // to app ha,dec
cpair.setX(ha);
cpair.setY(dec);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_HADEC_OBS) {
cpair.setX(ha);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) {
hadec2azalt(ha, _y, phi, az, alt);
cpair.setX(az);
cpair.setY(half_pi - alt);
} else if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZALT) {
hadec2azalt(ha, _y, phi, az, alt);
cpair.setX(az);
cpair.setY(alt);
} else {
static_assert(false, "UNSUPPORTED SKY POINT TRANSFORMATION!");
}
} else if (pkind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
} else if (pkind == MccCoordPairKind::COORDS_KIND_HADEC_OBS) {
} else if (pkind == MccCoordPairKind::COORDS_KIND_AZZD) {
} else if (pkind == MccCoordPairKind::COORDS_KIND_AZALT) {
} else { // unsupported transformation!!!
return; return;
} }
@ -561,11 +494,15 @@ protected:
} else if (pkind == MccCoordPairKind::COORDS_KIND_AZALT) { } else if (pkind == MccCoordPairKind::COORDS_KIND_AZALT) {
az = _x; az = _x;
alt = _y; alt = _y;
} else if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
ra_icrs = _x;
dec_icrs = _y;
} else { // unsupported transformation!!! } else { // unsupported transformation!!!
return; return;
} }
auto comp_func = [&, this](this auto& self, MccCoordPairKind cp_kind) { // coordinate transformation lambda (possibly recursive!!!)
auto comp_func = [&, this](this auto&& self, MccCoordPairKind cp_kind) -> void {
if (cp_kind == MccCoordPairKind::COORDS_KIND_AZALT) { if (cp_kind == MccCoordPairKind::COORDS_KIND_AZALT) {
if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) { if constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) {
zd = half_pi - alt; zd = half_pi - alt;
@ -574,6 +511,9 @@ protected:
} else { } else {
if constexpr (mccIsAppCoordPairKind<PT::pairKind>) { if constexpr (mccIsAppCoordPairKind<PT::pairKind>) {
// correct for refraction: alt -= dz_refr // correct for refraction: alt -= dz_refr
double dZ;
ccte_err = cctEngine.refractionCorrection(half_pi - alt, &dZ);
alt -= dZ;
} }
azalt2hadec(az, alt, phi, ha, dec); azalt2hadec(az, alt, phi, ha, dec);
@ -629,6 +569,9 @@ protected:
hadec2azalt(ha, dec, phi, az, alt); hadec2azalt(ha, dec, phi, az, alt);
if constexpr (mccIsObsCoordPairKind<PT::pairKind>) { // RADEC_OBS, HADEC_OBS, AZALT, AZZD if constexpr (mccIsObsCoordPairKind<PT::pairKind>) { // RADEC_OBS, HADEC_OBS, AZALT, AZZD
// correct for refraction: alt += dz_refr // correct for refraction: alt += dz_refr
double dZ;
ccte_err = cctEngine.refractionReverseCorrection(half_pi - alt, &dZ);
alt += dZ;
self(MccCoordPairKind::COORDS_KIND_AZALT); self(MccCoordPairKind::COORDS_KIND_AZALT);
} }
} }
@ -650,6 +593,8 @@ protected:
} }
} }
}; };
comp_func(pkind); // ran transformation
} }
}; };

View File

@ -98,6 +98,52 @@ public:
MccCelestialCoordEpoch() : _UTC(J2000_UTC), _MJD(J2000_MJD), _JEpoch(2000.0) {} MccCelestialCoordEpoch() : _UTC(J2000_UTC), _MJD(J2000_MJD), _JEpoch(2000.0) {}
MccCelestialCoordEpoch(const MccCelestialCoordEpoch&) = default;
MccCelestialCoordEpoch(MccCelestialCoordEpoch&&) = default;
MccCelestialCoordEpoch& operator=(const MccCelestialCoordEpoch&) = default;
MccCelestialCoordEpoch& operator=(MccCelestialCoordEpoch&&) = default;
MccCelestialCoordEpoch(mcc_coord_epoch_c auto&& other) : MccCelestialCoordEpoch()
{
fromTimePoint(std::forward<decltype(other)>(other).UTC());
}
MccCelestialCoordEpoch& operator=(mcc_coord_epoch_c auto&& other)
{
fromTimePoint(std::forward<decltype(other)>(other).UTC());
return *this;
}
MccCelestialCoordEpoch& operator=(traits::mcc_input_char_range auto&& str)
{
// ignore possible errors!!!
auto ok = fromCharRange(std::forward<decltype(str)>(str));
return *this;
}
template <typename ClockT, typename DurT>
MccCelestialCoordEpoch& operator=(std::chrono::time_point<ClockT, DurT>&& tp)
{
// ignore possible errors!!!
auto ok = fromTimePoint(std::forward<decltype(tp)>(tp));
return *this;
}
template <typename VT>
MccCelestialCoordEpoch& operator=(VT&& mjd)
requires std::is_arithmetic_v<VT>
{
// ignore possible errors!!!
auto ok = fromMJD(std::forward<decltype(mjd)>(mjd));
return *this;
}
template <traits::mcc_input_char_range IR> template <traits::mcc_input_char_range IR>
bool fromCharRange(IR&& str) bool fromCharRange(IR&& str)
{ {

View File

@ -142,7 +142,8 @@ static constexpr void mcc_tp2tp(const T1& from_tp1, T2& to_tp)
/* JULIAN DAY CLASS CONCEPT */ /* JULIAN DAY CLASS CONCEPT */
template <typename T> template <typename T>
concept mcc_julday_c = mcc_fp_type_like_c<T> && requires(const T v) { concept mcc_julday_c = mcc_fp_type_like_c<T> || requires(const T v) {
// concept mcc_julday_c = mcc_fp_type_like_c<T> && requires(const T v) {
// modified Julian Day // modified Julian Day
{ v.MJD() } -> std::convertible_to<double>; { v.MJD() } -> std::convertible_to<double>;
// comparison operators // comparison operators

View File

@ -244,6 +244,10 @@ static R rad2sxg(double ang, bool hms = false, int prec = 2)
term *= 10.0; term *= 10.0;
} }
// round to given precision of arcseconds/seconds
degs = std::round(degs * 3600.0 * term) / term / 3600.0;
auto d = std::trunc(degs); auto d = std::trunc(degs);
auto s = (degs - d) * 60.0; auto s = (degs - d) * 60.0;
auto m = std::trunc(s); auto m = std::trunc(s);
@ -261,7 +265,9 @@ static R rad2sxg(double ang, bool hms = false, int prec = 2)
} }
if (ang < 0) { if (ang < 0) {
std::ranges::copy(std::string_view("-"), std::back_inserter(res)); if (!isEqual(d, 0.0) || !isEqual(m, 0.0) || !isEqual(s, 0.0)) {
std::ranges::copy(std::string_view("-"), std::back_inserter(res));
}
} }
std::vformat_to(std::back_inserter(res), std::string_view{fmt.begin(), fmt.end()}, std::make_format_args(d, m, s)); std::vformat_to(std::back_inserter(res), std::string_view{fmt.begin(), fmt.end()}, std::make_format_args(d, m, s));

View File

@ -0,0 +1,67 @@
#include <iostream>
#include "../mcc_ccte_erfa_new.h"
#include "../mcc_coord.h"
using namespace mcc;
typedef MccGenericSkyPoint<mcc::ccte::erfa::MccCCTE_ERFA> skypt_t;
static skypt_t::ccte_t::engine_state_t saoras{.meteo{.temperature = 0.0, .humidity = 0.5, .pressure = 1010.0},
.wavelength = 0.5,
.lat = 43.646711_degs,
.lon = 41.440732_degs,
.elev = 2100.0};
// skypt_t::cctEngine.setStateERFA(saoras);
static_assert(mcc_angle_c<double>, "!!!!!!!!!!!!");
int main()
{
skypt_t::cctEngine.setStateERFA(saoras);
skypt_t pt;
MccSkyRADEC_ICRS icrs(0.0, 0.0);
pt = icrs;
MccSkyRADEC_OBS radec_obs{0.0, 0.0};
MccSkyAZALT azalt{0, 0};
MccSkyAZZD azzd{0, 0};
pt.to(radec_obs, azalt, azzd);
std::cout << "FROM ICRS TO OBSERVED:\n";
std::cout << "RA_ICRS = " << icrs.x().sexagesimal(true) << "\n";
std::cout << "DEC_ICRS = " << icrs.y().sexagesimal() << "\n";
std::cout << "OBS COORD EPOCH: " << radec_obs.epoch().UTC() << "\n";
std::cout << "RA_OBS = " << radec_obs.x().sexagesimal(true) << "\n";
std::cout << "DEC_OBS = " << radec_obs.y().sexagesimal() << "\n";
std::cout << "AZ = " << azalt.x().sexagesimal() << "\n";
std::cout << "ALT = " << azalt.y().sexagesimal() << "\n";
std::cout << "ZD = " << azzd.y().sexagesimal() << "\n";
// radec_obs = {10.2387983_degs, "43:21:34.5465"_dms};
pt = radec_obs;
pt.to(icrs);
std::cout << "\n\nFROM OBSERVED TO ICRS:\n";
std::cout << "OBS COORD EPOCH: " << radec_obs.epoch().UTC() << "\n";
std::cout << "RA_OBS = " << radec_obs.x().sexagesimal(true) << "\n";
std::cout << "DEC_OBS = " << radec_obs.y().sexagesimal() << "\n";
std::cout << "RA_ICRS = " << icrs.x().sexagesimal(true) << "\n";
std::cout << "DEC_ICRS = " << icrs.y().sexagesimal() << "\n";
pt.to(azzd);
std::cout << "\n\nFROM OBSERVED TO OBSERVED:\n";
std::cout << "OBS COORD EPOCH: " << radec_obs.epoch().UTC() << "\n";
std::cout << "RA_OBS = " << radec_obs.x().sexagesimal(true) << "\n";
std::cout << "DEC_OBS = " << radec_obs.y().sexagesimal() << "\n";
std::cout << "AZ = " << azzd.x().sexagesimal() << "\n";
std::cout << "ZD = " << azzd.y().sexagesimal() << "\n";
return 0;
}