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: 68b0b3b28daf
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 45d6c4da7407
Choose a head ref
  • 12 commits
  • 21 files changed
  • 1 contributor

Commits on Jan 25, 2020

  1. Copy the full SHA
    96975bc View commit details
  2. Change the part.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    313ad11 View commit details
  3. Some work on the pile-up.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    9c2f3de View commit details
  4. Use the mechanical system.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    6161b7e View commit details
  5. Copy the full SHA
    aa987ca View commit details
  6. Serialization.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    afbe0de View commit details
  7. Delete the old class.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    142b39b View commit details
  8. Fix compilation errors.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    80e2327 View commit details
  9. Copy the full SHA
    f6ebee6 View commit details
  10. After egg's review.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    f2c2a68 View commit details
  11. Just say no to tabs.

    pleroy committed Jan 25, 2020
    Copy the full SHA
    0ea668f View commit details
  12. Merge pull request #2460 from pleroy/RemoveInertiaTensor

    Remove InertiaTensor and its usages, and use MechanicalSystem instead
    pleroy authored Jan 25, 2020
    Copy the full SHA
    45d6c4d View commit details
6 changes: 6 additions & 0 deletions geometry/named_quantities.hpp
Original file line number Diff line number Diff line change
@@ -6,12 +6,14 @@
#include "geometry/affine_map.hpp"
#include "geometry/grassmann.hpp"
#include "geometry/point.hpp"
#include "geometry/symmetric_bilinear_form.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"

namespace principia {
namespace geometry {


// A trait to treat types that have a norm uniformly (using Abs for quantities
// or double, and Norm for multivectors).
template<typename T,
@@ -45,6 +47,10 @@ template<typename FromFrame, typename ToFrame>
using RigidTransformation =
AffineMap<FromFrame, ToFrame, quantities::Length, OrthogonalMap>;

template<typename Frame>
using InertiaTensor =
SymmetricBilinearForm<quantities::MomentOfInertia, Frame, Bivector>;

} // namespace geometry
} // namespace principia

26 changes: 9 additions & 17 deletions ksp_plugin/interface.cpp
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@
#include "base/version.hpp"
#include "gipfeli/gipfeli.h"
#include "geometry/frame.hpp"
#include "geometry/grassmann.hpp"
#include "geometry/named_quantities.hpp"
#include "geometry/quaternion.hpp"
#include "geometry/r3x3_matrix.hpp"
@@ -46,7 +47,6 @@
#include "ksp_plugin/identification.hpp"
#include "ksp_plugin/iterators.hpp"
#include "ksp_plugin/part.hpp"
#include "physics/inertia_tensor.hpp"
#include "physics/kepler_orbit.hpp"
#include "physics/rigid_motion.hpp"
#include "physics/solar_system.hpp"
@@ -76,6 +76,7 @@ using base::UniqueArray;
using geometry::Displacement;
using geometry::Frame;
using geometry::Handedness;
using geometry::InertiaTensor;
using geometry::NonInertial;
using geometry::OrthogonalMap;
using geometry::Quaternion;
@@ -99,7 +100,6 @@ using ksp_plugin::VesselSet;
using ksp_plugin::World;
using physics::DegreesOfFreedom;
using physics::FrameField;
using physics::InertiaTensor;
using physics::MassiveBody;
using physics::OblateBody;
using physics::RelativeDegreesOfFreedom;
@@ -873,7 +873,7 @@ void __cdecl principia__InsertOrKeepLoadedPart(
CHECK_NOTNULL(plugin);

// We build the inertia tensor in the principal axes and then transform it to
// World.
// RigidPart.
using PartPrincipalAxes = Frame<serialization::Frame::PhysicsTag,
NonInertial,
Handedness::Left,
@@ -888,36 +888,28 @@ void __cdecl principia__InsertOrKeepLoadedPart(
moments_of_inertia_in_tonnes.y * to_si_unit,
moments_of_inertia_in_tonnes.z * to_si_unit});
InertiaTensor<PartPrincipalAxes> const inertia_tensor_in_princial_axes(
mass_in_tonnes * Tonne,
R3x3Matrix<MomentOfInertia>({moments_of_inertia.x, zero, zero},
{zero, moments_of_inertia.y, zero},
{zero, zero, moments_of_inertia.z}),
PartPrincipalAxes::origin);
{zero, zero, moments_of_inertia.z}));

