河床変動の数値計算では、よく使用する岩垣による限界掃流力の式について不具合があったので若干修正しました。なんかこういうのって土木っぽい。。。
モチベーション
岩垣の式は実験式のため、図化すると関数の接続部で不連続になります。 普通に使う分には特に問題もないですが、収束計算等に使うとエラーが生じる場合があるので修正しておきます。
- 拡大図
岩垣の式の係数の修正
岩垣の式は次式のとおりである。
ここに、、である。(は無次元粒径かな?)
岩垣の式はshields図表の近似式となるが、shields図表のx軸:限界状態の粒子レイノルズ数?とy軸: 無次元限界掃流力を使って整理すると次のとおりになる。
ここに、 である。 また、となる。
元論文に詳しく書いてないですが、基本的には実験値を直線で近似したもので、上式の1,3,5番目は粒子レイノルズ数によらず一定、2,4番目は両対数軸上で1次関数で近似したものとなっている。
今回の課題である不連続部はの近似精度に依存すると仮定してこれらの見直しを行う。
参考として、2番目の式を展開する。
、として式変形すると以下となる。
として、両対数軸上で直線近似によりを計算する。
ここに、:近似直線の傾き、:切片である。
以上より得られた係数を列挙すると下表のとおりである。
元論文 | 修正値 | |
---|---|---|
0.008492171377400728 | 0.008502572284837527 | |
0.13636363636363635 | 0.13609748853308548 | |
0.19514831719540923 | 0.19535327890603318 | |
-0.21875 | -0.2189567763631981 |
冒頭と同様に図化すると以下のとおり不連続部が解消されている。大局的には何も変わらないが数値計算上はこちらを使うほうが良い。
- 拡大図
修正した岩垣の式のコード
pythonのコードは以下のとおり
オリジナル
def iwagaki_org(d, g=9.8, Gw=1.65, nu=0.000001): #d:diameter[m] t = Gw*g*d**3/nu**2 Rs = np.sqrt(t) R1, R2, R3, R4 = 671.0, 162.7, 54.2, 2.14 Y1, Y2, Y3 = 0.05, 0.034, 0.14 alpha1, beta1 = 0.008492171377400728, 0.13636363636363635 alpha2, beta2 = 0.19514831719540923, -0.21875 if Rs >= R1: taus = Y1 elif Rs >= R2: taus = alpha1*t**beta1 elif Rs >= R3: taus = Y2 elif Rs >= R4: taus = alpha2*t**beta2 else: taus = Y3 return taus, Rs*np.sqrt(taus)
修正版
def iwagaki_mod(d, g=9.8, Gw=1.65, nu=0.000001): def calcoef(R1, R2, Y1, Y2): X1, X2 = R1*np.sqrt(Y1), R2*np.sqrt(Y2) A = (np.log10(Y2) - np.log10(Y1))/ (np.log10(X2) - np.log10(X1)) B = np.log10(Y1)- A*np.log10(X1) beta = A/(2-A) alpha = 10**((1+beta)*B) return alpha, beta #d:diameter[m] t = Gw*g*d**3/nu**2 Rs = np.sqrt(t) R1, R2, R3, R4 = 671.0, 162.7, 54.2, 2.14 Y1, Y2, Y3 = 0.05, 0.034, 0.14 alpha1, beta1 = calcoef(R2,R1,Y2,Y1) alpha2, beta2 = calcoef(R4,R3,Y3,Y2) if Rs >= R1: taus = Y1 elif Rs >= R2: taus = alpha1*t**beta1 elif Rs >= R3: taus = Y2 elif Rs >= R4: taus = alpha2*t**beta2 else: taus = Y3 return taus, Rs*np.sqrt(taus)
参考:図化のコード
import numpy as np import holoviews as hv hv.extension('bokeh') dd = np.logspace(-5, -2, 10000) arr = np.array([iwagaki_org(d) for d in dd]) arr2 = np.array([iwagaki_mod(d) for d in dd]) fig = hv.Curve((arr[:,1],arr[:,0]), label='org').options(logx=True, logy=True, width=500, show_grid=True).redim.range(y=(0.03,0.3)) fig2 = hv.Curve((arr2[:,1],arr2[:,0]), label='mod').options(logx=True, logy=True, width=500, show_grid=True).redim.range(y=(0.03,0.3)) g = fig*fig2 out = hv.save(fig,'iwagaki_org.html') out = hv.save(g,'iwagaki_mod.html') del out
- グラフの作成はHoloviewsを使用
computational-sediment-hyd.hatenablog.jp
- はてブロへのhtmlグラフの埋め込みは以下を参照