MLO — 最大局在化などに代わる自動モデル化法
ecalj branch mlo3 / 2026-09-16 17:02 JST
MLO (MTO-based Localized Orbitals) は、最大局在化 Wannier 関数 (MLWF) の代わりに使う局在基底である。
MLWF は「広がりを最小にする」という条件でユニタリ変換を非線形最適化して求める。 強力だが、初期推定 (projection) を人が与える必要があり、収束が初期値に依存し、 エンタングルした帯では disentanglement の窓をさらに手で決めることになる。 うまくいくかどうかが人の手加減に掛かっているのが難点である。
MLO は最適化をしない。PMT 基底の恒等分解を出発点に、 どの チャネルで模型を作るか (mlo_lm) を与えれば、重み が 式一本で決まる(§1)。反復も初期推定も無く、結果は一意で、物質ごとの調整 パラメータはゼロである。局在性は最適化の結果ではなく、MTO を種にしている ことから自然に出る。
その mlo_lm も原理的には自動化できる。規則は「目的の窓にバンドを出して いるチャネルだけ取る」の一つで、どの原子のどの が窓に重みを持つかは 計算から出る量だからである(§1)。現状は手で書いているが、調整ではなく 読み取れば決まる類のものである。
使い方は大きく 2 つに分かれ、測り方も違う:
- ミニマム模型 — を含む領域の第一原理バンドを全部再現する。 半導体・金属・Al₂O₃:Cr(ギャップ中の Cr d + バンド端)はすべてこれ(§2)。
- 部分バンドを取る模型 — d だけ、4f だけを取り出す。MLWF で言えば projection で狙い撃ちしていた使い方に当たる(§3)。
FeMgO は真空層を持つスラブで空格子球が要る。§5 に独立の節を立てた。
本書の数値はすべて Samples/MLOsamples/ の 18 サンプルの実測値で、 全サンプルが mlo_method = 4 の既定値に統一してある(2026-09-16)。 図は ecalj/Samples/MLOsamples/plots/ にあり、 SRC/exec/mlo_bandplot.py <サンプルdir> で再生成できる(本頁の図はその写し)。 損失の数値は SRC/exec/mlo_losscheck.py <サンプルdir>。
| §1 | 最終形 | 式と既定値。読むならここだけでよい |
| §2 | ミニマム模型 | 窓の中のバンドを全部取る。11 系の実測とバンドプロット |
| §3 | 部分バンドを取る模型 | d だけ / 4f だけ。窓型の損失は使えない |
| §4 | SOC | job_mlo_soc。あとから摂動として載せる |
| §5 | FeMgO | 真空スラブに空格子球を置く |
| §6 | 有効相互作用 | job_mloW。模型の にあたる量 |
| §7 | 誤差の測り方 | 一方向では決まらない |
| §8 | 残る問題 | |
| 別頁 | 経緯と作業記録(backup) |
1. 最終形
MLO は PMT 基底の恒等分解から、選んだ MTO 部分空間の固有状態 を介して作る:
ここで を PMT 固有状態と MTO 固有状態の重なりとする:
とすると式 (1) の和は MTO 部分空間への射影演算子そのものになり、 に戻ってしまう。そこで重み を掛ける:
この をどう決めるかが問題のすべてで、課題 1 の答えは式 (4) である。
は大域の伝導帯下端(金属では )。 パラメータは と の 2 つだけ(単位はすべて eV)で、物質ごとに変える調整は無い。
役割がはっきり違う。 は「どこまで合わせたいか」の宣言であって フィッティングパラメータではない。バンド端から上に だけの範囲を要求する、 という意味なので、評価する窓の上端と同じ値にする(既定はどちらも 2 eV)。 が唯一の調整ノブで、残差が大きいときに動かすのはこちらである(§7)。
mlo_method = 4 として実装済み。 大域の伝導帯端は新しく計算する必要はなく、 lmf が SCF の BZ 積分で既に求めて efermi.lmf に書いている (evtop = VBM、ecbot = CBM。金属では のすぐ上の準位になるので、 一つの量で金属と絶縁体の両方を覆う)。 m_readqplist がこれを読み、原点のずれに強いよう差分 として eferm に足している (qplist.dat は零点に estaticav を使うことがあるため)。 efermi.lmf が無ければ に落ちる。
物質ごとに書く調整パラメータはゼロになった。mlo_emax を 0 / 5 / 7 / auto と 使い分ける必要が消えている。mlo_method = 4 は既定なので、書く必要すらない。
mlo_lm — 原理的には自動化できる
mlo_lm([mlo] 内、どの lm チャネルで MTO 部分空間を作るか。2026-09-17 までは [blocks] の mlo_lm という名前で、古い置き場・名前のままでも読める)は物質ごとに 書く。調整ノブではなく模型の定義そのものであり、method に関係なく MLO には 常に必要なものである。
gwinit は全原子 × s,p,d の行を雛形として書き出すが、 ! を外せばよいというものではない。 実際のサンプルはこうなっている:
| 系 | mlo_lm |
|---|---|
| Si, GaAs | 全原子 1–9(sp³d⁵) |
| NiO | Ni は 5–9 (d のみ)、O は 2–4 (p のみ) |
| SrTiO₃ | Sr は空、Ti は 5–9、O は 2–4 |
| RuO₂ | Ru は 5–9、O は 2–4 |
| Al₂O₃:Cr | Al は 1–9、Cr は 5–9、O は 2–4 |
規則は一つで、目的の窓にバンドを出しているチャネルだけ取る。酸化物なら O 2p と遷移金属 3d がそれで、陽イオンの s,p や O の s,d は窓の外にあるから 取らない。SrTiO₃ の Sr が空なのはそのためである。sp 半導体では価電子帯も 伝導帯も sp³d⁵ が担うので全部取る。
番号は job_band が PROCAR に書く実調和関数の順で、殻ごとに連番になっている:
| lm | 内訳 | |
|---|---|---|
| s | 1 | s |
| p | 2, 3, 4 | py, pz, px |
| d | 5, 6, 7, 8, 9 | dxy, dyz, dz², dxz, dx²−y² |
| f | 10 – 16 | f−3 … f3 |
殻の一部だけを取ることもできる。 たとえば Cu の t2g だけなら 5 6 8 (dxy, dyz, dxz) で、実際に 3 軌道の模型になる。
2026-09-17 以前のバイナリでは部分殻が効かない
m_HamPMT.f90 の選別ループに、殻の先頭の lm(1 / 2 / 5 / 10)が書いてあれば 殻全体、無ければ殻全体なしとして、それ以外の番号を無視するバグがあった (lold を更新しておらず、 が常に に張り付いていた)。 完全殻を先頭から並べる普通の書き方では影響しないが、部分殻は選べず、 先頭を欠いた並び(例: 11 12 13 14 15 16)は黙って殻ごと落ちていた。 FeMgO の mlo_lm に長く残っていた Fe/Mg の f の指定がまさにそれで、 f は基底にあったのに模型には一度も入っていなかった。
この判断は原理的には自動化できる。 「窓の中のバンドに、どの原子の どの チャネルが重みを持っているか」は計算から出る量で、lmf --mkprocar が出す射影重み(fat band に使うもの)がまさにそれだからである。閾値を一つ 決めて拾えばよい。ただし現状そこは実装されておらず、手で書いている。
手で書かざるを得ないのは、そこから更に狙って絞るときである:
- d だけ、4f だけを取り出す(§3)。窓に他のバンドがあっても敢えて捨てる
- 真空層を持つスラブに空格子球を足す(§5)。原子の無い場所に基底を置くので 構造からは出てこない
入力キー
gwinit が生成する ctrlg.<sname>.toml の [mlo] セクションに、既定値が 陽に書き出される(2026-09-17 までは [gw] の中にあった。古い置き場のままでも 読めるが、一行の案内が出る):
[mlo]
mlo_method = 4 # theta = sigma((eps - ecut_j)/mlo_w),
# ecut_j = max(CBM + mlo_delta, eps^MTO_j)
mlo_delta = 2.0 # (eV) how far above the band edge (EF in metals) the
# model must be accurate. A statement of what you want,
# not a fitting parameter: match it to your target window.
mlo_w = 2.0 # (eV) width of the fall-off above that floor. THIS is the
# knob to turn if the residual is too large. Measured
# optima: semiconductors ~2, Fe/Cu-like metals ~11. が mlo_delta、 が mlo_w で、単位はすべて eV (mlo_emax が元から eV なので mlo_* が揃う)。模型のチャネルを決める mlo_lm も 同じ [mlo] にあり、Wannier(hmaxloc、cRPA・magnon)もこれを読む。
MLO を作る k メッシュは [mlo] mlo_nkabc で必ず書く(2026-09-17、既定なし):
mlo_nkabc = [10, 10, 10] # k mesh the MLO Hamiltonian is built on; requiredlmf --writeham --mlo がこのメッシュの全 BZ 点で PMT ハミルトニアンを書き、mlo が そこから実空間表現を作る。無いと lmf はその場で止まる(SCF の [bz] nkabc を黙って 流用しない — 模型を何の上に作ったかは入力に書いてあるべきなので)。効くのは --writeham --mlo のパスだけで、SCF・バンド図は [bz] nkabc、 は [gw] n1n2n3 のまま。 gwinit は [bz] nkabc と同じ値を書き出すので、通常はそのままでよい。
射影子から外す最下位の PMT 状態(半芯 LO、O 2s のような模型に乗らない低い帯)の数 nskip は自動で決まる: 各 k で「模型部分空間への重みが 1/2 未満の最下位状態の数」を 数え、その全 k での最小値を全 k に使う(2026-09-18)。k ごとに決めると、Cu の d 模型の ように s 帯が最下位になる k とならない k で射影子が入れ替わり、バンドに折れが出る。 手動指定 mlo_nskip は廃止した。
mlo_lm で指定した (原子, l) に半芯の局所軌道(pz、例 Ga 3d の pz = 3.9)があるとき、 どちらの動径関数を模型に使うかも自動で決まる(2026-09-18): その LO の帯(LO 部分空間への 射影重みが 1/2 を超える占有状態)の最高エネルギーが E_F − 10 eV より上なら「浅い」LO と して LO を模型関数にし(ZnO の Zn 3d、−3.8 eV: これで 476 → 0.8 meV)、下なら従来どおり EH 関数を使って LO の状態は nskip で射影子から外す(GaAs の Ga 3d、−15 eV)。lmlo に local orbital atom ... SHALLOW / deep と出る。価電子殻より上の拡張 LO(pz > pnu)は対象外。 Cu の d 模型で 10³ → 16³ にすると d 帯の rms は 98 → 90 meV (Samples/MLOsamples/BackUp_notes/mlo_nskip_cu_problem.md)。
通常はこのまま使える。 Samples/MLOsamples の 18 サンプルは全部この既定値 ( eV)で、物質ごとに変えていない(§2)。3 つとも既定値なので、 そもそも書かなくてよい。
ただし には系による調整の余地がある。 残差が大きいときに動かすのは こちらで、実測した最適値は半導体で eV、Fe・Cu のような単原子遷移金属で eV と 6 倍違う(§7)。Fe では を 11 eV にすると窓内誤差が 19.8 → 9.7 meV と半減する(§2)。 は動かさない — あれは 「バンド端から上にどこまで合わせたいか」の宣言であって、合わせ込む対象ではない。
2. ミニマム模型 — を含む領域を再現する
MLO の使い方は大きく 2 つに分かれ、測り方も評価の仕方も違う。
| 何を取るか | 例 | 測り方 | |
|---|---|---|---|
| ミニマム模型(本節) | 窓の中の第一原理バンドを全部 | Si, GaAs, Fe, NiO, Al₂O₃:Cr, FeMgO … | 窓型の損失(§7) |
| 部分バンド模型(§3) | 特定のチャネルだけ | Cu の d のみ、4f のみ | 準位の重なり |
本節は前者。窓の中に第一原理バンドが 本あれば模型も 本持ち、 両者がどれだけ重なるかを測る。物質ごとの調整は無い — mlo_lm は要るが、 これは調整ではなく模型の定義で、窓に重みを持つチャネルを取るだけである(§1)。
実測 — 既定値のまま
mlo_method = 4 の既定値( eV、 eV)での実測。 MLOsamples の 18 サンプル全部がこの設定に統一してある(2026-09-16)。 物質ごとの入力は mlo_lm だけで、mlo_emax はどのサンプルからも消えた。
表の見出しは次の 5 つ(定義は §7):
| 見出し | 量 | 単位 | 範囲 |
|---|---|---|---|
| 窓 | ΔE rms | meV | VBM−2 〜 CBM+2 eV(金属は E_F±2 eV) |
| 占有 | ΔE rms | meV | E_F−12 〜 E_F−2 eV |
| 分散 | 経路方向の勾配の相対誤差 | 無次元 | 窓と同じ |
| ギャップ | バンドギャップ誤差(符号付き) | meV | 絶縁体のみ |
| m*比 | m*(MLO) / m*(DFT)。1.00 が一致(誤差ではなく比) | 無次元 | 絶縁体のみ |
誤差の一覧
| 系 | 窓 (meV) | 占有 (meV) | 分散 | ギャップ (meV) | m*比 |
|---|---|---|---|---|---|
| FeMgO (76) | 2.5 | 0.5 | 0.006 | — | — |
| Al₂O₃:Cr (50) | 7.2 | 2.2 | 0.004 | +1 | 1.04 |
| FeCo (18) | 8.3 | 4.7 | 0.021 | — | — |
| GaAs (18) | 8.5 | 1.9 | 0.008 | +6 | 0.82 |
| SrTiO₃ (14) | 8.9 | 5.5 | 0.009 | +9 | 1.03 |
| RuO₂ (22) | 9.9 | 9.4 | 0.048 | — | — |
| NiO (16) | 15.4 | 18.5 | 0.071 | +8 | 1.10 |
| C (spd, 18) | 16.6 | 4.8 | 0.013 | −1 | 1.05 |
| Fe (spd, 9) | 19.8 | 12.9 | 0.057 | — | — |
| Si (18) | 20.0 | 9.7 | 0.019 | +38 | 1.41 |
| C.sp (sp のみ, 8) | 26.7 | 8.0 | 0.021 | −39 | 0.65 |
| 中央値 | 9.9 | 5.5 | 0.019 |
最良は FeMgO の 2.5 meV で、真空層に空格子球を入れた 76 軌道模型(§5)。 最悪は C.sp の 26.7 meV(sp だけ 8 軌道)と Si の 。 どちらも を動かせば下がる(§7)。
- Si は と で別物(窓 20.0 → 7.1 meV、ギャップ +38 → +3 meV、 1.41 → 1.03)。 の値は補間の雑音を含む。サンプルは のまま。
- NiO の占有側 18.5 meV は窓内 15.4 meV より大きい。窓だけ見ていたら 見落とす種類の誤差である。
代表図 — Si と Fe
灰線が第一原理 PMT バンド、赤 × が MLO 模型。どちらも 基準。 全 38 枚(18 系 × 窓/全域 + Fe の 比較 2 枚)は ecalj/Samples/MLOsamples/plots/ にあり、SRC/exec/mlo_bandplot.py <サンプルdir> で再生成できる。

