public int ExportSweep(CelestialBody body, double pitch, int flapSetting, bool spoilers) { if (!IsReady()) { return(0); } FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); StaticAnalysisExportFile exportdata = new StaticAnalysisExportFile(); InstantConditionSimInput input = new InstantConditionSimInput(0, 0, 0, 0, 0, 0, FlightEnv.NewDefaultVal(body), pitch, flapSetting, spoilers); InstantConditionSimOutput output; Vector3d centerofmass = _instantCondition.GetCoM(); // Loop through each combination (two dimensions). foreach (float mach in exportdata.MachNumberList) { input.fltenv.MachNumber = mach; input.alpha = 0; // zero is used as a neutral value for the reset _instantCondition.ResetClCdCmSteady(centerofmass, input); // reset old results (particularly cossweep) that may not reflect the current mach number foreach (float aoadeg in exportdata.AoADegreeList) { input.alpha = aoadeg; _instantCondition.GetClCdCmSteady(input, out output, true, true); exportdata.AddDatapoint(mach, aoadeg, output.Cl, output.Cd, output.Cm); } } exportdata.Export(); return(exportdata.DataCount); }
private void StabDerivCalcButtonAction(CalcAndExportEnum exportflag) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude) * 1000; machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double machDouble = FARMathUtil.Clamp(Convert.ToSingle(machNumber), 0.001, float.PositiveInfinity); int flapsettingInt = _flapSettingDropdown.ActiveSelection; bool spoilersDeployedBool = spoilersDeployed; if (exportflag == CalcAndExportEnum.LoopExport) { int n = 0; ExportTextFileCache filecache = new ExportTextFileCache(); foreach (Vector2 altmach in StabilityDerivativeExportFile.LoadConfigList()) { StabilityDerivExportOutput output = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, (double)altmach.x, (double)altmach.y, flapsettingInt, spoilersDeployedBool); if (AoAOk(output, exportflag) && StabilityDerivativeExportFile.Export(output, filecache)) { n++; } } if (n > 0) { filecache.FlushTextFileLines(); PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivLoopCount", Localizer.Format("FAREditorStabDerivLoopDone"), Localizer.Format("FAREditorStabDerivLoopDoneExp", n), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } else { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivSaveError", Localizer.Format("FAREditorStabDerivSaveError"), Localizer.Format("FAREditorStabDerivSaveErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } return; // in the LoopExport case skip the usual calculation } StabilityDerivExportOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool); if (!AoAOk(stabDerivResult, exportflag)) { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } else { stabDerivOutput = stabDerivResult.outputvals; simManager.vehicleData = stabDerivResult.outputvals; SetAngleVectors(stabDerivResult.outputvals.stableCondition.stableAoA); if (exportflag == CalcAndExportEnum.CalculateAndExport && !StabilityDerivativeExportFile.Export(stabDerivResult)) { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivSaveError", Localizer.Format("FAREditorStabDerivSaveError"), Localizer.Format("FAREditorStabDerivSaveErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } } }
public GraphData MachNumberSweep( double aoAdegrees, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body ) { FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); var ClValues = new double[numPoints]; var CdValues = new double[numPoints]; var CmValues = new double[numPoints]; var LDValues = new double[numPoints]; var AlphaValues = new double[numPoints]; var input = new InstantConditionSimInput(aoAdegrees, 0, 0, 0, 0, 0, 0, pitch, flapSetting, spoilers); for (int i = 0; i < numPoints; i++) { input.machNumber = i / (double)numPoints * (upperBound - lowerBound) + lowerBound; if (input.machNumber.NearlyEqual(0)) { input.machNumber = 0.001; } _instantCondition.GetClCdCmSteady(input, out InstantConditionSimOutput output, i == 0); AlphaValues[i] = input.machNumber; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } var data = new GraphData { xValues = AlphaValues }; data.AddData(ClValues, FARConfig.GUIColors.ClColor, Localizer.Format("FARAbbrevCl"), true); data.AddData(CdValues, FARConfig.GUIColors.CdColor, Localizer.Format("FARAbbrevCd"), true); data.AddData(CmValues, FARConfig.GUIColors.CmColor, Localizer.Format("FARAbbrevCm"), true); data.AddData(LDValues, FARConfig.GUIColors.LdColor, Localizer.Format("FARAbbrevL_D"), true); return(data); }
public GraphData MachNumberSweep(double aoAdegrees, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body) { FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); double[] ClValues = new double[(int)numPoints]; double[] CdValues = new double[(int)numPoints]; double[] CmValues = new double[(int)numPoints]; double[] LDValues = new double[(int)numPoints]; double[] AlphaValues = new double[(int)numPoints]; InstantConditionSimInput input = new InstantConditionSimInput(aoAdegrees, 0, 0, 0, 0, 0, FlightEnv.NewDefaultVal(body), pitch, flapSetting, spoilers); for (int i = 0; i < numPoints; i++) { input.fltenv.MachNumber = lowerBound + (upperBound - lowerBound) * (i == 0? 0 : i / (numPoints - 1.0)); if (input.fltenv.MachNumber < 1E-3) { input.fltenv.MachNumber = 1E-3; } InstantConditionSimOutput output; _instantCondition.GetClCdCmSteady(input, out output, i == 0, false); AlphaValues[i] = input.fltenv.MachNumber; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } GraphData data = new GraphData(); data.xValues = AlphaValues; data.AddData(ClValues, GUIColors.GetColor(0), Localizer.Format("FARAbbrevCl"), true); data.AddData(CdValues, GUIColors.GetColor(1), Localizer.Format("FARAbbrevCd"), true); data.AddData(CmValues, GUIColors.GetColor(2), Localizer.Format("FARAbbrevCm"), true); data.AddData(LDValues, GUIColors.GetColor(3), Localizer.Format("FARAbbrevL_D"), true); data.exportdata.AddSizeVariables(_instantCondition, pitch, flapSetting, spoilers); data.exportdata.AddMachSweepXVariable(aoAdegrees, AlphaValues); data.exportdata.AddYVariables(data); return(data); }
public GraphData MachNumberSweep(double aoAdegrees, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body) { FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); double[] ClValues = new double[(int)numPoints]; double[] CdValues = new double[(int)numPoints]; double[] CmValues = new double[(int)numPoints]; double[] LDValues = new double[(int)numPoints]; double[] AlphaValues = new double[(int)numPoints]; InstantConditionSimInput input = new InstantConditionSimInput(aoAdegrees, 0, 0, 0, 0, 0, 0, pitch, flapSetting, spoilers); for (int i = 0; i < numPoints; i++) { input.machNumber = i / (double)numPoints * (upperBound - lowerBound) + lowerBound; if (input.machNumber == 0) { input.machNumber = 0.001; } InstantConditionSimOutput output; _instantCondition.GetClCdCmSteady(input, out output, i == 0); AlphaValues[i] = input.machNumber; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } GraphData data = new GraphData(); data.xValues = AlphaValues; data.AddData(ClValues, GUIColors.GetColor(0), "Cl", true); data.AddData(CdValues, GUIColors.GetColor(1), "Cd", true); data.AddData(CmValues, GUIColors.GetColor(2), "Cm", true); data.AddData(LDValues, GUIColors.GetColor(3), "L/D", true); return(data); }
private void StabDerivCalcButtonAction() { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude) * 1000; machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double machDouble = FARMathUtil.Clamp(Convert.ToSingle(machNumber), 0.001, float.PositiveInfinity); int flapsettingInt = _flapSettingDropdown.ActiveSelection; bool spoilersDeployedBool = spoilersDeployed; if (FARAtmosphere.GetPressure(body, new Vector3d(0, 0, altitudeDouble), Planetarium.GetUniversalTime()) > 0) { stabDerivOutput = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool, 0, 0, 0); simManager.vehicleData = stabDerivOutput; SetAngleVectors(stabDerivOutput.stableAoA); } else { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } }
private void StabDerivCalcButtonAction(CalcAndExportEnum exportflag) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude) * 1000; machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double machDouble = FARMathUtil.Clamp(Convert.ToSingle(machNumber), 0.001, float.PositiveInfinity); int flapsettingInt = _flapSettingDropdown.ActiveSelection; bool spoilersDeployedBool = spoilersDeployed; // Rodhern: Export of stability derivatives disabled in dkavolis branch. // if (exportflag == CalcAndExportEnum.LoopExport ... if (body.GetPressure(altitudeDouble) > 0) { StabilityDerivExportOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool, 0, 0, 0); // if (stabDerivResult.outputvals.stableAoAState == "") // { stabDerivOutput = stabDerivResult.outputvals; simManager.vehicleData = stabDerivResult.outputvals; SetAngleVectors(stabDerivResult.outputvals.stableAoA); // Rodhern: Export of stability derivatives disabled in dkavolis branch. // if (exportflag == CalcAndExportEnum.CalculateAndExport ... // } // else // PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } else { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } }
public GraphData AngleOfAttackSweep(double machNumber, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body) { if (machNumber == 0) { machNumber = 0.001; } InstantConditionSimInput input = new InstantConditionSimInput(0, 0, 0, 0, 0, 0, machNumber, pitch, flapSetting, spoilers); FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); double[] ClValues = new double[(int)numPoints]; double[] CdValues = new double[(int)numPoints]; double[] CmValues = new double[(int)numPoints]; double[] LDValues = new double[(int)numPoints]; double[] AlphaValues = new double[(int)numPoints]; double[] ClValues2 = new double[(int)numPoints]; double[] CdValues2 = new double[(int)numPoints]; double[] CmValues2 = new double[(int)numPoints]; double[] LDValues2 = new double[(int)numPoints]; for (int i = 0; i < 2 * numPoints; i++) { double angle = 0; if (i < numPoints) { angle = i / (double)numPoints * (upperBound - lowerBound) + lowerBound; } else { angle = (i - (double)numPoints + 1) / (double)numPoints * (lowerBound - upperBound) + upperBound; } input.alpha = angle; InstantConditionSimOutput output; _instantCondition.GetClCdCmSteady(input, out output, i == 0); // MonoBehaviour.print("Cl: " + Cl + " Cd: " + Cd); if (i < numPoints) { AlphaValues[i] = angle; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } else { ClValues2[numPoints * 2 - 1 - i] = output.Cl; CdValues2[numPoints * 2 - 1 - i] = output.Cd; CmValues2[numPoints * 2 - 1 - i] = output.Cm; LDValues2[numPoints * 2 - 1 - i] = output.Cl * 0.1 / output.Cd; } } GraphData data = new GraphData(); data.xValues = AlphaValues; data.AddData(ClValues2, GUIColors.GetColor(0) * 0.5f, "Cl2", false); data.AddData(ClValues, GUIColors.GetColor(0), "Cl", true); data.AddData(CdValues2, GUIColors.GetColor(1) * 0.5f, "Cd2", false); data.AddData(CdValues, GUIColors.GetColor(1), "Cd", true); data.AddData(CmValues2, GUIColors.GetColor(2) * 0.5f, "Cm2", false); data.AddData(CmValues, GUIColors.GetColor(2), "Cm", true); data.AddData(LDValues2, GUIColors.GetColor(3) * 0.5f, "L/D2", false); data.AddData(LDValues, GUIColors.GetColor(3), "L/D", true); return(data); }
public void Display() { //stabDerivHelp = GUILayout.Toggle(stabDerivHelp, "?", ButtonStyle, GUILayout.Width(200)); GUILayout.Label("Flight Condition:"); GUILayout.BeginHorizontal(); GUILayout.Label("Planet:"); _bodySettingDropdown.GUIDropDownDisplay(); GUILayout.Label("Altitude (km):"); altitude = GUILayout.TextField(altitude, GUILayout.ExpandWidth(true)); GUILayout.Label("Mach Number: "); machNumber = GUILayout.TextField(machNumber, GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Flap Setting: "); _flapSettingDropdown.GUIDropDownDisplay(); GUILayout.Label("Spoilers:"); spoilersDeployed = GUILayout.Toggle(spoilersDeployed, spoilersDeployed ? "Deployed" : "Retracted", GUILayout.Width(100)); GUILayout.EndHorizontal(); if (GUILayout.Button("Calculate Stability Derivatives", GUILayout.Width(250.0F), GUILayout.Height(25.0F))) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); //atm_temp_str = Regex.Replace(atm_temp_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); //rho_str = Regex.Replace(rho_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude); altitudeDouble *= 1000; double temp = body.GetTemperature(altitudeDouble); double pressure = body.GetPressure(altitudeDouble); if (pressure > 0) { //double temp = Convert.ToSingle(atm_temp_str); double machDouble = Convert.ToSingle(machNumber); machDouble = FARMathUtil.Clamp(machDouble, 0.001, float.PositiveInfinity); double density = body.GetDensity(pressure, temp); double sspeed = body.GetSpeedOfSound(pressure, density); double vel = sspeed * machDouble; //UpdateControlSettings(); double q = vel * vel * density * 0.5f; stabDerivOutput = simManager.StabDerivCalculator.CalculateStabilityDerivs(vel, q, machDouble, 0, 0, 0, _flapSettingDropdown.ActiveSelection, spoilersDeployed, body, altitudeDouble); simManager.vehicleData = stabDerivOutput; SetAngleVectors(stabDerivOutput.stableAoA); } else { PopupDialog.SpawnPopupDialog("Error!", "Altitude was above atmosphere", "OK", false, HighLogic.Skin); } } GUILayout.BeginHorizontal(); GUILayout.Label("Aircraft Properties", GUILayout.Width(180)); GUILayout.Label("Moments of Inertia", GUILayout.Width(160)); GUILayout.Label("Products of Inertia", GUILayout.Width(160)); GUILayout.Label("Level Flight", GUILayout.Width(140)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(GUILayout.Width(180)); GUILayout.Label("Ref Area: " + stabDerivOutput.area.ToString("G3") + " m²"); GUILayout.Label("Scaled Chord: " + stabDerivOutput.MAC.ToString("G3") + " m"); GUILayout.Label("Scaled Span: " + stabDerivOutput.b.ToString("G3") + " m"); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent("Ixx: " + stabDerivOutput.stabDerivs[0].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about X-axis")); GUILayout.Label(new GUIContent("Iyy: " + stabDerivOutput.stabDerivs[1].ToString("G6") + " kg * m²", "Inertia about Y-axis due to rotation about Y-axis")); GUILayout.Label(new GUIContent("Izz: " + stabDerivOutput.stabDerivs[2].ToString("G6") + " kg * m²", "Inertia about Z-axis due to rotation about Z-axis")); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent("Ixy: " + stabDerivOutput.stabDerivs[24].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about Y-axis; is equal to inertia about Y-axis due to rotation about X-axis")); GUILayout.Label(new GUIContent("Iyz: " + stabDerivOutput.stabDerivs[25].ToString("G6") + " kg * m²", "Inertia about Y-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about Y-axis")); GUILayout.Label(new GUIContent("Ixz: " + stabDerivOutput.stabDerivs[26].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about X-axis")); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(140)); GUILayout.Label(new GUIContent("u0: " + stabDerivOutput.nominalVelocity.ToString("G6") + " m/s", "Air speed based on this mach number and temperature.")); GUILayout.BeginHorizontal(); GUILayout.Label(new GUIContent("Cl: " + stabDerivOutput.stableCl.ToString("G3"), "Required lift coefficient at this mass, speed and air density.")); GUILayout.Label(new GUIContent("Cd: " + stabDerivOutput.stableCd.ToString("G3"), "Resulting drag coefficient at this mass, speed and air density.")); GUILayout.EndHorizontal(); GUILayout.Label(new GUIContent("AoA: " + stabDerivOutput.stableAoAState + stabDerivOutput.stableAoA.ToString("G6") + " deg", "Angle of attack required to achieve the necessary lift force.")); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Longitudinal Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); BackgroundStyle.hover = BackgroundStyle.active = BackgroundStyle.normal; GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); GUILayout.Label("Down Vel Derivatives", GUILayout.Width(160)); GUILayout.Label("Fwd Vel Derivatives", GUILayout.Width(160)); GUILayout.Label("Pitch Rate Derivatives", GUILayout.Width(160)); GUILayout.Label("Pitch Ctrl Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Zw: ", stabDerivOutput.stabDerivs[3], " s⁻¹", "Change in Z-direction acceleration with respect to Z-direction velocity; should be negative", 160, -1); StabilityLabel("Zu: ", stabDerivOutput.stabDerivs[6], " s⁻¹", "Change in Z-direction acceleration with respect to X-direction velocity; should be negative", 160, -1); StabilityLabel("Zq: ", stabDerivOutput.stabDerivs[9], " m/s", "Change in Z-direction acceleration with respect to pitch-up rate; sign unimportant", 160, 0); StabilityLabel("Zδe: ", stabDerivOutput.stabDerivs[12], " m/s²", "Change in Z-direction acceleration with respect to pitch control input; should be negative", 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Xw: ", stabDerivOutput.stabDerivs[4], " s⁻¹", "Change in X-direction acceleration with respect to Z-direction velocity; sign unimportant", 160, 0); StabilityLabel("Xu: ", stabDerivOutput.stabDerivs[7], " s⁻¹", "Change in X-direction acceleration with respect to X-direction velocity; should be negative", 160, -1); StabilityLabel("Xq: ", stabDerivOutput.stabDerivs[10], " m/s", "Change in X-direction acceleration with respect to pitch-up rate; sign unimportant", 160, 0); StabilityLabel("Xδe: ", stabDerivOutput.stabDerivs[13], " m/s²", "Change in X-direction acceleration with respect to pitch control input; sign unimportant", 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Mw: ", stabDerivOutput.stabDerivs[5], " (m * s)⁻¹", "Change in pitch-up angular acceleration with respect to Z-direction velocity; should be negative", 160, -1); StabilityLabel("Mu: ", stabDerivOutput.stabDerivs[8], " (m * s)⁻¹", "Change in pitch-up angular acceleration acceleration with respect to X-direction velocity; sign unimportant", 160, 0); StabilityLabel("Mq: ", stabDerivOutput.stabDerivs[11], " s⁻¹", "Change in pitch-up angular acceleration acceleration with respect to pitch-up rate; should be negative", 160, -1); StabilityLabel("Mδe: ", stabDerivOutput.stabDerivs[14], " s⁻²", "Change in pitch-up angular acceleration acceleration with respect to pitch control input; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Lateral Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Sideslip Derivatives", GUILayout.Width(160)); GUILayout.Label("Roll Rate Derivatives", GUILayout.Width(160)); GUILayout.Label("Yaw Rate Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); StabilityLabel("Yβ: ", stabDerivOutput.stabDerivs[15], " m/s²", "Change in Y-direction acceleration with respect to sideslip angle β; should be negative", 160, -1); StabilityLabel("Yp: ", stabDerivOutput.stabDerivs[18], " m/s", "Change in Y-direction acceleration with respect to roll-right rate; sign unimportant", 160, 0); StabilityLabel("Yr: ", stabDerivOutput.stabDerivs[21], " m/s", "Change in Y-direction acceleration with respect to yaw-right rate; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Lβ: ", stabDerivOutput.stabDerivs[16], " s⁻²", "Change in roll-right angular acceleration with respect to sideslip angle β; should be negative", 160, -1); StabilityLabel("Lp: ", stabDerivOutput.stabDerivs[19], " s⁻¹", "Change in roll-right angular acceleration with respect to roll-right rate; should be negative", 160, -1); StabilityLabel("Lr: ", stabDerivOutput.stabDerivs[22], " s⁻¹", "Change in roll-right angular acceleration with respect to yaw-right rate; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Nβ: ", stabDerivOutput.stabDerivs[17], " s⁻²", "Change in yaw-right angular acceleration with respect to sideslip angle β; should be positive", 160, 1); StabilityLabel("Np: ", stabDerivOutput.stabDerivs[20], " s⁻¹", "Change in yaw-right angular acceleration with respect to roll-right rate; sign unimportant", 160, 0); StabilityLabel("Nr: ", stabDerivOutput.stabDerivs[23], " s⁻¹", "Change in yaw-right angular acceleration with respect to yaw-right rate; should be negative", 160, -1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); DrawTooltip(); }
public GraphData AngleOfAttackSweep( double machNumber, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body ) { if (machNumber.NearlyEqual(0)) { machNumber = 0.001; } var input = new InstantConditionSimInput(0, 0, 0, 0, 0, 0, machNumber, pitch, flapSetting, spoilers); FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); var ClValues = new double[numPoints]; var CdValues = new double[numPoints]; var CmValues = new double[numPoints]; var LDValues = new double[numPoints]; var AlphaValues = new double[numPoints]; var ClValues2 = new double[numPoints]; var CdValues2 = new double[numPoints]; var CmValues2 = new double[numPoints]; var LDValues2 = new double[numPoints]; for (int i = 0; i < 2 * numPoints; i++) { double angle; if (i < numPoints) { angle = i / (double)numPoints * (upperBound - lowerBound) + lowerBound; } else { angle = (i - (double)numPoints + 1) / numPoints * (lowerBound - upperBound) + upperBound; } input.alpha = angle; _instantCondition.GetClCdCmSteady(input, out InstantConditionSimOutput output, i == 0); if (i < numPoints) { AlphaValues[i] = angle; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } else { ClValues2[numPoints * 2 - 1 - i] = output.Cl; CdValues2[numPoints * 2 - 1 - i] = output.Cd; CmValues2[numPoints * 2 - 1 - i] = output.Cm; LDValues2[numPoints * 2 - 1 - i] = output.Cl * 0.1 / output.Cd; } } var data = new GraphData { xValues = AlphaValues }; data.AddData(ClValues2, FARConfig.GUIColors.ClColor * 0.5f, "Cl2", false); data.AddData(ClValues, FARConfig.GUIColors.ClColor, Localizer.Format("FARAbbrevCl"), true); data.AddData(CdValues2, FARConfig.GUIColors.CdColor * 0.5f, "Cd2", false); data.AddData(CdValues, FARConfig.GUIColors.CdColor, Localizer.Format("FARAbbrevCd"), true); data.AddData(CmValues2, FARConfig.GUIColors.CmColor * 0.5f, "Cm2", false); data.AddData(CmValues, FARConfig.GUIColors.CmColor, Localizer.Format("FARAbbrevCm"), true); data.AddData(LDValues2, FARConfig.GUIColors.LdColor * 0.5f, "L/D2", false); data.AddData(LDValues, FARConfig.GUIColors.LdColor, Localizer.Format("FARAbbrevL_D"), true); return(data); }
public void Display() { //stabDerivHelp = GUILayout.Toggle(stabDerivHelp, "?", ButtonStyle, GUILayout.Width(200)); GUILayout.Label(Localizer.Format("FAREditorStabDerivFlightCond")); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivPlanet")); _bodySettingDropdown.GUIDropDownDisplay(); GUILayout.Label(Localizer.Format("FAREditorStabDerivAlt")); altitude = GUILayout.TextField(altitude, GUILayout.ExpandWidth(true)); GUILayout.Label(Localizer.Format("FAREditorStabDerivMach")); machNumber = GUILayout.TextField(machNumber, GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivFlap")); _flapSettingDropdown.GUIDropDownDisplay(); GUILayout.Label(Localizer.Format("FAREditorStabDerivSpoiler")); spoilersDeployed = GUILayout.Toggle(spoilersDeployed, spoilersDeployed ? Localizer.Format("FAREditorStabDerivSDeploy") : Localizer.Format("FAREditorStabDerivSRetract"), GUILayout.Width(100)); GUILayout.EndHorizontal(); if (GUILayout.Button(Localizer.Format("FAREditorStabDerivCalcButton"), GUILayout.Width(250.0F), GUILayout.Height(25.0F))) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); //atm_temp_str = Regex.Replace(atm_temp_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); //rho_str = Regex.Replace(rho_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude); altitudeDouble *= 1000; double temp = body.GetTemperature(altitudeDouble); double pressure = body.GetPressure(altitudeDouble); if (pressure > 0) { //double temp = Convert.ToSingle(atm_temp_str); double machDouble = Convert.ToSingle(machNumber); machDouble = FARMathUtil.Clamp(machDouble, 0.001, float.PositiveInfinity); double density = body.GetDensity(pressure, temp); double sspeed = body.GetSpeedOfSound(pressure, density); double vel = sspeed * machDouble; //UpdateControlSettings(); double q = vel * vel * density * 0.5f; stabDerivOutput = simManager.StabDerivCalculator.CalculateStabilityDerivs(vel, q, machDouble, 0, 0, 0, _flapSettingDropdown.ActiveSelection, spoilersDeployed, body, altitudeDouble); simManager.vehicleData = stabDerivOutput; SetAngleVectors(stabDerivOutput.stableAoA); } else { PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton "), true, HighLogic.UISkin); } } GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivAirProp"), GUILayout.Width(180)); GUILayout.Label(Localizer.Format("FAREditorStabDerivMoI"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorStabDerivPoI"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorStabDerivLvlFl"), GUILayout.Width(140)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(GUILayout.Width(180)); GUILayout.Label(Localizer.Format("FAREditorStabDerivRefArea") + stabDerivOutput.area.ToString("G3") + " " + Localizer.Format("FARUnitMSq")); GUILayout.Label(Localizer.Format("FAREditorStabDerivScaledChord") + stabDerivOutput.MAC.ToString("G3") + " " + Localizer.Format("FARUnitM")); GUILayout.Label(Localizer.Format("FAREditorStabDerivScaledSpan") + stabDerivOutput.b.ToString("G3") + " " + Localizer.Format("FARUnitM")); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxx") + stabDerivOutput.stabDerivs[0].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxxExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIyy") + stabDerivOutput.stabDerivs[1].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIyyExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIzz") + stabDerivOutput.stabDerivs[2].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIzzExp"))); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxy") + stabDerivOutput.stabDerivs[24].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxyExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIyz") + stabDerivOutput.stabDerivs[25].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIyzExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxz") + stabDerivOutput.stabDerivs[26].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxzExp"))); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(140)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivu0") + stabDerivOutput.nominalVelocity.ToString("G6") + " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorStabDerivu0Exp"))); GUILayout.BeginHorizontal(); GUILayout.Label(new GUIContent(Localizer.Format("FARAbbrevCl") + ": " + stabDerivOutput.stableCl.ToString("G3"), Localizer.Format("FAREditorStabDerivClExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FARAbbrevCd") + ": " + stabDerivOutput.stableCd.ToString("G3"), Localizer.Format("FAREditorStabDerivCdExp"))); GUILayout.EndHorizontal(); GUILayout.Label(new GUIContent(Localizer.Format("FARAbbrevAoA") + ": " + stabDerivOutput.stableAoAState + stabDerivOutput.stableAoA.ToString("G6") + " " + Localizer.Format("FARUnitDeg"), Localizer.Format("FAREditorStabDerivAoAExp"))); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorLongDeriv"), GUILayout.Width(160)); GUILayout.EndHorizontal(); GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); BackgroundStyle.hover = BackgroundStyle.active = BackgroundStyle.normal; GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorDownVelDeriv"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorFwdVelDeriv"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorPitchRateDeriv"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorPitchCtrlDeriv"), GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorZw"), stabDerivOutput.stabDerivs[3], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZwExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorZu"), stabDerivOutput.stabDerivs[6], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZuExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorZq"), stabDerivOutput.stabDerivs[9], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorZqExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorZDeltae"), stabDerivOutput.stabDerivs[12], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorZDeltaeExp"), 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorXw"), stabDerivOutput.stabDerivs[4], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXwExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorXu"), stabDerivOutput.stabDerivs[7], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXuExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorXq"), stabDerivOutput.stabDerivs[10], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorXqExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorXDeltae"), stabDerivOutput.stabDerivs[13], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorXDeltaeExp"), 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorMw"), stabDerivOutput.stabDerivs[5], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMwExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorMu"), stabDerivOutput.stabDerivs[8], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMuExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorMq"), stabDerivOutput.stabDerivs[11], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorMqExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorMDeltae"), stabDerivOutput.stabDerivs[14], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorMDeltaeExp"), 160, 1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorLatDeriv"), GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorSideslipDeriv"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorRollRateDeriv"), GUILayout.Width(160)); GUILayout.Label(Localizer.Format("FAREditorYawRateDeriv"), GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorYβ"), stabDerivOutput.stabDerivs[15], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorYβExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorYp"), stabDerivOutput.stabDerivs[18], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYpExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorYr"), stabDerivOutput.stabDerivs[21], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYrExp"), 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorLβ"), stabDerivOutput.stabDerivs[16], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorLβExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorLp"), stabDerivOutput.stabDerivs[19], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLpExp"), 160, -1); StabilityLabel(Localizer.Format("FAREditorLr"), stabDerivOutput.stabDerivs[22], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLrExp"), 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorNβ"), stabDerivOutput.stabDerivs[17], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorNβExp"), 160, 1); StabilityLabel(Localizer.Format("FAREditorNp"), stabDerivOutput.stabDerivs[20], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNpExp"), 160, 0); StabilityLabel(Localizer.Format("FAREditorNr"), stabDerivOutput.stabDerivs[23], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNrExp"), 160, -1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); DrawTooltip(); }
public GraphData AngleOfAttackSweep(double machNumber, double pitch, double lowerBound, double upperBound, int numPoints, int flapSetting, bool spoilers, CelestialBody body) { if (machNumber < 1E-3) { machNumber = 1E-3; } FARAeroUtil.UpdateCurrentActiveBody(body); FARAeroUtil.ResetEditorParts(); double[] ClValues = new double[(int)numPoints]; double[] CdValues = new double[(int)numPoints]; double[] CmValues = new double[(int)numPoints]; double[] LDValues = new double[(int)numPoints]; double[] AlphaValues = new double[(int)numPoints]; double[] ClValues2 = new double[(int)numPoints]; double[] CdValues2 = new double[(int)numPoints]; double[] CmValues2 = new double[(int)numPoints]; double[] LDValues2 = new double[(int)numPoints]; InstantConditionSimInput input = new InstantConditionSimInput(0, 0, 0, 0, 0, 0, FlightEnv.NewDefaultVal(body), pitch, flapSetting, spoilers); input.fltenv.MachNumber = machNumber; for (int i = 0; i < 2 * numPoints; i++) { double angle = 0; if (i < numPoints) { angle = lowerBound + (upperBound - lowerBound) * (i == 0? 0 : i / (numPoints - 1.0)); } else { angle = upperBound + (lowerBound - upperBound) * (i == numPoints ? 0 : (i - numPoints) / (numPoints - 1.0)); } input.alpha = angle; InstantConditionSimOutput output; _instantCondition.GetClCdCmSteady(input, out output, i == 0, false); if (i < numPoints) { AlphaValues[i] = angle; ClValues[i] = output.Cl; CdValues[i] = output.Cd; CmValues[i] = output.Cm; LDValues[i] = output.Cl * 0.1 / output.Cd; } else { ClValues2[numPoints * 2 - 1 - i] = output.Cl; CdValues2[numPoints * 2 - 1 - i] = output.Cd; CmValues2[numPoints * 2 - 1 - i] = output.Cm; LDValues2[numPoints * 2 - 1 - i] = output.Cl * 0.1 / output.Cd; } } GraphData data = new GraphData(); data.xValues = AlphaValues; data.AddData(ClValues2, GUIColors.GetColor(0) * 0.5f, "Cl2", false); data.AddData(ClValues, GUIColors.GetColor(0), Localizer.Format("FARAbbrevCl"), true); data.AddData(CdValues2, GUIColors.GetColor(1) * 0.5f, "Cd2", false); data.AddData(CdValues, GUIColors.GetColor(1), Localizer.Format("FARAbbrevCd"), true); data.AddData(CmValues2, GUIColors.GetColor(2) * 0.5f, "Cm2", false); data.AddData(CmValues, GUIColors.GetColor(2), Localizer.Format("FARAbbrevCm"), true); data.AddData(LDValues2, GUIColors.GetColor(3) * 0.5f, "L/D2", false); data.AddData(LDValues, GUIColors.GetColor(3), Localizer.Format("FARAbbrevL_D"), true); data.exportdata.AddSizeVariables(_instantCondition, pitch, flapSetting, spoilers); data.exportdata.AddAoASweepXVariable(machNumber, AlphaValues); data.exportdata.AddYVariables(data); return(data); }