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 boolean dependsOnPositionOnly() {
89 return radiationSensitive instanceof IsotropicRadiationClassicalConvention || radiationSensitive instanceof IsotropicRadiationCNES95Convention || radiationSensitive instanceof IsotropicRadiationSingleCoefficient;
90 }
91
92
93 @Override
94 public void init(final SpacecraftState initialState, final AbsoluteDate target) {
95 RadiationForceModel.super.init(initialState, target);
96 lightFluxModel.init(initialState, target);
97 }
98
99
100 @Override
101 public <T extends CalculusFieldElement<T>> void init(final FieldSpacecraftState<T> initialState,
102 final FieldAbsoluteDate<T> target) {
103 RadiationForceModel.super.init(initialState, target);
104 lightFluxModel.init(initialState, target);
105 }
106
107
108 @Override
109 public Vector3D acceleration(final SpacecraftState s, final double[] parameters) {
110 final Vector3D fluxVector = lightFluxModel.getLightFluxVector(s);
111 return radiationSensitive.radiationPressureAcceleration(s, fluxVector, parameters);
112 }
113
114
115 @Override
116 public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(final FieldSpacecraftState<T> s, final T[] parameters) {
117 final FieldVector3D<T> fluxVector = lightFluxModel.getLightFluxVector(s);
118 return radiationSensitive.radiationPressureAcceleration(s, fluxVector, parameters);
119 }
120
121
122 @Override
123 public List<ParameterDriver> getParametersDrivers() {
124 return radiationSensitive.getRadiationParametersDrivers();
125 }
126
127
128 @Override
129 public Stream<EventDetector> getEventDetectors() {
130 final List<EventDetector> eventDetectors = lightFluxModel.getEclipseConditionsDetector();
131 return Stream.concat(RadiationForceModel.super.getEventDetectors(), eventDetectors.stream());
132 }
133
134
135 @Override
136 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventDetectors(final Field<T> field) {
137 final List<FieldEventDetector<T>> eventDetectors = lightFluxModel.getFieldEclipseConditionsDetector(field);
138 return Stream.concat(RadiationForceModel.super.getFieldEventDetectors(field), eventDetectors.stream());
139 }
140 }