コード例 #1
0
def test_calculate_trajectory2():
    # based on the revolution of earth around sun
    # data from https://en.wikipedia.org/wiki/Earth%27s_orbit
    M = 1.989e30 * u.kg
    distance_at_perihelion = 147.10e6 * u.km
    speed_at_perihelion = 30.29 * u.km / u.s
    angular_vel = (speed_at_perihelion / distance_at_perihelion) * u.rad
    sph_obj = SphericalDifferential(
        distance_at_perihelion,
        np.pi / 2 * u.rad,
        0 * u.rad,
        0 * u.km / u.s,
        0 * u.rad / u.s,
        angular_vel,
    )
    end_lambda = ((1 * u.year).to(u.s)).value
    cl = Schwarzschild.from_coords(sph_obj, M)
    ans = cl.calculate_trajectory(
        start_lambda=0.0,
        end_lambda=end_lambda,
        OdeMethodKwargs={"stepsize": end_lambda / 2e3},
    )[1]
    # velocity should be 29.29 km/s at apehelion(where r is max)
    i = np.argmax(ans[:, 1])  # index whre radial distance is max
    v_apehelion = (((ans[i][1] * ans[i][7]) * (u.m / u.s)).to(u.km / u.s)).value
    assert_allclose(v_apehelion, 29.29, rtol=0.01)
コード例 #2
0
def test_calculate_trajectory3():
    # same test as with test_calculate_trajectory2(),
    # but initialialized with cartesian coordinates
    # and function returning cartesian coordinates
    M = 1.989e30 * u.kg
    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,
    )
    end_lambda = ((1 * u.year).to(u.s)).value
    cl = Schwarzschild.from_coords(cart_obj, M)
    ans = cl.calculate_trajectory(
        start_lambda=0.0,
        end_lambda=end_lambda,
        return_cartesian=True,
        OdeMethodKwargs={"stepsize": end_lambda / 2e3},
    )[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)
コード例 #3
0
 def get_schwarz():
     schwarz_obj = {}
     schwarz_ans = {}
     for object in bodies_list:
         if object != 'sun':
             schwarz_obj[object] = Schwarzschild.from_coords(
                 sd_obj[object], mass['sun'])
             schwarz_ans[object] = schwarz_obj[object].calculate_trajectory(
                 end_lambda=end_lambda['earth'],
                 OdeMethodKwargs={"stepsize": stepsize['earth']},
                 return_cartesian=True)
     return schwarz_obj, schwarz_ans
コード例 #4
0
def test_calculate_trajectory_iterator(
    coords, time, M, start_lambda, end_lambda, OdeMethodKwargs, return_cartesian
):
    cl1 = Schwarzschild.from_coords(coords, M, time)
    arr1 = cl1.calculate_trajectory(
        start_lambda=start_lambda,
        end_lambda=end_lambda,
        OdeMethodKwargs=OdeMethodKwargs,
        return_cartesian=return_cartesian,
    )[1]
    cl2 = Schwarzschild.from_coords(coords, M, time)
    it = cl2.calculate_trajectory_iterator(
        start_lambda=start_lambda,
        OdeMethodKwargs=OdeMethodKwargs,
        return_cartesian=return_cartesian,
    )
    arr2_list = list()
    for _, val in zip(range(50), it):
        arr2_list.append(val[1])
    arr2 = np.array(arr2_list)
    assert_allclose(arr1[:50, :], arr2, rtol=1e-10)
コード例 #5
0
def test_calculate_trajectory(
    coords, time, M, start_lambda, end_lambda, OdeMethodKwargs
):
    cl = Schwarzschild.from_coords(coords, M, time)
    ans = cl.calculate_trajectory(
        start_lambda=start_lambda,
        end_lambda=end_lambda,
        OdeMethodKwargs=OdeMethodKwargs,
    )
    ans = ans[1]
    testarray = list()
    for i in ans:
        g = schwarzschild_utils.metric(i[1], i[2], M.value)
        testarray.append(
            g[0][0] * (i[4] ** 2)
            + g[1][1] * (i[5] ** 2)
            + g[2][2] * (i[6] ** 2)
            + g[3][3] * (i[7] ** 2)
        )
    testarray = np.array(testarray, dtype=float)
    comparearray = np.ones(shape=ans[:, 4].shape, dtype=float)
    assert_allclose(testarray, comparearray, 1e-4)
コード例 #6
0
def test_calculate_trajectory_iterator_RuntimeWarning2():
    sph_obj = SphericalDifferential(
        306 * u.m,
        np.pi / 2 * u.rad,
        np.pi / 3 * u.rad,
        0 * u.m / u.s,
        0.01 * u.rad / u.s,
        10 * u.rad / u.s,
    )
    M = 1e25 * u.kg
    start_lambda = 0.0
    OdeMethodKwargs = {"stepsize": 0.4e-6}
    cl = Schwarzschild.from_coords(sph_obj, M)
    with warnings.catch_warnings(record=True) as w:
        it = cl.calculate_trajectory_iterator(
            start_lambda=start_lambda,
            OdeMethodKwargs=OdeMethodKwargs,
            stop_on_singularity=False,
        )
        for _, _ in zip(range(1000), it):
            pass
        assert len(w) >= 1
コード例 #7
0
import numpy as np
from project import write_out
from astropy import units as u
from einsteinpy.coordinates import SphericalDifferential, CartesianDifferential
from einsteinpy.metric import Schwarzschild

M = 5.972e24 * u.kg
sph_coord = SphericalDifferential(306.0 * u.m, np.pi/2 * u.rad, -np.pi/6*u.rad,
                          1000*u.m/u.s, 0*u.rad/u.s, 1900*u.rad/u.s)
obj = Schwarzschild.from_coords(sph_coord, M , 0* u.s)

end_tau = 0.01 # approximately equal to coordinate time
stepsize = 0.3e-6
ans = obj.calculate_trajectory(end_lambda=end_tau, OdeMethodKwargs={"stepsize":stepsize})
x = []
y = []
z = []
for i in range(len(ans[1])):
    x.append(ans[1][i][1])
    y.append(ans[1][i][2])
    z.append(ans[1][i][3])
write_out([ans[0]] + [x] + [y] + [z], 'spherical', "solveEinstein_randphi2.txt")