本当は怖いHPC

HPC屋の趣味&実益ブログ

流体力学の勉強(2) :「流体の力学入門」読書メモ(1)

流体力学の勉強の続き.演習で学ぶ「流体の力学」入門 第2版 という本を勉強中.いろいろ飛ばして12章から.

この章では,流体の基礎方程式と,そのためのいくつかの概念の導入(物質微分,オイラーの方法,ラグランジュの方法など)がされています.

冒頭でラグランジュの方法とオイラーの方法が説明され,やや天下り的に実質微分(もしくは物質部分またはラグランジュ微分)が導入されていますが・・・

 \displaystyle
\alpha_x =  \frac{Du}{Dt} =  \frac{Du}{Dt}  + u \frac{\partial u}{\partial t}  + v \frac{\partial u}{\partial t}

初心者としては非常に混乱しました.「オイラーの方法では」と書かれていますが,この書き方が謎でした.なぜなら,直前で説明されている「オイラーの方法」とは「任意の時間において,空間のすべての点に対して流体粒子の持つ速度,圧力,密度,温度などの物理量を考え,流れの状態を観察する方法」と書かれているにもかかわらず,「空間上の点を固定して観察しているのに,なんでxとyで偏微分するのか?」という点が疑問でした.

ラグランジュ微分 - EMANの流体力学 を読んで,やっとこの意味がわかりました.

まず,単に「ラグランジュの方法」とか「オイラーの方法」といっても,「ラグランジュ/オイラー的な考え方」と,「ラグランジュ/オイラーの表記」の2つの意味があって,物質微分はいわば「ラグランジュ的考え方のオイラー表記」ということですね.

さらに,式自体の導出が省略されているので,練習がてら導出してみます.

ある物理量Aの物質微分を求める.x成分について本文 図12.1 の記号を使って,  \Delta t 後の位置と速度を考え,

 \displaystyle
A' = A(x_0 + v_x \Delta t, y_0 \Delta t, z_0 + v_z \Delta t)

1次までのテイラー展開して,

 \displaystyle
A' \approx \frac{\partial A}{\partial x} v_x \Delta t + \frac{\partial A}{\partial y} v_y \Delta t \frac{\partial A}{\partial z} v_z \Delta t + A(x_0, y_0, z_0)

よって,

 \displaystyle
A' - A = \frac{\partial A}{\partial x} v_x \Delta t + \frac{\partial A}{\partial y}v_y \Delta t + \frac{\partial A}{\partial z} v_z \Delta t

 

 \displaystyle
\frac{A' - A}{\Delta t} = \frac{\partial A}{\partial x} v_x + \frac{\partial A}{\partial y}v_y + \frac{\partial A}{\partial z} v_z

よって

 \displaystyle
\frac{D}{Dt} = \frac{\partial}{\partial t} + \nabla \cdot v

(この本,演習問題が充実していて難易度的にもちょうどよいのですが,全体的に天下り的な説明や目的のよくわからない概念の説明が多いので,周辺を自力で調べながら進む必要がありそう.

演習で学ぶ「流体の力学」入門 第2版

演習で学ぶ「流体の力学」入門 第2版

流体力学の勉強(1)

ゆえあって流体力学の勉強をしています. 大学では粒子法の分散プログラム作成の自動化などをやっていたりしたのですが,肝心のシミュレーションの具体的な中身についてはわからないままだという気がかりがずっとあったので,思い切って勉強することにしました.

目標は,

  • とりあえず基礎的な流体力学の数値シミュレーションを自分でかけるようになること
  • 最近出版されたデータ同化(Data Assimilation)の本の内容を(少なくとも)追えるようになること
  • 粒子法のアルゴリズムを理解できるようになること

です.

とりあえずは教科書として以下の2冊を利用しています.後日書きますが,理論面として購入した前者の教科書は全体的にわかりにくい気がしているので,また別の本を導入するかもしれません.

演習で学ぶ「流体の力学」入門 第2版

演習で学ぶ「流体の力学」入門 第2版

Pythonで学ぶ流体力学の数値計算法

Pythonで学ぶ流体力学の数値計算法

x86-64のCalling Convention

x86-64(AMD64)のCalling Conventionについてメモ.ネット上に資料はたくさんありますが,断片的だったり,一覧性が低かったり,互いに矛盾しているように見えたりしたので自分でまとめることにしました.

(と言っておきながら,Agner Fogさんの資料*1のp.10 Register Usage に全部書いてあったので,それを読めば良いと思います)

Calling Conventionとは

関数を呼び出すとき,機械語レベルでは,レジスタをどう使うかが重要になります.スタックは関数ごとに独立してメモリを利用できますが,レジスタは共有資源なので関数の呼び出し元(caller)と呼び出し先(callee)で協調して利用する必要があります.

ポイントとしては,

  • 引数をどうやって渡すか
  • 戻り値をどうやって返すか
  • それ以外のレジスタをどう使うか(レジスタがVolatileかどうか)

があります.

前述のようにレジスタは共有資源なので,利用方法について合意する必要があります.「Volatileかどうか」とは,その取り決めのことです. 以下の2通りのやり方があります(C言語の volatile とは関係ない).

  • Caller-save (= volatile or scratch) :callee が自由に使って良い(破壊して良い).よって,必要であればCallerが自分で内容を保存しておく責任がある
  • Callee-save (=non-volatile):callee側が使って良いが,callerから見て呼び出し前と呼び出し後で値が同じである必要がある.言い換えると,calleeが現状復帰する責任がある

呼び出し規約の種類

x86-64で用いられる呼び出し規約は大きく分けて2種類あります.

  • System V AMD64 ABI - 主に Solaris, Linux, FreeBSD, macOS で用いられる.
  • Microsoft x64 calling convention - Windowsで用いられる.(vectorcall というのもあるが,これはMS-x64の拡張)

呼び出し規約の詳細

MS-x86とSysVの共通事項

  • ある個数の引数まではレジスタで渡す,レジスタに載らない引数はスタックで渡す.スタックに詰む順番は右から左 (RTL)

System V AMD64 ABI

  • 関数呼び出し
    • 整数 or ポインタ RDI, RSI, RDX, RCX, R8, R9
    • 不動小数点 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 and XMM7
  • 戻り値
    • 整数64ビットまでRAX
    • 整数128ビットまでRAX & RDX
    • 不動小数点 XMM0 and XMM1
  • caller/callee-save
    • RBX, RSP, RBP, and R12–R15 : non-volatile (= callee save)
    • RAX, RCX, RDX, RSI, RDI, R8-R11 XMM0-XMM15, YMM0-YMM15, ZMM0-ZMM31: volatile (= caller save)
  • システムコールでは RCX の代わりに R10 を使用

Microsoft x64 calling convention

  • 関数呼び出
    • 整数 RCX, RDX, R8, R9
    • 不動小数点 XMM0, XMM1, XMM2, XMM3
  • 戻り値 = RAX or XMM0
  • caller/callee-save
    • RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15, XMM6, XMM7 : non-volatile (= callee save)
    • RAX, RCX, RDX, R8-R11, XMM0-XMM5, (YMM, ZMMレジスタ,ただしXMM6-XMM15の下位128ビット以外) volatile (=caller-save)

参考文献

  • Wikipedia X86 Calling Conventions*2
  • Calling conventions for different C++ compilers and operating systems *3
【広告】