private SimulationStatus initialStatus( Configuration configuration, MotorInstanceConfiguration motorConfiguration, SimulationConditions simulationConditions, FlightData flightData) { SimulationStatus init = new SimulationStatus(); init.setSimulationConditions(simulationConditions); init.setConfiguration(configuration); init.setMotorConfiguration(motorConfiguration); init.setSimulationTime(0); init.setPreviousTimeStep(simulationConditions.getTimeStep()); init.setRocketPosition(Coordinate.NUL); init.setRocketVelocity(Coordinate.NUL); init.setRocketWorldPosition(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(); 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()))); init.setRocketOrientationQuaternion(o); init.setRocketRotationVelocity(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 lugPosition = Double.NaN; for (RocketComponent c : configuration) { if (c instanceof LaunchLug) { double pos = c.toAbsolute(new Coordinate(c.getLength()))[0].x; if (Double.isNaN(lugPosition) || pos > lugPosition) { lugPosition = pos; } } } if (!Double.isNaN(lugPosition)) { double maxX = 0; for (Coordinate c : configuration.getBounds()) { if (c.x > maxX) maxX = c.x; } if (maxX >= lugPosition) { length = Math.max(0, length - (maxX - lugPosition)); } } init.setEffectiveLaunchRodLength(length); init.setSimulationStartWallTime(System.nanoTime()); init.setMotorIgnited(false); init.setLiftoff(false); init.setLaunchRodCleared(false); init.setApogeeReached(false); init.getEventQueue() .add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket())); init.setFlightData(new FlightDataBranch("MAIN", FlightDataType.TYPE_TIME)); init.setWarnings(flightData.getWarningSet()); return init; }