Python

【第1回Python流体の数値計算】目標と環境構築。まずはここからはじめよう!

こんにちは(@t_kun_kamakiri)。

今日から、Python基礎講座で学んだ内容を使いながら応用編をやっていきます。

Pythonの基礎学習の記事はこちら

 

応用編では何をするかというと、

2次元のナビエストークス方程式の数値シミュレーションをPythonで実装する

👆これを目標にやります。

おそらく記事内容をシリーズ化して、12回程度に分けて記事を作成していきます。

基本的な内容はこちらのサイトにそってやっていきますが、英語に苦手意識がない人は本編のサイトで勉強するのが良いでしょう。

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

  • Pythonを使い始めたけどどう使うかわからない
  • 流体の数値計算をはじめて勉強する人

自分自身が、Pythonを勉強を始めて2年くらい経ちますが、ほとんどPythonを実用的に使う機会がなく(もちろん使いこなせることもなく)、また流体解析の実務経験もないので、素人レベルに近いです。

本編が英語ではあるものの、とても分かりやすかったので日本語に意訳しながら記事にまとめていけば自分の知識も付いてくるかと思ってまとめ始めています。

カマキリ

Pythonと流体の数値計算が同時に学べる良い機会になることでしょう(‘ω’)ノ

では、さっそくこの記事では何をするのかというと、

この記事の内容

  • 本シリーズの目標確認と環境構築の説明

 

12回にわたって記事にしていきますので、ひとつひとつ読んでいけばPythonを使って流体シミュレーションを体験できます(‘ω’)ノ

スポンサーリンク

このシリーズの最終目標は?

 

最終的には、以下のような2次元のナビエストークス方程式を使ってキャビティ流れの数値計算をすることを目標にします。

\begin{align*}
\frac{\partial \vec{v}}{\partial t}+(\vec{v}\cdot\nabla)\vec{v}=-\frac{1}{\rho}\nabla p + \nu \nabla^2\vec{v}\tag{1}
\end{align*}

を離散化して、

\begin{align*}
& \frac{u_{i,j}^{n+1}-u_{i,j}^{n}}{\Delta t}+u_{i,j}^{n}\frac{u_{i,j}^{n}-u_{i-1,j}^{n}}{\Delta x}+v_{i,j}^{n}\frac{u_{i,j}^{n}-u_{i,j-1}^{n}}{\Delta y} = \\
& \qquad -\frac{1}{\rho}\frac{p_{i+1,j}^{n}-p_{i-1,j}^{n}}{2\Delta x}+\nu\left(\frac{u_{i+1,j}^{n}-2u_{i,j}^{n}+u_{i-1,j}^{n}}{\Delta x^2}+\frac{u_{i,j+1}^{n}-2u_{i,j}^{n}+u_{i,j-1}^{n}}{\Delta y^2}\right)\\
&\frac{v_{i,j}^{n+1}-v_{i,j}^{n}}{\Delta t}+u_{i,j}^{n}\frac{v_{i,j}^{n}-v_{i-1,j}^{n}}{\Delta x}+v_{i,j}^{n}\frac{v_{i,j}^{n}-v_{i,j-1}^{n}}{\Delta y} = \\
& \qquad -\frac{1}{\rho}\frac{p_{i,j+1}^{n}-p_{i,j-1}^{n}}{2\Delta y}
+\nu\left(\frac{v_{i+1,j}^{n}-2v_{i,j}^{n}+v_{i-1,j}^{n}}{\Delta x^2}+\frac{v_{i,j+1}^{n}-2v_{i,j}^{n}+v_{i,j-1}^{n}}{\Delta y^2}\right)\tag{2}
\end{align*}

(2)式を解いて、Pythonのmatplotlibで描写すると以下のようになります。

本編はアニメーション作成までやっていないのですが、もちろんPythonのmatplotlibを使ってアニメーション作成だってできます。

(2)式を見ればわかるように、(1)式を単純に差分法で離散化しただけの式です。

ちょっと偏微分方程式の数値計算をかじったことがある人であれば、そこまで抵抗がない離散化手法だと思います。

Pythonの環境構築

 

Pythonを使用するための環境構築は様々ですが、以下の2つを推奨しています。
※この記事では、Google Colaboratoryを使って進めていきます。

【Pythonの使用環境について】

  1. Anaconda
  2. Google Colaboratory

当ブログはこれをメインに使った計算結果です。

 
Google ColaboratoryであればGoogleアカウントを持っている人は、Googleの拡張機能を使って簡単にPythonを使うことができます。
もしくは、Anacondaを使って進めても問題なく進むと思います。
 
関連記事

もちろん、その他の使用環境でも良いのですが、Pythonで標準に搭載されていないライブラリ(numpy, matplotlib)などがあるため、別途インストールする必要がありちょっと面倒です。

ですが、「Google Colaboratory」と「Anaconda」であればデフォルトでnumpy, matplotlibを使うことができるので環境構築でつまづくことはほぼないでしょう。

 

