1
0
Fork 0
flightgear/src/FDM/JSBSim/FGEngine.cpp

238 lines
6 KiB
C++
Raw Normal View History

2000-11-03 23:02:47 +00:00
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1999-02-05 21:26:01 +00:00
Module: FGEngine.cpp
Author: Jon Berndt
Date started: 01/21/99
Called by: FGAircraft
1999-02-05 21:26:01 +00:00
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
1999-02-05 21:26:01 +00:00
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.
1999-02-05 21:26:01 +00:00
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.
1999-02-05 21:26:01 +00:00
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.
1999-02-05 21:26:01 +00:00
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
1999-02-05 21:26:01 +00:00
FUNCTIONAL DESCRIPTION
--------------------------------------------------------------------------------
See header file.
1999-02-05 21:26:01 +00:00
HISTORY
--------------------------------------------------------------------------------
01/21/99 JSB Created
1999-09-07 23:15:45 +00:00
09/03/99 JSB Changed Rocket thrust equation to correct -= Thrust instead of
+= Thrust (thanks to Tony Peden)
2000-11-03 23:02:47 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1999-02-05 21:26:01 +00:00
INCLUDES
2000-11-03 23:02:47 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
1999-02-05 21:26:01 +00:00
#ifdef FGFS
2000-02-15 03:30:01 +00:00
# include <simgear/compiler.h>
# ifdef FG_HAVE_STD_INCLUDES
# include <fstream>
# else
# include <fstream.h>
# endif
#else
# include <fstream>
#endif
1999-02-05 21:26:01 +00:00
#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"
1999-12-20 20:24:49 +00:00
#include "FGDefs.h"
static const char *IdSrc = "$Header$";
static const char *IdHdr = "ID_ENGINE";
2000-11-03 23:02:47 +00:00
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
1999-02-05 21:26:01 +00:00
FGEngine::FGEngine(FGFDMExec* fdex, string enginePath, string engineName, int num) {
string fullpath;
string tag;
FDMExec = fdex;
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();
1999-02-05 21:26:01 +00:00
Name = engineName;
2000-10-02 23:07:30 +00:00
# ifndef macintosh
fullpath = enginePath + "/" + engineName + ".xml";
# else
fullpath = enginePath + ";" + engineName + ".xml";
# endif
cout << " Reading engine: " << engineName << " from file: " << fullpath << endl;
ifstream enginefile(fullpath.c_str());
1999-02-05 21:26:01 +00:00
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) {
2000-10-02 23:07:30 +00:00
case etTurboProp:
case etTurboJet:
cerr << "Unsupported Engine type" << tag << endl;
break;
1999-12-20 20:24:49 +00:00
case etUnknown:
cerr << "Unknown engine type: " << tag << endl;
break;
case etPiston:
enginefile >> X;
enginefile >> Y;
enginefile >> Z;
2000-07-06 21:02:46 +00:00
enginefile >> EnginePitch;
enginefile >> EngineYaw;
1999-12-20 20:24:49 +00:00
enginefile >> BrakeHorsePower;
enginefile >> MaxThrottle;
enginefile >> MinThrottle;
enginefile >> SLFuelFlowMax;
enginefile >> SpeedSlope;
enginefile >> SpeedIntercept;
enginefile >> AltitudeSlope;
break;
case etRocket:
enginefile >> X;
enginefile >> Y;
enginefile >> Z;
2000-07-06 21:02:46 +00:00
enginefile >> EnginePitch;
enginefile >> EngineYaw;
1999-12-20 20:24:49 +00:00
enginefile >> SLThrustMax;
enginefile >> VacThrustMax;
enginefile >> MaxThrottle;
enginefile >> MinThrottle;
enginefile >> SLFuelFlowMax;
1999-02-05 21:26:01 +00:00
enginefile >> SLOxiFlowMax;
1999-12-20 20:24:49 +00:00
break;
}
1999-02-05 21:26:01 +00:00
enginefile.close();
} else {
2000-10-02 23:07:30 +00:00
cerr << "Unable to open engine definition file " << fullpath.c_str() << endl;
1999-02-05 21:26:01 +00:00
}
EngineNumber = num;
2000-04-28 19:59:46 +00:00
Thrust = PctPower = 0.0;
1999-02-05 21:26:01 +00:00
Starved = Flameout = false;
2000-10-02 23:07:30 +00:00
Running = true;
1999-02-05 21:26:01 +00:00
}
FGEngine::~FGEngine(void) {}
1999-02-05 21:26:01 +00:00
float FGEngine::CalcRocketThrust(void) {
1999-02-05 21:26:01 +00:00
float lastThrust;
2000-04-24 23:49:06 +00:00
Throttle = FCS->GetThrottlePos(EngineNumber);
1999-02-05 21:26:01 +00:00
lastThrust = Thrust; // last actual thrust
if (Throttle < MinThrottle || Starved) {
PctPower = Thrust = 0.0; // desired thrust
Flameout = true;
} else {
PctPower = Throttle / MaxThrottle;
2000-04-24 23:49:06 +00:00
Thrust = PctPower*((1.0 - Atmosphere->GetDensityRatio())*(VacThrustMax - SLThrustMax) +
1999-12-20 20:24:49 +00:00
SLThrustMax); // desired thrust
1999-02-05 21:26:01 +00:00
Flameout = false;
}
2000-10-02 23:07:30 +00:00
if(State->Getdt() > 0.0) {
Thrust -= 0.8*(Thrust - lastThrust); // actual thrust
}
1999-02-05 21:26:01 +00:00
return Thrust;
}
float FGEngine::CalcPistonThrust(void) {
1999-12-20 20:24:49 +00:00
float v,h,pa;
2000-04-24 23:49:06 +00:00
Throttle = FCS->GetThrottlePos(EngineNumber);
2000-01-10 21:07:00 +00:00
Throttle /= 100;
2000-04-28 19:59:46 +00:00
2000-10-02 23:07:30 +00:00
v = Translation->GetVt();
h = Position->Geth();
if (v < 10)
v = 10;
if (h < 0)
h = 0;
1999-12-20 20:24:49 +00:00
pa=(SpeedSlope*v + SpeedIntercept)*(1 +AltitudeSlope*h)*BrakeHorsePower;
2000-10-02 23:07:30 +00:00
Thrust = Throttle*(pa*HPTOFTLBSSEC)/v;
1999-12-20 20:24:49 +00:00
1999-02-05 21:26:01 +00:00
return Thrust;
}
float FGEngine::CalcThrust(void) {
2000-10-02 23:07:30 +00:00
if(Running) {
switch(Type) {
case etRocket:
return CalcRocketThrust();
// break;
case etPiston:
return CalcPistonThrust();
// break;
default:
return 9999.0;
// break;
}
} else {
return 0;
1999-02-05 21:26:01 +00:00
}
}
float FGEngine::CalcFuelNeed() {
FuelNeed = SLFuelFlowMax*PctPower;
return FuelNeed;
}
float FGEngine::CalcOxidizerNeed() {
OxidizerNeed = SLOxiFlowMax*PctPower;
return OxidizerNeed;
}