Loading [MathJax]/jax/output/CommonHTML/jax.js
Python

【第17回Python流体の数値計算】2次元ナビエストークス方程式!ポアズイユ流れをPythonで実装する。

こんにちは(@t_kun_kamakiri)。

前回の記事では、「2次元のナビエストークス方程式」をGoogle Colab上のPythonで実装しました。

今回も、2次元のナビエストークス方程式をPythonで実装します。

今回の解析内容は以下のような「ポアズイユ流れ」と呼ばれる流れです。

式の詳細と数値計算の解き方については記事内で詳しく解説したいと思います(^^)/
カマキリ

流体解析は楽しいです(^^)/

本件の基本的な内容はこちらのサイトにそってやっていきます。

この記事ではこんな人を対象にしています。

こんな人が対象
  • Pythonを使い始めたけどどう使うかわからない
  • 流体の数値計算をはじめて勉強する人
本記事シリーズの最終目標は、ナビエストークス方程式をPythonで実装することですが、いきなりナビエストークス方程式を実装するのは難しいので各項の意味を確認しながら進めていきたいと思います。
今回の内容はこちら

2次元のナビエストークス方程式の数値計算をPythonで実装
※ポアズイユ流れ

カマキリ

今日もゆる~く学びます(^^)/

解くべき方程式の確認(ナビエストークス方程式とポアソン方程式)

まずは、今回「解くべき方程式」「変数」が何かを確認しておきましょう。

非圧縮性流体として現象を取り扱う場合には、基本的には以下の2つの式を連立して解きます。
ナビエストークス方程式
vt+(v)v=1ρp+ν2v+F

※ナビエストークス方程式は成分の数の式があります。
F:外力(定ベクトル)

連続の式(非圧縮条件)
v=0
実際の流れは、すべての現象が(1)(2)式というわけではないで。
「ニュートン流体」「非圧縮の流れ(近似)」としているとても限定的な流れであることを理解しておきましょう。
もっと詳しく勉強したい方は☟こちらの記事を参考にしてください。
今回は、2次元で計算を行うため少々くどいですが、成分ごとの式を書き下すことにします。
【2次元での計算】
ナビエストークス方程式
ut+uux+vuy=1ρpx+ν(2ux2+2uy2)+F
vt+uvx+vvy=1ρpy+ν(2vx2+2vy2)
連続の式(非圧縮条件)
ux+vy=0
  • ナビエストークスからは2本の式
  • 連続の式から1つの式
が出てくるので、合計で3本の式があります。

 

未知数は、vの2つと圧力pの合計3つです。
なので、原理的に未知数である物理量は全て求まることになります。
それを各時刻で求めていけば良いという事になります。

 

しかし、言葉で簡単に言っても、特殊な境界条件や近似を用いないとナビエストークス方程式は解析的に取り扱うことができないのです。
つまり、ナビエストークス方程式には一般解が見つかっていないので、実際には数値計算を使って偏微分方程式を取り扱うしかないのが現状です。
しかし、連立方程式を解けばいいと言われてもちょっと困った・・・
なぜなら、(3)(4)式で求めた流速は(5)式を満たす必要があります。
そのように流速を選びながら圧力を同時に決めなければなりません。
考えただけでもちょっと工夫が必要ですよね。。
そこで、以下のようにして考えを改めます。
圧力に関しては非圧縮条件を満たすようにポアソン方程式を解きつつ、求めた圧力に関してナビエストークス方程式を解き流速を求めるという手法をとります。
言葉で説明してもよくわからないかもしれないので、実際にやります(^^)/
(3)式をyで偏微分
xut+uxux+u2ux2+vxuy+v2uxy=1ρ2px2+νx(2ux2+2uy2)
(4)式をxで偏微分
yvt+uyvx+u2vyx+vyvy+v2vxy2=1ρ2py2+νy(2ux2+2uy2)
このようにして辺々足して、非圧縮条件を使えば、
2px2+2py2=ρ(uxux+2uyvx+vyvy)
計算はだるいですが、一度やってみてください。
つまり、(3)(4)(5)を解く代わりに以下の式を解けばよいという事になります。
【2次元での計算】※実際に解く方程式
ナビエストークス方程式

ut+uux+vuy=1ρpx+ν(2ux2+2uy2)+F

vt+uvx+vvy=1ρpy+ν(2vx2+2vy2)
ポアソン方程式※連続の式(非圧縮条件)
2px2+2py2=b(x,y)
右辺をb(x,y)とおいて以下のようにまとめました。
b(x,y)=ρ(uxux+2uyvx+vyvy)

 

速度にいては、ナビエストークス方程式を解きつつ、圧力に対してポアソン方程式を連立させながら解くという事になります。
ポアソン方程式の解き方については、以下の記事で解説していますのでまだ読んでいない方はお読みください_(._.)_
では、解くべき方程式がわかったところで、(3)(4)(8.1)(8.2)を離散化して数値計算ができる状態にします。

解くべき方程式の離散化

