1 /*
2 * Licensed to the Hipparchus project 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 Hipparchus project 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 * https://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.hipparchus.ode;
19
20 /** Container for time, main and secondary state vectors as well as their derivatives.
21
22 * @see OrdinaryDifferentialEquation
23 * @see SecondaryODE
24 * @see ODEIntegrator
25 */
26
27 public class ODEStateAndDerivative extends ODEState {
28
29 /** Serializable UID. */
30 private static final long serialVersionUID = 20160408L;
31
32 /** Derivative of the primary state at time. */
33 private final double[] primaryDerivative;
34
35 /** Derivative of the secondary state at time. */
36 private final double[][] secondaryDerivative;
37
38 /** Simple constructor.
39 * <p>Calling this constructor is equivalent to call {@link
40 * #ODEStateAndDerivative(double, double[], double[],
41 * double[][], double[][]) ODEStateAndDerivative(time, state,
42 * derivative, null, null)}.</p>
43 * @param time time
44 * @param primaryState primary state at time
45 * @param primaryDerivative derivative of the primary state at time
46 */
47 public ODEStateAndDerivative(double time, double[] primaryState, double[] primaryDerivative) {
48 this(time, primaryState, primaryDerivative, null, null);
49 }
50
51 /** Simple constructor.
52 * @param time time
53 * @param primaryState primary state at time
54 * @param primaryDerivative derivative of the primary state at time
55 * @param secondaryState state at time (may be null)
56 * @param secondaryDerivative derivative of the state at time (may be null)
57 */
58 public ODEStateAndDerivative(double time, double[] primaryState, double[] primaryDerivative,
59 double[][] secondaryState, double[][] secondaryDerivative) {
60 super(time, primaryState, secondaryState);
61 this.primaryDerivative = primaryDerivative.clone();
62 this.secondaryDerivative = copy(secondaryDerivative);
63 }
64
65 /** Get derivative of the primary state at time.
66 * @return derivative of the primary state at time
67 * @see #getSecondaryDerivative(int)
68 * @see #getCompleteDerivative()
69 */
70 public double[] getPrimaryDerivative() {
71 return primaryDerivative.clone();
72 }
73
74 /** Get derivative of the secondary state at time.
75 * @param index index of the secondary set as returned
76 * by {@link ExpandableODE#addSecondaryEquations(SecondaryODE)}
77 * (beware index 0 corresponds to primary state, secondary states start at 1)
78 * @return derivative of the secondary state at time
79 * @see #getPrimaryDerivative()
80 * @see #getCompleteDerivative()
81 */
82 public double[] getSecondaryDerivative(final int index) {
83 return index == 0 ? primaryDerivative.clone() : secondaryDerivative[index - 1].clone();
84 }
85
86 /** Get complete derivative at time.
87 * @return complete derivative at time, starting with
88 * {@link #getPrimaryDerivative() primary derivative}, followed
89 * by all {@link #getSecondaryDerivative(int) secondary derivatives} in
90 * increasing index order
91 * @see #getPrimaryDerivative()
92 * @see #getSecondaryDerivative(int)
93 */
94 public double[] getCompleteDerivative() {
95 final double[] completeDerivative = new double[getCompleteStateDimension()];
96 System.arraycopy(primaryDerivative, 0, completeDerivative, 0, primaryDerivative.length);
97 int offset = primaryDerivative.length;
98 if (secondaryDerivative != null) {
99 for (double[] doubles : secondaryDerivative) {
100 System.arraycopy(doubles, 0,
101 completeDerivative, offset,
102 doubles.length);
103 offset += doubles.length;
104 }
105 }
106 return completeDerivative;
107 }
108
109 }