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, collectionItemsAreSameDefinition, dictionaryItemsAreSameDefinition, freeze, freezeAggregatedObjects, getCollectionHashCode, getCollectionHashCode, 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:
If one of these exceptions applies, the 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
non-evaluators.
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 derived-class 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 9-point 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 rate-of-change 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 sub-arcs when N is the number of quadratures.
The sub-arcs are of constant angular measure (in true anomaly, not time). To increase accuracy, make N larger.
Each sub-arc is integrated using a 9-point Gaussian quadrature (i.e. there are 9 sample points within each sub-arc).
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 9-point 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 rate-of-change 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 sub-arcs when N is the number of quadratures.
The sub-arcs are of constant angular measure (in true anomaly, not time). To increase accuracy, make N larger.
Each sub-arc is integrated using a 9-point Gaussian quadrature (i.e. there are 9 sample points within each sub-arc).
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.