Si(QSGW、18 MTO = 2 原子 × sp³d⁵)。価電子帯から伝導帯 +5 eV まで 赤 × が灰線に完全に乗る。
図に「目的窓」の帯は描いていない。 が決めるのは の 上側の床だけで、下限は評価の都合にすぎない。しかも第 2 引数の が軌道ごとに違うので、一本の水平線では描けない。

Fe(DFT、9 MTO = sp³d⁵)。majority と minority を並べた。両スピンとも同等に乗る。 FeCo も同様、NiO は両スピン同値で、磁性系でスピンによる偏りは出ていない。
は効く — Fe の実例
Fe は既定の eV では合わせきれない。 だけを 11 eV に上げると:
| Fe | 窓 (meV) | 占有 (meV) | 分散 |
|---|---|---|---|
| (既定) | 19.8 meV | 12.9 meV | 0.057 |
| 9.7 meV | 9.0 meV | 0.024 |
窓内の誤差が半分以下になる。ただしバンド図を並べても違いは見えない — 差は meV の桁で、図の縦軸では潰れてしまう。どこで効いているかは 準位ごとの誤差を第一原理側のエネルギーで分けて見る必要がある:

効いているのは より上だけである。〜 eV で 2〜3 倍改善する一方、 より下は勝ったり負けたりで、minority の eV や eV では のほうが良い。これは床 が の上にあり、 がその上での落ち方を決めているのだから当然である。 「 を上げれば良くなる」ではなく「 は床より上の当たり方を決める」 と読むべきで、 を別に立てているのもこのためである(§7)。
高エネルギー側 — トランケーションは滑らか
MLO 模型は MTO 部分空間の次元しかバンドを持たないので、どこかで第一原理バンドから離れる。 その離れ方がリンギングになっていないかを見るため、MLO が伸びきるところまで描いた (<系>_full.png)。実測した上限:
| 系 (MTO 数) | MLO が伸びる上限 (eV) | 第一原理の上限 (eV) |
|---|---|---|
| NiO (16) | 1.6 eV | 141.8 eV |
| RuO₂ (22) | 5.5 eV | 146.9 eV |
| SrTiO₃ (14) | 8.4 eV | 153.6 eV |
| C.sp (sp のみ, 8) | 16.8 eV | 124.5 eV |
| FeMgO (76) | 29.7 eV | 152.0 eV |
| Si (18) | 28.8 eV | 108.3 eV |
| GaAs (18) | 31.6 eV | 116.5 eV |
| FeCo (18) | 31.8 eV | 142.6 eV |
| Al₂O₃:Cr (50) | 32.0 eV | 141.1 eV |
| Fe (spd, 9) | 32.8 eV | 124.6 eV |
| C (spd, 18) | 86.1 eV | 151.4 eV |
軌道数と上限は比例しない。 NiO は 16 軌道で 1.6 eV までしか伸びず、 Fe は 9 軌道で 32.8 eV まで伸びる。どのチャネルを取るかで決まる (NiO は Ni d と O p だけ、Fe は分散の大きい sp を含む)。 目的の窓( 近傍)に影響する話ではない。
床の上でも MLO バンドは連続な曲線で、折れや振動は見えない。数値でも確かめた — バンドに沿った の中央値(eV、括弧内は第一原理の同じ量):
| 系 / の範囲 (eV) | −10..0 | 0..3 | 3..8 | 8..15 | 15..25 | 25..40 |
|---|---|---|---|---|---|---|
| Si | 7.9 (8.1) | 12.5 (9.2) | 15.9 (14.2) | 24.2 (21.8) | 30.3 (45.1) | 20.4 (45.9) |
| Fe | 12.4 (10.2) | 45.8 (20.4) | 37.8 (24.5) | 41.3 (36.3) | 94.2 (54.8) | 216.3 (79.4) |
| GaAs | 7.6 (6.5) | 15.7 (11.4) | 13.8 (13.4) | 24.4 (20.7) | 46.2 (37.4) | 36.4 (59.5) |
| Al₂O₃:Cr | 207.6 (138.2) | — | 62.8 (42.1) | 367.2 (216.7) | 307.7 (240.6) | 338.5 (586.1) |
Si・GaAs・Al₂O₃:Cr は高エネルギー側で MLO の曲率が第一原理を下回る (Si は 20 対 46)。リンギングどころか元のバンドより滑らかである。 Fe だけが 25 eV 超で 216 対 79 と 2.7 倍になる。spd 9 軌道しかない模型が 33 eV まで引き伸ばされている領域で、模型の容量を超えている。

