def test_soyuz_standard_gto_numerical(): # Data from Soyuz Users Manual, issue 2 revision 0 r_a = (Earth.R + 35950 * u.km).to(u.km).value r_p = (Earth.R + 250 * u.km).to(u.km).value a = (r_a + r_p) / 2 # km ecc = r_a / a - 1 argp_0 = (178 * u.deg).to(u.rad).value # rad argp_f = (178 * u.deg + 5 * u.deg).to(u.rad).value # rad f = 2.4e-7 # km / s2 k = Earth.k.to(u.km**3 / u.s**2).value a_d, _, t_f = change_argp(k, a, ecc, argp_0, argp_f, f) # Retrieve r and v from initial orbit s0 = Orbit.from_classical( Earth, a * u.km, (r_a / a - 1) * u.one, 6 * u.deg, 188.5 * u.deg, 178 * u.deg, 0 * u.deg ) # Propagate orbit sf = s0.propagate(t_f * u.s, method=cowell, ad=a_d, rtol=1e-8) assert_allclose(sf.argp.to(u.rad).value, argp_f, rtol=1e-4)
def test_soyuz_standard_gto_delta_v(): # Data from Soyuz Users Manual, issue 2 revision 0 r_a = (Earth.R + 35950 * u.km).to(u.km).value r_p = (Earth.R + 250 * u.km).to(u.km).value a = (r_a + r_p) / 2 # km ecc = r_a / a - 1 argp_0 = (178 * u.deg).to(u.rad).value # rad argp_f = (178 * u.deg + 5 * u.deg).to(u.rad).value # rad f = 2.4e-7 # km / s2 k = Earth.k.to(u.km**3 / u.s**2).value _, delta_V, t_f = change_argp(k, a, ecc, argp_0, argp_f, f) expected_t_f = 12.0 # days, approximate expected_delta_V = 0.2489 # km / s assert_allclose(delta_V, expected_delta_V, rtol=1e-2) assert_allclose(t_f / 86400, expected_t_f, rtol=1e-2)
def test_soyuz_standard_gto_numerical_safe(): # Data from Soyuz Users Manual, issue 2 revision 0 r_a = (Earth.R + 35950 * u.km).to(u.km) r_p = (Earth.R + 250 * u.km).to(u.km) a = ((r_a + r_p) / 2).to(u.km) # km ecc = r_a / a - 1 argp_0 = (178 * u.deg).to(u.rad) # rad argp_f = (178 * u.deg + 5 * u.deg).to(u.rad) # rad f = 2.4e-7 * u.km / u.s**2 # km / s2 k = Earth.k.to(u.km**3 / u.s**2) a_d, _, t_f = change_argp(k, a, ecc, argp_0, argp_f, f) # Retrieve r and v from initial orbit s0 = Orbit.from_classical( attractor=Earth, a=a, ecc=(r_a / a - 1) * u.one, inc=6 * u.deg, raan=188.5 * u.deg, argp=178 * u.deg, nu=0 * u.deg, ) # Propagate orbit def f_soyuz(t0, u_, k): du_kep = func_twobody(t0, u_, k) ax, ay, az = a_d(t0, u_, k) du_ad = np.array([0, 0, 0, ax, ay, az]) return du_kep + du_ad sf = s0.propagate(t_f, method=cowell, f=f_soyuz, rtol=1e-8) assert_allclose(sf.argp.to_value(u.rad), argp_f.to_value(u.rad), rtol=1e-4)