Commit 0ad57adb authored by Maxime Journot's avatar Maxime Journot
Browse files

Merge branch 'master' into develop.

parents f5c88f56 a20f2e65
......@@ -2,8 +2,7 @@
<project name="orekit" default="jar" basedir=".">
<property name="project.version" value="11.3-SNAPSHOT" />
<property name="project.version" value="11.2.1" />
<property name="src.dir" location="src" />
<property name="main.src.dir" value="${src.dir}/main/java" />
<property name="main.resources.dir" value="${src.dir}/main/resources" />
......
......@@ -5,7 +5,7 @@
<groupId>org.orekit</groupId>
<artifactId>orekit</artifactId>
<packaging>jar</packaging>
<version>11.3-SNAPSHOT</version>
<version>11.2.1</version>
<name>ORbit Extrapolation KIT</name>
<url>http://www.orekit.org/</url>
......
......@@ -20,6 +20,7 @@
<title>Orekit Changes</title>
</properties>
<body>
<<<<<<< HEAD
<release version="11.3" date="TBD" description="TBD">
<action dev="bryan" type="add" issue="901">
Added additional state provider for covariance matrix propagation.
......@@ -28,6 +29,27 @@
Added waypoint interpolation of PVCoordinatesProvider.
</action>
</release>
<release version="11.2.1" date="2022-08-01"
description="Version 11.2.1 is a patch release of Orekit.
It fixes issues related to the parsing and writing of CCSDS CDM files.
It also fixes issues related to date management.
Finally it includes some improvements in the class documentation">
<action dev="gc" type="fix" issue="945">
Fixed documentation issue, RTNCovariance constructor initializes the covariance matrix with NaN.
</action>
<action dev="gc" type="fix" issue="944">
Fixed wrong parsing of Area_DRG and Area_SRP from CDM.
</action>
<action dev="gc" type="fix" issue="942">
Fixed N/A value not recognized for field MANEUVERABLE when parsing CDMs.
</action>
<action dev="luc" type="fix" issue="939">
Fixed negative offset when shifting an AbsoluteDate.
</action>
<action dev="luc" type="fix" issue="935">
Fixed internal error on DateEvent capture events in v11.1.2.
</action>
</release>
<release version="11.2" date="2022-06-20"
description="Version 11.2 is a minor release of Orekit.
It includes both new features and bug fixes. New features introduced
......
......@@ -42,7 +42,7 @@ public enum AdditionalParametersKey {
/** The effective area of the object exposed to solar radiation pressure. */
AREA_SRP((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
container::setAreaDRG)),
container::setAreaSRP)),
/** The mass of the object. */
MASS((token, context, container) -> token.processAsDouble(Unit.KILOGRAM, context.getParsedUnitsBehavior(),
......
......@@ -104,6 +104,8 @@ public class CdmData implements Data {
}
/** Get the covariance matrix logical block.
* <p> The RTN Covariance Matrix is provided in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
* are mandatory. The remaining elements will return NaN if not provided. </p>
* @return covariance matrix block
*/
public RTNCovariance getRTNCovarianceBlock() {
......
......@@ -67,7 +67,7 @@ public enum CdmMetadataKey {
COVARIANCE_METHOD((token, context, container) -> token.processAsEnum(CovarianceMethod.class, container::setCovarianceMethod)),
/** Manoeuver capacity. */
MANEUVERABLE((token, context, container) -> token.processAsEnum(Maneuvrable.class, container::setManeuverable)),
MANEUVERABLE((token, context, container) -> token.processAsManeuvrableEnum(container::setManeuverable)),
/** Central body for Object 1 and 2. */
ORBIT_CENTER((token, context, container) -> token.processAsCenter(container::setOrbitCenter,
......
......@@ -86,7 +86,7 @@ public class CdmMetadataWriter extends AbstractWriter {
generator.writeEntry(CdmMetadataKey.COVARIANCE_METHOD.name(),
metadata.getCovarianceMethod(), true);
generator.writeEntry(CdmMetadataKey.MANEUVERABLE.name(),
metadata.getManeuverable(), true);
metadata.getManeuverable().getValue(), null, true);
if (metadata.getOrbitCenter() != null) {
generator.writeEntry(CdmMetadataKey.ORBIT_CENTER.name(),
metadata.getOrbitCenter().getName(), null, false);
......
......@@ -23,12 +23,37 @@ package org.orekit.files.ccsds.ndm.cdm;
public enum Maneuvrable {
/** Maneuvrable. */
YES,
YES("YES"),
/** Non Maneuvrable. */
NO,
NO("NO"),
/** Don't know or not applicable. */
NOT_APPLICABLE;
N_A("N/A");
/** Value of the enum .*/
private String value;
Maneuvrable(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
public static Maneuvrable getEnum(final String keyValue) {
for (Maneuvrable v : values()) {
if (v.getValue().equalsIgnoreCase(keyValue)) {
return v;
}
}
throw new IllegalArgumentException();
}
}
......@@ -25,6 +25,8 @@ import org.orekit.files.ccsds.section.CommentsContainer;
* attribute which can be acces with getRTNCovariaxMatrix method. Beware that
* there are thus 2 ways to modify the RTN covariance : setC... ( setCrr,
* setCtr ...) which should be prioritized and getRTNCovariaxMatrix.setEntry(row, col, value).
* <p> The RTN Covariance Matrix is provided in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
* are mandatory. The remaining elements will return NaN if not provided. </p>
* @author Melina Vanel
* @since 11.2
*/
......@@ -36,6 +38,8 @@ public class RTNCovariance extends CommentsContainer {
/** Simple constructor. To update matrix value there are 2 ways to modify the RTN
* covariance : setC... ( setCrr, setCtr ...) which should be prioritized and
* getRTNCovariaxMatrix.setEntry(row, col, value).
* <p> The RTN Covariance Matrix is provided in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
* are mandatory. The remaining elements will return NaN if not provided. </p>
*/
public RTNCovariance() {
covarianceMatrix = MatrixUtils.createRealMatrix(9, 9);
......@@ -90,6 +94,8 @@ public class RTNCovariance extends CommentsContainer {
/**
* Get the RTN covariance matrix.
* <p> The RTN Covariance Matrix is provided in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
* are mandatory. The remaining elements will return NaN if not provided. </p>
* @return the RTN covariance matrix
*/
public RealMatrix getRTNCovarianceMatrix() {
......
......@@ -37,6 +37,7 @@ import org.orekit.files.ccsds.definitions.OrbitRelativeFrame;
import org.orekit.files.ccsds.definitions.SpacecraftBodyFrame;
import org.orekit.files.ccsds.definitions.TimeSystem;
import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior;
import org.orekit.files.ccsds.ndm.cdm.Maneuvrable;
import org.orekit.files.ccsds.utils.ContextBinding;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.units.Unit;
......@@ -602,6 +603,17 @@ public class ParseToken {
return true;
}
/** Process the content of the Maneuvrable enum.
* @param consumer consumer of the enum
* @return always returns {@code true}
*/
public boolean processAsManeuvrableEnum(final ManeuvrableConsumer consumer) {
if (type == TokenType.ENTRY) {
consumer.accept(Maneuvrable.getEnum(getRawContent()));
}
return true;
}
/** Generate a parse exception for this entry.
* @param cause underlying cause exception (may be null)
* @return exception for this entry
......@@ -830,4 +842,11 @@ public class ParseToken {
void accept(List<Unit> value);
}
/** Interface representing instance methods that consume Maneuvrable values. */
public interface ManeuvrableConsumer {
/** Consume a Maneuvrable.
* @param value value to consume
*/
void accept(Maneuvrable value);
}
}
......@@ -16,6 +16,8 @@
*/
package org.orekit.propagation.events;
import java.util.function.DoubleFunction;
import org.hipparchus.analysis.UnivariateFunction;
import org.hipparchus.analysis.solvers.BracketedUnivariateSolver;
import org.hipparchus.analysis.solvers.BracketedUnivariateSolver.Interval;
......@@ -327,31 +329,29 @@ public class EventState<T extends EventDetector> {
final AbsoluteDate fT0 = loopT;
final double tbDouble = tb.durationFrom(fT0);
final double middle = 0.5 * tbDouble;
final UnivariateFunction f = dt -> {
final DoubleFunction<AbsoluteDate> date = dt -> {
// use either fT0 or tb as the base time for shifts
// in order to ensure we reproduce exactly those times
// using only one reference time like fT0 would imply
// to use ft0.shiftedBy(tbDouble), which may be different
// from tb due to numerical noise (see issue 921)
final AbsoluteDate t;
if (forward == dt <= middle) {
// use start of interval as reference
t = fT0.shiftedBy(dt);
return fT0.shiftedBy(dt);
} else {
// use end of interval as reference
t = tb.shiftedBy(dt - tbDouble);
return tb.shiftedBy(dt - tbDouble);
}
return g(interpolator.getInterpolatedState(t));
};
// tb as a double for use in f
final UnivariateFunction f = dt -> g(interpolator.getInterpolatedState(date.apply(dt)));
if (forward) {
try {
final Interval interval =
solver.solveInterval(maxIterationCount, f, 0, tbDouble);
beforeRootT = fT0.shiftedBy(interval.getLeftAbscissa());
beforeRootT = date.apply(interval.getLeftAbscissa());
beforeRootG = interval.getLeftValue();
afterRootT = fT0.shiftedBy(interval.getRightAbscissa());
afterRootG = interval.getRightValue();
afterRootT = date.apply(interval.getRightAbscissa());
afterRootG = interval.getRightValue();
// CHECKSTYLE: stop IllegalCatch check
} catch (RuntimeException e) {
// CHECKSTYLE: resume IllegalCatch check
......@@ -362,10 +362,10 @@ public class EventState<T extends EventDetector> {
try {
final Interval interval =
solver.solveInterval(maxIterationCount, f, tbDouble, 0);
beforeRootT = fT0.shiftedBy(interval.getRightAbscissa());
beforeRootT = date.apply(interval.getRightAbscissa());
beforeRootG = interval.getRightValue();
afterRootT = fT0.shiftedBy(interval.getLeftAbscissa());
afterRootG = interval.getLeftValue();
afterRootT = date.apply(interval.getLeftAbscissa());
afterRootG = interval.getLeftValue();
// CHECKSTYLE: stop IllegalCatch check
} catch (RuntimeException e) {
// CHECKSTYLE: resume IllegalCatch check
......
......@@ -16,8 +16,10 @@
*/
package org.orekit.propagation.events;
import org.hipparchus.Field;
import java.util.function.DoubleFunction;
import org.hipparchus.CalculusFieldElement;
import org.hipparchus.Field;
import org.hipparchus.analysis.UnivariateFunction;
import org.hipparchus.analysis.solvers.BracketedUnivariateSolver;
import org.hipparchus.analysis.solvers.BracketedUnivariateSolver.Interval;
......@@ -331,19 +333,31 @@ public class FieldEventState<D extends FieldEventDetector<T>, T extends Calculus
// both non-zero, the usual case, use a root finder.
// time zero for evaluating the function f. Needs to be final
final FieldAbsoluteDate<T> fT0 = loopT;
final UnivariateFunction f = dt -> {
return g(interpolator.getInterpolatedState(fT0.shiftedBy(dt))).getReal();
final double tbDouble = tb.durationFrom(fT0).getReal();
final double middle = 0.5 * tbDouble;
final DoubleFunction<FieldAbsoluteDate<T>> date = dt -> {
// use either fT0 or tb as the base time for shifts
// in order to ensure we reproduce exactly those times
// using only one reference time like fT0 would imply
// to use ft0.shiftedBy(tbDouble), which may be different
// from tb due to numerical noise (see issue 921)
if (forward == dt <= middle) {
// use start of interval as reference
return fT0.shiftedBy(dt);
} else {
// use end of interval as reference
return tb.shiftedBy(dt - tbDouble);
}
};
// tb as a double for use in f
final T tbDouble = tb.durationFrom(fT0);
final UnivariateFunction f = dt -> g(interpolator.getInterpolatedState(date.apply(dt))).getReal();
if (forward) {
try {
final Interval interval =
solver.solveInterval(maxIterationCount, f, 0, tbDouble.getReal());
beforeRootT = fT0.shiftedBy(interval.getLeftAbscissa());
solver.solveInterval(maxIterationCount, f, 0, tbDouble);
beforeRootT = date.apply(interval.getLeftAbscissa());
beforeRootG = zero.add(interval.getLeftValue());
afterRootT = fT0.shiftedBy(interval.getRightAbscissa());
afterRootG = zero.add(interval.getRightValue());
afterRootT = date.apply(interval.getRightAbscissa());
afterRootG = zero.add(interval.getRightValue());
// CHECKSTYLE: stop IllegalCatch check
} catch (RuntimeException e) {
// CHECKSTYLE: resume IllegalCatch check
......@@ -353,11 +367,11 @@ public class FieldEventState<D extends FieldEventDetector<T>, T extends Calculus
} else {
try {
final Interval interval =
solver.solveInterval(maxIterationCount, f, tbDouble.getReal(), 0);
beforeRootT = fT0.shiftedBy(interval.getRightAbscissa());
solver.solveInterval(maxIterationCount, f, tbDouble, 0);
beforeRootT = date.apply(interval.getRightAbscissa());
beforeRootG = zero.add(interval.getRightValue());
afterRootT = fT0.shiftedBy(interval.getLeftAbscissa());
afterRootG = zero.add(interval.getLeftValue());
afterRootT = date.apply(interval.getLeftAbscissa());
afterRootG = zero.add(interval.getLeftValue());
// CHECKSTYLE: stop IllegalCatch check
} catch (RuntimeException e) {
// CHECKSTYLE: resume IllegalCatch check
......
......@@ -314,10 +314,21 @@ public class AbsoluteDate
// Use 2Sum for high precision.
final SumAndResidual sumAndResidual = MathUtils.twoSum(seconds, tsOffset);
final long dl = (long) FastMath.floor(sumAndResidual.getSum());
final double regularOffset = (sumAndResidual.getSum() - dl) + sumAndResidual.getResidual();
offset = (sumAndResidual.getSum() - dl) + sumAndResidual.getResidual();
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl;
if (regularOffset >= 0) {
// regular case, the offset is between 0.0 and 1.0
offset = regularOffset;
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl;
} else {
// very rare case, the offset is just before a whole second
// we will loose some bits of accuracy when adding 1 second
// but this will ensure the offset remains in the [0.0; 1.0] interval
offset = 1.0 + regularOffset;
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl - 1;
}
}
......@@ -429,8 +440,18 @@ public class AbsoluteDate
epoch = (sumAndResidual.getSum() < 0) ? Long.MIN_VALUE : Long.MAX_VALUE;
} else {
final long dl = (long) FastMath.floor(sumAndResidual.getSum());
offset = (sumAndResidual.getSum() - dl) + sumAndResidual.getResidual();
epoch = since.epoch + dl;
final double regularOffset = (sumAndResidual.getSum() - dl) + sumAndResidual.getResidual();
if (regularOffset >= 0) {
// regular case, the offset is between 0.0 and 1.0
offset = regularOffset;
epoch = since.epoch + dl;
} else {
// very rare case, the offset is just before a whole second
// we will loose some bits of accuracy when adding 1 second
// but this will ensure the offset remains in the [0.0; 1.0] interval
offset = 1.0 + regularOffset;
epoch = since.epoch + dl - 1;
}
}
}
......
......@@ -161,8 +161,18 @@ public class FieldAbsoluteDate<T extends CalculusFieldElement<T>>
epoch = (sumAndResidual.getSum().getReal() < 0) ? Long.MIN_VALUE : Long.MAX_VALUE;
} else {
final long dl = (long) FastMath.floor(sumAndResidual.getSum().getReal());
offset = sumAndResidual.getSum().subtract(dl).add(sumAndResidual.getResidual());
epoch = since.epoch + dl;
final T regularOffset = sumAndResidual.getSum().subtract(dl).add(sumAndResidual.getResidual());
if (regularOffset.getReal() >= 0) {
// regular case, the offset is between 0.0 and 1.0
offset = regularOffset;
epoch = since.epoch + dl;
} else {
// very rare case, the offset is just before a whole second
// we will loose some bits of accuracy when adding 1 second
// but this will ensure the offset remains in the [0.0; 1.0] interval
offset = regularOffset.add(1.0);
epoch = since.epoch + dl - 1;
}
}
}
......@@ -208,11 +218,20 @@ public class FieldAbsoluteDate<T extends CalculusFieldElement<T>>
// Use 2Sum for high precision.
final SumAndResidual sumAndResidual = MathUtils.twoSum(seconds, tsOffset);
final long dl = (long) FastMath.floor(sumAndResidual.getSum());
offset = field.getZero().add((sumAndResidual.getSum() - dl) + sumAndResidual.getResidual());
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl;
final T regularOffset = field.getZero().add((sumAndResidual.getSum() - dl) + sumAndResidual.getResidual());
if (regularOffset.getReal() >= 0) {
// regular case, the offset is between 0.0 and 1.0
offset = regularOffset;
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl;
} else {
// very rare case, the offset is just before a whole second
// we will loose some bits of accuracy when adding 1 second
// but this will ensure the offset remains in the [0.0; 1.0] interval
offset = regularOffset.add(1.0);
epoch = 60l * ((date.getJ2000Day() * 24l + time.getHour()) * 60l +
time.getMinute() - time.getMinutesFromUTC() - 720l) + dl - 1;
}
this.field = field;
}
......@@ -366,11 +385,21 @@ public class FieldAbsoluteDate<T extends CalculusFieldElement<T>>
final FieldSumAndResidual<T> sumAndResidual = MathUtils.twoSum(field.getZero().add(tA), tB);
if (Double.isInfinite(sumAndResidual.getSum().getReal())) {
this.offset = sumAndResidual.getSum();
this.epoch = (sumAndResidual.getSum().getReal() < 0) ? Long.MIN_VALUE : Long.MAX_VALUE;
this.epoch = (sumAndResidual.getSum().getReal() < 0) ? Long.MIN_VALUE : Long.MAX_VALUE;
} else {
final long dl = (long) FastMath.floor(sumAndResidual.getSum().getReal());
this.offset = sumAndResidual.getSum().subtract(dl).add(sumAndResidual.getResidual());
this.epoch = epoch + dl;
final T regularOffset = sumAndResidual.getSum().subtract(dl).add(sumAndResidual.getResidual());
if (regularOffset.getReal() >= 0) {
// regular case, the offset is between 0.0 and 1.0
this.offset = regularOffset;
this.epoch = epoch + dl;
} else {
// very rare case, the offset is just before a whole second
// we will loose some bits of accuracy when adding 1 second
// but this will ensure the offset remains in the [0.0; 1.0) interval
this.offset = regularOffset.add(1.0);
this.epoch = epoch + dl - 1;
}
}
}
......
......@@ -45,7 +45,7 @@ with groupID org.orekit and artifactId orekit so maven
internal mechanism will download automatically all artifacts and dependencies
as required.
#set ( $versions = {"11.2": "2022-06-20", "11.1.2": "2022-04-27", "11.1.1": "2022-03-17", "11.1": "2022-02-14", "11.0.2": "2021-11-24", "11.0.1": "2021-10-22", "11.0": "2021-09-20", "10.3.1": "2021-06-16", "10.3": "2020-12-21", "10.2": "2020-07-14", "10.1": "2020-02-19", "10.0": "2019-06-24", "9.3.1": "2019-03-16", "9.3": "2019-01-25", "9.2": "2018-05-26","9.1": "2017-11-26","9.0.1": "2017-11-03","9.0": "2017-07-26","8.0.1": "2017-11-03","8.0": "2016-06-30","7.2.1": "2017-11-03","7.2": "2016-04-05","7.1": "2016-02-07","7.0": "2015-01-11","6.1": "2013-12-13","6.0": "2013-04-23","5.0.3": "2011-07-13","5.0.2": "2011-07-11","5.0.1": "2011-04-18"} )
#set ( $versions = {"11.2.1": "2022-08-01", "11.2": "2022-06-20", "11.1.2": "2022-04-27", "11.1.1": "2022-03-17", "11.1": "2022-02-14", "11.0.2": "2021-11-24", "11.0.1": "2021-10-22", "11.0": "2021-09-20", "10.3.1": "2021-06-16", "10.3": "2020-12-21", "10.2": "2020-07-14", "10.1": "2020-02-19", "10.0": "2019-06-24", "9.3.1": "2019-03-16", "9.3": "2019-01-25", "9.2": "2018-05-26","9.1": "2017-11-26","9.0.1": "2017-11-03","9.0": "2017-07-26","8.0.1": "2017-11-03","8.0": "2016-06-30","7.2.1": "2017-11-03","7.2": "2016-04-05","7.1": "2016-02-07","7.0": "2015-01-11","6.1": "2013-12-13","6.0": "2013-04-23","5.0.3": "2011-07-13","5.0.2": "2011-07-11","5.0.1": "2011-04-18"} )
#foreach( $version in $versions.entrySet() )
| package | link |
......
......@@ -147,6 +147,7 @@ Math to Hipparchus
Orekit 11.1.1 | Hipparchus 2.0
Orekit 11.1.2 | Hipparchus 2.1
Orekit 11.2 | Hipparchus 2.1
Orekit 11.2.1 | Hipparchus 2.1
### Maven failed to compile Orekit and complained about a missing artifact.
......
......@@ -322,4 +322,5 @@ public class NdmTestUtils {
Assert.assertTrue(Precision.equalsIncludingNaN(original.doubleValue(), rebuilt.doubleValue(), ULPS));
}
}
......@@ -1035,4 +1035,64 @@ public class CdmParserTest {
}
}
@Test
public void test_issue_942_KVN() {
// File
final String ex = "/ccsds/cdm/CDMExample_issue942.txt";
// Initialize the parser
final CdmParser parser = new ParserBuilder().buildCdmParser();
final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
// Generated CDM file
final Cdm file = parser.parseMessage(source);
// OBJECT1
Assert.assertEquals(Maneuvrable.N_A, file.getMetadataObject1().getManeuverable());
// OBJECT2
Assert.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
}
@Test
public void test_issue_942_XML() {
// File
final String ex = "/ccsds/cdm/CDMExample_issue942.xml";
// Initialize the parser
final CdmParser parser = new ParserBuilder().buildCdmParser();
final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
// Generated CDM file
final Cdm file = parser.parseMessage(source);
// OBJECT1
Assert.assertEquals(Maneuvrable.N_A, file.getMetadataObject1().getManeuverable());
// OBJECT2
Assert.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
}
@Test
public void test_issue_944() {
// File
final String ex = "/ccsds/cdm/CDMExample_issue_944.xml";
// Initialize the parser
final CdmParser parser = new ParserBuilder().buildCdmParser();
final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
// Generated CDM file
final Cdm file = parser.parseMessage(source);
// Check AREA_DRG
Assert.assertEquals(3, file.getDataObject1().getAdditionalParametersBlock().getAreaDRG(), 0.0);
// Check AREA_SRP
Assert.assertEquals(10, file.getDataObject1().getAdditionalParametersBlock().getAreaSRP(), 0.0);
}
}
......@@ -58,6 +58,16 @@ public class CdmWriterTest extends AbstractWriterTest<CdmHeader, CdmSegment, Cdm
public void testWriteExample4() {
doTest("/ccsds/cdm/CDMExample4.txt");
}
@Test
public void testWrite_issue_942_KVN() {
doTest("/ccsds/cdm/CDMExample_issue942.txt");
}
@Test
public void testWrite_issue_942_XML() {
doTest("/ccsds/cdm/CDMExample_issue942.xml");
}
}
......@@ -16,6 +16,10 @@
*/
package org.orekit.propagation.events;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.ode.events.Action;
import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
......@@ -30,9 +34,13 @@ import org.orekit.frames.FramesFactory;
import org.orekit.orbits.EquinoctialOrbit;