package org.orekit.files.general;
import java.util.Arrays;
import java.util.List;
import org.hamcrest.CoreMatchers;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.OrekitMatchers;
import org.orekit.Utils;
import org.orekit.errors.OrekitException;
import org.orekit.files.general.EphemerisFile.EphemerisSegment;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.propagation.BoundedPropagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.Constants;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
/**
* Unit tests for {@link EphemerisSegmentPropagator}.
*
* @author Evan Ward
*/
public class EphemerisSegmentPropagatorTest {
/** Set Orekit data. */
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
}
/**
* Check {@link EphemerisSegmentPropagator} and {@link EphemerisSegment#getPropagator()}.
*
* @throws Exception on error.
*/
@Test
public void testPropagator() throws Exception {
// setup
AbsoluteDate start = AbsoluteDate.J2000_EPOCH, end = start.shiftedBy(60);
Frame frame = FramesFactory.getEME2000();
List<TimeStampedPVCoordinates> coordinates = Arrays.asList(
new TimeStampedPVCoordinates(start, new Vector3D(6778137, 0, 0), new Vector3D(0, 7.5e3, 0)),
new TimeStampedPVCoordinates(start.shiftedBy(30), new Vector3D(6778137 + 1, 0, 0), new Vector3D(0, 7.5e3, 0)),
new TimeStampedPVCoordinates(end, new Vector3D(6778137 + 3, 0, 0), new Vector3D(0, 7.5e3, 0)));
EphemerisSegment ephemeris = new EphemerisSegment() {
@Override
public double getMu() {
return Constants.EGM96_EARTH_MU;
}
@Override
public String getFrameCenterString() {
return null;
}
@Override
public String getFrameString() {
return null;
}
@Override
public Frame getFrame() throws OrekitException {
return frame;
}
@Override
public String getTimeScaleString() {
return null;
}
@Override
public TimeScale getTimeScale() throws OrekitException {
return null;
}
@Override
public int getInterpolationSamples() {
return 2;
}
@Override
public CartesianDerivativesFilter getAvailableDerivatives() {
return CartesianDerivativesFilter.USE_P;
}
@Override
public List<TimeStampedPVCoordinates> getCoordinates() {
return coordinates;
}
@Override
public AbsoluteDate getStart() {
return start;
}
@Override
public AbsoluteDate getStop() {
return end;
}
};
// action
BoundedPropagator propagator = ephemeris.getPropagator();
//verify
Assert.assertThat(propagator.getMinDate(), CoreMatchers.is(start));
Assert.assertThat(propagator.getMaxDate(), CoreMatchers.is(end));
Assert.assertThat(propagator.getFrame(), CoreMatchers.is(frame));
int ulps = 0;
PVCoordinates expected = new PVCoordinates(
new Vector3D(6778137, 0, 0),
new Vector3D(1.0 / 30, 0, 0));
Assert.assertThat(
propagator.propagate(start).getPVCoordinates(),
OrekitMatchers.pvCloseTo(expected, ulps));
Assert.assertThat(
propagator.getPVCoordinates(start, frame),
OrekitMatchers.pvCloseTo(expected, ulps));
expected = new PVCoordinates(
new Vector3D(6778137 + 2, 0, 0),
new Vector3D(2 / 30.0, 0, 0));
Assert.assertThat(
propagator.propagate(start.shiftedBy(45)).getPVCoordinates(),
OrekitMatchers.pvCloseTo(expected, ulps));
Assert.assertThat(
propagator.getPVCoordinates(start.shiftedBy(45), frame),
OrekitMatchers.pvCloseTo(expected, ulps));
expected = new PVCoordinates(
new Vector3D(6778137 + 3, 0, 0),
new Vector3D(2 / 30.0, 0, 0));
Assert.assertThat(
propagator.propagate(end).getPVCoordinates(),
OrekitMatchers.pvCloseTo(expected, ulps));
Assert.assertThat(
propagator.getPVCoordinates(end, frame),
OrekitMatchers.pvCloseTo(expected, ulps));
// check reset state is prohibited
SpacecraftState ic = propagator.propagate(start);
try {
propagator.resetInitialState(ic);
Assert.fail("Expected Exception");
} catch (OrekitException e) {
// expected
}
}
}