ShootingIntegrationSettingsFactory.java

  1. /* Copyright 2022-2025 Romain Serra
  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.control.indirect.shooting.propagation;

  18. import org.hipparchus.CalculusFieldElement;
  19. import org.hipparchus.Field;
  20. import org.orekit.propagation.ToleranceProvider;
  21. import org.orekit.propagation.conversion.ClassicalRungeKuttaFieldIntegratorBuilder;
  22. import org.orekit.propagation.conversion.DormandPrince54FieldIntegratorBuilder;
  23. import org.orekit.propagation.conversion.DormandPrince853FieldIntegratorBuilder;
  24. import org.orekit.propagation.conversion.FieldExplicitRungeKuttaIntegratorBuilder;
  25. import org.orekit.propagation.conversion.LutherFieldIntegratorBuilder;
  26. import org.orekit.propagation.conversion.MidpointFieldIntegratorBuilder;

  27. /**
  28.  * Factory for some common schemes.
  29.  *
  30.  * @author Romain Serra
  31.  * @since 13.0
  32.  * @see ShootingPropagationSettings
  33.  */
  34. public class ShootingIntegrationSettingsFactory {

  35.     /**
  36.      * Private constructor.
  37.      */
  38.     private ShootingIntegrationSettingsFactory() {
  39.         // factory class
  40.     }

  41.     /**
  42.      * Returns shooting integration settings according to the midpoint Runge Kutta scheme.
  43.      * @param step default step-size
  44.      * @return integration settings
  45.      */
  46.     public static ShootingIntegrationSettings getMidpointIntegratorSettings(final double step) {
  47.         return new ShootingIntegrationSettings() {
  48.             @Override
  49.             public <T extends CalculusFieldElement<T>> FieldExplicitRungeKuttaIntegratorBuilder<T> getFieldIntegratorBuilder(final Field<T> field) {
  50.                 return new MidpointFieldIntegratorBuilder<>(field.getZero().newInstance(step));
  51.             }
  52.         };
  53.     }

  54.     /**
  55.      * Returns shooting integration settings according to the classical Runge Kutta scheme.
  56.      * @param step default step-size
  57.      * @return integration settings
  58.      */
  59.     public static ShootingIntegrationSettings getClassicalRungeKuttaIntegratorSettings(final double step) {
  60.         return new ShootingIntegrationSettings() {
  61.             @Override
  62.             public <T extends CalculusFieldElement<T>> FieldExplicitRungeKuttaIntegratorBuilder<T> getFieldIntegratorBuilder(final Field<T> field) {
  63.                 return new ClassicalRungeKuttaFieldIntegratorBuilder<>(field.getZero().newInstance(step));
  64.             }
  65.         };
  66.     }

  67.     /**
  68.      * Returns shooting integration settings according to the Luther Runge Kutta scheme.
  69.      * @param step default step-size
  70.      * @return integration settings
  71.      */
  72.     public static ShootingIntegrationSettings getLutherIntegratorSettings(final double step) {
  73.         return new ShootingIntegrationSettings() {
  74.             @Override
  75.             public <T extends CalculusFieldElement<T>> FieldExplicitRungeKuttaIntegratorBuilder<T> getFieldIntegratorBuilder(final Field<T> field) {
  76.                 return new LutherFieldIntegratorBuilder<>(field.getZero().newInstance(step));
  77.             }
  78.         };
  79.     }

  80.     /**
  81.      * Returns shooting integration settings according to the Dormand Prince 5(4) scheme.
  82.      * @param minStep minimum step-size
  83.      * @param maxStep maximum step-size
  84.      * @param toleranceProvider tolerance provider
  85.      * @return integration settings
  86.      */
  87.     public static ShootingIntegrationSettings getDormandPrince54IntegratorSettings(final double minStep,
  88.                                                                                    final double maxStep,
  89.                                                                                    final ToleranceProvider toleranceProvider) {
  90.         return new ShootingIntegrationSettings() {
  91.             @Override
  92.             public <T extends CalculusFieldElement<T>> FieldExplicitRungeKuttaIntegratorBuilder<T> getFieldIntegratorBuilder(final Field<T> field) {
  93.                 return new DormandPrince54FieldIntegratorBuilder<>(minStep, maxStep, toleranceProvider);
  94.             }
  95.         };
  96.     }

  97.     /**
  98.      * Returns shooting integration settings according to the Dormand Prince 8(53) scheme.
  99.      * @param minStep minimum step-size
  100.      * @param maxStep maximum step-size
  101.      * @param toleranceProvider tolerance provider
  102.      * @return integration settings
  103.      */
  104.     public static ShootingIntegrationSettings getDormandPrince853IntegratorSettings(final double minStep,
  105.                                                                                     final double maxStep,
  106.                                                                                     final ToleranceProvider toleranceProvider) {
  107.         return new ShootingIntegrationSettings() {
  108.             @Override
  109.             public <T extends CalculusFieldElement<T>> FieldExplicitRungeKuttaIntegratorBuilder<T> getFieldIntegratorBuilder(final Field<T> field) {
  110.                 return new DormandPrince853FieldIntegratorBuilder<>(minStep, maxStep, toleranceProvider);
  111.             }
  112.         };
  113.     }
  114. }