Si(QSGW)— 床(+3 eV)まで完全に一致し、その上は離れつつ 29 eV まで滑らかに伸びる。

Fe — を横切る sp バンドをゾーン境界の 33 eV まで追えている。
参照バンドについて
比較相手はどの系も PMT 基底で解いた第一原理バンドで、実験値ではない。 そのうち Si・Al₂O₃:Cr・RuO₂・GdION は QSGW(sigm.<sname> を持つ)、 残りは DFT である。本書で「」と書いているのは MLO 模型と この第一原理バンドの差で、比 の分母も同じ。
全サンプルのバンドプロット(灰線: 第一原理 PMT、赤 ×: MLO)
課題 (1) — 近傍の模型

Al₂O₃:Cr(50 軌道)— この系が最終形の要点。O 2p 価電子帯(−2〜−4 eV)、 ギャップ中の Cr d 準位( 近傍)、CBM(+6.5 eV)、さらに上の帯まですべて乗る。 床を に置くと CBM が拘束されずギャップが 128 meV 縮む。 手調整 mlo_emax = 7 eV を置いていたのはこの CBM を掴むためで、 method 4 の はそれを自動で当てる。窓 7.2 meV。

FeMgO(76 軌道)— 本表の最良、窓 2.5 meV。真空層 30.5 a.u. に空格子球 7 個を 入れた Fe/MgO スラブ。空格子球なしの 78 軌道模型は 126.9 meV だったので、 ほぼ同じ大きさで 51 分の 1 になる。詳細は §5。

GaAs(18 軌道)— Γ 点の分散の大きい伝導帯を含めて一致。窓 8.5 meV、ギャップ +6 meV。


