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: 35898dab56a4
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: b16a892e0aba
Choose a head ref
  • 13 commits
  • 6 files changed
  • 1 contributor

Commits on Jul 2, 2020

  1. Copy the full SHA
    b48223f View commit details
  2. clean things up a bit

    eggrobin committed Jul 2, 2020
    Copy the full SHA
    edefd87 View commit details
  3. wording

    eggrobin committed Jul 2, 2020
    Copy the full SHA
    e482094 View commit details
  4. unused using

    eggrobin committed Jul 2, 2020
    Copy the full SHA
    19b7349 View commit details
  5. return

    eggrobin committed Jul 2, 2020
    Copy the full SHA
    e60074e View commit details

Commits on Jul 3, 2020

  1. lint

    eggrobin committed Jul 3, 2020
    Copy the full SHA
    4bdc14a View commit details

Commits on Jul 5, 2020

  1. some review comments

    eggrobin committed Jul 5, 2020
    1
    Copy the full SHA
    8b89db8 View commit details
  2. radial distance

    eggrobin committed Jul 5, 2020
    Copy the full SHA
    086b305 View commit details
  3. designated initializers

    eggrobin committed Jul 5, 2020
    Copy the full SHA
    3283555 View commit details
  4. C++20 for mathematica

    eggrobin committed Jul 5, 2020
    Copy the full SHA
    c8bf4b8 View commit details
  5. C++20 for all but numerics

    eggrobin committed Jul 5, 2020
    Copy the full SHA
    4ecbef7 View commit details

Commits on Jul 6, 2020

  1. Revert "designated initializers"

    This reverts commit 3283555.
    eggrobin committed Jul 6, 2020
    Copy the full SHA
    69c2c3d View commit details
  2. Merge pull request #2625 from eggrobin/mean-apsides-and-minimal-distance

    Mean apsides and minimal distance
    eggrobin authored Jul 6, 2020
    Copy the full SHA
    b16a892 View commit details
Showing with 114 additions and 22 deletions.
  1. +21 −3 astronomy/orbital_elements.hpp
  2. +46 −10 astronomy/orbital_elements_body.hpp
  3. +5 −0 ksp_plugin/interface_vessel.cpp
  4. +37 −6 ksp_plugin_adapter/orbit_analyser.cs
  5. +1 −3 principia.props
  6. +4 −0 serialization/journal.proto