Rotation<PartPrincipalAxes, RigidPart> const principal_axes_to_part(
Rotation<PartPrincipalAxes, RigidPart> const principal_axes_to_rigid_part(
FromWXYZ(principal_axes_rotation));
RigidTransformation<PartPrincipalAxes, RigidPart> const
part_principal_axes_to_rigid_part(
PartPrincipalAxes::origin,
RigidPart::origin,
principal_axes_to_part.Forget<OrthogonalMap>());
InertiaTensor<RigidPart> const inertia_tensor_in_rigid_part =
inertia_tensor_in_princial_axes.Transform(
part_principal_axes_to_rigid_part);
principal_axes_to_rigid_part(inertia_tensor_in_princial_axes);

VLOG(1) << "InsertOrKeepLoadedPart: " << name << " " << part_id << " "
<< moments_of_inertia << " " << FromWXYZ(principal_axes_rotation);

plugin->InsertOrKeepLoadedPart(
part_id,
name,
mass_in_tonnes * Tonne,
inertia_tensor_in_rigid_part,
vessel_guid,
main_body_index,
FromQP<DegreesOfFreedom<World>>(main_body_world_degrees_of_freedom),
MakePartRigidMotion(part_world_degrees_of_freedom,
part_rotation,
part_angular_velocity),
MakePartRigidMotion(
part_world_degrees_of_freedom, part_rotation, part_angular_velocity),
delta_t * Second);
return m.Return();
}
47 changes: 43 additions & 4 deletions ksp_plugin/part.cpp
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
#include "base/not_null.hpp"
#include "geometry/r3x3_matrix.hpp"
#include "physics/rigid_motion.hpp"
#include "quantities/elementary_functions.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"

@@ -22,17 +23,24 @@ using base::make_not_null_unique;
using base::UniqueArray;
using geometry::R3x3Matrix;
using physics::RigidTransformation;
using quantities::Cbrt;
using quantities::Density;
using quantities::MomentOfInertia;
using quantities::Pow;
using quantities::SIUnit;
using quantities::si::Kilogram;
using quantities::si::Metre;

Part::Part(
PartId const part_id,
std::string const& name,
Mass const& mass,
InertiaTensor<RigidPart> const& inertia_tensor,
RigidMotion<RigidPart, Barycentric> const& rigid_motion,
std::function<void()> deletion_callback)
: part_id_(part_id),
name_(name),
mass_(mass),
inertia_tensor_(inertia_tensor),
rigid_motion_(rigid_motion),
prehistory_(make_not_null_unique<DiscreteTrajectory<Barycentric>>()),
@@ -54,6 +62,14 @@ PartId Part::part_id() const {
return part_id_;
}

void Part::set_mass(Mass const& mass) {
mass_ = mass;
}

Mass const& Part::mass() const {
return mass_;
}

