LU-SGS求解器
-
SGS有:
\begin{equation}
(L+D)x^{ * }=b-Ux^n , (U+D)x^{n+1}=b-Lx^{ * }
\end{equation}
给定一个初始$x^0$,可以依次推进。从你提供的LU-SGS公式来看,SGS实际求解的是:
\begin{equation}
(L+D)D^{-1}(D+U)\cdot x = b-LD^{-1}U\cdot x
\end{equation}
然后忽略掉$-LD^{-1}U\cdot x$,方程变成为:
\begin{equation}
(L+D)D^{-1}(D+U)\cdot x = b
\end{equation}
这个就是LU-SGS最后求解的系统,不存在一个迭代的过程?是一个非迭代的求解器?$-LD^{-1}U\cdot x$这一项忽略掉了是LU-SGS的一个假设,也就是说LU-SGS中认为在对角占优的情况下$-LD^{-1}U\cdot x$足够小。我测试了一下,确实相比原矩阵要小。然后我尝试计算了以下矩阵,结果看起来也还
凑合
?
上图为通过逆的方法直接求解
上图为LU-SGS非迭代求解咱们先从LU-SGS求解器开始,暂且不讨论效率和线性化,各个击破:sunglasses:
如果我的理解LU-SGS是一个非迭代的求解系统是正确的,问题是从我测试的那个矩阵求解来看,结果只能说是凑合。还是说我的理解有偏差? -
这涉及到非线性误差和线性代数求解器误差的相对关系。
迭代开始前的初始残差基本可以认为是非线性误差,一般线性求解器的收敛准则都设置为下降2个量级,也就是relTol 0.01,甚至有的是relTol 0.1。大部分情况LU-SGS应该是足够了的。
其实线性代数问题只要愿意迭代,总有收敛的时候,精度只受条件数和机器精度限制,和你采用什么数值方法没关系,只是收敛效率有所区别。但是非线性问题的精度和采用的格式、步长啥的关系都比较大了。
但是即使线性代数问题解到1e-16,下一个时间步或者非线性迭代步的初始误差又回去了,通常是1e-3左右,和CFL数一般呈正相关,所以线性代数问题解到1e-16没有意义,只要解到1e-5左右就好了,CFL数越大可以考虑继续减少线性问题的求解精度。
-
刚才看了一下一楼那个论文,从方程12,13来看应该确认了LU-SGS是一个非迭代的求解器。测试来看LU-SGS应该可以达到稳态外循环每一步收敛的要求(relTol 0.01或者0.1),但是瞬态的情况下,是需要收敛的。且在可压缩高速密度基求解器中,连外循环都没有。不过文章中说他也可以适用于瞬态算法,看起来LUSGS主要用于高速可压缩流。
另外,
rhoCentralFoam
中,以及一些文献中,高马赫数都要采取通量分裂处理,这个原因是什么?
在我的多相流算法中,也采用了通量分裂处理,不过我们那个的原因只是为了数值稳定,再详细的我就不在这说了有点跑题。可压缩流中不进行通量分裂会如何?我再仔细看看那个文章再继续讨论。
-
最近着手做matrix-free的LU-SGS实现,本质上是不需要matrix数据结构的。但同时也遇到多重网格如何与之协同工作的问题。目前还只是尝试阶段,希望顺利
-
@youmengtian
感觉MG和LUSGS好像不是一路的吧。不过LU-SGS当个smoother应该问题不大。 -
@youmengtian
明显Jacobian Free和matrix free不是一回事儿吧。JFNK虽然是Jacobian free,但是Krylov没有preconditioner不是很好使,加preconditioner又很难避免要存、算矩阵,至少算矩阵系数是免不了的,不过这个preconditioner反正是approximation,似乎不需要非常consistent。而且preconditioner整的不好就是并行的性能瓶颈。
-
@youmengtian
Jacobian free是不算Jacobian,JFNK的方法压根就没出现Jacobian,既不存,也不算;Matrix free主要是不存系数矩阵,至于这个矩阵是不是Jacobian无所谓的,但是一般多少都有点儿关系。Matrix free不代表不算矩阵元素,preconditioner免不了要算全部或者部分矩阵元素的,但是往往算完之后可以扔掉一些,不用都存下来。SGS就是一例,按照LU-SGS的搞法,就是Matrix free的,计算过程中用到了某些系数,就算一下,用完了就扔了,下次要用再算。 -
@youmengtian
没,网上有个那个Chun Shen的代码,AETK,我正在看。
https://github.com/chengdi123000/AETKv1 -