1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.gravity.potential;
18
19 import org.hipparchus.util.FastMath;
20 import org.orekit.time.AbsoluteDate;
21
22
23
24
25
26 class SecularTrendSphericalHarmonics implements RawSphericalHarmonicsProvider {
27
28
29 private final RawSphericalHarmonicsProvider provider;
30
31
32 private final AbsoluteDate referenceDate;
33
34
35
36
37 private final Flattener flattener;
38
39
40 private final double[] cTrend;
41
42
43 private final double[] sTrend;
44
45
46
47
48
49
50
51
52
53 SecularTrendSphericalHarmonics(final RawSphericalHarmonicsProvider provider, final AbsoluteDate referenceDate,
54 final Flattener flattener, final double[] cTrend, final double[] sTrend) {
55 this.provider = provider;
56 this.referenceDate = referenceDate;
57 this.flattener = flattener;
58 this.cTrend = cTrend.clone();
59 this.sTrend = sTrend.clone();
60 }
61
62
63 public int getMaxDegree() {
64 return FastMath.max(flattener.getDegree(), provider.getMaxDegree());
65 }
66
67
68 public int getMaxOrder() {
69 return FastMath.max(flattener.getOrder(), provider.getMaxOrder());
70 }
71
72
73 public double getMu() {
74 return provider.getMu();
75 }
76
77
78 public double getAe() {
79 return provider.getAe();
80 }
81
82
83 public AbsoluteDate getReferenceDate() {
84 return referenceDate;
85 }
86
87
88 public TideSystem getTideSystem() {
89 return provider.getTideSystem();
90 }
91
92 @Override
93 public RawSphericalHarmonics onDate(final AbsoluteDate date) {
94 final RawSphericalHarmonics harmonics = provider.onDate(date);
95
96 final double dateOffset = date.durationFrom(referenceDate);
97 return new RawSphericalHarmonics() {
98
99 @Override
100 public AbsoluteDate getDate() {
101 return date;
102 }
103
104
105 public double getRawCnm(final int n, final int m) {
106
107
108 double cnm = harmonics.getRawCnm(n, m);
109
110 if (flattener.withinRange(n, m)) {
111
112 cnm += dateOffset * cTrend[flattener.index(n, m)];
113 }
114
115 return cnm;
116
117 }
118
119
120 public double getRawSnm(final int n, final int m) {
121
122
123 double snm = harmonics.getRawSnm(n, m);
124
125 if (flattener.withinRange(n, m)) {
126
127 snm += dateOffset * sTrend[flattener.index(n, m)];
128 }
129
130 return snm;
131
132 }
133
134 };
135 }
136
137 }