Skip to content

Commit 9492d9a

Browse files
authored
Merge pull request #3184 from pleroy/Manoeuvre
Convert Manœuvre and its test to DiscreteTraject0ry
2 parents 7bf8c90 + 71d778c commit 9492d9a

File tree

3 files changed

+42
-20
lines changed

3 files changed

+42
-20
lines changed

ksp_plugin/manœuvre.hpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "geometry/named_quantities.hpp"
77
#include "geometry/orthogonal_map.hpp"
88
#include "physics/degrees_of_freedom.hpp"
9-
#include "physics/discrete_trajectory.hpp"
9+
#include "physics/discrete_trajectory_segment_iterator.hpp"
1010
#include "physics/dynamic_frame.hpp"
1111
#include "physics/ephemeris.hpp"
1212
#include "quantities/named_quantities.hpp"
@@ -22,7 +22,7 @@ using geometry::OrthogonalMap;
2222
using geometry::Vector;
2323
using geometry::Velocity;
2424
using physics::DegreesOfFreedom;
25-
using physics::DiscreteTrajectory;
25+
using physics::DiscreteTrajectorySegmentIterator;
2626
using physics::DynamicFrame;
2727
using physics::Ephemeris;
2828
using physics::Frenet;
@@ -125,11 +125,11 @@ class Manœuvre {
125125
// Returns true if and only if [initial_time, final_time] ⊆ ]begin, end[.
126126
bool FitsBetween(Instant const& begin, Instant const& end) const;
127127

128-
// Sets the trajectory at the end of which the manœuvre takes place. Must be
129-
// called before any of the functions below. |trajectory| must have a point
130-
// at |initial_time()|.
128+
// Sets the trajectory segment at the end of which the manœuvre takes place.
129+
// Must be called before any of the functions below. |trajectory| must have a
130+
// point at |initial_time()|.
131131
void set_coasting_trajectory(
132-
not_null<DiscreteTrajectory<InertialFrame> const*> trajectory);
132+
DiscreteTrajectorySegmentIterator<InertialFrame> trajectory);
133133

134134
// This manœuvre must be inertially fixed.
135135
virtual Vector<double, InertialFrame> InertialDirection() const;
@@ -174,7 +174,7 @@ class Manœuvre {
174174
Mass initial_mass_;
175175
Burn construction_burn_; // As given at construction.
176176
Burn burn_; // All optionals filled.
177-
DiscreteTrajectory<InertialFrame> const* coasting_trajectory_ = nullptr;
177+
DiscreteTrajectorySegmentIterator<InertialFrame> coasting_trajectory_;
178178
};
179179

180180
} // namespace internal_manœuvre

ksp_plugin/manœuvre_body.hpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <functional>
88

99
#include "base/not_null.hpp"
10+
#include "physics/discrete_traject0ry.hpp"
1011
#include "quantities/elementary_functions.hpp"
1112

