コンテンツにスキップ

はじめに

必要なもの

項目 要件
Julia 1.11.9 がピン留めされたバージョン (再現性の規律)。1.12 でも検証は通る。
パッケージ 不要。Julia 標準ライブラリのみ。
OS Windows・Linux・macOS。Windows での長時間マルチスレッドバッチは Julia ランタイム側の問題を踏む — トラブルシューティング を参照。
Python 2 つ目の独立実装 (src/ionization.py) を動かすときだけ。エンジンには不要。

Pkg.add も、Project.toml の instantiate も、ビルド手順も無い。

git clone https://github.com/seto77/Temari.git
cd Temari

1. 導入の検証

まず解析解に対するテスト梯子を走らせる。水素の束縛・連続状態、点核 Dirac 固有値、 3j の閉形式、そして相対論経路を非相対論に還元する \(c \to \infty\) 極限まで、 厳密解と突き合わせる。

julia -t auto src/ionization.jl selftest

約 10 秒で ALL PASS が出る。失敗は @assert なので、終了コードが 0 でなければ 本物の失敗である。各テストの内容は 検証 にある。

2. 1 チャネル計算する

julia -t auto src/ionization.jl 26 K 200 --quick

Z = 26 (鉄) の K チャネルを E₀ = 200 keV で、粗い求積で計算する。 ある元素の初回実行はその SCF を解くので明らかに時間がかかる — 結果はキャッシュ される (後述の SCF キャッシュ)。

Z=26 K @ 200.0 keV   処方: DHFS-KS23-DiracB-KDIRAC2C-jsplit-fullrange-sym-v4-DSCF
求積: QUICK (参考値)   スレッド: 4
初回はこの元素の SCF を解くため時間がかかります (atom_cache_jl_*.jls に保存)...
  eps 32/32

完了 (4 s)   E_bound = -7083.6 eV (小成分ノルム比 0.0088)

   s [1/Å]             F(s)
     0.000   1.00000000e+00
     0.250   9.78528239e-01
     0.500   9.22283795e-01
     ...
     4.000   1.62492458e-01

σ (Bote–Salvat, 出荷値)   = 3.184786e-08 nm²
σ (自前 N0, 健全性の目安) = 3.197913e-08 nm²  (比 1.0041)

診断: match_resid=4.43e-06 (ゲート<1e-4) / r_tail=0.00e+00 (<1e-4) / badL=0 (=0)

読み方:

  • F(s) — s グリッド上のイオン化形状因子。\(F(0) = 1\) に規格化されている。 非弾性像の非局在化を決めるのはこの形状。
  • σ (Bote–Salvat) — 出荷される絶対断面積。この計算からではなく解析式から 来る。
  • σ (自前 N0) — エンジン自身の \(N(0)\) が含意する断面積。健全性の目安であり 製品ではない。過電圧 \(u = 2\) を下回ると比は 0.3 程度まで落ちるが、これは 第一 Born 近似として正常な挙動。
  • 診断match_resid は漸近 Coulomb マッチの残差、r_tail は動径テールの 打ち切り、badL はゲートを割った部分波の数。本番ドライバはゲート違反の チャネルを受け付けない。

3. JSON で受け取る

julia -t auto src/ionization.jl 79 L3 300 --high --rel --json au_l3_300.json

--json は結果一式 — s グリッドと \(F(s)\)、束縛エネルギー、両方の断面積、診断値、 処方 ID — を 1 つの JSON オブジェクトとして書き出す。このファイルが、GUI を含む 下流すべてに対するエンジンの契約である。

4. (任意) ブラウザ GUI

julia -t auto src/gui.jl

既定ブラウザで 127.0.0.1 のページが開く。GUI は薄いシェルにすぎない — src/ionization.jl--json 付きで別プロセスとして起動し、ログを ポーリングして進捗を出し、結果を表示する。依存ゼロ (HTML・JS・SVG は ファイルに埋め込み)。オプションと既知の制限は コマンドリファレンス

求積の設定

同じ物理に対する 3 段階のプリセット:

フラグ プリセット 用途
--quick QUICK 試し打ち。1 チャネル 10 秒程度。値は参考値。
--high HIGH 本番テーブル。ε ノードを増やし、角度求積を倍にし、動径メッシュを細かくする。
(なし) PROD 中間の既定値。

求積を変えれば積分値そのものが変わる。異なるプリセットの結果を 1 つの データセットに混ぜてはいけない。

SCF キャッシュ

元素の自己無撞着場を解くのが初回実行の重い部分なので、結果は作業ディレクトリに atom_cache/atom_cache_<schema>_<source指紋>_jl<version>_<種別>_<Z>...jls として保存される。

キーには SCF 処方が入り、さらに数値基盤・原子 SCF ソースの SHA-256 由来指紋で、 コード変更後のキャッシュを自動的に分離する。各ファイルは payload checksum も持ち、 検証に失敗すれば再構築される。旧ファイルは回復可能性のため残るので、容量回収が 必要なときだけ後から削除すればよい。

ファイル名に Julia のバージョンが入るのは、Serialization 形式が版間で非互換 だから。Python 実装は独立に atom_cache_*.pkl を持つ。

スレッド

-t auto は ε (放出電子エネルギー) ノードを並列化する。単一プロセスの実行結果は スレッド数に依存しない。

長時間バッチでは、1 プロセスに多くのスレッドを与えるより、少スレッドのプロセスを 多く走らせる方が速い — 4 プロセス × 8 スレッドから 8 プロセス × 4 スレッドへ 変えるだけで実測 2.26 倍。詳細は 性能

次に読むもの