Commit 9d68d5ab authored by Bryan Cazabonne's avatar Bryan Cazabonne
Browse files

Merge branch 'develop' into kalman-dsst

parents 4ff58edd 11d08877
......@@ -21,6 +21,19 @@
</properties>
<body>
<release version="11.1" date="TBD" description="TBD">
<action dev="luc" type="fix" issue="875">
Allow empty comments in CCSDS messages
</action>
<action dev="luc" type="fix" issue="884">
Deprecated TimeSpanMap.getTransitions()
</action>
<action dev="luc" type="fix" issue="885">
Allow to enter the same transition date in TimeSpanMap several times
</action>
<action dev="luc" type="fix" issue="833">
Added a way to erase all earlier/later transitions when adding an entry
and added addValidBetween to TimeSpanMap.
</action>
<action dev="bryan" type="add">
Added a new and simpler API for State Transition Matrix and Jacobian
matrix computation for analytical orbit propagators.
......
......@@ -383,7 +383,7 @@ public class AttitudesSequence implements AttitudeProvider {
// reset the transition parameters (this will be done once for each switch,
// despite doing it only once would have sufficient; its not really a problem)
forward = t.durationFrom(s0.getDate()) >= 0.0;
if (activated.getTransitions().size() > 1) {
if (activated.getSpansNumber() > 1) {
// remove transitions that will be overridden during upcoming propagation
if (forward) {
activated = activated.extractRange(AbsoluteDate.PAST_INFINITY, s0.getDate().shiftedBy(transitionTime));
......@@ -413,10 +413,10 @@ public class AttitudesSequence implements AttitudeProvider {
// prepare transition
final AbsoluteDate transitionEnd = date.shiftedBy(transitionTime);
activated.addValidAfter(new TransitionProvider(s.getAttitude(), transitionEnd), date);
activated.addValidAfter(new TransitionProvider(s.getAttitude(), transitionEnd), date, false);
// prepare future law after transition
activated.addValidAfter(future, transitionEnd);
activated.addValidAfter(future, transitionEnd, false);
// notify about the switch
if (switchHandler != null) {
......@@ -436,10 +436,10 @@ public class AttitudesSequence implements AttitudeProvider {
}
// prepare transition
activated.addValidBefore(new TransitionProvider(sAttitude, date), date);
activated.addValidBefore(new TransitionProvider(sAttitude, date), date, false);
// prepare past law before transition
activated.addValidBefore(past, sOrbit.getDate());
activated.addValidBefore(past, sOrbit.getDate(), false);
// notify about the switch
if (switchHandler != null) {
......
......@@ -158,10 +158,10 @@ public class EventBasedScheduler<T extends ObservedMeasurement<T>> extends Abstr
// store either status or its opposite according to propagation direction
if (forward) {
// forward propagation
feasibility.addValidAfter(statusAfter, s.getDate());
feasibility.addValidAfter(statusAfter, s.getDate(), false);
} else {
// backward propagation
feasibility.addValidBefore(!statusAfter, s.getDate());
feasibility.addValidBefore(!statusAfter, s.getDate(), false);
}
// delegate to wrapped detector
......
......@@ -54,6 +54,9 @@ public class KvnLexicalAnalyzer implements LexicalAnalyzer {
/** Regular expression matching a value that must be stored in the matcher. */
private static final String VALUE = "(\\p{Graph}.*?)";
/** Regular expression matching a value that must be stored in the matcher. */
private static final String OPTIONAL_VALUE = "((?:(\\p{Graph}.*?)?))";
/** Operators allowed in units specifications. */
private static final String UNITS_OPERATORS = "-+*×.·/⁄^√⁺⁻";
......@@ -82,7 +85,7 @@ public class KvnLexicalAnalyzer implements LexicalAnalyzer {
private static final String LINE_END = "\\p{Blank}*$";
/** Regular expression matching comment entry. */
private static final Pattern COMMENT_ENTRY = Pattern.compile(LINE_START + COMMENT_KEY + VALUE + LINE_END);
private static final Pattern COMMENT_ENTRY = Pattern.compile(LINE_START + COMMENT_KEY + OPTIONAL_VALUE + LINE_END);
/** Regular expression matching non-comment entry with optional units. */
private static final Pattern NON_COMMENT_ENTRY = Pattern.compile(LINE_START + NON_COMMENT_KEY + VALUE + UNITS + LINE_END);
......
......@@ -239,7 +239,7 @@ public class SinexLoader {
final Station station = getStation(parseString(line, 1, 4));
// check if it is the first eccentricity entry for this station
if (station.getEccentricitiesTimeSpanMap().getTransitions().size() == 1) {
if (station.getEccentricitiesTimeSpanMap().getSpansNumber() == 1) {
// we are parsing eccentricity data for a new station
firstEcc = true;
}
......
......@@ -118,7 +118,7 @@ public class Station {
*/
public AbsoluteDate getValidFrom() {
if (validFrom == null) {
validFrom = eccentricitiesTimeSpanMap.getTransitions().first().getDate();
validFrom = eccentricitiesTimeSpanMap.getFirstTransition().getDate();
}
return validFrom;
}
......@@ -137,7 +137,7 @@ public class Station {
*/
public AbsoluteDate getValidUntil() {
if (validUntil == null) {
validUntil = eccentricitiesTimeSpanMap.getTransitions().last().getDate();
validUntil = eccentricitiesTimeSpanMap.getLastTransition().getDate();
}
return validUntil;
}
......@@ -227,7 +227,7 @@ public class Station {
* @since 11.1
*/
public void addStationEccentricitiesValidBefore(final Vector3D entry, final AbsoluteDate latestValidityDate) {
eccentricitiesTimeSpanMap.addValidBefore(entry, latestValidityDate);
eccentricitiesTimeSpanMap.addValidBefore(entry, latestValidityDate, false);
}
/** Add a station eccentricity vector entry valid after a limit date.<br>
......@@ -239,7 +239,7 @@ public class Station {
* @since 11.1
*/
public void addStationEccentricitiesValidAfter(final Vector3D entry, final AbsoluteDate earliestValidityDate) {
eccentricitiesTimeSpanMap.addValidAfter(entry, earliestValidityDate);
eccentricitiesTimeSpanMap.addValidAfter(entry, earliestValidityDate, false);
}
/**
......
......@@ -21,8 +21,8 @@ import java.util.List;
import java.util.NavigableSet;
import java.util.stream.Stream;
import org.hipparchus.Field;
import org.hipparchus.CalculusFieldElement;
import org.hipparchus.Field;
import org.hipparchus.analysis.differentiation.DerivativeStructure;
import org.hipparchus.analysis.differentiation.Gradient;
import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
......@@ -181,7 +181,7 @@ public class TimeSpanDragForce extends AbstractDragForceModel {
dragSensitiveTimeSpanMap.addValidBefore(changeDragParameterDriversNames(dragSensitive,
latestValidityDate,
DATE_BEFORE),
latestValidityDate);
latestValidityDate, false);
}
/** Add a DragSensitive entry valid after a limit date.<br>
......@@ -195,7 +195,7 @@ public class TimeSpanDragForce extends AbstractDragForceModel {
dragSensitiveTimeSpanMap.addValidAfter(changeDragParameterDriversNames(dragSensitive,
earliestValidityDate,
DATE_AFTER),
earliestValidityDate);
earliestValidityDate, false);
}
/** Get the {@link DragSensitive} model valid at a date.
......@@ -232,11 +232,21 @@ public class TimeSpanDragForce extends AbstractDragForceModel {
/** Get the {@link Transition}s of the drag sensitive time span map.
* @return the {@link Transition}s for the drag sensitive time span map
* @deprecated as of 11.1, replaced by {@link #getFirstSpan()}
*/
@Deprecated
public NavigableSet<Transition<DragSensitive>> getTransitions() {
return dragSensitiveTimeSpanMap.getTransitions();
}
/** Get the first {@link Span time span} of the drag sensitive time span map.
* @return the first {@link Span time span} of the drag sensitive time span map
* @since 11.1
*/
public Span<DragSensitive> getFirstSpan() {
return dragSensitiveTimeSpanMap.getFirstSpan();
}
/** {@inheritDoc} */
@Override
public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
......@@ -362,25 +372,17 @@ public class TimeSpanDragForce extends AbstractDragForceModel {
// Get all transitions from the TimeSpanMap
final List<ParameterDriver> listParameterDrivers = new ArrayList<>();
final NavigableSet<Transition<DragSensitive>> dragSensitiveTransitions = getTransitions();
// Loop on the transitions
for (Transition<DragSensitive> transition : dragSensitiveTransitions) {
// Add all the "before" parameter drivers of each transition
for (ParameterDriver driver : transition.getBefore().getDragParametersDrivers()) {
// Loop on the spans
for (Span<DragSensitive> span = getFirstSpan(); span != null; span = span.next()) {
// Add all the parameter drivers of the span
for (ParameterDriver driver : span.getData().getDragParametersDrivers()) {
// Add the driver only if the name does not exist already
if (!findByName(listParameterDrivers, driver.getName())) {
listParameterDrivers.add(driver);
}
}
}
// Finally, add the "after" parameter drivers of the last transition
for (ParameterDriver driver : dragSensitiveTransitions.last().getAfter().getDragParametersDrivers()) {
// Adds only if the name does not exist already
if (!findByName(listParameterDrivers, driver.getName())) {
listParameterDrivers.add(driver);
}
}
// Return an array of parameter drivers with no duplicated name
return listParameterDrivers;
......@@ -464,10 +466,9 @@ public class TimeSpanDragForce extends AbstractDragForceModel {
// Get all transitions
final List<AbsoluteDate> listDates = new ArrayList<>();
final NavigableSet<Transition<DragSensitive>> dragSensitiveTransitions = getTransitions();
// Extract all the transitions' dates
for (Transition<DragSensitive> transition : dragSensitiveTransitions) {
for (Transition<DragSensitive> transition = getFirstSpan().getEndTransition(); transition != null; transition = transition.next()) {
listDates.add(transition.getDate());
}
// Return the array of transition dates
......
......@@ -168,7 +168,7 @@ public class TimeSpanParametricAcceleration extends AbstractForceModel {
* (must be different from <b>all</b> dates already used for transitions)
*/
public void addAccelerationModelValidBefore(final AccelerationModel accelerationModel, final AbsoluteDate latestValidityDate) {
accelerationModelTimeSpanMap.addValidBefore(accelerationModel, latestValidityDate);
accelerationModelTimeSpanMap.addValidBefore(accelerationModel, latestValidityDate, false);
}
/** Add a AccelerationModel entry valid after a limit date.<br>
......@@ -184,7 +184,7 @@ public class TimeSpanParametricAcceleration extends AbstractForceModel {
* (must be different from <b>all</b> dates already used for transitions)
*/
public void addAccelerationModelValidAfter(final AccelerationModel accelerationModel, final AbsoluteDate earliestValidityDate) {
accelerationModelTimeSpanMap.addValidAfter(accelerationModel, earliestValidityDate);
accelerationModelTimeSpanMap.addValidAfter(accelerationModel, earliestValidityDate, false);
}
/** Get the {@link AccelerationModel} model valid at a date.
......@@ -221,11 +221,21 @@ public class TimeSpanParametricAcceleration extends AbstractForceModel {
/** Get the {@link Transition}s of the acceleration model time span map.
* @return the {@link Transition}s for the acceleration model time span map
* @deprecated as of 11.1, replace by {@link #getFirstSpan()}
*/
@Deprecated
public NavigableSet<Transition<AccelerationModel>> getTransitions() {
return accelerationModelTimeSpanMap.getTransitions();
}
/** Get the first {@link Span time span} of the acceleration model time span map.
* @return the first {@link Span time span} of the acceleration model time span map
* @since 11.1
*/
public Span<AccelerationModel> getFirstSpan() {
return accelerationModelTimeSpanMap.getFirstSpan();
}
/** {@inheritDoc} */
@Override
public boolean dependsOnPositionOnly() {
......@@ -321,12 +331,11 @@ public class TimeSpanParametricAcceleration extends AbstractForceModel {
// Get all transitions from the TimeSpanMap
final List<ParameterDriver> listParameterDrivers = new ArrayList<>();
final NavigableSet<Transition<AccelerationModel>> accelerationModelTransitions = getTransitions();
// Loop on the transitions
for (Transition<AccelerationModel> transition : accelerationModelTransitions) {
// Add all the "before" parameter drivers of each transition
for (ParameterDriver driver : transition.getBefore().getParametersDrivers()) {
// Loop on the spans
for (Span<AccelerationModel> span = getFirstSpan(); span != null; span = span.next()) {
// Add all the parameter drivers of the time span
for (ParameterDriver driver : span.getData().getParametersDrivers()) {
// Add the driver only if the name does not exist already
if (!findByName(listParameterDrivers, driver.getName())) {
listParameterDrivers.add(driver);
......@@ -334,14 +343,6 @@ public class TimeSpanParametricAcceleration extends AbstractForceModel {
}
}
// Finally, add the "after" parameter drivers of the last transition
for (ParameterDriver driver : accelerationModelTransitions.last().getAfter().getParametersDrivers()) {
// Adds only if the name does not exist already
if (!findByName(listParameterDrivers, driver.getName())) {
listParameterDrivers.add(driver);
}
}
// Return an array of parameter drivers with no duplicated name
return Collections.unmodifiableList(listParameterDrivers);
......
......@@ -271,9 +271,9 @@ public class TriggerDate
// store contribution factor for derivatives scm = ±(∂y₁/∂y₀)⁻¹ fₘ(t₁, y₁)
final double[] c = new QRDecomposition(dY1dY0, DECOMPOSITION_THRESHOLD).getSolver().solve(rhs).toArray();
if (forward) {
contribution.addValidAfter(c, state.getDate());
contribution.addValidAfter(c, state.getDate(), false);
} else {
contribution.addValidBefore(c, state.getDate());
contribution.addValidBefore(c, state.getDate(), false);
}
// return unchanged state
......
......@@ -67,9 +67,9 @@ public abstract class AbstractManeuverTriggers implements ManeuverTriggers {
if (isFiringOnInitialState(initialState, forward)) {
if (forward) {
firings.addValidAfter(Boolean.TRUE, initialState.getDate());
firings.addValidAfter(Boolean.TRUE, initialState.getDate(), false);
} else {
firings.addValidBefore(Boolean.TRUE, initialState.getDate());
firings.addValidBefore(Boolean.TRUE, initialState.getDate(), false);
}
}
......@@ -92,9 +92,9 @@ public abstract class AbstractManeuverTriggers implements ManeuverTriggers {
if (isFiringOnInitialState(initialState.toSpacecraftState(), forward)) {
if (forward) {
firings.addValidAfter(Boolean.TRUE, initialState.getDate().toAbsoluteDate());
firings.addValidAfter(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
} else {
firings.addValidBefore(Boolean.TRUE, initialState.getDate().toAbsoluteDate());
firings.addValidBefore(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
}
}
......
......@@ -196,9 +196,9 @@ public abstract class IntervalEventTrigger<T extends AbstractDetector<T>> extend
@Override
public Action eventOccurred(final SpacecraftState s, final T detector, final boolean increasing) {
if (forward) {
getFirings().addValidAfter(increasing, s.getDate());
getFirings().addValidAfter(increasing, s.getDate(), false);
} else {
getFirings().addValidBefore(!increasing, s.getDate());
getFirings().addValidBefore(!increasing, s.getDate(), false);
}
notifyResetters(s, increasing);
return Action.RESET_STATE;
......@@ -233,9 +233,9 @@ public abstract class IntervalEventTrigger<T extends AbstractDetector<T>> extend
@Override
public Action eventOccurred(final FieldSpacecraftState<S> s, final D detector, final boolean increasing) {
if (forward) {
getFirings().addValidAfter(increasing, s.getDate().toAbsoluteDate());
getFirings().addValidAfter(increasing, s.getDate().toAbsoluteDate(), false);
} else {
getFirings().addValidBefore(!increasing, s.getDate().toAbsoluteDate());
getFirings().addValidBefore(!increasing, s.getDate().toAbsoluteDate(), false);
}
notifyResetters(s, increasing);
return Action.RESET_STATE;
......
......@@ -301,9 +301,9 @@ public abstract class StartStopEventsTrigger<A extends AbstractDetector<A>, O ex
if (increasing) {
// the event is meaningful for maneuver firing
if (forward) {
getFirings().addValidAfter(true, s.getDate());
getFirings().addValidAfter(true, s.getDate(), false);
} else {
getFirings().addValidBefore(false, s.getDate());
getFirings().addValidBefore(false, s.getDate(), false);
}
notifyResetters(s, true);
return Action.RESET_STATE;
......@@ -340,9 +340,9 @@ public abstract class StartStopEventsTrigger<A extends AbstractDetector<A>, O ex
if (increasing) {
// the event is meaningful for maneuver firing
if (forward) {
getFirings().addValidAfter(false, s.getDate());
getFirings().addValidAfter(false, s.getDate(), false);
} else {
getFirings().addValidBefore(true, s.getDate());
getFirings().addValidBefore(true, s.getDate(), false);
}
notifyResetters(s, false);
return Action.RESET_STATE;
......@@ -383,9 +383,9 @@ public abstract class StartStopEventsTrigger<A extends AbstractDetector<A>, O ex
if (increasing) {
// the event is meaningful for maneuver firing
if (forward) {
getFirings().addValidAfter(true, s.getDate().toAbsoluteDate());
getFirings().addValidAfter(true, s.getDate().toAbsoluteDate(), false);
} else {
getFirings().addValidBefore(false, s.getDate().toAbsoluteDate());
getFirings().addValidBefore(false, s.getDate().toAbsoluteDate(), false);
}
notifyResetters(s, true);
return Action.RESET_STATE;
......@@ -426,9 +426,9 @@ public abstract class StartStopEventsTrigger<A extends AbstractDetector<A>, O ex
if (increasing) {
// the event is meaningful for maneuver firing
if (forward) {
getFirings().addValidAfter(false, s.getDate().toAbsoluteDate());
getFirings().addValidAfter(false, s.getDate().toAbsoluteDate(), false);
} else {
getFirings().addValidBefore(true, s.getDate().toAbsoluteDate());
getFirings().addValidBefore(true, s.getDate().toAbsoluteDate(), false);
}
notifyResetters(s, false);
return Action.RESET_STATE;
......
......@@ -108,7 +108,7 @@ public class AntexLoader {
final TimeSpanMap<SatelliteAntenna> existing =
findSatelliteAntenna(antenna.getSatelliteSystem(), antenna.getPrnNumber());
// this is an update for a satellite antenna, with new time span
existing.addValidAfter(antenna, antenna.getValidFrom());
existing.addValidAfter(antenna, antenna.getValidFrom(), false);
} catch (OrekitException oe) {
// this is a new satellite antenna
satellitesAntennas.add(new TimeSpanMap<>(antenna));
......@@ -133,7 +133,7 @@ public class AntexLoader {
satellitesAntennas.
stream().
filter(m -> {
final SatelliteAntenna first = m.getTransitions().first().getBefore();
final SatelliteAntenna first = m.getFirstSpan().getData();
return first.getSatelliteSystem() == satelliteSystem &&
first.getPrnNumber() == prnNumber;
}).findFirst();
......
......@@ -570,9 +570,9 @@ public class RinexClock {
public void addReferenceClockList(final List<ReferenceClock> referenceClockList,
final AbsoluteDate startDate) {
if (referenceClocks == null) {
referenceClocks = new TimeSpanMap<List<ReferenceClock>>(referenceClockList);
referenceClocks = new TimeSpanMap<>(null);
}
referenceClocks.addValidAfter(referenceClockList, startDate);
referenceClocks.addValidAfter(referenceClockList, startDate, false);
}
/** Getter for the frame name.
......
......@@ -31,6 +31,7 @@ import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.TimeSpanMap;
import org.orekit.utils.TimeSpanMap.Span;
import org.orekit.utils.TimeSpanMap.Transition;
/**
......@@ -89,25 +90,17 @@ public class TimeSpanEstimatedTroposphericModel implements DiscreteTroposphericM
// Get all transitions from the TimeSpanMap
final List<ParameterDriver> listTroposphericParameterDrivers = new ArrayList<>();
final NavigableSet<Transition<EstimatedTroposphericModel>> troposphericModelTransitions = getTransitions();
// Loop on the transitions
for (Transition<EstimatedTroposphericModel> transition : troposphericModelTransitions) {
// Add all the "before" parameter drivers of each transition
for (ParameterDriver tropoDriver : transition.getBefore().getParametersDrivers()) {
// Loop on the spans
for (Span<EstimatedTroposphericModel> span = getFirstSpan(); span != null; span = span.next()) {
// Add all the parameter drivers of each span
for (ParameterDriver tropoDriver : span.getData().getParametersDrivers()) {
// Add the driver only if the name does not exist already
if (!findByName(listTroposphericParameterDrivers, tropoDriver.getName())) {
listTroposphericParameterDrivers.add(tropoDriver);
}
}
}
// Finally, add the "after" parameter drivers of the last transition
for (ParameterDriver tropoDriver : troposphericModelTransitions.last().getAfter().getParametersDrivers()) {
// Adds only if the name does not exist already
if (!findByName(listTroposphericParameterDrivers, tropoDriver.getName())) {
listTroposphericParameterDrivers.add(tropoDriver);
}
}
// Return an array of parameter drivers with no duplicated name
return listTroposphericParameterDrivers;
......@@ -125,7 +118,7 @@ public class TimeSpanEstimatedTroposphericModel implements DiscreteTroposphericM
troposphericModelMap.addValidBefore(changeTroposphericParameterDriversNames(model,
latestValidityDate,
DATE_BEFORE),
latestValidityDate);
latestValidityDate, false);
}
/** Add a EstimatedTroposphericModel entry valid after a limit date.<br>
......@@ -139,7 +132,7 @@ public class TimeSpanEstimatedTroposphericModel implements DiscreteTroposphericM
troposphericModelMap.addValidAfter(changeTroposphericParameterDriversNames(model,
earliestValidityDate,
DATE_AFTER),
earliestValidityDate);
earliestValidityDate, false);
}
/** Get the {@link EstimatedTroposphericModel} model valid at a date.
......@@ -152,11 +145,21 @@ public class TimeSpanEstimatedTroposphericModel implements DiscreteTroposphericM
/** Get the {@link Transition}s of the tropospheric model time span map.
* @return the {@link Transition}s for the tropospheric model time span map
* @deprecated as of 11.1, replaced by {@link #getFirstSpan()}
*/
@Deprecated
public NavigableSet<Transition<EstimatedTroposphericModel>> getTransitions() {
return troposphericModelMap.getTransitions();
}
/** Get the first {@link Span time span} of the tropospheric model time span map.
* @return the first {@link Span time span} of the tropospheric model time span map
* @since 11.1
*/
public Span<EstimatedTroposphericModel> getFirstSpan() {
return troposphericModelMap.getFirstSpan();
}
/** Extract the proper parameter drivers' values from the array in input of the
* {@link #pathDelay(double, GeodeticPoint, double[], AbsoluteDate) pathDelay} method.
* Parameters are filtered given an input date.
......
......@@ -302,9 +302,9 @@ public abstract class AbstractPropagator implements Propagator {
if (tsm != null) {
// this is an unmanaged state
if (forward) {
tsm.addValidAfter(changed.getValue(), date);
tsm.addValidAfter(changed.getValue(), date, false);
} else {
tsm.addValidBefore(changed.getValue(), date);
tsm.addValidBefore(changed.getValue(), date, false);
}
}
}
......
......@@ -516,9 +516,9 @@ public class BrouwerLyddanePropagator extends AbstractAnalyticalPropagator {
final BLModel newModel = computeMeanParameters((KeplerianOrbit) OrbitType.KEPLERIAN.convertType(state.getOrbit()),
state.getMass());
if (forward) {
models.addValidAfter(newModel, state.getDate());
models.addValidAfter(newModel, state.getDate(), false);
} else {
models.addValidBefore(newModel, state.getDate());
models.addValidBefore(newModel, state.getDate(), false);
}
stateChanged(state);
}
......
......@@ -470,9 +470,9 @@ public class EcksteinHechlerPropagator extends AbstractAnalyticalPropagator {
final EHModel newModel = computeMeanParameters((CircularOrbit) OrbitType.CIRCULAR.convertType(state.getOrbit()),
state.getMass());
if (forward) {
models.addValidAfter(newModel, state.getDate());
models.addValidAfter(newModel, state.getDate(), false);
} else {
models.addValidBefore(newModel, state.getDate());
models.addValidBefore(newModel, state.getDate(), false);
}
stateChanged(state);
}
......
......@@ -167,9 +167,9 @@ public class KeplerianPropagator extends AbstractAnalyticalPropagator {
/** {@inheritDoc} */
protected void resetIntermediateState(final SpacecraftState state, final boolean forward) {
if (forward) {
states.addValidAfter(state, state.getDate());
states.addValidAfter(state, state.getDate(), false);
} else {
states.addValidBefore(state, state.getDate());
states.addValidBefore(state, state.getDate(), false);
}
stateChanged(state);
}
......