1   /* Copyright 2022-2025 Thales Alenia Space
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.estimation.measurements;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.orekit.time.FieldAbsoluteDate;
21  import org.orekit.time.FieldClockOffset;
22  
23  /** Quadratic clock model.
24   *
25   * @param <T> type of the field elements
26   * @author Luc Maisonobe
27   * @since 12.1
28   *
29   */
30  public class QuadraticFieldClockModel<T extends CalculusFieldElement<T>> {
31  
32      /** Clock model reference date. */
33      private final FieldAbsoluteDate<T> referenceDate;
34  
35      /** Constant term. */
36      private final T a0;
37  
38      /** Linear term. */
39      private final T a1;
40  
41      /** Quadratic term. */
42      private final T a2;
43  
44      /** Simple constructor.
45       * @param referenceDate reference date
46       * @param a0 constant term
47       * @param a1 linear term
48       * @param a2 quadratic term
49       */
50      public QuadraticFieldClockModel(final FieldAbsoluteDate<T> referenceDate,
51                                      final T a0, final T a1, final T a2) {
52          this.referenceDate = referenceDate;
53          this.a0            = a0;
54          this.a1            = a1;
55          this.a2            = a2;
56      }
57  
58      /** Get the clock offset at date.
59       * @param date date at which offset is requested
60       * @return clock offset at specified date
61       */
62      public FieldClockOffset<T> getOffset(final FieldAbsoluteDate<T> date) {
63          final T dt = date.durationFrom(referenceDate);
64          return new FieldClockOffset<>(date,
65                                        a2.multiply(dt).add(a1).multiply(dt).add(a0),
66                                        a2.multiply(dt).multiply(2).add(a1),
67                                        a2.multiply(2));
68      }
69  
70  }