def test_tdb2tt(): epsilon = 1e-16 tt0 = c.tdb2tt(T0)[1] ttA = c.tdb2tt(TA)[1] ttB = c.tdb2tt(TB)[1] t = array([T0, TA, TB]) v = timescales.tdb_minus_tt(t) eq(v, [tt0, ttA, ttB], epsilon)
def test_tdb2tt(self): self.delta = 1e-16 tt0 = c.tdb2tt(T0)[1] ttA = c.tdb2tt(TA)[1] ttB = c.tdb2tt(TB)[1] t = array([T0, TA, TB]) v = timescales.tdb_minus_tt(t) self.eq(v, [tt0, ttA, ttB])
def output_subroutine_tests(dates): date_floats = [d for d in dates if not isinstance(d, list)] delta_t_floats = [+39.707, +57.1136, +63.8285, +66.7846] def shorter_cal_date(jd): y, m, d, h = novas.cal_date(jd) return y, m, d + h / 24.0 - 0.5 for i, jd in enumerate(date_floats): cal_date = call(shorter_cal_date, jd) output( locals(), """\ def test_calendar_date_{i}(): compare(timelib.calendar_date({jd!r}), array({cal_date}), 0.0) """) for i, jd in enumerate(date_floats): angle = novas.era(jd) output( locals(), """\ def test_earth_rotation_angle_date{i}(): compare(earthlib.earth_rotation_angle({jd!r}) * 360.0, {angle!r}, 0.000001 * arcsecond) """) for i, jd in enumerate(date_floats): angles = novas.e_tilt(jd) output( locals(), """\ def test_earth_tilt_date{i}(ts): compare(nutationlib.earth_tilt(ts.tdb_jd({jd!r})), array({angles}), 0.00001 * arcsecond) """) for i, jd in enumerate(date_floats): terms = novas.ee_ct(jd, 0.0, 0) output( locals(), """\ def test_equation_of_the_equinoxes_complimentary_terms_date{i}(): compare(nutationlib.equation_of_the_equinoxes_complimentary_terms({jd!r}), array({terms!r}), 0.0000000000000001 * arcsecond) """) vector = (1.1, 1.2, 1.3) tie1 = novas.frame_tie(vector, 0) tie2 = novas.frame_tie(vector, -1) output( locals(), """\ def test_forward_frame_tie(): compare(framelib.ICRS_to_J2000.dot({vector}), {tie1}, 1e-15) def test_reverse_frame_tie(): compare(framelib.ICRS_to_J2000.T.dot({vector}), {tie2}, 1e-15) """) for i, jd in enumerate(date_floats): jcentury = (jd - T0) / 36525.0 arguments = novas.fund_args(jcentury) output( locals(), """\ def test_fundamental_arguments_date{i}(): compare(nutationlib.fundamental_arguments({jcentury!r}), array({arguments}), 0.000000002 * arcsecond) """) for i, jd in enumerate(date_floats): psi, eps = nutation_module.iau2000a(jd, 0.0) psi *= 1e7 / ASEC2RAD eps *= 1e7 / ASEC2RAD output( locals(), """\ def test_iau2000a_date{i}(): compare(nutationlib.iau2000a({jd!r}), array([{psi!r}, {eps!r}]), 0.001) """) for i, jd in enumerate(date_floats): psi, eps = nutation_module.iau2000b(jd, 0.0) psi *= 1e7 / ASEC2RAD eps *= 1e7 / ASEC2RAD output( locals(), """\ def test_iau2000b_date{i}(): compare(nutationlib.iau2000b({jd!r}), array([{psi!r}, {eps!r}]), 0.001) """) for i, args in enumerate([ (-4712, 1, 1, 0.0), (-4712, 3, 1, 0.0), (-4712, 12, 31, 0.5), (-241, 3, 25, 19.0), (530, 9, 27, 23.5), (1976, 3, 7, 12.5), (2000, 1, 1, 0.0), ]): jd = novas.julian_date(*args) output( locals(), """\ def test_julian_date_function_date{i}(): compare(timelib.julian_date{args}, {jd!r}, 0.0) """) for i, jd in enumerate(date_floats): angle = novas.mean_obliq(jd) output( locals(), """\ def test_mean_obliquity_date{i}(): compare(nutationlib.mean_obliquity({jd!r}), {angle!r}, 0.0) # arcseconds """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = nutation_function(jd, vector) output( locals(), """\ def test_nutation_date{i}(ts): matrix = nutationlib.compute_nutation(ts.tdb_jd({jd!r})) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-14) """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = novas.precession(T0, vector, jd) output( locals(), """\ def test_precession_date{i}(): matrix = precessionlib.compute_precession({jd!r}) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-15) """) for i, jd in enumerate(date_floats): result1 = novas.sidereal_time(jd, 0.0, 0.0, False, True) result2 = novas.sidereal_time(jd, 0.0, 99.9, False, True) output( locals(), """\ def test_sidereal_time_on_date{i}(): jd = load.timescale(delta_t=0.0).tt_jd({jd!r}) compare(earthlib.sidereal_time(jd), {result1!r}, 1e-13) def test_sidereal_time_with_nonzero_delta_t_on_date{i}(): jd = load.timescale(delta_t=99.9).tt_jd({jd!r} + 99.9 * one_second) compare(earthlib.sidereal_time(jd), {result2!r}, 1e-13) """) p, v = novas.starvectors( novas.make_cat_entry('POLARIS', 'HIP', 0, 2.530301028, 89.264109444, 44.22, -11.75, 7.56, -17.4)) output( locals(), """\ def test_star_vector(): star = starlib.Star(ra_hours=2.530301028, dec_degrees=89.264109444, ra_mas_per_year=44.22, dec_mas_per_year=-11.75, parallax_mas=7.56, radial_km_per_s=-17.4) star.au_km = OLD_AU_KM star._compute_vectors() compare(star._position_au, {p!r}, 1e3 * meter) compare(star._velocity_au_per_d, {v!r}, 1e-3 * meter) # TODO: was 1e-6 before switch to modern au """) atp = product([-5, -1, 15, 89.95], [10, 25], [1010, 1013.25]) for i, (angle, temperature, pressure) in enumerate(atp): location = novas.make_on_surface(0.0, 0.0, 0, temperature, pressure) r = novas.refract(location, 90 - angle, 2) output( locals(), """\ def test_refraction{i}(): r = earthlib.refraction({angle}, {temperature}, {pressure}) compare(r, {r!r}, 1e-9 * arcsecond) """) northpole = novas.make_on_surface(90.0, 0.0, 0.0, 10.0, 1010.0) for i, angle in enumerate([-90, -2, -1, 0, 1, 3, 9, 90]): alt, az = altaz_maneuver(T0, northpole, 0.0, angle, ref=2) output( locals(), """\ def test_refract{i}(): alt = earthlib.refract({angle!r}, 10.0, 1010.0) compare(alt, {alt!r}, 1e-9 * arcsecond) """) usno = novas.make_on_surface(38.9215, -77.0669, 92.0, 10.0, 1010.0) ra = 12.34 for i, (tt, dec) in enumerate(product(date_floats, [56.78, -67.89])): alt, az = altaz_maneuver(tt, usno, ra, dec, ref=0) output( locals(), """\ def test_from_altaz_{i}(earth): jd = load.timescale(delta_t=0.0).tt_jd({tt!r}) usno = earth + Topos( '38.9215 N', '77.0669 W', elevation_m=92.0) a = usno.at(jd).from_altaz(alt_degrees={alt!r}, az_degrees={az!r}) ra, dec, distance = a.radec(epoch=jd) compare(ra.hours, {ra!r}, 1e-9 * arcsecond) compare(dec.degrees, {dec!r}, 1e-9 * arcsecond) """) for i, (tt, delta_t) in enumerate(zip(date_floats, delta_t_floats)): jd_low = xp = yp = 0.0 vector = [1.1, 1.2, 1.3] ut1 = tt - delta_t * one_second result = novas.ter2cel(ut1, jd_low, delta_t, xp, yp, vector) output( locals(), """\ def test_ITRF_to_GCRS_conversion_on_date{i}(): jd = load.timescale(delta_t={delta_t!r}).tt_jd({tt!r}) position = positionlib.ITRF_to_GCRS(jd, {vector!r}) compare(position, {result!r}, 1e-13) """) for i, jd_tdb in enumerate(date_floats): result = novas.tdb2tt(jd_tdb)[1] output( locals(), """\ def test_tdb_minus_tt_on_date{i}(): result = timelib.tdb_minus_tt({jd_tdb!r}) compare(result, {result!r}, 1e-16) """)
def test_tdb2tt(jd_float_or_vector): jd_tdb = jd_float_or_vector u = c.tdb2tt(jd_tdb)[1] v = timelib.tdb_minus_tt(jd_tdb) epsilon_seconds = 1e-16 # 11 or 12 digits of agreement; why not more? eq(u, v, epsilon_seconds)
def output_subroutine_tests(dates): date_floats = [d for d in dates if not isinstance(d, list)] delta_t_floats = [+39.707, +57.1136, +63.8285, +66.7846] def shorter_cal_date(jd): y, m, d, h = novas.cal_date(jd) return y, m, d + h / 24.0 - 0.5 for i, jd in enumerate(date_floats): cal_date = call(shorter_cal_date, jd) output(locals(), """\ def test_calendar_date_{i}(): compare(timelib.calendar_date({jd!r}), array({cal_date}), 0.0) """) for i, jd in enumerate(date_floats): angle = novas.era(jd) output(locals(), """\ def test_earth_rotation_angle_date{i}(): compare(earthlib.earth_rotation_angle({jd!r}) * 360.0, {angle}, 0.000001 * arcsecond) """) for i, jd in enumerate(date_floats): angles = novas.e_tilt(jd) output(locals(), """\ def test_earth_tilt_date{i}(): compare(nutationlib.earth_tilt(JulianDate(tdb={jd!r})), array({angles}), 0.00001 * arcsecond) """) for i, jd in enumerate(date_floats): terms = novas.ee_ct(jd, 0.0, 0) output(locals(), """\ def test_equation_of_the_equinoxes_complimentary_terms_date{i}(): compare(nutationlib.equation_of_the_equinoxes_complimentary_terms({jd!r}), array({terms}), 0.0000000000000001 * arcsecond) """) vector = (1.1, 1.2, 1.3) tie1 = novas.frame_tie(vector, 0) tie2 = novas.frame_tie(vector, -1) output(locals(), """\ def test_forward_frame_tie(): compare(framelib.ICRS_to_J2000.dot({vector}), {tie1}, 1e-15) def test_reverse_frame_tie(): compare(framelib.ICRS_to_J2000.T.dot({vector}), {tie2}, 1e-15) """) for i, jd in enumerate(date_floats): jcentury = (jd - T0) / 36525.0 arguments = novas.fund_args(jcentury) output(locals(), """\ def test_fundamental_arguments_date{i}(): compare(nutationlib.fundamental_arguments({jcentury!r}), array({arguments}), 0.000000002 * arcsecond) """) for i, jd in enumerate(date_floats): psi, eps = nutation_module.iau2000a(jd, 0.0) psi *= 1e7 / ASEC2RAD eps *= 1e7 / ASEC2RAD output(locals(), """\ def test_iau2000a_date{i}(): compare(nutationlib.iau2000a({jd!r}), array([{psi}, {eps}]), 0.001) """) for i, args in enumerate([ (-4712, 1, 1, 0.0), (-4712, 3, 1, 0.0), (-4712, 12, 31, 0.5), (-241, 3, 25, 19.0), (530, 9, 27, 23.5), (1976, 3, 7, 12.5), (2000, 1, 1, 0.0), ]): jd = novas.julian_date(*args) output(locals(), """\ def test_julian_date_function_date{i}(): compare(timelib.julian_date{args}, {jd!r}, 0.0) """) for i, jd in enumerate(date_floats): angle = novas.mean_obliq(jd) output(locals(), """\ def test_mean_obliquity_date{i}(): compare(nutationlib.mean_obliquity({jd!r}), {angle!r}, 0.0) # arcseconds """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = nutation_function(jd, vector) output(locals(), """\ def test_nutation_date{i}(): matrix = nutationlib.compute_nutation(JulianDate(tdb={jd!r})) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-14) """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = novas.precession(T0, vector, jd) output(locals(), """\ def test_precession_date{i}(): matrix = precessionlib.compute_precession({jd!r}) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-15) """) for i, jd in enumerate(date_floats): result1 = novas.sidereal_time(jd, 0.0, 0.0, False, True) result2 = novas.sidereal_time(jd, 0.0, 99.9, False, True) output(locals(), """\ def test_sidereal_time_on_date{i}(): jd = JulianDate(tt={jd!r}) compare(earthlib.sidereal_time(jd), {result1!r}, 1e-13) def test_sidereal_time_with_nonzero_delta_t_on_date{i}(): jd = JulianDate(tt={jd!r} + 99.9 * one_second, delta_t=99.9) compare(earthlib.sidereal_time(jd), {result2!r}, 1e-13) """) p, v = novas.starvectors(novas.make_cat_entry( 'POLARIS', 'HIP', 0, 2.530301028, 89.264109444, 44.22, -11.75, 7.56, -17.4)) output(locals(), """\ def test_star_vector(): star = starlib.Star(ra_hours=2.530301028, dec_degrees=89.264109444, ra_mas_per_year=44.22, dec_mas_per_year=-11.75, parallax_mas=7.56, radial_km_per_s=-17.4) star.au_km = de405.jplephemeris.AU star._compute_vectors() compare(star._position_au, {p!r}, 1e3 * meter) compare(star._velocity_au_per_d, {v!r}, 1e-3 * meter) # TODO: was 1e-6 before switch to modern au """) atp = product([-5, -1, 15, 89.95], [10, 25], [1010, 1013.25]) for i, (angle, temperature, pressure) in enumerate(atp): location = novas.make_on_surface(0.0, 0.0, 0, temperature, pressure) r = novas.refract(location, 90 - angle, 2) output(locals(), """\ def test_refraction{i}(): r = earthlib.refraction({angle}, {temperature}, {pressure}) compare(r, {r}, 0.001 * arcsecond) """) northpole = novas.make_on_surface(90.0, 0.0, 0.0, 10.0, 1010.0) for i, angle in enumerate([-90, -2, -1, 0, 1, 3, 9, 90]): alt, az = altaz_maneuver(T0, northpole, 0.0, angle, ref=2) output(locals(), """\ def test_refract{i}(): alt = earthlib.refract({angle!r}, 10.0, 1010.0) compare(alt, {alt!r}, 0.000000001 * arcsecond) """) usno = novas.make_on_surface(38.9215, -77.0669, 92.0, 10.0, 1010.0) ra = 12.34 for i, (tt, dec) in enumerate(product(date_floats, [56.78, -67.89])): alt, az = altaz_maneuver(tt, usno, ra, dec, ref=0) output(locals(), """\ def test_from_altaz_{i}(): jd = JulianDate(tt={tt!r}) usno = de405.earth.topos( '38.9215 N', '77.0669 W', elevation_m=92.0) a = usno(jd).from_altaz(alt_degrees={alt!r}, az_degrees={az!r}) ra, dec, distance = a.radec(epoch=jd) compare(ra.hours, {ra!r}, 0.000000001 * arcsecond) compare(dec.degrees, {dec!r}, 0.000000001 * arcsecond) """) for i, (tt, delta_t) in enumerate(zip(date_floats, delta_t_floats)): jd_low = xp = yp = 0.0 vector = [1.1, 1.2, 1.3] ut1 = tt - delta_t * one_second result = novas.ter2cel(ut1, jd_low, delta_t, xp, yp, vector) output(locals(), """\ def test_ITRF_to_GCRS_conversion_on_date{i}(): jd = JulianDate(tt={tt!r}, delta_t={delta_t!r}) position = positionlib.ITRF_to_GCRS(jd, {vector!r}) compare(position, {result!r}, 1e-13) """) for i, jd_tdb in enumerate(date_floats): result = novas.tdb2tt(jd_tdb)[1] output(locals(), """\ def test_tdb_minus_tt_on_date{i}(): result = timelib.tdb_minus_tt({jd_tdb!r}) compare(result, {result!r}, 1e-16) """)
def jdTDB(self, jd_utc): jd_tt = self.jdTT(jd_utc) _, tdb_tt = novas.tdb2tt(jd_tt) jd_tdb = jd_tt + tdb_tt / (24.0 * 60 * 60) return jd_tdb
def output_subroutine_tests(dates): date_floats = [d for d in dates if not isinstance(d, list)] delta_t_floats = [+39.707, +57.1136, +63.8285, +66.7846] def shorter_cal_date(jd): y, m, d, h = novas.cal_date(jd) return y, m, d + h / 24.0 - 0.5 for i, jd in enumerate(date_floats): cal_date = call(shorter_cal_date, jd) output(locals(), """\ def test_calendar_date_{i}(): compare(timelib.calendar_date({jd!r}), array({cal_date}), 0.0) """) for i, jd in enumerate(date_floats): angle = novas.era(jd) output(locals(), """\ def test_earth_rotation_angle_date{i}(): compare(earthlib.earth_rotation_angle({jd!r}), {angle}, 0.000001 * arcsecond) """) for i, jd in enumerate(date_floats): angles = novas.e_tilt(jd) output(locals(), """\ def test_earth_tilt_date{i}(): compare(nutationlib.earth_tilt(JulianDate(tdb={jd!r})), array({angles}), 0.00001 * arcsecond) """) for i, jd in enumerate(date_floats): terms = novas.ee_ct(jd, 0.0, 0) output(locals(), """\ def test_equation_of_the_equinoxes_complimentary_terms_date{i}(): compare(nutationlib.equation_of_the_equinoxes_complimentary_terms({jd!r}), array({terms}), 0.0000000000000001 * arcsecond) """) vector = (1.1, 1.2, 1.3) tie1 = novas.frame_tie(vector, 0) tie2 = novas.frame_tie(vector, -1) output(locals(), """\ def test_forward_frame_tie(): compare(framelib.ICRS_to_J2000.dot({vector}), {tie1}, 1e-15) def test_reverse_frame_tie(): compare(framelib.ICRS_to_J2000.T.dot({vector}), {tie2}, 1e-15) """) for i, jd in enumerate(date_floats): jcentury = (jd - T0) / 36525.0 arguments = novas.fund_args(jcentury) output(locals(), """\ def test_fundamental_arguments_date{i}(): compare(nutationlib.fundamental_arguments({jcentury!r}), array({arguments}), 0.000000001 * arcsecond) """) for i, jd in enumerate(date_floats): psi, eps = nutation_module.iau2000a(jd, 0.0) psi *= 1e7 / ASEC2RAD eps *= 1e7 / ASEC2RAD output(locals(), """\ def test_iau2000a_date{i}(): compare(nutationlib.iau2000a({jd!r}), array([{psi}, {eps}]), 0.001) """) for i, args in enumerate([ (-4712, 1, 1, 0.0), (-4712, 3, 1, 0.0), (-4712, 12, 31, 0.5), (-241, 3, 25, 19.0), (530, 9, 27, 23.5), (1976, 3, 7, 12.5), (2000, 1, 1, 0.0), ]): jd = novas.julian_date(*args) output(locals(), """\ def test_julian_date_function_date{i}(): compare(timelib.julian_date{args}, {jd!r}, 0.0) """) for i, jd in enumerate(date_floats): angle = novas.mean_obliq(jd) output(locals(), """\ def test_mean_obliquity_date{i}(): compare(nutationlib.mean_obliquity({jd!r}), {angle!r}, 0.0) # arcseconds """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = nutation_function(jd, vector) output(locals(), """\ def test_nutation_date{i}(): matrix = nutationlib.compute_nutation(JulianDate(tdb={jd!r})) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-14) """) for i, jd in enumerate(date_floats): vector = [1.1, 1.2, 1.3] result = novas.precession(T0, vector, jd) output(locals(), """\ def test_precession_date{i}(): matrix = precessionlib.compute_precession({jd!r}) result = einsum('ij...,j...->i...', matrix, [1.1, 1.2, 1.3]) compare({result}, result, 1e-15) """) for i, jd in enumerate(date_floats): result1 = novas.sidereal_time(jd, 0.0, 0.0, False, True) result2 = novas.sidereal_time(jd, 0.0, 99.9, False, True) output(locals(), """\ def test_sidereal_time_on_date{i}(): jd = JulianDate(tt={jd!r}) compare(earthlib.sidereal_time(jd), {result1!r}, 1e-13) def test_sidereal_time_with_nonzero_delta_t_on_date{i}(): jd = JulianDate(tt={jd!r} + 99.9 * one_second, delta_t=99.9) compare(earthlib.sidereal_time(jd), {result2!r}, 1e-13) """) p, v = novas.starvectors(novas.make_cat_entry( 'POLARIS', 'HIP', 0, 2.530301028, 89.264109444, 44.22, -11.75, 7.56, -17.4)) output(locals(), """\ def test_star_vector(): star = starlib.Star(ra_hours=2.530301028, dec_degrees=89.264109444, ra_mas_per_year=44.22, dec_mas_per_year=-11.75, parallax_mas=7.56, radial_km_per_s=-17.4) compare(star._position, {p}, 1e3 * meter) compare(star._velocity, {v}, 1e-6 * meter) """) for i, (tt, delta_t) in enumerate(zip(date_floats, delta_t_floats)): jd_low = xp = yp = 0.0 vector = [1.1, 1.2, 1.3] ut1 = tt - delta_t * one_second result = novas.ter2cel(ut1, jd_low, delta_t, xp, yp, vector) output(locals(), """\ def test_ITRF_to_GCRS_conversion_on_date{i}(): jd = JulianDate(tt={tt!r}, delta_t={delta_t!r}) position = positionlib.ITRF_to_GCRS(jd, {vector!r}) compare(position, {result!r}, 1e-13) """) for i, jd_tdb in enumerate(date_floats): result = novas.tdb2tt(jd_tdb)[1] output(locals(), """\ def test_tdb_minus_tt_on_date{i}(): result = timelib.tdb_minus_tt({jd_tdb!r}) compare(result, {result!r}, 1e-16) """)