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 }