1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.radiation;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.geometry.euclidean.threed.Vector3D;
23 import org.orekit.propagation.FieldSpacecraftState;
24 import org.orekit.propagation.SpacecraftState;
25 import org.orekit.propagation.events.EventDetector;
26 import org.orekit.propagation.events.FieldEventDetector;
27 import org.orekit.time.AbsoluteDate;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.utils.ParameterDriver;
30
31 import java.util.List;
32 import java.util.stream.Stream;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class RadiationPressureModel implements RadiationForceModel {
48
49
50
51
52 private final LightFluxModel lightFluxModel;
53
54
55
56
57 private final RadiationSensitive radiationSensitive;
58
59
60
61
62
63
64 public RadiationPressureModel(final LightFluxModel lightFluxModel,
65 final RadiationSensitive radiationSensitive) {
66 this.lightFluxModel = lightFluxModel;
67 this.radiationSensitive = radiationSensitive;
68 }
69
70
71
72
73
74 public RadiationSensitive getRadiationSensitive() {
75 return radiationSensitive;
76 }
77
78
79
80
81
82 public LightFluxModel getLightFluxModel() {
83 return lightFluxModel;
84 }
85
86
87 @Override
88 public void init(final SpacecraftState initialState, final AbsoluteDate target) {
89 RadiationForceModel.super.init(initialState, target);
90 lightFluxModel.init(initialState, target);
91 }
92
93
94 @Override
95 public <T extends CalculusFieldElement<T>> void init(final FieldSpacecraftState<T> initialState,
96 final FieldAbsoluteDate<T> target) {
97 RadiationForceModel.super.init(initialState, target);
98 lightFluxModel.init(initialState, target);
99 }
100
101
102 @Override
103 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
104 final Vector3D fluxVector = lightFluxModel.getLightFluxVector(s);
105 return radiationSensitive.radiationPressureAcceleration(s, fluxVector, parameters);
106 }
107
108
109 @Override
110 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s, final T[] parameters) {
111 final FieldVector3D<T> fluxVector = lightFluxModel.getLightFluxVector(s);
112 return radiationSensitive.radiationPressureAcceleration(s, fluxVector, parameters);
113 }
114
115
116 @Override
117 public List<ParameterDriver> getParametersDrivers() {
118 return radiationSensitive.getRadiationParametersDrivers();
119 }
120
121
122 @Override
123 public Stream<EventDetector> getEventDetectors() {
124 final List<EventDetector> eventDetectors = lightFluxModel.getEclipseConditionsDetector();
125 return Stream.concat(RadiationForceModel.super.getEventDetectors(), eventDetectors.stream());
126 }
127
128
129 @Override
130 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventDetectors(final Field<T> field) {
131 final List<FieldEventDetector<T>> eventDetectors = lightFluxModel.getFieldEclipseConditionsDetector(field);
132 return Stream.concat(RadiationForceModel.super.getFieldEventDetectors(field), eventDetectors.stream());
133 }
134 }