Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: c5a999f27211
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: b7c99e112126
Choose a head ref
  • 6 commits
  • 5 files changed
  • 1 contributor

Commits on Jun 12, 2021

  1. IsCollapsible.

    pleroy committed Jun 12, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    b682174 View commit details
  2. A test.

    pleroy committed Jun 12, 2021
    Copy the full SHA
    d3dc312 View commit details
  3. Lint.

    pleroy committed Jun 12, 2021
    Copy the full SHA
    9b4e420 View commit details

Commits on Jun 13, 2021

  1. After egg's review.

    pleroy committed Jun 13, 2021
    Copy the full SHA
    1b63116 View commit details
  2. Copy the full SHA
    c0486f3 View commit details
  3. Merge pull request #3032 from pleroy/Collapsible

    Add a predicate to check if a vessel is in a state that allows collapsing its trajectory
    pleroy authored Jun 13, 2021
    Copy the full SHA
    b7c99e1 View commit details
Showing with 106 additions and 2 deletions.
  1. +1 −1 ksp_plugin/pile_up.cpp
  2. +2 −1 ksp_plugin/pile_up.hpp
  3. +32 −0 ksp_plugin/vessel.cpp
  4. +6 −0 ksp_plugin/vessel.hpp
  5. +65 −0 ksp_plugin_test/vessel_test.cpp
2 changes: 1 addition & 1 deletion ksp_plugin/pile_up.cpp
Original file line number Diff line number Diff line change
@@ -65,7 +65,7 @@ using ::std::placeholders::_2;
using ::std::placeholders::_3;

