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.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.frames.Frame;
23 import org.orekit.propagation.FieldSpacecraftState;
24 import org.orekit.propagation.SpacecraftState;
25 import org.orekit.time.AbsoluteDate;
26 import org.orekit.time.FieldAbsoluteDate;
27 import org.orekit.utils.ExtendedPositionProvider;
28
29
30
31
32
33
34
35
36
37 public abstract class AbstractLightFluxModel implements LightFluxModel {
38
39
40 private final ExtendedPositionProvider occultedBody;
41
42
43
44
45
46 protected AbstractLightFluxModel(final ExtendedPositionProvider occultedBody) {
47 this.occultedBody = occultedBody;
48 }
49
50
51
52
53
54 public ExtendedPositionProvider getOccultedBody() {
55 return occultedBody;
56 }
57
58
59 @Override
60 public Vector3D getLightFluxVector(final SpacecraftState state) {
61 final Vector3D position = state.getPosition();
62 final Vector3D lightSourcePosition = getOccultedBodyPosition(state.getDate(), state.getFrame());
63 final double lightingRatio = getLightingRatio(position, lightSourcePosition);
64 if (lightingRatio != 0.) {
65 final Vector3D relativePosition = position.subtract(lightSourcePosition);
66 final Vector3D unoccultedFlux = getUnoccultedFluxVector(relativePosition);
67 return unoccultedFlux.scalarMultiply(lightingRatio);
68 } else {
69 return Vector3D.ZERO;
70 }
71 }
72
73
74 @Override
75 public <T extends CalculusFieldElement<T>> FieldVector3D<T> getLightFluxVector(final FieldSpacecraftState<T> state) {
76 final FieldVector3D<T> position = state.getPosition();
77 final FieldVector3D<T> lightSourcePosition = getOccultedBodyPosition(state.getDate(), state.getFrame());
78 final T lightingRatio = getLightingRatio(position, lightSourcePosition);
79 final FieldVector3D<T> relativePosition = position.subtract(lightSourcePosition);
80 final FieldVector3D<T> unoccultedFlux = getUnoccultedFluxVector(relativePosition);
81 return unoccultedFlux.scalarMultiply(lightingRatio);
82 }
83
84
85
86
87
88
89
90 protected Vector3D getOccultedBodyPosition(final AbsoluteDate date, final Frame frame) {
91 return occultedBody.getPosition(date, frame);
92 }
93
94
95
96
97
98
99
100
101 protected <T extends CalculusFieldElement<T>> FieldVector3D<T> getOccultedBodyPosition(final FieldAbsoluteDate<T> date,
102 final Frame frame) {
103 return occultedBody.getPosition(date, frame);
104 }
105
106
107
108
109
110 protected abstract Vector3D getUnoccultedFluxVector(Vector3D relativePosition);
111
112
113
114
115
116
117 protected abstract <T extends CalculusFieldElement<T>> FieldVector3D<T> getUnoccultedFluxVector(FieldVector3D<T> relativePosition);
118
119
120
121
122
123 public double getLightingRatio(final SpacecraftState state) {
124 final Vector3D position = state.getPosition();
125 final Vector3D lightSourcePosition = getOccultedBodyPosition(state.getDate(), state.getFrame());
126 return getLightingRatio(position, lightSourcePosition);
127 }
128
129
130
131
132
133
134 protected abstract double getLightingRatio(Vector3D position, Vector3D occultedBodyPosition);
135
136
137
138
139
140
141 public <T extends CalculusFieldElement<T>> T getLightingRatio(final FieldSpacecraftState<T> state) {
142 final FieldVector3D<T> position = state.getPosition();
143 final FieldVector3D<T> lightSourcePosition = getOccultedBodyPosition(state.getDate(), state.getFrame());
144 return getLightingRatio(position, lightSourcePosition);
145 }
146
147
148
149
150
151
152
153 protected abstract <T extends CalculusFieldElement<T>> T getLightingRatio(FieldVector3D<T> position,
154 FieldVector3D<T> occultedBodyPosition);
155
156 }