理化计算程序必备:CoolProp+UnitsNet

物理化学计算

   这类计算往往涉及到单位及单位换算,并且要用到物性参数。

  例如:0℃=273.15K  

             质量流量 kg/h = 体积流量 m3/h * 密度 kg/m3

             密度就是物性参数,随压力、温度变化。

常规做法

   只有 Frink 、F#、Modelica 少数语言变量是自带单位的,大部分语言变量仅包含数值,单位转换需要在变量进行公式计算之前(预处理)完成,计算后再把结果单位转换为输出单位,单位转换主要通过若干常数实现。

double p = 101325;//Pa
double a = 1;     //m2
double f = p * a; //N

    这带来了两个问题:1. 大量常数降低代码可读性和维护性;2.计算精度难以保障。

UnitsNet

    UnitsNet 用具有单位的变量替代double,支持单位的自动转换,并(部分)支持不同单位的乘除计算。

Pressure p = Pressure.FromPascals(101325);
Area a = Area.FromSqureMeters(1);
Force f = p * a;

    按照上述写法重写公式计算代码,可以避免直接的单位转换,使程序的调用者可以使用任意单位作为输入。

    UnitsNet 只支持部分单位的乘除计算,不支持的编译时会提示异常,EngineeringUnits放宽了该限制,计算结果均为UnknownUnit,可以将其转换为具体单位,转换错误会在运行时抛出。

物性数据库

    物性是物质的物理属性,典型的物性参数有密度、比热、粘度等,物性参数大部分是通过实验获得的,NIST美国标准院的 REFPROP 是权威的商用数据库软件。CodeProp 是开源C++免费版,有122种物质的物性数据,提供查询API。SharpFluids是CodeProp的C#封装,使用了EngineeringUnits。

    对于蒸汽,可以用IF97国际标准计算物性参数,我提交过一个C#版本的IF97计算库

应用实例

        // 蒸汽与管道内壁的对流换热系数 W/(m2·K).
        private static double getPipeThermalConductivity(Pipe pipe)
        {
            var Mu = pipe.Viscosity;
            var steamcond = pipe.ThermalConductivity;
            //普朗特准则数,无量纲,表示流体动量传输能力和热量传输能力的比.
            double Pr = Mu * pipe.Cp / steamcond;
            //雷诺数,无量纲,迪图斯-贝尔特(Dittus Boelter)公式.
            double Re = 4 * Math.Abs(pipe.MassFlow / Math.PI / pipe.Diameter / Mu);
            //努赛尔数,无量纲,反映对流传热在边界上的导热特征,其数值越大,则对流作用越强.
            double Nu = 0.023 * Math.Pow(Re, 0.8) * Math.Pow(Pr, 0.3);
            return Nu * steamcond.WattsPerMeterKelvin / pipe.Diameter.Meters;
        }

    算例中,Mu 单位:Pa.s=kg/(m.s)      

      steamcond 单位:W/(m.K)

                   Cp 单位:J/(kg.K)

                   Pr= Mu * Cp / steamcond; 单位消减后刚好无量纲。

性能问题

    EngineeringUnits 目前看性能存在瓶颈,不适合用作热点代码(如频繁调用的后台模块)中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值