1 package net.sf.openrocket.simulation;
3 import java.util.ArrayList;
6 import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
7 import net.sf.openrocket.masscalc.MassCalculator;
8 import net.sf.openrocket.models.atmosphere.AtmosphericModel;
9 import net.sf.openrocket.models.gravity.GravityModel;
10 import net.sf.openrocket.models.wind.WindModel;
11 import net.sf.openrocket.rocketcomponent.Rocket;
12 import net.sf.openrocket.simulation.listeners.SimulationListener;
13 import net.sf.openrocket.util.BugException;
14 import net.sf.openrocket.util.Monitorable;
17 * A holder class for the simulation conditions. These include conditions that do not change
18 * during the flight of a rocket, for example launch rod parameters, atmospheric models,
19 * aerodynamic calculators etc.
21 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
23 public class SimulationConditions implements Monitorable, Cloneable {
25 private Rocket rocket;
26 private String motorID = null;
29 private double launchRodLength = 1;
31 /** Launch rod angle >= 0, radians from vertical */
32 private double launchRodAngle = 0;
34 /** Launch rod direction, 0 = upwind, PI = downwind. */
35 private double launchRodDirection = 0;
38 private double launchAltitude = 0;
39 private double launchLatitude = 45;
42 private WindModel windModel;
43 private AtmosphericModel atmosphericModel;
44 private GravityModel gravityModel;
46 private AerodynamicCalculator aerodynamicCalculator;
47 private MassCalculator massCalculator;
50 private double timeStep = RK4SimulationStepper.RECOMMENDED_TIME_STEP;
51 private double maximumAngleStep = RK4SimulationStepper.RECOMMENDED_ANGLE_STEP;
53 /* Whether to calculate additional data or only primary simulation figures */
54 private boolean calculateExtras = true;
57 private List<SimulationListener> simulationListeners = new ArrayList<SimulationListener>();
60 private int randomSeed = 0;
62 private int modID = 0;
63 private int modIDadd = 0;
67 public AerodynamicCalculator getAerodynamicCalculator() {
68 return aerodynamicCalculator;
72 public void setAerodynamicCalculator(AerodynamicCalculator aerodynamicCalculator) {
73 if (this.aerodynamicCalculator != null)
74 this.modIDadd += this.aerodynamicCalculator.getModID();
76 this.aerodynamicCalculator = aerodynamicCalculator;
80 public MassCalculator getMassCalculator() {
81 return massCalculator;
85 public void setMassCalculator(MassCalculator massCalculator) {
86 if (this.massCalculator != null)
87 this.modIDadd += this.massCalculator.getModID();
89 this.massCalculator = massCalculator;
93 public Rocket getRocket() {
98 public void setRocket(Rocket rocket) {
99 if (this.rocket != null)
100 this.modIDadd += this.rocket.getModID();
102 this.rocket = rocket;
106 public String getMotorConfigurationID() {
111 public void setMotorConfigurationID(String motorID) {
112 this.motorID = motorID;
117 public double getLaunchRodLength() {
118 return launchRodLength;
122 public void setLaunchRodLength(double launchRodLength) {
123 this.launchRodLength = launchRodLength;
128 public double getLaunchRodAngle() {
129 return launchRodAngle;
133 public void setLaunchRodAngle(double launchRodAngle) {
134 this.launchRodAngle = launchRodAngle;
139 public double getLaunchRodDirection() {
140 return launchRodDirection;
144 public void setLaunchRodDirection(double launchRodDirection) {
145 this.launchRodDirection = launchRodDirection;
150 public double getLaunchAltitude() {
151 return launchAltitude;
155 public void setLaunchAltitude(double launchAltitude) {
156 this.launchAltitude = launchAltitude;
161 public double getLaunchLatitude() {
162 return launchLatitude;
166 public void setLaunchLatitude(double launchLatitude) {
167 this.launchLatitude = launchLatitude;
172 public WindModel getWindModel() {
177 public void setWindModel(WindModel windModel) {
178 if (this.windModel != null)
179 this.modIDadd += this.windModel.getModID();
181 this.windModel = windModel;
185 public AtmosphericModel getAtmosphericModel() {
186 return atmosphericModel;
190 public void setAtmosphericModel(AtmosphericModel atmosphericModel) {
191 if (this.atmosphericModel != null)
192 this.modIDadd += this.atmosphericModel.getModID();
194 this.atmosphericModel = atmosphericModel;
198 public GravityModel getGravityModel() {
203 public void setGravityModel(GravityModel gravityModel) {
204 if (this.gravityModel != null)
205 this.modIDadd += this.gravityModel.getModID();
207 this.gravityModel = gravityModel;
211 public double getTimeStep() {
216 public void setTimeStep(double timeStep) {
217 this.timeStep = timeStep;
222 public double getMaximumAngleStep() {
223 return maximumAngleStep;
227 public void setMaximumAngleStep(double maximumAngle) {
228 this.maximumAngleStep = maximumAngle;
233 public boolean isCalculateExtras() {
234 return calculateExtras;
238 public void setCalculateExtras(boolean calculateExtras) {
239 this.calculateExtras = calculateExtras;
245 public int getRandomSeed() {
250 public void setRandomSeed(int randomSeed) {
251 this.randomSeed = randomSeed;
256 // TODO: HIGH: Make cleaner
257 public List<SimulationListener> getSimulationListenerList() {
258 return simulationListeners;
263 public int getModID() {
264 return (modID + modIDadd + rocket.getModID() + windModel.getModID() + atmosphericModel.getModID() +
265 gravityModel.getModID() + aerodynamicCalculator.getModID() + massCalculator.getModID());
270 public SimulationConditions clone() {
272 // TODO: HIGH: Deep clone models
273 return (SimulationConditions) super.clone();
274 } catch (CloneNotSupportedException e) {
275 throw new BugException(e);