PileUp::PileUp(
std::list<not_null<Part*>>&& parts,
std::list<not_null<Part*>> parts,
Instant const& t,
Ephemeris<Barycentric>::AdaptiveStepParameters adaptive_step_parameters,
Ephemeris<Barycentric>::FixedStepParameters fixed_step_parameters,
3 changes: 2 additions & 1 deletion ksp_plugin/pile_up.hpp
Original file line number Diff line number Diff line change
@@ -91,13 +91,14 @@ using PileUpPrincipalAxes = Frame<serialization::Frame::PluginTag,
class PileUp {
public:
PileUp(
std::list<not_null<Part*>>&& parts,
std::list<not_null<Part*>> parts,
Instant const& t,
Ephemeris<Barycentric>::AdaptiveStepParameters adaptive_step_parameters,
Ephemeris<Barycentric>::FixedStepParameters fixed_step_parameters,
not_null<Ephemeris<Barycentric>*> ephemeris,
std::function<void()> deletion_callback);

// Runs the |deletion_callback| passed at construction, if not null.
virtual ~PileUp();

// This class is moveable.
32 changes: 32 additions & 0 deletions ksp_plugin/vessel.cpp
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
#include <functional>
#include <limits>
#include <list>
#include <set>
#include <string>
#include <vector>

@@ -27,10 +28,12 @@ using base::jthread;
using base::make_not_null_unique;
using base::MakeStoppableThread;
using geometry::BarycentreCalculator;
using geometry::Bivector;
using geometry::Position;
using quantities::IsFinite;
using quantities::Length;
using quantities::Time;
using quantities::Torque;
using quantities::si::Metre;
using ::std::placeholders::_1;

@@ -645,6 +648,35 @@ void Vessel::AttachPrediction(
}
}

bool Vessel::IsCollapsible() const {
PileUp* containing_pile_up = nullptr;
std::set<not_null<Part*>> parts;
for (const auto& [_, part] : parts_) {
// We expect parts to be piled up.
CHECK(part->is_piled_up());
// Not collapsible if any part has a force applied to it (but a torque is
// fine).
if (part->intrinsic_force() != Vector<Force, Barycentric>{}) {
return false;
}
parts.insert(part.get());
if (containing_pile_up == nullptr) {
containing_pile_up = part->containing_pile_up();
} else {
// All the parts should be in the same pile-up.
CHECK_EQ(containing_pile_up, part->containing_pile_up());
}
}
CHECK_NE(nullptr, containing_pile_up);
for (const auto part : containing_pile_up->parts()) {
// Not collapsible if the pile-up contains a part not in this vessel.
if (!parts.contains(part)) {
return false;
}
}
return true;
}

// Run the prognostication in both synchronous and asynchronous mode in tests to
// avoid code rot.
#if defined(_DEBUG)
6 changes: 6 additions & 0 deletions ksp_plugin/vessel.hpp
Original file line number Diff line number Diff line change
@@ -244,6 +244,10 @@ class Vessel {
void AttachPrediction(
not_null<std::unique_ptr<DiscreteTrajectory<Barycentric>>> trajectory);

// A vessel is collapsible if it is alone in its pile-up and is in inertial
// motion.
bool IsCollapsible() const;

GUID const guid_;
std::string name_;

@@ -273,6 +277,8 @@ class Vessel {
std::optional<OrbitAnalyser> orbit_analyser_;

static std::atomic_bool synchronous_;

friend class VesselTest;
};

} // namespace internal_vessel
65 changes: 65 additions & 0 deletions ksp_plugin_test/vessel_test.cpp
Original file line number Diff line number Diff line change
@@ -2,6 +2,8 @@
#include "ksp_plugin/vessel.hpp"

#include <limits>
#include <list>
#include <memory>
#include <set>
#include <vector>

@@ -30,6 +32,7 @@ namespace ksp_plugin {
namespace internal_vessel {

using base::make_not_null_unique;
using geometry::Bivector;
using geometry::Displacement;
using geometry::InertiaTensor;
using geometry::Position;
@@ -40,9 +43,11 @@ using physics::MockEphemeris;
using physics::RigidMotion;
using physics::RotatingBody;
using quantities::MomentOfInertia;
using quantities::Torque;
using quantities::si::Degree;
using quantities::si::Kilogram;
using quantities::si::Metre;
using quantities::si::Newton;
using quantities::si::Radian;
using quantities::si::Second;
using testing_utilities::AlmostEquals;
@@ -97,6 +102,10 @@ class VesselTest : public testing::Test {
vessel_.AddPart(std::move(p2));
}

bool IsCollapsible() const {
return vessel_.IsCollapsible();
}

MockEphemeris<Barycentric> ephemeris_;
RotatingBody<Barycentric> const body_;
Celestial const celestial_;
@@ -421,6 +430,62 @@ TEST_F(VesselTest, FlightPlan) {
EXPECT_FALSE(vessel_.has_flight_plan());
}

TEST_F(VesselTest, IsCollapsible) {
{
auto const pile_up =
std::make_shared<PileUp>(/*parts=*/std::list<not_null<Part*>>{p1_, p2_},
Instant{},
DefaultPsychohistoryParameters(),
DefaultHistoryParameters(),
&ephemeris_,
/*deletion_callback=*/nullptr);
p1_->set_containing_pile_up(pile_up);
p2_->set_containing_pile_up(pile_up);

// Same pile-up.
EXPECT_TRUE(IsCollapsible());

// Force.
p1_->apply_intrinsic_force(
Vector<Force, Barycentric>({1 * Newton, 0 * Newton, 0 * Newton}));
EXPECT_FALSE(IsCollapsible());

// Torque.
p1_->clear_intrinsic_force();
p1_->apply_intrinsic_torque(
Bivector<Torque, Barycentric>({0 * Newton * Metre * Radian,
1 * Newton * Metre * Radian,
0 * Newton * Metre * Radian}));
EXPECT_TRUE(IsCollapsible());
}

{
auto p3 = make_not_null_unique<Part>(
333,
"p3",
mass2_,
EccentricPart::origin,
inertia_tensor2_,
RigidMotion<EccentricPart, Barycentric>::MakeNonRotatingMotion(p2_dof_),
/*deletion_callback=*/nullptr);
auto const pile_up = std::make_shared<PileUp>(
/*parts=*/std::list<not_null<Part*>>{p1_, p2_, p3.get()},
Instant{},
DefaultPsychohistoryParameters(),
DefaultHistoryParameters(),
&ephemeris_,
/*deletion_callback=*/nullptr);
p1_->reset_containing_pile_up();
p2_->reset_containing_pile_up();
p1_->set_containing_pile_up(pile_up);
p2_->set_containing_pile_up(pile_up);
p3->set_containing_pile_up(pile_up);

// A pile-up with an extra part.
EXPECT_FALSE(IsCollapsible());
}
}

TEST_F(VesselTest, SerializationSuccess) {
MockFunction<int(not_null<PileUp const*>)>
serialization_index_for_pile_up;