数学とか語学とか楽しいよね

フランス語、ドイツ語、ロシア語、アラビア語、オランダ語、英語、スペイン語、ラテン語とか数学とか数値計算(有限要素法、有限体積法、差分法、格子ボルツマン法、数理最適化、C++コード付き)とか勉強したことをまとめます。右のカテゴリーから興味のある記事を探してください。最近はクラシックの名演も紹介しています。noteにも書いています。https://note.mu/kumag_min

【浅水流方程式】ダム崩壊問題の解析解全パターン!動画付き!

【浅水流方程式】サイトマップ(ここから関連記事が探せます)


前に作った、浅水流方程式におけるダム崩壊問題(dam break problem)の解析解を計算するコードを用いて、水深と流速がどうなるか動画にしていきたいと思います!こういうのは動画のほうがわかりやすいです。Toroの"Shock-Capturing Methods for Free-Surface Shallow Flows"が非常に参考になります。

Shock-Capturing Methods for Free-Surface Shallow Flows

Shock-Capturing Methods for Free-Surface Shallow Flows


ダム崩壊問題(dam break problem)には7パターンの解があります。すなわち、

1. 左側衝撃波、右側衝撃波
2. 左側膨張波、右側衝撃波
3. 左側衝撃波、右側膨張波
4. 左側膨張波、右側膨張波
5. 右側dry bed
6. 左側dry bed
7. dry bedが後から出現

です。さらに、これらはWet bedとDry bedに分けられます。1~4はWet bedで、5~7がDry bedです。Wet bedとは、水深が常に0より大きい場合のことを、Dry bedとは、水深が0になることがある場合のことを言います。

問題設定は「領域の真ん中  x=0 にダムがあり、時刻  t=0 に取り去られる」となっています。

わかりやすくなるように、以下では水深は青のグラフ、流速は赤のグラフで表示します。

Wet bed

1. 左側衝撃波、右側衝撃波

・初期条件
 h_l = 0.5 h_r = 0.5 u_l = 1.5 u_r = -1.5
・時間
 t = 1.2 まで
・結果
"hstar 0.882855
ustar 0
left shock with shock speed -1.95896
right shock with shock speed 1.95896"


f:id:mutsumunemitsutan:20190404215411g:plain:w400
水深

f:id:mutsumunemitsutan:20190404215453g:plain:w400
流速

2. 左側膨張波、右側衝撃波

・初期条件
 h_l = 1.0 h_r = 0.1 u_l = 0.0 u_r = 0.0
・時間
 t = 1.2 まで
・結果
"hstar 0.396175
ustar 2.32017
left rarefaction with head speed -3.1305 and tail speed 0.349762
right shock with shock speed 3.10355"


f:id:mutsumunemitsutan:20190404212248g:plain:w400
水深

f:id:mutsumunemitsutan:20190404212332g:plain:w400
流速

3. 左側衝撃波、右側膨張波

・初期条件
 h_l = 0.1 h_r = 1.0 u_l = 0.0 u_r = 0.0
・時間
 t = 1.2 まで
・結果
"hstar 0.396175
ustar -2.32017
left shock with shock speed -3.10355
right rarefaction with head speed 3.1305 and tail speed -0.349762"


f:id:mutsumunemitsutan:20190404213053g:plain:w400
水深

f:id:mutsumunemitsutan:20190404213148g:plain:w400
流速

4. 左側膨張波、右側膨張波

・初期条件
 h_l = 0.1 h_r = 0.1 u_l = -1.5 u_r = 1.5
・時間
 t = 1.2 まで
・結果
"hstar 0.00587508
ustar 0
left rarefaction with head speed -2.48995 and tail speed -0.239949
right rarefaction with head speed 2.48995 and tail speed 0.239949"


f:id:mutsumunemitsutan:20190404214548g:plain:w400
水深

f:id:mutsumunemitsutan:20190404214631g:plain:w400
流速

Dry bed

5. 右側dry bed

・初期条件
 h_l = 1.0 h_r = 0 u_l = 0 u_r = 0
・時間
 t = 0.8 まで
・結果
"left rarefaction dry bed with head speed -3.1305 and tail speed 6.26099"


f:id:mutsumunemitsutan:20190404182944g:plain:w400
水深

f:id:mutsumunemitsutan:20190404203523g:plain:w400
流速

6. 左側dry bed

・初期条件
 h_l = 0 h_r = 1.0 u_l = 0 u_r = 0
・時間
 t = 0.8 まで
・結果
"right rarefaction dry bed with head speed 3.1305 and tail speed -6.26099"


f:id:mutsumunemitsutan:20190404204942g:plain:w400
水深

f:id:mutsumunemitsutan:20190404205539g:plain:w400
流速

7. dry bedが後から出現

・初期条件
 h_l = 0.1 h_r = 0.1 u_l = -3.0 u_r = 3.0
・時間
 t = 0.8 まで
・結果
"generation of dry bed
left rarefaction dry bed with head speed -3.98995 and tail speed -1.0201
right rarefaction dry bed with head speed 3.98995 and tail speed 1.0201"


f:id:mutsumunemitsutan:20190404210605g:plain:w400
水深

f:id:mutsumunemitsutan:20190404211115g:plain:w400
流速

こちらもどうぞ


おまけ

使用したスクリプト

//left and right dry bed h//
set terminal gif animate delay 5 optimize size 640,480
set output 'h.gif'
do for [j = 0:79 ] {
   plot [-5.5:5.5][-0.05:1.05] sprintf("gnuplot_h_%d.txt", j) using 2:3 with lines lw 1.5 lc rgb "blue"
}
set out
set terminal wxt enhanced


//right dry bed u//
set terminal gif animate delay 5 optimize size 640,480
set output 'u.gif'
do for [j = 0:79 ] {
   plot [-5.5:5.5][-0.05:6.5] sprintf("gnuplot_u_%d.txt", j) using 2:3 with lines lw 1.5 lc rgb "red"
}
set out
set terminal wxt enhanced


//left dry bed u//
set terminal gif animate delay 5 optimize size 640,480
set output 'u.gif'
do for [j = 0:79 ] {
   plot [-5.5:5.5][-6.5:0.05] sprintf("gnuplot_u_%d.txt", j) using 2:3 with lines lw 1.5 lc rgb "red"
}
set out
set terminal wxt enhanced


//generation of dry bed h//
set terminal gif animate delay 5 optimize size 640,480
set output 'h.gif'
do for [j = 0:79 ] {
   plot [-5.5:5.5][-0.01:0.11] sprintf("gnuplot_h_%d.txt", j) using 2:3 with lines lw 1.5 lc rgb "blue"
}
set out
set terminal wxt enhanced


//generation of dry bed u//
set terminal gif animate delay 5 optimize size 640,480
set output 'u.gif'
do for [j = 0:79 ] {
   plot [-5.5:5.5][-3.2:3.2] sprintf("gnuplot_u_%d.txt", j) using 2:3 with lines lw 1.5 lc rgb "red"
}
set out
set terminal wxt enhanced