public final class LifetimeOrbitPropagator extends DefinitionalObject
Constructor and Description 

LifetimeOrbitPropagator()
Initializes a new instance.

Modifier and Type  Method and Description 

protected boolean 
checkForSameDefinition(DefinitionalObject other)
Checks to determine if another instance has the same definition as this instance and
returns
true if it does. 
Object 
clone(CopyContext context)
Clones this object using the specified context.

protected int 
computeCurrentDefinitionHashCode()
Computes a hash code based on the current properties of this object.

OrbitLifetimeResults 
computeLifetime()
Compute the set of metrics describing the time history of the orbit as well
as the number of orbit revolutions and the time at which the orbit is expected to decay.

OrbitLifetimeResults 
computeLifetime(ITrackCalculationProgress progress)
Compute the set of metrics describing the time history of the orbit as well
as the number of orbit revolutions and the time at which the orbit is expected to decay.

void 
enumerateDependencies(DependencyEnumerator enumerator)
Enumerates the dependencies of this object by calling
DependencyEnumerator#enumerate(T) for each object that this object directly depends upon. 
ScalarAtmosphericDensity 
getAtmosphericDensity()
Gets the model for atmospheric density.

CentralBody 
getCentralBody()
Gets the instance to use to define the principal frame and shape of the central body.

double 
getDecayAltitude()
Gets the altitude to use to determine when a satellite will permanently decay.

double 
getDragCoefficient()
Gets the coefficient of drag associated with the aerodynamic profile of the satellite.

double 
getDragCrossSectionalArea()
Gets the mean area of the satellite which is presented perpendicular to the relative velocity
of the atmosphere and produces drag.

Duration 
getDurationLimit()

KozaiIzsakMeanElements 
getInitialConditions()
Gets the mean elements representing the initial conditions of the orbit.

JulianDate 
getInitialEpoch()

int 
getNumberOfGaussianQuadratures()
Gets the number of Gaussian quadratures to use when integrating.

int 
getOrbitCountLimit()
Gets the number of orbits past which to stop propagation.

LifetimeCalculationLimitType 
getOrbitLimitType()
Gets the limitation for when the lifetime propagator calculation should stop its iteration.

int 
getOrbitsPerCalculation()
Gets the number of complete orbits to propagate as part of a single iteration of the integration
of the orbital parameters over time.

double 
getReflectiveCrossSectionalArea()
Gets the mean area presented to the illuminating body (the Sun) during propagation, in square meters.

double 
getReflectivityCoefficient()
Gets the coefficient of reflectivity for the satellite.

double 
getSatelliteMass()
Gets the mass of the satellite, in kilograms.

boolean 
getUseRotatingAtmosphere()
Gets a value indicating whether to model the atmosphere as rotating rather than static.

boolean 
getUseSecondOrderOblatenessCorrection()
Gets a value indicating whether to use second order oblateness (J2) correction when propagating the mean orbital elements.

void 
setAtmosphericDensity(ScalarAtmosphericDensity value)
Sets the model for atmospheric density.

void 
setCentralBody(CentralBody value)
Sets the instance to use to define the principal frame and shape of the central body.

void 
setDecayAltitude(double value)
Sets the altitude to use to determine when a satellite will permanently decay.

void 
setDragCoefficient(double value)
Sets the coefficient of drag associated with the aerodynamic profile of the satellite.

void 
setDragCrossSectionalArea(double value)
Sets the mean area of the satellite which is presented perpendicular to the relative velocity
of the atmosphere and produces drag.

void 
setDurationLimit(Duration value)

void 
setInitialConditions(KozaiIzsakMeanElements value)
Sets the mean elements representing the initial conditions of the orbit.

void 
setInitialEpoch(JulianDate value)

void 
setNumberOfGaussianQuadratures(int value)
Sets the number of Gaussian quadratures to use when integrating.

void 
setOrbitCountLimit(int value)
Sets the number of orbits past which to stop propagation.

void 
setOrbitLimitType(LifetimeCalculationLimitType value)
Sets the limitation for when the lifetime propagator calculation should stop its iteration.

void 
setOrbitsPerCalculation(int value)
Sets the number of complete orbits to propagate as part of a single iteration of the integration
of the orbital parameters over time.

void 
setReflectiveCrossSectionalArea(double value)
Sets the mean area presented to the illuminating body (the Sun) during propagation, in square meters.

void 
setReflectivityCoefficient(double value)
Sets the coefficient of reflectivity for the satellite.

void 
setSatelliteMass(double value)
Sets the mass of the satellite, in kilograms.

void 
setUseRotatingAtmosphere(boolean value)
Sets a value indicating whether to model the atmosphere as rotating rather than static.

void 
setUseSecondOrderOblatenessCorrection(boolean value)
Sets a value indicating whether to use second order oblateness (J2) correction when propagating the mean orbital elements.

