Skip to content

Instantly share code, notes, and snippets.

@DiaSird
Last active June 7, 2023 14:16
Show Gist options
  • Save DiaSird/9f0779e4f2bffbcae94470080193b722 to your computer and use it in GitHub Desktop.
Save DiaSird/9f0779e4f2bffbcae94470080193b722 to your computer and use it in GitHub Desktop.

Sammary of Curvature

Contents


Calculation flow of curvature tensors

  1. Define metric $g_{\mu\nu}$.
  2. Work out Cristoffel symbol $\Gamma_{\alpha\beta}^\mu$.
  3. Calculate Riemmanian curvature tensor $R_{\alpha\beta\gamma}^\mu$.
  4. Assess Ricci curvature tensor $Ric_{\mu\nu}$.
  5. Work out Scalar curvature (or Ricci curvature) $R$.

Theory

  1. Define (covariant) metric $g_{\mu\nu}$ (for generalized coordibnates $q^i$):

$ds^2 \Coloneq g_{\mu\nu} dq^\mu dq^\nu$,

and the contravariant metric $g^{\mu\nu}$ can be written as

$[g]^{\mu\nu} = [g]_{\mu\nu}^{-1}$.

  1. Work out Cristoffel symbol $\Gamma_{\alpha\beta}^\mu$:

$\Gamma_{\alpha\beta}^\mu \Coloneq \frac{1}{2} g^{\mu\nu} (\frac{\partial g_{\mu\nu}}{\partial q^\alpha} + \frac{\partial g_{\lambda\alpha}}{\partial q^\beta} - \frac{\partial g_{\alpha\beta}}{\partial q^\lambda})$, where this symbol $\Gamma_{\alpha\beta}^\mu$ is symmetric as below: $\Gamma_{\alpha\beta}^\mu = \Gamma_{\beta\alpha}^\mu$.

  1. Calculate Riemmanian curvature tensor $R_{\alpha\beta\gamma}^\mu$:

Riemmanian curvature tensor is defined as $R_{jkl}^i \Coloneq \partial_k \Gamma_{jl}^i - \partial_l \Gamma_{jk}^i + \Gamma_{jl}^m\Gamma_{mk}^i - \Gamma_{jk}^m\Gamma_{ml}^i$.

  1. Assess Ricci curvature tensor $Ric_{\mu\nu}$:

$Ric_{\mu\nu} \Coloneq R_{ikj}^k$.

  1. Work out Scalar curvature (or Ricci curvature) $R$:

$R \Coloneq g^{ij} Ric_{ij}$.

Examples

Ricci flow

$\frac{\partial g_{ij}}{\partial t} = - 2Ric_{ij}$,

and the equation has a scale invariance.

References

Docs

  • 高階トレイト境界(A higher-ranked trait bound)
let subtype: &(for<'a> fn(&'a i32) -> &'a i32) = &((|x| x) as fn(&_) -> &_);

データ構造

配列と構造体は似ている。 連続したメモリアドレスに要素を並べていく。

(違い)

  • 配列 同じ型(つまり同サイズ)の型の要素を「隙間なく」敷き詰める。

  • 構造体 別々の型も行ける。その場合、パディングというメモリアドレスをサイズの倍数になるように調整する。

Q. ではこの調整(アライメント、alignment)とは何か?

x86_64アーキテクチャ上でC言語を使った際に、 次のような想定を考える。

struct foo1 {
    char *p;     /* 8 bytes */
    char c;      /* 1 byte
    char pad[7]; /* 7 bytes */
    long x;      /* 8 bytes */
};

padというのはプログラマーが書かなくても コンパイラが自動で差し込むメモリの空白。 これをパディング(padding)という。

そして次の構造体のメンバの倍数になるようにパディングを挟んでいる。

Ex.) 上の例だとcharは1byteで次のlongは8byte。 つまり次のメモリアドレスは8の倍数になってなければならない。

Q. ではなぜpaddingを設けるのか? A. C言語の仕様でそう決められている。

Q. なぜ決められている? A. CPUが命令をDRAMから簡単に持ってきて高速化を図りたいため。

  • 各CPUの仕様で、まずこの制限がかけられている。
  • CPUレベルで見ると、アセンブリ言語の最適化時に浮動小数点やベクトル演算用のレジスタ (128bitのXMM、256bitのYMMレジスタなど)をたくさんも用いる。
  • CPUは一次記憶装置であるDRAMからCPU内部に命令をfetchする(持ってくる)必要がある。
  • この時持ってくるアドレスの倍数がめちゃくちゃだった場合、 複数回に分けて持ってこないといけないというのが生じる。 スタックのアドレスが16の倍数を要求するのはこれが理由。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment