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:
		
							parent
							
								
									ee11816828
								
							
						
					
					
						commit
						cda4281475
					
				| @ -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); | ||||
| 				 | ||||
|  | ||||
| @ -52,6 +52,7 @@ public class EventQueue extends PriorityQueue<FlightEvent> implements Monitorabl | ||||
| 		return super.remove(o); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public int getModID() { | ||||
| 		return modID; | ||||
| 	} | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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(); | ||||
| 	} | ||||
|  | ||||
| @ -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(); | ||||
| 		 | ||||
|  | ||||
| @ -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; | ||||
| 	 | ||||
| 	/** | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user