X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGInertial.cpp;h=94aa291c3346653f8f37024f4bad96b49bdd3141;hb=cd24f7b6aaaa54f81655fb574bb050620c900dfe;hp=e18098a44aaa2396c3c1c523076dfac3d3ab9c44;hpb=3ec74d79c23347add2afa088b05ad29af975f65f;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGInertial.cpp b/src/FDM/JSBSim/models/FGInertial.cpp index e18098a44..94aa291c3 100644 --- a/src/FDM/JSBSim/models/FGInertial.cpp +++ b/src/FDM/JSBSim/models/FGInertial.cpp @@ -5,7 +5,7 @@ Date started: 09/13/00 Purpose: Encapsulates the inertial frame forces (coriolis and centrifugal) - ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 2000 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 Lesser General Public License as published by the Free Software @@ -36,13 +36,16 @@ INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGInertial.h" +#include "FGFDMExec.h" #include "FGPropagate.h" -#include "FGState.h" #include "FGMassBalance.h" +#include + +using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id$"; +static const char *IdSrc = "$Id: FGInertial.cpp,v 1.20 2010/11/18 12:38:06 jberndt Exp $"; static const char *IdHdr = ID_INERTIAL; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -54,13 +57,33 @@ FGInertial::FGInertial(FGFDMExec* fgex) : FGModel(fgex) { Name = "FGInertial"; - // Defaults - RotationRate = 0.00007272205217; - GM = 14.06252720E15; - RadiusReference = 20925650.00; + // Earth defaults + RotationRate = 0.00007292115; + GM = 14.07644180E15; // WGS84 value + RadiusReference = 20925650.00; // Equatorial radius (WGS84) + C2_0 = -4.84165371736E-04; // WGS84 value for the C2,0 coefficient + J2 = 1.0826266836E-03; // WGS84 value for J2 + a = 20925646.3255; // WGS84 semimajor axis length in feet + b = 20855486.5951; // WGS84 semiminor axis length in feet + earthPosAngle = 0.0; + + // Lunar defaults + /* + RotationRate = 0.0000026617; + GM = 1.7314079E14; // Lunar GM + RadiusReference = 5702559.05; // Equatorial radius + C2_0 = 0; // value for the C2,0 coefficient + J2 = 2.033542482111609E-4; // value for J2 + a = 5702559.05; // semimajor axis length in feet + b = 5695439.63; // semiminor axis length in feet + earthPosAngle = 0.0; + */ + gAccelReference = GM/(RadiusReference*RadiusReference); gAccel = GM/(RadiusReference*RadiusReference); + bind(); + Debug(0); } @@ -73,19 +96,78 @@ FGInertial::~FGInertial(void) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +bool FGInertial::InitModel(void) +{ + if (!FGModel::InitModel()) return false; + + earthPosAngle = 0.0; + + return true; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + bool FGInertial::Run(void) { // Fast return if we have nothing to do ... if (FGModel::Run()) return true; if (FDMExec->Holding()) return false; + RunPreFunctions(); + // Gravitation accel - double r = Propagate->GetRadius(); + double r = FDMExec->GetPropagate()->GetRadius(); gAccel = GetGAccel(r); + earthPosAngle += FDMExec->GetDeltaT()*RotationRate; + + RunPostFunctions(); return false; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +double FGInertial::GetGAccel(double r) const +{ + return GM/(r*r); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// Calculate the WGS84 gravitation value in ECEF frame. Pass in the ECEF position +// via the position parameter. The J2Gravity value returned is in ECEF frame, +// and therefore may need to be expressed (transformed) in another frame, +// depending on how it is used. See Stevens and Lewis eqn. 1.4-16. + +FGColumnVector3 FGInertial::GetGravityJ2(FGColumnVector3 position) const +{ + FGColumnVector3 J2Gravity; + + // Gravitation accel + double r = position.Magnitude(); + double lat = FDMExec->GetPropagate()->GetLatitude(); + double sinLat = sin(lat); + + double adivr = a/r; + double preCommon = 1.5*J2*adivr*adivr; + double xy = 1.0 - 5.0*(sinLat*sinLat); + double z = 3.0 - 5.0*(sinLat*sinLat); + double GMOverr2 = GM/(r*r); + + J2Gravity(1) = -GMOverr2 * ((1.0 + (preCommon * xy)) * position(eX)/r); + J2Gravity(2) = -GMOverr2 * ((1.0 + (preCommon * xy)) * position(eY)/r); + J2Gravity(3) = -GMOverr2 * ((1.0 + (preCommon * z)) * position(eZ)/r); + + return J2Gravity; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGInertial::bind(void) +{ + PropertyManager->Tie("position/epa-rad", this, &FGInertial::GetEarthPositionAngle); +} + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // The bitmasked value choices are as follows: // unset: In this case (the default) JSBSim would only print