千葉大学


01_bands.pngと 02_timeevol_current.png を再現する03_hhg_fft.pngと 04_selection_rule.png を再現するセットアップ確認、checkpoint の使い方、AI の使い方
高次高調波発生やGKSL方程式等の基本概念の導入
ハンズオン1: バンド図を作る
ハンズオン2: 電流を計算して時間発展をプロットする
HHG → 最も単純な非線形光学効果の一つ




HHGの数値解析を実践してみましょう!

\[ \hat H_0 = -t_0 \sum_{\bm r}\sum_{j=1}^3 (\hat b_{\bm r+\bm d_j}^\dagger \hat a_{\bm r} + \text{h.c.}) + \Delta\sum_{\bm r} (\hat a_{\bm r}^\dagger \hat a_{\bm r} - \hat b_{\bm r}^\dagger \hat b_{\bm r}) \]
\[\begin{align} &\acomm{\hat c_\br}{\hat c'_{\br'}}=\delta_{cc'}\delta_{\br\br'}\\ &\comm{A}{B}=AB-BA\\ &\acomm{A}{B}=AB+BA \end{align}\]

Δ の役割Δ = 0 では Dirac cone が閉じる(ギャップレス)Δ ≠ 0 では gap が開く\[ {\small \hat a_\br = \frac{1}{\sqrt{N}}\sum_{\bk}\tilde a_\bk e^{-i\bk\cdot\br}, \quad \hat b_\br = \frac{1}{\sqrt{N}}\sum_{\bk}\tilde b_\bk e^{-i\bk\cdot\br} } \]
\[ \hat{H}_0=\sum_\bk\bm{C}^\dag_\bk \mathcal H(\bk)\bm{C}_\bk, \quad \bm{C}_\bk=\mqty(\tilde{a}_\bk & \tilde{b}_\bk)^\top \]
\[ \mathcal H(\bm{k})= \begin{pmatrix} \Delta & -t f(\bm{k})\\ -t f^*(\bm{k}) & -\Delta \end{pmatrix} \]
\[ {\small f(\bm{k})=\sum_{j=1}^3 e^{i\bm{k}\cdot\bm{d}_j} } \]
\[ E_\pm(\bm{k})=\pm\sqrt{\Delta^2+t^2|f(\bm{k})|^2} \] \[ \mqty(\xi_\bk & \zeta_\bk)=U^\dag_\bk\bm{C}_\bk \]
\[\begin{align*} \ket{v_\bk} =\zeta^\dag_\bk\ket{0_\bk}\\ \ket{c_\bk} =\xi^\dag_\bk\ket{0_\bk} \end{align*}\]
±Δ が A/B 副格子の非対称性-t f(k) が最近接ホッピングの総和H(k) が分かれば dH/dk も解析的に書けるdH/dk が、あとで current_traces へ入るsrc/tb.jlexamples/01_bands.jlf(k), dfdk, H(k), dHdk を埋めるexamples/out/01_bands.png を出すtest/test_tb.jl に TB テストを 2 本書く
図: examples/01_bands.jl
checkpoint-1-bandf(k) と H(k) の穴埋め\[ f(\bm{k})=\sum_{j=1}^3 e^{i\bm{k}\cdot\bm{d}_j} \]
\[ \mathcal H(\bm{k})= \begin{pmatrix} \Delta & -t f(\bm{k})\\ -t f^*(\bm{k}) & -\Delta \end{pmatrix} \]
TBParams を先に読むdfdk, dHdk\[ \frac{\partial f}{\partial k_\alpha} = i\sum_j d_{j,\alpha} e^{i\bm{k}\cdot\bm{d}_j} \] \[ \pdv{\mathcal H}{k_\alpha}= \begin{pmatrix} 0 & -t \pdv{f}{k_\alpha}\\ -t \pdv{f^*}{k_\alpha} & 0 \end{pmatrix} \]
NN_VECTORS, b1, b2: 格子定義hex_vertices(b1, b2): 六角形 BZ の頂点hex_surface_coordinates(...): 表示用の座標生成band_surfaces(kx, ky, tb): 各点で固有値を取って上下バンドを作るdfdk[1] が x, dfdk[2] が ydHdk は電流用に使うtest/test_tb.jl で見ることH(k) がエルミート性を保っているか±E 対称利用文脈: 手元の src/tb.jl を埋める前に、式とコードの対応を確認する。
大事なのは、AIの実装の物理骨格をちゃんと理解し、自分のものとすること。(≠1行1行をチェック)
数式との対応を意識して、コードの意味をちゃんと理解することが重要です。
また、関数が満たすべき物理的制約をきちんと満たしているか確認するユニットテストを追加すべし。

