算子分裂算法介绍(Introduction to Operator Splitting algorithms)
算子分裂(operator splitting algorithm). 考虑 不可压缩NS方程, 包含非线性对流项,粘性扩散项,压力梯度项。如果采用一个算子描述这三项,那么该算子会有非常多限制,不便计算。而考虑将这三项拆开,那么将得到三个基本方程(对流方程,波松方程,拉普拉斯方程),而且基本方程的数值算法可选项非常丰富。这就是算子分裂的意义。当然,拆分后的算子与原算子到底在多大程度上一致,也是该类
算子分裂(operator splitting algorithm). 考虑 不可压缩NS方程, 包含非线性对流项,粘性扩散项,压力梯度项。如果采用一个算子描述这三项,那么该算子会有非常多限制,不便计算。而考虑将这三项拆开,那么将得到三个基本方程(对流方程,波松方程,拉普拉斯方程),而且基本方程的数值算法可选项非常丰富。这就是算子分裂的意义。当然,拆分后的算子与原算子到底在多大程度上一致,也是该类算法的一个问题。
1 经典算子分裂算法
举例, 方程 du/dt = (A + B) u1.1 Lie - Troter 分裂 -- 基于初始条件的分裂考虑
step 1 : solve dv/dt = A * v with I.V. v(t^n) = u(t^n)
step2: solve du/dt = B * w with I.V. u(t^n) = v(t^(n+1)), where v( t^(n+1)) coming from step 1
step3: update u(t^n) = u(t^(n+1)) and goto step 1
1.2 Strang-Marchuk 分裂
step 1: solve dv/dt = A * v with I.V. v(t^n) = u(t^n)
step 2: solve dw/dt = B * w with I.V. w(t^n) = v(t^(n+1/2)), coming from step 1
step 3: solve du/dt = A * u with I. V. u(t^(n+1/2)) = w(t^(n+1))
step 4 : update u(t^n) = u(t^(n+1))
1.3 Chorin's 投影法(very common, seen in mit-8086 nssolver.m
step 1 : explicit convection solver, u* - u^t = dt * A * u^t
step 2: implicit diffusion solver, u** - u* = dt * D * u**
step 3: Implicit Pressure Solver, laplace(p^(n+1)) = - rho/dt * div(u**)
step 4: Velocity Correction, u^(t+1) = u** - dt/rho * grad(p^(n+1))
2 ADI 格式的算子分裂
2.1 PR分裂
step 1 : (u^(n+1/2) - u^n) / (dt/2) = A u^(n+1/2) + B u^n
step 2: ( u^(n+1) - u^(n+1/2)) / (dt/2) = A u^(n+1/2) + B u^(n+1)
2.2 DR 分裂
step 1: ( u* - u^n) / dt = A u* + B u^n
step 2: (u^(n+1) - u*) / dt = A u* + B u^(n+1)
ADI 格式:首先,矩阵A, B都是三对角,计算方法很多,但ADI格式精度最高不超过2阶...
3 迭代格式的算子分裂 (构造不动点迭代)
step 1: du^n/dt = A u^n + B u^(n-1)
step 2: du^(n+1) / dt = A u^n + B u^(n+1)
迭代格式:可以实现任意精度
更多推荐
所有评论(0)