PFAPACKの実行例 (2018.6.17)
Last Update:2021/12/09
パフィアン(Pfaffian)は行列式の平方根に対応する量であり、物性物理でも様々な場面で現れることが知られています(日本語の解説として最近の物理学会誌の記事があります)。例えば、スレーター行列式の拡張であるジェミナル波動関数と実空間配置との内積がパフィアンになることが知られています(J.P. Bouchaud et al., 1988)。また、固体のバンド構造のトポロジカル指数(Z2 index)を求めるさいにパフィアンが現れことも知られています(Kane-Mele 2005)。行列式に比べて、パフィアンを計算するルーチンは現段階ではそこまで多くなく、PFAPACKがほとんど唯一のルーチンです。PFAPACKはfortran, matlab, mathmatica, python, C言語用のインタフェースが用意されており、ユーザーは必要に応じて、言語を選択することができます。ここでは物性研スパコン(システムB, sekirei)でpythonでパフィアンを計算した例について紹介します。
1.ダウンロード
wget http://wwwhome.lorentz.leidenuniv.nl/%7Ewimmer/pfapack.tgz
tar -xvf pfapack.tgz
これで pfapackというディレクトリができます。
2. pythonの準備
numpy,scipyを使う必要があるので、
物性研で用意しているpythonの環境を使用します。
source /home/issp/materiapps/tool/env.sh
とうてば、必要な環境が設定されます。
3. テストスクリプト
まず、pythonのスクリプトがおいてあるディレクトリに
移動します。
cd ./pfapack/python
テストとして、4×4の反対称行列のパフィアンを求める
スクリプトは以下のようになります(test.py).
import pfaffian as pf
import numpy.linalg
import numpy.matlib
A = numpy.zeros((4,4))
A[0][1] = 1
A[0][2] = 2
A[0][3] = 3
A[1][2] = 4
A[1][3] = 5
A[2][3] = 6
A = A-A.T #anti-symmetrized
print(A)
pfa1 = pf.pfaffian(A)
pfa2 = pf.pfaffian(A, method=’H’)
pfa3 = pf.pfaffian_schur(A)
deta = numpy.linalg.det(A) #determinant
print(pfa1,pfa2,pfa3,deta)
これを実行すると、
python test.py
[[ 0. 1. 2. 3.]
[-1. 0. 4. 5.]
[-2. -4. 0. 6.]
[-3. -5. -6. 0.]]
のパフィアンが8であることを確認できると思います
(行列式が64になっているのも確認できます。)。
4×4のパフィアンの明示的な定義は
Pf(A) = a01a23-a02a13+a03a12
で与えらるので、
Pf(A)=1*6-2*5+3*4=8となります。
4.まとめ
(反対称)行列Aを適切に定義して、
pf.pfaffian(A)
とするだけでパフィアンが計算できますので、
非常に便利なアプリとなっています。
fortranやcのインタフェースも用意されていますので、
大規模数値計算にすぐに使用することもできます。