數(shù)值求解波動方程 [5]
二維 PML
????????在二維空間里有兩個空間軸?,? 那么 PML 變換也應該分別施加在這兩個軸上.? 對于二維 PML 變換應有
?和
.
????????對二維波動方程施加拉普拉斯變換得?.? 然后施加 PML 變換,? 為了簡便,? 記
,? 則得
.? 因為
?只與
?有關而與
?無關,? 所以有
,? 同理
也有類似的結論.? 那么上式左右同乘?
?得
.? 計算可得:??
,??
?和
,? 代入上式得:
????????引入新量?,? 使得
,? 上式右邊變?yōu)?
,? 并且由定義有
.? 把全部東西從 s 域變回時域即得到:
這就是二維的 PML 波動方程了.

????????在寫出離散化前,? 為了簡便先進行一下符號約定:? 記??為
,? 用這個記法可以很方便地描述與任意一個元素相鄰的其他元素,? 比如說
,? 還有
,? 根據(jù)這個記法可以有
,? 雖然在一定程度上會產(chǎn)生歧義,? 但是因為離散化后的式子只會有指定索引的元素,? 而沒有一整個場,? 所以將就著用吧.
????????使用上述記法,??并使用 以節(jié)省內(nèi)存,? 二維 PML 波動方程離散化為
其中??和
.
????????離散化后,? 出現(xiàn)了 10 個系數(shù),? 這些系數(shù)的重復度較高,? 所以可以先預計算一部分系數(shù),? 然后在 update! 里再計算其他系數(shù),? 這樣就可以在提升計算速度的同時不占用大量內(nèi)存.? 但是我內(nèi)存大,? 下面實現(xiàn)預計算全部 10?個系數(shù),? 以使計算效率最大化.

????????根據(jù)上面的式子, 二維 PML 波動方程實現(xiàn)為:

????????盡管看起來長得有點恐怖,? 但是邏輯是跟之前的一樣的?(用了很多 julia 特性化簡).? 模擬成品如下:


????????另外重寫了 WaveRecord 類和方法,? 現(xiàn)在產(chǎn)生的中間幀會儲存在硬盤上而不是直接放在內(nèi)存上,? 并且暴露里中間把場渲染成圖片的方法: `save_frame`.

上面的視頻使用以下代碼進行模擬:




三維波動方程 & PML 版本
????????因為受限于內(nèi)存以及計算速度等因素,? 三維波動方程就不打算進行實現(xiàn)了 (主要是懶),? 所以干脆在這里把三維的 PML 一起放出了.
????????三維波動方程為?.? 為三維的加上 PML 與二維的類似:
首先把波動方程從時域變?yōu)?s 域得 .
做 PML 變換得 ,? 其中
.
上式乘以??得?
.
計算可得:??以及
.
引入 4 個新量:?,? 即
.
把新量代入,? 再轉(zhuǎn)回時域得到??
,??
這就是三維 PML 波動方程了,? 雖然原理都是一樣的,? 但是這個真的太長了,? debug 十萬年,? 所以就原諒我不去實現(xiàn)了 (

有可能這就是數(shù)值模擬波動方程的最后一篇專欄了,? 雖然最關鍵的還有一個麥克斯韋方程組還沒搞,? 但是上面的標量三維 PML 波動方程都這么復雜了,? 更何況三維 PML 麥克斯韋方程組.