SrTiO₃(14 軌道、窓 8.9 meV)と RuO₂(22 軌道、窓 9.9 meV)。

NiO(LDA、16 軌道)— sp と局在 d が共存する系。窓 15.4 meV に対し占有側 18.5 meV と 逆転しており、窓だけ見ていたら見落とす。


ダイヤモンド C — spd 18 軌道(窓 16.6 meV)と sp のみ 8 軌道(窓 26.7 meV)。 後者は伝導帯の一部が MTO 部分空間の外にあり、比 0.65、ギャップ −39 meV。

FeCo(18 軌道、窓 8.3 meV)— 磁性金属で両スピンとも良く乗る。
MLO フィッティング一覧 — 全サンプル
Samples/MLOsamples の 25 系すべて(灰: 第一原理 PMT バンド、赤 ×: MLO)。testecalj が 回すものと同じ入力・同じ参照。図は SRC/exec/mlo_bandplot.py <sampledir>_work で再生成。 表の後半 7 系は Materials Project の構造をそのまま ctrlgenToml.py に通し、 mlo_lm に全原子の s,p,d を入れて既定( eV)で回したもの (2026-09-18、Samples/MLOsamples/BackUp_notes/mp_20260918)。
| 半導体・絶縁体 | |||
|---|---|---|---|
| Si (QSGW) | GaAs (QSGW) | GaAs+SOC | C (diamond) |
![]() | ![]() | ![]() | ![]() |
| C.sp | SrTiO3 | Al2O3:Cr (QSGW80) | NiO (LDA, AFM) |
![]() | ![]() | ![]() | ![]() |
| 金属・磁性 | |||
|---|---|---|---|
| Cu (d だけ) | Fe | Fe+SOC | FeCo |
![]() | ![]() | ![]() | ![]() |
| RuO2 (QSGW) | GdCo5 (4f) | GdION (4f, QSGW) | SmP (4f, so=2) |
![]() | ![]() | ![]() | ![]() |
| スラブ | |
|---|---|
| FeMgO + 空格子球 (76 MLO) | FeMgO+SOC |
![]() | ![]() |
| Materials Project、既定のまま (DFT) | |||
|---|---|---|---|
| Ag | Al | NaCl | SiC (3C) |
![]() | ![]() | ![]() | ![]() |
| CdTe | ZnO (Zn 3d は LO を模型に) | TiO2 (rutile) | |
![]() | ![]() | ![]() |
MP 7 系の窓内 rms(金属 [E_F−8, +2]、絶縁体 [E_F−8, CBM+3] eV): Ag 15, Al 74(自由電子帯は 窓外), NaCl 2.9, SiC 3.3, CdTe 28, ZnO 0.8, TiO2 0.8 meV。
3. 部分バンドを取る模型 — d だけ / 4f だけ
こちらははじめから一部のバンドしか取らない模型である。Cu の d 5 本、 4f 7 本といった具合で、窓の中の第一原理バンドの大半は模型に無い。 §7 の窓型の損失はここには使えない — 無いものを「再現できていない」と 数えてしまうからである。
| 系 | mlo_lm | 窓型損失 (meV) | これは失敗か |
|---|---|---|---|
| Cu | Cu の lm 5–9(d のみ) | 147.8 meV | 否。sp バンドを模型が持たないだけ |
| SmP | Sm の 10–16(4f のみ)、P は空 | 121.3 meV | 否。価電子帯を持たない |
| GdION | Gd の 10–16(4f のみ) | 0.2 meV | 窓に 4f しか無く、逆に測れてしまう |
| GdCo5 | Gd の 10–16 のみ、Co 5 サイトは空 | (データ不足) | 同上 |
(GaAsSoc の窓 105.9 meV も同種の産物 — 比較対象が 2N スピノルで本数が合わない。)
4f 模型 — 準位の重なりで測る
4f だけを取り出す模型は「模型の 7 本が第一原理の 4f 準位に乗っているか」で 測る。各 k 点で MLO の各準位から最も近い第一原理準位までの距離(meV):
| 系 | spin | method 0, 旧 (meV) | method 4 (meV) |
|---|---|---|---|
| GdION | 1 | rms 0.19 / max 0.49 | rms 0.19 / max 0.49 |
| 2 | rms 1.76 / max 8.62 | rms 1.85 / max 9.30 | |
| GdCo5 | 1 | rms 10.99 / max 44.79 | rms 12.46 / max 52.67 |
| 2 | rms 13.78 / max 106.25 | rms 14.43 / max 104.21 | |
| SmP | 1 | rms 71.57 / max 265 | rms 76.30 / max 278 |
| 2 | rms 76.29 / max 273 | rms 75.04 / max 275 |
3 系とも method 4 は method 0 と同等で、4f バンドは乗っている。
ただし はここでは効いていない。 4f 準位 は 床 より遥かに下なので は常に床側が選ばれ、 しかも GdION では床が eV(Gd イオンの巨大ギャップ)と全部より上に来るため 、すなわち (素の射影)に戻る。 4f 模型にはバンド端の要求自体が無いので、 の「どこまで合わせたいか」 という意味が消える — method 4 でも壊れないが、効いてもいない。
SmP の rms 70–76 meV は元から。 中央値は 6–13 meV なので大半の準位は合っており、 一部(max 275 meV)が外れる。Sm 4f は P 3p と混成するのに mlo_lm で P のチャネルを 一つも取っていないためと思われる。method の問題ではない。
部分バンドだけを取る模型(§3)

Cu — d 5 軌道だけの模型。 を貫く sp バンドを模型が持たないので、 窓型の損失は 147.8 meV になるが、d バンド自身は乗っている(図を見よ)。
PMT バンドに対して有効なエネルギー下限を切っていないのもあって、いくらか 滑らかでない。 式 (4) の は上側の床 しか持たず、 下限が無いので、d の帯域より遥かに下の PMT 状態まで重み 1 で入ってくる。 と を両方向に振っても散らばりは既定値より良くならず、最大誤差は どの設定でも 1.0〜1.2 eV 残る。sp が d の帯域に入る で第一原理側が 6 本あるのに模型は 5 本しか持てない、という模型空間の側の限界でもある。

GdION(Gd 単イオン、QSGW)— 占有と非占有の 4f を別々の窓で描いた。 majority の 7 本は 直下( eV)、minority の 7 本は eV と eV 近く離れており、同じ縦軸には収まらない。 どちらも赤 × が灰線にそのまま乗る(rms 0.19 / 1.85 meV、上の表)。 minority の下に見える 〜 eV の灰線は 4f ではない帯で、 模型が取っていないので赤 × が無い。
この巨大なギャップが、4f 模型で が効かない理由でもある。 床 は eV に置かれ、4f 準位の ほとんど全部より上に来るので 、素の射影に戻る。


