1 /* Copyright 2002-2024 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.forces.drag; 18 19 import java.util.List; 20 21 import org.hipparchus.CalculusFieldElement; 22 import org.hipparchus.geometry.euclidean.threed.FieldVector3D; 23 import org.hipparchus.geometry.euclidean.threed.Vector3D; 24 import org.orekit.propagation.FieldSpacecraftState; 25 import org.orekit.propagation.SpacecraftState; 26 import org.orekit.utils.ParameterDriver; 27 28 /** Interface for spacecraft that are sensitive to atmospheric drag forces. 29 * 30 * @see DragForce 31 * @author Luc Maisonobe 32 * @author Pascal Parraud 33 */ 34 public interface DragSensitive { 35 36 /** Parameter name for global multiplicative factor. 37 * @since 12.0 38 */ 39 String GLOBAL_DRAG_FACTOR = "global drag factor"; 40 41 /** Parameter name for drag coefficient. */ 42 String DRAG_COEFFICIENT = "drag coefficient"; 43 44 /** Parameter name for lift ration enabling Jacobian processing. 45 * <p> 46 * The lift ratio is the proportion of atmosphere modecules that will 47 * experience specular reflection when hitting spacecraft instead 48 * of experiencing diffuse reflection. The ratio is between 0 and 1, 49 * 0 meaning there are no specular reflection, only diffuse reflection, 50 * and hence no lift effect. 51 * </p> 52 * @since 9.0 53 */ 54 String LIFT_RATIO = "lift ratio"; 55 56 /** Check if model depends on attitude's rotation rate or acceleration at a given, fixed date. 57 * If false, it essentially means that at most the attitude's rotation is used when computing the acceleration vector. 58 * The default implementation returns false as common models for orbital mechanics do not. 59 * @return true if force model depends on attitude derivatives 60 * @since 12.1 61 */ 62 default boolean dependsOnAttitudeRate() { 63 return false; 64 } 65 66 /** Get the drivers for supported parameters. 67 * @return parameters drivers 68 * @since 8.0 69 */ 70 List<ParameterDriver> getDragParametersDrivers(); 71 72 /** Compute the acceleration due to drag. 73 * <p> 74 * The computation includes all spacecraft specific characteristics 75 * like shape, area and coefficients. 76 * </p> 77 * @param state current state 78 * @param density atmospheric density at spacecraft position 79 * @param relativeVelocity relative velocity of atmosphere with respect to spacecraft, 80 * in the same inertial frame as spacecraft orbit (m/s) 81 * @param parameters values of the force model parameters 82 * @return spacecraft acceleration in the same inertial frame as spacecraft orbit (m/s²) 83 * @since 12.0 84 */ 85 Vector3D dragAcceleration(SpacecraftState state, 86 double density, Vector3D relativeVelocity, 87 double[] parameters); 88 89 /** Compute the acceleration due to drag. 90 * <p> 91 * The computation includes all spacecraft specific characteristics 92 * like shape, area and coefficients. 93 * </p> 94 * @param state current state 95 * @param density atmospheric density at spacecraft position 96 * @param relativeVelocity relative velocity of atmosphere with respect to spacecraft, 97 * in the same inertial frame as spacecraft orbit (m/s) 98 * @param parameters values of the force model parameters 99 * @param <T> instance of a CalculusFieldElement 100 * @return spacecraft acceleration in the same inertial frame as spacecraft orbit (m/s²) 101 * @since 12.0 102 */ 103 <T extends CalculusFieldElement<T>> FieldVector3D<T> dragAcceleration(FieldSpacecraftState<T> state, 104 T density, FieldVector3D<T> relativeVelocity, 105 T[] parameters); 106 }