【2次元での計算】※実際に解く方程式
ナビエストークス方程式
un+1i,juni,jΔt+uni,juni,juni1,jΔx+vni,juni,juni,j1Δy=1ρpn+1i+1,jpn+1i1,j2Δx+ν(uni+1,j2uni,j+uni1,jΔx2+uni,j+12uni,j+uni,j1Δy2+Fi,j)
vn+1i,jvni,jΔt+uni,jvni,jvni1,jΔx+vni,jvni,jvni,j1Δy=1ρpn+1i,j+1pn+1i,j12Δy+ν(vni+1,j2vni,j+vni1,jΔx2+vni,j+12vni,j+vni,j1Δy2)
ポアソン方程式※連続の式(非圧縮条件)
pn+1i+1,j2pn+1i,j+pni1,jΔx2+pn+1i,j+12pn+1i,j+pn+1i,j1Δy2=bni,j
bni,j=ρ[1Δt(uni+1,juni1,j2Δx+vni,j+1vni,j12Δy)uni+1,juni1,j2Δxuni+1,juni1,j2Δx2uni,j+1uni,j12Δyvni+1,jvni1,j2Δxvni,j+1vni,j12Δyvni,j+1vni,j12Δy]

 

どういった離散化をしているのかを以下でまとめておきました。
※絵の中で外力であるFi,jは省略しています。

これで離散化は完了ですが、知りたいのはn+1ステップでの格子点i,jの流速un+1ijvn+1ij、圧力pn+1ijですので、

以下のように式変形します。
【2次元での計算】※実際に解く方程式
ナビエストークス方程式
un+1i,j=uni,juni,jΔtΔx(uni,juni1,j)vni,jΔtΔy(uni,juni,j1)Δtρ2Δx(pni+1,jpni1,j)+ν(ΔtΔx2(uni+1,j2uni,j+uni1,j)+ΔtΔy2(uni,j+12uni,j+uni,j1))+Fi,j
vn+1i,j=vni,juni,jΔtΔx(vni,jvni1,j)vni,jΔtΔy(vni,jvni,j1))Δtρ2Δy(pn+1i,j+1pn+1i,j1)+ν(ΔtΔx2(vni+1,j2vni,j+vni1,j)+ΔtΔy2(vni,j+12vni,j+vni,j1))
ポアソン方程式※連続の式(非圧縮条件)
pn+1i,j=(pn+1i+1,j+pn+1i1,j)Δy2+(pn+1i,j+1+pn+1i,j1)Δx2bni,jΔx2Δy22(Δx2+Δy2)
bni,j=ρ[1Δt(uni+1,juni1,j2Δx+vni,j+1vni,j12Δy)uni+1,juni1,j2Δxuni+1,juni1,j2Δx2uni,j+1uni,j12Δyvni+1,jvni1,j2Δxvni,j+1vni,j12Δyvni,j+1vni,j12Δy]
では、これらを数値計算で解いていきましょう。

初期状態と境界条件を設定

数値計算をはじめるまえに、初期状態と境界条件を設定する必要があります。

【初期状態】
  • u,v,p=0

 

【境界条件】
  • u,v,p at x=0,2で周期境界条件
  • u,v=0  at y=0,2
  • py=0 at y=0,2;
  • F=1  everywhere

言葉だけではよくわからないかと思いますので、絵を作成しました。

関連記事もどうぞ

POSTED COMMENT

  1. kk より:

    大変勉強になる記事でありがとうございます。一つ質問があります。
    圧力のポアソン方程式のX=2の境界部分についてです。

    # Periodic BC Pressure @ x = 2
    p[1:-1, -1] = (((pn[1:-1, 0] + pn[1:-1, -2])* dy**2 +
    (pn[2:, -1] + pn[0:-2, -1]) * dx**2) /
    (2 * (dx**2 + dy**2)) –
    dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, -1])

    例えばx=2の場合の式ならば、X=2付近でないpn[1:-1, 0](X=0)や、pn[2:, -1](これは2: で、Y=0と認識しています)の点が出てくるのは、どいうイメージを持てばよいでしょうか?X=0(入口)と出口(X=2)が循環しているように思いますが、これで正しいイメージなのでしょうか…?

    境界における圧力のイメージについて教えていただければと思います。何卒お願い致します。
    なおX=0でも同様に、X=0の項が登場しており、これも同じ意味かと思うのですが、同じく教えていただければありがたいです。

  2. kk より:

    すいません、最後の文章間違いでした。以下で正します。

    なおX=0でも同様に、X=2の項が登場しており、これも同じ意味かと思うのですが、同じく教えていただければありがたいです。

    • kamakiri より:

      お読みいただきありがとうございます。
      こちらは周期境界条件ですので、循環しているというイメージであっています。
      左端と右端は同じ値になるようにしているためそのようにしています。
      書いたのが数年前なのでうろ覚えで申し訳ないです。

      ちなみにPythonのスライスは少しわかりにいくいので念のため書いておきますと、
      import numpy as np
      test_array = np.array([0,1,2,3,4,5])
      test_array[0:-1]
      の結果はarray([0, 1, 2, 3, 4])となるように、:-1は最後より手間までを出力するという意味になります。
      test_array[-1]とすれば要素の最後の値である5が出力されます。

      基本的にはこちらのサイト(https://github.com/barbagroup/CFDPython/blob/master/lessons/15_Step_12.ipynb)にならって日本語訳と個人的な解釈も交えて書いています。
      もう少し良い書き方があるかもしれませんが、ご質問内容に関しては「周期境界条件」というところを意識して読んでいただければと思います。
      よろしくお願いいたします。

COMMENT

目次へ