TEST_F(ManœuvreTest, TargetΔv) { Instant const t0 = Instant(); Vector<double, World> e_y({0, 1, 0}); Manœuvre<World> manœuvre(1 * Newton /*thrust*/, 2 * Kilogram /*initial_mass*/, 1 * Newton * Second / Kilogram /*specific_impulse*/, e_y /*direction*/); EXPECT_EQ(1 * Newton, manœuvre.thrust()); EXPECT_EQ(2 * Kilogram, manœuvre.initial_mass()); EXPECT_EQ(1 * Metre / Second, manœuvre.specific_impulse()); EXPECT_EQ(e_y, manœuvre.direction()); EXPECT_EQ(1 * Kilogram / Second, manœuvre.mass_flow()); manœuvre.set_Δv(1 * Metre / Second); EXPECT_EQ(1 * Metre / Second, manœuvre.Δv()); EXPECT_EQ((2 - 2 / e) * Second, manœuvre.duration()); EXPECT_EQ((2 - 2 / Sqrt(e)) * Second, manœuvre.time_to_half_Δv()); EXPECT_EQ((2 / e) * Kilogram, manœuvre.final_mass()); manœuvre.set_time_of_half_Δv(t0); EXPECT_EQ(t0 - (2 - 2 / Sqrt(e)) * Second, manœuvre.initial_time()); EXPECT_EQ(t0 + (2 / Sqrt(e) - 2 / e) * Second, manœuvre.final_time()); EXPECT_EQ(t0, manœuvre.time_of_half_Δv()); EXPECT_EQ( 0 * Metre / Pow<2>(Second), manœuvre.acceleration()(manœuvre.initial_time() - 1 * Second).Norm()); EXPECT_EQ(0.5 * Metre / Pow<2>(Second), manœuvre.acceleration()(manœuvre.initial_time()).Norm()); EXPECT_EQ(Sqrt(e) / 2 * Metre / Pow<2>(Second), manœuvre.acceleration()(manœuvre.time_of_half_Δv()).Norm()); EXPECT_EQ((e / 2) * Metre / Pow<2>(Second), manœuvre.acceleration()(manœuvre.final_time()).Norm()); EXPECT_EQ(0 * Metre / Pow<2>(Second), manœuvre.acceleration()(manœuvre.final_time() + 1 * Second).Norm()); }
NavigationManoeuvre principia__FlightPlanGetManoeuvre( Plugin const* const plugin, char const* const vessel_guid, int const index) { journal::Method<journal::FlightPlanGetManoeuvre> m({plugin, vessel_guid, index}); CHECK_NOTNULL(plugin); return m.Return(ToInterfaceNavigationManoeuvre( *plugin, GetFlightPlan(*plugin, vessel_guid).GetManœuvre(index))); }