0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OUxSBLI】:CUDA FortranによるGPU加速圧縮性流体ソルバー

0
Posted at

はじめに

OUxSBLI はCUDA Fortranベースの圧縮性流体ソルバーです.なお,SBLIは衝撃波/境界層干渉(Shock/Boundary Layer Interaction:SBLI)です.OpenSBLI に着想を得て開発がスタートし,以下のような研究・学習ニーズを想定しています.

  • 圧縮性乱流(SBLI・Taylor-Green Vortesx:TGVなど)のDNS / LES を自前で回したい
  • 手間をかけてでもGPU向けに最適化されたコードを実装したい
  • PythonからCFDコードを呼び出したい
  • CFDコードを書きたい欲を満たしたい

OUxSBLIは直交格子上および曲線座標上で圧縮性 Euler / Navier-Stokes / LES 方程式を高次精度有限差分法で解くことができ,2026年6月22日時点でv0.0.2がリリースされています.

要素 内容
言語 CUDA Fortran(NVIDIA HPC SDK 24.x / 25.x)
並列化 MPI(GPU-aware 対応)
出力 VTK(.vtr, .vts)形式 → ParaView で可視化
ビルド CMake + fypp プリプロセッサ

ソルバーの種類

ソルバー 用途
3D_solver/ 3D 直交格子(DNS/LES)
2D_solver/ 2D 直交格子(動作確認・収束精度検証)
3D_solver_curv/ 3D 一般曲線座標格子(翼周り・圧縮コーナー)

主な特徴

対流スキーム

スキーム 特徴 適したケース
KEEP 運動エネルギーとエントロピーを離散的に保存.数値散逸なし 滑らかな渦流(亜音速TGV)
SLAU / HRSLAU2 低散逸 AUSM 系.衝撃波に強い SBLI,超音速TGV
Hybrid Ducros センサでKEEP↔SLAU を自動切替 衝撃波と乱流が共存する領域
Roe 古典的な近似リーマン解法 強い衝撃波

GPU 最適化:AoS+SoA ハイブリッドメモリレイアウト

保存変数は Q(nx, 5, ny, nz) — Array of Structures(AoS)と Structure of Arrays(SoA)を組み合わせたハイブリッドレイアウトを採用しています.これにより,フラックス計算カーネルでのメモリアクセスパターンを GPU のキャッシュ特性に合わせて最適化しています.

GPU 最適化:Shared Memory タイル化

対流カーネル・粘性カーネルでは,スレッドブロック単位での Shared Memory タイリング を実装しています.グローバルメモリへのアクセスをオンチップのShared Memoryにステージングすることで,メモリ帯域幅の消費を抑えています.粘性カーネルでは pipelineMemcpyAsync を用いた非同期パイプライン転送も試験的に導入されています.

Python API

ouxsbli パッケージを使うと,Python から config.fyppmod_globals.f90 を動的に書き換え,CMake ビルドからシミュレーション実行まで一括で行えます.スキームの比較研究などのパラメトリックスイープに便利です.将来的には機械学習モデルとの融合を見据えています.

クイックスタート

前提条件

  • NVIDIA HPC SDK 24.x または 25.x
  • CMake 3.18 以上
  • fypp(pip install fypp
  • NVIDIA GPU(Ampere 以降推奨)

CUDA Fortran から実行

# 1. リポジトリをクローン
git clone https://github.com/htymjun/OUxSBLI.git
cd OUxSBLI

# 2. fypp をインストール
pip install fypp

# 3. NS Taylor-Green 渦ケースをビルド
cd 3D_solver/NSTGV
cmake -B build && cmake --build build -j

# 4. 実行(2 MPI ランク)
cd build && mpirun -n 2 ./a.out

VTK ファイル(Q00000.vtr, Q00001.vtr, …)が data/ ディレクトリに出力されます.ParaView で時系列として読み込めます.

スキームや精度を変える

config.fypp を編集して再ビルドするだけです.

# 3D_solver/NSTGV/config.fypp
#:set VISC    = 'NS'      # 'Euler', 'NS', 'LES'
#:set SCHEME  = 'Hybrid'  # 'KEEP', 'SLAU', 'Roe', 'Hybrid'
#:set ORDER   = 6         # 2, 4, 6
#:set TVD     = 'hybrid'  # 'none', 'tvd', 'hybrid'
#:set BC_X    = False     # False → 周期境界

fypp が .f90.fypp テンプレートを展開し,設定に特化した Fortran コードを生成します.ランタイム分岐がなく,コンパイル時にスキームが確定するため,実行効率が高いです.

Python API から実行

from ouxsbli import Case

case = Case(
    source   = "3D_solver/NSTGV",
    workdir  = "/tmp/nstgv_run",
    visc     = "NS",
    scheme   = "SLAU",
    accuracy = 6,
    tvd      = "hybrid",
    nx = 128, ny = 128, nz = 128,
    Re = 1600.0,
)

case.build()
case.run(nranks=2)

Case クラスが config.fyppmod_globals.f90 を自動でパッチし,CMake ビルドと mpirun 実行をラップします.


バリデーション

超音速 Taylor-Green 渦(Re=1600, Ma=1.25)

Lusher & Sandham (2021, AIAA J.) の参照データと比較した結果,運動エネルギーとエンストロフィーの時間発展が良好に一致しています.

Ek.png
enstrophy.png

衝撃波境界層干渉(SBLI)

見栄えの良い可視化を示します.白色の等値面が衝撃波,カラフルな等値面が渦構造を表しています.
sbli.png


おわりに

OUxSBLIはCUDA Fortran による圧縮性流体シミュレーションコードとして,計算精度・GPU 性能・使いやすさのバランスを目指して開発を続けています.

詳細は公式ドキュメントおよび GitHub リポジトリをご参照ください.

Issue や PR も歓迎しています.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?