GdCo5 は Co 5 サイトを空にして Gd 4f だけ、SmP は P を空にして Sm 4f だけ。 準位の重なりで測った結果は上の表。
4. スピン軌道相互作用 — job_mlo_soc
SOC は MLO を作り直さずに、あとから摂動として載せる。スカラー相対論で 作った MLO 模型に を射影して足し、 のスピノルとして 解き直す形である。SOC 入りで自己無撞着を取り直す必要はない。
job_mlo_soc <sname> -np <N>3 段の手順
| 段 | コマンド | 何をするか |
|---|---|---|
| 1 | lmf --quit=band --ctrlg:ham.so=1 | フル LS のスピノルを全 BZ メッシュで解き SOC の を決める。efermi.lmf → efermi_soc に保存 |
| 2 | lmf --writeham --socmatrix --ctrlg:ham.so=0 | スカラー相対論の を __HamiltonianPMT に、SOC 行列を __HamiltonianPMTsoc に別ファイルで書く |
| 3 | mlo --socmatrix | PMT→MLO 縮約のあと SOC 行列を MLO に射影し、対称線上で を対角化 |
共通で --ctrlg:ham.nspin=2 --ctrlg:ham.phispinsym=true が付く。 phispinsym(スピン平均した動径関数)が要るのは、 の代わりに を使うためである。
1 段目が efermi.lmf を SOC の値で上書きする点に注意。非 SOC の計算を 同じディレクトリで続けるなら、efermi.lmf を退避しておくこと (サンプルは非 SOC 版を同梱してある)。
実装上の要点
- 対称化はスピノルとして行う。 SOC は なので、 little group の回転や の回転では 軌道部分 とスピン部分 (SU(2))のテンソル積として と作用させる (
so3_to_su2,spinor_rotateinm_HamPMT.f90) - 射影の基底を合わせる。
cmloは PMT 固有状態 基底、hammhsopは PMT 基底関数 基底なので、 で後者に 揃えてから --skiphammsocはlso=1でも に SOC を足さないためのフラグ(摂動を 後段で当てるため)
結果 — 非 SOC と同程度
| 系 | 窓 (meV) | 占有 (meV) | 分散 |
|---|---|---|---|
| FeMgOSoc (76) | 3.9 | 2.8 | 0.006 |
| FeSoc (9) | 21.9 | 15.4 | 0.057 |
非 SOC 版の FeMgO 2.5、Fe 19.8 meV とほぼ同じで、SOC を入れても劣化しない。 空格子球を入れた模型(§5)でも 3 段は問題なく通る。



上から FeMgOSoc、FeSoc、GaAsSoc。GaAs では As 4p の eV の 分裂が再現されている。
注意: SOC 版の スピノルを非 SOC の 本と機械的に比べてはいけない。
GaAsSocの窓型損失が 105.9 meV と出るのはそのためで、本数が合っていない だけである(§3 の表を見よ)。SOC の参照はband_MLO_spin1.soc.datの側。
5. FeMgO — 真空スラブに空格子球を置く
長らく「 をどう変えても合わない外れ値」だった系である。原因は でも method でもなく、模型が置かれていない領域があったことだった。 同じ落とし穴は真空層を持つスラブなら何にでもあるので、独立の節にする。
何が起きていたか
まず構造の理解が誤っていた。Fe/MgO の界面ではなく、真空層 30.5 a.u. を持つ スラブ(Fe 3 層 + MgO 3 層、 a.u.)である。〜 eV に集中して いた残差は界面状態ではなく表面/真空状態で、真空領域に基底関数が一つも無いので サイト中心の MTO では原理的に表現できなかった。 をどう作っても 無いものは作れない。
空格子球の置き方
真空に空格子球()を 7 層置いた。半径は自分で決める:
- a.u. なら表面の O () と Fe () のどちらにも当たらず、
lmchkの報告する重なりは 0% - 層は表面からの逃げを確保して等間隔に並べる
- 面内は と を交互(スラブの積層を継続)
[[site]]
atom = "E" # 空格子球
xpos = [0.0, 0.0, 0.3]
[[spec]]
atom = "E"
z = 0
r = 1.9 # 自分で決める。lmchk で重なりを確認すること
lmx = 2 # DFT 側は s,p,d を持たせる (下記)
lmxa = 2r = 0.0 は MT 球なしの浮遊軌道を意味するので、球を置きたいなら明示すること。
効果 — 空格子球を足すと 1 桁
majority / minority の窓内誤差(meV):
| 模型 | MLO 本数 | 窓 (meV) |
|---|---|---|
| 空格子球なし | 78 | 126.9 / 73.5 |
| ES に s のみ | 85 | 2.2 / 1.1 |
| ES に s,p + Mg,O の d 削除(採用) | 76 | 2.5 / 1.3 |
| ES に s,p | 106 | 1.8 / 1.1 |
| ES に s,p,d | 141 | 1.6 / 0.9 |
空格子球 1 個あたり s を 1 本、合計 7 本足すだけで 126.9 → 2.2 meV(58 分の 1)。 MLO は 78 → 85 本で 9% しか増えない。ここが一番大きい効き目である。

4 列が模型、上段が 近傍、下段が広域。左上(空格子球なし)を見よ — の上 〜 eV に赤 × の乗っていない灰線が残っている。これが 真空側にしみ出す表面状態である。価電子帯(〜 eV、Fe 3d と O 2p)は 空格子球が無くても合っており、欠けていたのは真空側の状態だけだった。
右の 3 枚( / / 本)は上段ではほとんど区別がつかない。 下段の広域では、一番小さい模型だけ eV 以上が空く — 削った Mg,O の d と 空格子球の p,d がそこを担っていた。
空格子球には p まで入れる
上の表では s だけでほぼ足りているように見えるが、 の上を細かく見ると p が要る。窓型の損失(窓は eV)がそこを測っていないだけである。

左が ES に s のみ(55 本)、右が s,p(76 本)。 〜 eV で描くと、 左は 〜 eV に赤 × の乗っていない灰線が残るのに対し、右は埋まっている。

準位ごとの誤差を第一原理側のエネルギーで分けると、どこで効いているかが分かる:
| 領域 | ES s のみ (55) | ES s,p (76) |
|---|---|---|
| 〜 eV(価電子帯) | 0.3〜0.7 meV | 同じ |
| 〜 eV | やや悪い | 少し良い |
| 〜 eV | 20〜170 meV | 3〜5 倍良い |
全体の数字でも:
| 軌道数 | 窓 (meV) | 占有 (meV) | 分散 | 準位ごと平均 (meV) | 最大 (meV) | |
|---|---|---|---|---|---|---|
| ES s のみ | 55 | 3.1 | 0.6 | 0.008 | 15.9 / 11.4 | 860 |
| ES s,p(採用) | 76 | 2.5 | 0.5 | 0.006 | 8.3 / 6.0 | 294 |
窓型の損失では 3.1 → 2.5 meV と控えめだが、準位ごとに見ると平均が半分、 最大が 860 → 294 meV と 3 分の 1 になる。窓の外での改善なので、窓型の指標には ほとんど出てこない。§7 で「一方向では決まらない」と書いているのはこういう事情である。
採用した模型 — 76 本
Samples/MLOsamples/FeMgO と FeMgOSoc はこの 76 軌道の模型で、入力一式を 共有する(mlo_lm は Fe が s,p,d の 9 本、Mg が s,p の 4 本、O が p の 3 本、 空格子球が s,p の 4 本: 3×9 + 3×4 + 3×3 + 7×4 = 76)。Fe と Mg の基底には f の MTO もあるが模型には入れていない。
元の空格子球なしの模型は 78 本だったので、**ほぼ同じ大きさで窓内誤差が 126.9 → 2.5 meV(51 分の 1)**になる。

