From: curt Date: Mon, 29 Oct 2001 18:25:19 +0000 (+0000) Subject: Update JSBSim files to latest JSBSim CVS. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=c74c2f224f04a735fd53817aeb142e5613fda84c;p=flightgear.git Update JSBSim files to latest JSBSim CVS. --- diff --git a/src/FDM/JSBSim/FGConfigFile.cpp b/src/FDM/JSBSim/FGConfigFile.cpp index 3585cc2ea..85963b995 100644 --- a/src/FDM/JSBSim/FGConfigFile.cpp +++ b/src/FDM/JSBSim/FGConfigFile.cpp @@ -60,16 +60,42 @@ FGConfigFile::~FGConfigFile() string FGConfigFile::GetNextConfigLine(void) { + int deblank; + do { CurrentLine = GetLine(); if ((CurrentLine.find("") != CurrentLine.npos) || - (CurrentLine.find("") != CurrentLine.npos)) { CommentsOn = false; + + if (CurrentLine.find("-->") != CurrentLine.npos) + CurrentLine.erase(CurrentLine.find("-->"),4); + else if (CurrentLine.find("") != CurrentLine.npos) + CurrentLine.erase(CurrentLine.find(""),10); + + while((deblank = CurrentLine.find(" ")) != CurrentLine.npos) CurrentLine.erase(deblank,1); + if (CurrentLine.size() <= 2) CurrentLine = ""; + + CommentString += CurrentLine; GetNextConfigLine(); } + + if (CommentsOn) CommentString += CurrentLine + "\r\n"; + } while (IsCommentLine()); + if (CurrentLine.length() == 0) GetNextConfigLine(); CurrentIndex = 0; return CurrentLine; @@ -77,6 +103,13 @@ string FGConfigFile::GetNextConfigLine(void) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +string FGConfigFile::GetCommentString(void) +{ + return CommentString; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + string FGConfigFile::GetValue(string val) { unsigned int pos, p1, p2, ptest; diff --git a/src/FDM/JSBSim/FGConfigFile.h b/src/FDM/JSBSim/FGConfigFile.h index 7eb77d69c..60f022de0 100644 --- a/src/FDM/JSBSim/FGConfigFile.h +++ b/src/FDM/JSBSim/FGConfigFile.h @@ -117,6 +117,7 @@ public: string GetNextConfigLine(void); string GetValue(string); string GetValue(void); + string GetCommentString(void); bool IsCommentLine(void); bool IsOpen(void) {return Opened;} FGConfigFile& operator>>(double&); @@ -129,6 +130,7 @@ public: private: ifstream cfgfile; string CurrentLine; + string CommentString; bool CommentsOn; bool Opened; unsigned int CurrentIndex; diff --git a/src/FDM/JSBSim/FGDefs.h b/src/FDM/JSBSim/FGDefs.h index 44398ffac..5344ef525 100644 --- a/src/FDM/JSBSim/FGDefs.h +++ b/src/FDM/JSBSim/FGDefs.h @@ -1,129 +1,129 @@ -/******************************************************************************* - - Header: FGDefs.h - Author: Jon S. Berndt - Date started: 02/01/99 - - ------------- 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. - -HISTORY --------------------------------------------------------------------------------- -02/01/99 JSB Created - -******************************************************************************** -SENTRY -*******************************************************************************/ - -#ifndef FGDEFS_H -#define FGDEFS_H - -#define GRAVITY 32.174 -#define INVGRAVITY 0.031081 -#define EARTHRAD 20925650.00 // feet, equatorial -#define EARTHRADSQRD 437882827922500.0 -#define ONESECOND 4.848136811E-6 -#define Reng 1716 //Specific Gas Constant,ft^2/(sec^2*R) -#define SHRATIO 1.4 //Specific Heat Ratio -#define RADTODEG 57.29578 -#define DEGTORAD 1.745329E-2 -#define KTSTOFPS 1.68781 -#define FPSTOKTS 0.592484 -#define INCHTOFT 0.08333333 -#define OMEGA_EARTH .00007272205217 -#define NEEDED_CFG_VERSION "1.40" -#define JSBSIM_VERSION "0.8.7" - -#define HPTOFTLBSSEC 550 -#define METERS_TO_FEET 3.2808 - -#if defined ( sgi ) && !defined( __GNUC__ ) -#define __STL_FUNCTION_TMPL_PARTIAL_ORDER -#endif - -enum eParam { - FG_UNDEF = 0, - FG_TIME, - FG_QBAR, - FG_WINGAREA, - FG_WINGSPAN, - FG_CBAR, - FG_ALPHA, - FG_ALPHADOT, - FG_BETA, - FG_BETADOT, - FG_PHI, - FG_THT, - FG_PSI, - FG_PITCHRATE, - FG_ROLLRATE, - FG_YAWRATE, - FG_CL_SQRD, - FG_MACH, - FG_ALTITUDE, - FG_BI2VEL, - FG_CI2VEL, - FG_ELEVATOR_POS, - FG_AILERON_POS, - FG_RUDDER_POS, - FG_SPDBRAKE_POS, - FG_SPOILERS_POS, - FG_FLAPS_POS, - FG_ELEVATOR_CMD, - FG_AILERON_CMD, - FG_RUDDER_CMD, - FG_SPDBRAKE_CMD, - FG_SPOILERS_CMD, - FG_FLAPS_CMD, - FG_THROTTLE_CMD, - FG_THROTTLE_POS, +/******************************************************************************* + + Header: FGDefs.h + Author: Jon S. Berndt + Date started: 02/01/99 + + ------------- 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. + +HISTORY +-------------------------------------------------------------------------------- +02/01/99 JSB Created + +******************************************************************************** +SENTRY +*******************************************************************************/ + +#ifndef FGDEFS_H +#define FGDEFS_H + +#define GRAVITY 32.174 +#define INVGRAVITY 0.031081 +#define EARTHRAD 20925650.00 // feet, equatorial +#define EARTHRADSQRD 437882827922500.0 +#define ONESECOND 4.848136811E-6 +#define Reng 1716 //Specific Gas Constant,ft^2/(sec^2*R) +#define SHRATIO 1.4 //Specific Heat Ratio +#define RADTODEG 57.29578 +#define DEGTORAD 1.745329E-2 +#define KTSTOFPS 1.68781 +#define FPSTOKTS 0.592484 +#define INCHTOFT 0.08333333 +#define OMEGA_EARTH .00007272205217 +#define NEEDED_CFG_VERSION "1.50" +#define JSBSIM_VERSION "0.9.0" + +#define HPTOFTLBSSEC 550 +#define METERS_TO_FEET 3.2808 + +#if defined ( sgi ) && !defined( __GNUC__ ) +#define __STL_FUNCTION_TMPL_PARTIAL_ORDER +#endif + +enum eParam { + FG_UNDEF = 0, + FG_TIME, + FG_QBAR, + FG_WINGAREA, + FG_WINGSPAN, + FG_CBAR, + FG_ALPHA, + FG_ALPHADOT, + FG_BETA, + FG_BETADOT, + FG_PHI, + FG_THT, + FG_PSI, + FG_PITCHRATE, + FG_ROLLRATE, + FG_YAWRATE, + FG_CL_SQRD, + FG_MACH, + FG_ALTITUDE, + FG_BI2VEL, + FG_CI2VEL, + FG_ELEVATOR_POS, + FG_AILERON_POS, + FG_RUDDER_POS, + FG_SPDBRAKE_POS, + FG_SPOILERS_POS, + FG_FLAPS_POS, + FG_ELEVATOR_CMD, + FG_AILERON_CMD, + FG_RUDDER_CMD, + FG_SPDBRAKE_CMD, + FG_SPOILERS_CMD, + FG_FLAPS_CMD, + FG_THROTTLE_CMD, + FG_THROTTLE_POS, FG_MIXTURE_CMD, FG_MIXTURE_POS, - FG_ACTIVE_ENGINE, - FG_HOVERB, - FG_PITCH_TRIM_CMD, - FG_LEFT_BRAKE_CMD, - FG_CENTER_BRAKE_CMD, - FG_RIGHT_BRAKE_CMD, - FG_SET_LOGGING, - FG_ALPHAH, - FG_ALPHAW, - FG_LBARH, //normalized horizontal tail arm - FG_LBARV, //normalized vertical tail arm - FG_HTAILAREA, - FG_VTAILAREA, - FG_VBARH, //horizontal tail volume - FG_VBARV //vertical tail volume -}; - -enum eAction { - FG_RAMP = 1, - FG_STEP = 2, - FG_EXP = 3 -}; - -enum eType { - FG_VALUE = 1, - FG_DELTA = 2, - FG_BOOL = 3 -}; - -/******************************************************************************/ -#endif - + FG_ACTIVE_ENGINE, + FG_HOVERB, + FG_PITCH_TRIM_CMD, + FG_LEFT_BRAKE_CMD, + FG_CENTER_BRAKE_CMD, + FG_RIGHT_BRAKE_CMD, + FG_SET_LOGGING, + FG_ALPHAH, + FG_ALPHAW, + FG_LBARH, //normalized horizontal tail arm + FG_LBARV, //normalized vertical tail arm + FG_HTAILAREA, + FG_VTAILAREA, + FG_VBARH, //horizontal tail volume + FG_VBARV //vertical tail volume +}; + +enum eAction { + FG_RAMP = 1, + FG_STEP = 2, + FG_EXP = 3 +}; + +enum eType { + FG_VALUE = 1, + FG_DELTA = 2, + FG_BOOL = 3 +}; + +/******************************************************************************/ +#endif + diff --git a/src/FDM/JSBSim/FGEngine.cpp b/src/FDM/JSBSim/FGEngine.cpp index fe0aca43b..8488c4fbf 100644 --- a/src/FDM/JSBSim/FGEngine.cpp +++ b/src/FDM/JSBSim/FGEngine.cpp @@ -1,159 +1,161 @@ -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - 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 SG_HAVE_STD_INCLUDES -# include -# else -# include -# endif -#else -# if defined(sgi) && !defined(__GNUC__) -# include -# else -# include -# endif -#endif - -#include "FGEngine.h" -#include "FGTank.h" - -static const char *IdSrc = "$Id$"; -static const char *IdHdr = ID_ENGINE; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CLASS IMPLEMENTATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - - -FGEngine::FGEngine(FGFDMExec* exec) { - 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(); - - Mixture = 1.0; // FIXME: get actual value - Thrust = PctPower = 0.0; - Starved = Flameout = false; - Running = true; - - if (debug_lvl & 2) cout << "Instantiated: FGEngine" << endl; - TrimMode = false; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FGEngine::~FGEngine() -{ - if (debug_lvl & 2) cout << "Destroyed: FGEngine" << endl; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// 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. - -void FGEngine::ConsumeFuel(void) { - float Fshortage, Oshortage; - FGTank* Tank; - - if (TrimMode) return; - - Fshortage = Oshortage = 0.0; - for (unsigned int i=0; iGetTank(i); - if (Tank->GetType() == FGTank::ttFUEL) { - Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks()); - } else { - Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks()); - } - } - - if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true; - else Starved = false; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -float FGEngine::CalcFuelNeed(void) { - FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); - return FuelNeed; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -float FGEngine::CalcOxidizerNeed(void) { - OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); - return OxidizerNeed; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGEngine::SetPlacement(float x, float y, float z, float pitch, float yaw) { - X = x; - Y = y; - Z = z; - EnginePitch = pitch; - EngineYaw = yaw; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGEngine::AddFeedTank(int tkID) -{ - SourceTanks.push_back(tkID); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGEngine::Debug(void) -{ - //TODO: Add your source code here -} - +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + 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 SG_HAVE_STD_INCLUDES +# include +# else +# include +# endif +#else +# if defined(sgi) && !defined(__GNUC__) +# include +# else +# include +# endif +#endif + +#include "FGEngine.h" +#include "FGTank.h" + +static const char *IdSrc = "$Id$"; +static const char *IdHdr = ID_ENGINE; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS IMPLEMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + + +FGEngine::FGEngine(FGFDMExec* exec) { + 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(); + + Mixture = 1.0; // FIXME: get actual value + + Thrust = PctPower = 0.0; + Starved = Flameout = false; + Running = false; + Cranking = false; + + if (debug_lvl & 2) cout << "Instantiated: FGEngine" << endl; + TrimMode = false; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FGEngine::~FGEngine() +{ + if (debug_lvl & 2) cout << "Destroyed: FGEngine" << endl; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// 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. + +void FGEngine::ConsumeFuel(void) { + float Fshortage, Oshortage; + FGTank* Tank; + + if (TrimMode) return; + + Fshortage = Oshortage = 0.0; + for (unsigned int i=0; iGetTank(i); + if (Tank->GetType() == FGTank::ttFUEL) { + Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks()); + } else { + Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks()); + } + } + + if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true; + else Starved = false; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +float FGEngine::CalcFuelNeed(void) { + FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return FuelNeed; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +float FGEngine::CalcOxidizerNeed(void) { + OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return OxidizerNeed; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGEngine::SetPlacement(float x, float y, float z, float pitch, float yaw) { + X = x; + Y = y; + Z = z; + EnginePitch = pitch; + EngineYaw = yaw; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGEngine::AddFeedTank(int tkID) +{ + SourceTanks.push_back(tkID); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGEngine::Debug(void) +{ + //TODO: Add your source code here +} + diff --git a/src/FDM/JSBSim/FGEngine.h b/src/FDM/JSBSim/FGEngine.h index 28f7602f1..d042d192b 100644 --- a/src/FDM/JSBSim/FGEngine.h +++ b/src/FDM/JSBSim/FGEngine.h @@ -121,6 +121,7 @@ public: bool GetStarved(void) { return Starved; } bool GetFlameout(void) { return Flameout; } bool GetRunning(void) { return Running; } + bool GetCranking(void) { return Cranking; } int GetType(void) { return Type; } string GetName(void) { return Name; } @@ -147,6 +148,9 @@ public: void SetName(string name) {Name = name;} void AddFeedTank(int tkID); + void SetMagnetos(int m) { Magnetos = m; } + void SetStarter(bool s) { Starter = s;} + /** Calculates the thrust of the engine, and other engine functions. @param PowerRequired this is the power required to run the thrusting device such as a propeller. This resisting effect must be provided to the @@ -195,10 +199,13 @@ protected: float Thrust; float Throttle; float Mixture; + int Magnetos; + bool Starter; float FuelNeed, OxidizerNeed; bool Starved; bool Flameout; bool Running; + bool Cranking; float PctPower; int EngineNumber; bool TrimMode; diff --git a/src/FDM/JSBSim/FGMatrix33.cpp b/src/FDM/JSBSim/FGMatrix33.cpp index 10e2e5e7f..f372fc3d6 100644 --- a/src/FDM/JSBSim/FGMatrix33.cpp +++ b/src/FDM/JSBSim/FGMatrix33.cpp @@ -53,10 +53,6 @@ FGMatrix33::FGMatrix33(int r, int c) FGMatrix33::FGMatrix33(const FGMatrix33& M) { rowCtr = colCtr = 1; - width = M.width; - prec = M.prec; - delim = M.delim; - origin = M.origin; data[1][1] = M.data[1][1]; data[1][2] = M.data[1][2]; @@ -125,11 +121,6 @@ istream& operator>>(istream& is, FGMatrix33& M) FGMatrix33& FGMatrix33::operator=(const FGMatrix33& M) { if (&M != this) { - width = M.width; - prec = M.prec; - delim = M.delim; - origin = M.origin; - data[1][1] = M.data[1][1]; data[1][2] = M.data[1][2]; data[1][3] = M.data[1][3]; @@ -139,23 +130,12 @@ FGMatrix33& FGMatrix33::operator=(const FGMatrix33& M) data[3][1] = M.data[3][1]; data[3][2] = M.data[3][2]; data[3][3] = M.data[3][3]; - } return *this; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void FGMatrix33::SetOParams(char delim,int width,int prec,int origin) -{ - FGMatrix33::delim = delim; - FGMatrix33::width = width; - FGMatrix33::prec = prec; - FGMatrix33::origin = origin; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void FGMatrix33::InitMatrix(double value) { if (data) { @@ -196,7 +176,6 @@ FGMatrix33 FGMatrix33::operator-(const FGMatrix33& M) Diff(3,2) = data[3][2] - M(3,2); Diff(3,3) = data[3][3] - M(3,3); - return Diff; } @@ -213,7 +192,6 @@ void FGMatrix33::operator-=(const FGMatrix33 &M) data[3][1] -= M(3,1); data[3][2] -= M(3,2); data[3][3] -= M(3,3); - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -248,7 +226,6 @@ void FGMatrix33::operator+=(const FGMatrix33 &M) data[3][1] += M(3,1); data[3][2] += M(3,2); data[3][3] += M(3,3); - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -293,7 +270,6 @@ FGMatrix33 operator*(double scalar, FGMatrix33 &M) void FGMatrix33::operator*=(const double scalar) { - data[1][1] *= scalar; data[1][2] *= scalar; data[1][3] *= scalar; @@ -303,7 +279,6 @@ void FGMatrix33::operator*=(const double scalar) data[3][1] *= scalar; data[3][2] *= scalar; data[3][3] *= scalar; - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -345,7 +320,6 @@ void FGMatrix33::operator*=(const FGMatrix33& M) data[3][1] = a*M(1,1) + b*M(2,1) + c*M(3,1); data[3][2] = a*M(1,2) + b*M(2,2) + c*M(3,2); data[3][3] = a*M(1,3) + b*M(2,3) + c*M(3,3); - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -378,7 +352,7 @@ FGMatrix33 FGMatrix33::operator/(const double scalar) void FGMatrix33::operator/=(const double scalar) { if( scalar != 0 ) { - double tmp = 1.0/scalar; + double tmp = 1.0/scalar; data[1][1] *= tmp; data[1][2] *= tmp; data[1][3] *= tmp; diff --git a/src/FDM/JSBSim/FGMatrix33.h b/src/FDM/JSBSim/FGMatrix33.h index aa86e585c..784510193 100644 --- a/src/FDM/JSBSim/FGMatrix33.h +++ b/src/FDM/JSBSim/FGMatrix33.h @@ -122,14 +122,10 @@ public: void operator*=(const double scalar); void operator/=(const double scalar); - void SetOParams(char delim,int width,int prec, int origin=0); - protected: double data[4][4]; private: - char delim; - int width,prec,origin; void TransposeSquare(void); unsigned int rowCtr, colCtr; void Debug(void); diff --git a/src/FDM/JSBSim/FGPiston.cpp b/src/FDM/JSBSim/FGPiston.cpp index cb398ab3c..5afd6fcad 100644 --- a/src/FDM/JSBSim/FGPiston.cpp +++ b/src/FDM/JSBSim/FGPiston.cpp @@ -1,484 +1,529 @@ -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - Module: FGPiston.cpp - Author: Jon S. Berndt - Date started: 09/12/2000 - Purpose: This module models a Piston engine - - ------------- Copyright (C) 2000 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 --------------------------------------------------------------------------------- - -This class descends from the FGEngine class and models a Piston engine based on -parameters given in the engine config file for this class - -HISTORY --------------------------------------------------------------------------------- -09/12/2000 JSB Created - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -INCLUDES -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -#include "FGDefs.h" -#include "FGPiston.h" -#include "FGPropulsion.h" - -static const char *IdSrc = "$Id$"; -static const char *IdHdr = ID_PISTON; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CLASS IMPLEMENTATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -FGPiston::FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg) - : FGEngine(exec), - MinManifoldPressure_inHg(6.5), - MaxManifoldPressure_inHg(28.5), - Displacement(360), - MaxHP(200), - Cycles(2), - IdleRPM(900), - // Set constants - CONVERT_CUBIC_INCHES_TO_METERS_CUBED(1.638706e-5), - R_air(287.3), - rho_fuel(800), // estimate - calorific_value_fuel(47.3e6), - Cp_air(1005), - Cp_fuel(1700), - running(true), // FIXME: FGEngine already has 'Running' - cranking(false) -{ - string token; - - Name = Eng_cfg->GetValue("NAME"); - Eng_cfg->GetNextConfigLine(); - while (Eng_cfg->GetValue() != "/FG_PISTON") { - *Eng_cfg >> token; - if (token == "MINMP") *Eng_cfg >> MinManifoldPressure_inHg; - else if (token == "MAXMP") *Eng_cfg >> MaxManifoldPressure_inHg; - else if (token == "DISPLACEMENT") *Eng_cfg >> Displacement; - else if (token == "MAXHP") *Eng_cfg >> MaxHP; - else if (token == "CYCLES") *Eng_cfg >> Cycles; - else if (token == "IDLERPM") *Eng_cfg >> IdleRPM; - else if (token == "MAXTHROTTLE") *Eng_cfg >> MaxThrottle; - else if (token == "MINTHROTTLE") *Eng_cfg >> MinThrottle; - else if (token == "SLFUELFLOWMAX") *Eng_cfg >> SLFuelFlowMax; - else cerr << "Unhandled token in Engine config file: " << token << endl; - } - - if (debug_lvl > 0) { - cout << "\n Engine Name: " << Name << endl; - cout << " MinManifoldPressure: " << MinManifoldPressure_inHg << endl; - cout << " MaxManifoldPressure: " << MaxManifoldPressure_inHg << endl; - cout << " Displacement: " << Displacement << endl; - cout << " MaxHP: " << MaxHP << endl; - cout << " Cycles: " << Cycles << endl; - cout << " IdleRPM: " << IdleRPM << endl; - cout << " MaxThrottle: " << MaxThrottle << endl; - cout << " MinThrottle: " << MinThrottle << endl; - cout << " SLFuelFlowMax: " << SLFuelFlowMax << endl; - } - - Type = etPiston; - EngineNumber = 0; // FIXME: this should be the actual number - OilTemp_degK = 298; // FIXME: should be initialized in FGEngine - - dt = State->Getdt(); - - // Initialisation - volumetric_efficiency = 0.8; // Actually f(speed, load) but this will get us running - - if (debug_lvl & 2) cout << "Instantiated: FGPiston" << endl; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FGPiston::~FGPiston() -{ - if (debug_lvl & 2) cout << "Destroyed: FGPiston" << endl; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -float FGPiston::Calculate(float PowerRequired) -{ - float h,EngineMaxPower; - - // FIXME: calculate from actual fuel flow - ConsumeFuel(); - - Throttle = FCS->GetThrottlePos(EngineNumber); - Mixture = FCS->GetMixturePos(EngineNumber); - - // - // Input values. - // - // convert from lbs/ft2 to Pa - p_amb = Atmosphere->GetPressure() * 48; - p_amb_sea_level = Atmosphere->GetPressureSL() * 48; - // convert from Rankine to Kelvin - T_amb = Atmosphere->GetTemperature() * (5.0 / 9.0); - RPM = Propulsion->GetThruster(EngineNumber)->GetRPM(); - if (RPM < IdleRPM) // kludge - RPM = IdleRPM; - IAS = Auxiliary->GetVcalibratedKTS(); - - if (Mixture >= 0.5) { - doEngineStartup(); - doManifoldPressure(); - doAirFlow(); - doFuelFlow(); - doEnginePower(); - doEGT(); - doCHT(); - doOilTemperature(); - doOilPressure(); - } else { - HP = 0; - } - - PowerAvailable = (HP * HPTOFTLBSSEC) - PowerRequired; - return PowerAvailable; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Look up the power/mixture correlation. - * - * FIXME: this should use JSBSim's interpolation support. - */ - -static float Power_Mixture_Correlation(float thi_actual) -{ - float AFR_actual = 14.7 / thi_actual; - const int NUM_ELEMENTS = 13; - float AFR[NUM_ELEMENTS] = - {(14.7/1.6), 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, (14.7/0.6)}; - float mixPerPow[NUM_ELEMENTS] = - {78, 86, 93.5, 98, 100, 99, 96.4, 92.5, 88, 83, 78.5, 74, 58}; - float mixPerPow_actual = 0.0f; - float factor; - float dydx; - - int i; - int j = NUM_ELEMENTS; - - for (i=0;i AFR[i]) && (AFR_actual < AFR[i + 1])) { - factor = (AFR_actual - AFR[i]) / (AFR[i+1] - AFR[i]); - mixPerPow_actual = (factor * (mixPerPow[i+1] - mixPerPow[i])) + mixPerPow[i]; - return mixPerPow_actual; - } - } - - cerr << "ERROR: error in FGNewEngine::Power_Mixture_Correlation\n"; - return mixPerPow_actual; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Look up the combustion efficiency. - * - * - * FIXME: this should use JSBSim's interpolation support. - */ - -static float Lookup_Combustion_Efficiency(float thi_actual) -{ - const int NUM_ELEMENTS = 11; - float thi[NUM_ELEMENTS] = {0.0, 0.9, 1.0, 1.05, 1.1, 1.15, 1.2, 1.3, 1.4, 1.5, 1.6}; //array of equivalence ratio values - float neta_comb[NUM_ELEMENTS] = {0.98, 0.98, 0.97, 0.95, 0.9, 0.85, 0.79, 0.7, 0.63, 0.57, 0.525}; //corresponding array of combustion efficiency values - //combustion efficiency values from Heywood, "Internal Combustion Engine Fundamentals", ISBN 0-07-100499-8 - float neta_comb_actual = 0.0f; - float factor; - - int i; - int j = NUM_ELEMENTS; //This must be equal to the number of elements in the lookup table arrays - - for (i=0;i thi[i]) && (thi_actual < thi[i + 1])) { - //do linear interpolation between the two points - factor = (thi_actual - thi[i]) / (thi[i+1] - thi[i]); - neta_comb_actual = (factor * (neta_comb[i+1] - neta_comb[i])) + neta_comb[i]; - return neta_comb_actual; - } - } - - //if we get here something has gone badly wrong - cerr << "ERROR: error in FGNewEngine::Lookup_Combustion_Efficiency\n"; - return neta_comb_actual; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Start or stop the engine. - */ - -void FGPiston::doEngineStartup(void) -{ - // TODO: check magnetos, spark, starter, etc. and decide whether - // engine is running -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -/** - * Calculate the nominal manifold pressure in inches hg - * - * This function calculates nominal manifold pressure directly - * from the throttle position, and does not adjust it for the - * difference between the pressure at sea level and the pressure - * at the current altitude (that adjustment takes place in - * {@link #doEnginePower}). - * - * TODO: changes in MP should not be instantaneous -- introduce - * a lag between throttle changes and MP changes, to allow pressure - * to build up or disperse. - * - * Inputs: MinManifoldPressure_inHg, MaxManifoldPressure_inHg, Throttle - * - * Outputs: ManifoldPressure_inHg - */ - -void FGPiston::doManifoldPressure(void) -{ - ManifoldPressure_inHg = MinManifoldPressure_inHg + - (Throttle * (MaxManifoldPressure_inHg - MinManifoldPressure_inHg)); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the air flow through the engine. - * - * Inputs: p_amb, R_air, T_amb, ManifoldPressure_inHg, Displacement, - * RPM, volumetric_efficiency - * - * Outputs: rho_air, m_dot_air - */ - -void FGPiston::doAirFlow(void) -{ - rho_air = p_amb / (R_air * T_amb); - float rho_air_manifold = rho_air * ManifoldPressure_inHg / 29.6; - float displacement_SI = Displacement * CONVERT_CUBIC_INCHES_TO_METERS_CUBED; - float swept_volume = (displacement_SI * (RPM/60)) / 2; - float v_dot_air = swept_volume * volumetric_efficiency; - m_dot_air = v_dot_air * rho_air_manifold; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the fuel flow into the engine. - * - * Inputs: Mixture, thi_sea_level, p_amb_sea_level, p_amb, m_dot_air - * - * Outputs: equivalence_ratio, m_dot_fuel - */ - -void FGPiston::doFuelFlow(void) -{ - float thi_sea_level = 1.3 * Mixture; - equivalence_ratio = thi_sea_level * p_amb_sea_level / p_amb; - m_dot_fuel = m_dot_air / 14.7 * equivalence_ratio; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the power produced by the engine. - * - *

Currently, the JSBSim propellor model does not allow the - * engine to produce enough RPMs to get up to a high horsepower. - * When tested with sufficient RPM, it has no trouble reaching - * 200HP.

- * - * Inputs: ManifoldPressure_inHg, p_amb, p_amb_sea_level, RPM, T_amb, - * equivalence_ratio, Cycles, MaxHP - * - * Outputs: Percentage_Power, HP - */ - -void FGPiston::doEnginePower(void) -{ - float True_ManifoldPressure_inHg = ManifoldPressure_inHg * p_amb / p_amb_sea_level; - float ManXRPM = True_ManifoldPressure_inHg * RPM; - // FIXME: this needs to be generalized - Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0; - float T_amb_degF = (T_amb * 1.8) - 459.67; - float T_amb_sea_lev_degF = (288 * 1.8) - 459.67; - Percentage_Power = - Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120); - float Percentage_of_best_power_mixture_power = - Power_Mixture_Correlation(equivalence_ratio); - Percentage_Power = - Percentage_Power * Percentage_of_best_power_mixture_power / 100.0; - if (Percentage_Power < 0.0) - Percentage_Power = 0.0; - else if (Percentage_Power > 100.0) - Percentage_Power = 100.0; - HP = Percentage_Power * MaxHP / 100.0; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the exhaust gas temperature. - * - * Inputs: equivalence_ratio, m_dot_fuel, calorific_value_fuel, - * Cp_air, m_dot_air, Cp_fuel, m_dot_fuel, T_amb, Percentage_Power - * - * Outputs: combustion_efficiency, ExhaustGasTemp_degK - */ - -void FGPiston::doEGT(void) -{ - combustion_efficiency = Lookup_Combustion_Efficiency(equivalence_ratio); - float enthalpy_exhaust = m_dot_fuel * calorific_value_fuel * - combustion_efficiency * 0.33; - float heat_capacity_exhaust = (Cp_air * m_dot_air) + (Cp_fuel * m_dot_fuel); - float delta_T_exhaust = enthalpy_exhaust / heat_capacity_exhaust; - ExhaustGasTemp_degK = T_amb + delta_T_exhaust; - ExhaustGasTemp_degK *= 0.444 + ((0.544 - 0.444) * Percentage_Power / 100.0); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the cylinder head temperature. - * - * Inputs: T_amb, IAS, rho_air, m_dot_fuel, calorific_value_fuel, - * combustion_efficiency, RPM - * - * Outputs: CylinderHeadTemp_degK - */ - -void FGPiston::doCHT(void) -{ - float h1 = -95.0; - float h2 = -3.95; - float h3 = -0.05; - - float arbitary_area = 1.0; - float CpCylinderHead = 800.0; - float MassCylinderHead = 8.0; - - float temperature_difference = CylinderHeadTemp_degK - T_amb; - float v_apparent = IAS * 0.5144444; - float v_dot_cooling_air = arbitary_area * v_apparent; - float m_dot_cooling_air = v_dot_cooling_air * rho_air; - float dqdt_from_combustion = - m_dot_fuel * calorific_value_fuel * combustion_efficiency * 0.33; - float dqdt_forced = (h2 * m_dot_cooling_air * temperature_difference) + - (h3 * RPM * temperature_difference); - float dqdt_free = h1 * temperature_difference; - float dqdt_cylinder_head = dqdt_from_combustion + dqdt_forced + dqdt_free; - - float HeatCapacityCylinderHead = CpCylinderHead * MassCylinderHead; - - CylinderHeadTemp_degK = dqdt_cylinder_head / HeatCapacityCylinderHead; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the oil temperature. - * - * Inputs: Percentage_Power, running flag. - * - * Outputs: OilTemp_degK - */ - -void FGPiston::doOilTemperature(void) -{ - float idle_percentage_power = 2.3; // approximately - float target_oil_temp; // Steady state oil temp at the current engine conditions - float time_constant; // The time constant for the differential equation - - if (running) { - target_oil_temp = 363; - time_constant = 500; // Time constant for engine-on idling. - if (Percentage_Power > idle_percentage_power) { - time_constant /= ((Percentage_Power / idle_percentage_power) / 10.0); // adjust for power - } - } else { - target_oil_temp = 298; - time_constant = 1000; // Time constant for engine-off; reflects the fact that oil is no longer getting circulated - } - - float dOilTempdt = (target_oil_temp - OilTemp_degK) / time_constant; - - OilTemp_degK += (dOilTempdt * dt); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/** - * Calculate the oil pressure. - * - * Inputs: RPM - * - * Outputs: OilPressure_psi - */ - -void FGPiston::doOilPressure(void) -{ - float Oil_Press_Relief_Valve = 60; // FIXME: may vary by engine - float Oil_Press_RPM_Max = 1800; // FIXME: may vary by engine - float Design_Oil_Temp = 85; // FIXME: may vary by engine - // FIXME: WRONG!!! (85 degK???) - float Oil_Viscosity_Index = 0.25; - - OilPressure_psi = (Oil_Press_Relief_Valve / Oil_Press_RPM_Max) * RPM; - - if (OilPressure_psi >= Oil_Press_Relief_Valve) { - OilPressure_psi = Oil_Press_Relief_Valve; - } - - OilPressure_psi += (Design_Oil_Temp - OilTemp_degK) * Oil_Viscosity_Index; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGPiston::Debug(void) -{ - //TODO: Add your source code here -} - +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + Module: FGPiston.cpp + Author: Jon S. Berndt + Date started: 09/12/2000 + Purpose: This module models a Piston engine + + ------------- Copyright (C) 2000 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 +-------------------------------------------------------------------------------- + +This class descends from the FGEngine class and models a Piston engine based on +parameters given in the engine config file for this class + +HISTORY +-------------------------------------------------------------------------------- +09/12/2000 JSB Created + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +INCLUDES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "FGDefs.h" +#include "FGPiston.h" +#include "FGPropulsion.h" + +static const char *IdSrc = "$Id$"; +static const char *IdHdr = ID_PISTON; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS IMPLEMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +FGPiston::FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg) + : FGEngine(exec), + MinManifoldPressure_inHg(6.5), + MaxManifoldPressure_inHg(28.5), + Displacement(360), + MaxHP(200), + Cycles(2), + IdleRPM(600), + // Set constants + CONVERT_CUBIC_INCHES_TO_METERS_CUBED(1.638706e-5), + R_air(287.3), + rho_fuel(800), // estimate + calorific_value_fuel(47.3e6), + Cp_air(1005), + Cp_fuel(1700) +{ + string token; + + Name = Eng_cfg->GetValue("NAME"); + Eng_cfg->GetNextConfigLine(); + while (Eng_cfg->GetValue() != "/FG_PISTON") { + *Eng_cfg >> token; + if (token == "MINMP") *Eng_cfg >> MinManifoldPressure_inHg; + else if (token == "MAXMP") *Eng_cfg >> MaxManifoldPressure_inHg; + else if (token == "DISPLACEMENT") *Eng_cfg >> Displacement; + else if (token == "MAXHP") *Eng_cfg >> MaxHP; + else if (token == "CYCLES") *Eng_cfg >> Cycles; + else if (token == "IDLERPM") *Eng_cfg >> IdleRPM; + else if (token == "MAXTHROTTLE") *Eng_cfg >> MaxThrottle; + else if (token == "MINTHROTTLE") *Eng_cfg >> MinThrottle; + else if (token == "SLFUELFLOWMAX") *Eng_cfg >> SLFuelFlowMax; + else cerr << "Unhandled token in Engine config file: " << token << endl; + } + + if (debug_lvl > 0) { + cout << "\n Engine Name: " << Name << endl; + cout << " MinManifoldPressure: " << MinManifoldPressure_inHg << endl; + cout << " MaxManifoldPressure: " << MaxManifoldPressure_inHg << endl; + cout << " Displacement: " << Displacement << endl; + cout << " MaxHP: " << MaxHP << endl; + cout << " Cycles: " << Cycles << endl; + cout << " IdleRPM: " << IdleRPM << endl; + cout << " MaxThrottle: " << MaxThrottle << endl; + cout << " MinThrottle: " << MinThrottle << endl; + cout << " SLFuelFlowMax: " << SLFuelFlowMax << endl; + } + + Type = etPiston; + EngineNumber = 0; // FIXME: this should be the actual number + OilTemp_degK = 298; // FIXME: should be initialized in FGEngine + + dt = State->Getdt(); + + // Initialisation + volumetric_efficiency = 0.8; // Actually f(speed, load) but this will get us running + + // First column is thi, second is neta (combustion efficiency) + Lookup_Combustion_Efficiency = new FGTable(12); + *Lookup_Combustion_Efficiency << 0.00 << 0.980; + *Lookup_Combustion_Efficiency << 0.90 << 0.980; + *Lookup_Combustion_Efficiency << 1.00 << 0.970; + *Lookup_Combustion_Efficiency << 1.05 << 0.950; + *Lookup_Combustion_Efficiency << 1.10 << 0.900; + *Lookup_Combustion_Efficiency << 1.15 << 0.850; + *Lookup_Combustion_Efficiency << 1.20 << 0.790; + *Lookup_Combustion_Efficiency << 1.30 << 0.700; + *Lookup_Combustion_Efficiency << 1.40 << 0.630; + *Lookup_Combustion_Efficiency << 1.50 << 0.570; + *Lookup_Combustion_Efficiency << 1.60 << 0.525; + *Lookup_Combustion_Efficiency << 2.00 << 0.345; + + cout << endl; + cout << " Combustion Efficiency table:" << endl; + Lookup_Combustion_Efficiency->Print(); + cout << endl; + + Power_Mixture_Correlation = new FGTable(13); + *Power_Mixture_Correlation << (14.7/1.6) << 78.0; + *Power_Mixture_Correlation << 10 << 86.0; + *Power_Mixture_Correlation << 11 << 93.5; + *Power_Mixture_Correlation << 12 << 98.0; + *Power_Mixture_Correlation << 13 << 100.0; + *Power_Mixture_Correlation << 14 << 99.0; + *Power_Mixture_Correlation << 15 << 96.4; + *Power_Mixture_Correlation << 16 << 92.5; + *Power_Mixture_Correlation << 17 << 88.0; + *Power_Mixture_Correlation << 18 << 83.0; + *Power_Mixture_Correlation << 19 << 78.5; + *Power_Mixture_Correlation << 20 << 74.0; + *Power_Mixture_Correlation << (14.7/0.6) << 58; + + cout << endl; + cout << " Power Mixture Correlation table:" << endl; + Power_Mixture_Correlation->Print(); + cout << endl; + + if (debug_lvl & 2) cout << "Instantiated: FGPiston" << endl; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FGPiston::~FGPiston() +{ + if (debug_lvl & 2) cout << "Destroyed: FGPiston" << endl; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +float FGPiston::Calculate(float PowerRequired) +{ + float h,EngineMaxPower; + + // FIXME: calculate from actual fuel flow + ConsumeFuel(); + + Throttle = FCS->GetThrottlePos(EngineNumber); + Mixture = FCS->GetMixturePos(EngineNumber); + + // + // Input values. + // + + p_amb = Atmosphere->GetPressure() * 48; // convert from lbs/ft2 to Pa + p_amb_sea_level = Atmosphere->GetPressureSL() * 48; + T_amb = Atmosphere->GetTemperature() * (5.0 / 9.0); // convert from Rankine to Kelvin + + RPM = Propulsion->GetThruster(EngineNumber)->GetRPM(); + //if (RPM < IdleRPM) RPM = IdleRPM; // kludge + + IAS = Auxiliary->GetVcalibratedKTS(); + + if (Mixture >= 0.5) { + doEngineStartup(); + doManifoldPressure(); + doAirFlow(); + doFuelFlow(); + doEnginePower(); + doEGT(); + doCHT(); + doOilTemperature(); + doOilPressure(); + } else { + HP = 0; + } + + PowerAvailable = (HP * HPTOFTLBSSEC) - PowerRequired; + return PowerAvailable; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Start or stop the engine. + */ + +void FGPiston::doEngineStartup(void) +{ + // TODO: check magnetos, spark, starter, etc. and decide whether + // engine is running + + // Check parameters that may alter the operating state of the engine. + // (spark, fuel, starter motor etc) + bool spark; + bool fuel; + static int crank_counter = 0; + + // Check for spark + Magneto_Left = false; + Magneto_Right = false; + // Magneto positions: + // 0 -> off + // 1 -> left only + // 2 -> right only + // 3 -> both + if (Magnetos != 0) { + spark = true; + } else { + spark = false; + } // neglects battery voltage, master on switch, etc for now. + + if ((Magnetos == 1) || (Magnetos > 2)) Magneto_Left = true; + if (Magnetos > 1) Magneto_Right = true; + + // Assume we have fuel for now + fuel = true; + + // Check if we are turning the starter motor + if (Cranking != Starter) { + // This check saves .../cranking from getting updated every loop - they + // only update when changed. + Cranking = Starter; + crank_counter = 0; + } + + //Check mode of engine operation + // ACK - unfortunately this hack doesn't work in JSBSim since the RPM is reset + // each iteration by the propeller :-( + if (Cranking) { + crank_counter++; + if (RPM <= 480) { + RPM += 100; + if (RPM > 480) + RPM = 480; + } else { + // consider making a horrible noise if the starter is engaged with + // the engine running + } + // TODO - find a better guess at cranking speed + } + + // if ((!Running) && (spark) && (fuel) && (crank_counter > 120)) { + + if ((!Running) && (spark) && (fuel)) { + // start the engine if revs high enough + if (RPM > 450) { + // For now just instantaneously start but later we should maybe crank for + // a bit + Running = true; + // RPM = 600; + } + } + + if ( (Running) && ((!spark)||(!fuel)) ) { + // Cut the engine + // note that we only cut the power - the engine may continue to + // spin if the prop is in a moving airstream + Running = false; + } + + // And finally a last check for stalling + if (Running) { + //Check if we have stalled the engine + if (RPM == 0) { + Running = false; + } else if ((RPM <= 480) && (Cranking)) { + // Make sure the engine noise dosn't play if the engine won't + // start due to eg mixture lever pulled out. + Running = false; + } + } +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +/** + * Calculate the nominal manifold pressure in inches hg + * + * This function calculates nominal manifold pressure directly + * from the throttle position, and does not adjust it for the + * difference between the pressure at sea level and the pressure + * at the current altitude (that adjustment takes place in + * {@link #doEnginePower}). + * + * TODO: changes in MP should not be instantaneous -- introduce + * a lag between throttle changes and MP changes, to allow pressure + * to build up or disperse. + * + * Inputs: MinManifoldPressure_inHg, MaxManifoldPressure_inHg, Throttle + * + * Outputs: ManifoldPressure_inHg + */ + +void FGPiston::doManifoldPressure(void) +{ + ManifoldPressure_inHg = MinManifoldPressure_inHg + + (Throttle * (MaxManifoldPressure_inHg - MinManifoldPressure_inHg)); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the air flow through the engine. + * + * Inputs: p_amb, R_air, T_amb, ManifoldPressure_inHg, Displacement, + * RPM, volumetric_efficiency + * + * Outputs: rho_air, m_dot_air + */ + +void FGPiston::doAirFlow(void) +{ + rho_air = p_amb / (R_air * T_amb); + float rho_air_manifold = rho_air * ManifoldPressure_inHg / 29.6; + float displacement_SI = Displacement * CONVERT_CUBIC_INCHES_TO_METERS_CUBED; + float swept_volume = (displacement_SI * (RPM/60)) / 2; + float v_dot_air = swept_volume * volumetric_efficiency; + m_dot_air = v_dot_air * rho_air_manifold; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the fuel flow into the engine. + * + * Inputs: Mixture, thi_sea_level, p_amb_sea_level, p_amb, m_dot_air + * + * Outputs: equivalence_ratio, m_dot_fuel + */ + +void FGPiston::doFuelFlow(void) +{ + float thi_sea_level = 1.3 * Mixture; + equivalence_ratio = thi_sea_level * p_amb_sea_level / p_amb; + m_dot_fuel = m_dot_air / 14.7 * equivalence_ratio; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the power produced by the engine. + * + *

Currently, the JSBSim propellor model does not allow the + * engine to produce enough RPMs to get up to a high horsepower. + * When tested with sufficient RPM, it has no trouble reaching + * 200HP.

+ * + * Inputs: ManifoldPressure_inHg, p_amb, p_amb_sea_level, RPM, T_amb, + * equivalence_ratio, Cycles, MaxHP + * + * Outputs: Percentage_Power, HP + */ + +void FGPiston::doEnginePower(void) +{ + float True_ManifoldPressure_inHg = ManifoldPressure_inHg * p_amb / p_amb_sea_level; + float ManXRPM = True_ManifoldPressure_inHg * RPM; + // FIXME: this needs to be generalized + Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0; + float T_amb_degF = (T_amb * 1.8) - 459.67; + float T_amb_sea_lev_degF = (288 * 1.8) - 459.67; + Percentage_Power = + Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120); + float Percentage_of_best_power_mixture_power = + Power_Mixture_Correlation->GetValue(14.7 / equivalence_ratio); + Percentage_Power = + Percentage_Power * Percentage_of_best_power_mixture_power / 100.0; + if (Percentage_Power < 0.0) + Percentage_Power = 0.0; + else if (Percentage_Power > 100.0) + Percentage_Power = 100.0; + HP = Percentage_Power * MaxHP / 100.0; + + //Hack + if (!Running) { + if (Cranking) { + if (RPM < 480) { + HP = 3.0 + ((480 - RPM) / 10.0); + } else { + HP = 3.0; + } + } else { + // Quick hack until we port the FMEP stuff + if (RPM > 0.0) + HP = -1.5; + else + HP = 0.0; + } + } +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the exhaust gas temperature. + * + * Inputs: equivalence_ratio, m_dot_fuel, calorific_value_fuel, + * Cp_air, m_dot_air, Cp_fuel, m_dot_fuel, T_amb, Percentage_Power + * + * Outputs: combustion_efficiency, ExhaustGasTemp_degK + */ + +void FGPiston::doEGT(void) +{ + combustion_efficiency = Lookup_Combustion_Efficiency->GetValue(equivalence_ratio); + float enthalpy_exhaust = m_dot_fuel * calorific_value_fuel * + combustion_efficiency * 0.33; + float heat_capacity_exhaust = (Cp_air * m_dot_air) + (Cp_fuel * m_dot_fuel); + float delta_T_exhaust = enthalpy_exhaust / heat_capacity_exhaust; + ExhaustGasTemp_degK = T_amb + delta_T_exhaust; + ExhaustGasTemp_degK *= 0.444 + ((0.544 - 0.444) * Percentage_Power / 100.0); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the cylinder head temperature. + * + * Inputs: T_amb, IAS, rho_air, m_dot_fuel, calorific_value_fuel, + * combustion_efficiency, RPM + * + * Outputs: CylinderHeadTemp_degK + */ + +void FGPiston::doCHT(void) +{ + float h1 = -95.0; + float h2 = -3.95; + float h3 = -0.05; + + float arbitary_area = 1.0; + float CpCylinderHead = 800.0; + float MassCylinderHead = 8.0; + + float temperature_difference = CylinderHeadTemp_degK - T_amb; + float v_apparent = IAS * 0.5144444; + float v_dot_cooling_air = arbitary_area * v_apparent; + float m_dot_cooling_air = v_dot_cooling_air * rho_air; + float dqdt_from_combustion = + m_dot_fuel * calorific_value_fuel * combustion_efficiency * 0.33; + float dqdt_forced = (h2 * m_dot_cooling_air * temperature_difference) + + (h3 * RPM * temperature_difference); + float dqdt_free = h1 * temperature_difference; + float dqdt_cylinder_head = dqdt_from_combustion + dqdt_forced + dqdt_free; + + float HeatCapacityCylinderHead = CpCylinderHead * MassCylinderHead; + + CylinderHeadTemp_degK = dqdt_cylinder_head / HeatCapacityCylinderHead; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the oil temperature. + * + * Inputs: Percentage_Power, running flag. + * + * Outputs: OilTemp_degK + */ + +void FGPiston::doOilTemperature(void) +{ + float idle_percentage_power = 2.3; // approximately + float target_oil_temp; // Steady state oil temp at the current engine conditions + float time_constant; // The time constant for the differential equation + + if (Running) { + target_oil_temp = 363; + time_constant = 500; // Time constant for engine-on idling. + if (Percentage_Power > idle_percentage_power) { + time_constant /= ((Percentage_Power / idle_percentage_power) / 10.0); // adjust for power + } + } else { + target_oil_temp = 298; + time_constant = 1000; // Time constant for engine-off; reflects the fact + // that oil is no longer getting circulated + } + + float dOilTempdt = (target_oil_temp - OilTemp_degK) / time_constant; + + OilTemp_degK += (dOilTempdt * dt); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/** + * Calculate the oil pressure. + * + * Inputs: RPM + * + * Outputs: OilPressure_psi + */ + +void FGPiston::doOilPressure(void) +{ + float Oil_Press_Relief_Valve = 60; // FIXME: may vary by engine + float Oil_Press_RPM_Max = 1800; // FIXME: may vary by engine + float Design_Oil_Temp = 85; // FIXME: may vary by engine + // FIXME: WRONG!!! (85 degK???) + float Oil_Viscosity_Index = 0.25; + + OilPressure_psi = (Oil_Press_Relief_Valve / Oil_Press_RPM_Max) * RPM; + + if (OilPressure_psi >= Oil_Press_Relief_Valve) { + OilPressure_psi = Oil_Press_Relief_Valve; + } + + OilPressure_psi += (Design_Oil_Temp - OilTemp_degK) * Oil_Viscosity_Index; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPiston::Debug(void) +{ + //TODO: Add your source code here +} + diff --git a/src/FDM/JSBSim/FGPiston.h b/src/FDM/JSBSim/FGPiston.h index 62cfdebeb..6104a4d9e 100644 --- a/src/FDM/JSBSim/FGPiston.h +++ b/src/FDM/JSBSim/FGPiston.h @@ -1,159 +1,161 @@ -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - Header: FGPiston.h - Author: Jon S. Berndt - Date started: 09/12/2000 - - ------------- Copyright (C) 2000 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. - -HISTORY --------------------------------------------------------------------------------- -09/12/2000 JSB Created -10/01/2001 DPM Modified to use equations from Dave Luff's piston model. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -COMMENTS, REFERENCES, and NOTES -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SENTRY -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -#ifndef FGPISTON_H -#define FGPISTON_H - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -INCLUDES -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -#include "FGEngine.h" -#include "FGConfigFile.h" - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DEFINITIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -#define ID_PISTON "$Id$"; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FORWARD DECLARATIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -COMMENTS, REFERENCES, and NOTES -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DOCUMENTATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/** Models Dave Luff's engine model as ported into JSBSim by David Megginson. - @author Jon S. Berndt (Engine framework code and framework-related mods) - @author Dave Luff (engine operational code) - @author David Megginson (porting and additional code) - @version $Id$ - */ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CLASS DECLARATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -class FGPiston : public FGEngine -{ -public: - /// Constructor - FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg); - /// Destructor - ~FGPiston(); - - float Calculate(float PowerRequired); - float GetPowerAvailable(void) {return PowerAvailable;} - -private: - float BrakeHorsePower; - float SpeedSlope; - float SpeedIntercept; - float AltitudeSlope; - float PowerAvailable; - - // timestep - float dt; - - // engine state - bool running; - bool cranking; - - void doEngineStartup(void); - void doManifoldPressure(void); - void doAirFlow(void); - void doFuelFlow(void); - void doEnginePower(void); - void doEGT(void); - void doCHT(void); - void doOilPressure(void); - void doOilTemperature(void); - - // - // constants - // - const float CONVERT_CUBIC_INCHES_TO_METERS_CUBED; - - const float R_air; - const float rho_fuel; // kg/m^3 - const float calorific_value_fuel; // W/Kg (approximate) - const float Cp_air; // J/KgK - const float Cp_fuel; // J/KgK - - // - // Configuration - // - float MinManifoldPressure_inHg; // Inches Hg - float MaxManifoldPressure_inHg; // Inches Hg - float Displacement; // cubic inches - float MaxHP; // horsepower - float Cycles; // cycles/power stroke - float IdleRPM; // revolutions per minute - - // - // Inputs (in addition to those in FGEngine). - // - float p_amb; // Pascals - float p_amb_sea_level; // Pascals - float T_amb; // degrees Kelvin - float RPM; // revolutions per minute - float IAS; // knots - - // - // Outputs (in addition to those in FGEngine). - // - float rho_air; - float volumetric_efficiency; - float m_dot_air; - float equivalence_ratio; - float m_dot_fuel; - float Percentage_Power; - float HP; - float combustion_efficiency; - - void Debug(void); -}; - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#endif +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + Header: FGPiston.h + Author: Jon S. Berndt + Date started: 09/12/2000 + + ------------- Copyright (C) 2000 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. + +HISTORY +-------------------------------------------------------------------------------- +09/12/2000 JSB Created +10/01/2001 DPM Modified to use equations from Dave Luff's piston model. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +COMMENTS, REFERENCES, and NOTES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +SENTRY +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#ifndef FGPISTON_H +#define FGPISTON_H + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +INCLUDES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "FGEngine.h" +#include "FGConfigFile.h" +#include "FGTable.h" + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DEFINITIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#define ID_PISTON "$Id$"; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +FORWARD DECLARATIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +COMMENTS, REFERENCES, and NOTES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DOCUMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/** Models Dave Luff's engine model as ported into JSBSim by David Megginson. + @author Jon S. Berndt (Engine framework code and framework-related mods) + @author Dave Luff (engine operational code) + @author David Megginson (porting and additional code) + @version $Id$ + */ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS DECLARATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +class FGPiston : public FGEngine +{ +public: + /// Constructor + FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg); + /// Destructor + ~FGPiston(); + + float Calculate(float PowerRequired); + float GetPowerAvailable(void) {return PowerAvailable;} + +private: + float BrakeHorsePower; + float SpeedSlope; + float SpeedIntercept; + float AltitudeSlope; + float PowerAvailable; + + // timestep + float dt; + + void doEngineStartup(void); + void doManifoldPressure(void); + void doAirFlow(void); + void doFuelFlow(void); + void doEnginePower(void); + void doEGT(void); + void doCHT(void); + void doOilPressure(void); + void doOilTemperature(void); + + // + // constants + // + const float CONVERT_CUBIC_INCHES_TO_METERS_CUBED; + + const float R_air; + const float rho_fuel; // kg/m^3 + const float calorific_value_fuel; // W/Kg (approximate) + const float Cp_air; // J/KgK + const float Cp_fuel; // J/KgK + + FGTable *Lookup_Combustion_Efficiency; + FGTable *Power_Mixture_Correlation; + + // + // Configuration + // + float MinManifoldPressure_inHg; // Inches Hg + float MaxManifoldPressure_inHg; // Inches Hg + float Displacement; // cubic inches + float MaxHP; // horsepower + float Cycles; // cycles/power stroke + float IdleRPM; // revolutions per minute + + // + // Inputs (in addition to those in FGEngine). + // + float p_amb; // Pascals + float p_amb_sea_level; // Pascals + float T_amb; // degrees Kelvin + float RPM; // revolutions per minute + float IAS; // knots + + // + // Outputs (in addition to those in FGEngine). + // + bool Magneto_Left; + bool Magneto_Right; + float rho_air; + float volumetric_efficiency; + float m_dot_air; + float equivalence_ratio; + float m_dot_fuel; + float Percentage_Power; + float HP; + float combustion_efficiency; + + void Debug(void); +}; + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +#endif diff --git a/src/FDM/JSBSim/FGTable.cpp b/src/FDM/JSBSim/FGTable.cpp index e53fa2a67..db880264b 100644 --- a/src/FDM/JSBSim/FGTable.cpp +++ b/src/FDM/JSBSim/FGTable.cpp @@ -174,6 +174,35 @@ void FGTable::operator<<(FGConfigFile& infile) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +FGTable& FGTable::operator<<(const double n) +{ + Data[rowCounter][colCounter] = n; + if (colCounter == nCols) { + colCounter = 0; + rowCounter++; + } else { + colCounter++; + } + return *this; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FGTable& FGTable::operator<<(const int n) +{ + *this << (double)n; + return *this; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FGTable& FGTable::operator<<(const float n) +{ + *this << (double)n; + return *this; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void FGTable::Print(void) { diff --git a/src/FDM/JSBSim/FGTable.h b/src/FDM/JSBSim/FGTable.h index aa9258ee8..c6d68d688 100644 --- a/src/FDM/JSBSim/FGTable.h +++ b/src/FDM/JSBSim/FGTable.h @@ -92,15 +92,18 @@ public: */ void operator<<(FGConfigFile&); + FGTable& operator<<(const float n); + FGTable& operator<<(const int n); + FGTable& operator<<(const double n); inline float GetElement(int r, int c) {return Data[r][c];} void Print(void); private: enum type {tt1D, tt2D} Type; - unsigned int rowCounter; - unsigned int colCounter; float** Data; int nRows, nCols; + unsigned int colCounter; + unsigned int rowCounter; float** Allocate(void); void Debug(void); };