// 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 \brief kitchen_sink.cpp \details More extensive quantity tests. Output: @verbatim //[kitchen_sink_output_1 S1 : 2 X1 : 2 X2 : (4/3) U1 : N U2 : J Q1 : 1 N Q2 : 2 J //] //[kitchen_sink_output_2 U1*S1 : 2 N S1*U1 : 2 N U1/S1 : 0.5 N S1/U1 : 2 m^-1 kg^-1 s^2 //] //[kitchen_sink_output_3 U1+U1 : N U1-U1 : N U1*U1 : m^2 kg^2 s^-4 U1/U1 : dimensionless U1*U2 : m^3 kg^2 s^-4 U1/U2 : m^-1 U1^X : m^2 kg^2 s^-4 X1vU1 : m^(1/2) kg^(1/2) s^-1 U1^X2 : m^(4/3) kg^(4/3) s^(-8/3) X2vU1 : m^(3/4) kg^(3/4) s^(-3/2) //] //[kitchen_sink_output_4 Q1*S1 : 2 N S1*Q1 : 2 N Q1/S1 : 0.5 N S1/Q1 : 2 m^-1 kg^-1 s^2 //] //[kitchen_sink_output_5 U1*Q1 : 1 m^2 kg^2 s^-4 Q1*U1 : 1 m^2 kg^2 s^-4 U1/Q1 : 1 dimensionless Q1/U1 : 1 dimensionless //] //[kitchen_sink_output_6 +Q1 : 1 N -Q1 : -1 N Q1+Q1 : 2 N Q1-Q1 : 0 N Q1*Q1 : 1 m^2 kg^2 s^-4 Q1/Q1 : 1 dimensionless Q1*Q2 : 2 m^3 kg^2 s^-4 Q1/Q2 : 0.5 m^-1 Q1^X1 : 1 m^2 kg^2 s^-4 X1vQ1 : 1 m^(1/2) kg^(1/2) s^-1 Q1^X2 : 1 m^(4/3) kg^(4/3) s^(-8/3) X2vQ1 : 1 m^(3/4) kg^(3/4) s^(-3/2) //] //[kitchen_sink_output_7 l1 == l2 false l1 != l2 true l1 <= l2 true l1 < l2 true l1 >= l2 false l1 > l2 false //] dimless = 1 //[kitchen_sink_output_8 v1 = 2 m s^-1 //] //[kitchen_sink_output_9 F = 1 N dx = 1 m E = 1 J //] //[kitchen_sink_output_10 r = 5e-07 m P = 101325 Pa V = 5.23599e-19 m^3 T = 310 K n = 2.05835e-17 mol R = 8.314472 m^2 kg s^-2 K^-1 mol^-1 (rel. unc. = 1.8e-06) //] //[kitchen_sink_output_11 theta = 0.375 rd sin(theta) = 0.366273 dimensionless asin(sin(theta)) = 0.375 rd //] //[kitchen_sink_output_12 V = (12.5,0) V I = (3,4) A Z = (1.5,-2) Ohm I*Z = (12.5,0) V //] //[kitchen_sink_output_13 x+y-w = 0.48(+/-0.632772) m w*x = 9.04(+/-0.904885) m^2 x/y = 0.666667(+/-0.149071) dimensionless //] //[kitchen_sink_output_14 w*y^2/(u*x)^2 = 10.17(+/-3.52328) m^-1 w/(u*x)^(1/2) = 3.19612(+/-0.160431) dimensionless //] //[kitchen_sink_output_15 I*w = m^2 kg s^-1 rad^-1 I*w/L = dimensionless I*w^2 = J //] //[kitchen_sink_output_16 1 F 1 kat 1 S 1 C 1 V 1 J 1 N 1 Hz 1 lx 1 H 1 lm 1 Wb 1 T 1 W 1 Pa 1 Ohm //] //[kitchen_sink_output_18 1 farad 1 katal 1 siemen 1 coulomb 1 volt 1 joule 1 newton 1 hertz 1 lux 1 henry 1 lumen 1 weber 1 tesla 1 watt 1 pascal 1 ohm //] @endverbatim **/ #include #include #include #include #include #include #include #include #include #include "measurement.hpp" namespace boost { namespace units { //[kitchen_sink_function_snippet_3 /// the physical definition of work - computed for an arbitrary unit system template constexpr quantity,Y> work(quantity,Y> F, quantity,Y> dx) { return F*dx; } //] //[kitchen_sink_function_snippet_4 /// the ideal gas law in si units template constexpr quantity idealGasLaw(const quantity& P, const quantity& V, const quantity& T) { using namespace boost::units::si; using namespace constants::codata; return (P*V/(R*T)); } //] } // namespace units } // namespace boost int main() { using namespace boost::units; using namespace boost::units::si; { //[kitchen_sink_snippet_1 /// scalar const double s1 = 2; const long x1 = 2; const static_rational<4,3> x2; /// define some units force u1 = newton; energy u2 = joule; /// define some quantities quantity q1(1.0*u1); quantity q2(2.0*u2); //] /// check scalar, unit, and quantity io std::cout << "S1 : " << s1 << std::endl << "X1 : " << x1 << std::endl << "X2 : " << x2 << std::endl << "U1 : " << u1 << std::endl << "U2 : " << u2 << std::endl << "Q1 : " << q1 << std::endl << "Q2 : " << q2 << std::endl << std::endl; /// check scalar-unit algebra std::cout //<< "U1+S1 : " << u1+s1 << std::endl // illegal //<< "S1+U1 : " << s1+u1 << std::endl // illegal //<< "U1-S1 : " << u1-s1 << std::endl // illegal //<< "S1-U1 : " << s1-u1 << std::endl // illegal << "U1*S1 : " << u1*s1 << std::endl << "S1*U1 : " << s1*u1 << std::endl << "U1/S1 : " << u1/s1 << std::endl << "S1/U1 : " << s1/u1 << std::endl << std::endl; /// check unit-unit algebra std::cout << "U1+U1 : " << u1+u1 << std::endl << "U1-U1 : " << u1-u1 << std::endl << "U1*U1 : " << u1*u1 << std::endl << "U1/U1 : " << u1/u1 << std::endl //<< "U1+U2 : " << u1+u2 << std::endl // illegal //<< "U1-U2 : " << u1-u2 << std::endl // illegal << "U1*U2 : " << u1*u2 << std::endl << "U1/U2 : " << u1/u2 << std::endl << "U1^X : " << pow<2>(u1) << std::endl << "X1vU1 : " << root<2>(u1) << std::endl << "U1^X2 : " << pow >(u1) << std::endl << "X2vU1 : " << root >(u1) << std::endl << std::endl; /// check scalar-quantity algebra std::cout //<< "Q1+S1 : " << q1+s1 << std::endl // illegal //<< "S1+Q1 : " << s1+q1 << std::endl // illegal //<< "Q1-S1 : " << q1-s1 << std::endl // illegal //<< "S1-Q1 : " << s1-q1 << std::endl // illegal << "Q1*S1 : " << q1*s1 << std::endl << "S1*Q1 : " << s1*q1 << std::endl << "Q1/S1 : " << q1/s1 << std::endl << "S1/Q1 : " << s1/q1 << std::endl << std::endl; /// check unit-quantity algebra std::cout //<< "U1+Q1 : " << u1+q1 << std::endl // illegal //<< "Q1+U1 : " << q1+u1 << std::endl // illegal //<< "U1-Q1 : " << u1-q1 << std::endl // illegal //<< "Q1-U1 : " << q1-u1 << std::endl // illegal << "U1*Q1 : " << u1*q1 << std::endl << "Q1*U1 : " << q1*u1 << std::endl << "U1/Q1 : " << u1/q1 << std::endl << "Q1/U1 : " << q1/u1 << std::endl << std::endl; /// check quantity-quantity algebra std::cout << "+Q1 : " << +q1 << std::endl << "-Q1 : " << -q1 << std::endl << "Q1+Q1 : " << q1+q1 << std::endl << "Q1-Q1 : " << q1-q1 << std::endl << "Q1*Q1 : " << q1*q1 << std::endl << "Q1/Q1 : " << q1/q1 << std::endl //<< "Q1+Q2 : " << q1+q2 << std::endl // illegal //<< "Q1-Q2 : " << q1-q2 << std::endl // illegal << "Q1*Q2 : " << q1*q2 << std::endl << "Q1/Q2 : " << q1/q2 << std::endl << "Q1^X1 : " << pow<2>(q1) << std::endl << "X1vQ1 : " << root<2>(q1) << std::endl << "Q1^X2 : " << pow >(q1) << std::endl << "X2vQ1 : " << root >(q1) << std::endl << std::endl; //[kitchen_sink_snippet_2 /// check comparison tests quantity l1(1.0*meter), l2(2.0*meters); //] std::cout << std::boolalpha << "l1 == l2" << "\t" << (l1 == l2) << std::endl << "l1 != l2" << "\t" << (l1 != l2) << std::endl << "l1 <= l2" << "\t" << (l1 <= l2) << std::endl << "l1 < l2 " << "\t" << (l1 < l2) << std::endl << "l1 >= l2" << "\t" << (l1 >= l2) << std::endl << "l1 > l2 " << "\t" << (l1 > l2) << std::endl << std::endl; //[kitchen_sink_snippet_3 /// check implicit unit conversion from dimensionless to value_type const double dimless = (q1/q1); //] std::cout << "dimless = " << dimless << std::endl << std::endl; quantity v1 = 2.0*meters/second; std::cout << "v1 = " << v1 << std::endl << std::endl; //[kitchen_sink_snippet_4 /// test calcuation of work quantity F(1.0*newton); quantity dx(1.0*meter); quantity E(work(F,dx)); //] std::cout << "F = " << F << std::endl << "dx = " << dx << std::endl << "E = " << E << std::endl << std::endl; { //[kitchen_sink_snippet_5 /// test ideal gas law quantity T = (273.+37.)*kelvin; quantity P = 1.01325e5*pascals; quantity r = 0.5e-6*meters; quantity V = (4.0/3.0)*3.141592*pow<3>(r); quantity n(idealGasLaw(P,V,T)); //] std::cout << "r = " << r << std::endl << "P = " << P << std::endl << "V = " << V << std::endl << "T = " << T << std::endl << "n = " << n << std::endl #if BOOST_UNITS_HAS_TYPEOF << "R = " << constants::codata::R << std::endl #else << "no typeof" << std::endl #endif // BOOST_UNITS_HAS_TYPEOF << std::endl; } //[kitchen_sink_snippet_6 /// test trig stuff quantity theta = 0.375*radians; quantity sin_theta = sin(theta); quantity thetap = asin(sin_theta); //] std::cout << "theta = " << theta << std::endl << "sin(theta) = " << sin_theta << std::endl << "asin(sin(theta)) = " << thetap << std::endl << std::endl; /// test implicit conversion of dimensionless to value double tmp = sin_theta; tmp = sin_theta; /// test implicit conversion from value to dimensionless quantity tmpp = tmp; tmpp = tmp; /// check complex quantities typedef std::complex complex_type; //[kitchen_sink_snippet_7 quantity v = complex_type(12.5,0.0)*volts; quantity i = complex_type(3.0,4.0)*amperes; quantity z = complex_type(1.5,-2.0)*ohms; //] std::cout << "V = " << v << std::endl << "I = " << i << std::endl << "Z = " << z << std::endl << "I*Z = " << i*z << std::endl << std::endl; /// check quantities using user-defined type encapsulating error propagation //[kitchen_sink_snippet_8 quantity > u(measurement(1.0,0.0)*meters), w(measurement(4.52,0.02)*meters), x(measurement(2.0,0.2)*meters), y(measurement(3.0,0.6)*meters); //] std::cout << "x+y-w = " << x+y-w << std::endl << "w*x = " << w*x << std::endl << "x/y = " << x/y << std::endl << "w*y^2/(u*x)^2 = " << w*y*y/pow<2>(u*x) << std::endl << "w/(u*x)^(1/2) = " << w/pow< static_rational<1,2> >(u*x) << std::endl << std::endl; } /// check moment of inertia/angular momentum/rotational energy //[kitchen_sink_snippet_9 std::cout << symbol_format << "I*w = " << moment_of_inertia()*angular_velocity() << std::endl << "I*w/L = " << moment_of_inertia()*angular_velocity()/angular_momentum() << std::endl << "I*w^2 = " << moment_of_inertia()*pow<2>(angular_velocity()) << std::endl << std::endl; //] //[kitchen_sink_snippet_10 // std::cout << typename_format // << quantity(1.0*farad) << std::endl // << quantity(1.0*katal) << std::endl // << quantity(1.0*siemen) << std::endl // << quantity(1.0*coulomb) << std::endl // << quantity(1.0*volt) << std::endl // << quantity(1.0*joule) << std::endl // << quantity(1.0*newton) << std::endl // << quantity(1.0*hertz) << std::endl // << quantity(1.0*lux) << std::endl // << quantity(1.0*henry) << std::endl // << quantity(1.0*lumen) << std::endl // << quantity(1.0*weber) << std::endl // << quantity(1.0*tesla) << std::endl // << quantity(1.0*watt) << std::endl // << quantity(1.0*pascals) << std::endl // << quantity(1.0*ohm) << std::endl // << std::endl; //] //[kitchen_sink_snippet_11 // std::cout << raw_format // << quantity(1.0*farad) << std::endl // << quantity(1.0*katal) << std::endl // << quantity(1.0*siemen) << std::endl // << quantity(1.0*coulomb) << std::endl // << quantity(1.0*volt) << std::endl // << quantity(1.0*joule) << std::endl // << quantity(1.0*newton) << std::endl // << quantity(1.0*hertz) << std::endl // << quantity(1.0*lux) << std::endl // << quantity(1.0*henry) << std::endl // << quantity(1.0*lumen) << std::endl // << quantity(1.0*weber) << std::endl // << quantity(1.0*tesla) << std::endl // << quantity(1.0*watt) << std::endl // << quantity(1.0*pascals) << std::endl // << quantity(1.0*ohm) << std::endl // << std::endl; //] //[kitchen_sink_snippet_12 std::cout << symbol_format << quantity(1.0*farad) << std::endl << quantity(1.0*katal) << std::endl << quantity(1.0*siemen) << std::endl << quantity(1.0*coulomb) << std::endl << quantity(1.0*volt) << std::endl << quantity(1.0*joule) << std::endl << quantity(1.0*newton) << std::endl << quantity(1.0*hertz) << std::endl << quantity(1.0*lux) << std::endl << quantity(1.0*henry) << std::endl << quantity(1.0*lumen) << std::endl << quantity(1.0*weber) << std::endl << quantity(1.0*tesla) << std::endl << quantity(1.0*watt) << std::endl << quantity(1.0*pascals) << std::endl << quantity(1.0*ohm) << std::endl << std::endl; //] //[kitchen_sink_snippet_13 std::cout << name_format << quantity(1.0*farad) << std::endl << quantity(1.0*katal) << std::endl << quantity(1.0*siemen) << std::endl << quantity(1.0*coulomb) << std::endl << quantity(1.0*volt) << std::endl << quantity(1.0*joule) << std::endl << quantity(1.0*newton) << std::endl << quantity(1.0*hertz) << std::endl << quantity(1.0*lux) << std::endl << quantity(1.0*henry) << std::endl << quantity(1.0*lumen) << std::endl << quantity(1.0*weber) << std::endl << quantity(1.0*tesla) << std::endl << quantity(1.0*watt) << std::endl << quantity(1.0*pascals) << std::endl << quantity(1.0*ohm) << std::endl << std::endl; //] return 0; }