PCG64 による counter-based 乱数。実行順序・rank・thread に依存せず、(seed, counter, draw) だけで値が決まる。
counter(粒子 slot、境界 event など任意長の整数組)と seed から Murmur3 で 128 bit の鍵を作り、 上位 64 bit を PCG64 の初期状態、下位 64 bit を stream 番号に使う。draw 番目の値は stream を draw 回進めて取り出す。 鍵の計算は 32 bit の Murmur3 を 4 系統の seed で回すもので、整数演算は 16 bit 分割の乗算で 符号付き 64 bit の範囲に収めている(Fortran の整数 overflow を起こさない)。
1 つの (seed, counter) の draw を連番で引く列。鍵の計算と PCG64 生成器の作成を 1 回で済ませ、
next_uniform の n 回目は counter_uniform(seed, counter, first_draw + n - 1) と同じ値を返す。
生成器は C++ 側で確保するので、open したら close する。
| procedure, public :: open => open_counter_stream | |
| procedure, public :: next_uniform => counter_stream_next_uniform | |
| procedure, public :: close => close_counter_stream |
(seed, counter, draw) で決まる (0, 1) の一様乱数。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | seed |
実行の乱数 seed( |
||
| integer(kind=i64), | intent(in) | :: | counter(:) | |||
| integer(kind=i64), | intent(in) | :: | draw |
同じ対象の中で何番目の値か(0 以上)。 |
親の乱数 id と子の番号から、衝突しにくい 63 bit の子 id を作る(二次電子などの派生粒子用)。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i64), | intent(in) | :: | parent_id | |||
| integer(kind=i64), | intent(in) | :: | ordinal |
PCG64(state_seed, stream) を draw 回進めた次の値を (0, 1) で返す(変換は open_uniform_from_double53)。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i64), | intent(in) | :: | state_seed | |||
| integer(kind=i64), | intent(in) | :: | stream | |||
| integer(kind=i64), | intent(in) | :: | draw |
53 bit 格子値 raw = k/2^53(k = 0..2^53-1)を (0, 1) へ写す。
raw に 2^-54 を足し、binary64 の最近接丸めで 1.0 になる最上端 k = 2^53-1 だけを 1 の直前値 1-2^-53 に留める。
それ以外の k では raw + 2^-54 と同じ binary64 値を返す。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | raw |
|
(seed, counter) の draw first_draw .. first_draw + size(uniforms) - 1 をまとめて返す。
値は同じ draw の counter_uniform と一致する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | seed | |||
| integer(kind=i64), | intent(in) | :: | counter(:) | |||
| integer(kind=i64), | intent(in) | :: | first_draw | |||
| real(kind=dp), | intent(out) | :: | uniforms(:) |
seed と counter から PCG64 の (初期状態 seed, stream) を作る。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | seed | |||
| integer(kind=i64), | intent(in) | :: | counter(:) | |||
| integer(kind=i64), | intent(out) | :: | state_seed | |||
| integer(kind=i64), | intent(out) | :: | stream |