diff --git a/IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj b/IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj index ebc556b..10c91ed 100644 --- a/IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj +++ b/IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj @@ -9,7 +9,7 @@ 0.0.1 true astro - 0.1.12 + 0.1.13 Astrodynamics command line interface Sylvain Guillet This CLI allows end user to exploit IO.Astrodynamics framework diff --git a/IO.Astrodynamics.Tests/Mission/ScenarioTests.cs b/IO.Astrodynamics.Tests/Mission/ScenarioTests.cs index 8dfc802..a79fe93 100644 --- a/IO.Astrodynamics.Tests/Mission/ScenarioTests.cs +++ b/IO.Astrodynamics.Tests/Mission/ScenarioTests.cs @@ -194,6 +194,60 @@ public async Task PropagateSpacecraft() Assert.Equal(2281.6927232547719, summary.SpacecraftSummaries.First().FuelConsumption, 3); } + [Fact] + public async Task PropagateSpacecraftWithAttitudeOnly() + { + DateTime start = new DateTime(2024, 7, 30, 13, 48, 30, DateTimeKind.Utc); + DateTime end = new DateTime(2024, 7, 31, 13, 48, 33, DateTimeKind.Utc); + + Astrodynamics.Mission.Mission mission = new Astrodynamics.Mission.Mission("mission02"); + Scenario scenario = new Scenario("scn1", mission, new Window(start, end)); + scenario.AddCelestialItem(TestHelpers.EarthAtJ2000); + + //Define parking orbit + StateVector parkingOrbit = new StateVector( + new Vector3(6800000.0, 0.0, 0.0), + new Vector3(0.0, 8000.0, 0.0), TestHelpers.EarthAtJ2000, + start, Frames.Frame.ICRF); + + //Create and configure spacecraft + Clock clock = new Clock("clk1", 65536); + Spacecraft spacecraft = new Spacecraft(-1783, "DRAGONFLY3", 1000.0, 10000.0, clock, parkingOrbit); + + FuelTank fuelTank = new FuelTank("ft1", "model1", "sn1", 9000.0, 9000.0); + Engine engine = new Engine("engine1", "model1", "sn1", 450.0, 50.0, fuelTank); + spacecraft.AddFuelTank(fuelTank); + spacecraft.AddEngine(engine); + + var progradeAttitude = new ProgradeAttitude(TestHelpers.EarthAtJ2000, DateTime.MinValue, TimeSpan.Zero, engine); + spacecraft.SetStandbyManeuver(progradeAttitude); + + scenario.AddSpacecraft(spacecraft); + + var summary = await scenario.SimulateAsync(Constants.OutputPath, false, false, TimeSpan.FromSeconds(1.0)); + + // Read maneuver results + Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.StartDate.ToFormattedString()); + Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ManeuverWindow?.EndDate.ToFormattedString()); + Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.StartDate.ToFormattedString()); + Assert.Equal("2024-07-30T13:49:39.1839998 (TDB)", progradeAttitude.ThrustWindow?.EndDate.ToFormattedString()); + Assert.Equal(0.0, progradeAttitude.ThrustWindow.Value.Length.TotalSeconds, 3); + + Assert.Equal(0.0, progradeAttitude.FuelBurned, 0); + + + Assert.Equal(scenario.Window, summary.Window); + Assert.Single(summary.SpacecraftSummaries); + var maneuverWindow = summary.SpacecraftSummaries.First().ManeuverWindow; + if (maneuverWindow != null) + { + Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.StartDate, TimeSpan.FromMilliseconds(1)); + Assert.Equal(DateTime.Parse("2024-07-30T13:49:39.1839998"), maneuverWindow.Value.EndDate, TimeSpan.FromMilliseconds(1)); + } + + Assert.Equal(0.0, summary.SpacecraftSummaries.First().FuelConsumption, 3); + } + [Fact] public async Task PropagateSpacecraftFromTLE() { @@ -221,10 +275,10 @@ public async Task PropagateSpacecraftFromTLE() Assert.Equal( new StateVector(new Vector3(-2194696.277452762, 6520464.634645089, -8851312.715000605), new Vector3(-4855.389207947987, 5010.690350306962, 2785.4343115066577), - site, start, Frames.Frame.ICRF), initialSV); + site, start, Frames.Frame.ICRF), initialSV.ToStateVector(), TestHelpers.StateVectorComparer); Assert.Equal( - new StateVector(new Vector3(-8877878.268430736, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271), - site, end, Frames.Frame.ICRF), endSV); + new StateVector(new Vector3(-8877878.268430738, 2497878.6999986176, 1044081.578034049), new Vector3(969.7356590081705, -7707.414993293412, 1627.9865491886271), + site, end, Frames.Frame.ICRF), endSV.ToStateVector(), TestHelpers.StateVectorComparer); } [Fact] diff --git a/IO.Astrodynamics/IO.Astrodynamics.nuspec b/IO.Astrodynamics/IO.Astrodynamics.nuspec index 8863b33..d6c3359 100644 --- a/IO.Astrodynamics/IO.Astrodynamics.nuspec +++ b/IO.Astrodynamics/IO.Astrodynamics.nuspec @@ -4,7 +4,7 @@ IO.Astrodynamics Sylvain Guillet Sylvain Guillet - 3.2.2 + 3.2.3 Astrodynamics framework images\dragonfly-dark-trans.png docs\README.md diff --git a/IO.Astrodynamics/Propagator/SpacecraftPropagator.cs b/IO.Astrodynamics/Propagator/SpacecraftPropagator.cs index b5c9ea0..4537acf 100644 --- a/IO.Astrodynamics/Propagator/SpacecraftPropagator.cs +++ b/IO.Astrodynamics/Propagator/SpacecraftPropagator.cs @@ -41,13 +41,13 @@ public class SpacecraftPropagator : IPropagator /// /// Simulation step size /// - public SpacecraftPropagator(Window window, Spacecraft spacecraft, IEnumerable additionalCelestialBodies, bool includeAtmosphericDrag, + public SpacecraftPropagator(in Window window, Spacecraft spacecraft, IEnumerable additionalCelestialBodies, bool includeAtmosphericDrag, bool includeSolarRadiationPressure, TimeSpan deltaT) { var ssb = new Barycenter(Barycenters.SOLAR_SYSTEM_BARYCENTER.NaifId); _originalObserver = spacecraft.InitialOrbitalParameters.Observer as CelestialItem; Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft)); - Window = window; + Window = new Window(window.StartDate.ToTDB(),window.EndDate.ToTDB()); CelestialItems = additionalCelestialBodies ?? Array.Empty(); IncludeAtmosphericDrag = includeAtmosphericDrag; IncludeSolarRadiationPressure = includeSolarRadiationPressure; @@ -97,7 +97,7 @@ private List InitializeForces(bool includeAtmosphericDrag, bool inclu /// public (IEnumerablestateVectors, IEnumerablestateOrientations) Propagate() { - _stateOrientation[Window.StartDate] = new StateOrientation(Quaternion.Zero, Vector3.Zero, Window.StartDate, Spacecraft.InitialOrbitalParameters.Frame); + _stateOrientation[_svCache.First().Epoch] = new StateOrientation(Quaternion.Zero, Vector3.Zero, _svCache.First().Epoch, Spacecraft.InitialOrbitalParameters.Frame); for (int i = 0; i < _svCacheSize - 1; i++) { var prvSv = _svCache[i]; diff --git a/IO.Astrodynamics/Propagator/TLEPropagator.cs b/IO.Astrodynamics/Propagator/TLEPropagator.cs index 7dc2a71..8ebbe92 100644 --- a/IO.Astrodynamics/Propagator/TLEPropagator.cs +++ b/IO.Astrodynamics/Propagator/TLEPropagator.cs @@ -18,7 +18,7 @@ public class TLEPropagator : IPropagator public TLEPropagator(Window window, Spacecraft spacecraft, TimeSpan deltaT) { - Window = window; + Window = new Window(window.StartDate.ToTDB(), window.EndDate.ToTDB()); Spacecraft = spacecraft ?? throw new ArgumentNullException(nameof(spacecraft)); if (Spacecraft.InitialOrbitalParameters is not TLE) {