1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.gravity;
18
19 import java.util.List;
20 import java.util.stream.Stream;
21
22 import org.hipparchus.Field;
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.orekit.bodies.CelestialBody;
27 import org.orekit.forces.AbstractForceModel;
28 import org.orekit.forces.ForceModel;
29 import org.orekit.forces.gravity.potential.CachedNormalizedSphericalHarmonicsProvider;
30 import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
31 import org.orekit.forces.gravity.potential.TideSystem;
32 import org.orekit.frames.Frame;
33 import org.orekit.propagation.FieldSpacecraftState;
34 import org.orekit.propagation.SpacecraftState;
35 import org.orekit.propagation.events.EventDetector;
36 import org.orekit.propagation.events.FieldEventDetector;
37 import org.orekit.time.TimeScales;
38 import org.orekit.time.UT1Scale;
39 import org.orekit.utils.Constants;
40 import org.orekit.utils.IERSConventions;
41 import org.orekit.utils.OrekitConfiguration;
42 import org.orekit.utils.ParameterDriver;
43
44
45
46
47
48 public class SolidTides extends AbstractForceModel {
49
50
51 public static final double DEFAULT_STEP = 600.0;
52
53
54 public static final int DEFAULT_POINTS = 12;
55
56
57 private final ForceModel attractionModel;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public SolidTides(final Frame centralBodyFrame, final double ae, final double mu,
76 final TideSystem centralTideSystem,
77 final IERSConventions conventions, final UT1Scale ut1,
78 final CelestialBody... bodies) {
79 this(centralBodyFrame, ae, mu, centralTideSystem, true,
80 DEFAULT_STEP, DEFAULT_POINTS, conventions, ut1, bodies);
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public SolidTides(final Frame centralBodyFrame, final double ae, final double mu,
97 final TideSystem centralTideSystem, final boolean poleTide,
98 final double step, final int nbPoints,
99 final IERSConventions conventions, final UT1Scale ut1,
100 final CelestialBody... bodies) {
101 final TimeScales timeScales = ut1.getEOPHistory().getTimeScales();
102 final SolidTidesField raw =
103 new SolidTidesField(conventions.getLoveNumbers(),
104 conventions.getTideFrequencyDependenceFunction(ut1, timeScales),
105 conventions.getPermanentTide(),
106 poleTide ? conventions.getSolidPoleTide(ut1.getEOPHistory()) : null,
107 centralBodyFrame, ae, mu, centralTideSystem, bodies);
108 final NormalizedSphericalHarmonicsProvider provider;
109 if (nbPoints < 2) {
110 provider = raw;
111 } else {
112 provider =
113 new CachedNormalizedSphericalHarmonicsProvider(raw, step, nbPoints,
114 OrekitConfiguration.getCacheSlotsNumber(),
115 7 * Constants.JULIAN_DAY,
116 0.5 * Constants.JULIAN_DAY);
117 }
118 attractionModel = new HolmesFeatherstoneAttractionModel(centralBodyFrame, provider);
119 }
120
121
122 @Override
123 public boolean dependsOnPositionOnly() {
124 return attractionModel.dependsOnPositionOnly();
125 }
126
127
128 @Override
129 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
130
131 return attractionModel.acceleration(s, parameters);
132 }
133
134
135 @Override
136 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s,
137 final T[] parameters) {
138
139 return attractionModel.acceleration(s, parameters);
140 }
141
142
143 @Override
144 public Stream<EventDetector> getEventsDetectors() {
145
146 return attractionModel.getEventsDetectors();
147 }
148
149
150 @Override
151 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventsDetectors(final Field<T> field) {
152
153 return attractionModel.getFieldEventsDetectors(field);
154 }
155
156
157 @Override
158 public List<ParameterDriver> getParametersDrivers() {
159
160 return attractionModel.getParametersDrivers();
161 }
162
163 }