算子分裂(operator splitting algorithm). 考虑 不可压缩NS方程, 包含非线性对流项,粘性扩散项,压力梯度项。如果采用一个算子描述这三项,那么该算子会有非常多限制,不便计算。而考虑将这三项拆开,那么将得到三个基本方程(对流方程,波松方程,拉普拉斯方程),而且基本方程的数值算法可选项非常丰富。这就是算子分裂的意义。当然,拆分后的算子与原算子到底在多大程度上一致,也是该类算法的一个问题。


  1 经典算子分裂算法

  举例, 方程 du/dt = (A + B) u

  1.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)

  迭代格式:可以实现任意精度

 

  

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