On Mon, Sep 19, 2011 at 12:10 PM, Michael Powell <mwpowellnm@gmail.com> wrote:
Boost::units users,

I am trying to perform a flow rate through an orifice calculation (Volume per Time or L^3T^-1) using the following dimensional analysis:

Q = Cf * A * sqrt( 2 * abs(P1-P2) )

On paper the dimensional analysis works out correctly. I know we should be receiving a L^3T^-1 consequent to the calculation.

If I just take this on one line, it seems to compile:

 __C_flow * __a_orifice * boost::units::sqrt(__two * __p_diff / __d);

Where __a_orifice is the area of the orifice, __p_diff is the pressure differential (absolute value), and __d is the mass density. __C_flow (coefficient of flow through orifice) and __two (2.0) are both dimensionless.

In terms of units quantities, these are all defined as quantity<si::area>, quantity<si::pressure>, quantity<si::mass_density>, and quantity<si::dimensionless>, to start with.

I think my flow-rate dimension and/or unit must be incorrect, but I am failing to see why in order to know what to do to correct the error.

 typedef boost::units::derived_dimension<boost::units::length_base_dimension,3
                                                           ,boost::units::time_base_dimension,-1>::type flow_rate_dimension;

 typedef boost::units::unit<cs::units::flow_rate_dimension,boost::units::si::system> flow_rate;

When I take:

si::flow_rate __fr = __C_flow * __a_orifice * boost::units::sqrt(__two * __p_diff / __d);

The only thing I can figure is that sqrt() is buggering things up. When I do this I get no compiler error:

 quantity<cs::units::si::flow_rate> __fr = __C_flow * __a_orifice * boost::units::sqrt(__two * __p_diff / __d);

However, when I do this, I do get a compiler error:

  quantity<cs::units::si::flow_rate, float> __fr = __C_flow * __a_orifice * boost::units::sqrt(__two * __p_diff / __d);

I haven't dug into sqrt() yet to verify its result, but it seems like this is taking some underlying type liberties? Could we do this, boost::units::sqrt<float>(...)?

I am receiving the following compiler error as my clue...

Error    1    error C2440: 'initializing' : cannot convert from 'boost::units::quantity<Unit,Y>' to 'boost::units::quantity<Unit,Y>'    c:\Source\Simulations\CS.Calculations.Managed\Calculators\Calculator.cpp    461    CS.Calculations.Managed

I'd like to set this up in as base a dimension as possible because later on we'll be introducing unit views, converting from base units to a view unit, or unit system, along these lines, but if we have to specify this in specific unit terms, so be it. We'll worry about unit conversions later on.

Best regards,

Michael Powell