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: 8dca142c257d
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 00e952ce3b2f
Choose a head ref
  • 5 commits
  • 4 files changed
  • 3 contributors

Commits on Feb 19, 2020

  1. Serialization of EulerSolver.

    pleroy committed Feb 19, 2020
    Copy the full SHA
    d756036 View commit details
  2. Cleanup.

    pleroy committed Feb 19, 2020
    Copy the full SHA
    6cbd545 View commit details

Commits on Feb 20, 2020

  1. After egg's review.

    pleroy committed Feb 20, 2020
    Copy the full SHA
    56afd15 View commit details
  2. Merge pull request #2474 from pleroy/EulerSerialization

    Serialization of EulerSolver
    pleroy authored Feb 20, 2020
    Copy the full SHA
    764cf8e View commit details

Commits on Feb 22, 2020

  1. Copy the full SHA
    00e952c View commit details
Showing with 81 additions and 2 deletions.
  1. +10 −0 physics/euler_solver.hpp
  2. +25 −1 physics/euler_solver_body.hpp
  3. +39 −1 physics/euler_solver_test.cpp
  4. +7 −0 serialization/physics.proto
10 changes: 10 additions & 0 deletions physics/euler_solver.hpp
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@

#include <optional>

#include "base/not_null.hpp"
#include "geometry/frame.hpp"
#include "geometry/grassmann.hpp"
#include "geometry/named_quantities.hpp"
@@ -11,11 +12,13 @@
#include "geometry/signature.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"
#include "serialization/physics.pb.h"