void Part::set_inertia_tensor(InertiaTensor<RigidPart> const& inertia_tensor) {
inertia_tensor_ = inertia_tensor;
}
@@ -168,6 +184,7 @@ void Part::WriteToMessage(not_null<serialization::Part*> const message,
serialization_index_for_pile_up) const {
message->set_part_id(part_id_);
message->set_name(name_);
mass_.WriteToMessage(message->mutable_mass());
inertia_tensor_.WriteToMessage(message->mutable_inertia_tensor());
intrinsic_force_.WriteToMessage(message->mutable_intrinsic_force());
if (containing_pile_up_) {
@@ -185,6 +202,7 @@ not_null<std::unique_ptr<Part>> Part::ReadFromMessage(
bool const is_pre_cesàro = message.has_tail_is_authoritative();
bool const is_pre_fréchet = message.has_mass() &&
message.has_degrees_of_freedom();
bool const is_pre_frenet = message.has_pre_frenet_inertia_tensor();

std::unique_ptr<Part> part;
if (is_pre_fréchet) {
@@ -194,15 +212,27 @@ not_null<std::unique_ptr<Part>> Part::ReadFromMessage(
part = make_not_null_unique<Part>(
message.part_id(),
message.name(),
InertiaTensor<RigidPart>::MakeWaterSphereInertiaTensor(
Mass::ReadFromMessage(message.mass()),
MakeWaterSphereInertiaTensor<RigidPart>(
Mass::ReadFromMessage(message.mass())),
RigidMotion<RigidPart, Barycentric>::MakeNonRotatingMotion(
degrees_of_freedom),
std::move(deletion_callback));
} else if (is_pre_frenet) {
part = make_not_null_unique<Part>(
message.part_id(),
message.name(),
Mass::ReadFromMessage(message.pre_frenet_inertia_tensor().mass()),
InertiaTensor<RigidPart>::ReadFromMessage(
message.pre_frenet_inertia_tensor().form()),
RigidMotion<RigidPart, Barycentric>::ReadFromMessage(
message.rigid_motion()),
std::move(deletion_callback));
} else {
part = make_not_null_unique<Part>(
message.part_id(),
message.name(),
Mass::ReadFromMessage(message.mass()),
InertiaTensor<RigidPart>::ReadFromMessage(message.inertia_tensor()),
RigidMotion<RigidPart, Barycentric>::ReadFromMessage(
message.rigid_motion()),
@@ -253,10 +283,19 @@ std::string Part::ShortDebugString() const {
return name_ + " (" + hex_id.data.get() + ")";
}

template<typename Frame>
InertiaTensor<Frame> MakeWaterSphereInertiaTensor(Mass const& mass) {
static constexpr MomentOfInertia zero;
static constexpr Density ρ_of_water = 1000 * Kilogram / Pow<3>(Metre);
MomentOfInertia const I =
Cbrt(9 * Pow<5>(mass) / (250 * Pow<2>(π * ρ_of_water)));
return InertiaTensor<Frame>(R3x3Matrix<MomentOfInertia>({I, zero, zero},
{zero, I, zero},
{zero, zero, I}));
}

std::ostream& operator<<(std::ostream& out, Part const& part) {
return out << "{"
<< part.part_id() << ", "
<< part.inertia_tensor().mass() << "}";
return out << "{" << part.part_id() << ", " << part.mass() << "}";
}

} // namespace internal_part
20 changes: 15 additions & 5 deletions ksp_plugin/part.hpp
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@
#include "geometry/grassmann.hpp"
#include "geometry/named_quantities.hpp"
#include "physics/degrees_of_freedom.hpp"
#include "physics/inertia_tensor.hpp"
#include "physics/rigid_motion.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"
@@ -27,13 +26,13 @@ namespace internal_part {

using base::not_null;
using base::Subset;
using geometry::InertiaTensor;
using geometry::Instant;
using geometry::Position;
using geometry::Vector;
using geometry::Velocity;
using physics::DegreesOfFreedom;
using physics::DiscreteTrajectory;
using physics::InertiaTensor;
using physics::RigidMotion;
using quantities::Force;
using quantities::Mass;
@@ -43,6 +42,7 @@ class Part final {
public:
Part(PartId part_id,
std::string const& name,
Mass const& mass,
InertiaTensor<RigidPart> const& inertia_tensor,
RigidMotion<RigidPart, Barycentric> const& rigid_motion,
std::function<void()> deletion_callback);
@@ -53,9 +53,12 @@ class Part final {

PartId part_id() const;

// Sets or returns the inertia tensor. Event though a part is massless in the
// sense that it doesn't exert gravity, it has inertia used to determine its
// intrinsic acceleration and rotational properties.
// Sets or returns the mass and inertia tensor. Even though a part is
// massless in the sense that it doesn't exert gravity, it has a mass and an
// inertia used to determine its intrinsic acceleration and rotational
// properties.
void set_mass(Mass const& mass);
Mass const& mass() const;
void set_inertia_tensor(InertiaTensor<RigidPart> const& inertia_tensor);
InertiaTensor<RigidPart> const& inertia_tensor() const;

@@ -131,6 +134,7 @@ class Part final {
private:
PartId const part_id_;
std::string const name_;
Mass mass_;
InertiaTensor<RigidPart> inertia_tensor_;
Vector<Force, Barycentric> intrinsic_force_;

@@ -161,11 +165,17 @@ class Part final {
std::function<void()> deletion_callback_;
};

// A factory that creates an inertia tensor for a solid sphere of water having
// the given mass. Useful, e.g., for save compatibility.
template<typename Frame>
InertiaTensor<Frame> MakeWaterSphereInertiaTensor(Mass const& mass);

std::ostream& operator<<(std::ostream& out, Part const& part);

} // namespace internal_part

using internal_part::Part;
using internal_part::MakeWaterSphereInertiaTensor;

} // namespace ksp_plugin

Loading