Commit b2d244dd authored by Luc Maisonobe's avatar Luc Maisonobe
Browse files

Started use of MatricesHarvesters API for orbit determination.

The switch to new API is not complete yet, we still use instances of
AbstractJacobian, we just declare them as MatricesHarvesters.
parent 8af734c2
Pipeline #1531 passed with stages
in 20 minutes and 23 seconds
......@@ -36,6 +36,7 @@ import org.hipparchus.util.Pair;
import org.orekit.estimation.measurements.EstimatedMeasurement;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.orbits.Orbit;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.PropagatorsParallelizer;
import org.orekit.propagation.SpacecraftState;
......@@ -106,8 +107,10 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
/** Model function value. */
private RealVector value;
/** Mappers for extracting Jacobians from integrated states. */
private final AbstractJacobiansMapper[] mappers;
/** Harvesters for extracting State Transition Matrices and Jacobians from integrated states.
* @since 11.1
*/
private final MatricesHarvester[] harvesters;
/** Model function Jacobian. */
private RealMatrix jacobian;
......@@ -117,13 +120,30 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
* @param propagatorBuilders builders to use for propagation
* @param measurements measurements
* @param estimatedMeasurementsParameters estimated measurements parameters
* @param mappers jacobian mappers
* @param harvesters harvesters for matrices (ignored since 11.1)
* @param observer observer to be notified at model calls
* @deprecated as of 11.1, replaced by [@link #AbstractBatchLSModel(OrbitDeterminationPropagatorBuilder[],
* List, ParameterDriversList, ModelObserver)}
*/
@Deprecated
public AbstractBatchLSModel(final OrbitDeterminationPropagatorBuilder[] propagatorBuilders,
final List<ObservedMeasurement<?>> measurements,
final ParameterDriversList estimatedMeasurementsParameters,
final MatricesHarvester[] harvesters,
final ModelObserver observer) {
this(propagatorBuilders, measurements, estimatedMeasurementsParameters, observer);
}
/**
* Constructor.
* @param propagatorBuilders builders to use for propagation
* @param measurements measurements
* @param estimatedMeasurementsParameters estimated measurements parameters
* @param observer observer to be notified at model calls
*/
public AbstractBatchLSModel(final OrbitDeterminationPropagatorBuilder[] propagatorBuilders,
final List<ObservedMeasurement<?>> measurements,
final ParameterDriversList estimatedMeasurementsParameters,
final AbstractJacobiansMapper[] mappers,
final ModelObserver observer) {
this.builders = propagatorBuilders.clone();
......@@ -133,7 +153,7 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
this.estimatedPropagationParameters = new ParameterDriversList[builders.length];
this.evaluations = new IdentityHashMap<>(measurements.size());
this.observer = observer;
this.mappers = mappers.clone();
this.harvesters = new MatricesHarvester[builders.length];
// allocate vector and matrix
int rows = 0;
......@@ -225,21 +245,33 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
return forwardPropagation;
}
/** Configure the propagator to compute derivatives.
* @param propagators {@link Propagator} to configure
* @return harvester harvester to retrive the State Transition Matrix and Jacobian Matrix
*/
protected MatricesHarvester configureHarvester(final Propagator propagators) {
// FIXME: this default implementation is only intended for version 11.1 to delegate to a deprecated method
// it should be removed in 12.0 when configureDerivatives is removed
return configureDerivatives(propagators);
}
/** Configure the propagator to compute derivatives.
* @param propagators {@link Propagator} to configure
* @return mapper for this propagator
* @deprecated as of 11.1, replaced by {@link #configureHarvester(Propagator)}
*/
@Deprecated
protected abstract AbstractJacobiansMapper configureDerivatives(Propagator propagators);
/** Configure the current estimated orbits.
* <p>
* For DSST orbit determination, short period derivatives are also calculated.
* </p>
* @param mapper Jacobian mapper
* @param harvester harvester for matrices
* @param propagator the orbit propagator
* @return the current estimated orbits
*/
protected abstract Orbit configureOrbits(AbstractJacobiansMapper mapper, Propagator propagator);
protected abstract Orbit configureOrbits(MatricesHarvester harvester, Propagator propagator);
/** {@inheritDoc} */
@Override
......@@ -249,8 +281,8 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
final Propagator[] propagators = createPropagators(point);
final Orbit[] orbits = new Orbit[propagators.length];
for (int i = 0; i < propagators.length; ++i) {
mappers[i] = configureDerivatives(propagators[i]);
orbits[i] = configureOrbits(mappers[i], propagators[i]);
harvesters[i] = configureHarvester(propagators[i]);
orbits[i] = configureOrbits(harvesters[i], propagators[i]);
}
final PropagatorsParallelizer parallelizer =
new PropagatorsParallelizer(Arrays.asList(propagators), configureMeasurements(point));
......@@ -387,7 +419,7 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
final RealMatrix dMdY = dMdC.multiply(dCdY);
// Jacobian of the measurement with respect to initial orbital state
final RealMatrix dYdY0 = mappers[p].getStateTransitionMatrix(evaluationStates[k]);
final RealMatrix dYdY0 = harvesters[p].getStateTransitionMatrix(evaluationStates[k]);
final RealMatrix dMdY0 = dMdY.multiply(dYdY0);
for (int i = 0; i < dMdY0.getRowDimension(); ++i) {
int jOrb = orbitsStartColumns[p];
......@@ -404,7 +436,7 @@ public abstract class AbstractBatchLSModel implements MultivariateJacobianFuncti
final ParameterDriversList selectedPropagationDrivers = getSelectedPropagationDriversForBuilder(p);
final int nbParams = selectedPropagationDrivers.getNbParams();
if (nbParams > 0) {
final RealMatrix dYdPp = mappers[p].getParametersJacobian(evaluationStates[k]);
final RealMatrix dYdPp = harvesters[p].getParametersJacobian(evaluationStates[k]);
final RealMatrix dMdPp = dMdY.multiply(dYdPp);
for (int i = 0; i < dMdPp.getRowDimension(); ++i) {
for (int j = 0; j < nbParams; ++j) {
......
......@@ -20,10 +20,10 @@ import java.util.List;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.orbits.Orbit;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.propagation.numerical.JacobiansMapper;
import org.orekit.propagation.numerical.NumericalPropagator;
import org.orekit.propagation.numerical.PartialDerivatives;
......@@ -37,6 +37,9 @@ import org.orekit.utils.ParameterDriversList;
*/
public class BatchLSModel extends AbstractBatchLSModel {
/** Name of the State Transition Matrix state. */
private final String STM_NAME = BatchLSModel.class.getName() + "-derivatives";
/** Simple constructor.
* @param propagatorBuilders builders to use for propagation
* @param measurements measurements
......@@ -48,17 +51,15 @@ public class BatchLSModel extends AbstractBatchLSModel {
final ParameterDriversList estimatedMeasurementsParameters,
final ModelObserver observer) {
// call super constructor
super(propagatorBuilders, measurements, estimatedMeasurementsParameters,
new JacobiansMapper[propagatorBuilders.length], observer);
super(propagatorBuilders, measurements, estimatedMeasurementsParameters, observer);
}
/** {@inheritDoc} */
@Override
@Deprecated
protected JacobiansMapper configureDerivatives(final Propagator propagator) {
final String equationName = BatchLSModel.class.getName() + "-derivatives";
final PartialDerivatives partials = new PartialDerivatives(equationName, (NumericalPropagator) propagator);
final PartialDerivatives partials = new PartialDerivatives(STM_NAME, (NumericalPropagator) propagator);
// add the derivatives to the initial state
final SpacecraftState rawState = propagator.getInitialState();
......@@ -71,8 +72,7 @@ public class BatchLSModel extends AbstractBatchLSModel {
/** {@inheritDoc} */
@Override
protected Orbit configureOrbits(final AbstractJacobiansMapper mapper,
final Propagator propagator) {
protected Orbit configureOrbits(final MatricesHarvester harvester, final Propagator propagator) {
// Directly return the propagator's initial state
return propagator.getInitialState().getOrbit();
}
......
......@@ -20,11 +20,11 @@ import java.util.List;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.orbits.Orbit;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.propagation.semianalytical.dsst.DSSTJacobiansMapper;
import org.orekit.propagation.semianalytical.dsst.DSSTPartialDerivatives;
import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
......@@ -65,14 +65,14 @@ public class DSSTBatchLSModel extends AbstractBatchLSModel {
final PropagationType propagationType,
final PropagationType stateType) {
// call super constructor
super(propagatorBuilders, measurements, estimatedMeasurementsParameters,
new DSSTJacobiansMapper[propagatorBuilders.length], observer);
super(propagatorBuilders, measurements, estimatedMeasurementsParameters, observer);
this.propagationType = propagationType;
this.stateType = stateType;
}
/** {@inheritDoc} */
@Override
@Deprecated
protected DSSTJacobiansMapper configureDerivatives(final Propagator propagator) {
final String equationName = DSSTBatchLSModel.class.getName() + "-derivatives";
......@@ -90,8 +90,7 @@ public class DSSTBatchLSModel extends AbstractBatchLSModel {
/** {@inheritDoc} */
@Override
protected Orbit configureOrbits(final AbstractJacobiansMapper mapper,
final Propagator propagator) {
protected Orbit configureOrbits(final MatricesHarvester harvester, final Propagator propagator) {
// Cast
final DSSTPropagator dsstPropagator = (DSSTPropagator) propagator;
// Mean orbit
......@@ -99,7 +98,7 @@ public class DSSTBatchLSModel extends AbstractBatchLSModel {
DSSTPropagator.computeMeanState(dsstPropagator.getInitialState(), dsstPropagator.getAttitudeProvider(), dsstPropagator.getAllForceModels()) :
dsstPropagator.getInitialState();
// Compute short period derivatives at the beginning of the iteration
mapper.setReferenceState(initial);
harvester.setReferenceState(initial);
return initial.getOrbit();
}
......
......@@ -20,13 +20,13 @@ import java.util.List;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.orbits.Orbit;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.tle.TLEJacobiansMapper;
import org.orekit.propagation.analytical.tle.TLEPartialDerivativesEquations;
import org.orekit.propagation.analytical.tle.TLEPropagator;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.utils.ParameterDriversList;
/** Bridge between {@link ObservedMeasurement measurements} and {@link
......@@ -55,12 +55,12 @@ public class TLEBatchLSModel extends AbstractBatchLSModel {
final ParameterDriversList estimatedMeasurementsParameters,
final ModelObserver observer) {
// call super constructor
super(propagatorBuilders, measurements, estimatedMeasurementsParameters,
new TLEJacobiansMapper[propagatorBuilders.length], observer);
super(propagatorBuilders, measurements, estimatedMeasurementsParameters, observer);
}
/** {@inheritDoc} */
@Override
@Deprecated
protected TLEJacobiansMapper configureDerivatives(final Propagator propagator) {
final String equationName = TLEBatchLSModel.class.getName() + "-derivatives";
......@@ -78,8 +78,7 @@ public class TLEBatchLSModel extends AbstractBatchLSModel {
/** {@inheritDoc} */
@Override
protected Orbit configureOrbits(final AbstractJacobiansMapper mapper,
final Propagator propagator) {
protected Orbit configureOrbits(final MatricesHarvester harvester, final Propagator propagator) {
// Directly return the propagator's initial state
return propagator.getInitialState().getOrbit();
}
......
......@@ -40,6 +40,7 @@ import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.estimation.measurements.modifiers.DynamicOutlierFilter;
import org.orekit.orbits.Orbit;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
......@@ -98,8 +99,8 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
/** Scaling factors. */
private final double[] scale;
/** Mappers for extracting Jacobians from integrated states. */
private AbstractJacobiansMapper[] mappers;
/** Harvesters for extracting Jacobians from integrated states. */
private MatricesHarvester[] harvesters;
/** Propagators for the reference trajectories, up to current date. */
private Propagator[] referenceTrajectories;
......@@ -141,15 +142,15 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
* @param covarianceMatricesProviders providers for covariance matrices
* @param estimatedMeasurementParameters measurement parameters to estimate
* @param measurementProcessNoiseMatrix provider for measurement process noise matrix
* @param mappers mappers for extracting Jacobians from integrated states
* @param harvesters harvesters for extracting Jacobians from integrated states
*/
protected AbstractKalmanModel(final List<OrbitDeterminationPropagatorBuilder> propagatorBuilders,
final List<CovarianceMatrixProvider> covarianceMatricesProviders,
final ParameterDriversList estimatedMeasurementParameters,
final CovarianceMatrixProvider measurementProcessNoiseMatrix,
final AbstractJacobiansMapper[] mappers) {
final MatricesHarvester[] harvesters) {
this(propagatorBuilders, covarianceMatricesProviders, estimatedMeasurementParameters,
measurementProcessNoiseMatrix, mappers, PropagationType.MEAN, PropagationType.MEAN);
measurementProcessNoiseMatrix, harvesters, PropagationType.MEAN, PropagationType.MEAN);
}
/** Kalman process model constructor (package private).
......@@ -159,7 +160,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
* @param covarianceMatricesProviders providers for covariance matrices
* @param estimatedMeasurementParameters measurement parameters to estimate
* @param measurementProcessNoiseMatrix provider for measurement process noise matrix
* @param mappers mappers for extracting Jacobians from integrated states
* @param harvesters harvesters for extracting Jacobians from integrated states
* @param propagationType type of the orbit used for the propagation (mean or osculating), applicable only for DSST
* @param stateType type of the elements used to define the orbital state (mean or osculating), applicable only for DSST
*/
......@@ -167,7 +168,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
final List<CovarianceMatrixProvider> covarianceMatricesProviders,
final ParameterDriversList estimatedMeasurementParameters,
final CovarianceMatrixProvider measurementProcessNoiseMatrix,
final AbstractJacobiansMapper[] mappers,
final MatricesHarvester[] harvesters,
final PropagationType propagationType,
final PropagationType stateType) {
......@@ -285,7 +286,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
}
// Build the reference propagators and add their partial derivatives equations implementation
this.mappers = mappers.clone();
this.harvesters = harvesters.clone();
updateReferenceTrajectories(getEstimatedPropagators(), propagationType, stateType);
this.predictedSpacecraftStates = new SpacecraftState[referenceTrajectories.length];
for (int i = 0; i < predictedSpacecraftStates.length; ++i) {
......@@ -691,10 +692,10 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
for (int k = 0; k < predictedSpacecraftStates.length; ++k) {
// Reset reference (for example compute short periodic terms in DSST)
mappers[k].setReferenceState(predictedSpacecraftStates[k]);
harvesters[k].setReferenceState(predictedSpacecraftStates[k]);
// Derivatives of the state vector with respect to initial state vector
final RealMatrix dYdY0 = mappers[k].getStateTransitionMatrix(predictedSpacecraftStates[k]);
final RealMatrix dYdY0 = harvesters[k].getStateTransitionMatrix(predictedSpacecraftStates[k]);
// Fill upper left corner (dY/dY0)
final List<ParameterDriversList.DelegatingDriver> drivers =
......@@ -713,7 +714,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
// Derivatives of the state vector with respect to propagation parameters
final int nbParams = estimatedPropagationParameters[k].getNbParams();
if (nbParams > 0) {
final RealMatrix dYdPp = mappers[k].getParametersJacobian(predictedSpacecraftStates[k]);
final RealMatrix dYdPp = harvesters[k].getParametersJacobian(predictedSpacecraftStates[k]);
// Fill 1st row, 2nd column (dY/dPp)
for (int i = 0; i < dYdPp.getRowDimension(); ++i) {
......@@ -797,7 +798,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
// Jacobian of the measurement with respect to propagation parameters
final int nbParams = estimatedPropagationParameters[p].getNbParams();
if (nbParams > 0) {
final RealMatrix dYdPp = mappers[p].getParametersJacobian(evaluationStates[k]);
final RealMatrix dYdPp = harvesters[p].getParametersJacobian(evaluationStates[k]);
final RealMatrix dMdPp = dMdY.multiply(dYdPp);
for (int i = 0; i < dMdPp.getRowDimension(); ++i) {
for (int j = 0; j < nbParams; ++j) {
......@@ -1164,16 +1165,28 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
/** Getter for the jacobian mappers.
* @return the jacobian mappers
* @deprecated as of 11.1, not used anymore
*/
@Deprecated
public AbstractJacobiansMapper[] getMappers() {
return mappers.clone();
return null;
}
/** Setter for the jacobian mappers.
* @param mappers the jacobian mappers to set
* @deprecated as of 11.1, replaced by {@ #setHarvesters(MatricesHarvester[])}
*/
@Deprecated
public void setMappers(final AbstractJacobiansMapper[] mappers) {
this.mappers = mappers.clone();
setHarvesters(mappers);
}
/** Setter for the jacobian harvesters.
* @param harvesters the jacobian harvesters to set
* @since 11.1
*/
public void setHarvesters(final MatricesHarvester[] harvesters) {
this.harvesters = harvesters.clone();
}
/** Get the propagators estimated with the values set in the propagators builders.
......
......@@ -18,11 +18,11 @@ package org.orekit.estimation.sequential;
import java.util.List;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.propagation.semianalytical.dsst.DSSTJacobiansMapper;
import org.orekit.propagation.semianalytical.dsst.DSSTPartialDerivatives;
import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
......@@ -70,7 +70,7 @@ public class DSSTKalmanModel extends AbstractKalmanModel {
setReferenceTrajectories(propagators);
// Jacobian mappers
final AbstractJacobiansMapper[] mappers = getMappers();
final MatricesHarvester[] harvesters = new MatricesHarvester[propagators.length];
for (int k = 0; k < propagators.length; ++k) {
// Link the partial derivatives to this new propagator
......@@ -81,11 +81,11 @@ public class DSSTKalmanModel extends AbstractKalmanModel {
final SpacecraftState rawState = getReferenceTrajectories()[k].getInitialState();
final SpacecraftState stateWithDerivatives = pde.setInitialJacobians(rawState);
((DSSTPropagator) getReferenceTrajectories()[k]).setInitialState(stateWithDerivatives, sType);
mappers[k] = pde.getMapper();
harvesters[k] = pde.getMapper();
}
// Update Jacobian mappers
setMappers(mappers);
// Update Jacobian harvesters
setHarvesters(harvesters);
}
......
......@@ -18,11 +18,11 @@ package org.orekit.estimation.sequential;
import java.util.List;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.propagation.numerical.JacobiansMapper;
import org.orekit.propagation.numerical.NumericalPropagator;
import org.orekit.propagation.numerical.PartialDerivatives;
......@@ -59,8 +59,8 @@ public class KalmanModel extends AbstractKalmanModel {
// Update the reference trajectory propagator
setReferenceTrajectories(propagators);
// Jacobian mappers
final AbstractJacobiansMapper[] mappers = getMappers();
// Jacobian harvesters
final MatricesHarvester[] harvesters = new MatricesHarvester[propagators.length];
for (int k = 0; k < propagators.length; ++k) {
// Link the partial derivatives to this new propagator
......@@ -71,11 +71,11 @@ public class KalmanModel extends AbstractKalmanModel {
final SpacecraftState rawState = getReferenceTrajectories()[k].getInitialState();
final SpacecraftState stateWithDerivatives = pde.setInitialJacobians(rawState);
getReferenceTrajectories()[k].resetInitialState(stateWithDerivatives);
mappers[k] = pde.getMapper();
harvesters[k] = pde.getMapper();
}
// Update Jacobian mappers
setMappers(mappers);
// Update Jacobian harvesters
setHarvesters(harvesters);
}
......
......@@ -19,6 +19,7 @@ package org.orekit.estimation.sequential;
import java.util.List;
import org.orekit.annotation.DefaultDataContext;
import org.orekit.propagation.MatricesHarvester;
import org.orekit.propagation.PropagationType;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
......@@ -26,7 +27,6 @@ import org.orekit.propagation.analytical.tle.TLEJacobiansMapper;
import org.orekit.propagation.analytical.tle.TLEPartialDerivativesEquations;
import org.orekit.propagation.analytical.tle.TLEPropagator;
import org.orekit.propagation.conversion.OrbitDeterminationPropagatorBuilder;
import org.orekit.propagation.integration.AbstractJacobiansMapper;
import org.orekit.utils.ParameterDriversList;
/** Class defining the process model dynamics to use with a {@link KalmanEstimator}.
......@@ -67,8 +67,8 @@ public class TLEKalmanModel extends AbstractKalmanModel {
// Update the reference trajectory propagator
setReferenceTrajectories(propagators);
// Jacobian mappers
final AbstractJacobiansMapper[] mappers = getMappers();
// Jacobian harvesters
final MatricesHarvester[] harvesters = new MatricesHarvester[propagators.length];
for (int k = 0; k < propagators.length; ++k) {
// Link the partial derivatives to this new propagator
......@@ -79,11 +79,11 @@ public class TLEKalmanModel extends AbstractKalmanModel {
final SpacecraftState rawState = getReferenceTrajectories()[k].getInitialState();
final SpacecraftState stateWithDerivatives = pde.setInitialJacobians(rawState);
((TLEPropagator) getReferenceTrajectories()[k]).resetInitialState(stateWithDerivatives);
mappers[k] = pde.getMapper();
harvesters[k] = pde.getMapper();
}
// Update Jacobian mappers
setMappers(mappers);
// Update Jacobian harvesters
setHarvesters(harvesters);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment