C++

【オブジェクト指向C++】1次元移流方程式の数値計算

こんにちは(@t_kun_kamakiri

本記事ではC++を使った1次元移流方程式を題材にオブジェクト指向でのコーディングを解説します。

本記事の内容

1次元の移流方程式をC++で数値計算

1次元の移流方程式
\begin{align*}\frac{\partial u(x,t)}{\partial t}+c\frac{\partial u(x,t)}{\partial x}=0\tag{1}\end{align*}
数値計算にはC++を使います。

カマキリ

C++の勉強中です

C++は3か月前に勉強を始めたばかりなのでコーディングスタイルの良し悪しに関してはこれからもっと磨いていかないといけないと思っています。今回はアウトプットの場として勉強したことをメモとして残しておきます。

【環境】
Microsoft Visual C++ (Visual Stido 2022)

1次元の移流方程式とは何か

まずは1次元移流方程式の解説を行います。

1次元の移流方程式
\begin{align*}\frac{\partial T(x,t)}{\partial t}+u\frac{\partial T(x,t)}{\partial x}=0\tag{1}\end{align*}
※\(u\):一定速度
1次元の移流方程式は、下記の絵のように何かの物理量を形を変えずに一定速度\(u\)で運ぶ方程式を意味しています。
横軸は空間\(x\)ですが、縦軸は「密度」や「温度」だったり色々考えることができます。
本記事では、温度\(T\)として扱うことにします。
この移流方程式は、
\begin{align*}\frac{D }{D t}=\frac{\partial }{\partial t}+u\frac{\partial }{\partial x}\tag{2}\end{align*}
とすることで、物質微分を表していることがわかります。
つまり、流れ(流速\(u\))に沿ってどのように物理量が運ばれるかを表している偏微分方程式です。
(1)式を、
\begin{align*}\frac{D T(x,t)}{D t}=0\tag{3}\end{align*}
と表現することもできるので、「なるほど、温度分布が流れに沿って形を変えずに運ばれるのかー」っていうのが見えてくるわけです。
もっと実用的な偏微分方程式の中でこのような移流方程式が出てくるのは、流体の基礎方程式ですかね(‘ω’)
例えば、1次元移流方程式を密度の方程式と考えるならば、
\begin{align*}\frac{D \rho(x,t)}{D t}=0\end{align*}
となります。
これは、「流れに沿って密度が変化しない」・・・・つまり、流体の非圧縮性仮定というなります。

1次元の移流方程式の一般解

1次元の移流方程式は解析解が存在します。
解析解がどのような形になっているかを知っていることで、この後数値計算したときの結果の正しさを評価することができます。
1次元の移流方程式の一般解はとっても簡単です。

以下が(1)式の一般解となります。
もし、速度\(u\)が正なら
\begin{align*}T(x,t)=f(x-ut)\tag{4}\end{align*}
速度\(u\)で右へ進む解
もし、速度\(u\)が負なら
\begin{align*}T(x,t)=g(x+ut)\tag{5}\end{align*}
速度\(u\)で左へ進む解

今回は、速度\(u>0\)としているので(4)式の形が1次元の移流方程式の解であります。
カマキリ

本当かな?と思ったら(4)式を(1)式に代入してみよう

(4)式を(1)式に代入して左辺が0になることを確認してみます。
\begin{align*}\frac{\partial T}{\partial (x-ut)}(-u)+u\frac{\partial T}{\partial (x-ut)}=0\tag{6}\end{align*}
やっぱり0になりましたね(^^)/

 

1次元の移流方程式の差分法

1次元の移流方程式の厳密解がどのような振る舞いをするのかを理解しました。

以下の3パターンの空間微分の差分法の違いによって数値計算の結果の振る舞いが変わってくることを下記の記事で確認しました。

  • 前進差分で解く
  • 後退差分で解く
  • 中心差分で解く

全体のコード

Visual Stdioでプロジェクトを作成します。

まずは全体のコードを示しておきます。

プログラム保存先

https://github.com/kamakiri1225/1DNS

main.cpp

Mesh.h

Mesh.cpp

Fields.h

Fields.cpp

Diff1d.h

Diff1d.cpp

Solution1D.h

Solution1D.cpp

FileWriter.h

FileWriter.cpp

1 2 3 4 5 6

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です