最近在計算海嘯的例子發現在邊界上有明顯的反射…
這個試了n天,這應該是預設邊界條件的ramp(一個介於1~0間的值)所致…
ramp的目的是要由邊界推動模式時,可以在一個時間內慢慢的起動,免得一下推太用力爆掉,但是這個算例(海嘯)是由計算區域內往外傳,所以ramp反而把該往外傳的值變的比較小…導致出去的不乾淨,造成反射。下面是原始的code,在bcond 的subroutine中(idx=2)。
vaf(i,jm)=vabn(i) $ +rfn*sqrt(grav/h(i,jmm1)) $ *(el(i,jmm1)-eln(i)) vaf(i,jm)=ramp*vaf(i,jm)下述的code應該有一個邏輯上的錯誤,就是不應該全部的值乘上ramp,而是只有邊界往內傳的部份要乘上ramp。照上面的想法,只要不要啟動ramp(即ramp一直為1)就應該不會有反射(或至少要變的比較小),試跑之後,得到下面的結果:
果然邊界的反射沒有了…
按上面的敘述把code改成如下(共四個邊界,這舉一隅,餘類推):
vaf(i,jm)=ramp*vabn(i) $ +rfn*sqrt(grav/h(i,jmm1)) $ *(el(i,jmm1)-ramp*eln(i))這一行就不要了,看是刪掉還是註解掉。
c vaf(i,jm)=ramp*vaf(i,jm)
註:話說回來rfn 放的地方也怪怪的…印像中,他是rfe=0或1,第於1就沒什麼意思,有乘等於沒乘。等於0就讓vaf=0,就等於設了一道牆,既然設為牆了,vabn(i)應該也要乘才是。不過目前為止,我的例子的rfn都是1,就暫且不管了。不過還是把認為對的寫在下面,當成記錄,方便哪天用到時可以查。
vaf(i,jm)=ramp*vabn(i) $ +sqrt(grav/h(i,jmm1)) $ *(el(i,jmm1)-ramp*eln(i)) vaf(i,jm)=rfn*vabn(i)
沒有留言:
張貼留言