def _test_erfa_conversion(leap, i_f): i_i, f_i = i_f assume(0 <= f_i < 1) if leap: assume(i_i in leap_sec_days) else: assume(i_i not in leap_sec_days) jd1_in, jd2_in = day_frac(erfa.DJM0 + i_i, f_i) y, mo, d, f = erfa.jd2cal(jd1_in, jd2_in) assert 0 < y < 3000 assert 0 < mo <= 12 assert 0 <= d < 32 assert 0 <= f < 1 jd1_temp, jd2_temp = erfa.cal2jd(y, mo, d) jd1_temp, jd2_temp = day_frac(jd1_temp, jd2_temp) # improve numerics jd1_temp, jd2_temp = day_frac(jd1_temp, jd2_temp + f) jd_change = abs((jd1_temp - jd1_in) + (jd2_temp - jd2_in)) * u.day assert jd_change.to(u.ns) < 1 * u.ns ft = 24 * f h = safe_kind_conversion(np.floor(ft), dtype=int) ft -= h ft *= 60 m = safe_kind_conversion(np.floor(ft), dtype=int) ft -= m ft *= 60 s = ft assert 0 <= h < 24 assert 0 <= m < 60 assert 0 <= s < 60 jd1, jd2 = erfa.dtf2d("UTC", y, mo, d, h, m, s) y2, mo2, d2, f2 = erfa.jd2cal(jd1, jd2) # assert (y, mo, d) == (y2, mo2, d2) # assert (abs(f2-f)*u.day).to(u.s) < 1*u.ns assert jd1 == np.floor(jd1) + 0.5 assert 0 <= jd2 < 1 jd1, jd2 = day_frac(jd1, jd2) jd_change = abs((jd1 - jd1_in) + (jd2 - jd2_in)) * u.day if leap: assert jd_change.to(u.s) < 1 * u.s else: assert jd_change.to(u.ns) < 2 * u.ns # assert jd_change.to(u.ns) < 1 * u.ns return i_o, f_o = day_frac(jd1 - erfa.DJM0, jd2) mjd_change = abs((i_o - i_i) + (f_o - f_i)) * u.day if leap: assert mjd_change.to(u.s) < 1 * u.s else: assert mjd_change.to(u.ns) < 1 * u.ns
def test_day_frac(i_f): assert_closer_than_ns(day_frac(*i_f), i_f, 1)
def test_time_to_longdouble_via_jd(scale, i_f): i, f = i_f jd1, jd2 = day_frac(i + erfa.DJM0, f) t = Time(val=jd1, val2=jd2, format="jd", scale=scale) ld = np.longdouble(i) + np.longdouble(f) assert (abs(time_to_longdouble(t) - ld) * u.day).to(u.ns) < 1 * u.ns
def test_time_construction_mjd_versus_jd(scale, i_f): i, f = i_f jd1, jd2 = day_frac(i + erfa.DJM0, f) t = Time(val=jd1, val2=jd2, format="jd", scale=scale) t2 = Time(val=i, val2=f, format="mjd", scale=scale) assert abs(t - t2).to(u.ns) < 1 * u.ns
def test_time_construction_mjds_preserved(i_f): i, f = i_f t = Time(val=i, val2=f, format="mjd", scale="tai") jd1, jd2 = day_frac(i + erfa.DJM0, f) jd1_t, jd2_t = day_frac(t.jd1, t.jd2) assert (abs((jd1 - jd1_t) + (jd2 - jd2_t)) * u.day).to(u.ns) < 1 * u.ns
def test_time_construction_jds_exact(scale, i_f): i, f = i_f jd1, jd2 = day_frac(i + erfa.DJM0, f) t = Time(val=jd1, val2=jd2, format="jd", scale=scale) jd1_t, jd2_t = day_frac(t.jd1, t.jd2) assert (jd1, jd2) == (jd1_t, jd2_t)