From 6ef9197d72e5a9585746af987910cc24c1139651 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Thu, 6 Jun 2024 13:51:45 -0600 Subject: [PATCH] Move data from RK4SimulationStatus to RK4SimulationStepper.DataStore and eliminate RK4SimulationStatus --- .../core/simulation/RK4SimulationStatus.java | 68 ------------------- .../core/simulation/RK4SimulationStepper.java | 52 +++++++------- .../core/simulation/SimulationStatus.java | 2 +- 3 files changed, 30 insertions(+), 92 deletions(-) delete mode 100644 core/src/main/java/info/openrocket/core/simulation/RK4SimulationStatus.java diff --git a/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStatus.java b/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStatus.java deleted file mode 100644 index dc41584d2..000000000 --- a/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStatus.java +++ /dev/null @@ -1,68 +0,0 @@ -package info.openrocket.core.simulation; - -import info.openrocket.core.models.atmosphere.AtmosphericConditions; -import info.openrocket.core.rocketcomponent.FlightConfiguration; -import info.openrocket.core.util.Coordinate; - -public class RK4SimulationStatus extends SimulationStatus implements Cloneable { - private Coordinate launchRodDirection; - - private double previousAcceleration = 0; - - // Used for determining when to store aerodynamic computation warnings: - private double maxZVelocity = 0; - private double startWarningTime = -1; - - public RK4SimulationStatus(FlightConfiguration configuration, - SimulationConditions simulationConditions ) { - super(configuration, simulationConditions); - } - - public RK4SimulationStatus(SimulationStatus other) { - super(other); - if (other instanceof RK4SimulationStatus) { - this.launchRodDirection = ((RK4SimulationStatus) other).launchRodDirection; - this.previousAcceleration = ((RK4SimulationStatus) other).previousAcceleration; - this.maxZVelocity = ((RK4SimulationStatus) other).maxZVelocity; - this.startWarningTime = ((RK4SimulationStatus) other).startWarningTime; - } - } - - public void setLaunchRodDirection(Coordinate launchRodDirection) { - this.launchRodDirection = launchRodDirection; - } - - public Coordinate getLaunchRodDirection() { - return launchRodDirection; - } - - public double getPreviousAcceleration() { - return previousAcceleration; - } - - public void setPreviousAcceleration(double previousAcceleration) { - this.previousAcceleration = previousAcceleration; - } - - public double getMaxZVelocity() { - return maxZVelocity; - } - - public void setMaxZVelocity(double maxZVelocity) { - this.maxZVelocity = maxZVelocity; - } - - public double getStartWarningTime() { - return startWarningTime; - } - - public void setStartWarningTime(double startWarningTime) { - this.startWarningTime = startWarningTime; - } - - @Override - public RK4SimulationStatus clone() { - return (RK4SimulationStatus) super.clone(); - } - -} diff --git a/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStepper.java b/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStepper.java index b0a3fc465..eb0eb355c 100644 --- a/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStepper.java +++ b/core/src/main/java/info/openrocket/core/simulation/RK4SimulationStepper.java @@ -63,18 +63,18 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { DataStore store = new DataStore(); @Override - public RK4SimulationStatus initialize(SimulationStatus original) { + public SimulationStatus initialize(SimulationStatus original) { - RK4SimulationStatus status = new RK4SimulationStatus(original); + SimulationStatus status = new SimulationStatus(original); // Copy the existing warnings status.setWarnings(original.getWarnings()); SimulationConditions sim = original.getSimulationConditions(); - - status.setLaunchRodDirection(new Coordinate( - Math.sin(sim.getLaunchRodAngle()) * Math.cos(Math.PI / 2.0 - sim.getLaunchRodDirection()), - Math.sin(sim.getLaunchRodAngle()) * Math.sin(Math.PI / 2.0 - sim.getLaunchRodDirection()), - Math.cos(sim.getLaunchRodAngle()))); + + store.launchRodDirection = new Coordinate( + Math.sin(sim.getLaunchRodAngle()) * Math.cos(Math.PI / 2.0 - sim.getLaunchRodDirection()), + Math.sin(sim.getLaunchRodAngle()) * Math.sin(Math.PI / 2.0 - sim.getLaunchRodDirection()), + Math.cos(sim.getLaunchRodAngle())); this.random = new Random(original.getSimulationConditions().getRandomSeed() ^ SEED_RANDOMIZATION); @@ -87,11 +87,11 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { @Override public void step(SimulationStatus simulationStatus, double maxTimeStep) throws SimulationException { - RK4SimulationStatus status = (RK4SimulationStatus) simulationStatus; + SimulationStatus status = simulationStatus; //////// Perform RK4 integration: //////// - RK4SimulationStatus status2; + SimulationStatus status2; RK4Parameters k1, k2, k3, k4; /* @@ -257,7 +257,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { - private RK4Parameters computeParameters(RK4SimulationStatus status, DataStore dataStore) + private RK4Parameters computeParameters(SimulationStatus status, DataStore dataStore) throws SimulationException { RK4Parameters params = new RK4Parameters(); @@ -296,7 +296,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { * @param status the status of the rocket. * @throws SimulationException */ - private AccelerationData calculateAcceleration(RK4SimulationStatus status, DataStore store) throws SimulationException { + private AccelerationData calculateAcceleration(SimulationStatus status, DataStore store) throws SimulationException { // Compute the forces affecting the rocket calculateForces(status, store); @@ -349,8 +349,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { // set angular acceleration to zero. if (!status.isLaunchRodCleared()) { - store.linearAcceleration = status.getLaunchRodDirection().multiply( - store.linearAcceleration.dot(status.getLaunchRodDirection())); + store.linearAcceleration = store.launchRodDirection.multiply(store.linearAcceleration.dot(store.launchRodDirection)); store.angularAcceleration = Coordinate.NUL; store.rollAcceleration = 0; store.lateralPitchAcceleration = 0; @@ -391,7 +390,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { * Calculate the aerodynamic forces into the data store. This method also handles * whether to include aerodynamic computation warnings or not. */ - private void calculateForces(RK4SimulationStatus status, DataStore store) throws SimulationException { + private void calculateForces(SimulationStatus status, DataStore store) throws SimulationException { // Call pre-listeners store.forces = SimulationListenerHelper.firePreAerodynamicCalculation(status); @@ -408,19 +407,21 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { * below 20% of the max. velocity. */ WarningSet warnings = status.getWarnings(); - status.setMaxZVelocity(MathUtil.max(status.getMaxZVelocity(), status.getRocketVelocity().z)); + store.maxZvelocity = MathUtil.max(store.maxZvelocity, status.getRocketVelocity().z); if (!status.isLaunchRodCleared()) { warnings = null; } else { - if (status.getRocketVelocity().z < 0.2 * status.getMaxZVelocity()) + if (status.getRocketVelocity().z < 0.2 * store.maxZvelocity) { warnings = null; - if (status.getStartWarningTime() < 0) - status.setStartWarningTime(status.getSimulationTime() + 0.25); + } + if (Double.isNaN(store.startWarningTime)) { + store.startWarningTime = status.getSimulationTime() + 0.25; + } } - if (status.getSimulationTime() < status.getStartWarningTime()) + + if (!(status.getSimulationTime() > store.startWarningTime)) warnings = null; - // Calculate aerodynamic forces store.forces = status.getSimulationConditions().getAerodynamicCalculator() @@ -446,7 +447,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { * Additionally the fields thetaRotation and lateralPitchRate are defined in * the data store, and can be used after calling this method. */ - private void calculateFlightConditions(RK4SimulationStatus status, DataStore store) + private void calculateFlightConditions(SimulationStatus status, DataStore store) throws SimulationException { // Call pre listeners, allow complete override @@ -554,6 +555,11 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { public Coordinate linearAcceleration; public Coordinate angularAcceleration; + + public Coordinate launchRodDirection = null; + + public double maxZvelocity = Double.NaN; + public double startWarningTime = Double.NaN; // set by calculateFlightConditions and calculateAcceleration: public AerodynamicForces forces; @@ -567,8 +573,8 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { public double lateralPitchAcceleration = Double.NaN; public Rotation2D thetaRotation; - - void storeData(RK4SimulationStatus status) { + + void storeData(SimulationStatus status) { FlightDataBranch dataBranch = status.getFlightDataBranch(); diff --git a/core/src/main/java/info/openrocket/core/simulation/SimulationStatus.java b/core/src/main/java/info/openrocket/core/simulation/SimulationStatus.java index cb5dd3110..953becf09 100644 --- a/core/src/main/java/info/openrocket/core/simulation/SimulationStatus.java +++ b/core/src/main/java/info/openrocket/core/simulation/SimulationStatus.java @@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory; * @author Sampo Niskanen */ -public class SimulationStatus implements Monitorable { +public class SimulationStatus implements Cloneable, Monitorable { private static final Logger log = LoggerFactory.getLogger(BasicEventSimulationEngine.class);