From 01d5657b1b53ed65efffd6ebd122e6fa72f22085 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 15 Jan 2026 19:11:16 +0300 Subject: [PATCH] ... --- mcc/CMakeLists.txt | 5 + mcc/mcc_ccte_erfa_new.h | 101 +++- mcc/mcc_ccte_iers_default.h | 905 +++++++++++++++++++---------------- mcc/mcc_coord.h | 369 ++++++-------- mcc/mcc_defaults.h | 46 ++ mcc/mcc_generics.h | 3 +- mcc/mcc_utils.h | 8 +- mcc/tests/mcc_coord_test.cpp | 67 +++ 8 files changed, 867 insertions(+), 637 deletions(-) create mode 100644 mcc/tests/mcc_coord_test.cpp diff --git a/mcc/CMakeLists.txt b/mcc/CMakeLists.txt index fa3a971..f991242 100644 --- a/mcc/CMakeLists.txt +++ b/mcc/CMakeLists.txt @@ -101,5 +101,10 @@ if (WITH_TESTS) add_executable(${NETMSG_TESTS_APP} tests/netmsg_test.cpp) 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() endif() diff --git a/mcc/mcc_ccte_erfa_new.h b/mcc/mcc_ccte_erfa_new.h index a73954a..e2fe512 100644 --- a/mcc/mcc_ccte_erfa_new.h +++ b/mcc/mcc_ccte_erfa_new.h @@ -273,10 +273,8 @@ public: { double ra_obs, dec_obs, az, zd, ha; - MccCelestialCoordEpoch ep; - ep.fromMJD((radec_obs->MJD())); - - auto err = icrsToObs(radec_icrs.x(), radec_icrs.y(), ep, &ra_obs, &dec_obs, &ha, &az, &zd, obj_params); + auto err = + icrsToObs(radec_icrs.x(), radec_icrs.y(), radec_icrs.epoch(), &ra_obs, &dec_obs, &ha, &az, &zd, obj_params); if (!err) { if (radec_obs) { @@ -285,7 +283,7 @@ public: } if (azzd) { - azzd->setMJD(radec_obs->MJD()); + azzd->setEpoch(radec_obs->epoch()); azzd->setX(az); azzd->setY(zd); } @@ -323,10 +321,8 @@ public: { double ra_app, dec_app, az, zd, ha; - MccCelestialCoordEpoch ep; - ep.fromMJD((radec_app->MJD())); - - auto err = icrsToApp(radec_icrs.x(), radec_icrs.y(), ep, &ra_app, &dec_app, &ha, &az, &zd, obj_params); + auto err = + icrsToApp(radec_icrs.x(), radec_icrs.y(), radec_icrs.epoch(), &ra_app, &dec_app, &ha, &az, &zd, obj_params); if (!err) { if (radec_app) { @@ -335,7 +331,7 @@ public: } if (azzd) { - azzd->setMJD(radec_app->MJD()); + azzd->setEpoch(radec_app->epoch()); azzd->setX(az); azzd->setY(zd); } @@ -364,10 +360,7 @@ public: { double ra, dec; - MccCelestialCoordEpoch ep; - ep.fromMJD((xy_obs->MJD())); - - auto err = obsToICRS(xy_obs.pair_kind, ep, xy_obs.x(), xy_obs.y(), &ra, &dec); + auto err = obsToICRS(xy_obs.pair_kind, xy_obs.epoch(), xy_obs.x(), xy_obs.y(), &ra, &dec); if (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) { if (eo == nullptr) { @@ -437,10 +446,35 @@ public: } // Zobs must be observed zenithal distance (Zapp = Zobs + dZ -- corrected (in vacuo) zenithal distance) + template + error_t refractionCorrection(mcc_angle_c auto Zobs, mcc_angle_c auto* dZ, ZAPP_T Zapp = nullptr) + requires(std::is_null_pointer_v || + (std::is_pointer_v && mcc_angle_c>)) + { + 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 error_t refractionCorrection(const refract_model_t& rmodel, mcc_angle_c auto Zobs, mcc_angle_c auto* dZ, - mcc_angle_c auto* Zapp = nullptr) + ZAPP_T Zapp = nullptr) + requires(std::is_null_pointer_v || + (std::is_pointer_v && mcc_angle_c>)) { error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK; @@ -456,19 +490,47 @@ public: *dZ = rmodel.refa * tanZ + rmodel.refb * tanZ * tanZ * tanZ; } - if (Zapp != nullptr) { + if constexpr (!std::is_null_pointer_v) { *Zapp = Zobs + *dZ; } return ret; } + // Zapp must be topocentric (in vacuo) zenithal distance (Zobs = Zapp - dZ -- observed, i.e. affected by refraction, // zenithal distance) + template + error_t refractionReverseCorrection(mcc_angle_c auto Zapp, mcc_angle_c auto* dZ, ZOBS_T Zobs = nullptr) + requires(std::is_null_pointer_v || + (std::is_pointer_v && mcc_angle_c>)) + { + 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 error_t refractionReverseCorrection(const refract_model_t& rmodel, mcc_angle_c auto Zapp, mcc_angle_c auto* dZ, - mcc_angle_c auto* Zobs = nullptr) + ZOBS_T Zobs = nullptr) + requires(std::is_null_pointer_v || + (std::is_pointer_v && mcc_angle_c>)) { error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK; @@ -489,7 +551,7 @@ public: (1.0 + rmodel.refa + tanZ2 * (rmodel.refa + b3) + b3 * tanZ2 * tanZ2); } - if (Zobs != nullptr) { + if constexpr (!std::is_null_pointer_v) { *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 // in the ERFA the azimuth is counted from the North through the East!!! // - *az = MccAngle(a + std::numbers::pi).normalize(); + *az = MccAngle(a - std::numbers::pi).normalize(); + // *az = MccAngle(a + std::numbers::pi).normalize(); } if (zd) { diff --git a/mcc/mcc_ccte_iers_default.h b/mcc/mcc_ccte_iers_default.h index e429899..7e1d0be 100644 --- a/mcc/mcc_ccte_iers_default.h +++ b/mcc/mcc_ccte_iers_default.h @@ -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 # the epoch given on the next line. The last line reads that NO # 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) @@ -67,7 +67,7 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--( * * * Rapid Service/Prediction of Earth Orientation * ********************************************************************** - 27 November 2025 Vol. XXXVIII No. 048 + 8 January 2026 Vol. XXXIX No. 002 ______________________________________________________________________ GENERAL INFORMATION: MJD = Julian Date - 2 400 000.5 days @@ -83,7 +83,7 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--( * ANNOUNCEMENTS: * * * * 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) * * 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 MJD x error y error UT1-UTC error " " " " s s - 25 11 21 61000 0.14376 .00009 0.31566 .00009 0.083583 0.000014 - 25 11 22 61001 0.14182 .00009 0.31496 .00009 0.083767 0.000013 - 25 11 23 61002 0.13974 .00009 0.31421 .00009 0.083987 0.000016 - 25 11 24 61003 0.13813 .00009 0.31362 .00009 0.084205 0.000015 - 25 11 25 61004 0.13714 .00009 0.31374 .00009 0.084304 0.000015 - 25 11 26 61005 0.13608 .00009 0.31443 .00009 0.084178 0.000013 - 25 11 27 61006 0.13507 .00009 0.31503 .00009 0.083748 0.000014 + 26 1 2 61042 0.10962 .00009 0.33249 .00009 0.074152 0.000020 + 26 1 3 61043 0.10827 .00009 0.33355 .00009 0.074367 0.000021 + 26 1 4 61044 0.10690 .00009 0.33455 .00009 0.074487 0.000020 + 26 1 5 61045 0.10554 .00009 0.33551 .00009 0.074361 0.000015 + 26 1 6 61046 0.10404 .00009 0.33628 .00009 0.073991 0.000015 + 26 1 7 61047 0.10253 .00009 0.33692 .00009 0.073470 0.000012 + 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, 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 - y = 0.3901 - 0.1172 cos A - 0.0610 sin A + 0.0383 cos C + 0.0554 sin C - UT1-UTC = 0.0660 + 0.00007 (MJD - 61014) - (UT2-UT1) + x = 0.1611 - 0.0626 cos A - 0.1221 sin A + 0.0025 cos C + 0.0585 sin C + y = 0.3836 - 0.1091 cos A + 0.0516 sin A + 0.0585 cos C - 0.0025 sin C + 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: - 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 Polar coord's 0.004 0.007 0.010 0.013 UT1-UTC 0.0014 0.0024 0.0032 0.0040 MJD x(arcsec) y(arcsec) UT1-UTC(sec) - 2025 11 28 61007 0.1339 0.3157 0.08302 - 2025 11 29 61008 0.1328 0.3161 0.08204 - 2025 11 30 61009 0.1317 0.3165 0.08094 - 2025 12 1 61010 0.1304 0.3167 0.07981 - 2025 12 2 61011 0.1292 0.3169 0.07882 - 2025 12 3 61012 0.1279 0.3172 0.07809 - 2025 12 4 61013 0.1267 0.3174 0.07768 - 2025 12 5 61014 0.1256 0.3177 0.07756 - 2025 12 6 61015 0.1245 0.3180 0.07761 - 2025 12 7 61016 0.1234 0.3183 0.07767 - 2025 12 8 61017 0.1223 0.3186 0.07758 - 2025 12 9 61018 0.1212 0.3189 0.07724 - 2025 12 10 61019 0.1202 0.3192 0.07669 - 2025 12 11 61020 0.1191 0.3196 0.07603 - 2025 12 12 61021 0.1180 0.3200 0.07533 - 2025 12 13 61022 0.1169 0.3203 0.07467 - 2025 12 14 61023 0.1159 0.3207 0.07413 - 2025 12 15 61024 0.1148 0.3211 0.07375 - 2025 12 16 61025 0.1138 0.3216 0.07354 - 2025 12 17 61026 0.1127 0.3220 0.07354 - 2025 12 18 61027 0.1117 0.3224 0.07372 - 2025 12 19 61028 0.1106 0.3229 0.07406 - 2025 12 20 61029 0.1096 0.3234 0.07450 - 2025 12 21 61030 0.1086 0.3239 0.07496 - 2025 12 22 61031 0.1076 0.3244 0.07535 - 2025 12 23 61032 0.1066 0.3249 0.07560 - 2025 12 24 61033 0.1056 0.3254 0.07565 - 2025 12 25 61034 0.1046 0.3260 0.07547 - 2025 12 26 61035 0.1037 0.3266 0.07507 - 2025 12 27 61036 0.1027 0.3272 0.07451 - 2025 12 28 61037 0.1017 0.3278 0.07389 - 2025 12 29 61038 0.1008 0.3284 0.07334 - 2025 12 30 61039 0.0998 0.3290 0.07299 - 2025 12 31 61040 0.0989 0.3297 0.07292 - 2026 1 1 61041 0.0980 0.3304 0.07315 - 2026 1 2 61042 0.0971 0.3311 0.07361 - 2026 1 3 61043 0.0962 0.3318 0.07417 - 2026 1 4 61044 0.0953 0.3325 0.07467 - 2026 1 5 61045 0.0945 0.3332 0.07499 - 2026 1 6 61046 0.0936 0.3340 0.07508 - 2026 1 7 61047 0.0928 0.3348 0.07496 - 2026 1 8 61048 0.0920 0.3355 0.07474 - 2026 1 9 61049 0.0912 0.3363 0.07449 - 2026 1 10 61050 0.0904 0.3372 0.07431 - 2026 1 11 61051 0.0896 0.3380 0.07426 - 2026 1 12 61052 0.0888 0.3388 0.07438 - 2026 1 13 61053 0.0881 0.3397 0.07469 - 2026 1 14 61054 0.0873 0.3405 0.07517 - 2026 1 15 61055 0.0866 0.3414 0.07580 - 2026 1 16 61056 0.0859 0.3423 0.07652 - 2026 1 17 61057 0.0852 0.3432 0.07725 - 2026 1 18 61058 0.0846 0.3442 0.07792 - 2026 1 19 61059 0.0839 0.3451 0.07845 - 2026 1 20 61060 0.0833 0.3461 0.07876 - 2026 1 21 61061 0.0827 0.3470 0.07883 - 2026 1 22 61062 0.0821 0.3480 0.07865 - 2026 1 23 61063 0.0815 0.3490 0.07828 - 2026 1 24 61064 0.0810 0.3500 0.07782 - 2026 1 25 61065 0.0804 0.3510 0.07738 - 2026 1 26 61066 0.0799 0.3520 0.07709 - 2026 1 27 61067 0.0794 0.3530 0.07703 - 2026 1 28 61068 0.0789 0.3541 0.07721 - 2026 1 29 61069 0.0785 0.3551 0.07760 - 2026 1 30 61070 0.0780 0.3562 0.07808 - 2026 1 31 61071 0.0776 0.3572 0.07851 - 2026 2 1 61072 0.0772 0.3583 0.07878 - 2026 2 2 61073 0.0768 0.3594 0.07880 - 2026 2 3 61074 0.0765 0.3605 0.07857 - 2026 2 4 61075 0.0761 0.3616 0.07815 - 2026 2 5 61076 0.0758 0.3627 0.07764 - 2026 2 6 61077 0.0755 0.3638 0.07715 - 2026 2 7 61078 0.0753 0.3649 0.07676 - 2026 2 8 61079 0.0750 0.3660 0.07652 - 2026 2 9 61080 0.0748 0.3672 0.07646 - 2026 2 10 61081 0.0746 0.3683 0.07657 - 2026 2 11 61082 0.0744 0.3695 0.07683 - 2026 2 12 61083 0.0742 0.3706 0.07719 - 2026 2 13 61084 0.0741 0.3718 0.07758 - 2026 2 14 61085 0.0740 0.3729 0.07792 - 2026 2 15 61086 0.0739 0.3741 0.07814 - 2026 2 16 61087 0.0738 0.3752 0.07814 - 2026 2 17 61088 0.0738 0.3764 0.07788 - 2026 2 18 61089 0.0738 0.3776 0.07735 - 2026 2 19 61090 0.0737 0.3788 0.07659 - 2026 2 20 61091 0.0738 0.3799 0.07570 - 2026 2 21 61092 0.0738 0.3811 0.07482 - 2026 2 22 61093 0.0739 0.3823 0.07406 - 2026 2 23 61094 0.0740 0.3835 0.07353 - 2026 2 24 61095 0.0741 0.3846 0.07326 - 2026 2 25 61096 0.0742 0.3858 0.07322 - 2026 2 26 61097 0.0744 0.3870 0.07331 - 2026 2 27 61098 0.0746 0.3882 0.07340 - 2026 2 28 61099 0.0748 0.3894 0.07336 - 2026 3 1 61100 0.0750 0.3905 0.07310 - 2026 3 2 61101 0.0753 0.3917 0.07258 - 2026 3 3 61102 0.0756 0.3929 0.07184 - 2026 3 4 61103 0.0759 0.3941 0.07096 - 2026 3 5 61104 0.0762 0.3952 0.07006 - 2026 3 6 61105 0.0765 0.3964 0.06922 - 2026 3 7 61106 0.0769 0.3976 0.06852 - 2026 3 8 61107 0.0773 0.3987 0.06802 - 2026 3 9 61108 0.0777 0.3999 0.06771 - 2026 3 10 61109 0.0782 0.4010 0.06759 - 2026 3 11 61110 0.0786 0.4022 0.06759 - 2026 3 12 61111 0.0791 0.4033 0.06766 - 2026 3 13 61112 0.0796 0.4044 0.06772 - 2026 3 14 61113 0.0802 0.4056 0.06770 - 2026 3 15 61114 0.0807 0.4067 0.06749 - 2026 3 16 61115 0.0813 0.4078 0.06709 - 2026 3 17 61116 0.0819 0.4089 0.06640 - 2026 3 18 61117 0.0825 0.4100 0.06546 - 2026 3 19 61118 0.0832 0.4111 0.06433 - 2026 3 20 61119 0.0838 0.4122 0.06315 - 2026 3 21 61120 0.0845 0.4132 0.06206 - 2026 3 22 61121 0.0852 0.4143 0.06120 - 2026 3 23 61122 0.0860 0.4154 0.06061 - 2026 3 24 61123 0.0867 0.4164 0.06030 - 2026 3 25 61124 0.0875 0.4174 0.06016 - 2026 3 26 61125 0.0883 0.4185 0.06007 - 2026 3 27 61126 0.0891 0.4195 0.05991 - 2026 3 28 61127 0.0900 0.4205 0.05956 - 2026 3 29 61128 0.0908 0.4215 0.05899 - 2026 3 30 61129 0.0917 0.4224 0.05821 - 2026 3 31 61130 0.0926 0.4234 0.05727 - 2026 4 1 61131 0.0935 0.4244 0.05628 - 2026 4 2 61132 0.0945 0.4253 0.05533 - 2026 4 3 61133 0.0954 0.4262 0.05450 - 2026 4 4 61134 0.0964 0.4271 0.05387 - 2026 4 5 61135 0.0974 0.4280 0.05344 - 2026 4 6 61136 0.0984 0.4289 0.05321 - 2026 4 7 61137 0.0994 0.4298 0.05315 - 2026 4 8 61138 0.1005 0.4306 0.05320 - 2026 4 9 61139 0.1016 0.4315 0.05329 - 2026 4 10 61140 0.1026 0.4323 0.05333 - 2026 4 11 61141 0.1038 0.4331 0.05324 - 2026 4 12 61142 0.1049 0.4339 0.05296 - 2026 4 13 61143 0.1060 0.4347 0.05243 - 2026 4 14 61144 0.1072 0.4354 0.05164 - 2026 4 15 61145 0.1083 0.4362 0.05064 - 2026 4 16 61146 0.1095 0.4369 0.04952 - 2026 4 17 61147 0.1107 0.4376 0.04842 - 2026 4 18 61148 0.1120 0.4383 0.04751 - 2026 4 19 61149 0.1132 0.4389 0.04688 - 2026 4 20 61150 0.1144 0.4396 0.04656 - 2026 4 21 61151 0.1157 0.4402 0.04647 - 2026 4 22 61152 0.1170 0.4408 0.04649 - 2026 4 23 61153 0.1183 0.4414 0.04647 - 2026 4 24 61154 0.1196 0.4420 0.04631 - 2026 4 25 61155 0.1209 0.4426 0.04596 - 2026 4 26 61156 0.1222 0.4431 0.04541 - 2026 4 27 61157 0.1235 0.4436 0.04473 - 2026 4 28 61158 0.1249 0.4441 0.04398 - 2026 4 29 61159 0.1263 0.4446 0.04327 - 2026 4 30 61160 0.1276 0.4451 0.04267 - 2026 5 1 61161 0.1290 0.4455 0.04225 - 2026 5 2 61162 0.1304 0.4459 0.04204 - 2026 5 3 61163 0.1318 0.4463 0.04204 - 2026 5 4 61164 0.1332 0.4467 0.04223 - 2026 5 5 61165 0.1346 0.4470 0.04256 - 2026 5 6 61166 0.1361 0.4473 0.04294 - 2026 5 7 61167 0.1375 0.4476 0.04332 - 2026 5 8 61168 0.1390 0.4479 0.04361 - 2026 5 9 61169 0.1404 0.4482 0.04375 - 2026 5 10 61170 0.1419 0.4484 0.04368 - 2026 5 11 61171 0.1433 0.4486 0.04337 - 2026 5 12 61172 0.1448 0.4488 0.04285 - 2026 5 13 61173 0.1463 0.4490 0.04218 - 2026 5 14 61174 0.1478 0.4492 0.04147 - 2026 5 15 61175 0.1493 0.4493 0.04087 - 2026 5 16 61176 0.1508 0.4494 0.04050 - 2026 5 17 61177 0.1523 0.4495 0.04043 - 2026 5 18 61178 0.1538 0.4495 0.04064 - 2026 5 19 61179 0.1553 0.4496 0.04102 - 2026 5 20 61180 0.1568 0.4496 0.04141 - 2026 5 21 61181 0.1583 0.4496 0.04168 - 2026 5 22 61182 0.1598 0.4495 0.04176 - 2026 5 23 61183 0.1613 0.4495 0.04163 - 2026 5 24 61184 0.1628 0.4494 0.04136 - 2026 5 25 61185 0.1643 0.4493 0.04102 - 2026 5 26 61186 0.1658 0.4492 0.04070 - 2026 5 27 61187 0.1673 0.4490 0.04049 - 2026 5 28 61188 0.1688 0.4488 0.04042 - 2026 5 29 61189 0.1704 0.4486 0.04054 - 2026 5 30 61190 0.1719 0.4484 0.04085 - 2026 5 31 61191 0.1734 0.4482 0.04132 - 2026 6 1 61192 0.1749 0.4479 0.04190 - 2026 6 2 61193 0.1764 0.4476 0.04253 - 2026 6 3 61194 0.1779 0.4473 0.04314 - 2026 6 4 61195 0.1793 0.4470 0.04364 - 2026 6 5 61196 0.1808 0.4466 0.04399 - 2026 6 6 61197 0.1823 0.4462 0.04416 - 2026 6 7 61198 0.1838 0.4458 0.04415 - 2026 6 8 61199 0.1853 0.4454 0.04397 - 2026 6 9 61200 0.1867 0.4449 0.04367 - 2026 6 10 61201 0.1882 0.4444 0.04334 - 2026 6 11 61202 0.1896 0.4439 0.04309 - 2026 6 12 61203 0.1911 0.4434 0.04301 - 2026 6 13 61204 0.1925 0.4429 0.04320 - 2026 6 14 61205 0.1939 0.4423 0.04367 - 2026 6 15 61206 0.1953 0.4417 0.04432 - 2026 6 16 61207 0.1967 0.4411 0.04505 - 2026 6 17 61208 0.1981 0.4405 0.04568 - 2026 6 18 61209 0.1995 0.4398 0.04613 - 2026 6 19 61210 0.2009 0.4391 0.04636 - 2026 6 20 61211 0.2022 0.4384 0.04641 - 2026 6 21 61212 0.2036 0.4377 0.04640 - 2026 6 22 61213 0.2049 0.4370 0.04644 - 2026 6 23 61214 0.2063 0.4362 0.04662 - 2026 6 24 61215 0.2076 0.4354 0.04700 - 2026 6 25 61216 0.2089 0.4346 0.04759 - 2026 6 26 61217 0.2102 0.4338 0.04839 - 2026 6 27 61218 0.2114 0.4329 0.04939 - 2026 6 28 61219 0.2127 0.4321 0.05053 - 2026 6 29 61220 0.2139 0.4312 0.05178 - 2026 6 30 61221 0.2152 0.4303 0.05308 - 2026 7 1 61222 0.2164 0.4293 0.05437 - 2026 7 2 61223 0.2176 0.4284 0.05558 - 2026 7 3 61224 0.2188 0.4274 0.05666 - 2026 7 4 61225 0.2199 0.4264 0.05756 - 2026 7 5 61226 0.2211 0.4254 0.05823 - 2026 7 6 61227 0.2222 0.4244 0.05872 - 2026 7 7 61228 0.2233 0.4234 0.05913 - 2026 7 8 61229 0.2244 0.4223 0.05955 - 2026 7 9 61230 0.2255 0.4212 0.06009 - 2026 7 10 61231 0.2265 0.4201 0.06082 - 2026 7 11 61232 0.2276 0.4190 0.06188 - 2026 7 12 61233 0.2286 0.4179 0.06315 - 2026 7 13 61234 0.2296 0.4168 0.06447 - 2026 7 14 61235 0.2305 0.4156 0.06578 - 2026 7 15 61236 0.2315 0.4144 0.06697 - 2026 7 16 61237 0.2324 0.4132 0.06793 - 2026 7 17 61238 0.2333 0.4120 0.06865 - 2026 7 18 61239 0.2342 0.4108 0.06925 - 2026 7 19 61240 0.2351 0.4096 0.06982 - 2026 7 20 61241 0.2359 0.4083 0.07043 - 2026 7 21 61242 0.2368 0.4071 0.07114 - 2026 7 22 61243 0.2376 0.4058 0.07204 - 2026 7 23 61244 0.2383 0.4045 0.07315 - 2026 7 24 61245 0.2391 0.4032 0.07447 - 2026 7 25 61246 0.2398 0.4019 0.07601 - 2026 7 26 61247 0.2405 0.4006 0.07762 - 2026 7 27 61248 0.2412 0.3992 0.07923 - 2026 7 28 61249 0.2419 0.3979 0.08080 - 2026 7 29 61250 0.2425 0.3965 0.08223 - 2026 7 30 61251 0.2431 0.3952 0.08345 - 2026 7 31 61252 0.2437 0.3938 0.08445 - 2026 8 1 61253 0.2443 0.3924 0.08525 - 2026 8 2 61254 0.2448 0.3910 0.08582 - 2026 8 3 61255 0.2453 0.3896 0.08630 - 2026 8 4 61256 0.2458 0.3882 0.08678 - 2026 8 5 61257 0.2463 0.3867 0.08740 - 2026 8 6 61258 0.2467 0.3853 0.08823 - 2026 8 7 61259 0.2471 0.3839 0.08932 - 2026 8 8 61260 0.2475 0.3824 0.09066 - 2026 8 9 61261 0.2478 0.3810 0.09216 - 2026 8 10 61262 0.2482 0.3795 0.09359 - 2026 8 11 61263 0.2485 0.3780 0.09490 - 2026 8 12 61264 0.2487 0.3766 0.09596 - 2026 8 13 61265 0.2490 0.3751 0.09670 - 2026 8 14 61266 0.2492 0.3736 0.09719 - 2026 8 15 61267 0.2494 0.3721 0.09761 - 2026 8 16 61268 0.2496 0.3706 0.09798 - 2026 8 17 61269 0.2497 0.3692 0.09843 - 2026 8 18 61270 0.2498 0.3677 0.09905 - 2026 8 19 61271 0.2499 0.3662 0.09985 - 2026 8 20 61272 0.2499 0.3647 0.10084 - 2026 8 21 61273 0.2500 0.3632 0.10199 - 2026 8 22 61274 0.2500 0.3617 0.10330 - 2026 8 23 61275 0.2499 0.3602 0.10462 - 2026 8 24 61276 0.2499 0.3587 0.10594 - 2026 8 25 61277 0.2498 0.3572 0.10718 - 2026 8 26 61278 0.2497 0.3557 0.10829 - 2026 8 27 61279 0.2495 0.3542 0.10912 - 2026 8 28 61280 0.2494 0.3527 0.10972 - 2026 8 29 61281 0.2492 0.3512 0.11011 - 2026 8 30 61282 0.2489 0.3497 0.11035 - 2026 8 31 61283 0.2487 0.3482 0.11057 - 2026 9 1 61284 0.2484 0.3467 0.11085 - 2026 9 2 61285 0.2481 0.3452 0.11128 - 2026 9 3 61286 0.2478 0.3437 0.11196 - 2026 9 4 61287 0.2474 0.3423 0.11277 - 2026 9 5 61288 0.2470 0.3408 0.11371 - 2026 9 6 61289 0.2466 0.3393 0.11478 - 2026 9 7 61290 0.2461 0.3379 0.11578 - 2026 9 8 61291 0.2457 0.3364 0.11647 - 2026 9 9 61292 0.2452 0.3350 0.11688 - 2026 9 10 61293 0.2446 0.3336 0.11703 - 2026 9 11 61294 0.2441 0.3321 0.11694 - 2026 9 12 61295 0.2435 0.3307 0.11678 - 2026 9 13 61296 0.2429 0.3293 0.11663 - 2026 9 14 61297 0.2423 0.3279 0.11658 - 2026 9 15 61298 0.2416 0.3265 0.11678 - 2026 9 16 61299 0.2409 0.3251 0.11724 - 2026 9 17 61300 0.2402 0.3237 0.11786 - 2026 9 18 61301 0.2395 0.3224 0.11862 - 2026 9 19 61302 0.2387 0.3210 0.11948 - 2026 9 20 61303 0.2379 0.3197 0.12038 - 2026 9 21 61304 0.2371 0.3184 0.12121 - 2026 9 22 61305 0.2363 0.3170 0.12182 - 2026 9 23 61306 0.2354 0.3157 0.12217 - 2026 9 24 61307 0.2345 0.3144 0.12224 - 2026 9 25 61308 0.2336 0.3132 0.12195 - 2026 9 26 61309 0.2327 0.3119 0.12154 - 2026 9 27 61310 0.2317 0.3107 0.12102 - 2026 9 28 61311 0.2307 0.3094 0.12054 - 2026 9 29 61312 0.2297 0.3082 0.12015 - 2026 9 30 61313 0.2287 0.3070 0.12000 - 2026 10 1 61314 0.2276 0.3058 0.12018 - 2026 10 2 61315 0.2265 0.3046 0.12054 - 2026 10 3 61316 0.2254 0.3035 0.12103 - 2026 10 4 61317 0.2243 0.3023 0.12144 - 2026 10 5 61318 0.2232 0.3012 0.12165 - 2026 10 6 61319 0.2220 0.3001 0.12164 - 2026 10 7 61320 0.2208 0.2990 0.12139 - 2026 10 8 61321 0.2196 0.2980 0.12088 - 2026 10 9 61322 0.2184 0.2969 0.12027 - 2026 10 10 61323 0.2171 0.2959 0.11972 - 2026 10 11 61324 0.2158 0.2949 0.11925 - 2026 10 12 61325 0.2146 0.2939 0.11890 - 2026 10 13 61326 0.2133 0.2929 0.11887 - 2026 10 14 61327 0.2119 0.2920 0.11912 - 2026 10 15 61328 0.2106 0.2910 0.11953 - 2026 10 16 61329 0.2092 0.2901 0.12012 - 2026 10 17 61330 0.2078 0.2892 0.12065 - 2026 10 18 61331 0.2064 0.2884 0.12109 - 2026 10 19 61332 0.2050 0.2875 0.12137 - 2026 10 20 61333 0.2036 0.2867 0.12146 - 2026 10 21 61334 0.2021 0.2859 0.12130 - 2026 10 22 61335 0.2007 0.2851 0.12093 - 2026 10 23 61336 0.1992 0.2844 0.12034 - 2026 10 24 61337 0.1977 0.2836 0.11962 - 2026 10 25 61338 0.1962 0.2829 0.11886 - 2026 10 26 61339 0.1947 0.2822 0.11818 - 2026 10 27 61340 0.1931 0.2816 0.11769 - 2026 10 28 61341 0.1916 0.2809 0.11736 - 2026 10 29 61342 0.1900 0.2803 0.11719 - 2026 10 30 61343 0.1885 0.2797 0.11716 - 2026 10 31 61344 0.1869 0.2792 0.11710 - 2026 11 1 61345 0.1853 0.2786 0.11685 - 2026 11 2 61346 0.1837 0.2781 0.11637 - 2026 11 3 61347 0.1821 0.2776 0.11560 - 2026 11 4 61348 0.1804 0.2771 0.11466 - 2026 11 5 61349 0.1788 0.2767 0.11370 - 2026 11 6 61350 0.1771 0.2763 0.11271 - 2026 11 7 61351 0.1755 0.2759 0.11190 - 2026 11 8 61352 0.1738 0.2755 0.11121 - 2026 11 9 61353 0.1721 0.2752 0.11068 - 2026 11 10 61354 0.1705 0.2749 0.11032 - 2026 11 11 61355 0.1688 0.2746 0.11012 - 2026 11 12 61356 0.1671 0.2743 0.11007 - 2026 11 13 61357 0.1654 0.2741 0.11002 - 2026 11 14 61358 0.1637 0.2739 0.10999 - 2026 11 15 61359 0.1620 0.2737 0.10989 - 2026 11 16 61360 0.1603 0.2736 0.10962 - 2026 11 17 61361 0.1586 0.2734 0.10914 - 2026 11 18 61362 0.1568 0.2733 0.10845 - 2026 11 19 61363 0.1551 0.2733 0.10758 - 2026 11 20 61364 0.1534 0.2732 0.10654 - 2026 11 21 61365 0.1517 0.2732 0.10550 - 2026 11 22 61366 0.1499 0.2732 0.10458 - 2026 11 23 61367 0.1482 0.2733 0.10384 - 2026 11 24 61368 0.1465 0.2733 0.10342 - 2026 11 25 61369 0.1448 0.2734 0.10321 - 2026 11 26 61370 0.1430 0.2735 0.10323 - 2026 11 27 61371 0.1413 0.2737 0.10328 + 2026 1 9 61049 0.1001 0.3380 0.07228 + 2026 1 10 61050 0.0993 0.3385 0.07180 + 2026 1 11 61051 0.0985 0.3390 0.07149 + 2026 1 12 61052 0.0978 0.3396 0.07136 + 2026 1 13 61053 0.0971 0.3403 0.07142 + 2026 1 14 61054 0.0964 0.3411 0.07168 + 2026 1 15 61055 0.0957 0.3418 0.07209 + 2026 1 16 61056 0.0949 0.3426 0.07260 + 2026 1 17 61057 0.0942 0.3434 0.07313 + 2026 1 18 61058 0.0935 0.3442 0.07360 + 2026 1 19 61059 0.0928 0.3450 0.07391 + 2026 1 20 61060 0.0921 0.3458 0.07400 + 2026 1 21 61061 0.0915 0.3466 0.07380 + 2026 1 22 61062 0.0909 0.3474 0.07332 + 2026 1 23 61063 0.0903 0.3482 0.07264 + 2026 1 24 61064 0.0897 0.3490 0.07185 + 2026 1 25 61065 0.0892 0.3499 0.07110 + 2026 1 26 61066 0.0886 0.3507 0.07051 + 2026 1 27 61067 0.0881 0.3516 0.07015 + 2026 1 28 61068 0.0876 0.3524 0.07004 + 2026 1 29 61069 0.0872 0.3533 0.07016 + 2026 1 30 61070 0.0867 0.3542 0.07040 + 2026 1 31 61071 0.0863 0.3551 0.07062 + 2026 2 1 61072 0.0858 0.3560 0.07069 + 2026 2 2 61073 0.0855 0.3569 0.07052 + 2026 2 3 61074 0.0851 0.3578 0.07011 + 2026 2 4 61075 0.0847 0.3587 0.06952 + 2026 2 5 61076 0.0844 0.3596 0.06884 + 2026 2 6 61077 0.0841 0.3605 0.06818 + 2026 2 7 61078 0.0838 0.3615 0.06763 + 2026 2 8 61079 0.0835 0.3624 0.06723 + 2026 2 9 61080 0.0832 0.3634 0.06700 + 2026 2 10 61081 0.0830 0.3643 0.06696 + 2026 2 11 61082 0.0828 0.3653 0.06706 + 2026 2 12 61083 0.0826 0.3662 0.06727 + 2026 2 13 61084 0.0824 0.3672 0.06753 + 2026 2 14 61085 0.0822 0.3682 0.06774 + 2026 2 15 61086 0.0821 0.3692 0.06784 + 2026 2 16 61087 0.0820 0.3702 0.06774 + 2026 2 17 61088 0.0819 0.3711 0.06738 + 2026 2 18 61089 0.0818 0.3721 0.06675 + 2026 2 19 61090 0.0818 0.3731 0.06590 + 2026 2 20 61091 0.0817 0.3741 0.06493 + 2026 2 21 61092 0.0817 0.3751 0.06395 + 2026 2 22 61093 0.0817 0.3761 0.06311 + 2026 2 23 61094 0.0818 0.3771 0.06250 + 2026 2 24 61095 0.0818 0.3781 0.06215 + 2026 2 25 61096 0.0819 0.3792 0.06203 + 2026 2 26 61097 0.0820 0.3802 0.06204 + 2026 2 27 61098 0.0821 0.3812 0.06206 + 2026 2 28 61099 0.0823 0.3822 0.06196 + 2026 3 1 61100 0.0824 0.3832 0.06165 + 2026 3 2 61101 0.0826 0.3842 0.06111 + 2026 3 3 61102 0.0828 0.3852 0.06037 + 2026 3 4 61103 0.0831 0.3862 0.05951 + 2026 3 5 61104 0.0833 0.3872 0.05864 + 2026 3 6 61105 0.0836 0.3882 0.05787 + 2026 3 7 61106 0.0839 0.3893 0.05726 + 2026 3 8 61107 0.0842 0.3903 0.05686 + 2026 3 9 61108 0.0846 0.3913 0.05667 + 2026 3 10 61109 0.0849 0.3922 0.05667 + 2026 3 11 61110 0.0853 0.3932 0.05681 + 2026 3 12 61111 0.0857 0.3942 0.05703 + 2026 3 13 61112 0.0861 0.3952 0.05725 + 2026 3 14 61113 0.0866 0.3962 0.05737 + 2026 3 15 61114 0.0870 0.3972 0.05732 + 2026 3 16 61115 0.0875 0.3981 0.05703 + 2026 3 17 61116 0.0880 0.3991 0.05647 + 2026 3 18 61117 0.0886 0.4000 0.05564 + 2026 3 19 61118 0.0891 0.4010 0.05462 + 2026 3 20 61119 0.0897 0.4019 0.05355 + 2026 3 21 61120 0.0903 0.4029 0.05256 + 2026 3 22 61121 0.0909 0.4038 0.05180 + 2026 3 23 61122 0.0916 0.4047 0.05132 + 2026 3 24 61123 0.0922 0.4056 0.05111 + 2026 3 25 61124 0.0929 0.4065 0.05107 + 2026 3 26 61125 0.0936 0.4074 0.05108 + 2026 3 27 61126 0.0943 0.4083 0.05100 + 2026 3 28 61127 0.0950 0.4092 0.05075 + 2026 3 29 61128 0.0958 0.4101 0.05028 + 2026 3 30 61129 0.0966 0.4109 0.04959 + 2026 3 31 61130 0.0974 0.4118 0.04876 + 2026 4 1 61131 0.0982 0.4126 0.04787 + 2026 4 2 61132 0.0990 0.4134 0.04702 + 2026 4 3 61133 0.0998 0.4142 0.04629 + 2026 4 4 61134 0.1007 0.4150 0.04574 + 2026 4 5 61135 0.1016 0.4158 0.04540 + 2026 4 6 61136 0.1025 0.4166 0.04526 + 2026 4 7 61137 0.1034 0.4174 0.04528 + 2026 4 8 61138 0.1044 0.4181 0.04540 + 2026 4 9 61139 0.1053 0.4188 0.04556 + 2026 4 10 61140 0.1063 0.4196 0.04566 + 2026 4 11 61141 0.1073 0.4203 0.04563 + 2026 4 12 61142 0.1083 0.4210 0.04539 + 2026 4 13 61143 0.1093 0.4217 0.04489 + 2026 4 14 61144 0.1103 0.4223 0.04411 + 2026 4 15 61145 0.1114 0.4230 0.04311 + 2026 4 16 61146 0.1124 0.4236 0.04198 + 2026 4 17 61147 0.1135 0.4242 0.04088 + 2026 4 18 61148 0.1146 0.4248 0.03995 + 2026 4 19 61149 0.1157 0.4254 0.03929 + 2026 4 20 61150 0.1168 0.4260 0.03893 + 2026 4 21 61151 0.1180 0.4265 0.03881 + 2026 4 22 61152 0.1191 0.4271 0.03879 + 2026 4 23 61153 0.1203 0.4276 0.03874 + 2026 4 24 61154 0.1214 0.4281 0.03855 + 2026 4 25 61155 0.1226 0.4286 0.03815 + 2026 4 26 61156 0.1238 0.4291 0.03757 + 2026 4 27 61157 0.1250 0.4295 0.03685 + 2026 4 28 61158 0.1262 0.4299 0.03606 + 2026 4 29 61159 0.1275 0.4304 0.03532 + 2026 4 30 61160 0.1287 0.4308 0.03468 + 2026 5 1 61161 0.1300 0.4311 0.03422 + 2026 5 2 61162 0.1312 0.4315 0.03397 + 2026 5 3 61163 0.1325 0.4318 0.03394 + 2026 5 4 61164 0.1338 0.4322 0.03410 + 2026 5 5 61165 0.1350 0.4325 0.03439 + 2026 5 6 61166 0.1363 0.4327 0.03475 + 2026 5 7 61167 0.1376 0.4330 0.03509 + 2026 5 8 61168 0.1389 0.4332 0.03536 + 2026 5 9 61169 0.1402 0.4335 0.03547 + 2026 5 10 61170 0.1416 0.4337 0.03538 + 2026 5 11 61171 0.1429 0.4339 0.03505 + 2026 5 12 61172 0.1442 0.4340 0.03452 + 2026 5 13 61173 0.1456 0.4342 0.03383 + 2026 5 14 61174 0.1469 0.4343 0.03311 + 2026 5 15 61175 0.1482 0.4344 0.03249 + 2026 5 16 61176 0.1496 0.4345 0.03211 + 2026 5 17 61177 0.1509 0.4345 0.03204 + 2026 5 18 61178 0.1523 0.4345 0.03225 + 2026 5 19 61179 0.1537 0.4346 0.03262 + 2026 5 20 61180 0.1550 0.4346 0.03301 + 2026 5 21 61181 0.1564 0.4345 0.03328 + 2026 5 22 61182 0.1577 0.4345 0.03336 + 2026 5 23 61183 0.1591 0.4344 0.03325 + 2026 5 24 61184 0.1605 0.4343 0.03299 + 2026 5 25 61185 0.1618 0.4342 0.03268 + 2026 5 26 61186 0.1632 0.4341 0.03241 + 2026 5 27 61187 0.1646 0.4339 0.03224 + 2026 5 28 61188 0.1659 0.4338 0.03225 + 2026 5 29 61189 0.1673 0.4336 0.03246 + 2026 5 30 61190 0.1686 0.4333 0.03289 + 2026 5 31 61191 0.1700 0.4331 0.03352 + 2026 6 1 61192 0.1713 0.4328 0.03429 + 2026 6 2 61193 0.1727 0.4326 0.03515 + 2026 6 3 61194 0.1740 0.4323 0.03602 + 2026 6 4 61195 0.1754 0.4319 0.03683 + 2026 6 5 61196 0.1767 0.4316 0.03751 + 2026 6 6 61197 0.1781 0.4312 0.03801 + 2026 6 7 61198 0.1794 0.4308 0.03831 + 2026 6 8 61199 0.1807 0.4304 0.03841 + 2026 6 9 61200 0.1820 0.4300 0.03835 + 2026 6 10 61201 0.1833 0.4295 0.03823 + 2026 6 11 61202 0.1846 0.4291 0.03815 + 2026 6 12 61203 0.1859 0.4286 0.03824 + 2026 6 13 61204 0.1872 0.4280 0.03860 + 2026 6 14 61205 0.1885 0.4275 0.03924 + 2026 6 15 61206 0.1897 0.4270 0.04009 + 2026 6 16 61207 0.1910 0.4264 0.04101 + 2026 6 17 61208 0.1922 0.4258 0.04185 + 2026 6 18 61209 0.1935 0.4252 0.04250 + 2026 6 19 61210 0.1947 0.4245 0.04293 + 2026 6 20 61211 0.1959 0.4239 0.04317 + 2026 6 21 61212 0.1971 0.4232 0.04333 + 2026 6 22 61213 0.1983 0.4225 0.04352 + 2026 6 23 61214 0.1995 0.4218 0.04381 + 2026 6 24 61215 0.2007 0.4211 0.04428 + 2026 6 25 61216 0.2018 0.4203 0.04496 + 2026 6 26 61217 0.2030 0.4195 0.04586 + 2026 6 27 61218 0.2041 0.4187 0.04695 + 2026 6 28 61219 0.2052 0.4179 0.04820 + 2026 6 29 61220 0.2063 0.4171 0.04955 + 2026 6 30 61221 0.2074 0.4162 0.05092 + 2026 7 1 61222 0.2085 0.4154 0.05224 + 2026 7 2 61223 0.2095 0.4145 0.05344 + 2026 7 3 61224 0.2106 0.4136 0.05447 + 2026 7 4 61225 0.2116 0.4127 0.05530 + 2026 7 5 61226 0.2126 0.4118 0.05595 + 2026 7 6 61227 0.2136 0.4108 0.05644 + 2026 7 7 61228 0.2146 0.4098 0.05686 + 2026 7 8 61229 0.2155 0.4088 0.05730 + 2026 7 9 61230 0.2164 0.4078 0.05787 + 2026 7 10 61231 0.2174 0.4068 0.05866 + 2026 7 11 61232 0.2183 0.4058 0.05971 + 2026 7 12 61233 0.2191 0.4048 0.06099 + 2026 7 13 61234 0.2200 0.4037 0.06238 + 2026 7 14 61235 0.2208 0.4026 0.06374 + 2026 7 15 61236 0.2217 0.4015 0.06490 + 2026 7 16 61237 0.2225 0.4004 0.06580 + 2026 7 17 61238 0.2232 0.3993 0.06643 + 2026 7 18 61239 0.2240 0.3982 0.06686 + 2026 7 19 61240 0.2247 0.3970 0.06720 + 2026 7 20 61241 0.2255 0.3959 0.06757 + 2026 7 21 61242 0.2262 0.3947 0.06804 + 2026 7 22 61243 0.2268 0.3935 0.06865 + 2026 7 23 61244 0.2275 0.3923 0.06942 + 2026 7 24 61245 0.2281 0.3911 0.07035 + 2026 7 25 61246 0.2287 0.3899 0.07139 + 2026 7 26 61247 0.2293 0.3887 0.07253 + 2026 7 27 61248 0.2299 0.3875 0.07369 + 2026 7 28 61249 0.2304 0.3862 0.07483 + 2026 7 29 61250 0.2309 0.3849 0.07589 + 2026 7 30 61251 0.2314 0.3837 0.07681 + 2026 7 31 61252 0.2319 0.3824 0.07755 + 2026 8 1 61253 0.2323 0.3811 0.07812 + 2026 8 2 61254 0.2327 0.3798 0.07854 + 2026 8 3 61255 0.2331 0.3785 0.07889 + 2026 8 4 61256 0.2335 0.3772 0.07925 + 2026 8 5 61257 0.2338 0.3759 0.07972 + 2026 8 6 61258 0.2342 0.3746 0.08039 + 2026 8 7 61259 0.2344 0.3733 0.08130 + 2026 8 8 61260 0.2347 0.3719 0.08241 + 2026 8 9 61261 0.2350 0.3706 0.08365 + 2026 8 10 61262 0.2352 0.3692 0.08486 + 2026 8 11 61263 0.2354 0.3679 0.08590 + 2026 8 12 61264 0.2355 0.3665 0.08667 + 2026 8 13 61265 0.2357 0.3652 0.08710 + 2026 8 14 61266 0.2358 0.3638 0.08724 + 2026 8 15 61267 0.2359 0.3624 0.08725 + 2026 8 16 61268 0.2359 0.3611 0.08727 + 2026 8 17 61269 0.2360 0.3597 0.08741 + 2026 8 18 61270 0.2360 0.3583 0.08772 + 2026 8 19 61271 0.2360 0.3570 0.08823 + 2026 8 20 61272 0.2359 0.3556 0.08889 + 2026 8 21 61273 0.2359 0.3542 0.08975 + 2026 8 22 61274 0.2358 0.3528 0.09075 + 2026 8 23 61275 0.2356 0.3515 0.09173 + 2026 8 24 61276 0.2355 0.3501 0.09267 + 2026 8 25 61277 0.2353 0.3487 0.09354 + 2026 8 26 61278 0.2351 0.3473 0.09418 + 2026 8 27 61279 0.2349 0.3460 0.09450 + 2026 8 28 61280 0.2346 0.3446 0.09461 + 2026 8 29 61281 0.2344 0.3432 0.09454 + 2026 8 30 61282 0.2340 0.3419 0.09433 + 2026 8 31 61283 0.2337 0.3405 0.09408 + 2026 9 1 61284 0.2334 0.3391 0.09392 + 2026 9 2 61285 0.2330 0.3378 0.09389 + 2026 9 3 61286 0.2326 0.3364 0.09406 + 2026 9 4 61287 0.2321 0.3351 0.09437 + 2026 9 5 61288 0.2317 0.3337 0.09483 + 2026 9 6 61289 0.2312 0.3324 0.09533 + 2026 9 7 61290 0.2306 0.3311 0.09572 + 2026 9 8 61291 0.2301 0.3298 0.09587 + 2026 9 9 61292 0.2295 0.3285 0.09576 + 2026 9 10 61293 0.2289 0.3272 0.09541 + 2026 9 11 61294 0.2283 0.3259 0.09492 + 2026 9 12 61295 0.2277 0.3246 0.09452 + 2026 9 13 61296 0.2270 0.3233 0.09420 + 2026 9 14 61297 0.2263 0.3220 0.09410 + 2026 9 15 61298 0.2256 0.3208 0.09416 + 2026 9 16 61299 0.2248 0.3195 0.09433 + 2026 9 17 61300 0.2241 0.3183 0.09465 + 2026 9 18 61301 0.2233 0.3170 0.09510 + 2026 9 19 61302 0.2225 0.3158 0.09562 + 2026 9 20 61303 0.2216 0.3146 0.09615 + 2026 9 21 61304 0.2208 0.3134 0.09657 + 2026 9 22 61305 0.2199 0.3122 0.09690 + 2026 9 23 61306 0.2190 0.3110 0.09704 + 2026 9 24 61307 0.2180 0.3099 0.09702 + 2026 9 25 61308 0.2171 0.3087 0.09681 + 2026 9 26 61309 0.2161 0.3076 0.09642 + 2026 9 27 61310 0.2151 0.3065 0.09591 + 2026 9 28 61311 0.2141 0.3054 0.09537 + 2026 9 29 61312 0.2130 0.3043 0.09501 + 2026 9 30 61313 0.2119 0.3032 0.09489 + 2026 10 1 61314 0.2109 0.3022 0.09500 + 2026 10 2 61315 0.2097 0.3011 0.09526 + 2026 10 3 61316 0.2086 0.3001 0.09568 + 2026 10 4 61317 0.2075 0.2991 0.09602 + 2026 10 5 61318 0.2063 0.2981 0.09613 + 2026 10 6 61319 0.2051 0.2971 0.09602 + 2026 10 7 61320 0.2039 0.2962 0.09573 + 2026 10 8 61321 0.2027 0.2952 0.09526 + 2026 10 9 61322 0.2014 0.2943 0.09470 + 2026 10 10 61323 0.2001 0.2934 0.09420 + 2026 10 11 61324 0.1989 0.2925 0.09382 + 2026 10 12 61325 0.1976 0.2917 0.09360 + 2026 10 13 61326 0.1962 0.2908 0.09354 + 2026 10 14 61327 0.1949 0.2900 0.09367 + 2026 10 15 61328 0.1935 0.2892 0.09395 + 2026 10 16 61329 0.1922 0.2884 0.09436 + 2026 10 17 61330 0.1908 0.2876 0.09484 + 2026 10 18 61331 0.1894 0.2869 0.09525 + 2026 10 19 61332 0.1880 0.2862 0.09550 + 2026 10 20 61333 0.1865 0.2855 0.09558 + 2026 10 21 61334 0.1851 0.2848 0.09543 + 2026 10 22 61335 0.1836 0.2841 0.09503 + 2026 10 23 61336 0.1821 0.2835 0.09443 + 2026 10 24 61337 0.1807 0.2829 0.09372 + 2026 10 25 61338 0.1792 0.2823 0.09295 + 2026 10 26 61339 0.1776 0.2817 0.09229 + 2026 10 27 61340 0.1761 0.2812 0.09186 + 2026 10 28 61341 0.1746 0.2807 0.09174 + 2026 10 29 61342 0.1730 0.2802 0.09188 + 2026 10 30 61343 0.1715 0.2797 0.09217 + 2026 10 31 61344 0.1699 0.2792 0.09250 + 2026 11 1 61345 0.1683 0.2788 0.09272 + 2026 11 2 61346 0.1667 0.2784 0.09267 + 2026 11 3 61347 0.1651 0.2780 0.09243 + 2026 11 4 61348 0.1635 0.2777 0.09199 + 2026 11 5 61349 0.1619 0.2773 0.09144 + 2026 11 6 61350 0.1603 0.2770 0.09088 + 2026 11 7 61351 0.1587 0.2767 0.09046 + 2026 11 8 61352 0.1571 0.2765 0.09016 + 2026 11 9 61353 0.1554 0.2763 0.09004 + 2026 11 10 61354 0.1538 0.2760 0.09011 + 2026 11 11 61355 0.1521 0.2759 0.09033 + 2026 11 12 61356 0.1505 0.2757 0.09067 + 2026 11 13 61357 0.1488 0.2756 0.09106 + 2026 11 14 61358 0.1471 0.2755 0.09148 + 2026 11 15 61359 0.1455 0.2754 0.09178 + 2026 11 16 61360 0.1438 0.2753 0.09198 + 2026 11 17 61361 0.1421 0.2753 0.09203 + 2026 11 18 61362 0.1405 0.2753 0.09194 + 2026 11 19 61363 0.1388 0.2753 0.09161 + 2026 11 20 61364 0.1371 0.2754 0.09115 + 2026 11 21 61365 0.1354 0.2755 0.09063 + 2026 11 22 61366 0.1338 0.2756 0.09016 + 2026 11 23 61367 0.1321 0.2757 0.08988 + 2026 11 24 61368 0.1304 0.2759 0.08982 + 2026 11 25 61369 0.1287 0.2760 0.09000 + 2026 11 26 61370 0.1271 0.2762 0.09038 + 2026 11 27 61371 0.1254 0.2765 0.09073 + 2026 11 28 61372 0.1237 0.2767 0.09096 + 2026 11 29 61373 0.1221 0.2770 0.09110 + 2026 11 30 61374 0.1204 0.2773 0.09103 + 2026 12 1 61375 0.1188 0.2777 0.09070 + 2026 12 2 61376 0.1171 0.2780 0.09027 + 2026 12 3 61377 0.1155 0.2784 0.08987 + 2026 12 4 61378 0.1139 0.2788 0.08951 + 2026 12 5 61379 0.1122 0.2793 0.08932 + 2026 12 6 61380 0.1106 0.2797 0.08929 + 2026 12 7 61381 0.1090 0.2802 0.08941 + 2026 12 8 61382 0.1074 0.2807 0.08977 + 2026 12 9 61383 0.1058 0.2813 0.09031 + 2026 12 10 61384 0.1042 0.2819 0.09092 + 2026 12 11 61385 0.1026 0.2824 0.09153 + 2026 12 12 61386 0.1011 0.2831 0.09210 + 2026 12 13 61387 0.0995 0.2837 0.09261 + 2026 12 14 61388 0.0980 0.2844 0.09296 + 2026 12 15 61389 0.0964 0.2851 0.09308 + 2026 12 16 61390 0.0949 0.2858 0.09298 + 2026 12 17 61391 0.0934 0.2865 0.09271 + 2026 12 18 61392 0.0919 0.2873 0.09223 + 2026 12 19 61393 0.0904 0.2881 0.09183 + 2026 12 20 61394 0.0889 0.2889 0.09151 + 2026 12 21 61395 0.0875 0.2897 0.09140 + 2026 12 22 61396 0.0860 0.2906 0.09146 + 2026 12 23 61397 0.0846 0.2914 0.09172 + 2026 12 24 61398 0.0832 0.2923 0.09217 + 2026 12 25 61399 0.0818 0.2933 0.09256 + 2026 12 26 61400 0.0804 0.2942 0.09281 + 2026 12 27 61401 0.0791 0.2952 0.09278 + 2026 12 28 61402 0.0777 0.2962 0.09251 + 2026 12 29 61403 0.0764 0.2972 0.09213 + 2026 12 30 61404 0.0751 0.2982 0.09173 + 2026 12 31 61405 0.0738 0.2993 0.09140 + 2027 1 1 61406 0.0725 0.3004 0.09123 + 2027 1 2 61407 0.0713 0.3015 0.09132 + 2027 1 3 61408 0.0700 0.3026 0.09160 + 2027 1 4 61409 0.0688 0.3037 0.09200 + 2027 1 5 61410 0.0676 0.3049 0.09264 + 2027 1 6 61411 0.0665 0.3061 0.09344 + 2027 1 7 61412 0.0653 0.3072 0.09426 + 2027 1 8 61413 0.0642 0.3085 0.09509 These predictions are based on all announced leap seconds. CELESTIAL POLE OFFSET SERIES: NEOS Celestial Pole Offset Series MJD dpsi error deps error (msec. of arc) - 60980 -117.40 1.27 -8.99 0.02 - 60981 -117.55 1.03 -8.91 0.02 - 60982 -117.70 1.03 -8.71 0.02 - 60983 -117.84 0.94 -8.48 0.02 - 60984 -117.83 0.96 -8.48 0.17 - 60985 -117.46 0.96 -8.69 0.17 - 60986 -116.89 0.96 -8.77 0.17 - 60987 -116.60 0.98 -8.60 0.25 - 60988 -116.74 1.14 -8.42 0.18 - 60989 -116.95 1.14 -8.50 0.18 - 60990 -116.87 1.25 -8.71 0.08 + 61026 -114.45 1.33 -7.19 0.16 + 61027 -114.43 1.33 -7.42 0.16 + 61028 -114.48 1.33 -7.64 0.16 + 61029 -114.51 1.19 -7.67 0.18 + 61030 -114.39 1.19 -7.49 0.18 + 61031 -114.09 1.24 -7.26 0.16 + 61032 -113.74 1.35 -7.13 0.06 + 61033 -113.52 1.35 -7.11 0.06 + + IERS Celestial Pole Offset Final Series + 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 MJD dX error dY error (msec. of arc) - 60980 0.437 0.504 0.035 0.022 - 60981 0.432 0.411 0.041 0.021 - 60982 0.426 0.411 0.047 0.021 - 60983 0.422 0.373 0.053 0.020 - 60984 0.420 0.382 0.057 0.173 - 60985 0.421 0.382 0.060 0.173 - 60986 0.426 0.382 0.059 0.173 - 60987 0.433 0.391 0.052 0.248 - 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 + 61026 0.512 0.531 -0.092 0.161 + 61027 0.519 0.531 -0.101 0.161 + 61028 0.523 0.531 -0.107 0.161 + 61029 0.527 0.474 -0.112 0.176 + 61030 0.530 0.474 -0.114 0.176 + 61031 0.533 0.494 -0.114 0.156 + 61032 0.536 0.536 -0.113 0.059 + 61033 0.539 0.536 -0.111 0.059 + + + 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 )--"; diff --git a/mcc/mcc_coord.h b/mcc/mcc_coord.h index 52dbbf5..99afc60 100644 --- a/mcc/mcc_coord.h +++ b/mcc/mcc_coord.h @@ -1,5 +1,6 @@ +#pragma once + #include "mcc_angle.h" -#include "mcc_ccte_iers.h" #include "mcc_defaults.h" #include "mcc_generics.h" @@ -42,7 +43,7 @@ public: ? MccCoordPairKind::COORDS_KIND_AZZD // apparent AZ and ALT : (std::same_as && std::same_as) - ? MccCoordPairKind::COORDS_KIND_AZZD + ? MccCoordPairKind::COORDS_KIND_AZALT // general purpose X and Y : (std::same_as && std::same_as) ? MccCoordPairKind::COORDS_KIND_XY @@ -52,7 +53,7 @@ public: : MccCoordPairKind::COORDS_KIND_UNKNOWN; template - 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; } + MccCelestialCoordEpoch epoch() const + { + return _epoch; + } + + double MJD() const { - return _mjd; + return _epoch.MJD(); } // for something like: - // auto [ra, dec, mjd] = coord_pair; - operator std::tuple() const + // auto [ra, dec, epoch] = coord_pair; + operator std::tuple() const { - return {_x, _y, _mjd}; + return {_x, _y, _epoch}; } void setX(const CO_LON_T& x) @@ -96,16 +103,16 @@ public: _y = y; } - void setMJD(double mjd) + void setEpoch(mcc_coord_epoch_c auto const& ep) { - _mjd = mjd; + _epoch = ep; } protected: CO_LON_T _x; CO_LAT_T _y; - double _mjd; + MccCelestialCoordEpoch _epoch; }; @@ -128,7 +135,7 @@ public: template requires(std::is_arithmetic_v && std::is_arithmetic_v) MccNamedCoordPair(CxT const& x, CyT const& y, EpT const& epoch = EpT::now()) - : MccCoordPair(CO_LON_T{x}, CO_LAT_T{y}, epoch) + : MccCoordPair(CO_LON_T{(double)x}, CO_LAT_T{(double)y}, epoch) { } @@ -148,15 +155,62 @@ public: virtual ~MccNamedCoordPair() = default; }; -using MccSkyRADEC_ICRS = MccNamedCoordPair; -using MccSkyRADEC_APP = MccNamedCoordPair; -using MccSkyRADEC_OBS = MccNamedCoordPair; -using MccSkyHADEC_APP = MccNamedCoordPair; -using MccSkyHADEC_OBS = MccNamedCoordPair; -using MccSkyAZZD = MccNamedCoordPair; -using MccSkyAZALT = MccNamedCoordPair; -using MccGenXY = MccNamedCoordPair; -using MccGeoLONLAT = MccNamedCoordPair; +struct MccSkyRADEC_ICRS : MccNamedCoordPair { + template + requires(std::is_arithmetic_v && std::is_arithmetic_v) + MccSkyRADEC_ICRS(CxT const& x, CyT const& y) + : MccNamedCoordPair(x, y, MccCelestialCoordEpoch{}) + { + } + + 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 { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccSkyRADEC_OBS : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccSkyHADEC_APP : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccSkyHADEC_OBS : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccSkyAZZD : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccSkyAZALT : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccGenXY : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; + + +struct MccGeoLONLAT : MccNamedCoordPair { + using MccNamedCoordPair::MccNamedCoordPair; +}; struct mcc_skypoint_interface_t { @@ -211,69 +265,31 @@ concept mcc_skypoint_c = std::derived_from && requi /* MCC-LIBRARY DEFAULT SKY POINT CLASS IMPLEMENTATION BASED ON ERFA-LIBRARY */ -class MccSkyPoint : public mcc_skypoint_interface_t +template +class MccGenericSkyPoint : public mcc_skypoint_interface_t { public: + typedef CCTE_T ccte_t; + static constexpr double MJD0 = 2400000.5; - struct meteo_t { - double temperature; // Temperature in C - double humidity; // humidity in % ([0.0, 1.0]) - double pressure; // atmospheric presure in hPa=mB - }; + inline static CCTE_T cctEngine{}; // celestial coordinates transformation engine - static ccte::iers::MccLeapSeconds iersLeapSeconds() - { - 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() {} + MccGenericSkyPoint() {} template - MccSkyPoint(const PT& coord_pair) : MccSkyPoint() + MccGenericSkyPoint(const PT& coord_pair) : MccGenericSkyPoint() { auto self = from(coord_pair); } - MccSkyPoint(const MccSkyPoint&) = default; - MccSkyPoint(MccSkyPoint&&) = default; + MccGenericSkyPoint(const MccGenericSkyPoint&) = default; + MccGenericSkyPoint(MccGenericSkyPoint&&) = default; - MccSkyPoint& operator=(const MccSkyPoint&) = default; - MccSkyPoint& operator=(MccSkyPoint&&) = default; + MccGenericSkyPoint& operator=(const MccGenericSkyPoint&) = default; + MccGenericSkyPoint& operator=(MccGenericSkyPoint&&) = default; - virtual ~MccSkyPoint() = default; + virtual ~MccGenericSkyPoint() = default; MccCelestialCoordEpoch epoch() const { @@ -281,7 +297,7 @@ public: } template - MccSkyPoint& from(const PT& coord_pair) + MccGenericSkyPoint& from(const PT& coord_pair) { _x = coord_pair.x(); _y = coord_pair.y(); @@ -293,9 +309,11 @@ public: } else { _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); } @@ -312,18 +330,6 @@ public: } 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}; MccCoordPairKind _pairKind{MccCoordPairKind::COORDS_KIND_RADEC_ICRS}; MccCelestialCoordEpoch _epoch{}; // J2000.0 @@ -331,10 +337,6 @@ protected: template auto toHelper(PT& cpair) { - if (this == &cpair) { - return; - } - static constexpr double half_pi = std::numbers::pi / 2.0; // HA, DEC to AZ, ALT (AZ from the South through the West) @@ -385,27 +387,62 @@ protected: 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; - 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_GENERIC, "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 && - PT::pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { - cpair = PT(PT::x_t(_x), PT::y_t(_y), _epoch); - return; + + if (_pairKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { + if constexpr (PT::pairKind == + MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { // from ICRS to ICRS - just copy and exit + cpair = PT(typename PT::x_t(_x), typename PT::y_t(_y)); + + return; + } else { // from ICRS to apparent or observed + if constexpr (mccIsAppCoordPairKind) { + ccte_err = cctEngine.icrsToApp(_x, _y, cpair.epoch(), &ra, &dec, &ha, &az, &zd); + } else if constexpr (mccIsObsCoordPairKind) { + 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 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; } - // if epochs is not the same then + // if epochs are not the same then // 1) convert stored coordinates to ICRS ones // 2) convert from the computed ICRS coordinates to required ones MccCoordPairKind pkind = _pairKind; @@ -413,16 +450,17 @@ protected: if (_pairKind != 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)) { - // cct_engine.obsToICRS(...) + ccte_err = cctEngine.obsToICRS(_pairKind, _epoch, _x, _y, &ra_icrs, &dec_icrs); } 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!!! return; } + + if (ccte_err) { + return; + } } else { ra_icrs = _x; dec_icrs = _y; @@ -432,119 +470,14 @@ protected: // here, from APP or OBS to ICRS and exit if (pkind == 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; } // 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) { - // cct_engine.icrsToObs(...) - } else if constexpr (mccIsAppCoordPairKind) { - // 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!!! + ccte_err = cctEngine.equationOrigins(cpair.MJD(), &eo); + if (ccte_err) { return; } @@ -561,11 +494,15 @@ protected: } else if (pkind == MccCoordPairKind::COORDS_KIND_AZALT) { az = _x; alt = _y; + } else if (pkind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { + ra_icrs = _x; + dec_icrs = _y; } else { // unsupported transformation!!! 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 constexpr (PT::pairKind == MccCoordPairKind::COORDS_KIND_AZZD) { zd = half_pi - alt; @@ -574,6 +511,9 @@ protected: } else { if constexpr (mccIsAppCoordPairKind) { // correct for refraction: alt -= dz_refr + double dZ; + ccte_err = cctEngine.refractionCorrection(half_pi - alt, &dZ); + alt -= dZ; } azalt2hadec(az, alt, phi, ha, dec); @@ -629,6 +569,9 @@ protected: hadec2azalt(ha, dec, phi, az, alt); if constexpr (mccIsObsCoordPairKind) { // RADEC_OBS, HADEC_OBS, AZALT, AZZD // correct for refraction: alt += dz_refr + double dZ; + ccte_err = cctEngine.refractionReverseCorrection(half_pi - alt, &dZ); + alt += dZ; self(MccCoordPairKind::COORDS_KIND_AZALT); } } @@ -650,6 +593,8 @@ protected: } } }; + + comp_func(pkind); // ran transformation } }; diff --git a/mcc/mcc_defaults.h b/mcc/mcc_defaults.h index a5074e8..3e4ad35 100644 --- a/mcc/mcc_defaults.h +++ b/mcc/mcc_defaults.h @@ -98,6 +98,52 @@ public: 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(other).UTC()); + } + + MccCelestialCoordEpoch& operator=(mcc_coord_epoch_c auto&& other) + { + fromTimePoint(std::forward(other).UTC()); + + return *this; + } + + MccCelestialCoordEpoch& operator=(traits::mcc_input_char_range auto&& str) + { + // ignore possible errors!!! + auto ok = fromCharRange(std::forward(str)); + + return *this; + } + + + template + MccCelestialCoordEpoch& operator=(std::chrono::time_point&& tp) + { + // ignore possible errors!!! + auto ok = fromTimePoint(std::forward(tp)); + + return *this; + } + + template + MccCelestialCoordEpoch& operator=(VT&& mjd) + requires std::is_arithmetic_v + { + // ignore possible errors!!! + auto ok = fromMJD(std::forward(mjd)); + + return *this; + } + template bool fromCharRange(IR&& str) { diff --git a/mcc/mcc_generics.h b/mcc/mcc_generics.h index 1073158..64cb388 100644 --- a/mcc/mcc_generics.h +++ b/mcc/mcc_generics.h @@ -142,7 +142,8 @@ static constexpr void mcc_tp2tp(const T1& from_tp1, T2& to_tp) /* JULIAN DAY CLASS CONCEPT */ template -concept mcc_julday_c = mcc_fp_type_like_c && requires(const T v) { +concept mcc_julday_c = mcc_fp_type_like_c || requires(const T v) { + // concept mcc_julday_c = mcc_fp_type_like_c && requires(const T v) { // modified Julian Day { v.MJD() } -> std::convertible_to; // comparison operators diff --git a/mcc/mcc_utils.h b/mcc/mcc_utils.h index eb0740c..8c7cdde 100644 --- a/mcc/mcc_utils.h +++ b/mcc/mcc_utils.h @@ -244,6 +244,10 @@ static R rad2sxg(double ang, bool hms = false, int prec = 2) 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 s = (degs - d) * 60.0; auto m = std::trunc(s); @@ -261,7 +265,9 @@ static R rad2sxg(double ang, bool hms = false, int prec = 2) } 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)); diff --git a/mcc/tests/mcc_coord_test.cpp b/mcc/tests/mcc_coord_test.cpp new file mode 100644 index 0000000..3dbf83c --- /dev/null +++ b/mcc/tests/mcc_coord_test.cpp @@ -0,0 +1,67 @@ +#include + +#include "../mcc_ccte_erfa_new.h" +#include "../mcc_coord.h" + +using namespace mcc; + +typedef MccGenericSkyPoint 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, "!!!!!!!!!!!!"); + +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; +}