DSSTJ2SquaredClosedForm.java

  1. /* Copyright 2022 Bryan Cazabonne
  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.  * Bryan Cazabonne 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.semianalytical.dsst.forces;

  18. import java.util.Collections;
  19. import java.util.List;

  20. import org.hipparchus.CalculusFieldElement;
  21. import org.hipparchus.Field;
  22. import org.hipparchus.util.MathArrays;
  23. import org.orekit.attitudes.AttitudeProvider;
  24. import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
  25. import org.orekit.propagation.FieldSpacecraftState;
  26. import org.orekit.propagation.PropagationType;
  27. import org.orekit.propagation.SpacecraftState;
  28. import org.orekit.propagation.semianalytical.dsst.utilities.AuxiliaryElements;
  29. import org.orekit.propagation.semianalytical.dsst.utilities.FieldAuxiliaryElements;
  30. import org.orekit.utils.ParameterDriver;

  31. /**
  32.  * Second order J2-squared force model.
  33.  * <p>
  34.  * The force model implements a closed-form of the J2-squared perturbation.
  35.  * The full realization of the model is based on a gaussian quadrature.
  36.  * Even if it is very accurate, a gaussian quadrature is usually time consuming.
  37.  * A closed-form is less accurate than a gaussian quadrature, but faster.
  38.  * </p>
  39.  * @author Bryan Cazabonne
  40.  * @since 12.0
  41.  */
  42. public class DSSTJ2SquaredClosedForm implements DSSTForceModel {

  43.     /** Model for second order terms. */
  44.     private final J2SquaredModel j2SquaredModel;

  45.     /** Gravity field to use. */
  46.     private final UnnormalizedSphericalHarmonicsProvider provider;

  47.     /**
  48.      * Constructor.
  49.      *
  50.      * @param j2SquaredModel model for second order terms
  51.      * @param provider       gravity field to use
  52.      */
  53.     public DSSTJ2SquaredClosedForm(final J2SquaredModel j2SquaredModel,
  54.                                    final UnnormalizedSphericalHarmonicsProvider provider) {
  55.         // Initialize fields
  56.         this.j2SquaredModel = j2SquaredModel;
  57.         this.provider = provider;
  58.     }

  59.     /** {@inheritDoc}. */
  60.     @Override
  61.     public double[] getMeanElementRate(final SpacecraftState state,
  62.                                        final AuxiliaryElements auxiliaryElements,
  63.                                        final double[] parameters) {

  64.         // Context
  65.         final DSSTJ2SquaredClosedFormContext context = new DSSTJ2SquaredClosedFormContext(auxiliaryElements, provider);

  66.         // Second-order terms
  67.         final double[] delta = j2SquaredModel.computeMeanEquinoctialSecondOrderTerms(context);

  68.         // J2
  69.         final double J2 = -provider.onDate(state.getDate()).getUnnormalizedCnm(2, 0);
  70.         final double J2SquaredOver2 = 0.5 * J2 * J2;

  71.         // Mean elements rate
  72.         final double da = 0.0;
  73.         final double dk = J2SquaredOver2 * delta[1];
  74.         final double dh = J2SquaredOver2 * delta[2];
  75.         final double dq = J2SquaredOver2 * delta[3];
  76.         final double dp = J2SquaredOver2 * delta[4];
  77.         final double dM = J2SquaredOver2 * delta[5];

  78.         // Return
  79.         return new double[] { da, dk, dh, dq, dp, dM };

  80.     }

  81.     /** {@inheritDoc}. */
  82.     @Override
  83.     public <T extends CalculusFieldElement<T>> T[] getMeanElementRate(final FieldSpacecraftState<T> state,
  84.                                                                       final FieldAuxiliaryElements<T> auxiliaryElements,
  85.                                                                       final T[] parameters) {

  86.         // Field
  87.         final Field<T> field = state.getDate().getField();

  88.         // Context
  89.         final FieldDSSTJ2SquaredClosedFormContext<T> context = new FieldDSSTJ2SquaredClosedFormContext<>(auxiliaryElements, provider);

  90.         // Second-order terms
  91.         final T[] delta = j2SquaredModel.computeMeanEquinoctialSecondOrderTerms(context);

  92.         // J2
  93.         final double J2 = -provider.onDate(state.getDate().toAbsoluteDate()).getUnnormalizedCnm(2, 0);
  94.         final double J2SquaredOver2 = 0.5 * J2 * J2;

  95.         // Mean elements rate
  96.         final T da = field.getZero();
  97.         final T dk = delta[1].multiply(J2SquaredOver2);
  98.         final T dh = delta[2].multiply(J2SquaredOver2);
  99.         final T dq = delta[3].multiply(J2SquaredOver2);
  100.         final T dp = delta[4].multiply(J2SquaredOver2);
  101.         final T dM = delta[5].multiply(J2SquaredOver2);

  102.         // Return
  103.         final T[] elements =  MathArrays.buildArray(field, 6);
  104.         elements[0] = da;
  105.         elements[1] = dk;
  106.         elements[2] = dh;
  107.         elements[3] = dq;
  108.         elements[4] = dp;
  109.         elements[5] = dM;

  110.         return elements;

  111.     }

  112.     /** {@inheritDoc}. */
  113.     @Override
  114.     public List<ShortPeriodTerms> initializeShortPeriodTerms(final AuxiliaryElements auxiliaryElements,
  115.                                                              final PropagationType type,
  116.                                                              final double[] parameters) {
  117.         // Currently, there is no short periods for J2-squared closed-form
  118.         return Collections.emptyList();
  119.     }

  120.     /** {@inheritDoc}. */
  121.     @Override
  122.     public <T extends CalculusFieldElement<T>> List<FieldShortPeriodTerms<T>> initializeShortPeriodTerms(final FieldAuxiliaryElements<T> auxiliaryElements,
  123.                                                                                                          final PropagationType type,
  124.                                                                                                          final T[] parameters) {
  125.         // Currently, there is no short periods for J2-squared closed-form
  126.         return Collections.emptyList();
  127.     }

  128.     /** {@inheritDoc}. */
  129.     @Override
  130.     public List<ParameterDriver> getParametersDrivers() {
  131.         return Collections.emptyList();
  132.     }

  133.     /** {@inheritDoc}. */
  134.     @Override
  135.     public void registerAttitudeProvider(final AttitudeProvider attitudeProvider) {
  136.         // Nothing is done since this contribution is not sensitive to attitude
  137.     }

  138.     /** {@inheritDoc}. */
  139.     @Override
  140.     public void updateShortPeriodTerms(final double[] parameters, final SpacecraftState... meanStates) {
  141.         // Currently, there is no short periods for J2-squared closed-form
  142.     }

  143.     /** {@inheritDoc}. */
  144.     @Override
  145.     @SuppressWarnings("unchecked")
  146.     public <T extends CalculusFieldElement<T>> void updateShortPeriodTerms(final T[] parameters, final FieldSpacecraftState<T>... meanStates) {
  147.         // Currently, there is no short periods for J2-squared closed-form
  148.     }

  149. }