Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 关于tmp<volScalarField>&用法的疑问

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

已定时 已固定 已锁定 已移动 OpenFOAM
7 帖子 3 发布者 7.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • I 离线
    I 离线
    Izumi
    写于 最后由 编辑
    #1

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

            const volScalarField& muEff = turbModel.muEff();
    

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

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

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

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #2

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

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

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    I 1 条回复 最后回复
  • W 离线
    W 离线
    wwzhao 超神
    写于 最后由 编辑
    #3

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

    I 1 条回复 最后回复
  • I 离线
    I 离线
    Izumi
    在 中回复了 李东岳 最后由 编辑
    #4

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

    1 条回复 最后回复
  • I 离线
    I 离线
    Izumi
    在 中回复了 wwzhao 最后由 编辑
    #5

    @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();
    
    W 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #6

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • W 离线
    W 离线
    wwzhao 超神
    在 中回复了 Izumi 最后由 编辑
    #7

    @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 以后的用法
    
    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]