図: examples/01_bands.jl
Δ = 0 なら\(\bm K\)/\(\bm K'\)点付近で cone が閉じているかΔ ≠ 0 に変えたとき gap が開くかH(k) の形がバンド図へどう写るかJ(t) へH(k) と dH/dk が書けたA(t) による時間依存L_k による緩和ρ_k(t) の時間発展current_traces による Jx(t), Jy(t) の観測→ パイエルス置換 \[ t_0 \rightarrow t_{\br,\br+\bm d_j}(t) = t_0\exp\left(-ie\int_\br^{\br+\bm d_j} \bm{A}(t)\cdot d\br\right) \]
\[\begin{align} \hat{H}(t)= & -\sum_{\bm{r},j}(t_{\br,{\br+\bm d_j}}(t)\hat b_{\br+\bm d_j}^\dag\hat a_\br + t_{{\br+\bm d_j},\br}(t)\hat a_\br^\dag\hat b_{\br+\bm d_j}) + \Delta\sum_\br(\hat a^\dag_\br\hat a_\br - \hat b^\dag_{\br+\bm d_1}\hat b_{\br+\bm d_1}) \\ =&\sum_\bk\bm{C}^\dag_\bk \mathcal H(\bk+e\bm{A}(t))\bm{C}_\bk \\ \mathcal H_\bk(t) &:= \mathcal H(\bk+e\bm{A}(t)) \end{align}\]
本講義では\(x\)軸方向直線偏光として実装してある。
\[ \dot{\rho}_\bk(t)= -i[\mathcal H_\bk(t), \rho_\bk(t)] +\gamma\left( L_\bk \rho_\bk(t) L_\bk^\dagger -\frac{1}{2}\{L_\bk^\dagger L_\bk,\rho_\bk(t)\} \right) \]
k を k + A(t) へずらして評価するρ_k(t) は 2×2 密度行列A=0 の固有状態から前計算するJ(t) を計算・プロットするsrc/rhs.jlsrc/observables.jl の current_tracessrc/lindblad.jlsrc/workflows.jlexamples/02_timeevol_current.jlrhs! と current_traces を埋めて ρ_k(t) の右辺を組み立てる02_timeevol_current.png を出す
図: examples/02_timeevol_current.jl
checkpoint-2-rhsrhs!\[ {\small \dot{\rho}_\bk= -i[\mathcal H_\bk(t), \rho_\bk] +\gamma\left( L_\bk \rho_\bk L_\bk^\dagger -\frac{1}{2}\{L_\bk^\dagger L_\bk,\rho_\bk\} \right) } \]
A=0 の固有状態から前計算するcurrent_tracesA 微分、したがって k 微分したハミルトニアンが応答演算子になるreal(tr(ρ * dHdk))) を各 k で評価して平均するdHdk.x[i] と dHdk.y[i] の取り違えだけ注意するPkg.test()test/test_gksl.jl で見ることtr(dρ)=0: 規格化を壊していないかrhs! を埋めて波形が出たら、そのまま Pkg.test() で確認する利用文脈: 手元の src/rhs.jlと src/observables.jl を埋める前に、GKSL の各項と rhs! と current_traces の役割を整理する。
`src/rhs.jl` と `src/observables.jl` を理解しながら実装したいです。
まず `commutator!`, `dissipator!`, `rhs!`, `current_traces` の役割とデータの流れを整理し、
その後 GKSL 各項との対応、`A(t)`, `γ`, `L_k`, `kshift` が効く場所、
候補コード、確認観点(`tr(dρ)=0`, エルミート性, `L^\dagger L`, `J(t)`)
の順に説明してください。最後に `current_traces` の集計内容を 2〜3 行で補足し、
確実に読めることと推測は分けてください。J(t) の波形をどう読むか
図: examples/02_timeevol_current.jl
Jx(t) は包絡中心で振幅が大きくなるJx(t) には包絡の上に高速振動が重なっているJy(t) は強く抑制されるJy は 10^{-16} 程度なので、ほぼ数値ノイズとして読むH(k) と dH/dk を式とコードで結んだk + A(t) による光駆動を入れたρ_k(t) を開放系として更新したJx(t), Jy(t) という観測対象を得たJ(t) と動的対称性の関係を確認するJ(t) を FFT して HHG スペクトルへ変換するΔ = 0 / Δ ≠ 0 の比較から選択則を読むexamples/out/01_bands.pngexamples/out/02_timeevol_current.pngH(k) と dH/dk はコードで書けるA(t) を入れて GKSL方程式を書くと J(t) が出るJx と Jy の振る舞いに差があるexamples/out/03_hhg_fft.pngexamples/out/04_selection_rule.pngJ(t) の再確認J(t) をもう一度見る: 動的対称性の入口
図: examples/02_timeevol_current.jl
Jx がどのような周波数成分を含んでいるかsrc/fft.jlexamples/03_hhg_fft.jlhhg_spectrum を埋めて n = ω/ω0 軸のスペクトルを作るexamples/03_hhg_fft.jl で返ってきたスペクトルを描いて保存するexamples/out/03_hhg_fft.png を保存する
図: examples/03_hhg_fft.jl
checkpoint-3-ffthhg_spectrum利用文脈: src/fft.jl の hhg_spectrum を埋める前に、周波数軸の意味と確認項目を整理する。

