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. 关于边界条件中operator=的疑问

关于边界条件中operator=的疑问

已定时 已固定 已锁定 已移动 OpenFOAM
9 帖子 3 发布者 9.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    CFDngu
    写于2016年10月27日 02:22 最后由 CFD中文网 编辑 2016年10月28日 10:33
    #1

    最近自己在学习写边界条件,被这个重载弄的有点凌乱。
    之前给边界整体位移是这么写的:
    Field<vector>::operator=(displacement); //这里的displacement是一个矢量
    给一个整体的矢量没有问题,计算效果还挺好。

    后来我又想给边界速度,由于用的是interfoam并且我准备将不同的网格给予不同的速度,因此我写了一个长度与边界网格数一样的vectorfield准备给每个网格一个速度矢量,可是在最后operator这里出现了问题,我一开始用的是
    Field<vector>::operator=(Uabsfinal);
    发散了,因此我觉得这么写是不对的。
    后来发现Field<vector>::operator==(Uabsfinal);也可以用,但是也发散了。

    我的问题是

    1. Field<vector>::operator=(Uabsfinal); 和Field<vector>::operator==(Uabsfinal);有什么区别
    2. 这个operator=是不是只能给边界一个整体的值?不可以给每个网格不同的值,如果想实现不同网格不同的值应该如何写?
    3. 如果我不指定作用域,即operator=(Uabsfinal); 也可以用,但是也不对,此时默认的作用域是什么呢。

    谢谢大牛们,不胜感激

    1 条回复 最后回复
  • C 离线
    C 离线
    CFD中文网
    写于2016年10月28日 02:43 最后由 编辑
    #2

    有关==和=的区别之前我也看过,但是没太深究。个人习惯是构造矩阵都用==,赋值都用=。目前还没遇到问题。Jasak说:

    operator== will FORCE assignment, even if patch field type says it should not be so. For example for a fixedValue patch, operator== will change its value and operator= will do nothing.

    意思是说在使用==要注意边界条件类型,因为他要强制重写,其大体等于=+correctBoundaryConditions()。

    回到你的问题,发散原因可能不在操作符上而在算法上。

    CFD中国标准用户测试帐号
    目前由徐笑笑登录

    C 1 条回复 最后回复 2016年10月28日 06:06
  • C 离线
    C 离线
    CFDngu
    在 2016年10月28日 06:06 中回复了 CFD中文网 最后由 编辑
    #3

    @cfd-china 谢谢,昨天我自己找到了发散的原因,确实在算法上面。
    但是现在关于==和=的问题我也确实没有理解。。。。。
    而且虽然现在计算可以进行,但是我也不知道我的vectorfield中的每一个速度矢量是不是对应的赋值到了每一个网格上,从log文件里面感觉好像没有成功:(

    1 条回复 最后回复
  • W 离线
    W 离线
    wwzhao 超神
    写于2016年10月28日 06:20 最后由 编辑
    #4

    边界条件不是派生 fvPatchField 吗,难道不应该用fvPatchField<Type>::operator==和fvPatchField<Type>::operator=?

    1 条回复 最后回复
  • C 离线
    C 离线
    CFDngu
    写于2016年10月28日 06:51 最后由 编辑
    #5

    你好,这个我也没有搞清楚。。
    但是目测这个作用域写fvPatchField是可以的,写我这个也可以的,不写也可以,好像没有区别。

    W 1 条回复 最后回复 2016年10月28日 07:07
  • W 离线
    W 离线
    wwzhao 超神
    在 2016年10月28日 07:07 中回复了 CFDngu 最后由 编辑
    #6

    @CFDngu fvPatchField 继承自 Field,建议赋值使用 fvPatchField<Type>::operator== 。

    • fvPatchField<Type>::operator=:fvPatchField<Type>::operator= 先做检查,确认两边指向同一个 fvPatch 再调用 Field<Type>::operator= 赋值,否则报错。
    • fvPatchField<Type>::operator==: fvPatchField<Type>::operator== 不做检查,调用 Field<Type>::operator= 强制赋值。
    C 1 条回复 最后回复 2016年10月28日 08:38
  • C 离线
    C 离线
    CFDngu
    在 2016年10月28日 08:38 中回复了 wwzhao 最后由 编辑
    #7

    @wwzhao 多谢大神,我找到代码看了一下,明白多了。
    但是对赋值的机制还是有些疑问。比如给边界一个整体速度和给边界每个网格不同的速度这种情况应该如何实现。

    W 1 条回复 最后回复 2016年10月28日 09:41
  • W 离线
    W 离线
    wwzhao 超神
    在 2016年10月28日 09:41 中回复了 CFDngu 最后由 编辑
    #8

    @CFDngu 回答一下你的第二和第三个问题。

    第二个问题:建议使用 fvPatchField<Type>::operator== ,而不是 Field<Type>::operator=。 fvPatchField<Type>::operator== 这个操作符被重载,有多个实现。

    557 template<class Type>
    558 void Foam::fvPatchField<Type>::operator==
    559 (
    560 const fvPatchField<Type>& ptf
    561 )
    562 {
    563 Field<Type>::operator=(ptf);
    564 }
    565
    566
    567 template<class Type>
    568 void Foam::fvPatchField<Type>::operator==
    569 (
    570 const Field<Type>& tf
    571 )
    572 {
    573 Field<Type>::operator=(tf);
    574 }
    575
    576
    577 template<class Type>
    578 void Foam::fvPatchField<Type>::operator==
    579 (
    580 const Type& t
    581 )
    582 {
    583 Field<Type>::operator=(t);
    584 }

    第三个实现的参数类型是const Type&,赋值后整个patchField都是相同的值。
    第二个实现的参数类型是const Field<Type>& tf,赋值后整个patchField的值可以不同。

    第三个问题:不指定作用域调用的operator=(Uabsfinal);默认是this->operator=(Uabsfinal);

    C 1 条回复 最后回复 2016年10月29日 14:50
  • C 离线
    C 离线
    CFDngu
    在 2016年10月29日 14:50 中回复了 wwzhao 最后由 编辑
    #9

    @wwzhao 多谢大神 不胜感激

    1 条回复 最后回复
2016年10月27日 02:22

7/9

2016年10月28日 08:38

未读 2
2016年10月29日 14:50
  • 登录

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