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  
18  package org.apache.commons.math4.legacy.ode.sampling;
19  
20  import java.io.IOException;
21  import java.io.ObjectInput;
22  import java.io.ObjectOutput;
23  
24  import org.apache.commons.math4.legacy.ode.EquationsMapper;
25  
26  /** This class is a step interpolator that does nothing.
27   *
28   * <p>This class is used when the {@link StepHandler "step handler"}
29   * set up by the user does not need step interpolation. It does not
30   * recompute the state when {@link AbstractStepInterpolator#setInterpolatedTime
31   * setInterpolatedTime} is called. This implies the interpolated state
32   * is always the state at the end of the current step.</p>
33   *
34   * @see StepHandler
35   *
36   * @since 1.2
37   */
38  
39  public class DummyStepInterpolator
40    extends AbstractStepInterpolator {
41  
42    /** Serializable version identifier. */
43    private static final long serialVersionUID = 1708010296707839488L;
44  
45    /** Current derivative. */
46    private double[] currentDerivative;
47  
48    /** Simple constructor.
49     * This constructor builds an instance that is not usable yet, the
50     * <code>AbstractStepInterpolator.reinitialize</code> protected method
51     * should be called before using the instance in order to initialize
52     * the internal arrays. This constructor is used only in order to delay
53     * the initialization in some cases. As an example, the {@link
54     * org.apache.commons.math4.legacy.ode.nonstiff.EmbeddedRungeKuttaIntegrator} uses
55     * the prototyping design pattern to create the step interpolators by
56     * cloning an uninitialized model and latter initializing the copy.
57     */
58    public DummyStepInterpolator() {
59      super();
60      currentDerivative = null;
61    }
62  
63    /** Simple constructor.
64     * @param y reference to the integrator array holding the state at
65     * the end of the step
66     * @param yDot reference to the integrator array holding the state
67     * derivative at some arbitrary point within the step
68     * @param forward integration direction indicator
69     */
70    public DummyStepInterpolator(final double[] y, final double[] yDot, final boolean forward) {
71      super(y, forward, new EquationsMapper(0, y.length), new EquationsMapper[0]);
72      currentDerivative = yDot;
73    }
74  
75    /** Copy constructor.
76     * @param interpolator interpolator to copy from. The copy is a deep
77     * copy: its arrays are separated from the original arrays of the
78     * instance
79     */
80    public DummyStepInterpolator(final DummyStepInterpolator interpolator) {
81      super(interpolator);
82      if (interpolator.currentDerivative != null) {
83          currentDerivative = interpolator.currentDerivative.clone();
84      }
85    }
86  
87    /** Really copy the finalized instance.
88     * @return a copy of the finalized instance
89     */
90    @Override
91    protected StepInterpolator doCopy() {
92      return new DummyStepInterpolator(this);
93    }
94  
95    /** Compute the state at the interpolated time.
96     * In this class, this method does nothing: the interpolated state
97     * is always the state at the end of the current step.
98     * @param theta normalized interpolation abscissa within the step
99     * (theta is zero at the previous time step and one at the current time step)
100    * @param oneMinusThetaH time gap between the interpolated time and
101    * the current time
102    */
103   @Override
104   protected void computeInterpolatedStateAndDerivatives(final double theta, final double oneMinusThetaH) {
105       System.arraycopy(currentState,      0, interpolatedState,       0, currentState.length);
106       System.arraycopy(currentDerivative, 0, interpolatedDerivatives, 0, currentDerivative.length);
107   }
108 
109   /** Write the instance to an output channel.
110    * @param out output channel
111    * @exception IOException if the instance cannot be written
112    */
113   @Override
114   public void writeExternal(final ObjectOutput out)
115     throws IOException {
116 
117       // save the state of the base class
118     writeBaseExternal(out);
119 
120     if (currentDerivative != null) {
121         for (int i = 0; i < currentDerivative.length; ++i) {
122             out.writeDouble(currentDerivative[i]);
123         }
124     }
125   }
126 
127   /** Read the instance from an input channel.
128    * @param in input channel
129    * @exception IOException if the instance cannot be read
130    */
131   @Override
132   public void readExternal(final ObjectInput in)
133     throws IOException, ClassNotFoundException {
134 
135     // read the base class
136     final double t = readBaseExternal(in);
137 
138     if (currentState == null) {
139         currentDerivative = null;
140     } else {
141         currentDerivative  = new double[currentState.length];
142         for (int i = 0; i < currentDerivative.length; ++i) {
143             currentDerivative[i] = in.readDouble();
144         }
145     }
146 
147     // we can now set the interpolated time and state
148     setInterpolatedTime(t);
149   }
150 }