examples/03_hhg_fft.jl
Jx のピークが n=整数 で見えるJy がほぼ 0 なら、周波数空間でもほぼゼロJx,Jyのスペクトルの形状を支配しているのか?\[ U^\dagger H(t + \Delta t) U = H(t) \]
\[ U^\dagger \hat{\bm O}(t + \Delta t) U = R \hat{\bm O}(t) \]
\[ U^\dagger \hat J_\alpha(t + T/2) U = -\hat J_\alpha(t) \]
\[ J_\alpha(2n\omega_0) = 0 \]


\[ J_x(2n\omega_0)=0,\qquad J_y(t)=0 \]
\[ J_x(2n\omega_0)=0,\qquad J_y((2n+1)\omega_0)=0 \]
連続波で厳密に成り立つ議論だが、今回の有限パルスでも定性的にはこの選択則で図を読める。
Δ=0 / Δ≠0 を比べるexamples/04_selection_rule.jlΔ=0 / Δ≠0 の比較から相対変化を読み取るΔ=0 と Δ=0.2 のスペクトルを並べて比較するexamples/out/04_selection_rule.png を保存する
図: examples/04_selection_rule.jl
Δ は何を変えるか\[ \mathcal H(\bm{k})= \begin{pmatrix} \Delta & -t f(\bm{k})\\ -t f^*(\bm{k}) & -\Delta \end{pmatrix} \]
Δ = 0Δ ≠ 0run_spectrum が「時間発展から FFT まで」を一気につなぐplot_selection_rule が Jx/Jy を上下 2 段で描くΔ 以外固定Δ による変化へ寄せる利用文脈: 比較図に基づく観測事実と、対称性の説明を紐づける。
Δ=0 / Δ≠0 比較から何を言うか
図: examples/04_selection_rule.jl
Δ を変えても Jx はほとんど変わらないJy は偶数次応答 n=2,4,6,... が現れるProject.toml と package 名src/ と公開入口test/ と runtests.jlREADME と CI の土台手で始めると後回しになりやすい入口を、最初にまとめて固定する。
src/, test/, README, CI の迷いを減らすext に分けるplot_hhg のような標準可視化関数を足したくなるMakie や Plots を本体 [deps] に入れると、計算だけ使いたい人にも重い依存が乗るext/ に逃がす| 置く場所 | 主な役割 |
|---|---|
README |
導入、インストール、最短の実行手順 |
| 詳細 docs | 背景、API、図の読み方、設計の理由 |
examples/ |
実際に再現する最短経路 |
README.md: セットアップ、checkpoint、examples の入口docs/src/index.md: API 一覧と @docs / @autodocsdocs/make.jl: HTML 生成と公開設定examples/02_timeevol_current.jl: simulate_currents の利用例examples/ で図を再現するsrc/pulse.jl の説明を """ ... """ にするdocs/src/index.md の @docs に並べる?default_pulse や HTML docs から同じ説明を読める
docs/src/ を読む
makedocs で HTML 化する
CI の docs job が deploy を担当する
GitHub Pages で公開する
docs/make.jl が module とページ構成を決める.github/workflows/ci.yml が build と公開の入口になる@docs の中身も増やせるテストを実行する
通った行と通っていない行を記録する
未確認の分岐や異常系を見つける
必要なテストを追加する
examples と tests の間に穴がないか高スコア = 十分 ではない
hhg_spectrum の異常入力current_traces の長さ不一致examples でしか触らない経路Jx(t), Jy(t) を FFT して HHG スペクトルへ変換できる
hhg_spectrum が何をしているか読めるcurrent_traces が何を集計しているか説明できるREADME / docs / CI / テストが、再現結果の共有を支えると分かるArgParse.jlを使うと便利。γ: コヒーレンスの減衰を強めるA0: 非線形性を強めるω0: 横軸 n = ω/ω0 の基準を決めるdt を変えると周波数軸が変わる