From 20fa9925cb5f5ed6b5648624945844e3df44fbbe Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Sun, 2 Dec 2018 14:17:33 -0700 Subject: [PATCH] Closes #478 Clarifies variable names Removes previous attempt to limit damping moments by using minimum velocity of 1.0 Clamps damping moments so they cannot exceed actual moments, avoiding numerical instability --- .../aerodynamics/BarrowmanCalculator.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index 6d488852e..bd9ad5fbc 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -712,17 +712,21 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { // Calculate pitch and yaw damping moments double mul = getDampingMultiplier(configuration, conditions, - conditions.getPitchCenter().x); - double pitch = conditions.getPitchRate(); - double yaw = conditions.getYawRate(); - double vel = conditions.getVelocity(); - - vel = MathUtil.max(vel, 1); + conditions.getPitchCenter().x); + double pitchRate = conditions.getPitchRate(); + double yawRate = conditions.getYawRate(); + double velocity = conditions.getVelocity(); mul *= 3; // TODO: Higher damping yields much more realistic apogee turn - total.setPitchDampingMoment(mul * MathUtil.sign(pitch) * pow2(pitch / vel)); - total.setYawDampingMoment(mul * MathUtil.sign(yaw) * pow2(yaw / vel)); + // find magnitude of damping moments, and clamp so they can't + // exceed magnitude of pitch and yaw moments + double pitchDampingMomentMagnitude = MathUtil.min(mul * pow2(pitchRate / velocity), total.getCm()); + double yawDampingMomentMagnitude = MathUtil.min(mul * pow2(yawRate / velocity), total.getCyaw()); + + // multiply by sign of pitch and yaw rates + total.setPitchDampingMoment(MathUtil.sign(pitchRate) * pitchDampingMomentMagnitude); + total.setYawDampingMoment(MathUtil.sign(yawRate) * yawDampingMomentMagnitude); } // TODO: MEDIUM: Are the rotation etc. being added correctly? sin/cos theta?