diff options
Diffstat (limited to 'src/main/java/org/apache/commons/math3/ode/FieldODEState.java')
-rw-r--r-- | src/main/java/org/apache/commons/math3/ode/FieldODEState.java | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/math3/ode/FieldODEState.java b/src/main/java/org/apache/commons/math3/ode/FieldODEState.java new file mode 100644 index 0000000..baa7c96 --- /dev/null +++ b/src/main/java/org/apache/commons/math3/ode/FieldODEState.java @@ -0,0 +1,155 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.math3.ode; + +import org.apache.commons.math3.Field; +import org.apache.commons.math3.RealFieldElement; +import org.apache.commons.math3.util.MathArrays; + +/** + * Container for time, main and secondary state vectors. + * + * @see FirstOrderFieldDifferentialEquations + * @see FieldSecondaryEquations + * @see FirstOrderFieldIntegrator + * @see FieldODEStateAndDerivative + * @param <T> the type of the field elements + * @since 3.6 + */ +public class FieldODEState<T extends RealFieldElement<T>> { + + /** Time. */ + private final T time; + + /** Main state at time. */ + private final T[] state; + + /** Secondary state at time. */ + private final T[][] secondaryState; + + /** + * Simple constructor. + * + * <p>Calling this constructor is equivalent to call {@link #FieldODEState(RealFieldElement, + * RealFieldElement[], RealFieldElement[][]) FieldODEState(time, state, null)}. + * + * @param time time + * @param state state at time + */ + public FieldODEState(T time, T[] state) { + this(time, state, null); + } + + /** + * Simple constructor. + * + * @param time time + * @param state state at time + * @param secondaryState state at time (may be null) + */ + public FieldODEState(T time, T[] state, T[][] secondaryState) { + this.time = time; + this.state = state.clone(); + this.secondaryState = copy(time.getField(), secondaryState); + } + + /** + * Copy a two-dimensions array. + * + * @param field field to which elements belong + * @param original original array (may be null) + * @return copied array or null if original array was null + */ + protected T[][] copy(final Field<T> field, final T[][] original) { + + // special handling of null arrays + if (original == null) { + return null; + } + + // allocate the array + final T[][] copied = MathArrays.buildArray(field, original.length, -1); + + // copy content + for (int i = 0; i < original.length; ++i) { + copied[i] = original[i].clone(); + } + + return copied; + } + + /** + * Get time. + * + * @return time + */ + public T getTime() { + return time; + } + + /** + * Get main state dimension. + * + * @return main state dimension + */ + public int getStateDimension() { + return state.length; + } + + /** + * Get main state at time. + * + * @return main state at time + */ + public T[] getState() { + return state.clone(); + } + + /** + * Get the number of secondary states. + * + * @return number of secondary states. + */ + public int getNumberOfSecondaryStates() { + return secondaryState == null ? 0 : secondaryState.length; + } + + /** + * Get secondary state dimension. + * + * @param index index of the secondary set as returned by {@link + * FieldExpandableODE#addSecondaryEquations(FieldSecondaryEquations)} (beware index 0 + * corresponds to main state, additional states start at 1) + * @return secondary state dimension + */ + public int getSecondaryStateDimension(final int index) { + return index == 0 ? state.length : secondaryState[index - 1].length; + } + + /** + * Get secondary state at time. + * + * @param index index of the secondary set as returned by {@link + * FieldExpandableODE#addSecondaryEquations(FieldSecondaryEquations)} (beware index 0 + * corresponds to main state, additional states start at 1) + * @return secondary state at time + */ + public T[] getSecondaryState(final int index) { + return index == 0 ? state.clone() : secondaryState[index - 1].clone(); + } +} |