namespace principia {
namespace physics {
namespace internal_euler_solver {

using base::not_null;
using geometry::AngularVelocity;
using geometry::Bivector;
using geometry::Frame;
@@ -67,6 +70,10 @@ class EulerSolver {
Bivector<AngularMomentum, PrincipalAxesFrame> const& angular_momentum,
Instant const& time) const;

void WriteToMessage(
not_null<serialization::EulerSolver*> const message) const;
static EulerSolver ReadFromMessage(serialization::EulerSolver const& message);

private:
using ℬₜ = Frame<enum class ℬₜTag>;
using ℬʹ = Frame<enum class ℬʹTag>;
@@ -104,6 +111,9 @@ class EulerSolver {

// Construction parameters.
R3Element<MomentOfInertia> const moments_of_inertia_;
Bivector<AngularMomentum, InertialFrame> const
serialized_initial_angular_momentum_;
AttitudeRotation const initial_attitude_;
Instant const initial_time_;
AngularMomentum const G_;
PreferredAngularMomentumBivector initial_angular_momentum_;
26 changes: 25 additions & 1 deletion physics/euler_solver_body.hpp
Original file line number Diff line number Diff line change
@@ -54,6 +54,8 @@ EulerSolver<InertialFrame, PrincipalAxesFrame>::EulerSolver(
AttitudeRotation const& initial_attitude,
Instant const& initial_time)
: moments_of_inertia_(moments_of_inertia),
serialized_initial_angular_momentum_(initial_angular_momentum),
initial_attitude_(initial_attitude),
initial_time_(initial_time),
G_(initial_angular_momentum.Norm()),
ℛ_(Rotation<ℬʹ, InertialFrame>::Identity()),
@@ -300,7 +302,7 @@ EulerSolver<InertialFrame, PrincipalAxesFrame>::AngularMomentumAt(
{B₁₃_ * sech, G_ * Tanh(angle), B₃₁_ * sech});
break;
}
case Formula::Sphere : {
case Formula::Sphere: {
m = initial_angular_momentum_;
break;
}
@@ -397,6 +399,28 @@ EulerSolver<InertialFrame, PrincipalAxesFrame>::AttitudeAt(
}
}

template<typename InertialFrame, typename PrincipalAxesFrame>
void EulerSolver<InertialFrame, PrincipalAxesFrame>::WriteToMessage(
not_null<serialization::EulerSolver*> const message) const {
moments_of_inertia_.WriteToMessage(message->mutable_moments_of_inertia());
serialized_initial_angular_momentum_.WriteToMessage(
message->mutable_initial_angular_momentum());
initial_attitude_.WriteToMessage(message->mutable_initial_attitude());
initial_time_.WriteToMessage(message->mutable_initial_time());
}

template<typename InertialFrame, typename PrincipalAxesFrame>
EulerSolver<InertialFrame, PrincipalAxesFrame>
EulerSolver<InertialFrame, PrincipalAxesFrame>::ReadFromMessage(
serialization::EulerSolver const& message) {
return EulerSolver(
R3Element<MomentOfInertia>::ReadFromMessage(message.moments_of_inertia()),
Bivector<AngularMomentum, InertialFrame>::ReadFromMessage(
message.initial_angular_momentum()),
AttitudeRotation::ReadFromMessage(message.initial_attitude()),
Instant::ReadFromMessage(message.initial_time()));
}

template<typename InertialFrame, typename PrincipalAxesFrame>
Rotation<typename EulerSolver<InertialFrame,
PrincipalAxesFrame>::PreferredPrincipalAxesFrame,
40 changes: 39 additions & 1 deletion physics/euler_solver_test.cpp
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
#include "testing_utilities/approximate_quantity.hpp"
#include "testing_utilities/componentwise.hpp"
#include "testing_utilities/is_near.hpp"
#include "testing_utilities/matchers.hpp"
#include "testing_utilities/numerics_matchers.hpp"
#include "testing_utilities/vanishes_before.hpp"

@@ -37,11 +38,13 @@ using astronomy::ICRS;
using astronomy::operator""_UTC;
using geometry::AngleBetween;
using geometry::AngularVelocity;
using geometry::Arbitrary;
using geometry::Bivector;
using geometry::DefinesFrame;
using geometry::EulerAngles;
using geometry::EvenPermutation;
using geometry::Frame;
using geometry::Handedness;
using geometry::Instant;
using geometry::OrthogonalMap;
using geometry::Permutation;
@@ -67,6 +70,7 @@ using testing_utilities::AbsoluteErrorFrom;
using testing_utilities::AlmostEquals;
using testing_utilities::ApproximateQuantity;
using testing_utilities::Componentwise;
using testing_utilities::EqualsProto;
using testing_utilities::IsNear;
using testing_utilities::RelativeError;
using testing_utilities::RelativeErrorFrom;
@@ -78,7 +82,10 @@ using ::testing::Matcher;

class EulerSolverTest : public ::testing::Test {
protected:
using PrincipalAxes = Frame<enum class PrincipalAxesTag>;
using PrincipalAxes = Frame<serialization::Frame::TestTag,
Arbitrary,
Handedness::Right,
serialization::Frame::TEST>;

using Solver = EulerSolver<ICRS, PrincipalAxes>;

@@ -1168,5 +1175,36 @@ TEST_F(EulerSolverTest, Toutatis) {
}
}

TEST_F(EulerSolverTest, Serialization) {
R3Element<MomentOfInertia> const moments_of_inertia{
3.0 * SIUnit<MomentOfInertia>(),
5.0 * SIUnit<MomentOfInertia>(),
9.0 * SIUnit<MomentOfInertia>()};

Bivector<AngularMomentum, PrincipalAxes> const initial_angular_momentum(
{0.0 * SIUnit<AngularMomentum>(),
2.0 * SIUnit<AngularMomentum>(),
0.01 * SIUnit<AngularMomentum>()});
Solver::AttitudeRotation const initial_attitude = identity_attitude_;

Solver const solver1(moments_of_inertia,
initial_attitude(initial_angular_momentum),
initial_attitude,
Instant() + 3 * Second);

serialization::EulerSolver message1;
solver1.WriteToMessage(&message1);

auto const solver2 = Solver::ReadFromMessage(message1);

EXPECT_EQ(solver1.AngularMomentumAt(Instant() + 5 * Second),
solver2.AngularMomentumAt(Instant() + 5 * Second));

serialization::EulerSolver message2;
solver2.WriteToMessage(&message2);

EXPECT_THAT(message2, EqualsProto(message1));
}

} // namespace physics
} // namespace principia
7 changes: 7 additions & 0 deletions serialization/physics.proto
Original file line number Diff line number Diff line change
@@ -135,6 +135,13 @@ message Ephemeris {
reserved "planetary_integrator", "step";
}

message EulerSolver {
required R3Element moments_of_inertia = 1;
required Multivector initial_angular_momentum = 2;
required Rotation initial_attitude = 3;
required Point initial_time = 4;
}

message HierarchicalSystem {
message Subsystem {
required MassiveBody primary = 1;