看不懂的算法 是否來自太空
別人寫的代碼 看著像密碼 🎶
── Booming Tech。擎空
事情是這樣的
  幾年前我買了一本
  Jos Stam的The Art of Fluid Animation中譯本
|  | 
| 隨書附上的 程式碼 | 
  陸陸續續讀了3遍
  有2個地方就是看不懂
  和書的內容對不上,分別是
|  | 
| GAMES201第4講 u還不是不可壓縮的向量場 ∇•u ≠ 0 ( 水量分布不平均 ) 公式(5) u* = u - (Δt/Ρ) ∇p ∇p的存在會讓u變成不可壓縮的向量場u* ∇•u* = 0 ( 水量分布平均 ) 由此 推導出(8) 泊松方程 由泊松方程可知,當∇•u = 0 就不會有壓力差 ( ∇•∇p = 0 ) 沒有壓力差,∇p就是0向量 可見∇•u ≠ 0是造成∇p的起因 因果關系如下 水量分布不平均 ➡️ ∇p不是0向量 ➡️ 水量分布平均 | 
|  | 
| GAMES201第4講 這是上面泊松方程的離散形式(有限差分) 解泊松方程可以得出壓力場p 再來就是解線性方程式,找出xA
        x = b (x就是p) | 
| Jos 在這裡做了一些優化 可以忽略Δt,因為那只是1個scale 當有一個線性方程組為A x = (1/Δt) b 忽略上式右邊的 (1/Δt)後,會有A x = b 得到的結果x 相當於預乘了Δt x = x Δt | 
解泊松方程迭代的過程中
會使用到已更新的鄰居值
乍看之下會懷疑是不是程式碼寫錯了?
  但它其實是在做 Gauss-Seidel迭代
就比較接近一般Programmer的想法了
diffuse函數在做什麼?
diffuse 和 viscosity 有關
關於擴散項,一開始我們有
  (ρ是流體密度,v = 黏滯系數/ρ)
   a = v▽·▽u  
假設
      u 是當前速度
    
    
      u' 是下一步的速度
    
    
      u'' 是下下一步的速度
    
    當前u + dt v▽·▽u
會得到下一步u'
u' = u + dt v▽·▽u
    下一步u' + dt v▽·▽u'
會得到下下一步u''
u'' = u' + dt v▽·▽u' 
          
                  反過來
u' - dt v▽·▽u' 就會得到u
                
                  u = u' - dt v▽·▽u' 
                
          移項後有
          
            u' - u = dt v▽·▽u' 
          
          
            Δu = dt v▽·▽u' 
          
          
            這樣就和Jos的程式碼對上了
          
    |  | 
| Δu = v▽·▽u' | 
|  | 
| 對映的程式碼 | 
結語
    此碼只應天上有? 🤠🤔 人間能得幾回聞 
  
  補充資料
NS方程的幾何意義
  |  | 
| From wiki ∇•v = 0代表流入 =流出 滿足∇•v = 0的流體就是不可壓縮流體 | 
|  | 
| NS方程超清解說 太極圖形课S1第10講:流體仿真 01 | 

沒有留言:
張貼留言