/* Copyright 2002-2017 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.propagation.events;
import org.hipparchus.Field;
import org.hipparchus.RealFieldElement;
import org.hipparchus.util.Decimal64Field;
import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.orbits.FieldKeplerianOrbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.FieldBoundedPropagator;
import org.orekit.propagation.FieldSpacecraftState;
import org.orekit.propagation.analytical.FieldKeplerianPropagator;
import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
import org.orekit.time.FieldAbsoluteDate;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.Constants;
public class FieldNodeDetectorTest {
@Test
public void testIssue138() throws OrekitException{
doTestIssue138(Decimal64Field.getInstance());
}
@Test
public void testIssue158() throws OrekitException{
doTestIssue158(Decimal64Field.getInstance());
}
private <T extends RealFieldElement<T>>void doTestIssue138(Field<T> field) throws OrekitException {
T zero = field.getZero();
T a = zero.add(800000 + Constants.WGS84_EARTH_EQUATORIAL_RADIUS);
T e = zero.add(0.0001);
T i = zero.add(FastMath.toRadians(98));
T w = zero.add(-90);
T raan = zero;
T v = zero;
Frame inertialFrame = FramesFactory.getEME2000();
FieldAbsoluteDate<T> initialDate = new FieldAbsoluteDate<T>(field, 2014, 01, 01, 0, 0, 0, TimeScalesFactory.getUTC());
FieldAbsoluteDate<T> finalDate = initialDate.shiftedBy(5000);
FieldKeplerianOrbit<T> initialOrbit = new FieldKeplerianOrbit<T>(a, e, i, w, raan, v, PositionAngle.TRUE, inertialFrame, initialDate, Constants.WGS84_EARTH_MU);
FieldSpacecraftState<T> initialState = new FieldSpacecraftState<T>(initialOrbit, zero.add(1000));
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(initialOrbit);
// propagator..setInitialState(initialState);
// Define 2 instances of NodeDetector:
FieldEventDetector<T> rawDetector =
new FieldNodeDetector<T>(zero.add(1e-6),initialState.getOrbit(), initialState.getFrame()).
withHandler(new FieldContinueOnEvent<FieldNodeDetector<T>,T>());
FieldEventsLogger<T> logger1 = new FieldEventsLogger<T>();
FieldEventDetector<T> node1 = logger1.monitorDetector(rawDetector);
FieldEventsLogger<T> logger2 = new FieldEventsLogger<T>();
FieldEventDetector<T> node2 = logger2.monitorDetector(rawDetector);
propagator.addEventDetector(node1);
propagator.addEventDetector(node2);
// First propagation
propagator.setEphemerisMode();
propagator.propagate(finalDate);
Assert.assertEquals(2, logger1.getLoggedEvents().size());
Assert.assertEquals(2, logger2.getLoggedEvents().size());
logger1.clearLoggedEvents();
logger2.clearLoggedEvents();
FieldBoundedPropagator<T> postpro = propagator.getGeneratedEphemeris();
// Post-processing
postpro.addEventDetector(node1);
postpro.addEventDetector(node2);
postpro.propagate(finalDate);
Assert.assertEquals(2, logger1.getLoggedEvents().size());
Assert.assertEquals(2, logger2.getLoggedEvents().size());
}
private <T extends RealFieldElement<T>>void doTestIssue158(Field<T> field) throws OrekitException {
T zero = field.getZero();
FieldAbsoluteDate<T> date = new FieldAbsoluteDate<T>(field);
T a = zero.add(3.0e7);
T e1 = zero.add( 0.8);
T e2 = zero.add( 1.0e-4);
T i = zero.add(1.0);
T pa = zero.add(1.5 * FastMath.PI);
T raan = zero.add(5.0);
T m = zero.add(0);
Frame frame = FramesFactory.getEME2000();
double mu = Constants.EIGEN5C_EARTH_MU;
// highly eccentric, inclined orbit
final FieldKeplerianOrbit<T> orbit1 =
new FieldKeplerianOrbit<T>(a, e1, i, pa, raan, m, PositionAngle.MEAN, frame, date, mu);
FieldEventDetector<T> detector1 = new FieldNodeDetector<T>(orbit1, orbit1.getFrame());
T t1 = orbit1.getKeplerianPeriod();
Assert.assertEquals(t1.getReal() / 28.82, detector1.getMaxCheckInterval().getReal(), t1.getReal() / 10000);
// nearly circular, inclined orbit
final FieldKeplerianOrbit<T> orbit2 =
new FieldKeplerianOrbit<T>(a, e2, i, pa, raan, m, PositionAngle.MEAN, frame, date, mu);
FieldEventDetector<T> detector2 = new FieldNodeDetector<T>(orbit2, orbit2.getFrame());
T t2 = orbit2.getKeplerianPeriod();
Assert.assertEquals(t1.getReal(), t2.getReal(), t1.getReal() / 10000);
Assert.assertEquals(t2.getReal() / 3, detector2.getMaxCheckInterval().getReal(), t2.getReal() / 10000);
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
}
}