Changed the management of the SimulationStatus WarningSet so it is not

copied by the copy constructor.  Management of the warning set is
controlled by the BasicEventSimulationEngine.

Cleaned up some warnings: removed unused includes, changed annotations,
removed unused local variables.
This commit is contained in:
kruland2607 2012-10-25 12:10:28 -05:00
parent ee11816828
commit cda4281475
8 changed files with 52 additions and 53 deletions

View File

@ -1,10 +1,7 @@
package net.sf.openrocket.simulation; package net.sf.openrocket.simulation;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set;
import net.sf.openrocket.aerodynamics.FlightConditions;
import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.Warning;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
@ -14,7 +11,6 @@ import net.sf.openrocket.motor.MotorInstance;
import net.sf.openrocket.motor.MotorInstanceConfiguration; import net.sf.openrocket.motor.MotorInstanceConfiguration;
import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration;
import net.sf.openrocket.rocketcomponent.LaunchLug;
import net.sf.openrocket.rocketcomponent.MotorConfiguration; import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RecoveryDevice;
@ -30,7 +26,6 @@ import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Pair; import net.sf.openrocket.util.Pair;
import net.sf.openrocket.util.Quaternion;
import net.sf.openrocket.util.SimpleStack; import net.sf.openrocket.util.SimpleStack;
@ -66,7 +61,13 @@ public class BasicEventSimulationEngine implements SimulationEngine {
throw new MotorIgnitionException("No motors defined in the simulation."); throw new MotorIgnitionException("No motors defined in the simulation.");
} }
status = new SimulationStatus(configuration, motorConfiguration, simulationConditions, flightData.getWarningSet()); status = new SimulationStatus(configuration, motorConfiguration, simulationConditions);
status.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket()));
{
// main sustainer stage
RocketComponent sustainer = configuration.getRocket().getChild(0);
status.setFlightData( new FlightDataBranch( sustainer.getName(), FlightDataType.TYPE_TIME));
}
stages.add(status); stages.add(status);
SimulationListenerHelper.fireStartSimulation(status); SimulationListenerHelper.fireStartSimulation(status);
@ -82,6 +83,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
status = stageStatus; status = stageStatus;
FlightDataBranch dataBranch = simulateLoop(); FlightDataBranch dataBranch = simulateLoop();
flightData.addBranch(dataBranch); flightData.addBranch(dataBranch);
flightData.getWarningSet().addAll( status.getWarnings() );
} }
SimulationListenerHelper.fireEndSimulation(status, null); SimulationListenerHelper.fireEndSimulation(status, null);
@ -352,8 +354,6 @@ public class BasicEventSimulationEngine implements SimulationEngine {
case IGNITION: { case IGNITION: {
// Ignite the motor // Ignite the motor
MotorMount mount = (MotorMount) event.getSource();
RocketComponent component = (RocketComponent) mount;
MotorId motorId = (MotorId) event.getData(); MotorId motorId = (MotorId) event.getData();
MotorInstanceConfiguration config = status.getMotorConfiguration(); MotorInstanceConfiguration config = status.getMotorConfiguration();
config.setMotorIgnitionTime(motorId, event.getTime()); config.setMotorIgnitionTime(motorId, event.getTime());
@ -408,8 +408,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// Prepare the booster status for simulation. // Prepare the booster status for simulation.
SimulationStatus boosterStatus = new SimulationStatus(status); SimulationStatus boosterStatus = new SimulationStatus(status);
FlightDataBranch boosterFlightData = new FlightDataBranch( "Stage-" + n, FlightDataType.TYPE_TIME); boosterStatus.setFlightData(new FlightDataBranch( stage.getName(), FlightDataType.TYPE_TIME));
boosterStatus.setFlightData(boosterFlightData);
stages.add(boosterStatus); stages.add(boosterStatus);

View File

@ -52,6 +52,7 @@ public class EventQueue extends PriorityQueue<FlightEvent> implements Monitorabl
return super.remove(o); return super.remove(o);
} }
@Override
public int getModID() { public int getModID() {
return modID; return modID;
} }

View File

@ -226,7 +226,7 @@ public class FlightData {
// Launch rod velocity // Launch rod velocity
eventloop: for (FlightEvent event : branch.getEvents()) { for (FlightEvent event : branch.getEvents()) {
if (event.getType() == FlightEvent.Type.LAUNCHROD) { if (event.getType() == FlightEvent.Type.LAUNCHROD) {
double t = event.getTime(); double t = event.getTime();
List<Double> velocity = branch.get(FlightDataType.TYPE_VELOCITY_TOTAL); List<Double> velocity = branch.get(FlightDataType.TYPE_VELOCITY_TOTAL);

View File

@ -257,7 +257,6 @@ public class FlightDataType implements Comparable<FlightDataType> {
* @param u the unit group the new type should belong to if a new group is created. * @param u the unit group the new type should belong to if a new group is created.
* @return a data type. * @return a data type.
*/ */
@SuppressWarnings("null")
public static synchronized FlightDataType getType(String s, String symbol, UnitGroup u) { public static synchronized FlightDataType getType(String s, String symbol, UnitGroup u) {
// if symbol is null : try finding by name // if symbol is null : try finding by name

View File

@ -1,6 +1,5 @@
package net.sf.openrocket.simulation; package net.sf.openrocket.simulation;
import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
import net.sf.openrocket.motor.MotorInstanceConfiguration; import net.sf.openrocket.motor.MotorInstanceConfiguration;
import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Configuration;
@ -18,8 +17,8 @@ public class RK4SimulationStatus extends SimulationStatus implements Cloneable {
public RK4SimulationStatus(Configuration configuration, public RK4SimulationStatus(Configuration configuration,
MotorInstanceConfiguration motorConfiguration, MotorInstanceConfiguration motorConfiguration,
SimulationConditions simulationConditions, WarningSet warnings) { SimulationConditions simulationConditions ) {
super(configuration, motorConfiguration, simulationConditions, warnings); super(configuration, motorConfiguration, simulationConditions);
} }
public RK4SimulationStatus( SimulationStatus other ) { public RK4SimulationStatus( SimulationStatus other ) {
@ -83,6 +82,7 @@ public class RK4SimulationStatus extends SimulationStatus implements Cloneable {
this.startWarningTime = startWarningTime; this.startWarningTime = startWarningTime;
} }
@Override
public RK4SimulationStatus clone() { public RK4SimulationStatus clone() {
return (RK4SimulationStatus) super.clone(); return (RK4SimulationStatus) super.clone();
} }

View File

@ -67,6 +67,8 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
public RK4SimulationStatus initialize(SimulationStatus original) { public RK4SimulationStatus initialize(SimulationStatus original) {
RK4SimulationStatus status = new RK4SimulationStatus(original); RK4SimulationStatus status = new RK4SimulationStatus(original);
// Copy the existing warnings
status.setWarnings( original.getWarnings() );
SimulationConditions sim = original.getSimulationConditions(); SimulationConditions sim = original.getSimulationConditions();

View File

@ -5,10 +5,8 @@ import java.util.EventListener;
import java.util.EventObject; import java.util.EventObject;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set;
import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.models.atmosphere.AtmosphericModel; import net.sf.openrocket.models.atmosphere.AtmosphericModel;
import net.sf.openrocket.models.atmosphere.ExtendedISAModel; import net.sf.openrocket.models.atmosphere.ExtendedISAModel;
@ -16,7 +14,6 @@ import net.sf.openrocket.models.gravity.GravityModel;
import net.sf.openrocket.models.gravity.WGSGravityModel; import net.sf.openrocket.models.gravity.WGSGravityModel;
import net.sf.openrocket.models.wind.PinkNoiseWindModel; import net.sf.openrocket.models.wind.PinkNoiseWindModel;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.GeodeticComputationStrategy; import net.sf.openrocket.util.GeodeticComputationStrategy;
@ -34,8 +31,6 @@ import net.sf.openrocket.util.WorldCoordinate;
*/ */
public class SimulationOptions implements ChangeSource, Cloneable { public class SimulationOptions implements ChangeSource, Cloneable {
private static final LogHelper log = Application.getLogger();
public static final double MAX_LAUNCH_ROD_ANGLE = Math.PI / 3; public static final double MAX_LAUNCH_ROD_ANGLE = Math.PI / 3;
/** /**

View File

@ -86,40 +86,39 @@ public class SimulationStatus implements Monitorable {
public SimulationStatus( Configuration configuration, public SimulationStatus( Configuration configuration,
MotorInstanceConfiguration motorConfiguration, MotorInstanceConfiguration motorConfiguration,
SimulationConditions simulationConditions, WarningSet warnings ) { SimulationConditions simulationConditions ) {
this.setSimulationConditions(simulationConditions); this.simulationConditions = simulationConditions;
this.setConfiguration(configuration); this.configuration = configuration;
this.setMotorConfiguration(motorConfiguration); this.motorConfiguration = motorConfiguration;
this.setSimulationTime(0); this.time = 0;
this.setPreviousTimeStep(simulationConditions.getTimeStep()); this.previousTimeStep = this.simulationConditions.getTimeStep();
this.setRocketPosition(Coordinate.NUL); this.position = Coordinate.NUL;
this.setRocketVelocity(Coordinate.NUL); this.velocity = Coordinate.NUL;
this.setRocketWorldPosition(simulationConditions.getLaunchSite()); this.worldPosition = this.simulationConditions.getLaunchSite();
// Initialize to roll angle with least stability w.r.t. the wind // Initialize to roll angle with least stability w.r.t. the wind
Quaternion o; Quaternion o;
FlightConditions cond = new FlightConditions(configuration); FlightConditions cond = new FlightConditions(this.configuration);
simulationConditions.getAerodynamicCalculator().getWorstCP(configuration, cond, null); this.simulationConditions.getAerodynamicCalculator().getWorstCP(this.configuration, cond, null);
double angle = -cond.getTheta() - simulationConditions.getLaunchRodDirection(); double angle = -cond.getTheta() - this.simulationConditions.getLaunchRodDirection();
o = Quaternion.rotation(new Coordinate(0, 0, angle)); o = Quaternion.rotation(new Coordinate(0, 0, angle));
// Launch rod angle and direction // Launch rod angle and direction
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, simulationConditions.getLaunchRodAngle(), 0))); o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, this.simulationConditions.getLaunchRodAngle(), 0)));
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, simulationConditions.getLaunchRodDirection()))); o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, this.simulationConditions.getLaunchRodDirection())));
this.setRocketOrientationQuaternion(o);
this.setRocketRotationVelocity(Coordinate.NUL);
this.orientation = o;
this.rotationVelocity = Coordinate.NUL;
/* /*
* Calculate the effective launch rod length taking into account launch lugs. * Calculate the effective launch rod length taking into account launch lugs.
* If no lugs are found, assume a tower launcher of full length. * If no lugs are found, assume a tower launcher of full length.
*/ */
double length = simulationConditions.getLaunchRodLength(); double length = this.simulationConditions.getLaunchRodLength();
double lugPosition = Double.NaN; double lugPosition = Double.NaN;
for (RocketComponent c : configuration) { for (RocketComponent c : this.configuration) {
if (c instanceof LaunchLug) { if (c instanceof LaunchLug) {
double pos = c.toAbsolute(new Coordinate(c.getLength()))[0].x; double pos = c.toAbsolute(new Coordinate(c.getLength()))[0].x;
if (Double.isNaN(lugPosition) || pos > lugPosition) { if (Double.isNaN(lugPosition) || pos > lugPosition) {
@ -129,7 +128,7 @@ public class SimulationStatus implements Monitorable {
} }
if (!Double.isNaN(lugPosition)) { if (!Double.isNaN(lugPosition)) {
double maxX = 0; double maxX = 0;
for (Coordinate c : configuration.getBounds()) { for (Coordinate c : this.configuration.getBounds()) {
if (c.x > maxX) if (c.x > maxX)
maxX = c.x; maxX = c.x;
} }
@ -137,25 +136,27 @@ public class SimulationStatus implements Monitorable {
length = Math.max(0, length - (maxX - lugPosition)); length = Math.max(0, length - (maxX - lugPosition));
} }
} }
this.setEffectiveLaunchRodLength(length); this.effectiveLaunchRodLength = length;
this.setSimulationStartWallTime(System.nanoTime()); this.simulationStartWallTime = System.nanoTime();
this.setMotorIgnited(false); this.motorIgnited = false;
this.setLiftoff(false); this.liftoff = false;
this.setLaunchRodCleared(false); this.launchRodCleared = false;
this.setApogeeReached(false); this.apogeeReached = false;
this.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket())); this.warnings = new WarningSet();
this.setFlightData(new FlightDataBranch("MAIN", FlightDataType.TYPE_TIME));
this.setWarnings(warnings);
} }
/** /**
* Copies the data from the provided object to this object. Most included object are * Performs a deep copy of the on SimulationStatus object.
* deep-cloned, except for the flight data object. * Most included object are deep-cloned, except for the flight data object (which is shallow copied)
* and the WarningSet (which is initialized to a new WarningSet).
* The intention of this constructor is to be used for conversion from one type
* of SimulationStatus to another, or when simulating multiple stages.
* When used for simulating multiple stages, a new FlightDataBranch object
* needs to be associated with the new object.
* *
* @param orig the object from which to copy * @param orig the object from which to copy
*/ */
@ -163,6 +164,7 @@ public class SimulationStatus implements Monitorable {
this.simulationConditions = orig.simulationConditions.clone(); this.simulationConditions = orig.simulationConditions.clone();
this.configuration = orig.configuration.clone(); this.configuration = orig.configuration.clone();
this.motorConfiguration = orig.motorConfiguration.clone(); this.motorConfiguration = orig.motorConfiguration.clone();
// FlightData is not cloned.
this.flightData = orig.flightData; this.flightData = orig.flightData;
this.time = orig.time; this.time = orig.time;
this.previousTimeStep = orig.previousTimeStep; this.previousTimeStep = orig.previousTimeStep;
@ -185,7 +187,8 @@ public class SimulationStatus implements Monitorable {
this.eventQueue.clear(); this.eventQueue.clear();
this.eventQueue.addAll(orig.eventQueue); this.eventQueue.addAll(orig.eventQueue);
this.warnings = orig.warnings; // WarningSet is not cloned.
this.warnings = new WarningSet();
this.extraData.clear(); this.extraData.clear();
this.extraData.putAll(orig.extraData); this.extraData.putAll(orig.extraData);