レイノルズ方程式をプログラミング

プログラム
Pocket

レイノルズ方程式をプログラミング

数値計算に関することを書いてきました。

Fortran 数値計算の基本、do文IF文の組み合わせ例も解説してます

中心差分法とは

Fortran サブルーチン

本当は流体力学の研究をしてるんです。
(数値計算と二刀流は大変

流体力学の中にレイノルズ方程式という有名な式があります。(大学の講義でもでてくると思う)
ひょっとしたらテストにも出てくるかも

そこで、レイノルズ方程式とそのサンプルプログラムを紹介したいと思います。

ナビエストークス方程式

レイノルズ方程式を説明する前に、ナビエストークス方程式という流体の式があります。

∂υ/∂t + (υ * ∇)*υ = -(1/ρ) * ∇p + ν∇²*υ + F

こんな式ですね。

この式を解くことが出来れば大体の流体現象が表せると云われてます。

レイノルズ方程式いらないじゃんと思いますがまあ色々あるんですよ(笑)

コンピュータの限界

ナビエストークス方程式は見ての通り複雑なんですよね。
今では、パソコンのメモリーは4G、8G等、Gオーダーが当たり前ですよね。

でも、20年くらい前だとメモリーはMオーダーだったんですよ。
それではナビエストークス方程式は解けない、そこで、ナビエストークスを核として式を簡単にする必要があったんです。

その一つがレイノルズ方程式なんです

追記

今ではナビエストークス方程式でシミュレーションするのが一般的です。

レイノルズ方程式

レイノルズ方程式を適応するには条件があります。

① 非圧縮性、層流、ニュートン流体、粘度一定。

② 粘性力が強く、慣性力は無視できる。

③ 薄膜である。

④ 壁面と流体はすべらない

です。

そうすると

d/dx((h³/η) * (dp/dx)) = 6U * dh/dx

になります。

高さhが、分かれば圧力を出せます。

この条件に当てはまるものとしては軸受の潤滑等があります。
(流体潤滑、混合潤滑、境界潤滑など等)

この分野ではまだレイノルズ方程式使われてますね。

次にレイノルズ方程式を中心差分します。

P(i)を求めたいので

h_x = (-h(i-1)+h(i+1))
p_x = (-p(i-1)+p(i+1))

p(i) = -1.5 * U * η * Δx / h(i)**3 * h_x
&           +3.0/8.0 / h(i) * h_x * p_x
&           + 0.5 * (p(i-1)+p(i+1))

こんな感じになります。

レイノルズ方程式を使った計算結果の例はこんな感じになりますね。

関連記事

1からプログラミングを覚えるなら独学じゃない方がいい理由

FORTRAN基本から中級レベルまでの記事を紹介 まとめ

6記事でGoogle AdSense合格しました、その時のブログの状態

地獄の研究室生活 大学4年生編

レイノルズ方程式の一般化とは

ADINA使い方、クエット流れ、シミュレーション

ADINA使い方、非定常シミュレーション編

最後にレイノルズ方程式のサンプルプログラムを紹介します。

プログラムコード

program raynol
IMPLICIT NONE

real p(0:100000)
real h(0:100000)
real x(0:1000)
real y(0:1000)
real p1(0:10000)
real avg(0:100000)
real  RES (-1000:1000000)
real U,eta,delx, h_x, p_x,total,initial pressure
character dum
integer i,m,n,i_min,i_max,n_max

c———————————————————————–
n_max = 1000
i_min = 0
i_max = 20
total=0
c———————————————————————–

OPEN (11,FILE=’./kusabi1.dat’,STATUS=’unknown’)
OPEN (12,FILE=’./kusabi3.dat’,STATUS=’unknown’)
read(11,*) dum,dum
read(12,*) dum,dum
do i = i_min , i_max
read(11,*) x(i), y(i)
read(12,*) h(i), p(i)
end do
close(11)
close(12)

OPEN (13,FILE=’./parameter1.txt’,STATUS=’unknown’)
OPEN (14,FILE=’./initial pressure.txt’,STATUS=’unknown’)
read(13,*) U
read(13,*) eta
read(14,*) initial pressure
close(13)
close(14)

c———————————————————————-

delx = abs( x(1) – x(0) )

do n =1,n_max,+1
do i = i_min+1, i_max-1

h_x = (-h(i-1)+h(i+1))
p_x = (-p(i-1)+p(i+1))

p1(i) = -1.5 * U * eta * delx / h(i)**3 * h_x
&           +3.0/8.0 / h(i) * h_x * p_x
&           + 0.5 * (p(i-1)+p(i+1))

end do

p1(i_min) = 0
p1(i_max) = 0

RES(n)=-1.0e10
do i = i_min , i_max
RES(n)=AMAX1( RES(n),abs(p(i)-p1(i)))
end do

IF(MOD(N,10).EQ.0) THEN
write(*,*) n, RES(n)
end if
do i = i_min , i_max
p(i)=p1(i)
end do

end do

OPEN (12,FILE=’./pressure.dat’,STATUS=’unknown’)
write(12,'(A)’) ‘   x                    p ‘
do i = i_min , i_max , +1
write(12,'(2(e16.8e3,x))’)x(i),p(i)
end do
CLOSE(12)

 

stop
end program