Author: Tony Peden, Jon Berndt
Date started: 01/26/99
Purpose: Calculates additional parameters needed by the visual system, etc.
- Called by: FGSimExec
+ 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
#include "FGAerodynamics.h"
#include "FGPropagate.h"
#include "FGAtmosphere.h"
-#include <FGState.h>
-#include <FGFDMExec.h>
+#include "FGFDMExec.h"
#include "FGAircraft.h"
#include "FGInertial.h"
-#include <input_output/FGPropertyManager.h>
+#include "FGExternalReactions.h"
+#include "FGBuoyantForces.h"
+#include "FGGroundReactions.h"
+#include "FGPropulsion.h"
+#include "FGMassBalance.h"
+#include "input_output/FGPropertyManager.h"
+#include <iostream>
+
+using namespace std;
namespace JSBSim {
-static const char *IdSrc = "$Id$";
+static const char *IdSrc = "$Id: FGAuxiliary.cpp,v 1.47 2011/03/29 11:49:27 jberndt Exp $";
static const char *IdHdr = ID_AUXILIARY;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Name = "FGAuxiliary";
vcas = veas = pt = tat = 0;
psl = rhosl = 1;
- earthPosAngle = 0.0;
qbar = 0;
qbarUW = 0.0;
qbarUV = 0.0;
+ Re = 0.0;
Mach = 0.0;
alpha = beta = 0.0;
adot = bdot = 0.0;
day_of_year = 1;
seconds_in_day = 0.0;
hoverbmac = hoverbcg = 0.0;
+ tatc = RankineToCelsius(tat);
vPilotAccel.InitMatrix();
vPilotAccelN.InitMatrix();
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+bool FGAuxiliary::InitModel(void)
+{
+ if (!FGModel::InitModel()) return false;
+
+ vcas = veas = pt = tat = 0;
+ psl = rhosl = 1;
+ qbar = 0;
+ qbarUW = 0.0;
+ qbarUV = 0.0;
+ Mach = 0.0;
+ alpha = beta = 0.0;
+ adot = bdot = 0.0;
+ gamma = Vt = Vground = 0.0;
+ psigt = 0.0;
+ day_of_year = 1;
+ seconds_in_day = 0.0;
+ hoverbmac = hoverbcg = 0.0;
+
+ vPilotAccel.InitMatrix();
+ vPilotAccelN.InitMatrix();
+ vToEyePt.InitMatrix();
+ vAeroPQR.InitMatrix();
+ vEulerRates.InitMatrix();
+
+ return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
FGAuxiliary::~FGAuxiliary()
{
- unbind();
Debug(1);
}
bool FGAuxiliary::Run()
{
- double A,B,D, hdot_Vt;
- const FGColumnVector3& vPQR = Propagate->GetPQR();
- const FGColumnVector3& vUVW = Propagate->GetUVW();
- const FGColumnVector3& vUVWdot = Propagate->GetUVWdot();
- const FGColumnVector3& vVel = Propagate->GetVel();
+ double A,B,D;
- if (FGModel::Run()) return true;
+ if (FGModel::Run()) return true; // return true if error returned from base class
if (FDMExec->Holding()) return false;
- p = Atmosphere->GetPressure();
- rhosl = Atmosphere->GetDensitySL();
- psl = Atmosphere->GetPressureSL();
- sat = Atmosphere->GetTemperature();
+ RunPreFunctions();
+
+ const double density = FDMExec->GetAtmosphere()->GetDensity();
+ const double soundspeed = FDMExec->GetAtmosphere()->GetSoundSpeed();
+ const double DistanceAGL = FDMExec->GetPropagate()->GetDistanceAGL();
+ const double wingspan = FDMExec->GetAircraft()->GetWingSpan();
+ const FGMatrix33& Tl2b = FDMExec->GetPropagate()->GetTl2b();
+ const FGMatrix33& Tb2l = FDMExec->GetPropagate()->GetTb2l();
+
+ const FGColumnVector3& vPQR = FDMExec->GetPropagate()->GetPQR();
+ const FGColumnVector3& vUVW = FDMExec->GetPropagate()->GetUVW();
+ const FGColumnVector3& vUVWdot = FDMExec->GetPropagate()->GetUVWdot();
+ const FGColumnVector3& vVel = FDMExec->GetPropagate()->GetVel();
+
+ p = FDMExec->GetAtmosphere()->GetPressure();
+ rhosl = FDMExec->GetAtmosphere()->GetDensitySL();
+ psl = FDMExec->GetAtmosphere()->GetPressureSL();
+ sat = FDMExec->GetAtmosphere()->GetTemperature();
// Rotation
- double cTht = Propagate->GetCosEuler(eTht);
- double cPhi = Propagate->GetCosEuler(ePhi);
- double sPhi = Propagate->GetSinEuler(ePhi);
+ double cTht = FDMExec->GetPropagate()->GetCosEuler(eTht);
+ double sTht = FDMExec->GetPropagate()->GetSinEuler(eTht);
+ double cPhi = FDMExec->GetPropagate()->GetCosEuler(ePhi);
+ double sPhi = FDMExec->GetPropagate()->GetSinEuler(ePhi);
vEulerRates(eTht) = vPQR(eQ)*cPhi - vPQR(eR)*sPhi;
if (cTht != 0.0) {
vEulerRates(ePsi) = (vPQR(eQ)*sPhi + vPQR(eR)*cPhi)/cTht;
- vEulerRates(ePhi) = vPQR(eP) + vEulerRates(ePsi)*sPhi;
+ vEulerRates(ePhi) = vPQR(eP) + vEulerRates(ePsi)*sTht;
}
-// 12/16/2005, JSB: For ground handling purposes, at this time, let's ramp
-// in the effects of wind from 10 fps to 30 fps when there is weight on the
-// landing gear wheels.
-
- if (GroundReactions->GetWOW() && vUVW(eU) < 10) {
- vAeroPQR = vPQR;
- vAeroUVW = vUVW;
- } else if (GroundReactions->GetWOW() && vUVW(eU) < 30) {
- double factor = (vUVW(eU) - 10.0)/20.0;
- vAeroPQR = vPQR + factor*Atmosphere->GetTurbPQR();
- vAeroUVW = vUVW + factor*Propagate->GetTl2b()*Atmosphere->GetWindNED();
- } else {
- vAeroPQR = vPQR + Atmosphere->GetTurbPQR();
- vAeroUVW = vUVW + Propagate->GetTl2b()*Atmosphere->GetWindNED();
- }
+// Combine the wind speed with aircraft speed to obtain wind relative speed
+ FGColumnVector3 wind = Tl2b*FDMExec->GetAtmosphere()->GetTotalWindNED();
+ vAeroPQR = vPQR - FDMExec->GetAtmosphere()->GetTurbPQR();
+ vAeroUVW = vUVW - wind;
Vt = vAeroUVW.Magnitude();
- if ( Vt > 0.05) {
+ double Vt2 = Vt*Vt;
+ alpha = beta = adot = bdot = 0;
+ double mUW = (vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eW)*vAeroUVW(eW));
+
+ if ( Vt > 1.0 ) {
if (vAeroUVW(eW) != 0.0)
alpha = vAeroUVW(eU)*vAeroUVW(eU) > 0.0 ? atan2(vAeroUVW(eW), vAeroUVW(eU)) : 0.0;
if (vAeroUVW(eV) != 0.0)
- beta = vAeroUVW(eU)*vAeroUVW(eU)+vAeroUVW(eW)*vAeroUVW(eW) > 0.0 ? atan2(vAeroUVW(eV),
- sqrt(vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eW)*vAeroUVW(eW))) : 0.0;
+ beta = mUW > 0.0 ? atan2(vAeroUVW(eV), sqrt(mUW)) : 0.0;
- double mUW = (vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eW)*vAeroUVW(eW));
double signU=1;
- if (vAeroUVW(eU) != 0.0)
- signU = vAeroUVW(eU)/fabs(vAeroUVW(eU));
+ if (vAeroUVW(eU) < 0.0) signU=-1;
- if ( (mUW == 0.0) || (Vt == 0.0) ) {
- adot = 0.0;
- bdot = 0.0;
- } else {
+ if ( mUW >= 1.0 ) {
adot = (vAeroUVW(eU)*vUVWdot(eW) - vAeroUVW(eW)*vUVWdot(eU))/mUW;
- bdot = (signU*mUW*vUVWdot(eV) - vAeroUVW(eV)*(vAeroUVW(eU)*vUVWdot(eU)
- + vAeroUVW(eW)*vUVWdot(eW)))/(Vt*Vt*sqrt(mUW));
+ bdot = (signU*mUW*vUVWdot(eV)
+ - vAeroUVW(eV)*(vAeroUVW(eU)*vUVWdot(eU) + vAeroUVW(eW)*vUVWdot(eW)))/(Vt2*sqrt(mUW));
}
- } else {
- alpha = beta = adot = bdot = 0;
}
- qbar = 0.5*Atmosphere->GetDensity()*Vt*Vt;
- qbarUW = 0.5*Atmosphere->GetDensity()*(vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eW)*vAeroUVW(eW));
- qbarUV = 0.5*Atmosphere->GetDensity()*(vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eV)*vAeroUVW(eV));
- Mach = Vt / Atmosphere->GetSoundSpeed();
- MachU = vMachUVW(eU) = vAeroUVW(eU) / Atmosphere->GetSoundSpeed();
- vMachUVW(eV) = vAeroUVW(eV) / Atmosphere->GetSoundSpeed();
- vMachUVW(eW) = vAeroUVW(eW) / Atmosphere->GetSoundSpeed();
+ Re = Vt * FDMExec->GetAircraft()->Getcbar() / FDMExec->GetAtmosphere()->GetKinematicViscosity();
+
+ qbar = 0.5*density*Vt2;
+ qbarUW = 0.5*density*(mUW);
+ qbarUV = 0.5*density*(vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eV)*vAeroUVW(eV));
+ Mach = Vt / soundspeed;
+ MachU = vMachUVW(eU) = vAeroUVW(eU) / soundspeed;
+ vMachUVW(eV) = vAeroUVW(eV) / soundspeed;
+ vMachUVW(eW) = vAeroUVW(eW) / soundspeed;
// Position
Vground = sqrt( vVel(eNorth)*vVel(eNorth) + vVel(eEast)*vVel(eEast) );
- if (vVel(eNorth) == 0) psigt = 0;
- else psigt = atan2(vVel(eEast), vVel(eNorth));
-
+ psigt = atan2(vVel(eEast), vVel(eNorth));
if (psigt < 0.0) psigt += 2*M_PI;
-
- if (Vt != 0) {
- hdot_Vt = -vVel(eDown)/Vt;
- if (fabs(hdot_Vt) <= 1) gamma = asin(hdot_Vt);
- } else {
- gamma = 0.0;
- }
+ gamma = atan2(-vVel(eDown), Vground);
tat = sat*(1 + 0.2*Mach*Mach); // Total Temperature, isentropic flow
tatc = RankineToCelsius(tat);
vcas = veas = 0.0;
}
+ const double SLgravity = FDMExec->GetInertial()->SLgravity();
+
vPilotAccel.InitMatrix();
if ( Vt > 1.0 ) {
- vPilotAccel = Aerodynamics->GetForces()
- + Propulsion->GetForces()
- + GroundReactions->GetForces();
- vPilotAccel /= MassBalance->GetMass();
- vToEyePt = MassBalance->StructuralToBody(Aircraft->GetXYZep());
- vPilotAccel += Propagate->GetPQRdot() * vToEyePt;
+ vAircraftAccel = FDMExec->GetAircraft()->GetBodyAccel();
+ // Nz is Acceleration in "g's", along normal axis (-Z body axis)
+ Nz = -vAircraftAccel(eZ)/SLgravity;
+ vToEyePt = FDMExec->GetMassBalance()->StructuralToBody(FDMExec->GetAircraft()->GetXYZep());
+ vPilotAccel = vAircraftAccel + FDMExec->GetPropagate()->GetPQRdot() * vToEyePt;
vPilotAccel += vPQR * (vPQR * vToEyePt);
} else {
- vPilotAccel = Propagate->GetTl2b() * FGColumnVector3( 0.0, 0.0, Inertial->gravity() );
+ // The line below handles low velocity (and on-ground) cases, basically
+ // representing the opposite of the force that the landing gear would
+ // exert on the ground (which is just the total weight). This eliminates
+ // any jitter that could be introduced by the landing gear. Theoretically,
+ // this branch could be eliminated, with a penalty of having a short
+ // transient at startup (lasting only a fraction of a second).
+ vPilotAccel = Tl2b * FGColumnVector3( 0.0, 0.0, -SLgravity );
+ Nz = -vPilotAccel(eZ)/SLgravity;
}
- vPilotAccelN = vPilotAccel/Inertial->gravity();
-
- earthPosAngle += State->Getdt()*Inertial->omega();
+ vPilotAccelN = vPilotAccel/SLgravity;
// VRP computation
- const FGLocation& vLocation = Propagate->GetLocation();
- FGColumnVector3 vrpStructural = Aircraft->GetXYZvrp();
- FGColumnVector3 vrpBody = MassBalance->StructuralToBody( vrpStructural );
- FGColumnVector3 vrpLocal = Propagate->GetTb2l() * vrpBody;
+ const FGLocation& vLocation = FDMExec->GetPropagate()->GetLocation();
+ const FGColumnVector3& vrpStructural = FDMExec->GetAircraft()->GetXYZvrp();
+ const FGColumnVector3 vrpBody = FDMExec->GetMassBalance()->StructuralToBody( vrpStructural );
+ const FGColumnVector3 vrpLocal = Tb2l * vrpBody;
vLocationVRP = vLocation.LocalToLocation( vrpLocal );
// Recompute some derived values now that we know the dependent parameters values ...
- hoverbcg = Propagate->GetDistanceAGL() / Aircraft->GetWingSpan();
+ hoverbcg = DistanceAGL / wingspan;
+
+ FGColumnVector3 vMac = Tb2l*FDMExec->GetMassBalance()->StructuralToBody(FDMExec->GetAircraft()->GetXYZrp());
+ hoverbmac = (DistanceAGL + vMac(3)) / wingspan;
+
+ // when all model are executed,
+ // please calculate the distance from the initial point
+
+ CalculateRelativePosition();
- FGColumnVector3 vMac = Propagate->GetTb2l()*MassBalance->StructuralToBody(Aircraft->GetXYZrp());
- hoverbmac = (Propagate->GetDistanceAGL() + vMac(3)) / Aircraft->GetWingSpan();
+ RunPostFunctions();
return false;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//
+// A positive headwind is blowing with you, a negative headwind is blowing against you.
+// psi is the direction the wind is blowing *towards*.
+// ToDo: should this simply be in the atmosphere class? Same with Get Crosswind.
-double FGAuxiliary::GetHeadWind(void)
+double FGAuxiliary::GetHeadWind(void) const
{
double psiw,vw;
- psiw = Atmosphere->GetWindPsi();
- vw = Atmosphere->GetWindNED().Magnitude();
+ psiw = FDMExec->GetAtmosphere()->GetWindPsi();
+ vw = FDMExec->GetAtmosphere()->GetTotalWindNED().Magnitude();
- return vw*cos(psiw - Propagate->GetEuler(ePsi));
+ return vw*cos(psiw - FDMExec->GetPropagate()->GetEuler(ePsi));
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//
+// A positive crosswind is blowing towards the right (from teh perspective of the
+// pilot). A negative crosswind is blowing towards the -Y direction (left).
+// psi is the direction the wind is blowing *towards*.
-double FGAuxiliary::GetCrossWind(void)
+double FGAuxiliary::GetCrossWind(void) const
{
double psiw,vw;
- psiw = Atmosphere->GetWindPsi();
- vw = Atmosphere->GetWindNED().Magnitude();
+ psiw = FDMExec->GetAtmosphere()->GetWindPsi();
+ vw = FDMExec->GetAtmosphere()->GetTotalWindNED().Magnitude();
- return vw*sin(psiw - Propagate->GetEuler(ePsi));
+ return vw*sin(psiw - FDMExec->GetPropagate()->GetEuler(ePsi));
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGAuxiliary::GethVRP(void) const
+{
+ return vLocationVRP.GetRadius() - FDMExec->GetPropagate()->GetSeaLevelRadius();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
typedef double (FGAuxiliary::*PMF)(int) const;
typedef double (FGAuxiliary::*PF)(void) const;
+ PropertyManager->Tie("propulsion/tat-r", this, &FGAuxiliary::GetTotalTemperature);
+ PropertyManager->Tie("propulsion/tat-c", this, &FGAuxiliary::GetTAT_C);
+ PropertyManager->Tie("propulsion/pt-lbs_sqft", this, &FGAuxiliary::GetTotalPressure);
PropertyManager->Tie("velocities/vc-fps", this, &FGAuxiliary::GetVcalibratedFPS);
PropertyManager->Tie("velocities/vc-kts", this, &FGAuxiliary::GetVcalibratedKTS);
PropertyManager->Tie("velocities/ve-fps", this, &FGAuxiliary::GetVequivalentFPS);
PropertyManager->Tie("velocities/ve-kts", this, &FGAuxiliary::GetVequivalentKTS);
PropertyManager->Tie("velocities/machU", this, &FGAuxiliary::GetMachU);
- PropertyManager->Tie("velocities/tat-r", this, &FGAuxiliary::GetTotalTemperature);
- PropertyManager->Tie("velocities/tat-c", this, &FGAuxiliary::GetTAT_C);
- PropertyManager->Tie("velocities/pt-lbs_sqft", this, &FGAuxiliary::GetTotalPressure);
PropertyManager->Tie("velocities/p-aero-rad_sec", this, eX, (PMF)&FGAuxiliary::GetAeroPQR);
PropertyManager->Tie("velocities/q-aero-rad_sec", this, eY, (PMF)&FGAuxiliary::GetAeroPQR);
PropertyManager->Tie("velocities/r-aero-rad_sec", this, eZ, (PMF)&FGAuxiliary::GetAeroPQR);
PropertyManager->Tie("accelerations/n-pilot-x-norm", this, eX, (PMF)&FGAuxiliary::GetNpilot);
PropertyManager->Tie("accelerations/n-pilot-y-norm", this, eY, (PMF)&FGAuxiliary::GetNpilot);
PropertyManager->Tie("accelerations/n-pilot-z-norm", this, eZ, (PMF)&FGAuxiliary::GetNpilot);
- PropertyManager->Tie("position/epa-rad", this, &FGAuxiliary::GetEarthPositionAngle);
+ PropertyManager->Tie("accelerations/Nz", this, &FGAuxiliary::GetNz);
/* PropertyManager->Tie("atmosphere/headwind-fps", this, &FGAuxiliary::GetHeadWind, true);
PropertyManager->Tie("atmosphere/crosswind-fps", this, &FGAuxiliary::GetCrossWind, true); */
PropertyManager->Tie("aero/alpha-rad", this, (PF)&FGAuxiliary::Getalpha, &FGAuxiliary::Setalpha, true);
PropertyManager->Tie("aero/alpha-deg", this, inDegrees, (PMF)&FGAuxiliary::Getalpha);
PropertyManager->Tie("aero/beta-deg", this, inDegrees, (PMF)&FGAuxiliary::Getbeta);
PropertyManager->Tie("aero/mag-beta-deg", this, inDegrees, (PMF)&FGAuxiliary::GetMagBeta);
+ PropertyManager->Tie("aero/Re", this, &FGAuxiliary::GetReynoldsNumber);
PropertyManager->Tie("aero/qbar-psf", this, &FGAuxiliary::Getqbar, &FGAuxiliary::Setqbar, true);
PropertyManager->Tie("aero/qbarUW-psf", this, &FGAuxiliary::GetqbarUW, &FGAuxiliary::SetqbarUW, true);
PropertyManager->Tie("aero/qbarUV-psf", this, &FGAuxiliary::GetqbarUV, &FGAuxiliary::SetqbarUV, true);
PropertyManager->Tie("aero/h_b-mac-ft", this, &FGAuxiliary::GetHOverBMAC);
PropertyManager->Tie("flight-path/gamma-rad", this, &FGAuxiliary::GetGamma, &FGAuxiliary::SetGamma);
PropertyManager->Tie("flight-path/psi-gt-rad", this, &FGAuxiliary::GetGroundTrack);
+
+ PropertyManager->Tie("position/distance-from-start-lon-mt", this, &FGAuxiliary::GetLongitudeRelativePosition);
+ PropertyManager->Tie("position/distance-from-start-lat-mt", this, &FGAuxiliary::GetLatitudeRelativePosition);
+ PropertyManager->Tie("position/distance-from-start-mag-mt", this, &FGAuxiliary::GetDistanceRelativePosition);
+ PropertyManager->Tie("position/vrp-gc-latitude_deg", &vLocationVRP, &FGLocation::GetLatitudeDeg);
+ PropertyManager->Tie("position/vrp-longitude_deg", &vLocationVRP, &FGLocation::GetLongitudeDeg);
+ PropertyManager->Tie("position/vrp-radius-ft", &vLocationVRP, &FGLocation::GetRadius);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-void FGAuxiliary::unbind(void)
+void FGAuxiliary::CalculateRelativePosition(void)
+{
+ const double earth_radius_mt = FDMExec->GetInertial()->GetRefRadius()*fttom;
+ lat_relative_position=(FDMExec->GetPropagate()->GetLatitude() - FDMExec->GetIC()->GetLatitudeDegIC() *degtorad)*earth_radius_mt;
+ lon_relative_position=(FDMExec->GetPropagate()->GetLongitude() - FDMExec->GetIC()->GetLongitudeDegIC()*degtorad)*earth_radius_mt;
+ relative_position = sqrt(lat_relative_position*lat_relative_position + lon_relative_position*lon_relative_position);
+};
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGAuxiliary::BadUnits(void) const
{
- PropertyManager->Untie("velocities/vc-fps");
- PropertyManager->Untie("velocities/vc-kts");
- PropertyManager->Untie("velocities/ve-fps");
- PropertyManager->Untie("velocities/ve-kts");
- PropertyManager->Untie("velocities/machU");
- PropertyManager->Untie("velocities/tat-r");
- PropertyManager->Untie("velocities/tat-c");
- PropertyManager->Untie("velocities/p-aero-rad_sec");
- PropertyManager->Untie("velocities/q-aero-rad_sec");
- PropertyManager->Untie("velocities/r-aero-rad_sec");
- PropertyManager->Untie("velocities/pt-lbs_sqft");
- PropertyManager->Untie("velocities/phidot-rad_sec");
- PropertyManager->Untie("velocities/thetadot-rad_sec");
- PropertyManager->Untie("velocities/psidot-rad_sec");
- PropertyManager->Untie("velocities/u-aero-fps");
- PropertyManager->Untie("velocities/v-aero-fps");
- PropertyManager->Untie("velocities/w-aero-fps");
- PropertyManager->Untie("velocities/vt-fps");
- PropertyManager->Untie("velocities/mach");
- PropertyManager->Untie("velocities/vg-fps");
- PropertyManager->Untie("accelerations/a-pilot-x-ft_sec2");
- PropertyManager->Untie("accelerations/a-pilot-y-ft_sec2");
- PropertyManager->Untie("accelerations/a-pilot-z-ft_sec2");
- PropertyManager->Untie("accelerations/n-pilot-x-norm");
- PropertyManager->Untie("accelerations/n-pilot-y-norm");
- PropertyManager->Untie("accelerations/n-pilot-z-norm");
- PropertyManager->Untie("position/epa-rad");
- /* PropertyManager->Untie("atmosphere/headwind-fps");
- PropertyManager->Untie("atmosphere/crosswind-fps"); */
- PropertyManager->Untie("aero/qbar-psf");
- PropertyManager->Untie("aero/qbarUW-psf");
- PropertyManager->Untie("aero/qbarUV-psf");
- PropertyManager->Untie("aero/alpha-rad");
- PropertyManager->Untie("aero/beta-rad");
- PropertyManager->Untie("aero/alpha-deg");
- PropertyManager->Untie("aero/beta-deg");
- PropertyManager->Untie("aero/alphadot-rad_sec");
- PropertyManager->Untie("aero/betadot-rad_sec");
- PropertyManager->Untie("aero/mag-beta-rad");
- PropertyManager->Untie("aero/alphadot-deg_sec");
- PropertyManager->Untie("aero/betadot-deg_sec");
- PropertyManager->Untie("aero/mag-beta-deg");
- PropertyManager->Untie("aero/h_b-cg-ft");
- PropertyManager->Untie("aero/h_b-mac-ft");
- PropertyManager->Untie("flight-path/gamma-rad");
- PropertyManager->Untie("flight-path/psi-gt-rad");
+ cerr << "Bad units" << endl; return 0.0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%