]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/math/FGFunction.h
Clean up header file use of iostream and "using" declarations
[flightgear.git] / src / FDM / JSBSim / math / FGFunction.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3 Header: FGFunction.h
4 Author: Jon Berndt
5 Date started: August 25 2004
6
7  ------------- Copyright (C) 2001  Jon S. Berndt (jsb@hal-pc.org) -------------
8
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
17  details.
18
19  You should have received a copy of the GNU Lesser General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA  02111-1307, USA.
22
23  Further information about the GNU Lesser General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25
26 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27 SENTRY
28 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
29
30 #ifndef FGFUNCTION_H
31 #define FGFUNCTION_H
32
33 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34 INCLUDES
35 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
36
37 #include <vector>
38 #include <string>
39 #include "FGParameter.h"
40 #include <input_output/FGXMLElement.h>
41 #include <input_output/FGPropertyManager.h>
42
43 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
44 DEFINITIONS
45 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
46
47 #define ID_FUNCTION "$Id$"
48
49 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 FORWARD DECLARATIONS
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52
53 namespace JSBSim {
54
55 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 CLASS DOCUMENTATION
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58
59 /** Represents a mathematical function.
60 The FGFunction class is a powerful and versatile resource that allows
61 algebraic functions to be defined in a JSBSim configuration file. It is
62 similar in concept to MathML (Mathematical Markup Language, www.w3.org/Math/),
63 but simpler and more terse.
64 A function definition consists of an operation, a value, a table, or a property
65 (which evaluates to a value). The currently supported operations are:
66 - sum (takes n args)
67 - difference (takes n args)
68 - product (takes n args)
69 - quotient (takes 2 args)
70 - pow (takes 2 args)
71 - exp (takes 2 args)
72 - abs (takes n args)
73 - sin (takes 1 arg)
74 - cos (takes 1 arg)
75 - tan (takes 1 arg)
76 - asin (takes 1 arg)
77 - acos (takes 1 arg)
78 - atan (takes 1 arg)
79 - atan2 (takes 2 args)
80
81 An operation is defined in the configuration file as in the following example:
82
83 @code
84   <sum>
85     <value> 3.14159 </value>
86     <property> velocities/qbar </property>
87     <product>
88       <value> 0.125 </value>
89       <property> metrics/wingarea </property>
90     </product>
91   </sum>
92 @endcode
93
94 A full function definition, such as is used in the aerodynamics section of a
95 configuration file includes the function element, and other elements. It should
96 be noted that there can be only one non-optional (non-documentation) element -
97 that is, one operation element - in the top-level function definition.
98 Multiple value and/or property elements cannot be immediate child
99 members of the function element. Almost always, the first operation within the
100 function element will be a product or sum. For example:
101
102 @code
103 <function name="aero/coefficient/Clr">
104     <description>Roll moment due to yaw rate</description>
105     <product>
106         <property>aero/qbar-area</property>
107         <property>metrics/bw-ft</property>
108         <property>aero/bi2vel</property>
109         <property>velocities/r-aero-rad_sec</property>
110         <table>
111             <independentVar>aero/alpha-rad</independentVar>
112             <tableData>
113                  0.000  0.08
114                  0.094  0.19
115             </tableData>
116         </table>
117     </product>
118 </function>
119 @endcode
120
121 The "lowest level" in a function is always a value or a property, which cannot
122 itself contain another element. As shown, operations can contain values,
123 properties, tables, or other operations. In the first above example, the sum
124 element contains all three. What is evaluated is written algebraically as:
125
126 @code 3.14159 + qbar + (0.125 * wingarea) @endcode
127
128 Some operations can take only a single argument. That argument, however, can be
129 an operation (such as sum) which can contain other items. The point to keep in
130 mind is that it evaluates to a single value - which is just what the trigonometric
131 functions require (except atan2, which takes two arguments).
132
133 @author Jon Berndt
134 */
135
136 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
137 DECLARATION: FGFunction
138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
139
140 class FGFunction : public FGParameter
141 {
142 public:
143
144 /** Constructor.
145     When this constructor is called, the XML element pointed to in memory by the
146     element argument is traversed. If other FGParameter-derived objects (values,
147     functions, properties, or tables) are encountered, this instance of the
148     FGFunction object will store a pointer to the found object and pass the relevant
149     Element pointer to the constructor for the new object. In other words, each
150     FGFunction object maintains a list of "child" FGParameter-derived objects which
151     in turn may each contain its own list, and so on. At runtime, each object
152     evaluates its child parameters, which each may have its own child parameters to
153     evaluate.
154     @param PropertyManager a pointer to the property manager instance.
155     @param element a pointer to the Element object containing the function definition.
156     @param prefix an optional prefix to prepend to the name given to the property
157            that represents this function (if given).
158 */
159   FGFunction(FGPropertyManager* PropertyManager, Element* element, string prefix="");
160   /// Destructor.
161   virtual ~FGFunction();
162
163 /** Retrieves the value of the function object.
164     @return the total value of the function. */
165   double GetValue(void) const;
166
167 /** The value that the function evaluates to, as a string.
168   @return the value of the function as a string. */
169   string GetValueAsString(void) const;
170
171 /// Retrieves the name of the function.
172   string GetName(void) const {return Name;}
173
174 /** Specifies whether to cache the value of the function, so it is calculated only
175     once per frame.
176     If shouldCache is true, then the value of the function is calculated, and
177     a flag is set so further calculations done this frame will use the cached value.
178     In order to turn off caching, cacheValue must be called with a false argument.
179     @param shouldCache specifies whether the function should cache the computed value. */
180   void cacheValue(bool shouldCache);
181
182 private:
183   std::vector <FGParameter*> Parameters;
184   FGPropertyManager* const PropertyManager;
185   bool cached;
186   string Prefix;
187   double cachedValue;
188   enum functionType {eTopLevel=0, eProduct, eDifference, eSum, eQuotient, ePow,
189                      eExp, eAbs, eSin, eCos, eTan, eASin, eACos, eATan, eATan2} Type;
190   string Name;
191   void bind(void);
192   void Debug(int from);
193 };
194
195 } // namespace JSBSim
196
197 #endif