用途は磁気ゆらぎの計算で、必要なのは 近傍である。そこだけなら 55 本でも 足りるが(上の表)、+10 eV まで使うなら p を入れておくほうがよい。 7 サイト × 3 = 21 本の増加で済む。
落とし穴 2 つ
(a) mlo_lm だけを絞る。[[spec]] の lmx は 2 のままにする。 DFT 計算側で の球から チャネルを削ると動径方程式が発散し lmf が落ちる:
[[spec]] の E | 結果 |
|---|---|
lmx=2, lmxa=2 | 収束 |
lmx=1, lmxa=1 | lmf rc=11。動径解が Ry へ発散 |
lmx=1, lmxa=2 | 同上 |
lmx=1, lmxa=2 + p 明示 | 同上。 Ry で q が桁あふれ |
動作する場合の空格子球の pnu は 1.509 / 2.256 / 3.150 (s/p/d) で、これを p として 与えても直らない。既知の yh3fcc_gwsc666 の暴走と同じ症状である。 DFT には s,p,d を持たせ、MLO の選択は mlo_lm で行うのが筋の通ったやり方。
(b) 真空スラブには ESM が要る。[esm] を書き忘れないこと。 真空層があると Coulomb の 成分の扱いでエネルギーのゼロ点が決まる。 [esm] が無いと lmf は通常の周期境界で解き、警告一行を出すだけで止まらない。 FeMgO では が 4.4155 eV ずれた。全エネルギー・Vesav・磁気モーメントは 8〜13 桁一致するので、Fermi エネルギーを比べるまで何も異常に見えない。
[esm]
boundary = "vac/slab/vac" # 真空(-z)/スラブ/真空(+z)
origin = -8.63717 # (a.u.)
shiftmode = 0
zb = [23.907104, -23.907104] # (a.u.)
potential = [0.0, 0.0] # (Ry)
field = [0.0, 0.0] # (Ry/a.u.)esm_input.dat は廃止した(2026-09-16)。 設定は ctrlg.<sname>.toml の [esm] セクションに書く。Fortran は ctrlg 以外を読まないので(2026-09-17)、 esm_input.dat が残っていると lmf は止まって ctrlg_absorb.py <sname> を 案内する(黙って ESM 無しで走らないように、無視ではなく abort):
| 状況 | ctrlg_absorb.py がすること |
|---|---|
ctrlg に [esm] がある | そちらが使われる。esm_input.dat は esm_input.dat.bk へ退避され、.bk の冒頭に「この設定は使われなかった」と記録される |
ctrlg に [esm] がない | esm_input.dat を変換して ctrlg に [esm] を書き込み(GW セクションの前)、原本を esm_input.dat.bk へ退避(移送先を .bk 冒頭に明記) |
Legacy2toml.py も同じ規則で変換する。詳細は ESM。
この件で長く回り道をした。同じ
rstから別の機械で別の が出るのを見て コンパイラや MPI を疑い、rst のバイナリ互換性・atmpnu・負の電荷密度・非決定性を 順に潰したが、真相は新サンプルを組み立てたときにesm_input.datを コピーし忘れていただけだった。Vesavが 13 桁一致していた時点で密度側は無実と 分かるので、SCF のログを先に diff すべきだった。
6. 有効相互作用 — job_mloW
MLO 模型でバンドが再現できたら、次に要るのはその模型の中での電子間相互作用 である。模型ハミルトニアンに載せる Hubbard 、磁気ゆらぎの計算で使う 相互作用がこれにあたる。cRPA で言う「模型空間に射影した遮蔽相互作用」で、 MLO 基底で評価するのが job_mloW である。
何を計算するか
MLO 軌道 と格子ベクトル 、振動数 について
を計算し、 と を別々のファイルに書く。オンサイト対角成分 、、 が、模型の に相当する量である。
job_mloW <sname> -np <N>lmfa → lmf → --jobgw=0/1 → qg4gw → heftet → hbasfp0 → mlo → hvccfp0 → hwmatK_MPI → hx0fp0 → hwmatK_MPI の順に回る。 MLO のバンド計算 (job_mlo) より重い — GW の部品を一通り通るためである。
出力の読み方
スピンごとに 2 ファイル。単位は eV。
| ファイル | 中身 |
|---|---|
Coulomb_v.UP / .DN | |
Screening_W-v.UP / .DN |
列は main_wannier_hwmatK.f90 の書式そのままで:
Wannier ir1 irws1 Rx Ry Rz is i j k l [omega omega2] Re ImCoulomb_v には の 2 列が無く、Screening_W-v には有る。 欲しいのは 、、 の実部で、 Samples/MLOsamples/Fe/test.py の _parse_diag() がその抜き出しの実例である。
として足し合わせる。
と は巨大に打ち消す
Fe(bcc、sp³d⁵ 9 軌道)の d 軌道、majority スピン:
| d 軌道 (lm) | (eV) | (eV) | (eV) |
|---|---|---|---|
| 5, 6, 8 (, , ) | 22.98 | −21.47 | 1.517 |
| 7, 9 (, ) | 23.06 | −21.39 | 1.678 |
eV と eV が打ち消して eV になる。 は の 7% しかない。したがって:
- や を単独で見て議論してはいけない。 模型の作り方を少し変えると どちらも 1〜2 eV 動くが、その 90% は相殺する
- の相対誤差は の相対誤差の 14 倍に増幅される。 が 1% ずれれば は 14% ずれる勘定になる
模型の作り方に はどれだけ依存するか
Fe の d 軌道、 の平均(eV):
| 模型 | (eV) | (eV) |
|---|---|---|
| method 0(旧サンプル) | 1.6684 | 1.5972 |
| method 4、(既定) | 1.5815 | 1.4248 |
| method 4、 | 1.6308 | 1.5546 |
の d 成分は method 0 → 4 で UP eV、DN 〜 eV 動くが、 上記の打ち消しで残る の変化は UP %、DN % である。 minority の d は の上にあって床 に近いので、 majority の倍ほど動く。
を上げると は戻る( で UP %、DN %)。 バンドの当たりも のほうが良い(§2)。
どの が正しいかは、ここでは決まっていない。 確かめたのは「 は模型の作り方に 10% の桁で依存する」ことだけである。 のほうがバンドの当たりは良いが、それは床より上の領域での話で、 を直接検証したわけではない。method 0 の値が に近いことも、 method 0 を基準と見なす理由にはならない。
したがって実用上は、 を使うなら 依存を自分の系で確かめること。 既定値をそのまま使って 10% を気にしないで済むかどうかは用途次第である。 サンプルは 18 系すべて既定値で統一してある。
回帰試験
Samples/MLOsamples/Fe はこの 、 のオンサイト対角 9 成分 × 2 スピンを 参照ファイルではなく test.py に直書きして照合する(許容 0.05 eV)。 模型の作り方を変えると値が動くので、変えたら期待値も更新すること。
7. 誤差の測り方 — 一方向では決まらない
定義 — 生の量をベクトルで持つ
用途によって重んじる方向が変わるので、スカラーに潰さずベクトルで持つ。 規格化も 2 乗もしない。どれくらいずれているかが直接読めるほうがよい。 実装は SRC/exec/mlo_losscheck.py。
| 量 | 意味 | 単位 |
|---|---|---|
| 窓 〜 eV(金属 eV)の rms | meV | |
| 占有側 〜 eV の rms | meV | |
| 分散(経路方向の勾配)の相対誤差 | 無次元 | |
| バンドギャップ誤差(符号付き、絶縁体のみ) | meV | |
| 比 | (絶縁体のみ) | 無次元 |
比 は比であって誤差ではない。1.00 が一致、1.18 なら MLO の質量が 18% 重い。 は対称線経路座標 についての勾配で、 の分母は窓内の第一原理側の勾配の rms。 準位の対応づけは順序を保つ最適割当(動的計画法)で、縮退・交差・バンド数の差に耐える。
を別に立てるのは、窓だけ見ていると深い価電子帯の劣化を 見落とすためである(Si は を上げると窓内はほぼ不変なのに eV が 2.5 → 10.7 meV と悪化する)。
既定値での各量
既定 eV での実測は §2 の表のとおり。特徴的なのは Si の と の差( 20.0 → 7.1 meV、 +38 → +3 meV、比 1.41 → 1.03)で、 の値は補間の雑音を含む。Si は を基準に取ること。
方向ごとの最適
固定で を振り、各量を最小にする (eV)。括弧内はそこでの値 (ΔE は meV、 と 比 は無次元):
| 系 | 窓 | 占有 | 分散 | ギャップ | m*比 |
|---|---|---|---|---|---|
| Fe (9) 金属 | 10.9 (5.2) | 10.9 (4.5) | 10.9 (0.012) | — | — |
| Cu (9) 金属 | 10.9 (8.5) | 10.9 (2.7) | 10.9 (0.027) | — | — |
| RuO₂ (22) 金属 | 1.8 (8.1) | 2.7 (9.5) | 1.8 (0.030) | — | — |
| Si (18) 絶縁 | 1.8 (5.7) | 2.7 (2.8) | 2.0 (0.005) | 2.0 (+2) | 2.7 (1.00) |
| GaAs (18) 絶縁 | 1.8 (7.4) | 2.0 (1.5) | 2.0 (0.008) | 1.4 (+1) | 2.0 (1.02) |
| Al₂O₃:Cr (50) 絶縁 | 2.0 (6.7) | 2.0 (2.2) | 2.0 (0.003) | 1.8 (+1) | 1.8 (1.03) |
| C.sp (8) 絶縁 | 2.7 (14.9) | 3.4 (2.7) | 3.4 (0.005) | 3.4 (−4) | 4.1 (0.83) |
系の中では各量がよく揃う( eV 以内)。割れるのは系をまたいだときで、 Fe・Cu の 10.9 eV と半導体の 1.8–2.7 eV は 6 倍違う。したがって系ごとの 最適化は well-posed であり、固定値一つで全系を満たすことはできない。
を大きくする極限は誤差自身が罰する
は で 、 すなわち となり 、つまり MTO 部分空間だけで対角化した限界に達する。その極限は実際に悪い:
| (eV) | 10.9 | 27 | 68 | 272 |
|---|---|---|---|---|
| Fe | 7.8 | 39.8 | 151 | 309 |
| Cu | 7.8 | 44.7 | 148 | 367 |
| Si | 546 | 1230 | 2704 | 2854 |
(広窓 〜 eV の rms、meV)
MTO だけの限界は Fe でも 309 meV ずれる。 よって「MTO に戻ってはいけない」という 制約を外から課す必要はなく、誤差が自分で上限を与える。Fe・Cu の最適 eV は 自明極限に近いからではなく、そこが有限の最適点だからである。
以下の振る舞いは系で逆を向く
第一原理バンドのエネルギーでビン分けした rms (meV):
| Fe / (eV) | |||||
|---|---|---|---|---|---|
| eV | 37.2 | 20.2 | 14.6 | 21.2 | 53.2 |
| eV | 6.6 | 4.5 | 4.1 | 3.2 | 9.9 |
| Si / (eV) | |||||
|---|---|---|---|---|---|
| eV | 2.5 | 3.6 | 4.4 | 5.2 | 4.2 |
| eV | 10.7 | 7.2 | 6.8 | 3.3 | 57.8 |
Fe は を上げると全ビンが改善するが、Si は逆で、 直下だけが少し良くなり 深い価電子帯と伝導帯が悪化する。 近傍だけを見ていると を上げたくなるが、 広く見ると損をする — を別に立てているのはこのためである。
メッシュ — 比 とギャップは粗いメッシュで決めてはいけない
eV 固定、Si。各セルは (meV) / (meV) / 比:
| (eV) | |||
|---|---|---|---|
| 1.8 | 20.7 / +50 / 1.64 | 5.6 / +3 / 1.05 | 3.7 / −5 / 0.93 |
| 2.0 | 18.3 / +39 / 1.42 | 6.8 / +2 / 1.02 | 5.8 / −3 / 0.95 |
| 2.7 | 19.4 / +25 / 1.18 | 14.8 / +5 / 1.00 | 14.3 / +3 / 0.96 |
| 4.1 | 45.3 / +50 / 1.02 | 44.6 / +40 / 0.96 | 44.4 / +38 / 0.93 |
は eV を最良と言うが / は eV と言う。 は系統的に大きい を良く見せる。 と でギャップ誤差の符号が逆( eV で / meV)なのは 打ち切りの超格子依存性なので、2 つのメッシュで一致する範囲を採る。
使い方 — 単純規則
- は宣言であって調整ノブではない。 「バンド端から上に何 eV まで 合わせたいか」を書く。評価する窓の上端と同じ値にする。既定 2.0 eV。
- 既定 eV でまず計算する。
- 残差が大きければ だけを動かす。 1 次元で足りる。実測の最適値は 半導体 2.0 eV 前後、Fe・Cu のような単原子遷移金属 11 eV、RuO₂ 1.8 eV。
- 半導体は 以上のメッシュで判断する。 は 比 とギャップに 補間の雑音が乗り、系統的に大きい を良く見せる。Si の が基準になる。
mlo_wの既定は method 依存にしてある。mlo_method = 4では 2.0 eV、 旧 method 0/1/2/3 では 2.72 eV(= 0.2 Ry の従来値)。旧 method を使う 既存サンプルの結果とその参照ファイルを変えないためで、mlo_wを明示すれば どの method でもその値が使われる。
の効きは よりはるかに弱い。 を 1→4 eV と振っても誤差の変化は 数割だが、 は Si で 1.8 eV → 4.1 eV とするだけで窓の誤差が 5.6 → 44.6 meV と 8 倍になる。動かすのは でよい。
既定を / eV から / eV に変えた根拠 (全 12 系の平均、生の誤差):
| 既定 | || | ||
|---|---|---|---|
| 旧 , eV | 16.9 meV | 11.6 meV | 16 meV |
| 新 eV | 15.0 meV | 7.4 meV | 13 meV |
効いたのは SrTiO₃ の占有側 52.9 → 5.5 meV と Al₂O₃:Cr の窓 17.5 → 7.2 meV。 悪化したのは C.sp(14.9 → 26.7 meV)で、これは を上げたい側の系である(§4)。
8. 残る問題
以下はすべて mlo_method = 4(§1 の最終形)で測り直したもの。
解決済み
Al₂O₃:Cr のギャップ — 付録 D (c) の実装で −128 → +7 meV( 比 0.58 → 1.08)。-
FeMgO をサンプルに入れるのは保留 — 機械依存が残っているため。解決した(2026-09-15)。機械依存ではなく、私がesm_input.datを 新サンプルFeMgO_ESにコピーし忘れていただけだった。FeMgO は真空層 30.5 a.u. を持つスラブなので、既存の
Samples/MLOsamples/FeMgO/には 2 月からesm_input.dat(ESM = Effective Screening Medium)が入っている。 そこからFeMgO_ESを組み立てたときにこれを落とした。 ファイルが無いとlmfは静電ポテンシャルを通常の周期境界で解き、 ログに一行出すだけで停止しない:ローカル: esmsmves: ESM is not turned on, you need esm_input.dat for ESM mode kt1 : effective screening medium method jesm= 1 system : vaccum(-z)/slab/vaccum(+z)真空を含むスラブでは Coulomb の 成分の扱いがエネルギーのゼロ点を決めるので、 ESM の有無で固有値が丸ごとずれる。実測:
量 ローカル(ESM なし) ローカル(ESM あり) kt1 (Ry) mmom 8.419083 8.4130803741493 8.4130803741352 sev (eV) val*vef(Ry)esm_input.datを置くだけで は 12 桁一致する。 バンドそのものも kt1 と一致する(bnd001、4563 点):最大差 rms spin1 eV eV spin2 eV eV testecaljの許容値 0.001 eV に対して 5 桁の余裕がある。機械依存は無い。 失敗の仕方が悪い:esmsmves.f90:44のopen(...,status='old',err=201)はファイルが無いとjesm=0のまま一行書いてreturnし、 異常終了しない。真空スラブの計算が黙って別物になる。ずれ幅は Ry eV で、これは以前 「 が に比例して Ry ずれる」と測っていた量そのものである。
その後の措置(2026-09-16)
esm_input.datを廃止し、ctrlg.<sname>.tomlの[esm]セクションへ移した。 当初は Fortran がその場で移行していたが、翌 09-17 に「Fortran は ctrlg 以外を 読まない」に統一: ファイルが残っていれば abort してctrlg_absorb.pyを案内する。 変換はctrlg_absorb.py/Legacy2toml.pyが行い、[esm]が既に有ればそちらを 残し、無ければ変換して ctrlg に説明付きで書く。原本はどちらの場合もesm_input.dat.bkへ移し、冒頭に移送先(または「TOML 側が使われた」)を書く。 なのに[esm]が無ければ警告も出す。FeMgOSocも同じ病気だった。FeMgOとctrlgもrst.femgoも バイト一致の同じスラブなのにesm_input.datが置かれておらず、 が Ry(ESM 無し)対 Ry(ESM 有り)、 差 eV。ESM で収束させたrstを ESM 無しで展開した参照になっていた。サンプルを空格子球ありの 55 軌道模型に一本化した。 空格子球なしの旧 78 軌道模型(
mlo_method=0,mlo_emax=5)は削除し、FeMgOもFeMgOSocも入力一式を共有する形にした。ローカルで実測:軌道数 dE_win dE_occ dv/v 旧(空格子球なし) 78 113.3 meV 7.7 meV 0.270 新(空格子球あり) 55 3.1 meV 0.6 meV 0.008 旧模型は全サンプル中で最悪だった。テストが通っていたのは自分の参照を 再現していただけで、模型の精度とは別である。 空格子球ありでも
job_mlo_socの 3 段は問題なく通り、 SOC の は Ry(非 SOC から 3.1 meV シフト)。その過程で
readbandedgeの黙ったフォールバックが見つかった。efermi.lmfが無いとecbotが に落ちるので、method 4 の床が ではなく になる。 FeMgO では eV の差が θ を通って MLO バンドを meV 動かし、許容値 Ry を超えた。 警告を出すようにし、サンプルにefermi.lmfを同梱した。 絶縁体ならギャップ幅ぶん丸ごと外すので、これは実害のある穴だった。
切り分けに時間をかけすぎた。 rst のバイナリ互換性、
atmpnu/__atm、 負の密度の警告、非決定性 — どれも潰したが、どれも無実だった。Vesavが 13 桁一致していた時点で密度側は無実と分かるので、llmf_ef(SCF/band 1 段目の出力)を先に diff すべきだった。 一行でESM is not turned onと書いてある。 「空格子球が引き金」という見立ても誤りで、引き金はesm_input.datの有無だけ。Cu (spd) の残差 — 実体は無く、評価側の産物が 2 つ重なっていた。
- eV の窓に入るのは 92 k 点中 21 点だけ。Cu の d バンドは全て eV より下にあり、窓に居るのは急峻な sp バンドだけである。 誤差は局所傾き 10–14 eV/x の点に集中し、傾き eV/x に限ると rms は 0.051 → 0.017 eV と他系並みになる。傾き 13 eV/x のバンドでの 0.05 eV は経路座標で 0.004 のずれにすぎない。
- 「ギャップ誤差 meV」は、第一原理側の最大占有 eV と最小非占有 eV の 差 0.1995 eV が判定閾値 0.15 eV を超え、Cu を絶縁体と誤判定したもの。Cu は金属。 判定を「占有本数が によらず一定か」に変えて修正済み (Cu 5/6、Fe 5–9、RuO₂ 18–21 に対し Si/GaAs/Al₂O₃/NiO は一定)。
生きている
固定 では半導体と金属を同時に満たせない。 §3 のとおり最適 は 半導体 0.13–0.20、Fe・Cu 0.80 と 6 倍違い、どちらも有限の最適点である。 系ごとの最適化は well-posed だが、固定値一つで全系は満たせない。 既定を から半導体寄りの に下げる余地はある(未変更。 変更すると testecalj の MLO 参照ファイルの再生成が要る)。
Si の の は信用できない。 でギャップ +25 meV・ 1.18、 で +5 meV・1.00(§2)。振れは補間の雑音であり模型の欠陥ではない。 パラメータ調整を の で行ってはいけない(§3 のメッシュの項)。
使ってはいけない指標(記録)
検討の途中で eV の rms を使っていたが、ワイドギャップ系では無効だった。 バンドファイルの零点が VBM に取られるため が価電子帯上端付近に来て、 価電子側しか見ない。C.sp で を 0.20 → 0.80 と広げると は 0.0064 → 0.0170 と鈍い一方、ギャップ誤差は → meV と暴走する。 現在の測り方(§3)はこの指標を使っていない。
経緯(記録)
この方法に至るまでの経緯 — 5 つの mlo_method が実は同じ一本の式だったこと、 原本サンプルが何をしていたか、床を に置いた中間段階、 最終形に至る 3 つの設計判断の実測根拠、および途中で見つかった評価器と m_hreduction.f90 のバグ — は別頁にまとめてある:
本文の結論を読むだけなら不要だが、なぜこの式なのかを疑うときはそちらを見よ。






