|
Boost Users : |
Subject: [Boost-users] boost::units - converting from one derived_dimension to another across systems (imperial to metric)
From: Matt Vinson (matt.vinson_at_[hidden])
Date: 2018-11-21 01:46:53
degski: I do not think am making the "nauseam" mistake. My issue is using Boost.Units correctly which I concede is difficult for me but I am reading the docs and trying to get it.
In our field of engineering, we use Kg as a force; not a mass. (We also use pound as a force; not a mass - for your "UK's Weights and Measures Act 1963" counterpart). That said, I should not have made the mistake of using Kg as a force in Boost.Units, it's true. Shame on me.
My task is to convert between lineal forces: k/ft, k/in, lb/ft, lb/in, kN/m, kN/cm, kN/m, N/m, N/cm, N/m, Metric ton/m, Metric ton/cm, Metric ton/mm, Kg/m, Kg/cm, Kg/mm. These are all force/length.
Steven Watanabe: Thank you, again.#1: I was not trying to say it's wrong; sorry. Just that I did not see 'length' and opted for the one that did. The unit's are correct, as you say.
#2: This is an error to start with Kg(force)/meter. I can start with N/meter. I've changed this variable name to newton_per_meter and the conversion factors.
*.h-----------------------------------------------------
namespace dimensional_analysis{
    typedef boost::units::length_base_dimension::dimension_type length_dimension;
    typedef boost::units::mass_base_dimension::dimension_type mass_dimension;
typedef boost::units::make_system<boost::units::us::inch_base_unit,boost::units::us::pound_base_unit>::type ip_system;
      namespace lineal_force {
            typedef boost::mpl::divides<boost::units::force_dimension,boost::units::length_dimension>::type lineal_force_dimension;         Â
            namespace imperial {
                    ////////////////
                   ////lb/in, right?
////boost::units::force_dimension =pound
////boost::units::length_dimension = in
                    ////////////////
                    typedef boost::units::unit<lineal_force_dimension,lengths::ip_system> lineal_force_unit;
             }
             namespace si {
                    ////////////////
                   ////N/m, right?
////boost::units::force_dimension = newton
////boost::units::length_dimension = meter
                    ////////////////
                    typedef boost::units::unit<lineal_force_dimension,boost::units::si::system> lineal_force_unit;
             }
      }//lineal_force
}//dimensional_analysis
*.cpp-----------------------------------------------------
//Imperiallb/in to SI N/m
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
dimensional_analysis::lineal_force::imperial::lineal_force_unit,
dimensional_analysis::lineal_force::si::lineal_force_unit,
double,
175.1268369864); // exact conversion
BOOST_UNITS_DEFAULT_CONVERSION(
dimensional_analysis::lineal_force::imperial::lineal_force_unit,
dimensional_analysis::lineal_force::si::lineal_force_unit);
//SI N/mto Imperial lb/in
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
dimensional_analysis::lineal_force::si::lineal_force_unit,
dimensional_analysis::lineal_force::imperial::lineal_force_unit,
double,
0.1837185501); // exact conversion
BOOST_UNITS_DEFAULT_CONVERSION(
dimensional_analysis::lineal_force::si::lineal_force_unit,
dimensional_analysis::lineal_force::imperial::lineal_force_unit);
//Imperialto SI. This should convert lb/in to N/m andreturn 175.1268369864(N/m)
//But itdoes not. Its converting lb (mass) to Kg(mass), 0.454
const auto t2 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::si::lineal_force_unit>>(
1.0 *dimensional_analysis::lineal_force::imperial::lineal_force_unit::unit_type());
//Again, Imperial to SI. This should convert lb/in to N/m and return 175.1268369864 (N/m)
//But itdoes not. It returns lb (mass) to Kg(mass)
const auto t3 = boost::units::conversion_factor(
dimensional_analysis::lineal_force::imperial::lineal_force_unit::unit_type(),
dimensional_analysis::lineal_force::si::lineal_force_unit::unit_type());
//SI toImperial. This should convert N/m tolb/in and return 0.1837185501 (lb/in)
//But itdoes not. Its converting Kg (mass) to lb(mass), 2.205
const auto t1 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::imperial::lineal_force_unit>>(
1.0 *dimensional_analysis::lineal_force::si::lineal_force_unit::unit_type());
//So, I donât know whythe library is converting mass; Iâve tuned it to use boost::units::force_dimension/boost::units::length_dimension
//I am doing something wrongwhere the library is not using force/length.
//Below does work, mainly.
//This isconvert Si to SI and return value of 1.0 is correct.
const auto t4 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::si::lineal_force_unit>>(
1.0 *boost::units::si::newton / boost::units::si::meter);
//This convert lb/in to SI and return value is 175.1268369864 is correct.
const auto t5 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::si::lineal_force_unit>>(
1.0 * boost::units::us::pound_force_base_unit::unit_type() / boost::units::us::inch_base_unit::unit_type());
//This converts lb/in to lb/in and return value is of 1.0 is correct.
const auto t6 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::imperial::lineal_force_unit>>(
1.0 * boost::units::us::pound_force_base_unit::unit_type() / boost::units::us::inch_base_unit::unit_type());
//This is2.205 and not correct.Â
//Itâs notconverting SI-force/length to Imperial-force/length
//Itsconverting Kg (mass) to lb (mass), 2.205
const auto t7 = static_cast<boost::units::quantity<dimensional_analysis::lineal_force::imperial::lineal_force_unit>>(
1.0 * boost::units::si::newton /boost::units::si::meter);
//What have I done wrong?
//Any help is appreciated.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net