1   /* Copyright 2022-2025 Luc Maisonobe
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  
18  package org.orekit.utils;
19  
20  import org.hipparchus.CalculusFieldElement;
21  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22  import org.orekit.frames.Frame;
23  import org.orekit.time.FieldAbsoluteDate;
24  
25  /** Provider using simple {@link FieldPVCoordinates#shiftedBy(CalculusFieldElement)} shiftedBy} and frame transforms for evolution.
26   * @param <T> the type of the field elements
27   * @author Luc Maisonobe
28   * @since 12.1
29   */
30  public class FieldShiftingPVCoordinatesProvider<T extends CalculusFieldElement<T>>
31      implements FieldPVCoordinatesProvider<T> {
32  
33      /** Reference coordinates. */
34      private final TimeStampedFieldPVCoordinates<T> referencePV;
35  
36      /** Frame in which {@link #referencePV} is defined. */
37      private final Frame referenceFrame;
38  
39      /** Simple constructor.
40       * @param referencePV reference coordinates
41       * @param referenceFrame frame in which {@code reference} is defined
42       */
43      public FieldShiftingPVCoordinatesProvider(final TimeStampedFieldPVCoordinates<T> referencePV,
44                                                final Frame referenceFrame) {
45          this.referencePV    = referencePV;
46          this.referenceFrame = referenceFrame;
47      }
48  
49      /** {@inheritDoc} */
50      @Override
51      public TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
52                                                               final Frame frame) {
53          final TimeStampedFieldPVCoordinates<T> shifted = referencePV.shiftedBy(date.durationFrom(referencePV));
54          return referenceFrame.getTransformTo(frame, date).transformPVCoordinates(shifted);
55      }
56  
57      @Override
58      public FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date, final Frame frame) {
59          final T duration = date.durationFrom(referencePV);
60          final FieldVector3D<T> position = referencePV.getPosition().add((referencePV.getVelocity().add(referencePV.getAcceleration().scalarMultiply(duration.divide(2)))).scalarMultiply(duration));
61          return referenceFrame.getStaticTransformTo(frame, date).transformPosition(position);
62      }
63  }