关于边界条件中operator=的疑问
-
最近自己在学习写边界条件,被这个重载弄的有点凌乱。
之前给边界整体位移是这么写的:
Field<vector>::operator=(displacement); //这里的displacement是一个矢量
给一个整体的矢量没有问题,计算效果还挺好。后来我又想给边界速度,由于用的是interfoam并且我准备将不同的网格给予不同的速度,因此我写了一个长度与边界网格数一样的vectorfield准备给每个网格一个速度矢量,可是在最后operator这里出现了问题,我一开始用的是
Field<vector>::operator=(Uabsfinal);
发散了,因此我觉得这么写是不对的。
后来发现Field<vector>::operator==(Uabsfinal);
也可以用,但是也发散了。我的问题是
Field<vector>::operator=(Uabsfinal); 和Field<vector>::operator==(Uabsfinal);
有什么区别- 这个
operator=
是不是只能给边界一个整体的值?不可以给每个网格不同的值,如果想实现不同网格不同的值应该如何写? - 如果我不指定作用域,即
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()
。回到你的问题,发散原因可能不在操作符上而在算法上。
-
@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=
强制赋值。
-
@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);