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