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,860円(12/09 13:56時点)
発売日: 2021/03/12
Amazonの情報を掲載しています
独習C++ 新版

独習C++ 新版

高橋 航平
3,346円(12/09 13:56時点)
発売日: 2019/11/11
Amazonの情報を掲載しています
江添亮のC++入門

江添亮のC++入門

江添 亮
5,500円(12/08 15:56時点)
Amazonの情報を掲載しています

【プロフィール】

カマキリ
(^^)

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

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

 

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

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

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

POSTED COMMENT

  1. yano より:

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

    • korokoro より:

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

COMMENT

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