| // Boost.Units - A C++ library for zero-overhead dimensional analysis and |
| // unit/quantity manipulation and conversion |
| // |
| // Copyright (C) 2003-2008 Matthias Christian Schabel |
| // Copyright (C) 2008 Steven Watanabe |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| /** |
| \file tutorial.cpp |
| |
| \brief Basic tutorial using SI units. |
| |
| \details |
| Tutorial |
| Defines 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. |
| |
| Also code for computing the complex impedance |
| using std::complex<double> as the value type. |
| |
| Output: |
| @verbatim |
| //[tutorial_output |
| F = 2 N |
| dx = 2 m |
| E = 4 J |
| |
| V = (12.5,0) V |
| I = (3,4) A |
| Z = (1.5,-2) Ohm |
| I*Z = (12.5,0) V |
| I*Z == V? true |
| //] |
| @endverbatim |
| */ |
| |
| //[tutorial_code |
| #include <complex> |
| #include <iostream> |
| |
| #include <boost/typeof/std/complex.hpp> |
| |
| #include <boost/units/systems/si/energy.hpp> |
| #include <boost/units/systems/si/force.hpp> |
| #include <boost/units/systems/si/length.hpp> |
| #include <boost/units/systems/si/electric_potential.hpp> |
| #include <boost/units/systems/si/current.hpp> |
| #include <boost/units/systems/si/resistance.hpp> |
| #include <boost/units/systems/si/io.hpp> |
| |
| using namespace boost::units; |
| using namespace boost::units::si; |
| |
| quantity<energy> |
| work(const quantity<force>& F, const quantity<length>& dx) |
| { |
| return F * dx; // Defines the relation: work = force * distance. |
| } |
| |
| int main() |
| { |
| /// Test calculation of work. |
| quantity<force> F(2.0 * newton); // Define a quantity of force. |
| quantity<length> dx(2.0 * meter); // and a distance, |
| quantity<energy> E(work(F,dx)); // and calculate the work done. |
| |
| std::cout << "F = " << F << std::endl |
| << "dx = " << dx << std::endl |
| << "E = " << E << std::endl |
| << std::endl; |
| |
| /// Test and check complex quantities. |
| typedef std::complex<double> complex_type; // double real and imaginary parts. |
| |
| // Define some complex electrical quantities. |
| quantity<electric_potential, complex_type> v = complex_type(12.5, 0.0) * volts; |
| quantity<current, complex_type> i = complex_type(3.0, 4.0) * amperes; |
| quantity<resistance, complex_type> z = complex_type(1.5, -2.0) * ohms; |
| |
| std::cout << "V = " << v << std::endl |
| << "I = " << i << std::endl |
| << "Z = " << z << std::endl |
| // Calculate from Ohm's law voltage = current * resistance. |
| << "I * Z = " << i * z << std::endl |
| // Check defined V is equal to calculated. |
| << "I * Z == V? " << std::boolalpha << (i * z == v) << std::endl |
| << std::endl; |
| return 0; |
| } |
| //] |