#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@gmail.com> 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@gmail.com> wrote:On 7/21/2011 3:16 PM, Michael Powell wrote:Yes, it's mass_density.

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?

So, by your description:

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.

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;As long as you use a coherent system, the template version above should work (assuming I got all the types correct).

}

Similar type calculations would follow for US units involving gallons,

cubic inches, inches, and inches per foot, along these lines.

_______________________________________________

Boost-users mailing list

Boost-users@lists.boost.org

http://lists.boost.org/mailman/listinfo.cgi/boost-users