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