1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.signal;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.optim.ConvergenceChecker;
22 import org.hipparchus.optim.FieldScalarConvergenceCheckerProvider;
23 import org.hipparchus.util.FastMath;
24 import org.orekit.utils.FieldPVCoordinatesProvider;
25 import org.orekit.utils.PVCoordinatesProvider;
26
27
28
29
30
31
32
33 public class SignalTravelTimeModel {
34
35
36 private final ConvergenceChecker<Double> convergenceChecker;
37
38
39 private final FieldScalarConvergenceCheckerProvider fieldConvergenceCheckerProvider;
40
41
42
43
44
45
46 public SignalTravelTimeModel(final ConvergenceChecker<Double> convergenceChecker,
47 final FieldScalarConvergenceCheckerProvider fieldConvergenceCheckerProvider) {
48 this.convergenceChecker = convergenceChecker;
49 this.fieldConvergenceCheckerProvider = fieldConvergenceCheckerProvider;
50 }
51
52
53
54
55
56 public SignalTravelTimeModel(final ConvergenceChecker<Double> convergenceChecker) {
57 this(convergenceChecker, new FieldScalarConvergenceCheckerProvider() {
58 @Override
59 public <T extends CalculusFieldElement<T>> ConvergenceChecker<T> getChecker(final Field<T> field) {
60 return (iteration, previous, current) -> iteration != 0 && (iteration > AbstractSignalTravelTime.DEFAULT_MAX_ITER ||
61 (previous.subtract(current)).norm() <= 2 * FastMath.ulp(current).getReal());
62 }
63 });
64 }
65
66
67
68
69 public SignalTravelTimeModel() {
70 this(AbstractSignalTravelTime.getDefaultConvergenceChecker());
71 }
72
73
74
75
76
77 public ConvergenceChecker<Double> getConvergenceChecker() {
78 return convergenceChecker;
79 }
80
81
82
83
84
85 public FieldScalarConvergenceCheckerProvider getFieldConvergenceCheckerProvider() {
86 return fieldConvergenceCheckerProvider;
87 }
88
89
90
91
92
93 public SignalTravelTimeModel getWarmedUpModel() {
94 return new SignalTravelTimeModel((iteration, previous, current) -> convergenceChecker.converged(iteration + 1, previous, current),
95 new FieldScalarConvergenceCheckerProvider() {
96 @Override
97 public <T extends CalculusFieldElement<T>> ConvergenceChecker<T> getChecker(final Field<T> field) {
98 return (iteration, previous, current) -> fieldConvergenceCheckerProvider.getChecker(field)
99 .converged(iteration + 1, previous, current);
100 }
101 });
102 }
103
104
105
106
107
108
109 public AdjustableEmitterSignalTimer getAdjustableEmitterComputer(final PVCoordinatesProvider emitter) {
110 return new AdjustableEmitterSignalTimer(emitter, convergenceChecker);
111 }
112
113
114
115
116
117
118 public AdjustableReceiverSignalTimer getAdjustableReceiverComputer(final PVCoordinatesProvider receiver) {
119 return new AdjustableReceiverSignalTimer(receiver, convergenceChecker);
120 }
121
122
123
124
125
126
127
128
129 public <T extends CalculusFieldElement<T>> FieldAdjustableEmitterSignalTimer<T> getFieldAdjustableEmitterComputer(final Field<T> field,
130 final FieldPVCoordinatesProvider<T> emitter) {
131 return new FieldAdjustableEmitterSignalTimer<>(emitter, fieldConvergenceCheckerProvider.getChecker(field));
132 }
133
134
135
136
137
138
139
140
141 public <T extends CalculusFieldElement<T>> FieldAdjustableReceiverSignalTimer<T> getFieldAdjustableReceiverComputer(final Field<T> field,
142 final FieldPVCoordinatesProvider<T> receiver) {
143 return new FieldAdjustableReceiverSignalTimer<>(receiver, fieldConvergenceCheckerProvider.getChecker(field));
144 }
145 }