1
0
Fork 0
flightgear/src/FDM/JSBSim/FGForce.cpp

185 lines
5.4 KiB
C++
Raw Normal View History

2000-11-03 23:02:47 +00:00
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
Source: FGForce.cpp
Author: Tony Peden
Date started: 6/10/00
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
------------- Copyright (C) 1999 Anthony K. Peden (apeden@earthlink.net) -------------
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
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.
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
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.
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
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.
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
HISTORY
--------------------------------------------------------------------------------
6/10/00 TP Created
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
FUNCTIONAL DESCRIPTION
--------------------------------------------------------------------------------
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
The purpose of this class is to provide storage for computed forces and
2001-03-30 01:04:50 +00:00
encapsulate all the functionality associated with transforming those
2000-10-02 23:07:30 +00:00
forces from their native coord system to the body system. This includes
computing the moments due to the difference between the point of application
and the cg.
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
*/
#include "FGFDMExec.h"
#include "FGAircraft.h"
#include "FGTranslation.h"
#include "FGMatrix33.h"
#include "FGColumnVector3.h"
#include "FGColumnVector4.h"
2000-10-02 23:07:30 +00:00
#include "FGForce.h"
namespace JSBSim {
2001-03-30 01:04:50 +00:00
static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_FORCE;
2000-10-02 23:07:30 +00:00
2001-03-30 01:04:50 +00:00
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2000-10-02 23:07:30 +00:00
FGForce::FGForce(FGFDMExec *FDMExec) :
2001-12-07 17:10:17 +00:00
ttype(tNone),
fdmex(FDMExec)
2000-10-02 23:07:30 +00:00
{
2001-11-06 22:33:05 +00:00
mT(1,1) = 1; //identity matrix
mT(2,2) = 1;
mT(3,3) = 1;
2000-10-02 23:07:30 +00:00
vSense.InitMatrix(1);
2001-12-13 04:48:34 +00:00
Debug(0);
2000-10-02 23:07:30 +00:00
}
2001-03-30 01:04:50 +00:00
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGForce::~FGForce()
{
2001-12-13 04:48:34 +00:00
Debug(1);
2001-03-30 01:04:50 +00:00
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2000-10-02 23:07:30 +00:00
2001-12-07 17:10:17 +00:00
FGColumnVector3& FGForce::GetBodyForces(void)
{
2001-11-06 22:33:05 +00:00
vFb = Transform()*(vFn.multElementWise(vSense));
2000-10-02 23:07:30 +00:00
2001-12-07 17:10:17 +00:00
// Find the distance from this vector's acting location to the cg; this
// needs to be done like this to convert from structural to body coords.
// CG and RP values are in inches
vDXYZ(eX) = -(vActingXYZn(eX) - fdmex->GetMassBalance()->GetXYZcg(eX))*inchtoft;
vDXYZ(eY) = (vActingXYZn(eY) - fdmex->GetMassBalance()->GetXYZcg(eY))*inchtoft;
vDXYZ(eZ) = -(vActingXYZn(eZ) - fdmex->GetMassBalance()->GetXYZcg(eZ))*inchtoft;
2000-10-02 23:07:30 +00:00
2001-11-09 04:38:53 +00:00
vM = vMn + vDXYZ*vFb;
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
return vFb;
}
2001-03-30 01:04:50 +00:00
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2000-10-02 23:07:30 +00:00
2001-12-07 17:10:17 +00:00
FGMatrix33 FGForce::Transform(void)
{
2000-10-02 23:07:30 +00:00
switch(ttype) {
case tWindBody:
2001-11-20 22:34:24 +00:00
return fdmex->GetState()->GetTs2b();
2000-10-02 23:07:30 +00:00
case tLocalBody:
return fdmex->GetState()->GetTl2b();
case tCustom:
2001-03-30 01:04:50 +00:00
2000-10-02 23:07:30 +00:00
case tNone:
2001-03-30 01:04:50 +00:00
return mT;
2000-10-02 23:07:30 +00:00
default:
cout << "Unrecognized tranform requested from FGForce::Transform()" << endl;
exit(1);
}
}
2001-03-30 01:04:50 +00:00
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2001-12-07 17:10:17 +00:00
void FGForce::SetAnglesToBody(double broll, double bpitch, double byaw)
{
if (ttype == tCustom) {
2001-11-20 22:34:24 +00:00
double cp,sp,cr,sr,cy,sy;
2000-10-02 23:07:30 +00:00
cp=cos(bpitch); sp=sin(bpitch);
cr=cos(broll); sr=sin(broll);
cy=cos(byaw); sy=sin(byaw);
mT(1,1)=cp*cy;
mT(1,2)=cp*sy;
mT(1,3)=-1*sp;
mT(2,1)=sr*sp*cy-cr*sy;
mT(2,2)=sr*sp*sy+cr*cy;
mT(2,3)=sr*cp;
mT(3,1)=cr*sp*cy+sr*sy;
mT(3,2)=cr*sp*sy-sr*cy;
mT(3,3)=cr*cp;
}
}
2001-03-30 01:04:50 +00:00
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2001-12-13 04:48:34 +00:00
// The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print
// out the normally expected messages, essentially echoing
// the config files as they are read. If the environment
// variable is not set, debug_lvl is set to 1 internally
// 0: This requests JSBSim not to output any messages
// whatsoever.
// 1: This value explicity requests the normal JSBSim
// startup messages
// 2: This value asks for a message to be printed out when
// a class is instantiated
// 4: When this value is set, a message is displayed when a
// FGModel object executes its Run() method
// 8: When this value is set, various runtime state variables
// are printed out periodically
// 16: When set various parameters are sanity checked and
// a message is printed out when they go out of bounds
void FGForce::Debug(int from)
2001-03-30 01:04:50 +00:00
{
2001-12-13 04:48:34 +00:00
if (debug_lvl <= 0) return;
if (debug_lvl & 1) { // Standard console startup message output
if (from == 0) { // Constructor
}
}
if (debug_lvl & 2 ) { // Instantiation/Destruction notification
if (from == 0) cout << "Instantiated: FGForce" << endl;
if (from == 1) cout << "Destroyed: FGForce" << endl;
}
if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
}
if (debug_lvl & 8 ) { // Runtime state variables
}
if (debug_lvl & 16) { // Sanity checking
}
2001-12-24 13:54:55 +00:00
if (debug_lvl & 64) {
if (from == 0) { // Constructor
cout << IdSrc << endl;
cout << IdHdr << endl;
}
}
2001-03-30 01:04:50 +00:00
}
}