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;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import net.sf.openrocket.aerodynamics.FlightConditions;
import net.sf.openrocket.aerodynamics.Warning;
import net.sf.openrocket.l10n.Translator;
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.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.DeploymentConfiguration;
import net.sf.openrocket.rocketcomponent.LaunchLug;
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount;
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.MathUtil;
import net.sf.openrocket.util.Pair;
import net.sf.openrocket.util.Quaternion;
import net.sf.openrocket.util.SimpleStack;
@ -66,7 +61,13 @@ public class BasicEventSimulationEngine implements SimulationEngine {
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);
SimulationListenerHelper.fireStartSimulation(status);
@ -82,6 +83,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
status = stageStatus;
FlightDataBranch dataBranch = simulateLoop();
flightData.addBranch(dataBranch);
flightData.getWarningSet().addAll( status.getWarnings() );
}
SimulationListenerHelper.fireEndSimulation(status, null);
@ -352,8 +354,6 @@ public class BasicEventSimulationEngine implements SimulationEngine {
case IGNITION: {
// Ignite the motor
MotorMount mount = (MotorMount) event.getSource();
RocketComponent component = (RocketComponent) mount;
MotorId motorId = (MotorId) event.getData();
MotorInstanceConfiguration config = status.getMotorConfiguration();
config.setMotorIgnitionTime(motorId, event.getTime());
@ -408,8 +408,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// Prepare the booster status for simulation.
SimulationStatus boosterStatus = new SimulationStatus(status);
FlightDataBranch boosterFlightData = new FlightDataBranch( "Stage-" + n, FlightDataType.TYPE_TIME);
boosterStatus.setFlightData(boosterFlightData);
boosterStatus.setFlightData(new FlightDataBranch( stage.getName(), FlightDataType.TYPE_TIME));
stages.add(boosterStatus);

View File

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

View File

@ -226,7 +226,7 @@ public class FlightData {
// Launch rod velocity
eventloop: for (FlightEvent event : branch.getEvents()) {
for (FlightEvent event : branch.getEvents()) {
if (event.getType() == FlightEvent.Type.LAUNCHROD) {
double t = event.getTime();
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.
* @return a data type.
*/
@SuppressWarnings("null")
public static synchronized FlightDataType getType(String s, String symbol, UnitGroup u) {
// if symbol is null : try finding by name

View File

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

View File

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

View File

@ -5,10 +5,8 @@ import java.util.EventListener;
import java.util.EventObject;
import java.util.List;
import java.util.Random;
import java.util.Set;
import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.models.atmosphere.AtmosphericModel;
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.wind.PinkNoiseWindModel;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.GeodeticComputationStrategy;
@ -34,8 +31,6 @@ import net.sf.openrocket.util.WorldCoordinate;
*/
public class SimulationOptions implements ChangeSource, Cloneable {
private static final LogHelper log = Application.getLogger();
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,
MotorInstanceConfiguration motorConfiguration,
SimulationConditions simulationConditions, WarningSet warnings ) {
SimulationConditions simulationConditions ) {
this.setSimulationConditions(simulationConditions);
this.setConfiguration(configuration);
this.setMotorConfiguration(motorConfiguration);
this.simulationConditions = simulationConditions;
this.configuration = configuration;
this.motorConfiguration = motorConfiguration;
this.setSimulationTime(0);
this.setPreviousTimeStep(simulationConditions.getTimeStep());
this.setRocketPosition(Coordinate.NUL);
this.setRocketVelocity(Coordinate.NUL);
this.setRocketWorldPosition(simulationConditions.getLaunchSite());
this.time = 0;
this.previousTimeStep = this.simulationConditions.getTimeStep();
this.position = Coordinate.NUL;
this.velocity = Coordinate.NUL;
this.worldPosition = this.simulationConditions.getLaunchSite();
// Initialize to roll angle with least stability w.r.t. the wind
Quaternion o;
FlightConditions cond = new FlightConditions(configuration);
simulationConditions.getAerodynamicCalculator().getWorstCP(configuration, cond, null);
double angle = -cond.getTheta() - simulationConditions.getLaunchRodDirection();
FlightConditions cond = new FlightConditions(this.configuration);
this.simulationConditions.getAerodynamicCalculator().getWorstCP(this.configuration, cond, null);
double angle = -cond.getTheta() - this.simulationConditions.getLaunchRodDirection();
o = Quaternion.rotation(new Coordinate(0, 0, angle));
// Launch rod angle and direction
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, simulationConditions.getLaunchRodAngle(), 0)));
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, simulationConditions.getLaunchRodDirection())));
this.setRocketOrientationQuaternion(o);
this.setRocketRotationVelocity(Coordinate.NUL);
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, this.simulationConditions.getLaunchRodAngle(), 0)));
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, this.simulationConditions.getLaunchRodDirection())));
this.orientation = o;
this.rotationVelocity = Coordinate.NUL;
/*
* Calculate the effective launch rod length taking into account launch lugs.
* 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;
for (RocketComponent c : configuration) {
for (RocketComponent c : this.configuration) {
if (c instanceof LaunchLug) {
double pos = c.toAbsolute(new Coordinate(c.getLength()))[0].x;
if (Double.isNaN(lugPosition) || pos > lugPosition) {
@ -129,7 +128,7 @@ public class SimulationStatus implements Monitorable {
}
if (!Double.isNaN(lugPosition)) {
double maxX = 0;
for (Coordinate c : configuration.getBounds()) {
for (Coordinate c : this.configuration.getBounds()) {
if (c.x > maxX)
maxX = c.x;
}
@ -137,25 +136,27 @@ public class SimulationStatus implements Monitorable {
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.setLiftoff(false);
this.setLaunchRodCleared(false);
this.setApogeeReached(false);
this.motorIgnited = false;
this.liftoff = false;
this.launchRodCleared = false;
this.apogeeReached = false;
this.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket()));
this.setFlightData(new FlightDataBranch("MAIN", FlightDataType.TYPE_TIME));
this.setWarnings(warnings);
this.warnings = new WarningSet();
}
/**
* Copies the data from the provided object to this object. Most included object are
* deep-cloned, except for the flight data object.
* Performs a deep copy of the on SimulationStatus 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
*/
@ -163,6 +164,7 @@ public class SimulationStatus implements Monitorable {
this.simulationConditions = orig.simulationConditions.clone();
this.configuration = orig.configuration.clone();
this.motorConfiguration = orig.motorConfiguration.clone();
// FlightData is not cloned.
this.flightData = orig.flightData;
this.time = orig.time;
this.previousTimeStep = orig.previousTimeStep;
@ -185,7 +187,8 @@ public class SimulationStatus implements Monitorable {
this.eventQueue.clear();
this.eventQueue.addAll(orig.eventQueue);
this.warnings = orig.warnings;
// WarningSet is not cloned.
this.warnings = new WarningSet();
this.extraData.clear();
this.extraData.putAll(orig.extraData);