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)
{