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)
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)
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
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)
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)
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
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")