View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.math4.legacy.ode.events;
18  
19  import org.junit.Assert;
20  
21  import java.util.Arrays;
22  
23  import org.apache.commons.math4.legacy.analysis.solvers.PegasusSolver;
24  import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
25  import org.apache.commons.math4.legacy.exception.MaxCountExceededException;
26  import org.apache.commons.math4.legacy.exception.NoBracketingException;
27  import org.apache.commons.math4.legacy.exception.NumberIsTooSmallException;
28  import org.apache.commons.math4.legacy.ode.FirstOrderDifferentialEquations;
29  import org.apache.commons.math4.legacy.ode.FirstOrderIntegrator;
30  import org.apache.commons.math4.legacy.ode.nonstiff.DormandPrince853Integrator;
31  import org.apache.commons.math4.legacy.ode.nonstiff.GraggBulirschStoerIntegrator;
32  import org.junit.Test;
33  
34  public class ReappearingEventTest {
35      @Test
36      public void testDormandPrince()
37          throws DimensionMismatchException, NumberIsTooSmallException,
38                 MaxCountExceededException, NoBracketingException {
39          double tEnd = test(1);
40          Assert.assertEquals(10.0, tEnd, 1e-7);
41      }
42  
43      @Test
44      public void testGragg()
45          throws DimensionMismatchException, NumberIsTooSmallException,
46                 MaxCountExceededException, NoBracketingException {
47          double tEnd = test(2);
48          Assert.assertEquals(10.0, tEnd, 1e-7);
49      }
50  
51      public double test(int integratorType)
52          throws DimensionMismatchException, NumberIsTooSmallException,
53                 MaxCountExceededException, NoBracketingException {
54          double e = 1e-15;
55          FirstOrderIntegrator integrator;
56          integrator = (integratorType == 1)
57                       ? new DormandPrince853Integrator(e, 100.0, 1e-7, 1e-7)
58                       : new GraggBulirschStoerIntegrator(e, 100.0, 1e-7, 1e-7);
59          PegasusSolver rootSolver = new PegasusSolver(e, e);
60          integrator.addEventHandler(new Event(), 0.1, e, 1000, rootSolver);
61          double t0 = 6.0;
62          double tEnd = 10.0;
63          double[] y = {2.0, 2.0, 2.0, 4.0, 2.0, 7.0, 15.0};
64          return integrator.integrate(new Ode(), t0, y, tEnd, y);
65      }
66  
67      private static final class Ode implements FirstOrderDifferentialEquations {
68          @Override
69          public int getDimension() {
70              return 7;
71          }
72  
73          @Override
74          public void computeDerivatives(double t, double[] y, double[] yDot) {
75              Arrays.fill(yDot, 1.0);
76          }
77      }
78  
79      /** State events for this unit test. */
80      protected static class Event implements EventHandler {
81  
82          @Override
83          public void init(double t0, double[] y0, double t) {
84          }
85  
86          @Override
87          public double g(double t, double[] y) {
88              return y[6] - 15.0;
89          }
90  
91          @Override
92          public Action eventOccurred(double t, double[] y, boolean increasing) {
93              return Action.STOP;
94          }
95  
96          @Override
97          public void resetState(double t, double[] y) {
98              // Never called.
99          }
100     }
101 }