作者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
1F:推 nightkid:最後两行感觉最重要XD 10/19 20:56
2F:推 DevilsCrying:感谢你喔,我自学没人带 PS我是学弟QQ 10/21 16:40
3F:推 DevilsCrying:想不到FDTD不是叠代叠代就结束了 10/21 16:52
4F:→ DevilsCrying:我应该不是程式的bug,而是列式的问题 10/21 16:53