Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::units primer explained / conversion factors required
From: Michael Powell (mwpowellnm_at_[hidden])
Date: 2011-07-22 12:43:06


With this approach, we're getting a compilation error. Not sure what we're
doing wrong.

#include <boost/units/systems/si.hpp>
using namespace boost::units;
using boost::units::si::mass;
using boost::units::si::pressure;
using boost::units::si::length;
using boost::units::si::mass_density;
using boost::units::si::pascals;
using boost::units::si::meter;
using boost::units::si::kilograms_per_cubic_meter;

        typedef derived_dimension<length_base_dimension, 1,
time_base_dimension, -2>::type si_hsp_conversion_constant_factor;

        typedef unit<si_hsp_conversion_constant_factor, si::system>
si_hsp_conversion_constant_units;

            /* 1 bar = 100 kPa (kilopascal) = 10^5 Pa */
            quantity<si::pressure> p = 10e5 * pascals;
            quantity<si::length> l = 1.0 * meter;
            quantity<si::mass_density> d = 1.0 * kilograms_per_cubic_meter;

            quantity<si_hsp_conversion_constant_factor> result = (p / l) /
d;

Error 1 error C2440: 'initializing' : cannot convert from
'boost::units::quantity<Unit,Y>' to 'boost::units::quantity<Unit,Y>'
c:\Source\SafetyValve2011\CS.Calculations\calcs\hsp.cpp 100
CS.Calculations

On Thu, Jul 21, 2011 at 8:10 PM, Michael Powell <mwpowellnm_at_[hidden]>wrote:

> Hmm, let's see. I think it's more like this, (ML^-1T^-2 * L^-1) * ML^-3 *
> (ML^-1T^-2 * L^-1)^-1 = L^-1T^-2, Pressure Gradient divided by Fluid (or
> Mass) Density.
>
> I think I follow; doing my home work, one bar being a kilopascal (kPa), or
> (10e3 * NL^-2), or (10e3 * MLT^-2), so we have (10e3 * MLT^-2 * L^-1).
>
> Okay, then yes we divide by mass density of ML^-3, or multiply by
> (ML^-3)^-1 if you prefer.
>
> So we have (10e3 * MLT^-2 * L^-1) * (ML^-3)^-1.
>
> Hope my rusty dimensional analysis skills are showing... :-)
>
> Okay, so we can do some reductions I think, (10e3 * L^3 * T^-2). Am I
> reading this correctly? Is this the rate at which a volume transfers?
> Something along these lines. Really not up on my dimensional analysis like I
> should be; but I WILL be.
>
> However it reduced, please verify I am reducing correctly, I don't think
> the units are supposed to make sense; we're arriving at an intermediate
> conversion factor I believe. At least that's how it is explained to me.
>
>
> On Thu, Jul 21, 2011 at 5:23 PM, Noah Roberts <roberts.noah_at_[hidden]>wrote:
>
>> On 7/21/2011 3:16 PM, Michael Powell wrote:
>>
>>> Okay, here's what we need to get at, for starters. And maybe an
>>> illustration or three and a little exchange will go a long way towards
>>> helping my better comprehend units.
>>>
>>> I'm starting with a set of SI calculations for oil and gas constants
>>> calculations. Eventually we will need to accommodate US units as well.
>>> But not quite yet.
>>>
>>> We need to get at a calculation involving Pressure Gradient, which ends
>>> up being metric::bar/si::meter (bars over meters) in specific units, or
>>> I suppose si::pressure/si::length might also work.
>>>
>>> Then we need to get after Fluid Density, which ends up being
>>> si::kilogram/si:meter^3 (kilograms over cubic meters) in specific units,
>>> or I suppose si::mass/si::meter^3 (I don't know what this looks like in
>>> terms of boost::units, maybe one of the volumes?), or perhaps make use
>>> of mass_density?
>>>
>>
>> Yes, it's mass_density.
>>
>>
>>
>>> We take all that and divide Pressure Gradient by Fluid Density to arrive
>>> at what we hope will be the the conversion factor: 0.0000981. Which we
>>> could specify that as a constant, but I like proving it through the
>>> software first (plausibly once) when we ask for it.
>>>
>>
>> So, by your description:
>>
>> ML^-3 * (ML^-1T^-2 * L^-1)^-1 = L^-1T^-2.
>>
>> This latter part is the dimension your factor is in.
>>
>> using namespace boost::units;
>>
>> typedef derived_dimension<length_base_**dimension, -1,
>> time_base_dimension, -2>::type funky_factor_dimension
>>
>> typedef unit<funky_factor_dimension, si::system> funky_factor;
>>
>> quantity<funky_factor> factor(quantity<si::pressure> p,
>> quantity<si::length> l, quantity<si::mass_density> d)
>> {
>> return (p / l) / d;
>> }
>>
>> Alternatively:
>>
>> template < typename System >
>> quantity<unit<funky_factor_**dimension, System>>
>> factor( quantity<unit<pressure_**dimension,System>> p
>> , quantity<unit<length_**dimension,System>> l
>> , quantity<unit<mass_density_**dimension,System>> d )
>> {
>> return (p / l) / d;
>>
>> }
>>
>>
>>> Similar type calculations would follow for US units involving gallons,
>>> cubic inches, inches, and inches per foot, along these lines.
>>>
>>
>> As long as you use a coherent system, the template version above should
>> work (assuming I got all the types correct).
>>
>> ______________________________**_________________
>> Boost-users mailing list
>> Boost-users_at_[hidden]
>> http://lists.boost.org/**mailman/listinfo.cgi/boost-**users>
>>
>
>



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