1999-02-05 21:26:01 +00:00
|
|
|
/*******************************************************************************
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
********************************************************************************
|
|
|
|
INCLUDES
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
#include <fstream.h>
|
|
|
|
|
1999-02-11 21:05:34 +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-02-05 21:26:01 +00:00
|
|
|
/*******************************************************************************
|
|
|
|
************************************ CODE **************************************
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
1999-02-26 22:09:10 +00:00
|
|
|
FGEngine::FGEngine(FGFDMExec* fdex, string enginePath, string engineName,
|
|
|
|
int num)
|
1999-02-05 21:26:01 +00:00
|
|
|
{
|
1999-02-26 22:09:10 +00:00
|
|
|
string fullpath;
|
|
|
|
string tag;
|
1999-02-11 21:05:34 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
1999-02-26 22:09:10 +00:00
|
|
|
Name = engineName;
|
|
|
|
fullpath = enginePath + "/" + engineName + ".dat";
|
|
|
|
ifstream enginefile(fullpath.c_str());
|
1999-02-05 21:26:01 +00:00
|
|
|
|
|
|
|
if (enginefile) {
|
|
|
|
enginefile >> tag;
|
1999-02-26 22:09:10 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
enginefile >> X;
|
|
|
|
enginefile >> Y;
|
|
|
|
enginefile >> Z;
|
|
|
|
enginefile >> SLThrustMax;
|
|
|
|
enginefile >> VacThrustMax;
|
|
|
|
enginefile >> MaxThrottle;
|
|
|
|
enginefile >> MinThrottle;
|
|
|
|
enginefile >> SLFuelFlowMax;
|
1999-02-26 22:09:10 +00:00
|
|
|
if (Type == 1)
|
1999-02-05 21:26:01 +00:00
|
|
|
enginefile >> SLOxiFlowMax;
|
|
|
|
enginefile.close();
|
|
|
|
} else {
|
|
|
|
cerr << "Unable to open engine definition file " << engineName << endl;
|
|
|
|
}
|
|
|
|
|
1999-02-11 21:05:34 +00:00
|
|
|
EngineNumber = num;
|
1999-02-05 21:26:01 +00:00
|
|
|
Thrust = 0.0;
|
|
|
|
Starved = Flameout = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FGEngine::~FGEngine(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float FGEngine::CalcRocketThrust(void)
|
|
|
|
{
|
|
|
|
float lastThrust;
|
|
|
|
|
1999-02-11 21:05:34 +00:00
|
|
|
Throttle = FCS->GetThrottle(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;
|
1999-02-11 21:05:34 +00:00
|
|
|
Thrust = PctPower*((1.0 - Atmosphere->Getrho() / 0.002378)*(VacThrustMax - SLThrustMax) +
|
1999-02-05 21:26:01 +00:00
|
|
|
SLThrustMax); // desired thrust
|
|
|
|
Flameout = false;
|
|
|
|
}
|
|
|
|
|
1999-02-26 22:09:10 +00:00
|
|
|
Thrust += 0.8*(Thrust - lastThrust); // actual thrust
|
1999-02-05 21:26:01 +00:00
|
|
|
|
|
|
|
return Thrust;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float FGEngine::CalcPistonThrust(void)
|
|
|
|
{
|
|
|
|
return Thrust;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float FGEngine::CalcThrust(void)
|
|
|
|
{
|
|
|
|
switch(Type) {
|
1999-02-26 22:09:10 +00:00
|
|
|
case etRocket:
|
1999-02-05 21:26:01 +00:00
|
|
|
return CalcRocketThrust();
|
1999-02-11 21:05:34 +00:00
|
|
|
// break;
|
1999-02-26 22:09:10 +00:00
|
|
|
case etPiston:
|
1999-02-05 21:26:01 +00:00
|
|
|
return CalcPistonThrust();
|
1999-02-11 21:05:34 +00:00
|
|
|
// break;
|
1999-02-05 21:26:01 +00:00
|
|
|
default:
|
|
|
|
return 9999.0;
|
1999-02-11 21:05:34 +00:00
|
|
|
// break;
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
float FGEngine::CalcFuelNeed() {
|
|
|
|
FuelNeed = SLFuelFlowMax*PctPower;
|
|
|
|
return FuelNeed;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float FGEngine::CalcOxidizerNeed() {
|
|
|
|
OxidizerNeed = SLOxiFlowMax*PctPower;
|
|
|
|
return OxidizerNeed;
|
|
|
|
}
|
|
|
|
|