@浪迹天大
你这个问题很有意思,从你的推导分析来看,SuSp 确实是削弱了对角占优。
但其中有一处错误:V30 应该为 V-30。不过这改变的是源项,而与对角元素无关。我们一起分析下是怎么回事。
如果将方程按照这种形式写:$\frac{\partial k}{\partial t}=-(-A)-(-B)$
那么代码可以写成:== -fvm::SuSp(-A/k, k) - fvm::SuSp(-B/k, k)。
实际计算时,假设 A=-30,B=50。
那么 $-A/k>0$,$-B/k<0$,fvm前面的负号与 == 抵消,代码实际执行的是
fvm.diag() += V*30
fvm.source() -= V*(-50)*k
这又的确增加了对角占优,显然 fvm::SuSp 不能随心所欲地用!
-fvm::SuSp(-A/k, k) 和 fvm::SuSp(A/k, k) 的结果不一样,而前一种写法才是我们想要的结果。
我翻了 OpenFOAM 的代码后发现,凡是在 == 右边使用的 Sp 和 SuSp 前面必有负号,凡是在 == 左边使用的 Sp 前面必为正号 (代码中基本没有出现 fvm::Su)。
看来 SuSp 是个深坑,用起来要非常小心才行。