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 java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
25 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
26 import org.hipparchus.geometry.euclidean.threed.Rotation;
27 import org.hipparchus.geometry.euclidean.threed.Vector3D;
28 import org.hipparchus.util.FastMath;
29 import org.orekit.frames.Frame;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.FieldAbsoluteDate;
32 import org.orekit.utils.ParameterDriver;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class IsotropicRadiationClassicalConvention implements RadiationSensitive {
52
53
54
55
56
57
58
59 private final double SCALE = FastMath.scalb(1.0, -3);
60
61
62 private final List<ParameterDriver> parameterDrivers;
63
64
65 private final double crossSection;
66
67
68
69
70
71
72 public IsotropicRadiationClassicalConvention(final double crossSection, final double ca, final double cs) {
73 this.parameterDrivers = new ArrayList<>(2);
74 parameterDrivers.add(new ParameterDriver(RadiationSensitive.ABSORPTION_COEFFICIENT, ca, SCALE, 0.0, 1.0));
75 parameterDrivers.add(new ParameterDriver(RadiationSensitive.REFLECTION_COEFFICIENT, cs, SCALE, 0.0, 1.0));
76 this.crossSection = crossSection;
77 }
78
79
80 @Override
81 public List<ParameterDriver> getRadiationParametersDrivers() {
82 return Collections.unmodifiableList(parameterDrivers);
83 }
84
85
86 @Override
87 public Vector3D radiationPressureAcceleration(final AbsoluteDate date, final Frame frame, final Vector3D position,
88 final Rotation rotation, final double mass, final Vector3D flux,
89 final double[] parameters) {
90 final double ca = parameters[0];
91 final double cs = parameters[1];
92 final double kP = crossSection * (1 + 4 * (1.0 - ca - cs) / 9.0);
93 return new Vector3D(kP / mass, flux);
94 }
95
96
97 @Override
98 public <T extends CalculusFieldElement<T>> FieldVector3D<T>
99 radiationPressureAcceleration(final FieldAbsoluteDate<T> date, final Frame frame,
100 final FieldVector3D<T> position,
101 final FieldRotation<T> rotation, final T mass,
102 final FieldVector3D<T> flux,
103 final T[] parameters) {
104 final T ca = parameters[0];
105 final T cs = parameters[1];
106 final T kP = ca.add(cs).negate().add(1).multiply(4.0 / 9.0).add(1).multiply(crossSection);
107 return new FieldVector3D<>(mass.reciprocal().multiply(kP), flux);
108 }
109 }