Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Orekit
Orekit
Commits
0ad57adb
Commit
0ad57adb
authored
Aug 02, 2022
by
Maxime Journot
Browse files
Merge branch 'master' into develop.
parents
f5c88f56
a20f2e65
Changes
26
Hide whitespace changes
Inline
Side-by-side
build.xml
View file @
0ad57adb
...
...
@@ -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"
/>
...
...
pom.xml
View file @
0ad57adb
...
...
@@ -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>
...
...
src/changes/changes.xml
View file @
0ad57adb
...
...
@@ -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
...
...
src/main/java/org/orekit/files/ccsds/ndm/cdm/AdditionalParametersKey.java
View file @
0ad57adb
...
...
@@ -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:
:
setArea
DRG
)),
container:
:
setArea
SRP
)),
/** The mass of the object. */
MASS
((
token
,
context
,
container
)
->
token
.
processAsDouble
(
Unit
.
KILOGRAM
,
context
.
getParsedUnitsBehavior
(),
...
...
src/main/java/org/orekit/files/ccsds/ndm/cdm/CdmData.java
View file @
0ad57adb
...
...
@@ -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
()
{
...
...
src/main/java/org/orekit/files/ccsds/ndm/cdm/CdmMetadataKey.java
View file @
0ad57adb
...
...
@@ -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
.
processAs
Enum
(
Maneuvrable
.
class
,
container:
:
setManeuverable
)),
MANEUVERABLE
((
token
,
context
,
container
)
->
token
.
processAsManeuvrable
Enum
(
container:
:
setManeuverable
)),
/** Central body for Object 1 and 2. */
ORBIT_CENTER
((
token
,
context
,
container
)
->
token
.
processAsCenter
(
container:
:
setOrbitCenter
,
...
...
src/main/java/org/orekit/files/ccsds/ndm/cdm/CdmMetadataWriter.java
View file @
0ad57adb
...
...
@@ -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
);
...
...
src/main/java/org/orekit/files/ccsds/ndm/cdm/Maneuvrable.java
View file @
0ad57adb
...
...
@@ -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
();
}
}
src/main/java/org/orekit/files/ccsds/ndm/cdm/RTNCovariance.java
View file @
0ad57adb
...
...
@@ -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
()
{
...
...
src/main/java/org/orekit/files/ccsds/utils/lexical/ParseToken.java
View file @
0ad57adb
...
...
@@ -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
);
}
}
src/main/java/org/orekit/propagation/events/EventState.java
View file @
0ad57adb
...
...
@@ -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
.
shiftedB
y
(
interval
.
getLeftAbscissa
());
beforeRootT
=
date
.
appl
y
(
interval
.
getLeftAbscissa
());
beforeRootG
=
interval
.
getLeftValue
();
afterRootT
=
fT0
.
shiftedB
y
(
interval
.
getRightAbscissa
());
afterRootG
=
interval
.
getRightValue
();
afterRootT
=
date
.
appl
y
(
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
.
shiftedB
y
(
interval
.
getRightAbscissa
());
beforeRootT
=
date
.
appl
y
(
interval
.
getRightAbscissa
());
beforeRootG
=
interval
.
getRightValue
();
afterRootT
=
fT0
.
shiftedB
y
(
interval
.
getLeftAbscissa
());
afterRootG
=
interval
.
getLeftValue
();
afterRootT
=
date
.
appl
y
(
interval
.
getLeftAbscissa
());
afterRootG
=
interval
.
getLeftValue
();
// CHECKSTYLE: stop IllegalCatch check
}
catch
(
RuntimeException
e
)
{
// CHECKSTYLE: resume IllegalCatch check
...
...
src/main/java/org/orekit/propagation/events/FieldEventState.java
View file @
0ad57adb
...
...
@@ -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
.
shiftedB
y
(
interval
.
getLeftAbscissa
());
solver
.
solveInterval
(
maxIterationCount
,
f
,
0
,
tbDouble
);
beforeRootT
=
date
.
appl
y
(
interval
.
getLeftAbscissa
());
beforeRootG
=
zero
.
add
(
interval
.
getLeftValue
());
afterRootT
=
fT0
.
shiftedB
y
(
interval
.
getRightAbscissa
());
afterRootG
=
zero
.
add
(
interval
.
getRightValue
());
afterRootT
=
date
.
appl
y
(
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
.
shiftedB
y
(
interval
.
getRightAbscissa
());
solver
.
solveInterval
(
maxIterationCount
,
f
,
tbDouble
,
0
);
beforeRootT
=
date
.
appl
y
(
interval
.
getRightAbscissa
());
beforeRootG
=
zero
.
add
(
interval
.
getRightValue
());
afterRootT
=
fT0
.
shiftedB
y
(
interval
.
getLeftAbscissa
());
afterRootG
=
zero
.
add
(
interval
.
getLeftValue
());
afterRootT
=
date
.
appl
y
(
interval
.
getLeftAbscissa
());
afterRootG
=
zero
.
add
(
interval
.
getLeftValue
());
// CHECKSTYLE: stop IllegalCatch check
}
catch
(
RuntimeException
e
)
{
// CHECKSTYLE: resume IllegalCatch check
...
...
src/main/java/org/orekit/time/AbsoluteDate.java
View file @
0ad57adb
...
...
@@ -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
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
dl
;
if
(
regularOffset
>=
0
)
{
// regular case, the offset is between 0.0 and 1.0
offset
=
regularOffset
;
epoch
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
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
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
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
;
}
}
}
...
...
src/main/java/org/orekit/time/FieldAbsoluteDate.java
View file @
0ad57adb
...
...
@@ -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
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
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
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
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
=
60
l
*
((
date
.
getJ2000Day
()
*
24
l
+
time
.
getHour
())
*
60
l
+
time
.
getMinute
()
-
time
.
getMinutesFromUTC
()
-
720
l
)
+
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
;
}
}
}
...
...
src/site/markdown/downloads.md.vm
View file @
0ad57adb
...
...
@@ -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 |
...
...
src/site/markdown/faq.md
View file @
0ad57adb
...
...
@@ -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.
...
...
src/test/java/org/orekit/files/ccsds/ndm/NdmTestUtils.java
View file @
0ad57adb
...
...
@@ -322,4 +322,5 @@ public class NdmTestUtils {
Assert
.
assertTrue
(
Precision
.
equalsIncludingNaN
(
original
.
doubleValue
(),
rebuilt
.
doubleValue
(),
ULPS
));
}
}
src/test/java/org/orekit/files/ccsds/ndm/cdm/CdmParserTest.java
View file @
0ad57adb
...
...
@@ -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
);
}
}
src/test/java/org/orekit/files/ccsds/ndm/cdm/CdmWriterTest.java
View file @
0ad57adb
...
...
@@ -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"
);
}
}
src/test/java/org/orekit/propagation/events/DateDetectorTest.java
View file @
0ad57adb
...
...
@@ -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
;