]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGExternalReactions.cpp
Merge branch 'ehofman/jsbsim'
[flightgear.git] / src / FDM / JSBSim / models / FGExternalReactions.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGExternalReactions.cpp
4  Author:       David P. Culp
5  Date started: 17/11/06
6  Purpose:      Manages the External Forces
7  Called by:    FGAircraft
8
9  ------------- Copyright (C) 2006  David P. Culp (davidculp2@comcast.net) -------------
10
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
14  version.
15
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
19  details.
20
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.
24
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.
27
28 FUNCTIONAL DESCRIPTION
29 --------------------------------------------------------------------------------
30
31 HISTORY
32 --------------------------------------------------------------------------------
33 17/11/06   DC   Created
34
35 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36 INCLUDES
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
38
39 #include "FGExternalReactions.h"
40 #include "input_output/FGXMLElement.h"
41 #include <iostream>
42 #include <string>
43
44 using namespace std;
45
46 namespace JSBSim {
47
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 DEFINITIONS
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51
52 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 GLOBAL DATA
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
55
56 static const char *IdSrc = "$Id$";
57 static const char *IdHdr = ID_EXTERNALREACTIONS;
58
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS IMPLEMENTATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62
63 FGExternalReactions::FGExternalReactions(FGFDMExec* fdmex) : FGModel(fdmex)
64 {
65   NoneDefined = true;
66   Debug(0);
67 }
68
69 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70
71 bool FGExternalReactions::Load(Element* el)
72 {
73   FGModel::Load(el); // Call the base class Load() function to load interface properties.
74
75   Debug(2);
76
77   // Parse force elements
78
79   int index=0;
80   Element* force_element = el->FindElement("force");
81   while (force_element) {
82     Forces.push_back( new FGExternalForce(FDMExec, force_element, index) );
83     NoneDefined = false;
84     index++; 
85     force_element = el->FindNextElement("force");
86   }
87
88   return true;
89 }
90
91 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92
93 FGExternalReactions::~FGExternalReactions()
94 {
95   for (unsigned int i=0; i<Forces.size(); i++) delete Forces[i];
96   Forces.clear();
97
98   Debug(1);
99 }
100
101 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102
103 bool FGExternalReactions::InitModel(void)
104 {
105   if (!FGModel::InitModel()) return false;
106
107   return true;
108 }
109
110 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
112 bool FGExternalReactions::Run()
113 {
114   if (FGModel::Run()) return true;
115   if (FDMExec->Holding()) return false; // if paused don't execute
116   if (NoneDefined) return true;
117
118   vTotalForces.InitMatrix();
119   vTotalMoments.InitMatrix();
120
121   for (unsigned int i=0; i<Forces.size(); i++) {
122     vTotalForces  += Forces[i]->GetBodyForces();
123     vTotalMoments += Forces[i]->GetMoments();
124   }
125
126   return false;
127 }
128
129 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130 //    The bitmasked value choices are as follows:
131 //    unset: In this case (the default) JSBSim would only print
132 //       out the normally expected messages, essentially echoing
133 //       the config files as they are read. If the environment
134 //       variable is not set, debug_lvl is set to 1 internally
135 //    0: This requests JSBSim not to output any messages
136 //       whatsoever.
137 //    1: This value explicity requests the normal JSBSim
138 //       startup messages
139 //    2: This value asks for a message to be printed out when
140 //       a class is instantiated
141 //    4: When this value is set, a message is displayed when a
142 //       FGModel object executes its Run() method
143 //    8: When this value is set, various runtime state variables
144 //       are printed out periodically
145 //    16: When set various parameters are sanity checked and
146 //       a message is printed out when they go out of bounds
147
148 void FGExternalReactions::Debug(int from)
149 {
150   if (debug_lvl <= 0) return;
151
152   if (debug_lvl & 1) { // Standard console startup message output
153     if (from == 0) { // Constructor - loading and initialization
154     }
155     if (from == 2) { // Loading
156       cout << endl << "  External Reactions: " << endl;
157     }
158   }
159   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
160     if (from == 0) cout << "Instantiated: FGExternalReactions" << endl;
161     if (from == 1) cout << "Destroyed:    FGExternalReactions" << endl;
162   }
163   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
164   }
165   if (debug_lvl & 8 ) { // Runtime state variables
166   }
167   if (debug_lvl & 16) { // Sanity checking
168   }
169   if (debug_lvl & 64) {
170     if (from == 0) { // Constructor
171       cout << IdSrc << endl;
172       cout << IdHdr << endl;
173     }
174   }
175 }
176
177 } // namespace JSBSim
178