cudaで対流方程式を解いた

 やっとwslでcudaが動くようになったので、対流方程式を解いてみた。
 一番簡単な奴。下付き添え字は偏微分
 u_t = cu_x

 下らん離散化をすると爆死するので、一次精度風上で解く。今のところ位相速度のcは定数だけど、どーせそのうち流速にしないといけないので、正の値も負の値もとれるようにしておく。
 離散化のやり方としては、
 u^{n+1} = u^n - \Delta t / (2 \Delta x) \{c (u_{i+1} - u_{i-1} ) - |c| (u_{i+1} - 2 u_i + u_{i-1})\}
ってしておいた。
 上付きnは時間方向の離散化、下付きiは位置方向の離散化。

 Courant条件は適当に入れている。どうせ時間は相対的なものなので。
 計算さっさとしたいから20点だけメッシュ切ってみた。
f:id:S-ili:20210308005142p:plain

 めたくそに数値振動してるけど、とりあえず動いてるからよしとする。制限関数とか入れてないし。あとはCPUとの演算の速度を比べてみる。

 何が便利かというと、MPIでやってたときみたいにスレッド間の境界での値のやり取りとか考えなくてよいのが凄いよい。