关于tmp<volScalarField>&用法的疑问



  • 在编写涉及到muEff的后处理函数时发现,使用下面方法得到muEff时,可以编译,但是计算结果是错的,或者浮点数溢出

            const volScalarField& muEff = turbModel.muEff();
    

    而改成以下形式时,计算结果是正确的

            const tmp<volScalarField>& tmuEff = turbModel.muEff();
            const volScalarField& muEff = tmuEff();
    

    而对于其他变量,如T,U等,两种形式的写法没发现对计算结果有影响,请问tmp<volScalarField>&有什么意义吗?为什么有的变量要用这种写法?谢谢!


  • CORE 网格教授 OpenFOAM教授 管理员

    请问tmp<volScalarField>&有什么意义吗?为什么有的变量要用这种写法?谢谢!

    减少内存占用以及更快的运行速度。你完全可以不用tmp,用的时候需要注意tmp有可能会被清理。

    我有时也用tmp,但目前来看感觉不到什么好处,我只在2014年的时候对比过使用tmp和不适用tmp的内存占用,当然使用tmp内存占用更小。不过为了心理上增加速度减少内存,我会写很多tmp进去..

    话说回来,2014年后就没专门测试过了,你感兴趣可以试试并交流!


  • OpenFOAM教授

    tmp是智能指针,不应该用引用的方式返回。



  • @东岳
    那没用tmp时,有时出错可能是内存占完了?
    我是在functionobject里用,只是后处理时算一下,倒是不太在意速度,只求不要时不时出错。



  • @wwzhao关于tmp<volScalarField>&用法的疑问 中说:

    tmp是智能指针,不应该用引用的方式返回。

    请问是指这句

    const tmp<volScalarField>& tmuEff = turbModel.muEff();
    

    还是指这句

    const volScalarField& muEff = tmuEff();
    

    我是照着下面写的,把三句并成了两句

    const volVectorField& U = lookupObject<volVectorField>(fieldName_);
    const tmp<volTensorField> tgradU(fvc::grad(U));
    const volTensorField& gradU = tgradU();
    

  • CORE 网格教授 OpenFOAM教授 管理员

    那没用tmp时,有时出错可能是内存占完了?

    目前很少有这种情况,毕竟快2020年了。。。你的内存怎么说也得16G吧.. 内存泄漏更常见于你忘了清空,算3 5个小时发现内存全没了


  • OpenFOAM教授

    @izumi

    //const tmp<volScalarField> tmuEff = turbModel.muEff(); // 错误,智能指针不能以引用方式返回
    
    const tmp<volScalarField> tmuEff = turbModel.muEff(); // 正确
    
    // 获得被封装对象的引用
    const volScalarField& muEff = tmuEff(); // OpenFOAM 4 以前的用法
    //const volScalarField& muEff = tmuEff.ref(); // OpenFOAM 4 以后的用法