1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.hipparchus.ode.sampling;
19
20 import org.hipparchus.exception.MathIllegalArgumentException;
21 import org.hipparchus.exception.MathIllegalStateException;
22 import org.hipparchus.ode.ODEIntegrator;
23 import org.hipparchus.ode.ODEState;
24 import org.hipparchus.ode.ODEStateAndDerivative;
25 import org.hipparchus.ode.OrdinaryDifferentialEquation;
26 import org.hipparchus.ode.nonstiff.GraggBulirschStoerIntegrator;
27 import org.junit.jupiter.api.Test;
28
29 import java.util.ArrayList;
30 import java.util.List;
31
32 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
33
34
35 public abstract class StepNormalizerOutputTestBase
36 implements OrdinaryDifferentialEquation, ODEFixedStepHandler {
37
38
39 private List<Double> output;
40
41
42
43
44
45 protected abstract double getStart();
46
47
48
49
50
51 protected abstract double getEnd();
52
53
54
55
56
57 protected abstract double[] getExpInc();
58
59
60
61
62
63
64
65 protected abstract double[] getExpIncRev();
66
67
68
69
70
71 protected abstract double[] getExpMul();
72
73
74
75
76
77
78
79 protected abstract double[] getExpMulRev();
80
81
82
83
84
85
86
87 protected abstract int[][] getO();
88
89
90
91
92
93
94
95
96 private double[] getArray(double[] a, int offsetL, int offsetR) {
97 double[] copy = new double[a.length - offsetR - offsetL];
98 System.arraycopy(a, offsetL, copy, 0, copy.length);
99 return copy;
100 }
101
102 @Test
103 public void testIncNeither()
104 throws MathIllegalArgumentException, MathIllegalStateException {
105 double[] exp = getArray(getExpInc(), getO()[0][0], getO()[0][1]);
106 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.NEITHER, exp, false);
107 }
108
109 @Test
110 public void testIncNeitherRev()
111 throws MathIllegalArgumentException, MathIllegalStateException {
112 double[] exp = getArray(getExpIncRev(), getO()[1][0], getO()[1][1]);
113 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.NEITHER, exp, true);
114 }
115
116 @Test
117 public void testIncFirst()
118 throws MathIllegalArgumentException, MathIllegalStateException {
119 double[] exp = getArray(getExpInc(), getO()[2][0], getO()[2][1]);
120 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.FIRST, exp, false);
121 }
122
123 @Test
124 public void testIncFirstRev()
125 throws MathIllegalArgumentException, MathIllegalStateException {
126 double[] exp = getArray(getExpIncRev(), getO()[3][0], getO()[3][1]);
127 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.FIRST, exp, true);
128 }
129
130 @Test
131 public void testIncLast()
132 throws MathIllegalArgumentException, MathIllegalStateException {
133 double[] exp = getArray(getExpInc(), getO()[4][0], getO()[4][1]);
134 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.LAST, exp, false);
135 }
136
137 @Test
138 public void testIncLastRev()
139 throws MathIllegalArgumentException, MathIllegalStateException {
140 double[] exp = getArray(getExpIncRev(), getO()[5][0], getO()[5][1]);
141 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.LAST, exp, true);
142 }
143
144 @Test
145 public void testIncBoth()
146 throws MathIllegalArgumentException, MathIllegalStateException {
147 double[] exp = getArray(getExpInc(), getO()[6][0], getO()[6][1]);
148 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.BOTH, exp, false);
149 }
150
151 @Test
152 public void testIncBothRev()
153 throws MathIllegalArgumentException, MathIllegalStateException {
154 double[] exp = getArray(getExpIncRev(), getO()[7][0], getO()[7][1]);
155 doTest(StepNormalizerMode.INCREMENT, StepNormalizerBounds.BOTH, exp, true);
156 }
157
158 @Test
159 public void testMulNeither()
160 throws MathIllegalArgumentException, MathIllegalStateException {
161 double[] exp = getArray(getExpMul(), getO()[8][0], getO()[8][1]);
162 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.NEITHER, exp, false);
163 }
164
165 @Test
166 public void testMulNeitherRev()
167 throws MathIllegalArgumentException, MathIllegalStateException {
168 double[] exp = getArray(getExpMulRev(), getO()[9][0], getO()[9][1]);
169 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.NEITHER, exp, true);
170 }
171
172 @Test
173 public void testMulFirst()
174 throws MathIllegalArgumentException, MathIllegalStateException {
175 double[] exp = getArray(getExpMul(), getO()[10][0], getO()[10][1]);
176 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.FIRST, exp, false);
177 }
178
179 @Test
180 public void testMulFirstRev()
181 throws MathIllegalArgumentException, MathIllegalStateException {
182 double[] exp = getArray(getExpMulRev(), getO()[11][0], getO()[11][1]);
183 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.FIRST, exp, true);
184 }
185
186 @Test
187 public void testMulLast()
188 throws MathIllegalArgumentException, MathIllegalStateException {
189 double[] exp = getArray(getExpMul(), getO()[12][0], getO()[12][1]);
190 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.LAST, exp, false);
191 }
192
193 @Test
194 public void testMulLastRev()
195 throws MathIllegalArgumentException, MathIllegalStateException {
196 double[] exp = getArray(getExpMulRev(), getO()[13][0], getO()[13][1]);
197 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.LAST, exp, true);
198 }
199
200 @Test
201 public void testMulBoth()
202 throws MathIllegalArgumentException, MathIllegalStateException {
203 double[] exp = getArray(getExpMul(), getO()[14][0], getO()[14][1]);
204 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.BOTH, exp, false);
205 }
206
207 @Test
208 public void testMulBothRev()
209 throws MathIllegalArgumentException, MathIllegalStateException {
210 double[] exp = getArray(getExpMulRev(), getO()[15][0], getO()[15][1]);
211 doTest(StepNormalizerMode.MULTIPLES, StepNormalizerBounds.BOTH, exp, true);
212 }
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 private void doTest(StepNormalizerMode mode, StepNormalizerBounds bounds,
228 double[] expected, boolean reverse)
229 throws MathIllegalArgumentException, MathIllegalStateException {
230
231 ODEIntegrator integ = new GraggBulirschStoerIntegrator(1e-8, 1.0, 1e-5, 1e-5);
232 integ.addStepHandler(new StepNormalizer(0.5, this, mode, bounds));
233 double[] y = {0.0};
234 double start = reverse ? getEnd() : getStart();
235 double end = reverse ? getStart() : getEnd();
236 output = new ArrayList<Double>();
237 integ.integrate(this, new ODEState(start, y), end);
238 double[] actual = new double[output.size()];
239 for(int i = 0; i < actual.length; i++) {
240 actual[i] = output.get(i);
241 }
242 assertArrayEquals(expected, actual, 1e-5);
243 }
244
245
246 public int getDimension() {
247 return 1;
248 }
249
250
251 public double[] computeDerivatives(double t, double[] y) {
252 return y;
253 }
254
255
256 public void handleStep(ODEStateAndDerivative s, boolean isLast) {
257 output.add(s.getTime());
258 }
259
260 }