Pythonの完全初心者は書籍で学ぶとよい

 

Python自体が不安だという方は、こちらの書籍から勉強しても良いかも知れません。

☟こちらの本がPython初心者が挫折することなく勉強できる本です。
(本記事のようのPython使用環境と異なりますが、とてもわかりやすいので全く問題ありません)

確かな力が身につくPython「超」入門 (確かな力が身につく「超」入門シリーズ)

確かな力が身につくPython「超」入門 (確かな力が身につく「超」入門シリーズ)

鎌田 正浩
2,728円(09/28 16:12時点)
発売日: 2016/03/16
Amazonの情報を掲載しています
僕自身もこの書籍ではじめは勉強しました。
小難しい余計なことが書いていないし、年末の一週間くらいで読むことができたので、初心者の方にはとてもお勧めです。
 
 

まとめ

 

本記事では、Pythonを使って流体の数値計算をしていくための環境構築について説明しました。

Pythonはプログラミング初心者にはとっても取っつきやすい言語であり、ネットに多くの情報があります。
他の言語と比べると、だれが書いている記事であろうとそこそこ解読するのに苦労することがなく、とても読みやすいです。

自分自身が「どうやったら計算速度が速くなるのか」などの知見はあまり持っていないので、勉強しつつ調べながらわかったことを記事に追加していく方針です。

今回の記事作成のきっかけは以下です。

Pythonには自分のようなわりと初心者レベルでも高度な使い方ができるライブラリが多く存在しています。
しかし、実際「流体の数値計算を体験してみたいんだが・・・」となったときに、いちから丁寧に解説している書籍は多くありません。
数値計算だけに偏っていたり、プログラミングの重きを置いていたり・・・何より書籍だから有料だし(笑)
今回は、英語だけどせっかく無料で公開されているなら日本語に直してしまおうと考えての行動となります。
直訳というよりは、大まかな流れは本編に従いつつ、ちょっと深堀したいと思った部分も記事に追加して、理解を深めながら最終章まで駆け抜けたいと思っています。

 

ちなみに最終章まで行っても流体の数値計算はまだまだこれから

 

最終章まで読んだところで「流体の数値計算」のエキスパートになるのは程遠いでしょう。
なぜなら、実世界の流体現象のほとんどが乱流状態で、一般的には数値計算でしか理論的な予測は不可能です。
というのもナビエストークス方程式が一般解が見つかっておらず、何かしらの近似を使って予測することしかできないのが現状ですが、それが乱流状態となると手計算レベルではもうお手上げです。

昨今は、実用的な範囲では乱流をモデル化して解くことで流体現象の予測を行うことが多いでしょう。

なぜ乱流をモデル化する必要があるのかというと、乱流の構成要素である渦の動きを再現しようと思うと大小さまざまな渦を再現しうるだけの解像度を持って数値計算を行う必要があります。それはとてもつもない要素の数を扱うことになり現実的ではありません。

だから、乱流対して理論的にわかっている部分だけをモデル化して、できるだけ要素を削減して数値計算を行う必要があります。
乱流のモデル化のことを「乱流モデル」と呼ばれており、どのように乱流をモデル化するのかという選択をできる人が流体解析のエキスパートでしょう・・・・

昨今は、実用的な範囲では商用のソフトを使うことが多いでしょう。

  • どうやって離散化するのか?
  • 計算速度を速めるアルゴリズムは?
  • そもそもナビエストークス方程式で良いの?

などを考えて流体現象と向き合うことがとても大事になります。

つまり、本編の最後に示す「2次元ナビエストークス方程式」を空間に対して中心差分と時間に対して前進差分を行う手法だけが流体の全てではないという事です。

☟流体の計算精度や安定性に関しては、こちらの記事を参考に一読してみてください。

関連の記事はこちら

何か気づきがあるかもしれません(^^)/

 

では、環境構築ができたら次の記事に進みましょう。

次の記事はこちら

【プロフィール】

カマキリ
(^^)

大学の専攻は物性理論で、Fortranを使って数値計算をしていました。
CAEを用いた流体解析は興味がありOpenFOAMを使って勉強しています。

プロフィール記事はこちら

 

大学学部レベルの物理の解説をします 大学初学者で物理にお困りの方にわかりやすく解説します。

このブログでは主に大学以上の物理を勉強して記事にわかりやすくまとめていきます。

  • ・解析力学
  • ・流体力学
  • ・熱力学
  • ・量子統計
  • ・CAE解析(流体解析)
  • note
    noteで内容は主に「プログラミング言語」の勉強の進捗を日々書いています。また、「現在勉強中の内容」「日々思ったこと」も日記代わりに書き記しています。
  • youtube
    youtubeではオープンソースの流体解析、構造解析、1DCAEの操作方法などを動画にしています。
    (音声はありません_(._.)_)
  • Qiita
    Qiitaではプログラミング言語の基本的な内容をまとめています。