X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2FFGEngine.cpp;h=bc73911a8630af43e1d3871c2a41b003d6adbb72;hb=fbee3d10f0aafd4178fc1313edb8593c156b2874;hp=eab3cd3fcde97e8a2ae6d055cf8fcf7a85fae95b;hpb=9a207fb4e10eb88c410499eb641e0c27c4ad6f68;p=flightgear.git diff --git a/src/FDM/JSBSim/FGEngine.cpp b/src/FDM/JSBSim/FGEngine.cpp index eab3cd3fc..bc73911a8 100644 --- a/src/FDM/JSBSim/FGEngine.cpp +++ b/src/FDM/JSBSim/FGEngine.cpp @@ -1,219 +1,219 @@ -/******************************************************************************* - +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Module: FGEngine.cpp Author: Jon Berndt Date started: 01/21/99 Called by: FGAircraft - + ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + Further information about the GNU General Public License can also be found on the world wide web at http://www.gnu.org. - + FUNCTIONAL DESCRIPTION -------------------------------------------------------------------------------- See header file. - + HISTORY -------------------------------------------------------------------------------- 01/21/99 JSB Created 09/03/99 JSB Changed Rocket thrust equation to correct -= Thrust instead of += Thrust (thanks to Tony Peden) - -******************************************************************************** + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INCLUDES -*******************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #ifdef FGFS -# include -# ifdef FG_HAVE_STD_INCLUDES +# include +# ifdef SG_HAVE_STD_INCLUDES # include # else # include # endif #else -# include +# if defined(sgi) && !defined(__GNUC__) && (_COMPILER_VERSION < 740) +# include +# else +# include +# endif #endif #include "FGEngine.h" -#include "FGState.h" -#include "FGFDMExec.h" -#include "FGAtmosphere.h" -#include "FGFCS.h" -#include "FGAircraft.h" -#include "FGTranslation.h" -#include "FGRotation.h" -#include "FGPosition.h" -#include "FGAuxiliary.h" -#include "FGOutput.h" -#include "FGDefs.h" - -/******************************************************************************* -************************************ CODE ************************************** -*******************************************************************************/ - - -FGEngine::FGEngine(FGFDMExec* fdex, string enginePath, string engineName, int num) -{ - string fullpath; - string tag; +#include "FGTank.h" - FDMExec = fdex; +namespace JSBSim { - State = FDMExec->GetState(); - Atmosphere = FDMExec->GetAtmosphere(); - FCS = FDMExec->GetFCS(); - Aircraft = FDMExec->GetAircraft(); - Translation = FDMExec->GetTranslation(); - Rotation = FDMExec->GetRotation(); - Position = FDMExec->GetPosition(); - Auxiliary = FDMExec->GetAuxiliary(); - Output = FDMExec->GetOutput(); - - Name = engineName; -#ifdef MACOS - fullpath = enginePath + ":" + engineName + ".dat"; -#else - fullpath = enginePath + "/" + engineName + ".dat"; -#endif - ifstream enginefile(fullpath.c_str()); - - if (enginefile) { - enginefile >> tag; - - if (tag == "ROCKET") Type = etRocket; - else if (tag == "PISTON") Type = etPiston; - else if (tag == "TURBOPROP") Type = etTurboProp; - else if (tag == "TURBOJET") Type = etTurboJet; - else Type = etUnknown; - - switch(Type) - { - case etUnknown: - cerr << "Unknown engine type: " << tag << endl; - break; - case etPiston: - enginefile >> X; - enginefile >> Y; - enginefile >> Z; - enginefile >> BrakeHorsePower; - enginefile >> MaxThrottle; - enginefile >> MinThrottle; - enginefile >> SLFuelFlowMax; - enginefile >> SpeedSlope; - enginefile >> SpeedIntercept; - enginefile >> AltitudeSlope; - - break; - case etRocket: - enginefile >> X; - enginefile >> Y; - enginefile >> Z; - enginefile >> SLThrustMax; - enginefile >> VacThrustMax; - enginefile >> MaxThrottle; - enginefile >> MinThrottle; - enginefile >> SLFuelFlowMax; - enginefile >> SLOxiFlowMax; - break; - } +static const char *IdSrc = "$Id$"; +static const char *IdHdr = ID_ENGINE; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS IMPLEMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - enginefile.close(); - } else { - cerr << "Unable to open engine definition file " << fullpath << endl; - } - EngineNumber = num; +FGEngine::FGEngine(FGFDMExec* exec) +{ + Name = ""; + Type = etUnknown; + X = Y = Z = 0.0; + EnginePitch = EngineYaw = 0.0; + SLFuelFlowMax = SLOxiFlowMax = 0.0; + MaxThrottle = 1.0; + MinThrottle = 0.0; Thrust = 0.0; - Starved = Flameout = false; + Throttle = 0.0; + Mixture = 1.0; + Starter = false; + FuelNeed = OxidizerNeed = 0.0; + Starved = Running = Cranking = false; + PctPower = 0.0; + EngineNumber = -1; + TrimMode = false; + FuelFlow_gph = 0.0; + FuelFlow_pph = 0.0; + + FDMExec = exec; + State = FDMExec->GetState(); + Atmosphere = FDMExec->GetAtmosphere(); + FCS = FDMExec->GetFCS(); + Propulsion = FDMExec->GetPropulsion(); + Aircraft = FDMExec->GetAircraft(); + Translation = FDMExec->GetTranslation(); + Rotation = FDMExec->GetRotation(); + Position = FDMExec->GetPosition(); + Auxiliary = FDMExec->GetAuxiliary(); + Output = FDMExec->GetOutput(); + + PropertyManager = FDMExec->GetPropertyManager(); + + Debug(0); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FGEngine::~FGEngine(void) +FGEngine::~FGEngine() { + Debug(1); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// This base class function should be called from within the +// derived class' Calculate() function before any other calculations are done. +// This base class method removes fuel from the fuel tanks as appropriate, +// and sets the starved flag if necessary. -float FGEngine::CalcRocketThrust(void) +void FGEngine::ConsumeFuel(void) { - float lastThrust; - - Throttle = FCS->GetThrottle(EngineNumber); - lastThrust = Thrust; // last actual thrust - - if (Throttle < MinThrottle || Starved) { - PctPower = Thrust = 0.0; // desired thrust - Flameout = true; - } else { - PctPower = Throttle / MaxThrottle; - Thrust = PctPower*((1.0 - Atmosphere->Getrho() / 0.002378)*(VacThrustMax - SLThrustMax) + - SLThrustMax); // desired thrust - Flameout = false; + double Fshortage, Oshortage; + FGTank* Tank; + + if (TrimMode) return; + Fshortage = Oshortage = 0.0; + for (unsigned int i=0; iGetTank(SourceTanks[i]); + if (Tank->GetType() == FGTank::ttFUEL) { + Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks()); + } else { + Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks()); + } } - Thrust -= 0.8*(Thrust - lastThrust); // actual thrust - - return Thrust; + if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true; + else Starved = false; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGEngine::CalcPistonThrust(void) +double FGEngine::CalcFuelNeed(void) { - float v,h,pa; - - Throttle = FCS->GetThrottle(EngineNumber); - Throttle /= 100; - - v=State->GetVt(); - h=State->Geth(); - if(v < 10) - v=10; - if(h < 0) - h=0; - pa=(SpeedSlope*v + SpeedIntercept)*(1 +AltitudeSlope*h)*BrakeHorsePower; - Thrust= Throttle*(pa*HPTOFTLBSSEC)/v; - - return Thrust; + FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return FuelNeed; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGEngine::CalcThrust(void) +double FGEngine::CalcOxidizerNeed(void) { - switch(Type) { - case etRocket: - return CalcRocketThrust(); - // break; - case etPiston: - return CalcPistonThrust(); - // break; - default: - return 9999.0; - // break; - } + OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return OxidizerNeed; } -float FGEngine::CalcFuelNeed() { - FuelNeed = SLFuelFlowMax*PctPower; - return FuelNeed; +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGEngine::SetPlacement(double x, double y, double z, double pitch, double yaw) +{ + X = x; + Y = y; + Z = z; + EnginePitch = pitch; + EngineYaw = yaw; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGEngine::CalcOxidizerNeed() { - OxidizerNeed = SLOxiFlowMax*PctPower; - return OxidizerNeed; +void FGEngine::AddFeedTank(int tkID) +{ + SourceTanks.push_back(tkID); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// The bitmasked value choices are as follows: +// unset: In this case (the default) JSBSim would only print +// out the normally expected messages, essentially echoing +// the config files as they are read. If the environment +// variable is not set, debug_lvl is set to 1 internally +// 0: This requests JSBSim not to output any messages +// whatsoever. +// 1: This value explicity requests the normal JSBSim +// startup messages +// 2: This value asks for a message to be printed out when +// a class is instantiated +// 4: When this value is set, a message is displayed when a +// FGModel object executes its Run() method +// 8: When this value is set, various runtime state variables +// are printed out periodically +// 16: When set various parameters are sanity checked and +// a message is printed out when they go out of bounds + +void FGEngine::Debug(int from) +{ + if (debug_lvl <= 0) return; + + if (debug_lvl & 1) { // Standard console startup message output + if (from == 0) { // Constructor + + } + } + if (debug_lvl & 2 ) { // Instantiation/Destruction notification + if (from == 0) cout << "Instantiated: FGEngine" << endl; + if (from == 1) cout << "Destroyed: FGEngine" << endl; + } + if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects + } + if (debug_lvl & 8 ) { // Runtime state variables + } + if (debug_lvl & 16) { // Sanity checking + } + if (debug_lvl & 64) { + if (from == 0) { // Constructor + cout << IdSrc << endl; + cout << IdHdr << endl; + } + } +} +}