1   /* Copyright 2002-2022 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.propagation.conversion;
18  
19  import org.hipparchus.util.FastMath;
20  import org.junit.Assert;
21  import org.junit.Before;
22  import org.junit.Test;
23  import org.orekit.Utils;
24  import org.orekit.forces.gravity.potential.GravityFieldFactory;
25  import org.orekit.forces.gravity.potential.TideSystem;
26  import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
27  import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider.UnnormalizedSphericalHarmonics;
28  import org.orekit.frames.Frame;
29  import org.orekit.frames.FramesFactory;
30  import org.orekit.orbits.KeplerianOrbit;
31  import org.orekit.orbits.Orbit;
32  import org.orekit.orbits.OrbitType;
33  import org.orekit.orbits.PositionAngle;
34  import org.orekit.propagation.analytical.BrouwerLyddanePropagator;
35  import org.orekit.time.AbsoluteDate;
36  import org.orekit.utils.ParameterDriver;
37  
38  public class BrouwerLyddanePropagatorBuilderTest {
39  
40      private Orbit orbit;
41      private UnnormalizedSphericalHarmonicsProvider provider;
42  
43      @Test
44      public void doTestBuildPropagator() {
45      	
46      	final double eps  = 2.0e-10;
47          
48      	// Define initial state and BrouwerLyddane Propagator
49      	AbsoluteDate initDate = AbsoluteDate.J2000_EPOCH.shiftedBy(583.);
50      	BrouwerLyddanePropagator propagator = new BrouwerLyddanePropagator(orbit, provider, BrouwerLyddanePropagator.M2);
51          // We propagate using directly the propagator of the set up
52          final Orbit orbitWithPropagator = propagator.propagate(initDate.shiftedBy(60000)).getOrbit();
53          
54          // Convert povider to normalized provider to be able to build a Brouwer Lyddane propagator
55          UnnormalizedSphericalHarmonics harmonics = provider.onDate(orbit.getDate());
56          
57          // We propagate using a build version of the propagator
58          // We shall have the same results than before
59          BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit,
60                                                                                        provider.getAe(),
61                                                                                        provider.getMu(),
62                                                                                        provider.getTideSystem(),
63                                                                                        harmonics.getUnnormalizedCnm(2, 0),
64                                                                                        harmonics.getUnnormalizedCnm(3, 0),
65                                                                                        harmonics.getUnnormalizedCnm(4, 0),
66                                                                                        harmonics.getUnnormalizedCnm(5, 0),
67                                                                                        OrbitType.KEPLERIAN,
68                                                                                        PositionAngle.TRUE,
69                                                                                        1.0,
70                                                                                        BrouwerLyddanePropagator.M2);
71          
72          final BrouwerLyddanePropagator prop = builder.buildPropagator(builder.getSelectedNormalizedParameters());
73          final Orbit orbitWithBuilder = prop.propagate(initDate.shiftedBy(60000)).getOrbit();
74          
75          // Verify
76          Assert.assertEquals(orbitWithPropagator.getA(),             orbitWithBuilder.getA(), 1.e-1);
77          Assert.assertEquals(orbitWithPropagator.getEquinoctialEx(), orbitWithBuilder.getEquinoctialEx(), eps);
78          Assert.assertEquals(orbitWithPropagator.getEquinoctialEy(), orbitWithBuilder.getEquinoctialEy(), eps);
79          Assert.assertEquals(orbitWithPropagator.getHx(),            orbitWithBuilder.getHx(), eps);
80          Assert.assertEquals(orbitWithPropagator.getHy(),            orbitWithBuilder.getHy(), eps);
81          Assert.assertEquals(orbitWithPropagator.getLM(),            orbitWithBuilder.getLM(), 8.0e-10);
82  
83      }
84  
85      @Test
86      public void doTestBuildPropagatorWithDrag() {
87  
88          // M2
89          final double M2 = 1.0e-15;
90  
91          // Convert provider to normalized provider to be able to build a Brouwer Lyddane propagator
92          UnnormalizedSphericalHarmonics harmonics = provider.onDate(orbit.getDate());
93          
94          // Initialize propagator builder
95          BrouwerLyddanePropagatorBuilder builder = new BrouwerLyddanePropagatorBuilder(orbit,
96                                                                                        provider.getAe(),
97                                                                                        provider.getMu(),
98                                                                                        provider.getTideSystem(),
99                                                                                        harmonics.getUnnormalizedCnm(2, 0),
100                                                                                       harmonics.getUnnormalizedCnm(3, 0),
101                                                                                       harmonics.getUnnormalizedCnm(4, 0),
102                                                                                       harmonics.getUnnormalizedCnm(5, 0),
103                                                                                       OrbitType.KEPLERIAN,
104                                                                                       PositionAngle.TRUE,
105                                                                                       1.0,
106                                                                                       M2);
107 
108         // Set the M2 parameter to selected
109         for (ParameterDriver driver : builder.getPropagationParametersDrivers().getDrivers()) {
110             if (BrouwerLyddanePropagator.M2_NAME.equals(driver.getName())) {
111                 driver.setSelected(true);
112             }
113         }
114         
115         // Build the propagator
116         final BrouwerLyddanePropagator prop = builder.buildPropagator(builder.getSelectedNormalizedParameters());
117 
118         // Verify
119         Assert.assertEquals(M2, prop.getM2(), Double.MIN_VALUE);
120         Assert.assertTrue(prop.getParametersDrivers().get(0).isSelected());
121 
122     }
123 
124     @Before
125     public void setUp() {
126         Utils.setDataRoot("regular-data");
127 
128         AbsoluteDate initDate = AbsoluteDate.J2000_EPOCH.shiftedBy(583.);
129         final Frame inertialFrame = FramesFactory.getEME2000();
130 
131         // Provider definition
132         double mu  = 3.9860047e14;
133         double ae  = 6.378137e6;
134         double[][] cnm = new double[][] {
135             { 0 }, { 0 }, { -1.08263e-3 }, { 2.54e-6 }, { 1.62e-6 }, { 2.3e-7 }
136            };
137         double[][] snm = new double[][] {
138             { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }
139            };
140         provider = GravityFieldFactory.getUnnormalizedProvider(ae, mu, TideSystem.UNKNOWN, cnm, snm);
141 
142         // Initial orbit
143         final double a = 24396159; // semi major axis in meters
144         final double e = 0.01; // eccentricity
145         final double i = FastMath.toRadians(47.); // inclination
146         final double omega = FastMath.toRadians(180); // perigee argument
147         final double raan = FastMath.toRadians(261); // right ascention of ascending node
148         final double lM = 0; // mean anomaly
149         orbit = new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.TRUE, inertialFrame, initDate, mu);
150     }
151 
152 }