TimeStampedFieldPVCoordinates.java

  1. /* Copyright 2002-2018 CS Systèmes d'Information
  2.  * Licensed to CS Systèmes d'Information (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.utils;

  18. import java.util.Collection;
  19. import java.util.stream.Stream;

  20. import org.hipparchus.RealFieldElement;
  21. import org.hipparchus.analysis.differentiation.FieldDerivativeStructure;
  22. import org.hipparchus.analysis.interpolation.FieldHermiteInterpolator;
  23. import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
  24. import org.orekit.errors.OrekitInternalError;
  25. import org.orekit.time.AbsoluteDate;
  26. import org.orekit.time.FieldAbsoluteDate;
  27. import org.orekit.time.TimeStamped;

  28. /** {@link TimeStamped time-stamped} version of {@link FieldPVCoordinates}.
  29.  * <p>Instances of this class are guaranteed to be immutable.</p>
  30.  * @param <T> the type of the field elements
  31.  * @author Luc Maisonobe
  32.  * @since 7.0
  33.  */
  34. public class TimeStampedFieldPVCoordinates<T extends RealFieldElement<T>>
  35.     extends FieldPVCoordinates<T> {

  36.     /** The date. */
  37.     private final FieldAbsoluteDate<T> date;

  38.     /** Builds a PVCoordinates pair.
  39.      * @param date coordinates date
  40.      * @param position the position vector (m)
  41.      * @param velocity the velocity vector (m/s)
  42.      * @param acceleration the acceleration vector (m/s²)
  43.      */
  44.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  45.                                          final FieldVector3D<T> position,
  46.                                          final FieldVector3D<T> velocity,
  47.                                          final FieldVector3D<T> acceleration) {
  48.         this(new FieldAbsoluteDate<>(position.getX().getField(), date),
  49.              position, velocity, acceleration);
  50.     }

  51.     /** Builds a PVCoordinates pair.
  52.      * @param date coordinates date
  53.      * @param position the position vector (m)
  54.      * @param velocity the velocity vector (m/s)
  55.      * @param acceleration the acceleration vector (m/s²)
  56.      */
  57.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  58.                                          final FieldVector3D<T> position,
  59.                                          final FieldVector3D<T> velocity,
  60.                                          final FieldVector3D<T> acceleration) {
  61.         super(position, velocity, acceleration);
  62.         this.date = date;
  63.     }

  64.     /** Basic constructor.
  65.      * <p>Build a PVCoordinates from another one at a given date</p>
  66.      * <p>The PVCoordinates built will be pv</p>
  67.      * @param date date of the built coordinates
  68.      * @param pv base (unscaled) PVCoordinates
  69.      */
  70.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date, final FieldPVCoordinates<T> pv) {
  71.         this(new FieldAbsoluteDate<>(pv.getPosition().getX().getField(), date), pv);
  72.     }

  73.     /** Basic constructor.
  74.      * <p>Build a PVCoordinates from another one at a given date</p>
  75.      * <p>The PVCoordinates built will be pv</p>
  76.      * @param date date of the built coordinates
  77.      * @param pv base (unscaled) PVCoordinates
  78.      */
  79.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date, final FieldPVCoordinates<T> pv) {
  80.         super(pv.getPosition(),
  81.               pv.getVelocity(),
  82.               pv.getAcceleration());
  83.         this.date = date;
  84.     }

  85.     /** Multiplicative constructor
  86.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  87.      * <p>The PVCoordinates built will be a * pv</p>
  88.      * @param date date of the built coordinates
  89.      * @param a scale factor
  90.      * @param pv base (unscaled) PVCoordinates
  91.      */
  92.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  93.                                          final double a, final FieldPVCoordinates<T> pv) {
  94.         this(new FieldAbsoluteDate<>(pv.getPosition().getX().getField(), date), a, pv);
  95.     }

  96.     /** Multiplicative constructor
  97.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  98.      * <p>The PVCoordinates built will be a * pv</p>
  99.      * @param date date of the built coordinates
  100.      * @param a scale factor
  101.      * @param pv base (unscaled) PVCoordinates
  102.      */
  103.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  104.                                          final double a, final FieldPVCoordinates<T> pv) {
  105.         super(new FieldVector3D<>(a, pv.getPosition()),
  106.               new FieldVector3D<>(a, pv.getVelocity()),
  107.               new FieldVector3D<>(a, pv.getAcceleration()));
  108.         this.date = date;
  109.     }

  110.     /** Multiplicative constructor
  111.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  112.      * <p>The PVCoordinates built will be a * pv</p>
  113.      * @param date date of the built coordinates
  114.      * @param a scale factor
  115.      * @param pv base (unscaled) PVCoordinates
  116.      */
  117.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  118.                                          final T a, final FieldPVCoordinates<T> pv) {
  119.         this(new FieldAbsoluteDate<>(a.getField(), date), a, pv);
  120.     }

  121.     /** Multiplicative constructor
  122.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  123.      * <p>The PVCoordinates built will be a * pv</p>
  124.      * @param date date of the built coordinates
  125.      * @param a scale factor
  126.      * @param pv base (unscaled) PVCoordinates
  127.      */
  128.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  129.                                          final T a, final FieldPVCoordinates<T> pv) {
  130.         super(new FieldVector3D<>(a, pv.getPosition()),
  131.               new FieldVector3D<>(a, pv.getVelocity()),
  132.               new FieldVector3D<>(a, pv.getAcceleration()));
  133.         this.date = date;
  134.     }

  135.     /** Multiplicative constructor
  136.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  137.      * <p>The PVCoordinates built will be a * pv</p>
  138.      * @param date date of the built coordinates
  139.      * @param a scale factor
  140.      * @param pv base (unscaled) PVCoordinates
  141.      */
  142.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  143.                                          final T a, final PVCoordinates pv) {
  144.         this(new FieldAbsoluteDate<>(a.getField(), date), a, pv);
  145.     }

  146.     /** Multiplicative constructor
  147.      * <p>Build a PVCoordinates from another one and a scale factor.</p>
  148.      * <p>The PVCoordinates built will be a * pv</p>
  149.      * @param date date of the built coordinates
  150.      * @param a scale factor
  151.      * @param pv base (unscaled) PVCoordinates
  152.      */
  153.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  154.                                          final T a, final PVCoordinates pv) {
  155.         super(new FieldVector3D<>(a, pv.getPosition()),
  156.               new FieldVector3D<>(a, pv.getVelocity()),
  157.               new FieldVector3D<>(a, pv.getAcceleration()));
  158.         this.date = date;
  159.     }

  160.     /** Subtractive constructor
  161.      * <p>Build a relative PVCoordinates from a start and an end position.</p>
  162.      * <p>The PVCoordinates built will be end - start.</p>
  163.      * @param date date of the built coordinates
  164.      * @param start Starting PVCoordinates
  165.      * @param end ending PVCoordinates
  166.      */
  167.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  168.                                          final FieldPVCoordinates<T> start, final FieldPVCoordinates<T> end) {
  169.         this(new FieldAbsoluteDate<>(start.getPosition().getX().getField(), date), start, end);
  170.     }

  171.     /** Subtractive constructor
  172.      * <p>Build a relative PVCoordinates from a start and an end position.</p>
  173.      * <p>The PVCoordinates built will be end - start.</p>
  174.      * @param date date of the built coordinates
  175.      * @param start Starting PVCoordinates
  176.      * @param end ending PVCoordinates
  177.      */
  178.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  179.                                          final FieldPVCoordinates<T> start, final FieldPVCoordinates<T> end) {
  180.         super(end.getPosition().subtract(start.getPosition()),
  181.               end.getVelocity().subtract(start.getVelocity()),
  182.               end.getAcceleration().subtract(start.getAcceleration()));
  183.         this.date = date;
  184.     }

  185.     /** Linear constructor
  186.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  187.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  188.      * @param date date of the built coordinates
  189.      * @param a1 first scale factor
  190.      * @param pv1 first base (unscaled) PVCoordinates
  191.      * @param a2 second scale factor
  192.      * @param pv2 second base (unscaled) PVCoordinates
  193.      */
  194.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  195.                                          final double a1, final FieldPVCoordinates<T> pv1,
  196.                                          final double a2, final FieldPVCoordinates<T> pv2) {
  197.         this(new FieldAbsoluteDate<>(pv1.getPosition().getX().getField(), date),
  198.              a1, pv1, a2, pv2);
  199.     }

  200.     /** Linear constructor
  201.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  202.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  203.      * @param date date of the built coordinates
  204.      * @param a1 first scale factor
  205.      * @param pv1 first base (unscaled) PVCoordinates
  206.      * @param a2 second scale factor
  207.      * @param pv2 second base (unscaled) PVCoordinates
  208.      */
  209.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  210.                                          final double a1, final FieldPVCoordinates<T> pv1,
  211.                                          final double a2, final FieldPVCoordinates<T> pv2) {
  212.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition()),
  213.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity()),
  214.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration()));
  215.         this.date = date;
  216.     }

  217.     /** Linear constructor
  218.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  219.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  220.      * @param date date of the built coordinates
  221.      * @param a1 first scale factor
  222.      * @param pv1 first base (unscaled) PVCoordinates
  223.      * @param a2 second scale factor
  224.      * @param pv2 second base (unscaled) PVCoordinates
  225.      */
  226.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  227.                                          final T a1, final FieldPVCoordinates<T> pv1,
  228.                                          final T a2, final FieldPVCoordinates<T> pv2) {
  229.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  230.              a1, pv1, a2, pv2);
  231.     }

  232.     /** Linear constructor
  233.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  234.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  235.      * @param date date of the built coordinates
  236.      * @param a1 first scale factor
  237.      * @param pv1 first base (unscaled) PVCoordinates
  238.      * @param a2 second scale factor
  239.      * @param pv2 second base (unscaled) PVCoordinates
  240.      */
  241.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  242.                                          final T a1, final FieldPVCoordinates<T> pv1,
  243.                                          final T a2, final FieldPVCoordinates<T> pv2) {
  244.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition()),
  245.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity()),
  246.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration()));
  247.         this.date = date;
  248.     }

  249.     /** Linear constructor
  250.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  251.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  252.      * @param date date of the built coordinates
  253.      * @param a1 first scale factor
  254.      * @param pv1 first base (unscaled) PVCoordinates
  255.      * @param a2 second scale factor
  256.      * @param pv2 second base (unscaled) PVCoordinates
  257.      */
  258.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  259.                                          final T a1, final PVCoordinates pv1,
  260.                                          final T a2, final PVCoordinates pv2) {
  261.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  262.              a1, pv1, a2, pv2);
  263.     }

  264.     /** Linear constructor
  265.      * <p>Build a PVCoordinates from two other ones and corresponding scale factors.</p>
  266.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2</p>
  267.      * @param date date of the built coordinates
  268.      * @param a1 first scale factor
  269.      * @param pv1 first base (unscaled) PVCoordinates
  270.      * @param a2 second scale factor
  271.      * @param pv2 second base (unscaled) PVCoordinates
  272.      */
  273.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  274.                                          final T a1, final PVCoordinates pv1,
  275.                                          final T a2, final PVCoordinates pv2) {
  276.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition()),
  277.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity()),
  278.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration()));
  279.         this.date = date;
  280.     }

  281.     /** Linear constructor
  282.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  283.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  284.      * @param date date of the built coordinates
  285.      * @param a1 first scale factor
  286.      * @param pv1 first base (unscaled) PVCoordinates
  287.      * @param a2 second scale factor
  288.      * @param pv2 second base (unscaled) PVCoordinates
  289.      * @param a3 third scale factor
  290.      * @param pv3 third base (unscaled) PVCoordinates
  291.      */
  292.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  293.                                          final double a1, final FieldPVCoordinates<T> pv1,
  294.                                          final double a2, final FieldPVCoordinates<T> pv2,
  295.                                          final double a3, final FieldPVCoordinates<T> pv3) {
  296.         this(new FieldAbsoluteDate<>(pv1.getPosition().getX().getField(), date),
  297.              a1, pv1, a2, pv2, a3, pv3);
  298.     }

  299.     /** Linear constructor
  300.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  301.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  302.      * @param date date of the built coordinates
  303.      * @param a1 first scale factor
  304.      * @param pv1 first base (unscaled) PVCoordinates
  305.      * @param a2 second scale factor
  306.      * @param pv2 second base (unscaled) PVCoordinates
  307.      * @param a3 third scale factor
  308.      * @param pv3 third base (unscaled) PVCoordinates
  309.      */
  310.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  311.                                          final double a1, final FieldPVCoordinates<T> pv1,
  312.                                          final double a2, final FieldPVCoordinates<T> pv2,
  313.                                          final double a3, final FieldPVCoordinates<T> pv3) {
  314.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),     a3, pv3.getPosition()),
  315.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),     a3, pv3.getVelocity()),
  316.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(), a3, pv3.getAcceleration()));
  317.         this.date = date;
  318.     }

  319.     /** Linear constructor
  320.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  321.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  322.      * @param date date of the built coordinates
  323.      * @param a1 first scale factor
  324.      * @param pv1 first base (unscaled) PVCoordinates
  325.      * @param a2 second scale factor
  326.      * @param pv2 second base (unscaled) PVCoordinates
  327.      * @param a3 third scale factor
  328.      * @param pv3 third base (unscaled) PVCoordinates
  329.      */
  330.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  331.                                          final T a1, final FieldPVCoordinates<T> pv1,
  332.                                          final T a2, final FieldPVCoordinates<T> pv2,
  333.                                          final T a3, final FieldPVCoordinates<T> pv3) {
  334.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  335.              a1, pv1, a2, pv2, a3, pv3);
  336.     }

  337.     /** Linear constructor
  338.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  339.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  340.      * @param date date of the built coordinates
  341.      * @param a1 first scale factor
  342.      * @param pv1 first base (unscaled) PVCoordinates
  343.      * @param a2 second scale factor
  344.      * @param pv2 second base (unscaled) PVCoordinates
  345.      * @param a3 third scale factor
  346.      * @param pv3 third base (unscaled) PVCoordinates
  347.      */
  348.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  349.                                          final T a1, final FieldPVCoordinates<T> pv1,
  350.                                          final T a2, final FieldPVCoordinates<T> pv2,
  351.                                          final T a3, final FieldPVCoordinates<T> pv3) {
  352.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),     a3, pv3.getPosition()),
  353.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),     a3, pv3.getVelocity()),
  354.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(), a3, pv3.getAcceleration()));
  355.         this.date = date;
  356.     }

  357.     /** Linear constructor
  358.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  359.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  360.      * @param date date of the built coordinates
  361.      * @param a1 first scale factor
  362.      * @param pv1 first base (unscaled) PVCoordinates
  363.      * @param a2 second scale factor
  364.      * @param pv2 second base (unscaled) PVCoordinates
  365.      * @param a3 third scale factor
  366.      * @param pv3 third base (unscaled) PVCoordinates
  367.      */
  368.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  369.                                          final T a1, final PVCoordinates pv1,
  370.                                          final T a2, final PVCoordinates pv2,
  371.                                          final T a3, final PVCoordinates pv3) {
  372.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  373.              a1, pv1, a2, pv2, a3, pv3);
  374.     }

  375.     /** Linear constructor
  376.      * <p>Build a PVCoordinates from three other ones and corresponding scale factors.</p>
  377.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3</p>
  378.      * @param date date of the built coordinates
  379.      * @param a1 first scale factor
  380.      * @param pv1 first base (unscaled) PVCoordinates
  381.      * @param a2 second scale factor
  382.      * @param pv2 second base (unscaled) PVCoordinates
  383.      * @param a3 third scale factor
  384.      * @param pv3 third base (unscaled) PVCoordinates
  385.      */
  386.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  387.                                          final T a1, final PVCoordinates pv1,
  388.                                          final T a2, final PVCoordinates pv2,
  389.                                          final T a3, final PVCoordinates pv3) {
  390.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),     a3, pv3.getPosition()),
  391.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),     a3, pv3.getVelocity()),
  392.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(), a3, pv3.getAcceleration()));
  393.         this.date = date;
  394.     }

  395.     /** Linear constructor
  396.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  397.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  398.      * @param date date of the built coordinates
  399.      * @param a1 first scale factor
  400.      * @param pv1 first base (unscaled) PVCoordinates
  401.      * @param a2 second scale factor
  402.      * @param pv2 second base (unscaled) PVCoordinates
  403.      * @param a3 third scale factor
  404.      * @param pv3 third base (unscaled) PVCoordinates
  405.      * @param a4 fourth scale factor
  406.      * @param pv4 fourth base (unscaled) PVCoordinates
  407.      */
  408.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  409.                                          final double a1, final FieldPVCoordinates<T> pv1,
  410.                                          final double a2, final FieldPVCoordinates<T> pv2,
  411.                                          final double a3, final FieldPVCoordinates<T> pv3,
  412.                                          final double a4, final FieldPVCoordinates<T> pv4) {
  413.         this(new FieldAbsoluteDate<>(pv1.getPosition().getX().getField(), date),
  414.              a1, pv1, a2, pv2, a3, pv3, a4, pv4);
  415.     }

  416.     /** Linear constructor
  417.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  418.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  419.      * @param date date of the built coordinates
  420.      * @param a1 first scale factor
  421.      * @param pv1 first base (unscaled) PVCoordinates
  422.      * @param a2 second scale factor
  423.      * @param pv2 second base (unscaled) PVCoordinates
  424.      * @param a3 third scale factor
  425.      * @param pv3 third base (unscaled) PVCoordinates
  426.      * @param a4 fourth scale factor
  427.      * @param pv4 fourth base (unscaled) PVCoordinates
  428.      */
  429.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  430.                                          final double a1, final FieldPVCoordinates<T> pv1,
  431.                                          final double a2, final FieldPVCoordinates<T> pv2,
  432.                                          final double a3, final FieldPVCoordinates<T> pv3,
  433.                                          final double a4, final FieldPVCoordinates<T> pv4) {
  434.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),
  435.                                   a3, pv3.getPosition(),     a4, pv4.getPosition()),
  436.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),
  437.                                   a3, pv3.getVelocity(),     a4, pv4.getVelocity()),
  438.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(),
  439.                                   a3, pv3.getAcceleration(), a4, pv4.getAcceleration()));
  440.         this.date = date;
  441.     }

  442.     /** Linear constructor
  443.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  444.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  445.      * @param date date of the built coordinates
  446.      * @param a1 first scale factor
  447.      * @param pv1 first base (unscaled) PVCoordinates
  448.      * @param a2 second scale factor
  449.      * @param pv2 second base (unscaled) PVCoordinates
  450.      * @param a3 third scale factor
  451.      * @param pv3 third base (unscaled) PVCoordinates
  452.      * @param a4 fourth scale factor
  453.      * @param pv4 fourth base (unscaled) PVCoordinates
  454.      */
  455.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  456.                                          final T a1, final FieldPVCoordinates<T> pv1,
  457.                                          final T a2, final FieldPVCoordinates<T> pv2,
  458.                                          final T a3, final FieldPVCoordinates<T> pv3,
  459.                                          final T a4, final FieldPVCoordinates<T> pv4) {
  460.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  461.              a1, pv1, a2, pv2, a3, pv3, a4, pv4);
  462.     }

  463.     /** Linear constructor
  464.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  465.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  466.      * @param date date of the built coordinates
  467.      * @param a1 first scale factor
  468.      * @param pv1 first base (unscaled) PVCoordinates
  469.      * @param a2 second scale factor
  470.      * @param pv2 second base (unscaled) PVCoordinates
  471.      * @param a3 third scale factor
  472.      * @param pv3 third base (unscaled) PVCoordinates
  473.      * @param a4 fourth scale factor
  474.      * @param pv4 fourth base (unscaled) PVCoordinates
  475.      */
  476.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  477.                                          final T a1, final FieldPVCoordinates<T> pv1,
  478.                                          final T a2, final FieldPVCoordinates<T> pv2,
  479.                                          final T a3, final FieldPVCoordinates<T> pv3,
  480.                                          final T a4, final FieldPVCoordinates<T> pv4) {
  481.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),
  482.                                   a3, pv3.getPosition(),     a4, pv4.getPosition()),
  483.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),
  484.                                   a3, pv3.getVelocity(),     a4, pv4.getVelocity()),
  485.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(),
  486.                                   a3, pv3.getAcceleration(), a4, pv4.getAcceleration()));
  487.         this.date = date;
  488.     }

  489.     /** Linear constructor
  490.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  491.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  492.      * @param date date of the built coordinates
  493.      * @param a1 first scale factor
  494.      * @param pv1 first base (unscaled) PVCoordinates
  495.      * @param a2 second scale factor
  496.      * @param pv2 second base (unscaled) PVCoordinates
  497.      * @param a3 third scale factor
  498.      * @param pv3 third base (unscaled) PVCoordinates
  499.      * @param a4 fourth scale factor
  500.      * @param pv4 fourth base (unscaled) PVCoordinates
  501.      */
  502.     public TimeStampedFieldPVCoordinates(final AbsoluteDate date,
  503.                                          final T a1, final PVCoordinates pv1,
  504.                                          final T a2, final PVCoordinates pv2,
  505.                                          final T a3, final PVCoordinates pv3,
  506.                                          final T a4, final PVCoordinates pv4) {
  507.         this(new FieldAbsoluteDate<>(a1.getField(), date),
  508.              a1, pv1, a2, pv2, a3, pv3, a4, pv4);
  509.     }

  510.     /** Linear constructor
  511.      * <p>Build a PVCoordinates from four other ones and corresponding scale factors.</p>
  512.      * <p>The PVCoordinates built will be a1 * u1 + a2 * u2 + a3 * u3 + a4 * u4</p>
  513.      * @param date date of the built coordinates
  514.      * @param a1 first scale factor
  515.      * @param pv1 first base (unscaled) PVCoordinates
  516.      * @param a2 second scale factor
  517.      * @param pv2 second base (unscaled) PVCoordinates
  518.      * @param a3 third scale factor
  519.      * @param pv3 third base (unscaled) PVCoordinates
  520.      * @param a4 fourth scale factor
  521.      * @param pv4 fourth base (unscaled) PVCoordinates
  522.      */
  523.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  524.                                          final T a1, final PVCoordinates pv1,
  525.                                          final T a2, final PVCoordinates pv2,
  526.                                          final T a3, final PVCoordinates pv3,
  527.                                          final T a4, final PVCoordinates pv4) {
  528.         super(new FieldVector3D<>(a1, pv1.getPosition(),     a2, pv2.getPosition(),
  529.                                   a3, pv3.getPosition(),     a4, pv4.getPosition()),
  530.               new FieldVector3D<>(a1, pv1.getVelocity(),     a2, pv2.getVelocity(),
  531.                                   a3, pv3.getVelocity(),     a4, pv4.getVelocity()),
  532.               new FieldVector3D<>(a1, pv1.getAcceleration(), a2, pv2.getAcceleration(),
  533.                                   a3, pv3.getAcceleration(), a4, pv4.getAcceleration()));
  534.         this.date = date;
  535.     }

  536.     /** Builds a TimeStampedFieldPVCoordinates triplet from  a {@link FieldVector3D}&lt;{@link FieldDerivativeStructure}&gt;.
  537.      * <p>
  538.      * The vector components must have time as their only derivation parameter and
  539.      * have consistent derivation orders.
  540.      * </p>
  541.      * @param date date of the built coordinates
  542.      * @param p vector with time-derivatives embedded within the coordinates
  543.      */
  544.     public TimeStampedFieldPVCoordinates(final FieldAbsoluteDate<T> date,
  545.                                          final FieldVector3D<FieldDerivativeStructure<T>> p) {
  546.         super(p);
  547.         this.date = date;
  548.     }

  549.     /** Get the date.
  550.      * @return date
  551.      */
  552.     public FieldAbsoluteDate<T> getDate() {
  553.         return date;
  554.     }

  555.     /** Get a time-shifted state.
  556.      * <p>
  557.      * The state can be slightly shifted to close dates. This shift is based on
  558.      * a simple linear model. It is <em>not</em> intended as a replacement for
  559.      * proper orbit propagation (it is not even Keplerian!) but should be sufficient
  560.      * for either small time shifts or coarse accuracy.
  561.      * </p>
  562.      * @param dt time shift in seconds
  563.      * @return a new state, shifted with respect to the instance (which is immutable)
  564.      */
  565.     public TimeStampedFieldPVCoordinates<T> shiftedBy(final double dt) {
  566.         final FieldPVCoordinates<T> spv = super.shiftedBy(dt);
  567.         return new TimeStampedFieldPVCoordinates<>(date.shiftedBy(dt),
  568.                                                    spv.getPosition(), spv.getVelocity(), spv.getAcceleration());
  569.     }

  570.     /** Get a time-shifted state.
  571.      * <p>
  572.      * The state can be slightly shifted to close dates. This shift is based on
  573.      * a simple linear model. It is <em>not</em> intended as a replacement for
  574.      * proper orbit propagation (it is not even Keplerian!) but should be sufficient
  575.      * for either small time shifts or coarse accuracy.
  576.      * </p>
  577.      * @param dt time shift in seconds
  578.      * @return a new state, shifted with respect to the instance (which is immutable)
  579.      */
  580.     public TimeStampedFieldPVCoordinates<T> shiftedBy(final T dt) {
  581.         final FieldPVCoordinates<T> spv = super.shiftedBy(dt);
  582.         return new TimeStampedFieldPVCoordinates<>(date.shiftedBy(dt.getReal()),
  583.                                                    spv.getPosition(), spv.getVelocity(), spv.getAcceleration());
  584.     }

  585.     /** Interpolate position-velocity.
  586.      * <p>
  587.      * The interpolated instance is created by polynomial Hermite interpolation
  588.      * ensuring velocity remains the exact derivative of position.
  589.      * </p>
  590.      * <p>
  591.      * Note that even if first time derivatives (velocities)
  592.      * from sample can be ignored, the interpolated instance always includes
  593.      * interpolated derivatives. This feature can be used explicitly to
  594.      * compute these derivatives when it would be too complex to compute them
  595.      * from an analytical formula: just compute a few sample points from the
  596.      * explicit formula and set the derivatives to zero in these sample points,
  597.      * then use interpolation to add derivatives consistent with the positions.
  598.      * </p>
  599.      * @param date interpolation date
  600.      * @param filter filter for derivatives from the sample to use in interpolation
  601.      * @param sample sample points on which interpolation should be done
  602.      * @param <T> the type of the field elements
  603.      * @return a new position-velocity, interpolated at specified date
  604.      */
  605.     public static <T extends RealFieldElement<T>>
  606.         TimeStampedFieldPVCoordinates<T> interpolate(final FieldAbsoluteDate<T> date,
  607.                                                      final CartesianDerivativesFilter filter,
  608.                                                      final Collection<TimeStampedFieldPVCoordinates<T>> sample) {
  609.         return interpolate(date, filter, sample.stream());
  610.     }

  611.     /** Interpolate position-velocity.
  612.      * <p>
  613.      * The interpolated instance is created by polynomial Hermite interpolation
  614.      * ensuring velocity remains the exact derivative of position.
  615.      * </p>
  616.      * <p>
  617.      * Note that even if first time derivatives (velocities)
  618.      * from sample can be ignored, the interpolated instance always includes
  619.      * interpolated derivatives. This feature can be used explicitly to
  620.      * compute these derivatives when it would be too complex to compute them
  621.      * from an analytical formula: just compute a few sample points from the
  622.      * explicit formula and set the derivatives to zero in these sample points,
  623.      * then use interpolation to add derivatives consistent with the positions.
  624.      * </p>
  625.      * @param date interpolation date
  626.      * @param filter filter for derivatives from the sample to use in interpolation
  627.      * @param sample sample points on which interpolation should be done
  628.      * @param <T> the type of the field elements
  629.      * @return a new position-velocity, interpolated at specified date
  630.      */
  631.     public static <T extends RealFieldElement<T>>
  632.         TimeStampedFieldPVCoordinates<T> interpolate(final FieldAbsoluteDate<T> date,
  633.                                                      final CartesianDerivativesFilter filter,
  634.                                                      final Stream<TimeStampedFieldPVCoordinates<T>> sample) {

  635.         // set up an interpolator taking derivatives into account
  636.         final FieldHermiteInterpolator<T> interpolator = new FieldHermiteInterpolator<>();

  637.         // add sample points
  638.         switch (filter) {
  639.             case USE_P :
  640.                 // populate sample with position data, ignoring velocity
  641.                 sample.forEach(pv -> {
  642.                     final FieldVector3D<T> position = pv.getPosition();
  643.                     interpolator.addSamplePoint(pv.getDate().durationFrom(date),
  644.                                                 position.toArray());
  645.                 });
  646.                 break;
  647.             case USE_PV :
  648.                 // populate sample with position and velocity data
  649.                 sample.forEach(pv -> {
  650.                     final FieldVector3D<T> position = pv.getPosition();
  651.                     final FieldVector3D<T> velocity = pv.getVelocity();
  652.                     interpolator.addSamplePoint(pv.getDate().durationFrom(date),
  653.                                                 position.toArray(), velocity.toArray());
  654.                 });
  655.                 break;
  656.             case USE_PVA :
  657.                 // populate sample with position, velocity and acceleration data
  658.                 sample.forEach(pv -> {
  659.                     final FieldVector3D<T> position     = pv.getPosition();
  660.                     final FieldVector3D<T> velocity     = pv.getVelocity();
  661.                     final FieldVector3D<T> acceleration = pv.getAcceleration();
  662.                     interpolator.addSamplePoint(pv.getDate().durationFrom(date),
  663.                                                 position.toArray(), velocity.toArray(), acceleration.toArray());
  664.                 });
  665.                 break;
  666.             default :
  667.                 // this should never happen
  668.                 throw new OrekitInternalError(null);
  669.         }

  670.         // interpolate
  671.         final T[][] p = interpolator.derivatives(date.getField().getZero(), 2);

  672.         // build a new interpolated instance

  673.         return new TimeStampedFieldPVCoordinates<>(date,
  674.                                                    new FieldVector3D<>(p[0]),
  675.                                                    new FieldVector3D<>(p[1]),
  676.                                                    new FieldVector3D<>(p[2]));

  677.     }

  678.     /** Convert to a constant position-velocity.
  679.      * @return a constant position-velocity
  680.      * @since 9.0
  681.      */
  682.     public TimeStampedPVCoordinates toTimeStampedPVCoordinates() {
  683.         return new TimeStampedPVCoordinates(date.toAbsoluteDate(),
  684.                                             getPosition().toVector3D(),
  685.                                             getVelocity().toVector3D(),
  686.                                             getAcceleration().toVector3D());
  687.     }

  688.     /** Return a string representation of this position/velocity pair.
  689.      * @return string representation of this position/velocity pair
  690.      */
  691.     public String toString() {
  692.         final String comma = ", ";
  693.         return new StringBuffer().append('{').append(date).append(", P(").
  694.                                   append(getPosition().getX().getReal()).append(comma).
  695.                                   append(getPosition().getY().getReal()).append(comma).
  696.                                   append(getPosition().getZ().getReal()).append("), V(").
  697.                                   append(getVelocity().getX().getReal()).append(comma).
  698.                                   append(getVelocity().getY().getReal()).append(comma).
  699.                                   append(getVelocity().getZ().getReal()).append("), A(").
  700.                                   append(getAcceleration().getX().getReal()).append(comma).
  701.                                   append(getAcceleration().getY().getReal()).append(comma).
  702.                                   append(getAcceleration().getZ().getReal()).append(")}").toString();
  703.     }

  704. }