Orekit issueshttps://gitlab.orekit.org/groups/orekit/-/issues2023-12-30T08:21:51Zhttps://gitlab.orekit.org/orekit/orekit/-/issues/1284Wrong comment in measurement code2023-12-30T08:21:51ZBryan CazabonneWrong comment in measurement codeThe following code is taken from AngularAzEL
```java
// Partial derivatives of azimuth/elevation with respect to state
// (beware element at index 0 is the value, not a derivative)
final double[] azDerivatives = azimuth...The following code is taken from AngularAzEL
```java
// Partial derivatives of azimuth/elevation with respect to state
// (beware element at index 0 is the value, not a derivative)
final double[] azDerivatives = azimuth.getGradient();
final double[] elDerivatives = elevation.getGradient();
estimated.setStateDerivatives(0,
Arrays.copyOfRange(azDerivatives, 0, 6), Arrays.copyOfRange(elDerivatives, 0, 6));
```
The comment is correct for DerivativeStructure, not Gradient.
When perfoming the switch, some comments were forgotten.https://gitlab.orekit.org/orekit/orekit/-/issues/1283Restore and add previous API of MeasurementBuilder.build method2024-03-22T19:24:10ZMaxime JournotRestore and add previous API of MeasurementBuilder.build methodMethod `build` of `MeasurementBuilder` now takes as input `(AbsoluteDate date, Map<ObservableSatellite, OrekitStepInterpolator> interpolators)` as input.
Formerly (before v12) it took as input `(SpacecraftState[] states)`.
The new API ...Method `build` of `MeasurementBuilder` now takes as input `(AbsoluteDate date, Map<ObservableSatellite, OrekitStepInterpolator> interpolators)` as input.
Formerly (before v12) it took as input `(SpacecraftState[] states)`.
The new API is a bit hard to use and there have been two questions about this change on the forum (see [here](https://forum.orekit.org/t/inputs-of-build-for-measurement-builders-in-orekit-12-0/3094) and [here](https://forum.orekit.org/t/use-of-angularradecbuilder-build-method/3115).
In the 1st mentioned thread, a proposition of a new intermediate API was made. It would restore the functionality of the previous one, taking as input `(AbsoluteDate date, SpacecraftState[] states)`.12.1https://gitlab.orekit.org/orekit/orekit/-/issues/1282LOFType.EQW frame: mismatch between Javadoc and code?2024-01-19T07:53:09ZClément JonglezLOFType.EQW frame: mismatch between Javadoc and code?In `src/main/java/org/orekit/frames/LOFType.java:568`, the Javadoc says that the Z axis of the EQW frame is aligned with orbital momentum, but in the code it looks like it's rather the Y axis:
```
public Rotation rotationFromIne...In `src/main/java/org/orekit/frames/LOFType.java:568`, the Javadoc says that the Z axis of the EQW frame is aligned with orbital momentum, but in the code it looks like it's rather the Y axis:
```
public Rotation rotationFromInertial(final PVCoordinates pv) {
final Vector3D m = pv.getMomentum();
return new Rotation(new Vector3D(-m.getY(), m.getX(), 0), m,
Vector3D.PLUS_I, Vector3D.PLUS_J);
}
```Vincent CUCCHIETTIvincent.cucchietti@csgroup.euVincent CUCCHIETTIvincent.cucchietti@csgroup.euhttps://gitlab.orekit.org/orekit/orekit/-/issues/1281Crash in Field propagation with date detection2024-01-26T22:35:35ZRomain SerraCrash in Field propagation with date detectionSince Hipparchus 3.0/Orekit 12.0, following code doesn't finish the propagation.
Some possible causes:
- ~~new values for default threshold in `FieldDateDetector`~~
- use of `isZero` (see comments)
Orekit 12.0 code:
```
@Test
...Since Hipparchus 3.0/Orekit 12.0, following code doesn't finish the propagation.
Some possible causes:
- ~~new values for default threshold in `FieldDateDetector`~~
- use of `isZero` (see comments)
Orekit 12.0 code:
```
@Test
void regressionDetection() {
final GradientField field = GradientField.getField(1);
final FieldAbsoluteDate<Gradient> fieldEpoch = FieldAbsoluteDate.getArbitraryEpoch(field);
final FieldPVCoordinates<Gradient> fieldPVCoordinates = new FieldPVCoordinates<>(
new FieldVector3D<>(field, new Vector3D(10000.e3, 0, 0)),
new FieldVector3D<>(field, new Vector3D(0, 7.5e3, 0)));
final FieldCartesianOrbit<Gradient> fieldOrbit = new FieldCartesianOrbit<>(fieldPVCoordinates,
FramesFactory.getGCRF(), fieldEpoch, field.getZero().add(Constants.EGM96_EARTH_MU));
final ClassicalRungeKuttaFieldIntegrator<Gradient> fieldIntegrator = new ClassicalRungeKuttaFieldIntegrator<>(field,
field.getZero().add(5.));
final FieldNumericalPropagator<Gradient> fieldNumericalPropagator = new FieldNumericalPropagator<>(
field, fieldIntegrator);
fieldNumericalPropagator.resetInitialState(new FieldSpacecraftState<>(fieldOrbit));
fieldNumericalPropagator.setResetAtEnd(true);
final AbsoluteDate epoch = fieldEpoch.toAbsoluteDate();
final TestForce testForce = new TestForce(epoch.shiftedBy(10.),
epoch.shiftedBy(100.), epoch.shiftedBy(1000.));
fieldNumericalPropagator.addForceModel(testForce);
for (AbsoluteDate date: testForce.dates) {
final FieldAbsoluteDate<Gradient> fieldDate = new FieldAbsoluteDate<>(field, date)
.shiftedBy(Gradient.variable(1, 0, 0.));
fieldNumericalPropagator.propagate(fieldDate);
}
}
private static class TestForce implements ForceModel {
private final AbsoluteDate[] dates;
TestForce (AbsoluteDate ...dates) {
this.dates = dates;
}
@Override
public boolean dependsOnPositionOnly() {
return true;
}
@Override
public Stream<EventDetector> getEventDetectors() {
return Arrays.stream(dates).map(DateDetector::new)
.map(d -> d.withHandler((a, b, c) -> Action.RESET_DERIVATIVES));
}
@Override
public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventDetectors(Field<T> field) {
return Arrays.stream(dates).map(date -> new FieldDateDetector<>(field, new FieldAbsoluteDate<>(field, date)))
.map(d -> d.withHandler((a, b, c) -> Action.RESET_DERIVATIVES));
}
@Override
public Vector3D acceleration(SpacecraftState s, double[] parameters) {
return Vector3D.ZERO;
}
@Override
public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(FieldSpacecraftState<T> s, T[] parameters) {
return FieldVector3D.getZero(s.getDate().getField());
}
@Override
public List<ParameterDriver> getParametersDrivers() {
return new ArrayList<>();
}
}
```
Orekit 11.3 code:
```
@Test
void regressionDetection() {
final GradientField field = GradientField.getField(1);
final FieldAbsoluteDate<Gradient> fieldEpoch = FieldAbsoluteDate.getArbitraryEpoch(field);
final FieldPVCoordinates<Gradient> fieldPVCoordinates = new FieldPVCoordinates<>(
new FieldVector3D<>(field, new Vector3D(10000.e3, 0, 0)),
new FieldVector3D<>(field, new Vector3D(0, 7.5e3, 0)));
final FieldCartesianOrbit<Gradient> fieldOrbit = new FieldCartesianOrbit<>(fieldPVCoordinates,
FramesFactory.getGCRF(), fieldEpoch, field.getZero().add(Constants.EGM96_EARTH_MU));
final ClassicalRungeKuttaFieldIntegrator<Gradient> fieldIntegrator = new ClassicalRungeKuttaFieldIntegrator<>(field,
field.getZero().add(5.));
final FieldNumericalPropagator<Gradient> fieldNumericalPropagator = new FieldNumericalPropagator<>(
field, fieldIntegrator);
fieldNumericalPropagator.resetInitialState(new FieldSpacecraftState<>(fieldOrbit));
fieldNumericalPropagator.setResetAtEnd(true);
final AbsoluteDate epoch = fieldEpoch.toAbsoluteDate();
final TestForce testForce = new TestForce(epoch.shiftedBy(10.),
epoch.shiftedBy(100.), epoch.shiftedBy(1000.));
fieldNumericalPropagator.addForceModel(testForce);
for (AbsoluteDate date: testForce.dates) {
final FieldAbsoluteDate<Gradient> fieldDate = new FieldAbsoluteDate<>(field, date)
.shiftedBy(Gradient.variable(1, 0, 0.));
fieldNumericalPropagator.propagate(fieldDate);
}
}
private static class TestForce extends AbstractForceModel {
private final AbsoluteDate[] dates;
TestForce (AbsoluteDate ...dates) {
this.dates = dates;
}
@Override
public boolean dependsOnPositionOnly() {
return true;
}
@Override
public Stream<EventDetector> getEventsDetectors() {
return Arrays.stream(dates).map(DateDetector::new)
.map(d -> d.withHandler((a, b, c) -> Action.RESET_DERIVATIVES));
}
@Override
public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventsDetectors(Field<T> field) {
return Arrays.stream(dates).map(date ->
new FieldDateDetector<>(field.getZero().add(AbstractDetector.DEFAULT_MAXCHECK),
field.getZero().add(AbstractDetector.DEFAULT_THRESHOLD), new FieldAbsoluteDate<>(field, date)))
.map(d -> d.withHandler((a, b, c) -> Action.RESET_DERIVATIVES));
}
@Override
public Vector3D acceleration(SpacecraftState s, double[] parameters) {
return Vector3D.ZERO;
}
@Override
public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(FieldSpacecraftState<T> s, T[] parameters) {
return FieldVector3D.getZero(s.getDate().getField());
}
@Override
public List<ParameterDriver> getParametersDrivers() {
return new ArrayList<>();
}
}
```12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1280Add missing contributions for 12.0 in changes.xml2023-12-30T11:40:01ZMaxime JournotAdd missing contributions for 12.0 in changes.xmlSome contributions for fixing issues #1203 and #982 are missing in the changes.xml for v 12.0Some contributions for fixing issues #1203 and #982 are missing in the changes.xml for v 12.012.0.1Maxime JournotMaxime Journothttps://gitlab.orekit.org/orekit/orekit/-/issues/1279Orekit DSST bug in adding DDSTTesseral force model2023-11-28T22:18:08ZBryan PrestOrekit DSST bug in adding DDSTTesseral force modelIssue from forum discussion: https://forum.orekit.org/t/dsst-earth-gravity-field-addition/3053/7
No initialization of resonant terms (contribution equal to 0.0) when trying to use DSST propagator adding DSSTTesseral force model.
Initial ...Issue from forum discussion: https://forum.orekit.org/t/dsst-earth-gravity-field-addition/3053/7
No initialization of resonant terms (contribution equal to 0.0) when trying to use DSST propagator adding DSSTTesseral force model.
Initial state is set as MEAN, and the initial orbital elements are:
Mean elements:
a=7070966.981581845
e=0.0010432729458547982
i=98.15892489558152
pa=90.0
raan=287.4746
Ma=271.1660https://gitlab.orekit.org/orekit/orekit/-/issues/1278Wrong weigths computation induces MathIllegalStateException when computing Pr...2023-11-24T21:55:27ZLuc MaisonobeWrong weigths computation induces MathIllegalStateException when computing PredictedEOPHistoryEarth Orientation Parameters prediction is based on fitting past EOP history to build models that can be used in the near future after end of history.
The `SingleParameterFitter` javadoc states that the weights of the EOP history entries...Earth Orientation Parameters prediction is based on fitting past EOP history to build models that can be used in the near future after end of history.
The `SingleParameterFitter` javadoc states that the weights of the EOP history entries is $`e^\frac{t-t_0}{\tau}`$, and explains points far in the past before $`t_0`$ have small weights, hence implying $`t_0`$ is the fitting date and corresponds to the latest date in the history.
This is however not true, inside the code $`t_0`$ is the date of the first used entry, which is the fitting date minus the fitting duration. This implies that $`t-t_0>0`$ for all points and the points closest to the end of the sample have very large weights. In fact, rather than having weights close to 1.0 near fitting date and decreasing exponentially when we go far in the past, we have weights that are close to 1 at the beginning of the fitting interval and that grows up exponentially as we approach the fitting date.
As long as the fitting duration and $`\tau`$ have reasonable relative values, this is not really a problem as choosing $`t_0`$ either at start or end of the fitting interval just scales up all weights by some exponential constant. This however induces problems if fitting duration is very large with respect to $`\tau`$ as the weight will become infinite close to fitting date.
One example is to use a fitting duration of three years and a $`\tau`$ equal to one day. The infinite weights generate a `MathIllegalStateException` in the curve fitting.
Fixing this just implies putting $`t_0`$ to the end of history, which is trivial. With this change, the fitting duration becomes essentially useless, we can just ignore it and rely on the exponential decay of the weight for points far in the past. So we could deprecate the constructor that uses a duration, have it ignore the duration and call a new constructor that does not have any fitting duration.12.0.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1277Regression in computation speed when using Ephemeris2023-12-30T11:41:37ZVincent CUCCHIETTIvincent.cucchietti@csgroup.euRegression in computation speed when using EphemerisHi everyone,
Opening this issue following [this forum thread](https://forum.orekit.org/t/decreased-computation-speed-of-eventdetector-in-orekit-12-0/3097)
Working on it.
Cheers,
VincentHi everyone,
Opening this issue following [this forum thread](https://forum.orekit.org/t/decreased-computation-speed-of-eventdetector-in-orekit-12-0/3097)
Working on it.
Cheers,
Vincent12.0.1Vincent CUCCHIETTIvincent.cucchietti@csgroup.euVincent CUCCHIETTIvincent.cucchietti@csgroup.euhttps://gitlab.orekit.org/orekit/orekit/-/issues/1276Replace use of multiply on Field one by newInstance2023-12-06T11:27:47ZRomain SerraReplace use of multiply on Field one by newInstancePerformance wise, using multiply with scalar on Fielded one is worse than using newInstancePerformance wise, using multiply with scalar on Fielded one is worse than using newInstance12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1275Add utility class for (Field) position angle conversions2023-12-05T17:14:00ZRomain SerraAdd utility class for (Field) position angle conversionsKeplerian anomaly already has it, so do the same for circular and Equinoctial, it will make the (Field) Orbit classes more readableKeplerian anomaly already has it, so do the same for circular and Equinoctial, it will make the (Field) Orbit classes more readable12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1274Use of Tide class in OceanTidesWaves2023-12-30T08:32:54ZGaëtan PierreUse of Tide class in OceanTidesWavesReplace `doodson`, `cGamma`, `cL`, `cLPrime`, `cF`, `cD`, `cOmega `by a `Tide`. In `addContribution`, replace `thetaF` computation by `getPhase` method.Replace `doodson`, `cGamma`, `cL`, `cLPrime`, `cF`, `cD`, `cOmega `by a `Tide`. In `addContribution`, replace `thetaF` computation by `getPhase` method.https://gitlab.orekit.org/orekit/orekit/-/issues/1273TimeSystem parsing in SP3Parser2024-02-06T12:48:06ZMark RuttenTimeSystem parsing in SP3ParserAn exception is thrown parsing sp3 ephemeris produced by the [qzss team](https://sys.qzss.go.jp/dod/en/archives/pnt.html). The time system in those files is "QZS", shown in the short extract below:
```text
++ 0 0 0 0 0 0 0...An exception is thrown parsing sp3 ephemeris produced by the [qzss team](https://sys.qzss.go.jp/dod/en/archives/pnt.html). The time system in those files is "QZS", shown in the short extract below:
```text
++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
%c M cc QZS ccc cccc cccc cccc cccc ccccc ccccc ccccc ccccc
%c cc cc ccc ccc cccc cccc cccc cccc ccccc ccccc ccccc ccccc
%f 1.2500000 1.025000000 0.00000000000 0.000000000000000
```
The time parsing section in `SP3Parser`
```java
final TimeSystem ts;
if (tsStr.equalsIgnoreCase("ccc")) {
ts = TimeSystem.GPS;
} else {
ts = TimeSystem.valueOf(tsStr);
}
```
could (should?) be changed to
```java
final TimeSystem ts;
if (tsStr.equalsIgnoreCase("ccc")) {
ts = TimeSystem.GPS;
} else {
ts = TimeSystem.parseTimeSystem(tsStr);
}
```
Further discussion on the [orekit forum](https://forum.orekit.org/t/timesystem-parsing-from-qzss-sp3/3076).12.0.2Mark RuttenMark Ruttenhttps://gitlab.orekit.org/orekit/orekit/-/issues/1272add converters AbsoluteDate from/to Instant2024-01-16T12:56:46ZSabrina Sarraadd converters AbsoluteDate from/to InstantIt would be useful to add methods to convert AbsoluteDate from/to Java Instant.
https://forum.orekit.org/t/absolutedate-to-java-instant/3090It would be useful to add methods to convert AbsoluteDate from/to Java Instant.
https://forum.orekit.org/t/absolutedate-to-java-instant/309012.1Christopher SchankChristopher Schankhttps://gitlab.orekit.org/orekit/orekit/-/issues/1271Add Intellij checkstyle configuration in contributing.md2023-12-30T11:41:58ZBryan CazabonneAdd Intellij checkstyle configuration in contributing.mdIt would be great to add Checkstyle configuration for Intellij in the contributing.md file.It would be great to add Checkstyle configuration for Intellij in the contributing.md file.12.0.1Bryan CazabonneBryan Cazabonnehttps://gitlab.orekit.org/orekit/orekit/-/issues/1270Renaming in (Field) Propagator2023-11-16T07:43:09ZRomain SerraRenaming in (Field) Propagator`Propagator` has a `getEventsDetectors` method, which is not coherent with `getEventDetectors` in `EventDetectorProvider` (no S in the middle) and should thus be renamed.
Check Field version as well.`Propagator` has a `getEventsDetectors` method, which is not coherent with `getEventDetectors` in `EventDetectorProvider` (no S in the middle) and should thus be renamed.
Check Field version as well.https://gitlab.orekit.org/orekit/orekit/-/issues/1269Infinite loop when using specific date with CssiSpaceWeatherData2023-12-30T11:42:34ZVincent CUCCHIETTIvincent.cucchietti@csgroup.euInfinite loop when using specific date with CssiSpaceWeatherDataHi everyone,
@MaximeJ noticed an infinite loop when using the ```CssiSpaceWeatherData``` at specific date.
Error can be reproduced using the following file:
[2023-11-14_-_Error_Infinite_Loop_CSSI.zip](/uploads/3a3d469880db4135a4db555d8...Hi everyone,
@MaximeJ noticed an infinite loop when using the ```CssiSpaceWeatherData``` at specific date.
Error can be reproduced using the following file:
[2023-11-14_-_Error_Infinite_Loop_CSSI.zip](/uploads/3a3d469880db4135a4db555d8a3ef88f/2023-11-14_-_Error_Infinite_Loop_CSSI.zip)
Cheers,
Vincent
EDIT:
Issue occurs when using date with month with 30 or less days in the predicted monthly data. A fix has been found and is currently under implementation.12.0.1Vincent CUCCHIETTIvincent.cucchietti@csgroup.euVincent CUCCHIETTIvincent.cucchietti@csgroup.euhttps://gitlab.orekit.org/orekit/orekit/-/issues/1268Add Herrick-Gibbs IOD method2023-11-13T13:55:03ZRomain SerraAdd Herrick-Gibbs IOD methodGibbs' method suitability for closely spaced positions is limited. There's an alternative for that case, referred to as Herrick-Gibbs in Vallado's book (page 466 in 4th edition)Gibbs' method suitability for closely spaced positions is limited. There's an alternative for that case, referred to as Herrick-Gibbs in Vallado's book (page 466 in 4th edition)https://gitlab.orekit.org/orekit/orekit-tutorials/-/issues/27Update release-guide2023-11-10T11:27:07ZMaxime JournotUpdate release-guideFollowing the release of Tutorials 12.0 it appeared some information was outdated.Following the release of Tutorials 12.0 it appeared some information was outdated.12.1Maxime JournotMaxime Journothttps://gitlab.orekit.org/orekit/orekit-tutorials/-/issues/26License file not showing in Maven documentation2023-11-09T20:02:29ZMaxime JournotLicense file not showing in Maven documentationThe [license disclaimer](https://www.orekit.org/site-orekit-tutorials-development/licenses.html) for Apache Software License, v2.0 is missing.
It should be added automatically to the website like it is done in [Orekit technical docume...The [license disclaimer](https://www.orekit.org/site-orekit-tutorials-development/licenses.html) for Apache Software License, v2.0 is missing.
It should be added automatically to the website like it is done in [Orekit technical documentation](https://www.orekit.org/site-orekit-development/licenses.html).https://gitlab.orekit.org/orekit/orekit-tutorials/-/issues/25Update site page "Integration in other languages"2023-11-09T19:59:57ZMaxime JournotUpdate site page "Integration in other languages"Page [Integration in other languages](https://www.orekit.org/site-orekit-tutorials-development/tutorials/integration-in-other-languages.html) should be updated, preferably by someone who knows his way with Orekit in Matlab.Page [Integration in other languages](https://www.orekit.org/site-orekit-tutorials-development/tutorials/integration-in-other-languages.html) should be updated, preferably by someone who knows his way with Orekit in Matlab.