Imported Upstream version 1.64.0
[platform/upstream/boost.git] / doc / html / boost_units / Dimensional_Analysis.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
5 <title>Dimensional Analysis</title>
6 <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8 <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9 <link rel="up" href="../boost_units.html" title="Chapter&#160;43.&#160;Boost.Units 1.1.0">
10 <link rel="prev" href="Quick_Start.html" title="Quick Start">
11 <link rel="next" href="Units.html" title="Units">
12 </head>
13 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14 <table cellpadding="2" width="100%"><tr>
15 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16 <td align="center"><a href="../../../index.html">Home</a></td>
17 <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20 <td align="center"><a href="../../../more/index.htm">More</a></td>
21 </tr></table>
22 <hr>
23 <div class="spirit-nav">
24 <a accesskey="p" href="Quick_Start.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_units.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="Units.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25 </div>
26 <div class="section">
27 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
28 <a name="boost_units.Dimensional_Analysis"></a><a class="link" href="Dimensional_Analysis.html" title="Dimensional Analysis">Dimensional Analysis</a>
29 </h2></div></div></div>
30 <p>
31       The concept of <a href="http://en.wikipedia.org/wiki/Dimensional_analysis" target="_top">dimensional
32       analysis</a> is normally presented early on in introductory physics and
33       engineering classes as a means of determining the correctness of an equation
34       or computation by propagating the physical measurement <a href="http://en.wikipedia.org/wiki/Units_of_measurement" target="_top">units</a>
35       of various quantities through the equation along with their numerical values.
36       There are a number of standard unit systems in common use, the most prominent
37       of which is the <a href="http://en.wikipedia.org/wiki/SI_units" target="_top">Systeme
38       International</a> (also known as SI or MKS (meter-kilogram-second), which
39       was a metric predecessor to the SI system named for three of the base units
40       on which the system is based). The SI is the only official international standard
41       unit system and is widely utilized in science and engineering. Other common
42       systems include the <a href="http://en.wikipedia.org/wiki/Cgs_units" target="_top">CGS</a>
43       (centimeter-gram-second) system and the <a href="http://en.wikipedia.org/wiki/English_units" target="_top">English</a>
44       system still in use in some problem domains in the United States and elsewhere.
45       In physics, there also exist a number of other systems that are in common use
46       in specialized subdisciplines. These are collectively referred to as <a href="http://en.wikipedia.org/wiki/Natural_units" target="_top">natural units</a>. When
47       quantities representing different measurables are combined, dimensional analysis
48       provides the means of assessing the consistency of the resulting calculation.
49       For example, the sum of two lengths is also a length, while the product of
50       two lengths is an area, and the sum of a length and an area is undefined. The
51       fact that the arguments to many functions (such as exp, log, etc...) must be
52       dimensionless quantities can be easily demonstrated by examining their series
53       expansions in the context of dimensional analysis. This library facilitates
54       the enforcement of this type of restriction in code involving dimensioned quantities
55       where appropriate.
56     </p>
57 <p>
58       In the following discussion we view dimensional analysis as an abstraction
59       in which an arbitrary set of <a href="http://en.wikipedia.org/wiki/Fundamental_units" target="_top">units</a>
60       obey the rules of a specific algebra. We will refer to a pair of a base dimension
61       and a rational exponent as a <span class="bold"><strong>fundamental dimension</strong></span>,
62       and a list composed of an arbitrary number of fundamental dimensions as a
63       <span class="bold"><strong>composite dimension</strong></span> or, simply, <span class="bold"><strong>dimension</strong></span>. In particular, given a set of <span class="inlinemediaobject"><img src="../../../libs/units/images/form_0.png" alt="form_0"></span> fundamental dimensions denoted by <span class="inlinemediaobject"><img src="../../../libs/units/images/form_1.png" alt="form_1"></span> and a set of <span class="inlinemediaobject"><img src="../../../libs/units/images/form_0.png" alt="form_0"></span> rational exponents <span class="inlinemediaobject"><img src="../../../libs/units/images/form_2.png" alt="form_2"></span>, any possible (composite) dimension can be written as
64       <span class="inlinemediaobject"><img src="../../../libs/units/images/form_3.png" alt="form_3"></span>.
65     </p>
66 <p>
67       Composite dimensions obey the algebraic rules for dimensional analysis. In
68       particular, for any scalar value, <span class="inlinemediaobject"><img src="../../../libs/units/images/form_4.png" alt="form_4"></span>, and composite dimensions <span class="inlinemediaobject"><img src="../../../libs/units/images/form_5.png" alt="form_5"></span> and <span class="inlinemediaobject"><img src="../../../libs/units/images/form_6.png" alt="form_6"></span>, where <span class="inlinemediaobject"><img src="../../../libs/units/images/form_7.png" alt="form_7"></span>, we have:
69     </p>
70 <p>
71       <span class="inlinemediaobject"><img src="../../../libs/units/images/form_8.png" alt="form_8"></span>
72     </p>
73 <p>
74       Users of a dimensional analysis library should be able to specify an arbitrary
75       list of base dimensions to produce a composite dimension. This potentially
76       includes repeated tags. For example, it should be possible to express energy
77       as <span class="inlinemediaobject"><img src="../../../libs/units/images/form_9.png" alt="form_9"></span>, <span class="inlinemediaobject"><img src="../../../libs/units/images/form_10.png" alt="form_10"></span>, <span class="inlinemediaobject"><img src="../../../libs/units/images/form_11.png" alt="form_11"></span>, or any other permutation of mass, length, and time having
78       aggregate exponents of 1, 2, and -2, respectively. In order to be able to perform
79       computations on arbitrary sets of dimensions, all composite dimensions must
80       be reducible to an unambiguous final composite dimension, which we will refer
81       to as a <span class="bold"><strong>reduced dimension</strong></span>, for which
82     </p>
83 <div class="orderedlist"><ol class="orderedlist" type="1">
84 <li class="listitem">
85           fundamental dimensions are consistently ordered
86         </li>
87 <li class="listitem">
88           dimensions with zero exponent are elided. Note that reduced dimensions
89           never have more than <span class="inlinemediaobject"><img src="../../../libs/units/images/form_0.png" alt="form_0"></span> base dimensions, one for each distinct fundamental
90           dimension, but may have fewer.
91         </li>
92 </ol></div>
93 <p>
94       In our implementation, base dimensions are associated with tag types. As we
95       will ultimately represent composite dimensions as typelists, we must provide
96       some mechanism for sorting base dimension tags in order to make it possible
97       to convert an arbitrary composite dimension into a reduced dimension. For this
98       purpose, we assign a unique integer to each base dimension. The <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/base_dimension.html" title="Class template base_dimension">base_dimension</a></code></span> class
99       (found in <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.base_dimension_hpp" title="Header &lt;boost/units/base_dimension.hpp&gt;">boost/units/base_dimension.hpp</a></code>)
100       uses the curiously recurring template pattern (CRTP) technique to ensure that
101       ordinals specified for base dimensions are unique:
102     </p>
103 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Derived</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">N</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">base_dimension</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
104 </pre>
105 <p>
106       With this, we can define the base dimensions for length, mass, and time as:
107     </p>
108 <p>
109 </p>
110 <pre class="programlisting"><span class="comment">/// base dimension of length</span>
111 <span class="keyword">struct</span> <span class="identifier">length_base_dimension</span> <span class="special">:</span> <span class="identifier">base_dimension</span><span class="special">&lt;</span><span class="identifier">length_base_dimension</span><span class="special">,</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">{</span> <span class="special">};</span>
112 <span class="comment">/// base dimension of mass</span>
113 <span class="keyword">struct</span> <span class="identifier">mass_base_dimension</span> <span class="special">:</span> <span class="identifier">base_dimension</span><span class="special">&lt;</span><span class="identifier">mass_base_dimension</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;</span> <span class="special">{</span> <span class="special">};</span>
114 <span class="comment">/// base dimension of time</span>
115 <span class="keyword">struct</span> <span class="identifier">time_base_dimension</span> <span class="special">:</span> <span class="identifier">base_dimension</span><span class="special">&lt;</span><span class="identifier">time_base_dimension</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;</span> <span class="special">{</span> <span class="special">};</span>
116 </pre>
117 <p>
118     </p>
119 <p>
120       It is important to note that the choice of order is completely arbitrary as
121       long as each tag has a unique enumerable value; non-unique ordinals are flagged
122       as errors at compile-time. Negative ordinals are reserved for use by the library.
123       To define composite dimensions corresponding to the base dimensions, we simply
124       create MPL-conformant typelists of fundamental dimensions by using the <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/dim.html" title="Struct template dim">dim</a></code></span>
125       class to encapsulate pairs of base dimensions and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/static_rational.html" title="Class template static_rational">static_rational</a></code></span>
126       exponents. The <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/make_dimension_list.html" title="Struct template make_dimension_list">make_dimension_list</a></code></span>
127       class acts as a wrapper to ensure that the resulting type is in the form of
128       a reduced dimension:
129     </p>
130 <p>
131 </p>
132 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">make_dimension_list</span><span class="special">&lt;</span>
133     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">length_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
134 <span class="special">&gt;::</span><span class="identifier">type</span>   <span class="identifier">length_dimension</span><span class="special">;</span>
135
136 <span class="keyword">typedef</span> <span class="identifier">make_dimension_list</span><span class="special">&lt;</span>
137     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">mass_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
138 <span class="special">&gt;::</span><span class="identifier">type</span>     <span class="identifier">mass_dimension</span><span class="special">;</span>
139
140 <span class="keyword">typedef</span> <span class="identifier">make_dimension_list</span><span class="special">&lt;</span>
141     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">time_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
142 <span class="special">&gt;::</span><span class="identifier">type</span>     <span class="identifier">time_dimension</span><span class="special">;</span>
143 </pre>
144 <p>
145     </p>
146 <p>
147       This can also be easily accomplished using a convenience typedef provided by
148       <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/base_dimension.html" title="Class template base_dimension">base_dimension</a></code></span>:
149     </p>
150 <p>
151 </p>
152 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">length_base_dimension</span><span class="special">::</span><span class="identifier">dimension_type</span>    <span class="identifier">length_dimension</span><span class="special">;</span>
153 <span class="keyword">typedef</span> <span class="identifier">mass_base_dimension</span><span class="special">::</span><span class="identifier">dimension_type</span>      <span class="identifier">mass_dimension</span><span class="special">;</span>
154 <span class="keyword">typedef</span> <span class="identifier">time_base_dimension</span><span class="special">::</span><span class="identifier">dimension_type</span>      <span class="identifier">time_dimension</span><span class="special">;</span>
155 </pre>
156 <p>
157     </p>
158 <p>
159       so that the above code is identical to the full typelist definition. Composite
160       dimensions are similarly defined via a typelist:
161     </p>
162 <p>
163 </p>
164 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">make_dimension_list</span><span class="special">&lt;</span>
165     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">length_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
166 <span class="special">&gt;::</span><span class="identifier">type</span>   <span class="identifier">area_dimension</span><span class="special">;</span>
167
168 <span class="keyword">typedef</span> <span class="identifier">make_dimension_list</span><span class="special">&lt;</span>
169     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">mass_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
170                       <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">length_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
171                       <span class="identifier">dim</span><span class="special">&lt;</span> <span class="identifier">time_base_dimension</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special">&lt;-</span><span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
172 <span class="special">&gt;::</span><span class="identifier">type</span>    <span class="identifier">energy_dimension</span><span class="special">;</span>
173 </pre>
174 <p>
175     </p>
176 <p>
177       A convenience class for composite dimensions with integer powers is also provided:
178     </p>
179 <p>
180 </p>
181 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">derived_dimension</span><span class="special">&lt;</span><span class="identifier">length_base_dimension</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>  <span class="identifier">area_dimension</span><span class="special">;</span>
182 <span class="keyword">typedef</span> <span class="identifier">derived_dimension</span><span class="special">&lt;</span><span class="identifier">mass_base_dimension</span><span class="special">,</span><span class="number">1</span><span class="special">,</span>
183                           <span class="identifier">length_base_dimension</span><span class="special">,</span><span class="number">2</span><span class="special">,</span>
184                           <span class="identifier">time_base_dimension</span><span class="special">,-</span><span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>   <span class="identifier">energy_dimension</span><span class="special">;</span>
185 </pre>
186 <p>
187     </p>
188 </div>
189 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
190 <td align="left"></td>
191 <td align="right"><div class="copyright-footer">Copyright &#169; 2003-2008 Matthias Christian Schabel<br>Copyright &#169; 2007-2010 Steven
192       Watanabe<p>
193         Distributed under the Boost Software License, Version 1.0. (See accompanying
194         file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
195       </p>
196 </div></td>
197 </tr></table>
198 <hr>
199 <div class="spirit-nav">
200 <a accesskey="p" href="Quick_Start.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_units.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="Units.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
201 </div>
202 </body>
203 </html>