Make store persistent instead of creating a new one every step()

Use timestep remaining in store instead of getPreviousTimeStep() and setPreviousTimeStep()
This commit is contained in:
JoePfeiffer 2023-09-23 14:19:59 -06:00
parent c5dd5de96b
commit faa7c03308

View File

@ -59,9 +59,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
private static final double MAX_PITCH_CHANGE = 4 * Math.PI / 180; private static final double MAX_PITCH_CHANGE = 4 * Math.PI / 180;
private Random random; private Random random;
DataStore store = new DataStore();
@Override @Override
public RK4SimulationStatus initialize(SimulationStatus original) { public RK4SimulationStatus initialize(SimulationStatus original) {
@ -90,28 +88,26 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
public void step(SimulationStatus simulationStatus, double maxTimeStep) throws SimulationException { public void step(SimulationStatus simulationStatus, double maxTimeStep) throws SimulationException {
RK4SimulationStatus status = (RK4SimulationStatus) simulationStatus; RK4SimulationStatus status = (RK4SimulationStatus) simulationStatus;
DataStore store = new DataStore();
//////// Perform RK4 integration: //////// //////// Perform RK4 integration: ////////
RK4SimulationStatus status2; RK4SimulationStatus status2;
RK4Parameters k1, k2, k3, k4; RK4Parameters k1, k2, k3, k4;
/* /*
* Start with previous time step which is used to compute the initial thrust estimate. * Start with previous time step which is used to compute the initial thrust estimate.
* Don't make it longer than maxTimeStep, but at least MIN_TIME_STEP. * Don't make it longer than maxTimeStep, but at least MIN_TIME_STEP.
*/ */
store.timestep = status.getPreviousTimeStep();
store.timestep = MathUtil.max(MathUtil.min(store.timestep, maxTimeStep), MIN_TIME_STEP); store.timestep = MathUtil.max(MathUtil.min(store.timestep, maxTimeStep), MIN_TIME_STEP);
checkNaN(store.timestep); checkNaN(store.timestep);
/* /*
* Compute the initial thrust estimate. This is used for the first time step computation. * Compute the initial thrust estimate. This is used for the first time step computation.
*/ */
store.thrustForce = calculateAverageThrust(status, store.timestep, status.getPreviousAcceleration(), store.thrustForce = calculateAverageThrust(status, store.timestep, store.timestep,
status.getPreviousAtmosphericConditions(), false); status.getPreviousAtmosphericConditions(), false);
/* /*
* Perform RK4 integration. Decide the time step length after the first step. * Perform RK4 integration. Decide the time step length after the first step.
*/ */
@ -150,7 +146,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
dt[0] /= 5.0; dt[0] /= 5.0;
dt[6] = status.getSimulationConditions().getLaunchRodLength() / k1.v.length() / 10; dt[6] = status.getSimulationConditions().getLaunchRodLength() / k1.v.length() / 10;
} }
dt[7] = 1.5 * status.getPreviousTimeStep(); dt[7] = 1.5 * store.timestep;
store.timestep = Double.MAX_VALUE; store.timestep = Double.MAX_VALUE;
int limitingValue = -1; int limitingValue = -1;
@ -261,8 +257,6 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
} }
status.setSimulationTime(status.getSimulationTime() + store.timestep); status.setSimulationTime(status.getSimulationTime() + store.timestep);
status.setPreviousTimeStep(store.timestep);
// Store data // Store data
// TODO: MEDIUM: Store acceleration etc of entire RK4 step, store should be cloned or something... // TODO: MEDIUM: Store acceleration etc of entire RK4 step, store should be cloned or something...
storeData(status, store); storeData(status, store);