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)
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()

View File

@ -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 <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,
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<ZAPP_T> ||
(std::is_pointer_v<ZAPP_T> && mcc_angle_c<std::remove_pointer_t<ZAPP_T>>))
{
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_T>) {
*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 <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,
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<ZOBS_T> ||
(std::is_pointer_v<ZOBS_T> && mcc_angle_c<std::remove_pointer_t<ZOBS_T>>))
{
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_T>) {
*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<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) {

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
# 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
)--";

View File

@ -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<CO_LON_T, MccAngleAZ> && std::same_as<CO_LAT_T, MccAngleALT>)
? MccCoordPairKind::COORDS_KIND_AZZD
? MccCoordPairKind::COORDS_KIND_AZALT
// general purpose X and Y
: (std::same_as<CO_LON_T, MccAngleX> && std::same_as<CO_LAT_T, MccAngleY>)
? MccCoordPairKind::COORDS_KIND_XY
@ -52,7 +53,7 @@ public:
: MccCoordPairKind::COORDS_KIND_UNKNOWN;
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;
}
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<CO_LON_T, CO_LAT_T, double>() const
// auto [ra, dec, epoch] = coord_pair;
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)
@ -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 <typename CxT, typename CyT, mcc_coord_epoch_c EpT = MccCelestialCoordEpoch>
requires(std::is_arithmetic_v<CxT> && std::is_arithmetic_v<CyT>)
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;
};
using MccSkyRADEC_ICRS = MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS>;
using MccSkyRADEC_APP = MccNamedCoordPair<MccAngleRA_APP, MccAngleDEC_APP>;
using MccSkyRADEC_OBS = MccNamedCoordPair<MccAngleRA_OBS, MccAngleDEC_OBS>;
using MccSkyHADEC_APP = MccNamedCoordPair<MccAngleHA_APP, MccAngleDEC_APP>;
using MccSkyHADEC_OBS = MccNamedCoordPair<MccAngleHA_OBS, MccAngleDEC_OBS>;
using MccSkyAZZD = MccNamedCoordPair<MccAngleAZ, MccAngleZD>;
using MccSkyAZALT = MccNamedCoordPair<MccAngleAZ, MccAngleALT>;
using MccGenXY = MccNamedCoordPair<MccAngleX, MccAngleY>;
using MccGeoLONLAT = MccNamedCoordPair<MccAngleLON, MccAngleLAT>;
struct MccSkyRADEC_ICRS : MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS> {
template <typename CxT, typename CyT>
requires(std::is_arithmetic_v<CxT> && std::is_arithmetic_v<CyT>)
MccSkyRADEC_ICRS(CxT const& x, CyT const& y)
: MccNamedCoordPair<MccAngleRA_ICRS, MccAngleDEC_ICRS>(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<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 {
@ -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 */
class MccSkyPoint : public mcc_skypoint_interface_t
template <typename CCTE_T>
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 <mcc_coord_pair_c PT>
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 <mcc_coord_pair_c PT>
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 <mcc_coord_pair_c PT>
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<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
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<PT::pairKind>) {
// cct_engine.icrsToObs(...)
} 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!!!
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<PT::pairKind>) {
// 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<PT::pairKind>) { // 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
}
};

View File

@ -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<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>
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 */
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
{ v.MJD() } -> std::convertible_to<double>;
// comparison operators

View File

@ -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));

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;
}