Details
-
Type:
Bug
-
Status: Open (View workflow)
-
Priority:
P1
-
Resolution: Unresolved
-
Affects versions: None
-
Fix versions: R2021a
-
Components: Finite Burn (FRR-12), ForceModel
-
Labels:
-
Sprint:Current Release
Description
In some calculations, the GMAT finite burn models use the state and epoch data from the spacecraft rather than from the propagator. This produced subtly incorrect accelerations that may grow over time, resulting in poor modeling of the trajectory. The issue is that the numerical integrators evaluate forces at intermediate states during propagation ("stages" for the Runge-Kuttas and , and in the "predictor" code for the ABM). The spacecraft state, mass, and epoch are not updated at these stages, so code that calls the spacecraft for those settings returns the wrong values.
Here is a list of places that use this approach:
FiniteBurn.cpp:
Definite Issue:
bool FiniteBurn::Fire(Real burnData, Real epoch, bool /*backwards/)
{
...
tMass = spacecraft->GetRealParameter("TotalMass");
(Likely of no consequence, but need to be checked):
bool FiniteBurn::TakeAction(const std::string& action,
const std::string& actionData)
{
...
else if (action == "SetData")
{
if (spacecraft)
{
// Load starting data into the data buffer
Real epoch = spacecraft->GetEpoch();
PowerSystem.cpp:
Definite Issue:
Real PowerSystem::GetBasePower() const
{
Real atEpoch = spacecraft->GetEpoch();
Real PowerSystem::GetSpacecraftBusPower() const
{
Real atEpoch = spacecraft->GetEpoch();
Real *state = (spacecraft->GetState()).GetState();
Real PowerSystem::GetThrustPower() const
{
Real atEpoch = spacecraft->GetEpoch();
Real PowerSystem::GetSunToSCDistance(Real atEpoch) const
{
Real *state = (spacecraft->GetState()).GetState(); // wrt Earth NOT wrt Origin
SolarPowerSystem.cpp:
Definite Issue:
Real SolarPowerSystem::GetPowerGenerated() const
{
...
// Get the spacecraft epoch and state
Real atEpoch = spacecraft->GetEpoch();
Real *stateRelToEarth = (spacecraft->GetState()).GetState();
Thruster.cpp:
Calls made to (check that the epoch is correct):
void Thruster::ConvertDirectionToInertial(Real *dir, Real *dirInertial, Real epoch)
{
...
Rmatrix33 inertialToBody = spacecraft->GetAttitude(epoch);
(Likely of no consequence, but need to be checked):
bool Thruster::Initialize()
{
...
// Convert direction to inertial coord system
Real epoch = spacecraft->GetRealParameter("A1Epoch");
The FiniteThrust model calls FiniteBurn, which then calls the hardware elements. The current code does not pass the stage state data into the "Fire" call used to get the thrust and mass flow data. That method needs to pass in the data, and then the FiniteFrust force needs to use that data and pass it into the hardware.
Note that the thrust history file does not have this issue because it implements the acceleration as a force directly, rather than through calls to other objects.