C++

【オブジェクト指向C++】1次元非線形偏微分方程式の数値計算

こんにちは(@t_kun_kamakiri

本記事ではC++を使った1次元非線形偏微分方程式を題材にオブジェクト指向でのコーディングを解説します。
コードの解説は以下の記事に詳しく書いています。

本記事の内容

1次元の非線形方程式をC++で数値計算

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

カマキリ

C++の勉強中です

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

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

解く方程式

1次元の非線形偏微分方程式
\begin{align*}\frac{\partial u(x,t)}{\partial t}+u\frac{\partial u(x,t)}{\partial x}=0\tag{1}\end{align*}
以下のように離散化します。

コードは前回の記事のを利用します。
コードの解説は以下の記事に詳しく書いています。

プログラム保存先

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

コードの修正

main.cppの、

を以下に変更します。

&&はクラス同士の掛け算を意味しています。
Fields.cppで以下のように&&がクラス同士の掛け算を行えるように演算子のオーバーロードを定義しています。

全体のコード

前回の記事から変更したのはmain.cppだけです。

main.cpp

creatFields.hを作ってUの設定は別のヘッダーファイルで定義するようにしました。

creatFields.h

さらにプログラム作成途中でU[i].vauleの値を確認したい場合に出力するプログラムをヘッダーファイルに書きました。

main.cppで

によりインクルードしています。

PrintVector.h

main.cppで

の2行でよりでU[i].vauleの値を確認できます。

Mesh.h

Mesh.cpp

Fields.h

Fields.cpp

Diff1d.h

Solution1D.h

Solution1D.cpp

FileWriter.h

FileWriter.cpp

出力結果の確認

計算を実行し、計算が終了すると以下の2つのファイルができています。

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

今回はさくっと確認するためExcelで重ねてみました。

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

参考書

1週間でC++の基礎が学べる本

1週間でC++の基礎が学べる本

亀田 健司
2,574円(04/22 17:41時点)
発売日: 2021/03/12
Amazonの情報を掲載しています
独習C++ 新版

独習C++ 新版

高橋 航平
1,859円(04/22 17:41時点)
発売日: 2019/11/11
Amazonの情報を掲載しています

POSTED COMMENT

  1. yano より:

    この離散化ですとランキン・ユゴニオ条件を満たさないので衝撃波の波速が正しく計算できないと思います。

    • korokoro より:

      ご指摘ありがとうございます。
      おっしゃる通り今回はバーガース方程式をシンプルに後退差分で離散化しただけですので、不連続面で衝撃波をとらえられないです。
      時間を見つけてご指摘の通り、不連続面で解がずれる場合(今回)と、スキームを変えて改善した場合との紹介をしたいと思います。
      貴重なご意見ありがとうございます。

COMMENT

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