`batch_duration` をどう決めるか
このページは、「1 batch の物理時間をどこまで大きくしてよいか」に答える利用ガイドです。 単独の run から安全な値を決めることはできません。固定幅を 1/2 倍、1 倍、2 倍に変え、 同じ物理時刻で結果が変わらない範囲を探すのが基本です。
読了後は、固定幅の比較を実行し、幅を採用するか、cached_kneq0 の適応進行を使うかを判断できます。
sim.tol_relは監視・出力値です。現行実装はtol_relを早期停止条件に使わず、sim.batch_countで指定した accepted batch 数まで実行します。
まず選ぶ経路
Section titled “まず選ぶ経路”| 目的 | 使う経路 |
|---|---|
| 一般のケースで時間幅依存性を調べる | 固定幅の 1/2 倍、1 倍、2 倍を比較する |
cached_kneq0 で 1 batch の局所電位変化を制限する | max_nonzero_mode_potential_step を使う |
| を含む全体の安定性や大域精度を確認する | 固定幅比較を行う。適応進行だけでは判定しない |
sim.batch_duration は 1 batch の物理時間と、表面電荷を更新する時間幅です。
sim.batch_duration_step を使う場合、解決される幅は
です。2 つのキーは同時に指定できません。sim.dt は粒子を前進させる時間刻みであり、
表面電荷をまとめて反映する batch_duration とは役割が異なります。
boundary_inflow、plane_source、reservoir_face、photo_raycast、および
surface_charge_closure="fixed_current" は、正の解決済み batch_duration を必要とします。
完全な入力条件は入力パラメータリファレンスで確認してください。
固定幅を比較する
Section titled “固定幅を比較する”比較条件を揃える
Section titled “比較条件を揃える”write_files=true、history_stride > 0とし、summary.txtとcharge_history.csvを保存します。- メッシュ、粒子分布、乱数 seed、OpenMP thread 数、MPI rank 数を揃えます。
- 3 run の
output.dirを分けます。 - 幅だけでなく
batch_countも変え、同じsimulated_time_s付近で比較します。
基準幅を 、基準 batch 数を とすると、次の組合せを使います。
| run | batch_duration | batch_count | output.dir |
|---|---|---|---|
| half | outputs/batch-half | ||
| reference | outputs/batch-reference | ||
| double | outputs/batch-double |
は偶数にします。例えば s、 なら、half、reference、double の
設定値はそれぞれ (5.0e-8, 200)、(1.0e-7, 100)、(2.0e-7, 50) です。
これは編集方法を示す例であり、推奨する物理値ではありません。
batch_duration_step を使う場合は dt を固定し、step 値を同じ 1/2 倍、1 倍、2 倍にします。
設定を作って実行する
Section titled “設定を作って実行する”元の設定を 3 つに複製し、上表に対応する [sim] と [output] の値だけを変更します。
cp beach.toml batch-half.tomlcp beach.toml batch-reference.tomlcp beach.toml batch-double.toml入力検査に通ってから、ローカル環境または計算ノードで実行します。
beachx lint batch-half.tomlbeachx lint batch-reference.tomlbeachx lint batch-double.toml
beach batch-half.tomlbeach batch-reference.tomlbeach batch-double.toml実行環境の選び方は実行するを参照してください。
期待する出力を確認する
Section titled “期待する出力を確認する”各 run に summary.txt、charges.csv、charge_history.csv が必要です。
次のコマンドで、完了 batch 数と物理終了時刻を確認します。
for output_dir in outputs/batch-half outputs/batch-reference outputs/batch-double; do beachx inspect "$output_dir" grep -E '^(batches|last_rel_change|simulated_time_s)=' "$output_dir/summary.txt"done期待する状態は次のとおりです。
- 3 run が終了コード
0で完了する batchesが各設定のsim.batch_countと一致するsimulated_time_sが 3 run で同じ物理終了時刻になるcharge_history.csvのbatch列を各 run の幅で物理時刻へ換算し、対応する要素電荷を比較できる
正常終了は、数値安定性や定常到達を証明しません。last_rel_change も停止判定ではなく、
履歴と最終状態を比較するための診断値です。
採用する幅を決める
Section titled “採用する幅を決める”最終表面電荷分布、総電荷、局所電位幅、absorbed / escaped 数、履歴の振動を比較します。 「一致」の許容値は、研究で必要な目的量の精度から先に決めてください。
| 観測 | 判断 |
|---|---|
| half と reference が許容値内で一致する | reference は実用上の候補。half を検証基準として残す |
| reference または double で振動・発散する | batch_duration を下げる |
| 幅を変えると最終電荷が系統的に変わる | より小さい幅でもう一度比較する |
| 履歴が Monte Carlo ノイズに埋もれる | w_particle または target_macro_particles_per_batch を先に調整する |
| 終了時にも変化が続く | 比較する全 run の batch_count を同じ倍率で増やし、共通の物理終了時刻を延ばす |
この比較は Richardson 外挿ではなく、step-size sensitivity check です。誤差の冪乗則や
特定の収束次数は仮定しません。理論的な理由は
batch_duration の理論的背景で説明します。
適応的な 進行を使う
Section titled “適応的な k≠0k\ne0k=0 進行を使う”適用できるケース
Section titled “適用できるケース”この経路は既存の periodic2 ケースに対する高度な選択肢で、次をすべて要求します。
[periodic2].nonzero_mode_backend = "cached_kneq0"- 正の
sim.batch_duration、または正の値へ解決されるsim.batch_duration_step - time-scaled な
boundary_inflow、plane_source、reservoir_face、photo_raycast - reservoir 流入と
plane_sourceでは、固定w_particleではなくtarget_macro_particles_per_batch
正の npcls_per_step を持つ volume_seed はこの経路で使えません。
上限を設定して実行する
Section titled “上限を設定して実行する”元の periodic2 設定を複製し、adaptive.toml の既存の [periodic2] と [output] にある
該当値を変更します。
cp beach.toml adaptive.toml[periodic2]nonzero_mode_backend = "cached_kneq0"max_nonzero_mode_potential_step = 1.0e-2 # V
[output]dir = "outputs/adaptive"1.0e-2 V は入力例です。許容できる局所電位変化に合わせて決め、上限を半分にした比較も行います。
beachx lint adaptive.tomlbeach adaptive.tomlbeachx inspect outputs/adaptive解決済み sim.batch_duration を とすると、BEACH は各 accepted batch で
を試します。候補電荷が作る 電位変化を全 panel 重心で評価し、
最大絶対値が上限以下となる最初の幅を受理します。
期待する出力を確認する
Section titled “期待する出力を確認する”grep -E '^(batches|simulated_time_s|periodic2_max_nonzero_mode_potential_step_V|adaptive_nonzero_mode_rejected_trials|adaptive_nonzero_mode_last_batch_duration_s|adaptive_nonzero_mode_last_potential_step_V|adaptive_nonzero_mode_omp_threads)=' \ outputs/adaptive/summary.txtadaptive_nonzero_mode_last_batch_duration_sは最後に受理した幅です。adaptive_nonzero_mode_last_potential_step_Vは最後に受理した 電位変化で、設定上限以下になります。adaptive_nonzero_mode_rejected_trials=0でも異常ではありません。上限を満たすまで半減した累積回数を示します。simulated_time_sは受理した幅の累積であり、一般にはbatch_count * batch_durationと一致しません。
棄却した再試行では、RNG と macro 粒子数残差を元へ戻し、統計、履歴、charge ledger を更新しません。 1 batch で 24 回半減しても上限を満たさない場合は停止します。この場合は最大幅を下げるだけでなく、 場モデル、粒子統計、電荷変化が意図どおりかも確認してください。
上限を採用するか判断する
Section titled “上限を採用するか判断する”max_nonzero_mode_potential_stepを 1/2 にした run を作ります。- 同じ
simulated_time_s付近で表面電荷、局所電位幅、総電荷、粒子統計を比較します。 - 設定した許容値内で一致すれば、大きい方の上限を実用候補にします。
- 固定幅 control では、このキーを省略するか
0にします。
max_nonzero_mode_potential_step は、batch 中に 場を固定するための局所電位 trust bound です。
局所打切り誤差、大域精度の次数、 更新の安定性は保証しません。このため、適応進行を使っても
固定幅または上限半減の sensitivity check が必要です。
target-count reservoir と固定 rays_per_batch の photo source では、trial 幅を半分にすると
macro 粒子電荷も半分になります。上限半減比較には時間離散化差と Monte Carlo 分散差の両方が含まれるため、
同じ乱数 seed を使い、電荷分布 norm と粒子統計を併記します。
棄却した再試行は、同じ実行内で固定 OpenMP team size を使います。restart 後は別の team size を 使用できるため、restart 前後の bitwise 一致ではなく、電荷分布と accepted width の数値的一致を確認します。
batch_durationの理論的背景 — 固定点、線形安定性、適用限界- 入力パラメータリファレンス — キーの型と完全な制約
- 境界 reservoir の流入量と速度サンプリング — 粒子数と重み
- 出力形式リファレンス — adaptive receipt
- 結果を検証する — 数値収束と物理妥当性
- BEACH の計算サイクル — batch 中に場を固定する更新順序