24 changes: 21 additions & 3 deletions astronomy/orbital_elements.hpp
Original file line number Diff line number Diff line change
@@ -38,6 +38,8 @@ class OrbitalElements {

// The classical Keplerian elements (a, e, i, Ω, ω, M),
// together with an epoch.
// TODO(egg): consider just using KeplerianElements now that we have the
// apsides as well.
struct ClassicalElements {
Instant time;
Length semimajor_axis;
@@ -46,6 +48,9 @@ class OrbitalElements {
Angle longitude_of_ascending_node;
Angle argument_of_periapsis;
Angle mean_anomaly;

Length periapsis_distance;
Length apoapsis_distance;
};

// Mean element time series. These elements are free of short-period
@@ -101,6 +106,10 @@ class OrbitalElements {
Interval<Angle> mean_longitude_of_ascending_node_interval() const;
Interval<Angle> mean_argument_of_periapsis_interval() const;

Interval<Length> mean_periapsis_distance_interval() const;
Interval<Length> mean_apoapsis_distance_interval() const;
Interval<Length> radial_distance_interval() const;

// The equinoctial elements, and in particular the osculating equinoctial
// elements, are not directly interesting; anything that could be derived from
// them should be directly computed by this class instead. They are however
@@ -138,6 +147,10 @@ class OrbitalElements {
MassiveBody const& primary,
Body const& secondary);

template<typename PrimaryCentred>
static std::vector<Length> RadialDistances(
DiscreteTrajectory<PrimaryCentred> const& trajectory);

// |equinoctial_elements| must contain at least 2 elements.
static Time SiderealPeriod(
std::vector<EquinoctialElements> const& equinoctial_elements);
@@ -158,19 +171,24 @@ class OrbitalElements {
// element computation is based on it, so it gets computed earlier).
void ComputePeriodsAndPrecession();

// |mean_classical_elements_| must have been computed; sets
// |mean_*_interval_| accordingly.
void ComputeMeanElementIntervals();
// |radial_distances_| and |mean_classical_elements_| must have been computed;
// sets |radial_distance_interval_| and |mean_*_interval_| accordingly.
void ComputeIntervals();

std::vector<EquinoctialElements> osculating_equinoctial_elements_;
std::vector<Length> radial_distances_;
Time sidereal_period_;
std::vector<EquinoctialElements> mean_equinoctial_elements_;
std::vector<ClassicalElements> mean_classical_elements_;
Time anomalistic_period_;
Time nodal_period_;
AngularFrequency nodal_precession_;

Interval<Length> radial_distance_interval_;

Interval<Length> mean_semimajor_axis_interval_;
Interval<Length> mean_periapsis_distance_interval_;
Interval<Length> mean_apoapsis_distance_interval_;
Interval<double> mean_eccentricity_interval_;
Interval<Angle> mean_inclination_interval_;
Interval<Angle> mean_longitude_of_ascending_node_interval_;
56 changes: 46 additions & 10 deletions astronomy/orbital_elements_body.hpp
Original file line number Diff line number Diff line change
@@ -41,6 +41,7 @@ StatusOr<OrbitalElements> OrbitalElements::ForTrajectory(
}
orbital_elements.osculating_equinoctial_elements_ =
OsculatingEquinoctialElements(trajectory, primary, secondary);
orbital_elements.radial_distances_ = RadialDistances(trajectory);
orbital_elements.sidereal_period_ =
SiderealPeriod(orbital_elements.osculating_equinoctial_elements_);
if (!IsFinite(orbital_elements.sidereal_period_)) {
@@ -64,7 +65,7 @@ StatusOr<OrbitalElements> OrbitalElements::ForTrajectory(
orbital_elements.mean_classical_elements_ =
ToClassicalElements(orbital_elements.mean_equinoctial_elements_);
orbital_elements.ComputePeriodsAndPrecession();
orbital_elements.ComputeMeanElementIntervals();
orbital_elements.ComputeIntervals();
return orbital_elements;
}

@@ -111,6 +112,20 @@ inline Interval<Angle> OrbitalElements::mean_argument_of_periapsis_interval()
return mean_argument_of_periapsis_interval_;
}

inline Interval<Length> OrbitalElements::mean_periapsis_distance_interval()
const {
return mean_periapsis_distance_interval_;
}

inline Interval<Length> OrbitalElements::mean_apoapsis_distance_interval()
const {
return mean_apoapsis_distance_interval_;
}

inline Interval<Length> OrbitalElements::radial_distance_interval() const {
return radial_distance_interval_;
}

template<typename PrimaryCentred>
std::vector<OrbitalElements::EquinoctialElements>
OrbitalElements::OsculatingEquinoctialElements(
@@ -148,6 +163,20 @@ OrbitalElements::OsculatingEquinoctialElements(
return result;
}

template<typename PrimaryCentred>
std::vector<Length> OrbitalElements::RadialDistances(
DiscreteTrajectory<PrimaryCentred> const& trajectory) {
std::vector<Length> radial_distances;
radial_distances.reserve(trajectory.Size());
DegreesOfFreedom<PrimaryCentred> const primary_dof{PrimaryCentred::origin,
PrimaryCentred::unmoving};
for (auto const& [time, degrees_of_freedom] : trajectory) {
radial_distances.push_back(
(degrees_of_freedom.position() - primary_dof.position()).Norm());
}
return radial_distances;
}

inline std::vector<OrbitalElements::EquinoctialElements> const&
OrbitalElements::osculating_equinoctial_elements() const {
return osculating_equinoctial_elements_;
@@ -306,20 +335,22 @@ OrbitalElements::ToClassicalElements(
Angle const ω = ϖ - Ω;
Angle const M = equinoctial.λ - ϖ;
classical_elements.push_back(
{equinoctial.t,
equinoctial.a,
e,
i,
classical_elements.empty()
{/*.time = */ equinoctial.t,
/*.semimajor_axis = */ equinoctial.a,
/*.eccentricity = */ e,
/*.inclination = */ i,
/*.longitude_of_ascending_node = */ classical_elements.empty()
? Mod(Ω, 2 * π * Radian)
: UnwindFrom(classical_elements.back().longitude_of_ascending_node,
Ω),
classical_elements.empty()
/*.argument_of_periapsis = */ classical_elements.empty()
? Mod(ω, 2 * π * Radian)
: UnwindFrom(classical_elements.back().argument_of_periapsis, ω),
classical_elements.empty()
/*.mean_anomaly = */ classical_elements.empty()
? Mod(M, 2 * π * Radian)
: UnwindFrom(classical_elements.back().mean_anomaly, M)});
: UnwindFrom(classical_elements.back().mean_anomaly, M),
/*.periapsis_distance = */ (1 - e) * equinoctial.a,
/*.apoapsis_distance = */ (1 + e) * equinoctial.a});
}
return classical_elements;
}
@@ -377,7 +408,10 @@ inline void OrbitalElements::ComputePeriodsAndPrecession() {
nodal_precession_ = 12 * ʃ_Ωt_dt / Δt³;
}

inline void OrbitalElements::ComputeMeanElementIntervals() {
inline void OrbitalElements::ComputeIntervals() {
for (auto const& r : radial_distances_) {
radial_distance_interval_.Include(r);
}
for (auto const& elements : mean_classical_elements_) {
mean_semimajor_axis_interval_.Include(elements.semimajor_axis);
mean_eccentricity_interval_.Include(elements.eccentricity);
@@ -386,6 +420,8 @@ inline void OrbitalElements::ComputeMeanElementIntervals() {
elements.longitude_of_ascending_node);
mean_argument_of_periapsis_interval_.Include(
elements.argument_of_periapsis);
mean_periapsis_distance_interval_.Include(elements.periapsis_distance);
mean_apoapsis_distance_interval_.Include(elements.apoapsis_distance);
}
}

5 changes: 5 additions & 0 deletions ksp_plugin/interface_vessel.cpp
Original file line number Diff line number Diff line change
@@ -116,6 +116,11 @@ OrbitAnalysis* __cdecl principia__VesselRefreshAnalysis(
ToInterval(elements.mean_longitude_of_ascending_node_interval()),
.mean_argument_of_periapsis =
ToInterval(elements.mean_argument_of_periapsis_interval()),
.mean_periapsis_distance =
ToInterval(elements.mean_periapsis_distance_interval()),
.mean_apoapsis_distance =
ToInterval(elements.mean_apoapsis_distance_interval()),
.radial_distance = ToInterval(elements.radial_distance_interval()),
};
}
if (has_nominal_recurrence) {
43 changes: 37 additions & 6 deletions ksp_plugin_adapter/orbit_analyser.cs
Original file line number Diff line number Diff line change
@@ -15,6 +15,12 @@ public static string FormatN(this int value, int fractional_digits) {
return value.ToString($"N{fractional_digits}", Culture.culture);
}

// Formats |value| (given in metres) in kilometres or metres.
// TODO(egg): think about the threshold for metres.
public static string FormatAltitude(this double value) {
return $"{(value / 1000).FormatN(0)} km";
}

// Displays an interval as midpoint±half-width.
public static string FormatInterval(this Interval interval) {
double half_width = (interval.max - interval.min) / 2;
@@ -27,10 +33,13 @@ public static string FormatInterval(this Interval interval) {
}

// Displays an interval of lengths as midpoint±half-width, in km if the
// half-width is 100 m or more.
public static string FormatLengthInterval(this Interval interval) {
// half-width is 100 m or more. The midpoint is given with respect to
// |offset| (for instance, if |interval| is an interval of distances from the
// primary and |offset| is the radius of the primary, altitudes are shown).
public static string FormatLengthInterval(this Interval interval,
double offset = 0) {
double half_width = (interval.max - interval.min) / 2;
double midpoint = interval.min + half_width;
double midpoint = interval.min - offset + half_width;
string unit = "m";
if (half_width >= 100) {
half_width *= 0.001;
@@ -227,7 +236,7 @@ protected override void RenderWindow(int window_id) {
multiline_style,
UnityEngine.GUILayout.Height(five_lines));
Style.HorizontalLine();
RenderOrbitalElements(elements);
RenderOrbitalElements(elements, primary);
Style.HorizontalLine();
RenderOrbitRecurrence(recurrence, primary);
Style.HorizontalLine();
@@ -236,8 +245,24 @@ protected override void RenderWindow(int window_id) {
UnityEngine.GUI.DragWindow();
}

private void RenderOrbitalElements(OrbitalElements? elements) {
UnityEngine.GUILayout.Label("Orbital elements");
private void RenderOrbitalElements(OrbitalElements? elements,
CelestialBody primary) {
double? lowest_distance = elements?.radial_distance.min;
LabeledField(
"Lowest altitude",
(lowest_distance - primary?.Radius)?.FormatAltitude());
double? lowest_primary_altitude =
primary?.ocean == true ? 0 : primary?.pqsController?.radiusMin;
string altitude_warning = lowest_distance < lowest_primary_altitude
? "collision"
: lowest_distance < primary?.pqsController?.radiusMax
? "collision risk"
: lowest_distance < primary?.Radius + primary?.atmosphereDepth
? "reentry"
: "";
UnityEngine.GUILayout.Label(altitude_warning,
Style.Warning(UnityEngine.GUI.skin.label));
UnityEngine.GUILayout.Label("Mean orbital elements");
LabeledField("Sidereal period",
elements?.sidereal_period.FormatDuration());
LabeledField("Nodal period",
@@ -259,6 +284,12 @@ private void RenderOrbitalElements(OrbitalElements? elements) {
LabeledField(
"Argument of periapsis",
elements?.mean_argument_of_periapsis.FormatAngleInterval());
LabeledField("Altitude of mean periapsis",
elements?.mean_periapsis_distance.FormatLengthInterval(
primary.Radius));
LabeledField("Altitude of mean apoapsis",
elements?.mean_apoapsis_distance.FormatLengthInterval(
primary.Radius));
}

private void RenderOrbitRecurrence(OrbitRecurrence? recurrence,
4 changes: 1 addition & 3 deletions principia.props
Original file line number Diff line number Diff line change
@@ -74,9 +74,7 @@
<AdditionalOptions>/bigobj /w14714 /Zc:char8_t-</AdditionalOptions>
<AdditionalOptions Condition="$(ProjectName) != serialization">/w14061 %(AdditionalOptions)</AdditionalOptions>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard Condition="$(ProjectName) == astronomy or
$(ProjectName) == ksp_plugin or
$(ProjectName) == ksp_plugin_test">stdcpplatest</LanguageStandard>
<LanguageStandard Condition="$(ProjectName) != numerics">stdcpplatest</LanguageStandard>
<WarningLevel Condition="!$(PrincipiaCompilerClangLLVM)">Level3</WarningLevel>
<WarningLevel Condition="$(PrincipiaCompilerClangLLVM) and
$(ProjectName) == serialization">TurnOffAllWarnings</WarningLevel>
4 changes: 4 additions & 0 deletions serialization/journal.proto
Original file line number Diff line number Diff line change
@@ -178,6 +178,10 @@ message OrbitalElements {
required Interval mean_inclination = 7;
required Interval mean_longitude_of_ascending_nodes = 8;
required Interval mean_argument_of_periapsis = 9;
required Interval mean_periapsis_distance = 10;
required Interval mean_apoapsis_distance = 11;
// Added in Gallai.
required Interval radial_distance = 12;
}

message OrbitRecurrence {