1213
namespace principia {
@@ -16,6 +17,7 @@ namespace internal_manœuvre {
1617
using base::check_not_null;
1718
using geometry::NormalizeOrZero;
1819
using geometry::Rotation;
20+
using physics::DiscreteTraject0ry;
1921
using physics::RigidMotion;
2022
using quantities::Acceleration;
2123
using quantities::Sqrt;
@@ -170,7 +172,7 @@ bool Manœuvre<InertialFrame, Frame>::FitsBetween(Instant const& begin,
170172

171173
template<typename InertialFrame, typename Frame>
172174
void Manœuvre<InertialFrame, Frame>::set_coasting_trajectory(
173-
not_null<DiscreteTrajectory<InertialFrame> const*> const trajectory) {
175+
DiscreteTrajectorySegmentIterator<InertialFrame> const trajectory) {
174176
coasting_trajectory_ = trajectory;
175177
}
176178

@@ -208,9 +210,8 @@ Manœuvre<InertialFrame, Frame>::FrenetIntrinsicAcceleration() const {
208210
template<typename InertialFrame, typename Frame>
209211
OrthogonalMap<Frenet<Frame>, InertialFrame>
210212
Manœuvre<InertialFrame, Frame>::FrenetFrame() const {
211-
CHECK_NOTNULL(coasting_trajectory_);
212-
typename DiscreteTrajectory<InertialFrame>::Iterator const it =
213-
coasting_trajectory_->Find(initial_time());
213+
typename DiscreteTraject0ry<InertialFrame>::iterator const it =
214+
coasting_trajectory_->find(initial_time());
214215
CHECK(it != coasting_trajectory_->end());
215216
return ComputeFrenetFrame(initial_time(), it->degrees_of_freedom);
216217
}

ksp_plugin_test/manœuvre_test.cpp

+30-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11

22
#include "ksp_plugin/manœuvre.hpp"
33

4+
#include "base/not_null.hpp"
45
#include "geometry/frame.hpp"
6+
#include "geometry/grassmann.hpp"
57
#include "geometry/named_quantities.hpp"
8+
#include "geometry/orthogonal_map.hpp"
9+
#include "geometry/rotation.hpp"
610
#include "gmock/gmock.h"
711
#include "gtest/gtest.h"
812
#include "ksp_plugin/frames.hpp"
913
#include "physics/continuous_trajectory.hpp"
10-
#include "physics/discrete_trajectory.hpp"
14+
#include "physics/discrete_traject0ry.hpp"
15+
#include "physics/dynamic_frame.hpp"
1116
#include "physics/massive_body.hpp"
1217
#include "physics/mock_dynamic_frame.hpp"
1318
#include "physics/mock_ephemeris.hpp"
19+
#include "physics/rigid_motion.hpp"
20+
#include "quantities/elementary_functions.hpp"
21+
#include "quantities/named_quantities.hpp"
1422
#include "quantities/numbers.hpp"
23+
#include "quantities/quantities.hpp"
1524
#include "quantities/uk.hpp"
1625
#include "testing_utilities/almost_equals.hpp"
1726
#include "testing_utilities/approximate_quantity.hpp"
@@ -22,24 +31,35 @@
2231

2332
namespace principia {
2433
namespace ksp_plugin {
25-
namespace internal_manœuvre {
2634

35+
using base::not_null;
2736
using base::make_not_null_unique;
2837
using geometry::AngularVelocity;
2938
using geometry::Arbitrary;
3039
using geometry::Displacement;
3140
using geometry::Frame;
3241
using geometry::Handedness;
42+
using geometry::Instant;
43+
using geometry::OrthogonalMap;
3344
using geometry::RigidTransformation;
45+
using geometry::Rotation;
46+
using geometry::Vector;
3447
using geometry::Velocity;
3548
using physics::ContinuousTrajectory;
3649
using physics::DegreesOfFreedom;
37-
using physics::DiscreteTrajectory;
50+
using physics::DiscreteTraject0ry;
51+
using physics::Frenet;
3852
using physics::MassiveBody;
3953
using physics::MockDynamicFrame;
4054
using physics::MockEphemeris;
55+
using physics::RigidMotion;
56+
using quantities::Force;
4157
using quantities::GravitationalParameter;
58+
using quantities::Mass;
4259
using quantities::Pow;
60+
using quantities::Speed;
61+
using quantities::Sqrt;
62+
using quantities::Variation;
4363
using quantities::si::Kilo;
4464
using quantities::si::Kilogram;
4565
using quantities::si::Metre;
@@ -80,7 +100,7 @@ class ManœuvreTest : public ::testing::Test {
80100

81101
Instant const t0_;
82102
StrictMock<MockDynamicFrame<World, Rendering>> const* mock_dynamic_frame_;
83-
DiscreteTrajectory<World> discrete_trajectory_;
103+
DiscreteTraject0ry<World> discrete_trajectory_;
84104
DegreesOfFreedom<World> const dof_ = {
85105
World::origin + Displacement<World>({1 * Metre, 9 * Metre, 5 * Metre}),
86106
Velocity<World>(
@@ -144,7 +164,7 @@ TEST_F(ManœuvreTest, TimedBurn) {
144164
FrenetFrame(manœuvre.initial_time(), rendering_dof_))
145165
.WillOnce(
146166
Return(Rotation<Frenet<Rendering>, Rendering>::Identity()));
147-
manœuvre.set_coasting_trajectory(&discrete_trajectory_);
167+
manœuvre.set_coasting_trajectory(discrete_trajectory_.segments().begin());
148168
auto const acceleration = manœuvre.InertialIntrinsicAcceleration();
149169
EXPECT_EQ(
150170
0 * Metre / Pow<2>(Second),
@@ -207,7 +227,7 @@ TEST_F(ManœuvreTest, TargetΔv) {
207227
FrenetFrame(manœuvre.initial_time(), rendering_dof_))
208228
.WillOnce(
209229
Return(Rotation<Frenet<Rendering>, Rendering>::Identity()));
210-
manœuvre.set_coasting_trajectory(&discrete_trajectory_);
230+
manœuvre.set_coasting_trajectory(discrete_trajectory_.segments().begin());
211231
auto const acceleration = manœuvre.InertialIntrinsicAcceleration();
212232
EXPECT_EQ(
213233
0 * Metre / Pow<2>(Second),
@@ -292,7 +312,8 @@ TEST_F(ManœuvreTest, Apollo8SIVB) {
292312
FrenetFrame(first_manœuvre.initial_time(), rendering_dof_))
293313
.WillOnce(
294314
Return(Rotation<Frenet<Rendering>, Rendering>::Identity()));
295-
first_manœuvre.set_coasting_trajectory(&discrete_trajectory_);
315+
first_manœuvre.set_coasting_trajectory(
316+
discrete_trajectory_.segments().begin());
296317
auto const first_acceleration =
297318
first_manœuvre.InertialIntrinsicAcceleration();
298319
EXPECT_THAT(
@@ -338,7 +359,8 @@ TEST_F(ManœuvreTest, Apollo8SIVB) {
338359
FrenetFrame(second_manœuvre.initial_time(), rendering_dof_))
339360
.WillOnce(
340361
Return(Rotation<Frenet<Rendering>, Rendering>::Identity()));
341-
second_manœuvre.set_coasting_trajectory(&discrete_trajectory_);
362+
second_manœuvre.set_coasting_trajectory(
363+
discrete_trajectory_.segments().begin());
342364
auto const second_acceleration =
343365
second_manœuvre.InertialIntrinsicAcceleration();
344366
EXPECT_THAT(second_acceleration(second_manœuvre.initial_time()).Norm(),
@@ -430,6 +452,5 @@ TEST_F(ManœuvreTest, Serialization) {
430452
EXPECT_EQ(t0_, manœuvre_read.time_of_half_Δv());
431453
}
432454

433-
} // namespace internal_manœuvre
434455
} // namespace ksp_plugin
435456
} // namespace principia

0 commit comments

Comments
 (0)