Esempio n. 1
0
def test_compare_calculate_trajectory_iterator_cartesians(
        pos_vec, vel_vec, q, M, a, Q, el, ss):
    cl1 = KerrNewman.from_cartesian(pos_vec, vel_vec, q, 0 * u.s, M, a, Q)
    cl2 = KerrNewman.from_cartesian(pos_vec, vel_vec, q, 0 * u.s, M, a, Q)
    ans1 = cl1.calculate_trajectory(end_lambda=el,
                                    OdeMethodKwargs={"stepsize": ss},
                                    return_cartesian=True)[1]
    it = cl2.calculate_trajectory_iterator(OdeMethodKwargs={"stepsize": ss},
                                           return_cartesian=True)
    ans2 = list()
    for _, val in zip(range(20), it):
        ans2.append(val[1])
    ans2 = np.array(ans2)
    print(ans1)
    assert_allclose(ans1[:20], ans2)
def test_calculate_trajectory0():
    # Based on the revolution of earth around sun
    # Data from https://en.wikipedia.org/wiki/Earth%27s_orbit
    # Initialialized with cartesian coordinates
    # Function returning cartesian coordinates
    M = 1.989e30 * u.kg
    q = 0 * u.C / u.kg
    Q = 0 * u.C
    distance_at_perihelion = 147.10e6 * u.km
    speed_at_perihelion = 30.29 * u.km / u.s
    cart_obj = CartesianDifferential(
        distance_at_perihelion / np.sqrt(2),
        distance_at_perihelion / np.sqrt(2),
        0 * u.km,
        -1 * speed_at_perihelion / np.sqrt(2),
        speed_at_perihelion / np.sqrt(2),
        0 * u.km / u.h,
    )
    a = 0 * u.m
    end_lambda = ((1 * u.year).to(u.s)).value
    cl = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
    ans = cl.calculate_trajectory(
        start_lambda=0.0,
        end_lambda=end_lambda,
        return_cartesian=True,
        OdeMethodKwargs={"stepsize": end_lambda / 1.5e3},
    )[1]
    # velocity should be 29.29 km/s at apehelion(where r is max)
    R = np.sqrt(ans[:, 1]**2 + ans[:, 2]**2 + ans[:, 3]**2)
    i = np.argmax(R)  # index whre radial distance is max
    v_apehelion = ((np.sqrt(ans[i, 5]**2 + ans[i, 6]**2 + ans[i, 7]**2) *
                    (u.m / u.s)).to(u.km / u.s)).value
    assert_allclose(v_apehelion, 29.29, rtol=0.01)
def test_compare_calculate_trajectory_iterator_cartesians(test_input):
    cart_obj = CartesianDifferential(
        1000000 * u.m,
        1000000 * u.m,
        20.5 * u.m,
        10000 * u.m / u.s,
        10000 * u.m / u.s,
        -30 * u.m / u.s,
    )
    M = 2e24 * u.kg
    q, a, Q, el, ss = test_input
    cl1 = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
    cl2 = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
    ans1 = cl1.calculate_trajectory(end_lambda=el,
                                    OdeMethodKwargs={"stepsize": ss},
                                    return_cartesian=True)[1]
    it = cl2.calculate_trajectory_iterator(OdeMethodKwargs={"stepsize": ss},
                                           return_cartesian=True)
    ans2 = list()
    for _, val in zip(range(20), it):
        ans2.append(val[1])
    ans2 = np.array(ans2)
    print(ans1)
    assert_allclose(ans1[:20], ans2)