public static ReferenceFrame CreateAtCurrentTime(CelestialBody referenceBody) { ReferenceFrame ret = new ReferenceFrame(); ret.lat0lon0AtStart = referenceBody.GetSurfaceNVector(0, 0); ret.lat0lon90AtStart = referenceBody.GetSurfaceNVector(0, 90); ret.lat90AtStart = referenceBody.GetSurfaceNVector(90, 0); ret.epoch = Planetarium.GetUniversalTime(); ret.referenceBody = referenceBody; return ret; }
Vector3d x; //coordinate system used is centered on main body #endregion Fields #region Constructors public ReentrySimulation(Orbit initialOrbit, double UT, double dragCoefficient, List<SimulatedParachute> parachuteList, double mass, IDescentSpeedPolicy descentSpeedPolicy, double endAltitudeASL, double maxThrustAccel) { CelestialBody body = initialOrbit.referenceBody; bodyHasAtmosphere = body.atmosphere; seaLevelAtmospheres = body.atmosphereMultiplier; scaleHeight = 1000 * body.atmosphereScaleHeight; bodyRadius = body.Radius; gravParameter = body.gravParameter; this.dragCoefficient = dragCoefficient; this.parachutes = parachuteList; this.mass = mass; bodyAngularVelocity = body.angularVelocity; this.descentSpeedPolicy = descentSpeedPolicy; landedRadius = bodyRadius + endAltitudeASL; aerobrakedRadius = bodyRadius + body.RealMaxAtmosphereAltitude(); mainBody = body; this.maxThrustAccel = maxThrustAccel; referenceFrame = ReferenceFrame.CreateAtCurrentTime(initialOrbit.referenceBody); orbitReenters = OrbitReenters(initialOrbit); if (orbitReenters) { startUT = UT; t = startUT; AdvanceToFreefallEnd(initialOrbit); } maxDragGees = 0; deltaVExpended = 0; trajectory = new List<AbsoluteVector>(); }
Vector3d x; //coordinate system used is centered on main body #endregion Fields #region Constructors public ReentrySimulation(Orbit _initialOrbit, double _UT, double _dragMassExcludingUsedParachutes, List<SimulatedParachute> _parachuteList, double _mass, IDescentSpeedPolicy _descentSpeedPolicy, double _decelEndAltitudeASL, double _maxThrustAccel, double _parachuteSemiDeployMultiplier, double _probableLandingSiteASL, bool _multiplierHasError, double _dt) { // Store all the input values as they were given input_initialOrbit = _initialOrbit; input_UT = _UT; input_dragMassExcludingUsedParachutes = _dragMassExcludingUsedParachutes; input_parachuteList = _parachuteList; input_mass = _mass; input_descentSpeedPolicy = _descentSpeedPolicy; input_decelEndAltitudeASL = _decelEndAltitudeASL; input_maxThrustAccel = _maxThrustAccel; input_parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; input_probableLandingSiteASL = _probableLandingSiteASL; input_multiplierHasError = _multiplierHasError; input_dt = _dt; max_dt = _dt; dt = max_dt; CelestialBody body = _initialOrbit.referenceBody; bodyHasAtmosphere = body.atmosphere; seaLevelAtmospheres = body.atmosphereMultiplier; scaleHeight = 1000 * body.atmosphereScaleHeight; bodyRadius = body.Radius; gravParameter = body.gravParameter; this.dragMassExcludingUsedParachutes = _dragMassExcludingUsedParachutes; this.parachutes = _parachuteList; this.parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; this.multiplierHasError = _multiplierHasError; this.mass = _mass; bodyAngularVelocity = body.angularVelocity; this.descentSpeedPolicy = _descentSpeedPolicy; decelRadius = bodyRadius + _decelEndAltitudeASL; aerobrakedRadius = bodyRadius + body.RealMaxAtmosphereAltitude(); mainBody = body; this.maxThrustAccel = _maxThrustAccel; this.probableLandingSiteASL = _probableLandingSiteASL; this.probableLandingSiteRadius = _probableLandingSiteASL + bodyRadius; referenceFrame = ReferenceFrame.CreateAtCurrentTime(_initialOrbit.referenceBody); orbitReenters = OrbitReenters(_initialOrbit); if (orbitReenters) { startUT = _UT; t = startUT; AdvanceToFreefallEnd(_initialOrbit); } maxDragGees = 0; deltaVExpended = 0; trajectory = new List<AbsoluteVector>(); }
public ReentrySimulation(Orbit _initialOrbit, double _UT, SimulatedVessel _vessel, SimCurves _simcurves, IDescentSpeedPolicy _descentSpeedPolicy, double _decelEndAltitudeASL, double _maxThrustAccel, double _parachuteSemiDeployMultiplier, double _probableLandingSiteASL, bool _multiplierHasError, double _dt, double _min_dt) { // Store all the input values as they were given input_initialOrbit = _initialOrbit; input_UT = _UT; vessel = _vessel; input_descentSpeedPolicy = _descentSpeedPolicy; input_decelEndAltitudeASL = _decelEndAltitudeASL; input_maxThrustAccel = _maxThrustAccel; input_parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; input_probableLandingSiteASL = _probableLandingSiteASL; input_multiplierHasError = _multiplierHasError; input_dt = _dt; // the vessel attitude relative to the surface vel. Fixed for now attitude = Quaternion.Euler(180,0,0); min_dt = _min_dt; max_dt = _dt; dt = max_dt; // Get a copy of the original orbit, to be more thread safe initialOrbit = new Orbit(); initialOrbit.UpdateFromOrbitAtUT(_initialOrbit, _UT, _initialOrbit.referenceBody); CelestialBody body = _initialOrbit.referenceBody; bodyHasAtmosphere = body.atmosphere; bodyRadius = body.Radius; gravParameter = body.gravParameter; this.parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; this.multiplierHasError = _multiplierHasError; bodyAngularVelocity = body.angularVelocity; this.descentSpeedPolicy = _descentSpeedPolicy; decelRadius = bodyRadius + _decelEndAltitudeASL; aerobrakedRadius = bodyRadius + body.RealMaxAtmosphereAltitude(); mainBody = body; this.maxThrustAccel = _maxThrustAccel; this.probableLandingSiteASL = _probableLandingSiteASL; this.probableLandingSiteRadius = _probableLandingSiteASL + bodyRadius; referenceFrame = ReferenceFrame.CreateAtCurrentTime(_initialOrbit.referenceBody); orbitReenters = OrbitReenters(_initialOrbit); if (orbitReenters) startUT = _UT; maxDragGees = 0; deltaVExpended = 0; trajectory = new List<AbsoluteVector>(); simCurves = _simcurves; once = true; }
public ReentrySimulation(Orbit _initialOrbit, double _UT, SimulatedVessel _vessel, SimCurves _simcurves, IDescentSpeedPolicy _descentSpeedPolicy, double _decelEndAltitudeASL, double _maxThrustAccel, double _parachuteSemiDeployMultiplier, double _probableLandingSiteASL, bool _multiplierHasError, double _dt, double _min_dt) { // Store all the input values as they were given input_initialOrbit = _initialOrbit; input_UT = _UT; vessel = _vessel; input_descentSpeedPolicy = _descentSpeedPolicy; input_decelEndAltitudeASL = _decelEndAltitudeASL; input_maxThrustAccel = _maxThrustAccel; input_parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; input_probableLandingSiteASL = _probableLandingSiteASL; input_multiplierHasError = _multiplierHasError; input_dt = _dt; // the vessel attitude relative to the surface vel. Fixed for now attitude = Quaternion.Euler(180, 0, 0); min_dt = _min_dt; max_dt = _dt; dt = max_dt; // Get a copy of the original orbit, to be more thread safe initialOrbit = new Orbit(); initialOrbit.UpdateFromOrbitAtUT(_initialOrbit, _UT, _initialOrbit.referenceBody); CelestialBody body = _initialOrbit.referenceBody; bodyHasAtmosphere = body.atmosphere; bodyRadius = body.Radius; gravParameter = body.gravParameter; this.parachuteSemiDeployMultiplier = _parachuteSemiDeployMultiplier; this.multiplierHasError = _multiplierHasError; bodyAngularVelocity = body.angularVelocity; this.descentSpeedPolicy = _descentSpeedPolicy; decelRadius = bodyRadius + _decelEndAltitudeASL; aerobrakedRadius = bodyRadius + body.RealMaxAtmosphereAltitude(); mainBody = body; this.maxThrustAccel = _maxThrustAccel; this.probableLandingSiteASL = _probableLandingSiteASL; this.probableLandingSiteRadius = _probableLandingSiteASL + bodyRadius; referenceFrame = ReferenceFrame.CreateAtCurrentTime(_initialOrbit.referenceBody); orbitReenters = OrbitReenters(_initialOrbit); if (orbitReenters) { startUT = _UT; } maxDragGees = 0; deltaVExpended = 0; trajectory = new List <AbsoluteVector>(); simCurves = _simcurves; once = true; }