1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 Module: FGExternalReactions.cpp
6 Purpose: Manages the External Forces
9 ------------- Copyright (C) 2006 David P. Culp (davidculp2@comcast.net) -------------
11 This program is free software; you can redistribute it and/or modify it under
12 the terms of the GNU Lesser General Public License as published by the Free Software
13 Foundation; either version 2 of the License, or (at your option) any later
16 This program is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
21 You should have received a copy of the GNU Lesser General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23 Place - Suite 330, Boston, MA 02111-1307, USA.
25 Further information about the GNU Lesser General Public License can also be found on
26 the world wide web at http://www.gnu.org.
28 FUNCTIONAL DESCRIPTION
29 --------------------------------------------------------------------------------
32 --------------------------------------------------------------------------------
35 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39 #include "FGExternalReactions.h"
40 #include "input_output/FGXMLElement.h"
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
56 static const char *IdSrc = "$Id: FGExternalReactions.cpp,v 1.12 2011/07/20 12:16:34 jberndt Exp $";
57 static const char *IdHdr = ID_EXTERNALREACTIONS;
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63 FGExternalReactions::FGExternalReactions(FGFDMExec* fdmex) : FGModel(fdmex)
70 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 bool FGExternalReactions::Load(Element* el)
74 // check if a file attribute was specified
75 string fname = el->GetAttributeValue("file");
77 string file = FDMExec->GetFullAircraftPath() + "/" + fname;
78 el = LoadXMLDocument(file);
79 if (el == 0L) return false;
82 FGModel::Load(el); // Call the base class Load() function to load interface properties.
86 // Parse force elements
89 Element* force_element = el->FindElement("force");
90 while (force_element) {
91 Forces.push_back( new FGExternalForce(FDMExec, force_element, index) );
94 force_element = el->FindNextElement("force");
97 PostLoad(el, PropertyManager);
99 if (!NoneDefined) bind();
104 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106 FGExternalReactions::~FGExternalReactions()
108 for (unsigned int i=0; i<Forces.size(); i++) delete Forces[i];
114 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
116 bool FGExternalReactions::InitModel(void)
121 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
123 bool FGExternalReactions::Run(bool Holding)
125 if (FGModel::Run(Holding)) return true;
126 if (Holding) return false; // if paused don't execute
127 if (NoneDefined) return true;
131 vTotalForces.InitMatrix();
132 vTotalMoments.InitMatrix();
134 for (unsigned int i=0; i<Forces.size(); i++) {
135 vTotalForces += Forces[i]->GetBodyForces();
136 vTotalMoments += Forces[i]->GetMoments();
144 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146 void FGExternalReactions::bind(void)
148 typedef double (FGExternalReactions::*PMF)(int) const;
149 PropertyManager->Tie("moments/l-external-lbsft", this, eL, (PMF)&FGExternalReactions::GetMoments);
150 PropertyManager->Tie("moments/m-external-lbsft", this, eM, (PMF)&FGExternalReactions::GetMoments);
151 PropertyManager->Tie("moments/n-external-lbsft", this, eN, (PMF)&FGExternalReactions::GetMoments);
152 PropertyManager->Tie("forces/fbx-external-lbs", this, eX, (PMF)&FGExternalReactions::GetForces);
153 PropertyManager->Tie("forces/fby-external-lbs", this, eY, (PMF)&FGExternalReactions::GetForces);
154 PropertyManager->Tie("forces/fbz-external-lbs", this, eZ, (PMF)&FGExternalReactions::GetForces);
158 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
159 // The bitmasked value choices are as follows:
160 // unset: In this case (the default) JSBSim would only print
161 // out the normally expected messages, essentially echoing
162 // the config files as they are read. If the environment
163 // variable is not set, debug_lvl is set to 1 internally
164 // 0: This requests JSBSim not to output any messages
166 // 1: This value explicity requests the normal JSBSim
168 // 2: This value asks for a message to be printed out when
169 // a class is instantiated
170 // 4: When this value is set, a message is displayed when a
171 // FGModel object executes its Run() method
172 // 8: When this value is set, various runtime state variables
173 // are printed out periodically
174 // 16: When set various parameters are sanity checked and
175 // a message is printed out when they go out of bounds
177 void FGExternalReactions::Debug(int from)
179 if (debug_lvl <= 0) return;
181 if (debug_lvl & 1) { // Standard console startup message output
182 if (from == 0) { // Constructor - loading and initialization
184 if (from == 2) { // Loading
185 cout << endl << " External Reactions: " << endl;
188 if (debug_lvl & 2 ) { // Instantiation/Destruction notification
189 if (from == 0) cout << "Instantiated: FGExternalReactions" << endl;
190 if (from == 1) cout << "Destroyed: FGExternalReactions" << endl;
192 if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
194 if (debug_lvl & 8 ) { // Runtime state variables
196 if (debug_lvl & 16) { // Sanity checking
198 if (debug_lvl & 64) {
199 if (from == 0) { // Constructor
200 cout << IdSrc << endl;
201 cout << IdHdr << endl;
206 } // namespace JSBSim