/* 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.analytical;
import java.util.ArrayList;
import java.util.List;
import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.errors.OrekitException;
import org.orekit.frames.FramesFactory;
import org.orekit.orbits.KeplerianOrbit;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.BoundedPropagator;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.EcksteinHechlerPropagator;
import org.orekit.propagation.analytical.Ephemeris;
import org.orekit.propagation.events.EclipseDetector;
import org.orekit.propagation.events.handlers.EventHandler;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
import org.orekit.time.TimeComponents;
import org.orekit.time.TimeScalesFactory;
public class EphemerisEventsTest {
@Test
public void testEphemKeplerian() throws IllegalArgumentException, OrekitException {
checkEphem(OrbitType.KEPLERIAN);
}
@Test
public void testEphemCircular() throws IllegalArgumentException, OrekitException {
checkEphem(OrbitType.CIRCULAR);
}
@Test
public void testEphemEquinoctial() throws IllegalArgumentException, OrekitException {
checkEphem(OrbitType.EQUINOCTIAL);
}
@Test
public void testEphemCartesian() throws IllegalArgumentException, OrekitException {
checkEphem(OrbitType.CARTESIAN);
}
private Ephemeris buildEphem(OrbitType type)
throws IllegalArgumentException, OrekitException {
double mass = 2500;
double a = 7187990.1979844316;
double e = 0.5e-4;
double i = 1.7105407051081795;
double omega = 1.9674147913622104;
double OMEGA = FastMath.toRadians(261);
double lv = 0;
double mu = 3.9860047e14;
double ae = 6.378137e6;
double c20 = -1.08263e-3;
double c30 = 2.54e-6;
double c40 = 1.62e-6;
double c50 = 2.3e-7;
double c60 = -5.5e-7;
double deltaT = finalDate.durationFrom(initDate);
Orbit transPar = new KeplerianOrbit(a, e, i, omega, OMEGA, lv, PositionAngle.TRUE,
FramesFactory.getEME2000(), initDate, mu);
int nbIntervals = 720;
Propagator propagator =
new EcksteinHechlerPropagator(transPar, mass, ae, mu, c20, c30, c40, c50, c60);
List<SpacecraftState> tab = new ArrayList<SpacecraftState>(nbIntervals + 1);
for (int j = 0; j<= nbIntervals; j++) {
SpacecraftState state = propagator.propagate(initDate.shiftedBy((j * deltaT) / nbIntervals));
tab.add(new SpacecraftState(type.convertType(state.getOrbit()),
state.getAttitude(), state.getMass()));
}
return new Ephemeris(tab, 2);
}
private EclipseDetector buildEclipsDetector(final OrbitType type) throws OrekitException {
double sunRadius = 696000000.;
double earthRadius = 6400000.;
EclipseDetector ecl = new EclipseDetector(60., 1.e-3,
CelestialBodyFactory.getSun(), sunRadius,
CelestialBodyFactory.getEarth(), earthRadius).
withHandler(new EventHandler<EclipseDetector>() {
public Action eventOccurred(SpacecraftState s, EclipseDetector detector,
boolean increasing)
throws OrekitException {
Assert.assertEquals(type, s.getOrbit().getType());
if (increasing) {
++inEclipsecounter;
} else {
++outEclipsecounter;
}
return Action.CONTINUE;
}
});
return ecl;
}
private void checkEphem(OrbitType type)
throws IllegalArgumentException, OrekitException {
initDate = new AbsoluteDate(new DateComponents(2004, 01, 01),
TimeComponents.H00,
TimeScalesFactory.getUTC());
finalDate = new AbsoluteDate(new DateComponents(2004, 01, 02),
TimeComponents.H00,
TimeScalesFactory.getUTC());
BoundedPropagator ephem = buildEphem(type);
ephem.addEventDetector(buildEclipsDetector(type));
AbsoluteDate computeEnd = new AbsoluteDate(finalDate, -1000.0);
ephem.setSlaveMode();
SpacecraftState state = ephem.propagate(computeEnd);
Assert.assertEquals(computeEnd, state.getDate());
Assert.assertEquals(14, inEclipsecounter);
Assert.assertEquals(14, outEclipsecounter);
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
inEclipsecounter = 0;
outEclipsecounter = 0;
}
private AbsoluteDate initDate;
private AbsoluteDate finalDate;
private int inEclipsecounter;
private int outEclipsecounter;
}