C++

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

Step6:1次元移流方程式の離散化

以下の時間に対して$\frac{\partial }{\partial t}=\frac{u^{(n+1)_{i}}-u^{(n)_{i}}}{dt}$離散化を行うと、nステップ目の$u^{n}_{i}$に対してn+1ステップ目の$u^{n+1}_{i}$を求める式は以下のようになります。

以下の2つのファイルを作成します。

  • Solution1D.h
  • Solution1D.cpp

Solution1D.h

以下の変数を定義しています。

  • int nt; ステップ数
  • double dt; 時間刻み幅

Solution1D.cpp

Solution1d::Solution1d(int& nt_, double& dt_)では初期化を行っているだけです。

main.cpp

計算領域の端はノイマン条件(微分値が0)としています。

これでプログラムの主要部分は完成です。
以下の部分でステップ数を増やして計算しています。

以下の部分で波動関数$u$の形の初期化を行っています。

しかし、計算を実行させても結果を出力するプログラムを作成していません。
次に結果を出力する関数を作成します。
※【イメージ】
初期状態と最終状態をプロットすると以下のようになります。

※移流方程式は理論上は形を変えずに伝播する方程式ですが離散化したことにより拡散が起こり波の形が変わっています。この修正は難しいので今を行わずプログラムの完成までに注力します。

Step7:ファイル出力

以下の2つのファイルを用意します。

  • FileWriter.h
  • FileWriter.cpp

FileWriter.h

FileWriter.cpp

そしてmain.cppに初期状態と最終状態の波形の出力を行います。

main.cpp

【結果】
同じフォルダ内に以下の2つのファイルが作成されていれば成功です。

  • 1dLinearConvec.dat:初期状態
  • 1dLinearConvec_final.dat:最終状態

これらのデータを適当なソフトでグラフ化します。
今回は簡単にExcelで行うことにします。

  • オレンジ:初期状態
  • 薄青:最終状態(500ステップ目)
カマキリ

コードは完成です

あとは余計なコメントや出力などを消して完成とします。

1 2 3 4 5 6

COMMENT

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