作者SplitField (FDTDsoul)
看板Physics
標題Re: [問題] 練習用FDTD算波動方程式
時間Tue Oct 19 20:37:46 2010
※ 引述《DevilsCrying (空的腦袋 Sora no Adama)》之銘言:
: Hi 各位
: 最近在練習用FDTD解波動方程式,邊界條件為Dirichlet B. C.
: 而初始條件為一個由左向右入射的 Gaussian Wave Packet
: 我碰到一些狀況,比方說,
: 1.波包移動時並不會維持其形狀
: 後來這個問題利用CFL Condition解決了,但是....
: 2.不知道Initial Condition怎麼設
: 用來疊代的式子是
: u(i,j)=((c*t/d)^2)*(u(i-1,j-1)+u(i-1,j+1)-2*u(i-1,j))+2*u(i-1,j)-u(i-2,j)
: i跟j分別代表時間跟空間的grid numbers,c是波速,
: t跟d則分別是時間跟空間的小切割
: 我的初始條件可以設成 u(0,j)=Gaussian Wave Packet G(x-a)
: 但是u(1,j)該怎麼設呢?
: 我一開始先設u(0,j)=0然後u(1,j)=G(x-a)
: 結果那個波包會先像分身術一樣跑出好幾個分身在一起維持形狀移動
: 後來設u(0,j)=G(x-a), u(1,j)=G(x-a-d)
: 就成功弄出一個形狀不變且向右移動的波包,而且碰到左右邊界會反彈
: 反彈也有相位差180度,自己非常滿意。
: 3.但是當我想考慮入射到不同介質時,卻不行了。
: 假設左半邊的波速c1而右半邊的波速c2
: 我想觀察波包部分反射部分穿透的現象,
: 首先,我的做法是配合CFL Condition讓左右兩邊的((c*t/d)^2)都等於1
: 有就是說 在t不變的情況下 改變d去配合c
: 但是顯而易見的 這樣對我的波的行為 沒有任何改變
: 再來,我假設t跟d都固定,單純讓兩邊有不同的c
: 結果波包會反射也有穿透,
: 但是反射跟穿透波都不再是Gaussian Wave Packet
: 當然反射波在左邊可以維持形狀傳遞
: 但是穿透波就無法維持形狀在右邊傳遞了
: 所以,關於上述3點,小弟想請教有經驗的人下列幾點
: 1.空間跟時間的小切割一定都要綁在一起,這樣合理嗎? 有其他方法可以解套嗎?
這會決定空間與時間差分的dispersion,這是Yee-grid的特性
你可以不要用Yee-grid,不過其他algorithm,也有其他的優缺點
: 2.一般前兩個時間點的波形要怎麼設? 我這樣設是唯一的方法嗎?
DBC的設法,是最初階的設法
toltal field scatter field (TFSF) 才是最完整的設法
空間跟時間兩組修正的一種方法,Allen Taflove說他洗澡的時候想到的 :D
另外,有些人不寫TFSF,就直接在邊界代PML,也是可以算,算穿透ok,
算反射的話,就是要在另外拿一組reference的來減
: 3.兩種介質的問題,到底要如何解決?
你推導的式子大概不是有epsilon的general form
所以想去改CF去等效有介質的模擬結果,是偷吃步的做法,我不確定會不會有bug
: 我這些問題應該跟用哪一種軟體寫程式應該無關吧 @@
程式設計問題,這樣問很難解決,找學長姊,一對一教學才有辦法,因為bug成因很多種
有可能是程式的bug,或是自己推導式子有問題,很花時間...
用Matlab一般比較不會有語法或是浮點數不足的問題
用Fortran或是C寫,很多數字的精確度需要用到多少,必須很清楚
以前曾遇過一個情況,類似1.12345678,我的精密度算到小數點第八位四捨五入
結果那樣的精密度算出來的完全爆掉,需要用到雙浮點精度才行
但Matlab不管算啥,都是自動用最高精度在計算,比較不會有這種錯誤
但相對的,計算效率就很差,如果你的程式動則要跑一兩天以上,最佳化就很重要
扯遠了.....=口="
簡而言之,建議找學長姐,不過通常學長姐討厭不自己debug的學弟
學妹的話再看看..... @.@a
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.205.180
推 nightkid:最後兩行感覺最重要XD 10/19 20:56
推 DevilsCrying:感謝你喔,我自學沒人帶 PS我是學弟QQ 10/21 16:40
推 DevilsCrying:想不到FDTD不是疊代疊代就結束了 10/21 16:52
→ DevilsCrying:我應該不是程式的bug,而是列式的問題 10/21 16:53