diff --git a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java index f6fe081a0..48b848937 100644 --- a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java +++ b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java @@ -70,8 +70,14 @@ public class BasicLandingStepper extends AbstractSimulationStepper { // Select tentative time step - double timeStep = MathUtil.min(0.5 / linearAcceleration.length(), RECOVERY_TIME_STEP); - + double timeStep = RECOVERY_TIME_STEP; + + // adjust based on change in acceleration (ie jerk) + final double jerk = linearAcceleration.sub(status.getRocketAcceleration()).multiply(1.0/status.getPreviousTimeStep()).length(); + if (jerk > MathUtil.EPSILON) { + timeStep = Math.min(timeStep, 1.0/jerk); + } + // Perform Euler integration Coordinate newPosition = status.getRocketPosition().add(status.getRocketVelocity().multiply(timeStep)). add(linearAcceleration.multiply(MathUtil.pow2(timeStep) / 2)); @@ -94,12 +100,12 @@ public class BasicLandingStepper extends AbstractSimulationStepper { newPosition = newPosition.setZ(0); } - status.setRocketPosition(newPosition); - - status.setRocketVelocity(status.getRocketVelocity().add(linearAcceleration.multiply(timeStep))); - airSpeed = status.getRocketVelocity().add(windSpeed); status.setSimulationTime(status.getSimulationTime() + timeStep); - + status.setPreviousTimeStep(timeStep); + + status.setRocketPosition(newPosition); + status.setRocketVelocity(status.getRocketVelocity().add(linearAcceleration.multiply(timeStep))); + status.setRocketAcceleration(linearAcceleration); // Update the world coordinate WorldCoordinate w = status.getSimulationConditions().getLaunchSite(); @@ -116,6 +122,8 @@ public class BasicLandingStepper extends AbstractSimulationStepper { data.setValue(FlightDataType.TYPE_ALTITUDE, status.getRocketPosition().z); data.setValue(FlightDataType.TYPE_POSITION_X, status.getRocketPosition().x); data.setValue(FlightDataType.TYPE_POSITION_Y, status.getRocketPosition().y); + + airSpeed = status.getRocketVelocity().add(windSpeed); if (extra) { data.setValue(FlightDataType.TYPE_POSITION_XY, MathUtil.hypot(status.getRocketPosition().x, status.getRocketPosition().y)); diff --git a/core/src/net/sf/openrocket/simulation/SimulationStatus.java b/core/src/net/sf/openrocket/simulation/SimulationStatus.java index 6618fefea..f3457b532 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationStatus.java +++ b/core/src/net/sf/openrocket/simulation/SimulationStatus.java @@ -46,6 +46,7 @@ public class SimulationStatus implements Monitorable { private Coordinate position; private WorldCoordinate worldPosition; private Coordinate velocity; + private Coordinate acceleration; private Quaternion orientation; private Coordinate rotationVelocity; @@ -105,6 +106,7 @@ public class SimulationStatus implements Monitorable { this.position = this.simulationConditions.getLaunchPosition(); this.velocity = this.simulationConditions.getLaunchVelocity(); this.worldPosition = this.simulationConditions.getLaunchSite(); + this.acceleration = Coordinate.ZERO; // Initialize to roll angle with least stability w.r.t. the wind Quaternion o; @@ -175,6 +177,7 @@ public class SimulationStatus implements Monitorable { this.time = orig.time; this.previousTimeStep = orig.previousTimeStep; this.position = orig.position; + this.acceleration = orig.acceleration; this.worldPosition = orig.worldPosition; this.velocity = orig.velocity; this.orientation = orig.orientation; @@ -300,7 +303,15 @@ public class SimulationStatus implements Monitorable { public Coordinate getRocketVelocity() { return velocity; } + + public void setRocketAcceleration(Coordinate acceleration) { + this.acceleration = acceleration; + this.modID++; + } + public Coordinate getRocketAcceleration() { + return acceleration; + } public boolean moveBurntOutMotor( final MotorConfigurationId motor) { // get motor from normal list diff --git a/swing/resources-src/datafiles/components b/swing/resources-src/datafiles/components index 8304c0fd3..860757167 160000 --- a/swing/resources-src/datafiles/components +++ b/swing/resources-src/datafiles/components @@ -1 +1 @@ -Subproject commit 8304c0fd3dc80d65c40af4da83268ec1b32931d6 +Subproject commit 860757167c4835a7bb960a4cbb52b06f3309791c diff --git a/swing/resources/datafiles/examples/A simple model rocket.ork b/swing/resources/datafiles/examples/A simple model rocket.ork index 42aa47599..b20c1d91e 100644 Binary files a/swing/resources/datafiles/examples/A simple model rocket.ork and b/swing/resources/datafiles/examples/A simple model rocket.ork differ diff --git a/swing/resources/datafiles/examples/Apocalypse with decals.ork b/swing/resources/datafiles/examples/Apocalypse with decals.ork index ae41a958a..64ae40e2c 100644 Binary files a/swing/resources/datafiles/examples/Apocalypse with decals.ork and b/swing/resources/datafiles/examples/Apocalypse with decals.ork differ diff --git a/swing/resources/datafiles/examples/Boosted Dart.ork b/swing/resources/datafiles/examples/Boosted Dart.ork index 18e755700..b56c868d6 100644 Binary files a/swing/resources/datafiles/examples/Boosted Dart.ork and b/swing/resources/datafiles/examples/Boosted Dart.ork differ diff --git a/swing/resources/datafiles/examples/Clustered rocket design.ork b/swing/resources/datafiles/examples/Clustered rocket design.ork index 21785f0b1..6cc2f28c9 100644 Binary files a/swing/resources/datafiles/examples/Clustered rocket design.ork and b/swing/resources/datafiles/examples/Clustered rocket design.ork differ diff --git a/swing/resources/datafiles/examples/High Power Airstart.ork b/swing/resources/datafiles/examples/High Power Airstart.ork index 63289e6e4..479880efb 100644 Binary files a/swing/resources/datafiles/examples/High Power Airstart.ork and b/swing/resources/datafiles/examples/High Power Airstart.ork differ diff --git a/swing/resources/datafiles/examples/Hybrid rocket with dual parachute deployment.ork b/swing/resources/datafiles/examples/Hybrid rocket with dual parachute deployment.ork index 267d5d2d8..574c89c57 100644 Binary files a/swing/resources/datafiles/examples/Hybrid rocket with dual parachute deployment.ork and b/swing/resources/datafiles/examples/Hybrid rocket with dual parachute deployment.ork differ diff --git a/swing/resources/datafiles/examples/Parallel Staging Example.ork b/swing/resources/datafiles/examples/Parallel Staging Example.ork index 83ddb6d26..964b44145 100644 Binary files a/swing/resources/datafiles/examples/Parallel Staging Example.ork and b/swing/resources/datafiles/examples/Parallel Staging Example.ork differ diff --git a/swing/resources/datafiles/examples/Pods Example.ork b/swing/resources/datafiles/examples/Pods Example.ork index 813eaa39f..1d0d3f7fc 100644 Binary files a/swing/resources/datafiles/examples/Pods Example.ork and b/swing/resources/datafiles/examples/Pods Example.ork differ diff --git a/swing/resources/datafiles/examples/Preset Usage.ork b/swing/resources/datafiles/examples/Preset Usage.ork index 358f2f079..afb1cfb00 100644 Binary files a/swing/resources/datafiles/examples/Preset Usage.ork and b/swing/resources/datafiles/examples/Preset Usage.ork differ diff --git a/swing/resources/datafiles/examples/Roll-stabilized rocket.ork b/swing/resources/datafiles/examples/Roll-stabilized rocket.ork index 4d7d84a03..f89cb43e5 100644 Binary files a/swing/resources/datafiles/examples/Roll-stabilized rocket.ork and b/swing/resources/datafiles/examples/Roll-stabilized rocket.ork differ diff --git a/swing/resources/datafiles/examples/TARC Payloader.ork b/swing/resources/datafiles/examples/TARC Payloader.ork index 2d9ecbf0f..a62d4a8a1 100644 Binary files a/swing/resources/datafiles/examples/TARC Payloader.ork and b/swing/resources/datafiles/examples/TARC Payloader.ork differ diff --git a/swing/resources/datafiles/examples/Three-stage rocket.ork b/swing/resources/datafiles/examples/Three-stage rocket.ork index 04deb759c..c0eaee3f8 100644 Binary files a/swing/resources/datafiles/examples/Three-stage rocket.ork and b/swing/resources/datafiles/examples/Three-stage rocket.ork differ diff --git a/swing/resources/datafiles/examples/Tube Fin.ork b/swing/resources/datafiles/examples/Tube Fin.ork index 211b210b3..3274143a1 100644 Binary files a/swing/resources/datafiles/examples/Tube Fin.ork and b/swing/resources/datafiles/examples/Tube Fin.ork differ