private double SpinUp() { double EngPower_HP; running = false; EngStarting = true; fuelFlow_pph = 0.0; if (!GeneratorPower) { EngStarting = false; phase = phaseType.tpOff; StartTime = -1; return(0.0); } N1 = ExpSeek(N1, StarterN1, Idle_Max_Delay * 6, Idle_Max_Delay * 2.4); Eng_Temperature = ExpSeek(Eng_Temperature, TAT, 300, 400); double ITT_goal = ITT_N1.GetValue(N1, 0.1) + ((N1 > 20) ? 0.0 : (20 - N1) / 20.0 * Eng_Temperature); Eng_ITT_degC = ExpSeek(Eng_ITT_degC, ITT_goal, ITT_Delay, ITT_Delay * 1.2); OilTemp_degK = ExpSeek(OilTemp_degK, 273.15 + TAT, 400, 400); OilPressure_psi = (N1 / 100.0 * 0.25 + (0.1 - (OilTemp_degK - 273.15) * 0.1 / 80.0) * N1 / 100.0) / 7692.0e-6; //from MPa to psi NozzlePosition = 1.0; EngPower_HP = EnginePowerRPM_N1.GetValue(Prop_RPM, N1); EngPower_HP *= EnginePowerVC.GetValue(); if (EngPower_HP > MaxPower) { EngPower_HP = MaxPower; } if (StartTime >= 0) { StartTime += dt; } if (StartTime > MaxStartingTime && MaxStartingTime > 0) { //start failed due timeout phase = phaseType.tpOff; StartTime = -1; } ConsumeFuel(); // for possible setting Starved = false when fuel tank // is refilled (fuel crossfeed etc.) return(EngPower_HP); }
private double Start() { double EngPower_HP = 0.0, eff_coef; EngStarting = false; if ((N1 > 15.0) && !starved) { // minimum 15% N2 needed for start double old_N1 = N1; cranking = true; // provided for sound effects signal if (N1 < IdleN1) { EngPower_HP = EnginePowerRPM_N1.GetValue(Prop_RPM, N1); EngPower_HP *= EnginePowerVC.GetValue(); if (EngPower_HP > MaxPower) { EngPower_HP = MaxPower; } N1 = ExpSeek(N1, IdleN1 * 1.1, Idle_Max_Delay * 4, Idle_Max_Delay * 2.4); eff_coef = 9.333 - (N1) / 12; // 430%Fuel at 60%N1 fuelFlow_pph = PSFC * EngPower_HP * eff_coef; Eng_Temperature = ExpSeek(Eng_Temperature, Eng_ITT_degC, 300, 400); double ITT_goal = ITT_N1.GetValue((N1 - old_N1) * 300 + N1, 1); Eng_ITT_degC = ExpSeek(Eng_ITT_degC, ITT_goal, ITT_Delay, ITT_Delay * 1.2); OilPressure_psi = (N1 / 100.0 * 0.25 + (0.1 - (OilTemp_degK - 273.15) * 0.1 / 80.0) * N1 / 100.0) / 7692.0e-6; //from MPa to psi OilTemp_degK = Seek(OilTemp_degK, 353.15, 0.4 - N1 * 0.001, 0.04); } else { phase = phaseType.tpRun; running = true; Starter = false; cranking = false; fuelFlow_pph = 0; EngPower_HP = 0.0; } } else { // no start if N2 < 15% or Starved phase = phaseType.tpOff; Starter = false; } ConsumeFuel(); return(EngPower_HP); }
private double Run() { //TODO check it. Not used double idlethrust, milthrust; double thrust = 0.0, EngPower_HP, eff_coef; running = true; Starter = false; EngStarting = false; //--- double old_N1 = N1; N1 = ExpSeek(N1, IdleN1 + ThrottleCmd * N1_factor, Idle_Max_Delay, Idle_Max_Delay * 2.4); EngPower_HP = EnginePowerRPM_N1.GetValue(Prop_RPM, N1); EngPower_HP *= EnginePowerVC.GetValue(); if (EngPower_HP > MaxPower) { EngPower_HP = MaxPower; } eff_coef = 9.333 - (N1) / 12; // 430%Fuel at 60%N1 fuelFlow_pph = PSFC * EngPower_HP * eff_coef; Eng_Temperature = ExpSeek(Eng_Temperature, Eng_ITT_degC, 300, 400); double ITT_goal = ITT_N1.GetValue((N1 - old_N1) * 300 + N1, 1); Eng_ITT_degC = ExpSeek(Eng_ITT_degC, ITT_goal, ITT_Delay, ITT_Delay * 1.2); OilPressure_psi = (N1 / 100.0 * 0.25 + (0.1 - (OilTemp_degK - 273.15) * 0.1 / 80.0) * N1 / 100.0) / 7692.0e-6; //from MPa to psi //--- EPR = 1.0 + thrust / MilThrust; OilTemp_degK = Seek(OilTemp_degK, 353.15, 0.4 - N1 * 0.001, 0.04); ConsumeFuel(); if (Cutoff) { phase = phaseType.tpOff; } if (starved) { phase = phaseType.tpOff; } return(EngPower_HP); }
private void Load(FDMExecutive exec, XmlElement element) { string property_prefix = "propulsion/engine[" + engineNumber + "]/"; IdleFF = -1; MaxStartingTime = 999999; //very big timeout -> infinite Ielu_max_torque = -1; // ToDo: Need to make sure units are properly accounted for below. string token; XmlElement tmpElem; foreach (XmlNode currentNode in element.ChildNodes) { if (currentNode.NodeType == XmlNodeType.Element) { tmpElem = currentNode as XmlElement; token = tmpElem.LocalName; if (token.Equals("milthrust")) { MilThrust = FormatHelper.ValueAsNumberConvertTo(tmpElem, "LBS"); } else if (token.Equals("idlen1")) { IdleN1 = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("idlen2")) { IdleN2 = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("maxn1")) { MaxN1 = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("maxn2")) { MaxN2 = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("betarangeend")) { BetaRangeThrottleEnd = FormatHelper.ValueAsNumber(tmpElem) / 100.0; } else if (token.Equals("reversemaxpower")) { ReverseMaxPower = FormatHelper.ValueAsNumber(tmpElem) / 100.0; } else if (token.Equals("maxpower")) { MaxPower = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("idlefuelflow")) { IdleFF = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("psfc")) { PSFC = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("n1idle_max_delay")) { Idle_Max_Delay = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("maxstartingtime")) { MaxStartingTime = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("startern1")) { StarterN1 = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("ielumaxtorque")) { Ielu_max_torque = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("itt_delay")) { ITT_Delay = FormatHelper.ValueAsNumber(tmpElem); } else if (token.Equals("table")) { string name = tmpElem.GetAttribute("name"); if (name.Equals("EnginePowerVC")) { EnginePowerVC = new Table(exec.PropertyManager, tmpElem); } else if (name.Equals("EnginePowerRPM_N1")) { EnginePowerRPM_N1 = new Table(exec.PropertyManager, tmpElem); } else if (name.Equals("ITT_N1")) { ITT_N1 = new Table(exec.PropertyManager, tmpElem); } else { if (log.IsErrorEnabled) { log.Error("Unknown table type: " + name + " in turbine definition."); } throw new Exception("Unknown table type: " + name + " in turbine definition."); } } } } // Pre-calculations and initializations delay = 1; N1_factor = MaxN1 - IdleN1; N2_factor = MaxN2 - IdleN2; OilTemp_degK = (exec.Auxiliary.TotalTemperature - 491.69) * 0.5555556 + 273.0; if (IdleFF == -1) { IdleFF = Math.Pow(MilThrust, 0.2) * 107.0; // just an estimate } if (log.IsDebugEnabled) { log.Debug("ENG POWER:" + EnginePowerRPM_N1.GetValue(1200, 90)); } }