
Boost Users : 
Subject: Re: [Boostusers] Flow rate dimensional analysis
From: Michael Powell (mwpowellnm_at_[hidden])
Date: 20110919 14:29:52
On Mon, Sep 19, 2011 at 12:10 PM, Michael Powell <mwpowellnm_at_[hidden]>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(P1P2) )
>
> 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 flowrate 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
>
Boostusers 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