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 jds_to_mjds_pulsar(jd1, jd2): # Do the reverse of the above calculation # Note this will return an incorrect value during # leap seconds, so raise an exception in that # case. y, mo, d, hmsf = erfa.d2dtf("UTC", _digits, jd1, jd2) # For ASTROPY_LT_3_1, convert to the new structured array dtype that # is returned by the new erfa gufuncs. if not hmsf.dtype.names: hmsf = hmsf.view(_new_ihmsfs_dtype)[..., 0] if np.any((hmsf["s"] == 60) & (hmsf["f"] != 0)): # if f is exactly zero, this is probably fine to treat as the end of the day. raise ValueError( "UTC times during a leap second cannot be represented in pulsar_mjd format" ) j1, j2 = erfa.cal2jd(y, mo, d) return day_frac( j1 - erfa.DJM0 + j2, hmsf["h"] / 24.0 + hmsf["m"] / 1440.0 + hmsf["s"] / 86400.0 + hmsf["f"] / 86400.0 / 10**_digits, )
DUT1 = -0.072073685 # Nutation corrections wrt IAU 1976/1980 (mas->radians) DDP80 = -55.0655 * AS2R / 1000. DDE80 = -6.3580 * AS2R / 1000. # CIP offsets wrt IAU 2000A (mas->radians) DX00 = 0.1725 * AS2R / 1000. DY00 = -0.2650 * AS2R / 1000. # CIP offsets wrt IAU 2006/2000A (mas->radians) DX06 = 0.1750 * AS2R / 1000. DY06 = -0.2259 * AS2R / 1000. # TT (MJD) DJMJD0, DATE = erfa.cal2jd(IY, IM, ID) TIME = (60 * (60 * IH + MIN) + SEC) / 86400. UTC = DATE + TIME DAT = erfa.dat(IY, IM, ID, TIME) TAI = UTC + DAT / 86400. TT = TAI + 32.184 / 86400. # UT1 TUT = TIME + DUT1 / 86400. UT1 = DATE + TUT print("UTC :%4d/%2.2d/%2.2d%3d:%2.2d:%2.2d.%3.3d" % erfa.d2dtf(3, *erfa.dtf2d(IY, IM, ID, IH, MIN, SEC))) print("TT = 2400000.5 + %.17f " % TT) print("UT1 = 2400000.5 + %.17f " % UT1)
DUT1 = -0.072073685 # Nutation corrections wrt IAU 1976/1980 (mas->radians) DDP80 = -55.0655 * AS2R/1000. DDE80 = -6.3580 * AS2R/1000. # CIP offsets wrt IAU 2000A (mas->radians) DX00 = 0.1725 * AS2R/1000. DY00 = -0.2650 * AS2R/1000. # CIP offsets wrt IAU 2006/2000A (mas->radians) DX06 = 0.1750 * AS2R/1000. DY06 = -0.2259 * AS2R/1000. # TT (MJD) DJMJD0, DATE = erfa.cal2jd(IY, IM, ID) TIME = ( 60*(60*IH + MIN) + SEC ) / 86400. UTC = DATE + TIME DAT = erfa.dat(IY, IM, ID, TIME) TAI = UTC + DAT/86400. TT = TAI + 32.184/86400. # UT1 TUT = TIME + DUT1/86400. UT1 = DATE + TUT print("UTC :%4d/%2.2d/%2.2d%3d:%2.2d:%2.2d.%3.3d"%erfa.d2dtf(3, *erfa.dtf2d(IY, IM, ID, IH, MIN, SEC))) print("TT = 2400000.5 + %.17f "%TT) print("UT1 = 2400000.5 + %.17f "%UT1) print('''
#Report to 1 ms precision. ihmsf = erfa.d2tf(3, f) print("%s%2d:%2.2d:%2.2d.%3.3d\n" % ihmsf) print('=====') print(''' Date and time.''') iy = 2008 im = 2 id = 29 ihour = 23 imin = 59 sec = 59.9 print("%4d/%2.2d/%2.2d%3d:%2.2d:%4.1f\n" % (iy, im, id, ihour, imin, sec)) print('Express as 2-part JD.') d1, d2 = erfa.cal2jd(iy, im, id) d = erfa.tf2d(ihour, imin, sec) d2 += d print("%9.1f +%13.6f =%15.6f\n" % (d1, d2, d1 + d)) print('Express as calendar date and fraction of a day.') iy, im, id, fd = erfa.jd2cal(d1, d2) d = id + fd print("%4d/%2.2d/%9.6f\n" % (iy, im, d)) print('Round to 0.001 day.') iymdf = erfa.jdcalf(3, d1, d2) print("%4d/%2.2d/%2.2d.%3.3d\n" % iymdf) print('=====') print(''' Besselian and Julian epochs''') print('Julian Date.') d = 2457073.05631
print('Six hours earlier:') f -= 0.25 #Report to 1 ms precision. ihmsf = erfa.d2tf(3, f) print ( "%s%2d:%2.2d:%2.2d.%3.3d\n"%ihmsf) print('=====') print(''' Date and time.''') iy = 2008; im = 2; id = 29; ihour = 23; imin = 59; sec = 59.9; print("%4d/%2.2d/%2.2d%3d:%2.2d:%4.1f\n"% (iy, im, id, ihour, imin, sec)) print('Express as 2-part JD.') d1, d2 = erfa.cal2jd ( iy, im, id) d = erfa.tf2d (ihour, imin, sec) d2 += d print("%9.1f +%13.6f =%15.6f\n"%( d1, d2, d1 + d)) print('Express as calendar date and fraction of a day.') iy, im, id, fd = erfa.jd2cal(d1, d2) d = id + fd print( "%4d/%2.2d/%9.6f\n"%(iy, im, d)) print('Round to 0.001 day.') iymdf = erfa.jdcalf ( 3, d1, d2) print( "%4d/%2.2d/%2.2d.%3.3d\n"%iymdf) print('=====') print(''' Besselian and Julian epochs''') print('Julian Date.') d = 2457073.05631