]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGAerodynamics.cpp
Sync with latest JSBSim changes.
[flightgear.git] / src / FDM / JSBSim / FGAerodynamics.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGAerodynamics.cpp
4  Author:       Jon S. Berndt
5  Date started: 09/13/00
6  Purpose:      Encapsulates the aerodynamic forces (gear and collision)
7
8  ------------- Copyright (C) 2000  Jon S. Berndt (jsb@hal-pc.org) -------------
9
10  This program is free software; you can redistribute it and/or modify it under
11  the terms of the GNU General Public License as published by the Free Software
12  Foundation; either version 2 of the License, or (at your option) any later
13  version.
14
15  This program is distributed in the hope that it will be useful, but WITHOUT
16  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
18  details.
19
20  You should have received a copy of the GNU General Public License along with
21  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22  Place - Suite 330, Boston, MA  02111-1307, USA.
23
24  Further information about the GNU General Public License can also be found on
25  the world wide web at http://www.gnu.org.
26
27 FUNCTIONAL DESCRIPTION
28 --------------------------------------------------------------------------------
29
30 HISTORY
31 --------------------------------------------------------------------------------
32 09/13/00   JSB   Created
33 04/22/01   JSB   Moved code into here from FGAircraft
34
35 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36 INCLUDES
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
38
39 #include "FGAerodynamics.h"
40 #include "FGFactorGroup.h"
41 #include "FGCoefficient.h"
42
43 static const char *IdSrc = "$Id$";
44 static const char *IdHdr = ID_AERODYNAMICS;
45
46 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 CLASS IMPLEMENTATION
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49
50
51 FGAerodynamics::FGAerodynamics(FGFDMExec* FDMExec) : FGModel(FDMExec),
52     vMoments(3),
53     vForces(3),
54     vFs(3),
55     vLastFs(3),
56     vDXYZcg(3)
57 {
58   Name = "FGAerodynamics";
59
60   AxisIdx["DRAG"]  = 0;
61   AxisIdx["SIDE"]  = 1;
62   AxisIdx["LIFT"]  = 2;
63   AxisIdx["ROLL"]  = 3;
64   AxisIdx["PITCH"] = 4;
65   AxisIdx["YAW"]   = 5;
66
67   Coeff = new CoeffArray[6];
68
69   if (debug_lvl & 2) cout << "Instantiated: FGAerodynamics" << endl;
70 }
71
72 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73
74 FGAerodynamics::~FGAerodynamics()
75 {
76   unsigned int i,j;
77   for (i=0; i<6; i++) {
78     for (j=0; j<Coeff[i].size(); j++) {
79       delete Coeff[i][j];
80     }
81   }
82   delete[] Coeff;
83
84   if (debug_lvl & 2) cout << "Destroyed:    FGAerodynamics" << endl;
85 }
86
87 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88
89 bool FGAerodynamics::Run(void)
90 {
91   unsigned int axis_ctr,ctr;
92
93   if (!FGModel::Run()) {
94
95     vLastFs = vFs;
96     vFs.InitMatrix();
97
98     for (axis_ctr = 0; axis_ctr < 3; axis_ctr++) {
99       for (ctr=0; ctr < Coeff[axis_ctr].size(); ctr++) {
100         vFs(axis_ctr+1) += Coeff[axis_ctr][ctr]->TotalValue();
101       }
102     }
103     //correct signs of drag and lift to wind axes convention
104     //positive forward, right, down
105     vFs(1)*=-1; vFs(3)*=-1;
106     //cout << "Aircraft::vFs: " << vFs << endl;
107     vForces = State->GetTs2b()*vFs;
108
109     vDXYZcg(eX) = -(Aircraft->GetXYZrp(eX) 
110                       - MassBalance->GetXYZcg(eX))*inchtoft;
111     vDXYZcg(eY) =  (Aircraft->GetXYZrp(eY) 
112                       - MassBalance->GetXYZcg(eY))*inchtoft;
113     vDXYZcg(eZ) = -(Aircraft->GetXYZrp(eZ) 
114                       - MassBalance->GetXYZcg(eZ))*inchtoft;
115
116     vMoments = vDXYZcg*vForces; // M = r X F
117
118     for (axis_ctr = 0; axis_ctr < 3; axis_ctr++) {
119       for (ctr = 0; ctr < Coeff[axis_ctr+3].size(); ctr++) {
120         vMoments(axis_ctr+1) += Coeff[axis_ctr+3][ctr]->TotalValue();
121       }
122     }
123     return false;
124   } else {
125     return true;
126   }
127 }
128
129 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130
131 bool FGAerodynamics::Load(FGConfigFile* AC_cfg)
132 {
133   string token, axis;
134
135   AC_cfg->GetNextConfigLine();
136
137   while ((token = AC_cfg->GetValue()) != string("/AERODYNAMICS")) {
138     if (token == "AXIS") {
139       CoeffArray ca;
140       axis = AC_cfg->GetValue("NAME");
141       AC_cfg->GetNextConfigLine();
142       while ((token = AC_cfg->GetValue()) != string("/AXIS")) {
143         if( token == "COEFFICIENT" ) {
144           ca.push_back( new FGCoefficient(FDMExec) );
145           ca.back()->Load(AC_cfg);
146         } else if ( token == "GROUP" ) {
147           ca.push_back( new FGFactorGroup(FDMExec) );
148           ca.back()->Load(AC_cfg);
149         }
150       }
151       Coeff[AxisIdx[axis]] = ca;
152       AC_cfg->GetNextConfigLine();
153     }
154   }
155
156   return true;
157 }
158
159 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160
161 string FGAerodynamics::GetCoefficientStrings(void)
162 {
163   string CoeffStrings = "";
164   bool firstime = true;
165   unsigned int axis, sd;
166
167   for (axis = 0; axis < 6; axis++) {
168     for (sd = 0; sd < Coeff[axis].size(); sd++) {
169       if (firstime) {
170         firstime = false;
171       } else {
172         CoeffStrings += ", ";
173       }
174       CoeffStrings += Coeff[axis][sd]->GetCoefficientStrings();
175     }
176   }
177   return CoeffStrings;
178 }
179
180 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
181
182 string FGAerodynamics::GetCoefficientValues(void)
183 {
184   string SDValues = "";
185   char buffer[10];
186   bool firstime = true;
187
188   for (unsigned int axis = 0; axis < 6; axis++) {
189     for (unsigned int sd = 0; sd < Coeff[axis].size(); sd++) {
190       if (firstime) {
191         firstime = false;
192       } else {
193         SDValues += ", ";
194       }
195       SDValues += Coeff[axis][sd]->GetCoefficientValues();
196     }
197   }
198
199   return SDValues;
200 }
201
202 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203
204 double FGAerodynamics::GetLoD(void)
205 {
206   double LoD;
207
208   if (vFs(1) != 0.00) return vFs(3)/vFs(1);
209   else                return 0.00;
210 }
211
212 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
213
214 void FGAerodynamics::Debug(void)
215 {
216     //TODO: Add your source code here
217 }
218