40 #include "FGGroundReactions.h"
41 #include "FGAccelerations.h"
42 #include "input_output/FGXMLElement.h"
52 FGGroundReactions::FGGroundReactions(FGFDMExec* fgex) :
57 Name =
"FGGroundReactions";
66 FGGroundReactions::~FGGroundReactions(
void)
68 for (
unsigned int i=0; i<lGear.size();i++)
delete lGear[i];
76 bool FGGroundReactions::InitModel(
void)
78 if (!FGModel::InitModel())
return false;
81 vMoments.InitMatrix();
86 for (
unsigned int i=0; i<lGear.size(); i++)
87 lGear[i]->ResetToIC();
97 if (Holding)
return false;
101 vForces.InitMatrix();
102 vMoments.InitMatrix();
111 for (
unsigned int i=0; i<lGear.size(); i++) {
112 vForces += lGear[i]->GetBodyForces(
this);
113 vMoments += lGear[i]->GetMoments();
123 bool FGGroundReactions::GetWOW(
void)
const
126 for (
unsigned int i=0; i<lGear.size(); i++) {
127 if (lGear[i]->IsBogey() && lGear[i]->GetWOW()) {
140 for (
unsigned int i=0; i<lGear.size(); ++i)
141 lGear[i]->SetSteerCmd(cmd);
146 bool FGGroundReactions::Load(
Element* document)
159 lGear.resize(numContacts);
161 for (
unsigned int idx=0; idx<numContacts; idx++) {
162 lGear[idx] =
new FGLGear(contact_element, FDMExec, num++, in);
166 for (
unsigned int i=0; i<lGear.size();i++) lGear[i]->bind();
168 PostLoad(document, FDMExec);
175 string FGGroundReactions::GetGroundReactionStrings(
string delimeter)
const
177 std::ostringstream buf;
179 for (
unsigned int i=0;i<lGear.size();i++) {
180 if (lGear[i]->IsBogey()) {
181 string name = lGear[i]->GetName();
182 buf << name <<
" WOW" << delimeter
183 << name <<
" stroke (ft)" << delimeter
184 << name <<
" stroke velocity (ft/sec)" << delimeter
185 << name <<
" compress force (lbs)" << delimeter
186 << name <<
" wheel side force (lbs)" << delimeter
187 << name <<
" wheel roll force (lbs)" << delimeter
188 << name <<
" body X force (lbs)" << delimeter
189 << name <<
" body Y force (lbs)" << delimeter
190 << name <<
" wheel velocity vec X (ft/sec)" << delimeter
191 << name <<
" wheel velocity vec Y (ft/sec)" << delimeter
192 << name <<
" wheel rolling velocity (ft/sec)" << delimeter
193 << name <<
" wheel side velocity (ft/sec)" << delimeter
194 << name <<
" wheel slip (deg)" << delimeter;
196 string name = lGear[i]->GetName();
197 buf << name <<
" WOW" << delimeter
198 << name <<
" stroke (ft)" << delimeter
199 << name <<
" stroke velocity (ft/sec)" << delimeter
200 << name <<
" compress force (lbs)" << delimeter;
204 buf <<
" Total Gear Force_X (lbs)" << delimeter
205 <<
" Total Gear Force_Y (lbs)" << delimeter
206 <<
" Total Gear Force_Z (lbs)" << delimeter
207 <<
" Total Gear Moment_L (ft-lbs)" << delimeter
208 <<
" Total Gear Moment_M (ft-lbs)" << delimeter
209 <<
" Total Gear Moment_N (ft-lbs)";
216 string FGGroundReactions::GetGroundReactionValues(
string delimeter)
const
218 std::ostringstream buf;
220 for (
unsigned int i=0;i<lGear.size();i++) {
221 if (lGear[i]->IsBogey()) {
222 FGLGear *gear = lGear[i];
223 buf << (gear->GetWOW() ?
"1" :
"0") << delimeter
224 << setprecision(5) << gear->GetCompLen() << delimeter
225 << setprecision(6) << gear->GetCompVel() << delimeter
226 << setprecision(10) << gear->GetCompForce() << delimeter
227 << gear->GetWheelSideForce() << delimeter
228 << gear->GetWheelRollForce() << delimeter
229 << gear->GetBodyXForce() << delimeter
230 << gear->GetBodyYForce() << delimeter
231 << setprecision(6) << gear->GetWheelVel(eX) << delimeter
232 << gear->GetWheelVel(eY) << delimeter
233 << gear->GetWheelRollVel() << delimeter
234 << gear->GetWheelSideVel() << delimeter
235 << gear->GetWheelSlipAngle() << delimeter;
237 FGLGear *gear = lGear[i];
238 buf << (gear->GetWOW() ?
"1" :
"0") << delimeter
239 << setprecision(5) << gear->GetCompLen() << delimeter
240 << setprecision(6) << gear->GetCompVel() << delimeter
241 << setprecision(10) << gear->GetCompForce() << delimeter;
248 << Accelerations->GetGroundForces(eY) << delimeter
249 << Accelerations->GetGroundForces(eZ) << delimeter
250 << Accelerations->GetGroundMoments(eX) << delimeter
251 << Accelerations->GetGroundMoments(eY) << delimeter
252 << Accelerations->GetGroundMoments(eZ);
259 void FGGroundReactions::bind(
void)
261 eSurfaceType = ctGROUND;
265 PropertyManager->
Tie(
"gear/wow",
this, &FGGroundReactions::GetWOW);
289 void FGGroundReactions::Debug(
int from)
291 if (debug_lvl <= 0)
return;
295 cout << endl <<
" Ground Reactions: " << endl;
298 if (debug_lvl & 2 ) {
299 if (from == 0) cout <<
"Instantiated: FGGroundReactions" << endl;
300 if (from == 1) cout <<
"Destroyed: FGGroundReactions" << endl;
302 if (debug_lvl & 4 ) {
304 if (debug_lvl & 8 ) {
306 if (debug_lvl & 16) {
308 if (debug_lvl & 64) {