Skip to content
Snippets Groups Projects
Verified Commit 4a62fa63 authored by Shiva Iyer's avatar Shiva Iyer
Browse files

Issue #615: Added addAdditionalEquations() in AbstractPropagatorBuilder.

parent 96ce7168
No related branches found
No related tags found
No related merge requests found
......@@ -16,16 +16,20 @@
*/
package org.orekit.propagation.conversion;
import java.util.ArrayList;
import java.util.List;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.hipparchus.util.FastMath;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.errors.OrekitIllegalArgumentException;
import org.orekit.forces.gravity.NewtonianAttraction;
import org.orekit.frames.Frame;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.integration.AdditionalEquations;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.ParameterDriversList;
......@@ -70,6 +74,9 @@ public abstract class AbstractPropagatorBuilder implements PropagatorBuilder {
/** Position scale to use for the orbital drivers. */
private final double positionScale;
/** Additional equations. */
protected List<AdditionalEquations> additionalEquations;
/** Build a new instance.
* <p>
* The template orbit is used as a model to {@link
......@@ -110,6 +117,8 @@ public abstract class AbstractPropagatorBuilder implements PropagatorBuilder {
driver.setSelected(true);
}
this.additionalEquations = new ArrayList<AdditionalEquations>();
if (addDriverForCentralAttraction) {
final ParameterDriver muDriver = new ParameterDriver(NewtonianAttraction.CENTRAL_ATTRACTION_COEFFICIENT,
mu, MU_SCALE, 0, Double.POSITIVE_INFINITY);
......@@ -293,4 +302,15 @@ public abstract class AbstractPropagatorBuilder implements PropagatorBuilder {
// Change the initial orbit date in the builder
this.initialOrbitDate = newOrbit.getDate();
}
/** Add a set of user-specified equations to be integrated along with the orbit propagation.
* @param additional additional equations
* @author Shiva Iyer
* @since 10.1
*/
public void addAdditionalEquations(final AdditionalEquations additional) {
additionalEquations.add(additional);
}
}
......@@ -34,6 +34,7 @@ import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.integration.AdditionalEquations;
import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
import org.orekit.propagation.semianalytical.dsst.forces.DSSTForceModel;
import org.orekit.propagation.semianalytical.dsst.forces.DSSTNewtonianAttraction;
......@@ -213,6 +214,11 @@ public class DSSTPropagatorBuilder extends AbstractPropagatorBuilder implements
propagator.setInitialState(state, stateType);
// Add additional equations to the propagator
for (AdditionalEquations equation: additionalEquations) {
propagator.addAdditionalEquations(equation);
}
return propagator;
}
......
......@@ -33,6 +33,7 @@ import org.orekit.orbits.Orbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.integration.AdditionalEquations;
import org.orekit.propagation.numerical.NumericalPropagator;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.ParameterDriversList;
......@@ -206,6 +207,11 @@ public class NumericalPropagatorBuilder extends AbstractPropagatorBuilder implem
propagator.resetInitialState(state);
// Add additional equations to the propagator
for (AdditionalEquations equation: additionalEquations) {
propagator.addAdditionalEquations(equation);
}
return propagator;
}
......
......@@ -29,6 +29,8 @@ import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.orbits.EquinoctialOrbit;
......@@ -37,6 +39,7 @@ import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.integration.AdditionalEquations;
import org.orekit.propagation.numerical.NumericalPropagator;
import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
import org.orekit.propagation.semianalytical.dsst.forces.DSSTForceModel;
......@@ -201,6 +204,53 @@ public class DSSTPropagatorBuilderTest {
assertTrue(hasNewtonianAttraction(builder.getAllForceModels()));
}
@Test
public void testAdditionalEquations() {
// Integrator builder
final ODEIntegratorBuilder dp54Builder = new DormandPrince54IntegratorBuilder(minStep, maxStep, dP);
// Propagator builder
final DSSTPropagatorBuilder builder = new DSSTPropagatorBuilder(orbit,
dp54Builder,
1.0,
PropagationType.MEAN,
PropagationType.MEAN);
builder.addForceModel(moon);
builder.addForceModel(sun);
// Add additional equations
builder.addAdditionalEquations(new AdditionalEquations() {
public String getName() {
return "linear";
}
public double[] computeDerivatives(SpacecraftState s, double[] pDot) {
pDot[0] = 1.0;
return new double[7];
}
});
builder.addAdditionalEquations(new AdditionalEquations() {
public String getName() {
return "linear";
}
public double[] computeDerivatives(SpacecraftState s, double[] pDot) {
pDot[0] = 1.0;
return new double[7];
}
});
try {
// Build the propagator
builder.buildPropagator(builder.getSelectedNormalizedParameters());
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(oe.getSpecifier(), OrekitMessages.ADDITIONAL_STATE_NAME_ALREADY_IN_USE);
}
}
@Before
public void setUp() throws IOException, ParseException {
......
......@@ -49,6 +49,7 @@ import org.orekit.orbits.Orbit;
import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.integration.AdditionalEquations;
import org.orekit.propagation.numerical.NumericalPropagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScalesFactory;
......@@ -210,6 +211,52 @@ public class NumericalConverterTest {
checkFit(teBuilder);
}
@Test
public void testAdditionalEquations() {
// Integrator builder
final ODEIntegratorBuilder dp54Builder = new DormandPrince54IntegratorBuilder(minStep, maxStep, dP);
// Propagator builder
final NumericalPropagatorBuilder builder =
new NumericalPropagatorBuilder(OrbitType.CIRCULAR.convertType(orbit),
dp54Builder,
PositionAngle.TRUE, 1.0);
builder.addForceModel(drag);
builder.addForceModel(gravity);
// Add additional equations
builder.addAdditionalEquations(new AdditionalEquations() {
public String getName() {
return "linear";
}
public double[] computeDerivatives(SpacecraftState s, double[] pDot) {
pDot[0] = 1.0;
return new double[7];
}
});
builder.addAdditionalEquations(new AdditionalEquations() {
public String getName() {
return "linear";
}
public double[] computeDerivatives(SpacecraftState s, double[] pDot) {
pDot[0] = 1.0;
return new double[7];
}
});
try {
// Build the numerical propagator
builder.buildPropagator(builder.getSelectedNormalizedParameters());
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(oe.getSpecifier(), OrekitMessages.ADDITIONAL_STATE_NAME_ALREADY_IN_USE);
}
}
protected void checkFit(final Orbit orbit, final double duration,
final double stepSize, final double threshold,
final double expectedRMS,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment