]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGExternalReactions.cpp
Merge branch 'next' of git://gitorious.org/fg/flightgear into next
[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: FGExternalReactions.cpp,v 1.10 2011/05/20 03:18:36 jberndt Exp $";
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   PostLoad(el, PropertyManager);
89
90   return true;
91 }
92
93 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94
95 FGExternalReactions::~FGExternalReactions()
96 {
97   for (unsigned int i=0; i<Forces.size(); i++) delete Forces[i];
98   Forces.clear();
99
100   Debug(1);
101 }
102
103 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104
105 bool FGExternalReactions::InitModel(void)
106 {
107   return true;
108 }
109
110 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
112 bool FGExternalReactions::Run(bool Holding)
113 {
114   if (FGModel::Run(Holding)) return true;
115   if (Holding) return false; // if paused don't execute
116   if (NoneDefined) return true;
117
118   RunPreFunctions();
119
120   vTotalForces.InitMatrix();
121   vTotalMoments.InitMatrix();
122
123   for (unsigned int i=0; i<Forces.size(); i++) {
124     vTotalForces  += Forces[i]->GetBodyForces();
125     vTotalMoments += Forces[i]->GetMoments();
126   }
127
128   RunPostFunctions();
129
130   return false;
131 }
132
133 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
134 //    The bitmasked value choices are as follows:
135 //    unset: In this case (the default) JSBSim would only print
136 //       out the normally expected messages, essentially echoing
137 //       the config files as they are read. If the environment
138 //       variable is not set, debug_lvl is set to 1 internally
139 //    0: This requests JSBSim not to output any messages
140 //       whatsoever.
141 //    1: This value explicity requests the normal JSBSim
142 //       startup messages
143 //    2: This value asks for a message to be printed out when
144 //       a class is instantiated
145 //    4: When this value is set, a message is displayed when a
146 //       FGModel object executes its Run() method
147 //    8: When this value is set, various runtime state variables
148 //       are printed out periodically
149 //    16: When set various parameters are sanity checked and
150 //       a message is printed out when they go out of bounds
151
152 void FGExternalReactions::Debug(int from)
153 {
154   if (debug_lvl <= 0) return;
155
156   if (debug_lvl & 1) { // Standard console startup message output
157     if (from == 0) { // Constructor - loading and initialization
158     }
159     if (from == 2) { // Loading
160       cout << endl << "  External Reactions: " << endl;
161     }
162   }
163   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
164     if (from == 0) cout << "Instantiated: FGExternalReactions" << endl;
165     if (from == 1) cout << "Destroyed:    FGExternalReactions" << endl;
166   }
167   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
168   }
169   if (debug_lvl & 8 ) { // Runtime state variables
170   }
171   if (debug_lvl & 16) { // Sanity checking
172   }
173   if (debug_lvl & 64) {
174     if (from == 0) { // Constructor
175       cout << IdSrc << endl;
176       cout << IdHdr << endl;
177     }
178   }
179 }
180
181 } // namespace JSBSim
182