MC-03 磁化
このチュートリアルでは、2 つの形状——1 次元鎖と 2 本足梯子——における ハイゼンベルク模型の磁化曲線 を調べます。
looper QMC コードは磁場中では性能が良くないため、代わりに有向ループ SSE アプリケーション dirloop_sse を使用します。
この 2 つの形状は、定性的に異なる磁化曲線を与えます。 ハイゼンベルク鎖はギャップレスであり、磁場をかけた途端に磁化が から滑らかに立ち上がります。 2 本足梯子はスピンギャップ を持ち、 では磁化は厳密にゼロのままで、有限の臨界磁場に達して初めて立ち上がるため、 に特徴的なプラトーが現れます。
1 次元ハイゼンベルク鎖
20 サイトの 反強磁性ハイゼンベルク鎖を、温度 、磁場 の範囲でシミュレートします。 温度は十分に低いため、結果は基底状態の磁化曲線に近くなります。
コマンドラインでの設定と実行
パラメータファイル parm3a:
LATTICE="chain lattice"
MODEL="spin"
local_S=1/2
L=20
J=1
T=0.08
THERMALIZATION=2000
SWEEPS=10000
{h=0;}
{h=0.1;}
{h=0.2;}
{h=0.3;}
{h=0.4;}
{h=0.5;}
{h=0.6;}
{h=0.7;}
{h=0.8;}
{h=0.9;}
{h=1.0;}
{h=1.2;}
{h=1.4;}
{h=1.6;}
{h=1.8;}
{h=2.0;}
{h=2.2;}
{h=2.4;}
{h=2.5;}SSE コードを使って変換・実行します。
parameter2xml parm3a
dirloop_sse --Tmin 10 --write-xml parm3a.in.xmlPython での設定と実行
スクリプト tutorial3a.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for h in [0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.5]:
parms.append(
{
'LATTICE' : "chain lattice",
'MODEL' : "spin",
'local_S' : 0.5,
'T' : 0.08,
'J' : 1,
'THERMALIZATION' : 1000,
'SWEEPS' : 20000,
'L' : 20,
'h' : h
}
)
input_file = pyalps.writeInputFiles('parm3a', parms)
pyalps.runApplication('dirloop_sse', input_file, Tmin=5)評価と作図
磁化密度を読み込み、磁場の関数としてプロットします。
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm3a'), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density')
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.title('Quantum Heisenberg chain')
plt.show()磁化はゼロから連続的に立ち上がり、飽和磁場 で飽和値 に達します。
1 次元ハイゼンベルク梯子
2 本足梯子では、2 本の鎖をつなぐラング結合 が加わります。 ここでは 20 本のラング(合計 40 サイト)を用い、飽和に達するように磁場の範囲を まで広げます。
コマンドラインでの設定と実行
パラメータファイル parm3b は parm3a と同じ構成で、次の点が異なります。
LATTICE="ladder"
MODEL="spin"
local_S=1/2
L=20
J0=1
J1=1
T=0.08
THERMALIZATION=2000
SWEEPS=10000
{h=0;}
{h=0.2;}
{h=0.4;}
{h=0.6;}
{h=0.8;}
{h=1.0;}
{h=1.2;}
{h=1.4;}
{h=1.6;}
{h=1.8;}
{h=2.0;}
{h=2.2;}
{h=2.4;}
{h=2.6;}
{h=2.8;}
{h=3.0;}
{h=3.2;}
{h=3.4;}
{h=3.5;}parameter2xml parm3b
dirloop_sse --Tmin 10 --write-xml parm3b.in.xmlPython での設定と実行
スクリプト tutorial3b.py は tutorial3a.py を書き換えたものです。接頭辞を parm3b に変え、LATTICE を "ladder" に変更し、J を J0=J1=1 に置き換え、磁場の走査範囲を 3.5 まで広げます。
評価と作図
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm3b'), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density')
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.title('Quantum Heisenberg ladder')
plt.show()鎖とは対照的に、梯子の磁化は有限の下部臨界磁場 に達するまでゼロのままです。これはスピンギャップを反映しており、その後 で飽和に向かって立ち上がります。
2 つのシミュレーションの統合
同じフォルダで両方のシミュレーションを実行したあと、スクリプト tutorial3full.py が 2 本の磁化曲線を 1 枚の図に重ねて表示します。
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
data = pyalps.loadMeasurements(pyalps.getResultFiles(), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density', foreach=['LATTICE'])
for m in magnetization:
if m.props['LATTICE'] == 'chain lattice':
m.props['label'] = 'chain'
elif m.props['LATTICE'] == 'ladder':
m.props['label'] = 'ladder'
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.legend()
plt.title('Quantum Heisenberg models')
plt.show()2 つを重ねて表示すると、ギャップレスな鎖とギャップを持つ梯子との対比が一目で分かります。

問題
- 鎖の磁化はどの磁場から立ち上がり始めますか。このことは鎖のスピンギャップについて何を示していますか。
- 得られたデータから梯子の下部臨界磁場 を見積もってください。既知のスピンギャップ と比べてどうでしょうか。
- どちらの模型も で飽和します。それぞれどの磁場で飽和し、なぜ飽和磁場は異なるのでしょうか。
- より高い温度、たとえば でシミュレーションを繰り返してください。熱ゆらぎは磁化曲線に現れる特徴の鋭さにどう影響しますか。
- (発展)幅を表す
Wパラメータを加えて 3 本足や 4 本足の梯子を試したり、local_Sを変えてスピン 1 やスピン 3/2 の鎖を調べたりしてみてください。臨界磁場に系統的な規則性はありますか。