Commit 6b0fbde4 authored by Luc Maisonobe's avatar Luc Maisonobe

Merge branch 'develop' into gnss-attitude

parents 780d902a 73edf3a8
......@@ -86,11 +86,6 @@
<property name="onCommentFormat" value="CHECKSTYLE\: resume NoWhitespaceAfter check"/>
<property name="checkFormat" value="NoWhitespaceAfter"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop FallThrough check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume FallThrough check"/>
<property name="checkFormat" value="FallThrough"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop Indentation check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume Indentation check"/>
......
......@@ -71,11 +71,18 @@ class MeasurementHandler implements MultiSatStepHandler {
while (number < precompensated.size()) {
// consider the next measurement to handle
// Consider the next measurement to handle
final PreCompensation next = precompensated.get(number);
if (next.getDate().compareTo(interpolators.get(0).getCurrentState().getDate()) > 0) {
// the next date is past the end of the interpolator,
// FIXME: Test
final boolean test = interpolators.get(0).isForward();
// Current state date for interpolator 0
final AbsoluteDate currentDate = interpolators.get(0).getCurrentState().getDate();
if ((model.isForwardPropagation() && (next.getDate().compareTo(currentDate) > 0)) ||
(!model.isForwardPropagation() && (next.getDate().compareTo(currentDate) < 0))) {
// The next date is past the end of the interpolator,
// it will be picked-up in a future step
if (isLast) {
// this should never happen
......
......@@ -18,6 +18,7 @@ package org.orekit.estimation.leastsquares;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
......@@ -29,6 +30,7 @@ import org.hipparchus.linear.MatrixUtils;
import org.hipparchus.linear.RealMatrix;
import org.hipparchus.linear.RealVector;
import org.hipparchus.optim.nonlinear.vector.leastsquares.MultivariateJacobianFunction;
import org.hipparchus.util.FastMath;
import org.hipparchus.util.Incrementor;
import org.hipparchus.util.Pair;
import org.orekit.errors.OrekitException;
......@@ -100,6 +102,9 @@ class Model implements MultivariateJacobianFunction {
/** Date of the last enabled measurement. */
private AbsoluteDate lastDate;
/** Boolean indicating if the propagation will go forward or backward. */
private final boolean forwardPropagation;
/** Mappers for Jacobians. */
private JacobiansMapper[] mappers;
......@@ -130,7 +135,6 @@ class Model implements MultivariateJacobianFunction {
this.observer = observer;
this.mappers = new JacobiansMapper[builders.length];
// allocate vector and matrix
int rows = 0;
for (final ObservedMeasurement<?> measurement : measurements) {
......@@ -177,9 +181,28 @@ class Model implements MultivariateJacobianFunction {
++columns;
}
// Initialize point and value
value = new ArrayRealVector(rows);
jacobian = MatrixUtils.createRealMatrix(rows, columns);
// Decide whether the propagation will be done forward or backward.
// Minimize the duration between first measurement treated and orbit determination date
// Propagator builder number 0 holds the reference date for orbit determination
final AbsoluteDate refDate = builders[0].getInitialOrbitDate();
// Sort the measurement list chronologically
measurements.sort(new ChronologicalComparator());
firstDate = measurements.get(0).getDate();
lastDate = measurements.get(measurements.size() - 1).getDate();
// Decide the direction of propagation
if (FastMath.abs(refDate.durationFrom(firstDate)) <= FastMath.abs(refDate.durationFrom(lastDate))) {
// Propagate forward from firstDate
forwardPropagation = true;
} else {
// Propagate backward from lastDate
forwardPropagation = false;
}
}
/** Set the counter for evaluations.
......@@ -196,6 +219,13 @@ class Model implements MultivariateJacobianFunction {
this.iterationsCounter = iterationsCounter;
}
/** Return the forward propagation flag.
* @return the forward propagation flag
*/
boolean isForwardPropagation() {
return forwardPropagation;
}
/** {@inheritDoc} */
@Override
public Pair<RealVector, RealMatrix> value(final RealVector point)
......@@ -221,8 +251,14 @@ class Model implements MultivariateJacobianFunction {
}
}
// run the propagation, gathering residuals on the fly
parallelizer.propagate(firstDate.shiftedBy(-1.0), lastDate.shiftedBy(+1.0));
// Run the propagation, gathering residuals on the fly
if (forwardPropagation) {
// Propagate forward from firstDate
parallelizer.propagate(firstDate.shiftedBy(-1.0), lastDate.shiftedBy(+1.0));
} else {
// Propagate backward from lastDate
parallelizer.propagate(lastDate.shiftedBy(+1.0), firstDate.shiftedBy(-1.0));
}
observer.modelCalled(orbits, evaluations);
......@@ -343,9 +379,15 @@ class Model implements MultivariateJacobianFunction {
}
precompensated.sort(new ChronologicalComparator());
// Assign first and last date
firstDate = precompensated.get(0).getDate();
lastDate = precompensated.get(precompensated.size() - 1).getDate();
// Reverse the list in case of backward propagation
if (!forwardPropagation) {
Collections.reverse(precompensated);
}
return new MeasurementHandler(this, precompensated);
}
......
......@@ -85,7 +85,7 @@ public class TDMFile {
/** Set the header comment.
* @param headerComment header comment
*/
void setHeaderComment(final List<String> headerComment) {
public void setHeaderComment(final List<String> headerComment) {
this.headerComment = new ArrayList<>(headerComment);
}
......@@ -99,7 +99,7 @@ public class TDMFile {
/** Set the file creation date and time in UTC.
* @param creationDate the creation date to be set
*/
void setCreationDate(final AbsoluteDate creationDate) {
public void setCreationDate(final AbsoluteDate creationDate) {
this.creationDate = creationDate;
}
......@@ -113,7 +113,7 @@ public class TDMFile {
/** Set the file originator.
* @param originator the originator to be set
*/
void setOriginator(final String originator) {
public void setOriginator(final String originator) {
this.originator = originator;
}
......@@ -497,7 +497,7 @@ public class TDMFile {
/** Create a new TDM meta-data.
*/
TDMMetaData() {
public TDMMetaData() {
participants = new TreeMap<>();
transmitDelays = new TreeMap<>();
receiveDelays = new TreeMap<>();
......
......@@ -430,6 +430,23 @@ public class SP3File implements EphemerisFile {
}
}
/**
* Get the formal accuracy for a satellite.
*
* @param index is the index of the satellite.
* @return accuracy of the satellite, in m.
*/
double getAccuracy(final int index) {
int n = index;
for (final SP3Ephemeris ephemeris : satellites.values()) {
if (n == 0) {
return ephemeris.getAccuracy();
}
n--;
}
return Double.NaN;
}
/** Tests whether a satellite with the given id is contained in this orbit
* file.
* @param satId the satellite id
......@@ -553,7 +570,8 @@ public class SP3File implements EphemerisFile {
/**
* Get the formal accuracy for this satellite.
*
* <p> The accuracy is limited by the SP3 standard to be a power of 2.
* <p>The accuracy is limited by the SP3 standard to be a power of 2 in mm.
* The value returned here is in meters.</p>
*
* @return magnitude of one standard deviation, in m.
*/
......
/*
/* Contributed to the public domain
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......
......@@ -24,6 +24,22 @@
<action dev="luc" type="add">
Added handling of IGS ANTEX GNSS antenna models file.
</action>
<action dev="luc" type="fix">
Improved SP3 files parsing.
Some files already operationally produced by IGS Multi-GNSS Experiment (MGEX)
exceed the maximum number of satellites supported by the regular SP3-c file
format (which is 85) and extended the header. The parser now supports this
extension.
Fixes issue #376.
</action>
<action dev="maxime" type="add">
Allow backward propagation in batch LS orbit determination.
Fixes issue #375.
</action>
<action dev="maxime" type="add">
Added covariance matrix to PV measurements.
Fixes issue #374.
</action>
<action dev="luc" type="fix">
Fixed issue when converting very far points (such as Sun center) to geodetic coordinates.
Fixes issue #373.
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.errors;
import org.hipparchus.exception.DummyLocalizable;
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.estimation.iod;
import java.util.List;
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.estimation.iod;
import java.util.List;
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.estimation.iod;
import java.util.List;
......
......@@ -100,6 +100,50 @@ public class BatchLSEstimatorTest {
Assert.assertEquals(0.00258, physicalCovariances.getEntry(0, 0), 1.0e-5);
}
/** Test PV measurements generation and backward propagation in least-square orbit determination. */
@Test
public void testKeplerPVBackward() throws OrekitException {
Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
final NumericalPropagatorBuilder propagatorBuilder =
context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
1.0e-6, 60.0, 1.0);
// create perfect PV measurements
final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
propagatorBuilder);
final List<ObservedMeasurement<?>> measurements =
EstimationTestUtils.createMeasurements(propagator,
new PVMeasurementCreator(),
0.0, -1.0, 300.0);
// create orbit estimator
final BatchLSEstimator estimator = new BatchLSEstimator(new LevenbergMarquardtOptimizer(),
propagatorBuilder);
for (final ObservedMeasurement<?> measurement : measurements) {
estimator.addMeasurement(measurement);
}
estimator.setParametersConvergenceThreshold(1.0e-2);
estimator.setMaxIterations(10);
estimator.setMaxEvaluations(20);
EstimationTestUtils.checkFit(context, estimator, 1, 2,
0.0, 8.3e-9,
0.0, 5.3e-8,
0.0, 5.6e-9,
0.0, 1.6e-12);
RealMatrix normalizedCovariances = estimator.getOptimum().getCovariances(1.0e-10);
RealMatrix physicalCovariances = estimator.getPhysicalCovariances(1.0e-10);
Assert.assertEquals(6, normalizedCovariances.getRowDimension());
Assert.assertEquals(6, normalizedCovariances.getColumnDimension());
Assert.assertEquals(6, physicalCovariances.getRowDimension());
Assert.assertEquals(6, physicalCovariances.getColumnDimension());
Assert.assertEquals(0.00258, physicalCovariances.getEntry(0, 0), 1.0e-5);
}
@Test
public void testKeplerRange() throws OrekitException {
......
......@@ -16,6 +16,8 @@
*/
package org.orekit.estimation.leastsquares;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Map;
......@@ -89,6 +91,9 @@ public class ModelTest {
final Model model = new Model(builders, measurements, estimatedMeasurementsParameters, modelObserver);
model.setIterationsCounter(new Incrementor(100));
model.setEvaluationsCounter(new Incrementor(100));
// Test forward propagation flag to true
assertEquals(true, model.isForwardPropagation());
// evaluate model on perfect start point
final double[] normalizedProp = propagatorBuilder.getSelectedNormalizedParameters();
......@@ -109,6 +114,46 @@ public class ModelTest {
Assert.assertEquals(index, value.getFirst().getDimension());
}
@Test
public void testBackwardPropagation() throws OrekitException {
final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
final NumericalPropagatorBuilder propagatorBuilder =
context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
1.0e-6, 60.0, 0.001);
final NumericalPropagatorBuilder[] builders = { propagatorBuilder };
// create perfect PV measurements
final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
propagatorBuilder);
final List<ObservedMeasurement<?>> measurements =
EstimationTestUtils.createMeasurements(propagator,
new PVMeasurementCreator(),
0.0, -1.0, 300.0);
final ParameterDriversList estimatedMeasurementsParameters = new ParameterDriversList();
for (ObservedMeasurement<?> measurement : measurements) {
for (final ParameterDriver driver : measurement.getParametersDrivers()) {
if (driver.isSelected()) {
estimatedMeasurementsParameters.add(driver);
}
}
}
// create model
final ModelObserver modelObserver = new ModelObserver() {
/** {@inheritDoc} */
@Override
public void modelCalled(final Orbit[] newOrbits,
final Map<ObservedMeasurement<?>, EstimatedMeasurement<?>> newEvaluations) {
// Do nothing here
}
};
final Model model = new Model(builders, measurements, estimatedMeasurementsParameters, modelObserver);
// Test forward propagation flag to false
assertEquals(false, model.isForwardPropagation());
}
}
......
......@@ -28,12 +28,15 @@ import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.files.sp3.SP3File.SP3Coordinate;
import org.orekit.files.sp3.SP3File.SP3Ephemeris;
import org.orekit.files.sp3.SP3File.SP3OrbitType;
import org.orekit.files.sp3.SP3File.TimeSystem;
import org.orekit.frames.FactoryManagedFrame;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Predefined;
import org.orekit.propagation.BoundedPropagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
......@@ -55,6 +58,8 @@ public class SP3ParserTest {
Assert.assertEquals(SP3OrbitType.FIT, file.getOrbitType());
Assert.assertEquals(TimeSystem.GPS, file.getTimeSystem());
Assert.assertSame(Predefined.ITRF_CIO_CONV_2010_SIMPLE_EOP,
((FactoryManagedFrame) file.getSatellites().get("1").getFrame()).getFactoryKey());
Assert.assertEquals(25, file.getSatelliteCount());
......@@ -118,7 +123,7 @@ public class SP3ParserTest {
@Test
public void testParseSP3c1() throws OrekitException, IOException {
// simple test for version sp3-c, contains p/v entries
// simple test for version sp3-c, contains p entries
final String ex = "/sp3/sp3_c_example1.txt";
final SP3Parser parser = new SP3Parser();
......@@ -145,6 +150,65 @@ public class SP3ParserTest {
coord);
}
@Test
public void testParseSP3c2() throws OrekitException, IOException {
// simple test for version sp3-c, contains p/v entries and correlations
final String ex = "/sp3/sp3_c_example2.txt";
final SP3Parser parser = new SP3Parser();
final InputStream inEntry = getClass().getResourceAsStream(ex);
final SP3File file = parser.parse(inEntry);
Assert.assertEquals(SP3OrbitType.HLM, file.getOrbitType());
Assert.assertEquals(TimeSystem.GPS, file.getTimeSystem());
Assert.assertEquals(26, file.getSatelliteCount());
final List<SP3Coordinate> coords = file.getSatellites().get("G01").getCoordinates();
Assert.assertEquals(2, coords.size());
final SP3Coordinate coord = coords.get(0);
// 2001 8 8 0 0 0.00000000
Assert.assertEquals(new AbsoluteDate(2001, 8, 8, 0, 0, 0,
TimeScalesFactory.getGPS()), coord.getDate());
// PG01 -11044.805800 -10475.672350 21929.418200 189.163300 18 18 18 219
// VG01 20298.880364 -18462.044804 1381.387685 -4.534317 14 14 14 191
checkPVEntry(new PVCoordinates(new Vector3D(-11044805.8, -10475672.35, 21929418.2),
new Vector3D(2029.8880364, -1846.2044804, 138.1387685)),
coord);
}
@Test
public void testSP3GFZ() throws OrekitException, IOException {
// simple test for version sp3-c, contains more than 85 satellites
final String ex = "/sp3/gbm19500_truncated.sp3";
final SP3Parser parser = new SP3Parser();
final InputStream inEntry = getClass().getResourceAsStream(ex);
final SP3File file = parser.parse(inEntry);
Assert.assertEquals(SP3OrbitType.FIT, file.getOrbitType());
Assert.assertEquals(TimeSystem.GPS, file.getTimeSystem());
Assert.assertEquals(87, file.getSatelliteCount());
final List<SP3Coordinate> coords = file.getSatellites().get("R23").getCoordinates();
Assert.assertEquals(2, coords.size());
final SP3Coordinate coord = coords.get(0);
Assert.assertEquals(new AbsoluteDate(2017, 5, 21, 0, 0, 0,
TimeScalesFactory.getGPS()), coord.getDate());
// PG01 -11044.805800 -10475.672350 21929.418200 189.163300 18 18 18 219
// PR23 24552.470459 -242.899447 6925.437998 86.875825
checkPVEntry(new PVCoordinates(new Vector3D(24552470.459, -242899.447, 6925437.998),
Vector3D.ZERO),
coord);
}
@Test
public void testSP3Propagator() throws Exception {
// setup
......@@ -210,6 +274,57 @@ public class SP3ParserTest {
Assert.assertEquals(Vector3D.ZERO, actual.getAcceleration());
}
@Test
public void testMissingEOF() throws IOException {
try {
final String ex = "/sp3/missing-eof.sp3";
final Frame frame = FramesFactory.getITRF(IERSConventions.IERS_2003, true);
final SP3Parser parser = new SP3Parser(Constants.EIGEN5C_EARTH_MU, 3, s -> frame);
final InputStream inEntry = getClass().getResourceAsStream(ex);
parser.parse(inEntry);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.SP3_UNEXPECTED_END_OF_FILE,
oe.getSpecifier());
Assert.assertEquals(24, ((Integer) oe.getParts()[0]).intValue());
}
}
@Test
public void testWrongLineIdentifier() throws IOException {
try {
final String ex = "/sp3/wrong-line-identifier.sp3";
final Frame frame = FramesFactory.getITRF(IERSConventions.IERS_2003, true);
final SP3Parser parser = new SP3Parser(Constants.EIGEN5C_EARTH_MU, 3, s -> frame);
final InputStream inEntry = getClass().getResourceAsStream(ex);
parser.parse(inEntry);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
oe.getSpecifier());
Assert.assertEquals(13, ((Integer) oe.getParts()[0]).intValue());
}
}
@Test
public void testUnsupportedVersion() throws IOException {
try {
final String ex = "/sp3/unsupported-version.sp3";
final Frame frame = FramesFactory.getITRF(IERSConventions.IERS_2003, true);
final SP3Parser parser = new SP3Parser(Constants.EIGEN5C_EARTH_MU, 3, s -> frame);
final InputStream inEntry = getClass().getResourceAsStream(ex);
parser.parse(inEntry);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.SP3_UNSUPPORTED_VERSION,
oe.getSpecifier());
Assert.assertEquals('z', ((Character) oe.getParts()[0]).charValue());
}
}
@Before
public void setUp() throws OrekitException {
Utils.setDataRoot("regular-data");
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.forces.maneuvers;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.models.earth;
import org.junit.Assert;
......
/*
* Licensed to the Hipparchus project under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.propagation.events;
import org.orekit.errors.OrekitException;
......
/*
* Licensed to the Hipparchus project under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.propagation.events;