areSameDefinition, areSameDefinition, areSameDefinition, areSameDefinition, areSameDefinition, collectionItemsAreSameDefinition, collectionItemsAreSameDefinition, dictionaryItemsAreSameDefinition, freeze, freezeAggregatedObjects, getCollectionHashCode, getDefinitionHashCode, getDefinitionHashCode, getDefinitionHashCode, getDefinitionHashCode, getDefinitionHashCode, getDefinitionHashCode, getDictionaryHashCode, getIsFrozen, isSameDefinition, throwIfFrozen
public LifetimeOrbitPropagator()
public Object clone(CopyContext context)
This method should be implemented to call a copy constructor on the class of the
object being cloned. The copy constructor should take the CopyContext
as a parameter
in addition to the existing instance to copy. The copy constructor should first call
CopyContext.addObjectMapping(T, T)
to identify the newly constructed instance
as a copy of the existing instance. It should then copy all fields, using
CopyContext.updateReference(T)
to copy any reference fields.
A typical implementation of ICloneWithContext
:
public static class MyClass implements ICloneWithContext {
public MyClass(MyClass existingInstance, CopyContext context) {
context.addObjectMapping(existingInstance, this);
someReference = context.updateReference(existingInstance.someReference);
}
@Override
public final Object clone(CopyContext context) {
return new MyClass(this, context);
}
private Object someReference;
}
In general, all fields that are reference types should be copied with a call to
CopyContext.updateReference(T)
. There are a couple of exceptions:
CopyContext
should be given an opportunity
to update the reference before the reference is copied explicitly. Use
CopyContext.updateReference(T)
to update the reference. If CopyContext.updateReference(T)
returns
the original object, indicating that the context does not have a replacement registered,
then copy the object manually by invoking a Clone method, a copy constructor, or by manually
constructing a new instance and copying the values.
alwaysCopy = context.updateReference(existingInstance.alwaysCopy);
if (existingInstance.alwaysCopy != null && alwaysCopy == existingInstance.alwaysCopy) {
alwaysCopy = (AlwaysCopy) existingInstance.alwaysCopy.clone(context);
}
If you are implementing an evaluator (a class that implements IEvaluator
), the
IEvaluator.updateEvaluatorReferences(agi.foundation.infrastructure.CopyContext)
method shares some responsibilities with the
copy context constructor. Code duplication can be avoided by doing the following:
CopyContext.updateReference(T)
. You should still call CopyContext.updateReference(T)
on any references to
nonevaluators.
IEvaluator.updateEvaluatorReferences(agi.foundation.infrastructure.CopyContext)
as the last line in the constructor and pass it the
same CopyContext
passed to the constructor.
IEvaluator.updateEvaluatorReferences(agi.foundation.infrastructure.CopyContext)
as normal. See the reference documentation for
IEvaluator.updateEvaluatorReferences(agi.foundation.infrastructure.CopyContext)
for more information on implementing that method.
public MyClass(MyClass existingInstance, CopyContext context) {
super(existingInstance, context);
someReference = context.updateReference(existingInstance.someReference);
evaluatorReference = existingInstance.evaluatorReference;
updateEvaluatorReferences(context);
}
@Override
public void updateEvaluatorReferences(CopyContext context) {
evaluatorReference = context.updateReference(evaluatorReference);
}
@Override
public Object clone(CopyContext context) {
return new MyClass(this, context);
}
private Object someReference;
private IEvaluator evaluatorReference;
clone
in interface ICloneWithContext
clone
in class DefinitionalObject
context
 The context to use to perform the copy.protected boolean checkForSameDefinition(DefinitionalObject other)
true
if it does. Derived classes MUST override this method and check
all new fields introduced by the derived class for definitional equivalence. It is NOT necessary
to check base class fields because the base class will already have done that. When overriding this method,
you should NOT call the base implementation because it will return false
for all derivedclass instances.
Derived classes should check the type of other
to preserve the symmetric nature of IEquatableDefinition.isSameDefinition(java.lang.Object)
.checkForSameDefinition
in class DefinitionalObject
other
 The other instance to compare to this one.true
if the two objects are defined equivalently; otherwise false
.protected int computeCurrentDefinitionHashCode()
LifetimeOrbitPropagator.checkForSameDefinition(agi.foundation.infrastructure.DefinitionalObject)
method.computeCurrentDefinitionHashCode
in class DefinitionalObject
public void enumerateDependencies(DependencyEnumerator enumerator)
DependencyEnumerator#enumerate(T)
for each object that this object directly depends upon.
Derived classes which contain additional dependencies MUST override this method, call the base
implementation, and enumerate dependencies introduced by the derived class.enumerateDependencies
in interface IEnumerateDependencies
enumerateDependencies
in class DefinitionalObject
enumerator
 The enumerator that is informed of the dependencies of this object.public final CentralBody getCentralBody()
