Before discussing the basics of the library, we first define a few terms that
will be used frequently in the following :

Base dimension : A base dimension is loosely
defined as a measurable entity of interest; in conventional dimensional analysis,
base dimensions include length ([L]), mass ([M]), time ([T]), etc... but
there is no specific restriction on what base dimensions can be used. Base
dimensions are essentially a tag type and provide no dimensional analysis
functionality themselves.

Dimension : A collection of zero or more
base dimensions, each potentially raised to a different rational power. For
example, area = [L]^2, velocity = [L]^1/[T]^1, and energy = [M]^1 [L]^2/[T]^2
are all dimensions.

Base unit : A base unit represents a specific
measure of a dimension. For example, while length is an abstract measure
of distance, the meter is a concrete base unit of distance. Conversions are
defined using base units. Much like base dimensions, base units are a tag
type used solely to define units and do not support dimensional analysis
algebra.

System : A unit system is a collection of
base units representing all the measurable entities of interest for a specific
problem. For example, the SI unit system defines seven base units : length
([L]) in meters, mass ([M]) in kilograms, time ([T]) in seconds, current
([I]) in amperes, temperature ([theta]) in kelvin, amount ([N]) in moles,
and luminous intensity ([J]) in candelas. All measurable entities within
the SI system can be represented as products of various integer or rational
powers of these seven base units.

Quantity : A quantity represents a concrete
amount of a unit. Thus, while the meter is the base unit of length in the
SI system, 5.5 meters is a quantity of length in that system.

To begin, we present two short tutorials. Tutorial1
demonstrates the use of SI
units. After including the appropriate system headers and the headers for the
various SI units we will need (all SI units can be included with boost/units/systems/si.hpp) and
for quantity I/O (boost/units/io.hpp),
we define a function that computes the work, in joules, done by exerting a
force in newtons over a specified distance in meters and outputs the result
to std::cout. The quantity class accepts
a second template parameter as its value type; this parameter defaults to
double if not otherwise specified.
To demonstrate the ease of using user-defined types in dimensional calculations,
we also present code for computing the complex impedance using std::complex<double>
as the value type :

The intent and function of the above code should be obvious; the output produced
is :

F=2Ndx=2mE=4JV=(12.5,0)VI=(3,4)AZ=(1.5,-2)OhmI*Z=(12.5,0)VI*Z==V?true

While this library attempts to make simple dimensional computations easy to
code, it is in no way tied to any particular unit system (SI or otherwise).
Instead, it provides a highly flexible compile-time system for dimensional
analysis, supporting arbitrary collections of base dimensions, rational powers
of units, and explicit quantity conversions. It accomplishes all of this via
template metaprogramming techniques. With modern optimizing compilers, this
results in zero runtime overhead for quantity computations relative to the
same code without unit checking.