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



  • 最近自己在学习写边界条件,被这个重载弄的有点凌乱。
    之前给边界整体位移是这么写的:
    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);也可以用,但是也不对,此时默认的作用域是什么呢。

    谢谢大牛们,不胜感激



  • 有关===的区别之前我也看过,但是没太深究。个人习惯是构造矩阵都用==,赋值都用=。目前还没遇到问题。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-china 谢谢,昨天我自己找到了发散的原因,确实在算法上面。
    但是现在关于==和=的问题我也确实没有理解。。。。。
    而且虽然现在计算可以进行,但是我也不知道我的vectorfield中的每一个速度矢量是不是对应的赋值到了每一个网格上,从log文件里面感觉好像没有成功:(


  • 版主

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



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


  • 版主

    @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= 强制赋值。


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


  • 版主

    @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);



  • @wwzhao 多谢大神 不胜感激


登录后回复
 

与 CFD 中国 的连接断开,我们正在尝试重连,请耐心等待