1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.ode.events;
18
19 import org.apache.commons.math4.legacy.ode.FirstOrderDifferentialEquations;
20 import org.apache.commons.math4.legacy.ode.FirstOrderIntegrator;
21 import org.apache.commons.math4.legacy.ode.nonstiff.DormandPrince853Integrator;
22 import org.junit.Assert;
23 import org.junit.Test;
24
25
26
27
28
29
30 public class CloseEventsTest {
31
32 @Test
33 public void testCloseEvents() {
34
35 double e = 1e-15;
36 FirstOrderIntegrator integrator =
37 new DormandPrince853Integrator(e, 100.0, 1e-7, 1e-7);
38
39 TimeDetector detector1 = new TimeDetector(5);
40 integrator.addEventHandler(detector1, 10, 1, 100);
41 TimeDetector detector2 = new TimeDetector(5.5);
42 integrator.addEventHandler(detector2, 10, 1, 100);
43
44
45 integrator.integrate(new Equation(), 0, new double[2], 20, new double[2]);
46
47
48 Assert.assertEquals(5, detector1.getActualT(), 0.0);
49 Assert.assertEquals(5.5, detector2.getActualT(), 0.0);
50 }
51
52 @Test
53 public void testSimultaneousEvents() {
54
55 double e = 1e-15;
56 FirstOrderIntegrator integrator =
57 new DormandPrince853Integrator(e, 100.0, 1e-7, 1e-7);
58
59 TimeDetector detector1 = new TimeDetector(5);
60 integrator.addEventHandler(detector1, 10, 1, 100);
61 TimeDetector detector2 = new TimeDetector(5);
62 integrator.addEventHandler(detector2, 10, 1, 100);
63
64
65 integrator.integrate(new Equation(), 0, new double[2], 20, new double[2]);
66
67
68 Assert.assertEquals(5, detector1.getActualT(), 0.0);
69 Assert.assertEquals(5, detector2.getActualT(), 0.0);
70 }
71
72
73
74 private static final class TimeDetector implements EventHandler {
75
76
77 private final double eventT;
78
79
80 private double actualT;
81
82
83
84
85
86
87 TimeDetector(double eventT) {
88 this.eventT = eventT;
89 }
90
91
92 public double getActualT() {
93 return actualT;
94 }
95
96 @Override
97 public void init(double t0, double[] y0, double t) {
98 }
99
100 @Override
101 public double g(double t, double[] y) {
102 return t - eventT;
103 }
104
105 @Override
106 public Action eventOccurred(double t, double[] y, boolean increasing) {
107 this.actualT = t;
108 return Action.CONTINUE;
109 }
110
111 @Override
112 public void resetState(double t, double[] y) {
113 }
114 }
115
116
117 public static class Equation implements FirstOrderDifferentialEquations {
118
119 @Override
120 public int getDimension() {
121 return 2;
122 }
123
124 @Override
125 public void computeDerivatives(double t, double[] y, double[] yDot) {
126 yDot[0] = 1.0;
127 yDot[1] = 2.0;
128 }
129 }
130 }