C++

【オブジェクト指向C++】2次元ナビエストークス方程式(キャビティ流れ)の数値計算

Step3:空間微分の離散化の定義

Diff1d.hに名前空間fdとして空間微分の定義を行います。

  • gradX:x方向1階微分後退差分$\frac{\partial u}{\partial x}=\frac{u_{i,j}-u_{i-1,j}}{dx}$
  • gradY:y方向1階微分後退差分$\frac{\partial u}{\partial y}=\frac{u_{i,j}-u_{i,j-1}}{dy}$
  • gradXCDS:x方向1階微分中心差分$\frac{\partial u}{\partial x}=\frac{u_{i+1,j}-u_{i-1,j}}{2dx}$
  • gradYCDS:y方向1階微分中心差分$\frac{\partial u}{\partial y}=\frac{u_{i,j+1}-u_{i,j-1}}{2dy}$
  • poissonX:x方向2階微分中心差分$\frac{\partial^2 u}{\partial x^2}=\frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{dx^2}$
  • poissonY:y方向2階微分中心差分$\frac{\partial^2 u}{\partial y^2}=\frac{u_{i,j+1}-2u_{i,j}+u_{i,j-1}}{dy^2}$

Diff1d.h

こちらの微分の離散化を使ってmain.cppでステップ数の分だけ計算をしてみましょう。

解く方程式は以下です。

\begin{align*}
\frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y} = \nu \left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2} \right) \tag{15}
\end{align*}

\begin{align*}
\frac{\partial v}{\partial t}+u\frac{\partial v}{\partial x}+v\frac{\partial v}{\partial y} = \nu \left(\frac{\partial^2 v}{\partial x^2}+\frac{\partial^2 v}{\partial y^2} \right) \tag{16}
\end{align*}

\begin{align*}
\frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2}=0 \tag{18}
\end{align*}

テスト計算なので流速ベクトル$\boldsymbol{u}$と圧力$p$は独立の式として解くようにしています。

main.cppでのステップ数のループは以下の部分です。

初期状態は以下としています。

今回はUだけを計算して結果を確認します。

main.cpp

結果を出力するためにFileWriter.hで

を定義しています。

FileWriter.h

FileWriter.cppに処理内容を書きます。
FileWriter::write1dFieldは1次元の計算結果を出力する際には必要でしたが今回は使いません。

FileWriter.cpp

結果をParaViewで確認してみましょう。

【結果】

1 2 3 4 5 6

COMMENT

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