X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGAircraft.cpp;h=0ed6ac74f33975f09d0dcdca72953d51d0e7ab09;hb=68f54290481701429a04cd33c06be2674fc2b3a4;hp=fd6f9fce36f3a7336b6ce3648a49b5b47efc268f;hpb=932b38a87e2870d23f9be9461b551f1e1fe556ba;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGAircraft.cpp b/src/FDM/JSBSim/models/FGAircraft.cpp index fd6f9fce3..0ed6ac74f 100644 --- a/src/FDM/JSBSim/models/FGAircraft.cpp +++ b/src/FDM/JSBSim/models/FGAircraft.cpp @@ -6,23 +6,23 @@ Purpose: Encapsulates an aircraft Called by: FGFDMExec - ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.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 + the terms of the GNU Lesser 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 + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License along with + You should have received a copy of the GNU Lesser 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 + Further information about the GNU Lesser General Public License can also be found on the world wide web at http://www.gnu.org. FUNCTIONAL DESCRIPTION @@ -41,32 +41,22 @@ INCLUDES #include #include -#ifdef FGFS -# ifndef __BORLANDC__ -# include -# endif -# ifdef SG_HAVE_STD_INCLUDES -# include -# else -# include -# endif -#else -# if defined (sgi) && !defined(__GNUC__) -# include -# else -# include -# endif -#endif +#include #include "FGAircraft.h" #include "FGMassBalance.h" #include "FGInertial.h" #include "FGGroundReactions.h" +#include "FGExternalReactions.h" +#include "FGBuoyantForces.h" #include "FGAerodynamics.h" -#include -#include +#include "FGFDMExec.h" #include "FGPropagate.h" -#include +#include "FGPropulsion.h" +#include "input_output/FGPropertyManager.h" +#include + +using namespace std; namespace JSBSim { @@ -78,7 +68,7 @@ DEFINITIONS GLOBAL DATA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -static const char *IdSrc = "$Id$"; +static const char *IdSrc = "$Id: FGAircraft.cpp,v 1.28 2010/09/07 00:40:03 jberndt Exp $"; static const char *IdHdr = ID_AIRCRAFT; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -94,6 +84,7 @@ FGAircraft::FGAircraft(FGFDMExec* fdmex) : FGModel(fdmex) lbarh = lbarv = 0.0; vbarh = vbarv = 0.0; WingIncidence = 0.0; + HoldDown = 0; bind(); @@ -104,44 +95,65 @@ FGAircraft::FGAircraft(FGFDMExec* fdmex) : FGModel(fdmex) FGAircraft::~FGAircraft() { - unbind(); Debug(1); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +bool FGAircraft::InitModel(void) +{ + if (!FGModel::InitModel()) return false; + + return true; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + bool FGAircraft::Run(void) { if (FGModel::Run()) return true; if (FDMExec->Holding()) return false; + RunPreFunctions(); + vForces.InitMatrix(); - vForces += Aerodynamics->GetForces(); - vForces += Propulsion->GetForces(); - vForces += GroundReactions->GetForces(); + if (!HoldDown) { + vForces += Aerodynamics->GetForces(); + vForces += Propulsion->GetForces(); + vForces += GroundReactions->GetForces(); + vForces += ExternalReactions->GetForces(); + vForces += BuoyantForces->GetForces(); + } else { + const FGMatrix33& mTl2b = Propagate->GetTl2b(); + vForces = mTl2b * FGColumnVector3(0,0,-MassBalance->GetWeight()); + } vMoments.InitMatrix(); - vMoments += Aerodynamics->GetMoments(); - vMoments += Propulsion->GetMoments(); - vMoments += GroundReactions->GetMoments(); + if (!HoldDown) { + vMoments += Aerodynamics->GetMoments(); + vMoments += Propulsion->GetMoments(); + vMoments += GroundReactions->GetMoments(); + vMoments += ExternalReactions->GetMoments(); + vMoments += BuoyantForces->GetMoments(); + } -// printf("%s:%i\n", __FILE__, __LINE__); vBodyAccel = vForces/MassBalance->GetMass(); -// printf("%s:%i\n", __FILE__, __LINE__); - vNcg = vBodyAccel/Inertial->gravity(); + vNcg = vBodyAccel/Inertial->SLgravity(); + + vNwcg = Aerodynamics->GetTb2w() * vNcg; + vNwcg(3) = 1.0 - vNwcg(3); - vNwcg = State->GetTb2s() * vNcg; - vNwcg(3) = -1*vNwcg(3) + 1; + RunPostFunctions(); return false; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -double FGAircraft::GetNlf(void) +double FGAircraft::GetNlf(void) const { - return -1*Aerodynamics->GetvFs(3)/MassBalance->GetWeight(); + return -1*Aerodynamics->GetvFw(3)/MassBalance->GetWeight(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -151,6 +163,8 @@ bool FGAircraft::Load(Element* el) string element_name; Element* element; + FGModel::Load(el); + if (el->FindElement("wingarea")) WingArea = el->FindElementValueAsNumberConvertTo("wingarea", "FT2"); if (el->FindElement("wingspan")) @@ -158,7 +172,7 @@ bool FGAircraft::Load(Element* el) if (el->FindElement("chord")) cbar = el->FindElementValueAsNumberConvertTo("chord", "FT"); if (el->FindElement("wing_incidence")) - WingIncidence = el->FindElementValueAsNumberConvertTo("wing_incidence", "DEG"); + WingIncidence = el->FindElementValueAsNumberConvertTo("wing_incidence", "RAD"); if (el->FindElement("htailarea")) HTailArea = el->FindElementValueAsNumberConvertTo("htailarea", "FT2"); if (el->FindElement("htailarm")) @@ -188,10 +202,12 @@ bool FGAircraft::Load(Element* el) lbarv = VTailArm/cbar; if (WingArea != 0.0) { vbarh = HTailArm*HTailArea / (cbar*WingArea); - vbarv = VTailArm*VTailArea / (cbar*WingArea); + vbarv = VTailArm*VTailArea / (WingSpan*WingArea); } } + PostLoad(el, PropertyManager); + Debug(2); return true; @@ -202,10 +218,11 @@ bool FGAircraft::Load(Element* el) void FGAircraft::bind(void) { typedef double (FGAircraft::*PMF)(int) const; - PropertyManager->Tie("metrics/Sw-sqft", this, &FGAircraft::GetWingArea); + PropertyManager->Tie("metrics/Sw-sqft", this, &FGAircraft::GetWingArea, &FGAircraft::SetWingArea); PropertyManager->Tie("metrics/bw-ft", this, &FGAircraft::GetWingSpan); PropertyManager->Tie("metrics/cbarw-ft", this, &FGAircraft::Getcbar); - PropertyManager->Tie("metrics/iw-deg", this, &FGAircraft::GetWingIncidence); + PropertyManager->Tie("metrics/iw-rad", this, &FGAircraft::GetWingIncidence); + PropertyManager->Tie("metrics/iw-deg", this, &FGAircraft::GetWingIncidenceDeg); PropertyManager->Tie("metrics/Sh-sqft", this, &FGAircraft::GetHTailArea); PropertyManager->Tie("metrics/lh-ft", this, &FGAircraft::GetHTailArm); PropertyManager->Tie("metrics/Sv-sqft", this, &FGAircraft::GetVTailArea); @@ -214,12 +231,6 @@ void FGAircraft::bind(void) PropertyManager->Tie("metrics/lv-norm", this, &FGAircraft::Getlbarv); PropertyManager->Tie("metrics/vbarh-norm", this, &FGAircraft::Getvbarh); PropertyManager->Tie("metrics/vbarv-norm", this, &FGAircraft::Getvbarv); - PropertyManager->Tie("moments/l-total-lbsft", this, eL, (PMF)&FGAircraft::GetMoments); - PropertyManager->Tie("moments/m-total-lbsft", this, eM, (PMF)&FGAircraft::GetMoments); - PropertyManager->Tie("moments/n-total-lbsft", this, eN, (PMF)&FGAircraft::GetMoments); - PropertyManager->Tie("forces/fbx-total-lbs", this, eX, (PMF)&FGAircraft::GetForces); - PropertyManager->Tie("forces/fby-total-lbs", this, eY, (PMF)&FGAircraft::GetForces); - PropertyManager->Tie("forces/fbz-total-lbs", this, eZ, (PMF)&FGAircraft::GetForces); PropertyManager->Tie("metrics/aero-rp-x-in", this, eX, (PMF)&FGAircraft::GetXYZrp); PropertyManager->Tie("metrics/aero-rp-y-in", this, eY, (PMF)&FGAircraft::GetXYZrp); PropertyManager->Tie("metrics/aero-rp-z-in", this, eZ, (PMF)&FGAircraft::GetXYZrp); @@ -229,39 +240,14 @@ void FGAircraft::bind(void) PropertyManager->Tie("metrics/visualrefpoint-x-in", this, eX, (PMF)&FGAircraft::GetXYZvrp); PropertyManager->Tie("metrics/visualrefpoint-y-in", this, eY, (PMF)&FGAircraft::GetXYZvrp); PropertyManager->Tie("metrics/visualrefpoint-z-in", this, eZ, (PMF)&FGAircraft::GetXYZvrp); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGAircraft::unbind(void) -{ - PropertyManager->Untie("metrics/Sw-sqft"); - PropertyManager->Untie("metrics/bw-ft"); - PropertyManager->Untie("metrics/cbarw-ft"); - PropertyManager->Untie("metrics/iw-deg"); - PropertyManager->Untie("metrics/Sh-sqft"); - PropertyManager->Untie("metrics/lh-ft"); - PropertyManager->Untie("metrics/Sv-sqft"); - PropertyManager->Untie("metrics/lv-ft"); - PropertyManager->Untie("metrics/lh-norm"); - PropertyManager->Untie("metrics/lv-norm"); - PropertyManager->Untie("metrics/vbarh-norm"); - PropertyManager->Untie("metrics/vbarv-norm"); - PropertyManager->Untie("moments/l-total-lbsft"); - PropertyManager->Untie("moments/m-total-lbsft"); - PropertyManager->Untie("moments/n-total-lbsft"); - PropertyManager->Untie("forces/fbx-total-lbs"); - PropertyManager->Untie("forces/fby-total-lbs"); - PropertyManager->Untie("forces/fbz-total-lbs"); - PropertyManager->Untie("metrics/aero-rp-x-in"); - PropertyManager->Untie("metrics/aero-rp-y-in"); - PropertyManager->Untie("metrics/aero-rp-z-in"); - PropertyManager->Untie("metrics/eyepoint-x-in"); - PropertyManager->Untie("metrics/eyepoint-y-in"); - PropertyManager->Untie("metrics/eyepoint-z-in"); - PropertyManager->Untie("metrics/visualrefpoint-x-in"); - PropertyManager->Untie("metrics/visualrefpoint-y-in"); - PropertyManager->Untie("metrics/visualrefpoint-z-in"); + PropertyManager->Tie("forces/fbx-total-lbs", this, eX, (PMF)&FGAircraft::GetForces); + PropertyManager->Tie("forces/fby-total-lbs", this, eY, (PMF)&FGAircraft::GetForces); + PropertyManager->Tie("forces/fbz-total-lbs", this, eZ, (PMF)&FGAircraft::GetForces); + PropertyManager->Tie("forces/load-factor", this, &FGAircraft::GetNlf); + PropertyManager->Tie("forces/hold-down", this, &FGAircraft::GetHoldDown, &FGAircraft::SetHoldDown); + PropertyManager->Tie("moments/l-total-lbsft", this, eL, (PMF)&FGAircraft::GetMoments); + PropertyManager->Tie("moments/m-total-lbsft", this, eM, (PMF)&FGAircraft::GetMoments); + PropertyManager->Tie("moments/n-total-lbsft", this, eN, (PMF)&FGAircraft::GetMoments); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%