EarthCentralBody
from the CentralBodiesFacet
.public final void setCentralBody(CentralBody value)
EarthCentralBody
from the CentralBodiesFacet
.public final ScalarAtmosphericDensity getAtmosphericDensity()
public final void setAtmosphericDensity(ScalarAtmosphericDensity value)
@Nonnull public final LifetimeCalculationLimitType getOrbitLimitType()
public final void setOrbitLimitType(@Nonnull LifetimeCalculationLimitType value)
public final KozaiIzsakMeanElements getInitialConditions()
public final void setInitialConditions(KozaiIzsakMeanElements value)
public final int getOrbitCountLimit()
public final void setOrbitCountLimit(int value)
public final int getOrbitsPerCalculation()
public final void setOrbitsPerCalculation(int value)
public final int getNumberOfGaussianQuadratures()
OrbitsPerCalculation
(get
/ set
),
this parameter directly affects the performance of the propagator as well as the accuracy of its results.
The drag integration routine is performed by N 9point Gaussian quadratures per orbit, where N is the number set here.
By default, this is set to 6 to ensure accuracy, but can be lowered to improve performance. To determine lifetime,
the routine approximately integrates the slowly varying orbit elements over time. It does this by integrating
over one orbit to determine the rateofchange of each variable, and then assumes this rate is constant for N number of
OrbitsPerCalculation
(get
/ set
). The integration of 1 orbit is done over N subarcs when N is the number of quadratures.
The subarcs are of constant angular measure (in true anomaly, not time). To increase accuracy, make N larger.
Each subarc is integrated using a 9point Gaussian quadrature (i.e. there are 9 sample points within each subarc).
Highly eccentric satellites, which are in higher drag regimes for very short times compared with their period will need
to take much higher numbers of gaussian quadratures to ensure that drag is sampled adequately.public final void setNumberOfGaussianQuadratures(int value)
OrbitsPerCalculation
(get
/ set
),
this parameter directly affects the performance of the propagator as well as the accuracy of its results.
The drag integration routine is performed by N 9point Gaussian quadratures per orbit, where N is the number set here.
By default, this is set to 6 to ensure accuracy, but can be lowered to improve performance. To determine lifetime,
the routine approximately integrates the slowly varying orbit elements over time. It does this by integrating
over one orbit to determine the rateofchange of each variable, and then assumes this rate is constant for N number of
OrbitsPerCalculation
(get
/ set
). The integration of 1 orbit is done over N subarcs when N is the number of quadratures.
The subarcs are of constant angular measure (in true anomaly, not time). To increase accuracy, make N larger.
Each subarc is integrated using a 9point Gaussian quadrature (i.e. there are 9 sample points within each subarc).
Highly eccentric satellites, which are in higher drag regimes for very short times compared with their period will need
to take much higher numbers of gaussian quadratures to ensure that drag is sampled adequately.public final boolean getUseSecondOrderOblatenessCorrection()
public final void setUseSecondOrderOblatenessCorrection(boolean value)
public final double getReflectivityCoefficient()
public final void setReflectivityCoefficient(double value)
public final double getReflectiveCrossSectionalArea()
public final void setReflectiveCrossSectionalArea(double value)
public final double getSatelliteMass()
public final void setSatelliteMass(double value)
public final double getDragCoefficient()
ScalarAtmosphericDensity
and DragCrossSectionalArea
(get
/ set
)
and the drag coefficient provides a proportional measure of how much the body is affected by atmospheric drag.
This value must not be negative and is usually in the range between 2.0 and 2.2.public final void setDragCoefficient(double value)
ScalarAtmosphericDensity
and DragCrossSectionalArea
(get
/ set
)
and the drag coefficient provides a proportional measure of how much the body is affected by atmospheric drag.
This value must not be negative and is usually in the range between 2.0 and 2.2.public final double getDragCrossSectionalArea()
public final void setDragCrossSectionalArea(double value)
public final boolean getUseRotatingAtmosphere()
public final void setUseRotatingAtmosphere(boolean value)
public final double getDecayAltitude()
public final void setDecayAltitude(double value)
@Nonnull public final JulianDate getInitialEpoch()
public final void setInitialEpoch(@Nonnull JulianDate value)
public final OrbitLifetimeResults computeLifetime()
OrbitCountLimit
(get
/ set
) or DurationLimit
(get
/ set
)
the results will not represent a decayed orbit. This can also happen if there is a problem
with the initial state or something else went wrong during propagation. Check the
Status
(get
/ set
) in order to determine whether the calculation
completed successfully
.public final OrbitLifetimeResults computeLifetime(ITrackCalculationProgress progress)
OrbitCountLimit
(get
/ set
) or DurationLimit
(get
/ set
)
the results will not represent a decayed orbit. This can also happen if there is a problem
with the initial state or something else went wrong during propagation. Check the
Status
(get
/ set
) in order to determine whether the calculation
completed successfully
.progress
 A progress tracker that can support reporting progress during calculation
as well as cancellation.