Hitoshi GOMI's webpage

AkaiKKRのインストール

AkaiKKR(machikaneyama)は、東京大学物性研の赤井 久純先生らによって開発されている第一原理計算パッケージです。 全電子法の1種である Korringa-Kohn-Rostoker (KKR) 法を採用しており coherent potential approximation (CPA) を組み合わせることにより化学的な不規則(不純物、不規則合金、固溶体)・磁気的な不規則(キュリー温度における強磁性体)などのバンド構造を計算することが可能です。

この文章ではAkaiKKR(machikaneyama)(September 10, 2020)を Ubuntu 20.04 にインストールする方法を書きます。 Virtual Box 上で、クリーンインストールをした Ubuntu 20.04 を用いて動作することを確認しました。 以降、グレーの背景で示された部分は、端末に入力するコマンドを表しています。 また、ベージュの背景は、テキストエディタなどで開いたファイルの中身を表しています。

グレーの小さい文字で書かれた部分は、本質的でないメモです。 基本的には読み飛ばして大丈夫です。

前準備

まず、なにはともあれ諸々のアップデートをしておきます。ターミナルに以下を打ち込んで、アップデートと再起動をしておきます。

sudo apt update && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo reboot

AkaiKKR をインストールするために必要なパッケージを導入します。 具体的には fortran コンパイラと make と gnuplot の3つです。

sudo apt -y install gfortran build-essential gnuplot

fortran コンパイラは、有料の Intel fortran compiler (ifort) と無料の gfortran の2つの選択肢がありますが、今回は gfortran を利用します。 大学の研究者が一番安く購入できる ifort は、XLSOFTのページで確認すると税込み¥84,700の「INT7272 インテル Parallel Studio XE 2020 Composer Edition for Fortran Linux アカデミック 日本語版」であろうと思います。 赤井先生は ifort で開発をされているはずなので、予算に余裕があるなら ifort を選ぶメリットはあるかもしれません。
build-essential を指定すると他の色々なパッケージとともに make が導入されます。 別に make だけでも良いのだとは思いますが、他のDFTパッケージをインストールするならばどうせ必要になるので。
gnuplot は有名なグラフ描画アプリです。AkaiKKR パッケージの中で状態密度やバンド分散を描画するための実行ファイルである gpd や spc から呼ばれるのでインストールしておきます。

AkaiKKRのメインプログラムのインストール

AkaiKKR(machikaneyama)のソースコードの入手をします。 初めての利用の場合は登録フォームに必要事項を記入しアカウントの作成をする必要があります。 しばらくすると、登録したメールアドレスにパスワードが送られてくるのでダウンロードページにログインします。 基本的には最新版をダウンロードすればよいと思います。この文章の執筆時点では September 10, 2020 が最新版です。 ダウンロードしたアーカイブは(別にどこでも構いませんが) ~/Downloads/AkaiKKR/20200910/cpa2002v010.tgz に置いてください。

AkaiKKR のバージョンは、公開された日付で区別されています。 マイナーアップデートのように見えて挙動が大きく変わることもあるので、アップデートするときには古いバージョンを残しておく方が良いです。この文章でも日付のバージョンごとに異なるディレクトリにインストールする前提で話を進めます。

次に AkaiKKR をインストールするディレクトリを用意します。 今回は September 10, 2020 なので ~/kkr/20200910/cpa2002v010/ にインストールすることにします。

mkdir ~/kkr
mkdir ~/kkr/20200910
cd ~/kkr/20200910
tar xzvf ~/Downloads/AkaiKKR/20200910/cpa2002v010.tgz
cd cpa2002v010/

AkaiKKR をコンパイルするための設定が書かれている makefile の編集を行います。 編集には使い慣れているテキストエディタを使ってください。emacs でも vim でも。 下の例では gedit を使っています。

gedit makefile

makefile の13行目から17行目にかけて fortran コンパイラーに Intel fortran Compiler を使うか gfortran を使うのかを指定する箇所があります。 今回は gfortran を使うので ifort が指定されている15行目をコメントアウト(行頭に#を追加)し、代わりに16行目の#を削除し、上書き保存します。

#######################################
# specify the fortran compiler
#fort = ifort
fort = gfortran
#######################################

ターミナルに戻って make とタイプすると AkaiKKR のメインプログラムのコンパイルが始まります。 コンパイルに成功すると specx という名前の実行ファイルが生成されるはずです。

make

この文章の執筆時点では gfortran でコンパイルすると大量の warning 出力されてびっくりしますが、生成された実行ファイルには問題はないようです。

なお、何らかの理由で AkaiKKR のプログラムを編集したい場合は、ここで編集しておきます。 興味がない場合は、次のテスト計算(go計算)へ進んで大丈夫です。 ここでは、一例としてAkaiKKRのk点メッシュ を参考にして、k点の分割メッシュを出力できるようにします。 まず該当するソースコードを編集します。今回の場合は source/bzmesh.f です。

gedit source/bzmesh.f

ファイルの一番最後が end で終わっているので、その前の行に write(*,'(3x,3(a,i3))')'nfa=',nfa,' nfb=',nfb,' nfc=',nfc という行を追加します。 以下は編集前の最後の3行です。

   80 continue
      deallocate(iwt)
      end

これに1行追加して、以下のようになります。

   80 continue
      deallocate(iwt)
      write(*,'(3x,3(a,i3))')'nfa=',nfa,'  nfb=',nfb,'  nfc=',nfc
      end

ソースコードの編集が終わったら再び make を行います。

make

この make コマンドは、前回 make を実行して以降、編集したソースコードだけをコンパイルして実行ファイルを作ってくれます。

テスト計算(go計算)

in/ ディレクトリに色々な物質の入力ファイルのサンプルがあります。 ここでは鉄の計算を行ってみましょう。 テキストエディタで in/fe を開いてみると以下のようになっているはずです。

gedit in/fe
c----------------------Fe------------------------------------
    go   data/fe
c------------------------------------------------------------
c   brvtyp     a        c/a   b/a   alpha   beta   gamma
    bcc        5.27  ,        ,      ,      ,       ,      ,
c------------------------------------------------------------
c   edelt    ewidth    reltyp   sdftyp   magtyp   record
    0.001     1.0       nrl    mjwasa   mag      2nd
c------------------------------------------------------------
c   outtyp    bzqlty   maxitr   pmix
    update     8        100   0.035
c------------------------------------------------------------
c    ntyp
     1
c------------------------------------------------------------
c   type    ncmp    rmt    field   mxl  anclr   conc
    Fe       1       0      0.0     2     26    100
c------------------------------------------------------------
c   natm
     1
c------------------------------------------------------------
c   atmicx(in the unit of a)     atmtyp
     0         0          0        Fe
c
c------ The following types of inputs and their combination
c       are also allowed.
c------ In those cases a, b, b mean primitive unit vectors
c       and x, y, z mean conventionnal cell vectors along
c       x, y, and z axses. Bare numbers indicate cartesian
c       coordinate in the unit of lattice constant a.
c    1/2       1/2        1/2      Fe
c    0a        0b         0c       Fe
c    0x        0y         0z       Fe
c    1/2a      1/2b       1/2c     Fe
c------------------------------------------------------------
c  "end" means the end of input data
c  "end" is not necessary unless other data used only
c   for "spc" exist below.
c----------------------Fe------------------------------------
#end
# The following data are used in the 'spc' mode.
# number of k-point along symmetry line
 300
# For bcc bravais lattice, the dispersion relation along
# G-H-N-P-G-N symmetry points (below) is usually calculated.
 0 0 0
 0 1 0
 1/2 1/2 0
 1/2 1/2 1/2
 0 0 0
 1/2 1/2 0

入力ファイルの中身を確認したら、これを specx 実行ファイルに与えて計算を行います。

./specx < in/fe | tee out/fe

< は後ろのファイルを前の実行ファイルに与えるという意味です。 今回の例では in/fe を ./specx に与えています。 単純に ./specx < in/fe とすれば、実行結果が標準出力(要するに画面)に表示されます。 結果をファイルに残しておきたい場合 ./specx < in/fe > out/fe とすれば良いのですが、今度は画面上に表示されなくなります。 > の代わりに | tee を利用すると、結果を画面に表示しつつファイルにも保存することが可能になります。

以下のような結果が得られていれば成功です。

 19-Dec-2020
    18:36:03
    meshr   mse    ng   mxl
      400    35    15     3



   data read in
   go=go   file=data/fe
   brvtyp=bcc     a=  5.27000  c/a= 0.00000  b/a= 0.00000
   alpha=  0.0  beta=  0.0  gamma=  0.0
   edelt= 1.0E-03  ewidth=  1.000  reltyp=nrl    sdftyp=mjwasa
   magtyp=mag    record=2nd   outtyp=update  bzqlty=8
   maxitr=100  pmix= 0.03500  mixtyp=tchb-brydn
   ntyp=  1  natm=  1  ncmpx=  1
	    
	    ~ (中略) ~
	    
 sbtime report
  routine           1         2         3         4
  count           280       280       280        70
  cpu(sec)      16.73      6.80      4.11      0.10

 total cpu           10.30 sec
 elapsed time         2.83 sec (  4 threads)

状態密度・バンド構造描画用プログラムのインストール

次に状態密度やバンド構造の計算を行う事を考えます。 既に状態密度やバンド構造を計算することが可能ですが、その前にその計算結果をプロットするための補助プログラムをインストールしておいた方が良いでしょう。 具体的には、以下のように端末に打ち込みます。

make spc gpd

状態密度の計算

状態密度の計算を行います。 状態密度やバンド構造の計算を行う場合、その前にgo計算を行っておく必要があります。 状態密度計算用の入力ファイルを作るために、まずgo計算の入力ファイルをコピーし、コピー後のファイルを編集します。

cp in/fe in/fe-dos
gedit in/fe-dos

絶対に必要なのは、入力ファイルの冒頭の godos に変更するだけです。 ただ実際には bzqlty の値を大きくした方が見栄えが良くなります。 今回は bzqlty の値を 12 にしてみます。 結果として入力ファイルは以下のようになります。

c----------------------Fe------------------------------------
    dos   data/fe
c------------------------------------------------------------
c   brvtyp     a        c/a   b/a   alpha   beta   gamma
    bcc        5.27  ,        ,      ,      ,       ,      ,
c------------------------------------------------------------
c   edelt    ewidth    reltyp   sdftyp   magtyp   record
    0.001     1.0       nrl    mjwasa   mag      2nd
c------------------------------------------------------------
c   outtyp    bzqlty   maxitr   pmix
    update     12        100   0.035
c------------------------------------------------------------
c    ntyp
     1
c------------------------------------------------------------
c   type    ncmp    rmt    field   mxl  anclr   conc
    Fe       1       0      0.0     2     26    100
c------------------------------------------------------------
c   natm
     1
c------------------------------------------------------------
c   atmicx(in the unit of a)     atmtyp
     0         0          0        Fe
c
c------ The following types of inputs and their combination
c       are also allowed.
c------ In those cases a, b, b mean primitive unit vectors
c       and x, y, z mean conventionnal cell vectors along
c       x, y, and z axses. Bare numbers indicate cartesian
c       coordinate in the unit of lattice constant a.
c    1/2       1/2        1/2      Fe
c    0a        0b         0c       Fe
c    0x        0y         0z       Fe
c    1/2a      1/2b       1/2c     Fe
c------------------------------------------------------------
c  "end" means the end of input data
c  "end" is not necessary unless other data used only
c   for "spc" exist below.
c----------------------Fe------------------------------------
#end
# The following data are used in the 'spc' mode.
# number of k-point along symmetry line
 300
# For bcc bravais lattice, the dispersion relation along
# G-H-N-P-G-N symmetry points (below) is usually calculated.
 0 0 0
 0 1 0
 1/2 1/2 0
 1/2 1/2 1/2
 0 0 0
 1/2 1/2 0

go 計算を行ったときと同様に specx プログラムに入力ファイルを渡します。

./specx < in/fe-dos | tee out/fe-dos

go 計算のときのように、ずらずらと結果が出力されると思います。 この結果を格納した out/fe-dos を状態密度プロット用のプログラムである gpd へ渡します。

./gpd out/fe-dos

この gpd プログラムにファイルを渡すときには、リダイレクトの < を付けてはいけません。 間違って付けると、グラフを描画してくれず Usage: gpd file と怒られます。 私もよく間違えます…

すると以下のようなグラフが描画されるはずです。

バンド構造の計算

次にバンド構造の計算を行ってみます。 これも状態密度の計算とほぼ同じ手順で、バンド構造計算用の入力ファイルの作成、specx の実行、spc コマンドでの描画、という手続きを踏みます。

cp in/fe in/fe-spc
gedit in/fe-spc

編集個所は gospc に変更する事、そしてファイルの最後に計算するk点のパスを追加することです。 とは言え、鉄の計算はチュートリアルなのでk点のパスもすでに書き込んであります。 結局、入力ファイルは以下のようになりました。

c----------------------Fe------------------------------------
    spc   data/fe
c------------------------------------------------------------
c   brvtyp     a        c/a   b/a   alpha   beta   gamma
    bcc        5.27  ,        ,      ,      ,       ,      ,
c------------------------------------------------------------
c   edelt    ewidth    reltyp   sdftyp   magtyp   record
    0.001     1.0       nrl    mjwasa   mag      2nd
c------------------------------------------------------------
c   outtyp    bzqlty   maxitr   pmix
    update     8        100   0.035
c------------------------------------------------------------
c    ntyp
     1
c------------------------------------------------------------
c   type    ncmp    rmt    field   mxl  anclr   conc
    Fe       1       0      0.0     2     26    100
c------------------------------------------------------------
c   natm
     1
c------------------------------------------------------------
c   atmicx(in the unit of a)     atmtyp
     0         0          0        Fe
c
c------ The following types of inputs and their combination
c       are also allowed.
c------ In those cases a, b, b mean primitive unit vectors
c       and x, y, z mean conventionnal cell vectors along
c       x, y, and z axses. Bare numbers indicate cartesian
c       coordinate in the unit of lattice constant a.
c    1/2       1/2        1/2      Fe
c    0a        0b         0c       Fe
c    0x        0y         0z       Fe
c    1/2a      1/2b       1/2c     Fe
c------------------------------------------------------------
c  "end" means the end of input data
c  "end" is not necessary unless other data used only
c   for "spc" exist below.
c----------------------Fe------------------------------------
#end
# The following data are used in the 'spc' mode.
# number of k-point along symmetry line
 300
# For bcc bravais lattice, the dispersion relation along
# G-H-N-P-G-N symmetry points (below) is usually calculated.
 0 0 0
 0 1 0
 1/2 1/2 0
 1/2 1/2 1/2
 0 0 0
 1/2 1/2 0

以下のコマンドで specx に入力ファイルを渡します。

./specx < in/fe-spc | tee out/fe-spc

gfortran でコンパイルしている場合、Error termination. Backtrace: とかいうエラーが出てびっくりしますが、実際には正しく計算できています。 また、バンド構造の計算結果は data/fe_up.spcdata/fe_dn.spc に保存され、ターミナルに表示させた情報はあまり有用ではないので out/fe-spc に保存する意味は薄いかもしれません。 なので ./specx < in/fe-spc として出力を捨ててしまってもかまいません。

計算が完了したら、バンド構造描画用プログラム spc に、バンド構造のデータを渡します。 アップスピンのデータは data/fe_up.spc に格納されているので、以下のようにターミナルに打ち込みます。

./spc data/fe_up.spc

すると以下のような画像が表示されるはずです。

なお、go 計算や dos に関しても当てはまるのですが、AkaiKKR はアップスピンとダウンスピンが逆になっていることがしばしばあります。

同様に ./spc data/fe_dn.spc とするとダウンスピンのバンド構造が描画されます。

以上で AkaiKKR のインストールとテスト計算は完了です。

パスの設定

ここまでで AkaiKKR が問題なく実行できるようになっています。 しかし、計算プロジェクトごとにディレクトリを作るなどしたときに AkaiKKR の実行ファイルにパスが通っていると便利です。

色々な流儀があると思いますが、ここでは最新版に対してリンクを作っておいて、そのリンクにパスを通すという(ちょっとめんどくさい)事をしています。そんなめんどくさいことしなくてもよかったかも…

まず AkaiKKR の最新版が入っているディレクトリにリンクを作成します。

ln -s ~/kkr/20200910/cpa2002v010/ ~/kkr/cpa2002v010

次に ~/.bashrc を編集して、上記のリンクにパスを通します。

gedit ~/.bashrc
## *** AkaiKKR ***
export PATH=~/kkr/cpa2002v010:$PATH

編集した ~/.bashrc を有効化するのを忘れずに。 以下のコマンドを実行するか、いったんログアウトしてログインしなおせば有効化されます。

source ~/.bashrc

アップデート

バージョンごとにディレクトリを作ることにしているので、新しいバージョンに入れ替えたいときにもやることは同じです。 ここでは November 24, 2021 バージョンをインストールし、リンクを作り直す手順を書きます。 やっていることは上と同じなので、特に解説はつけません。 新しいバージョンの AkaiKKR は既にダウンロード済みで ~/Downloads/AkaiKKR/20211124/cpa2002v010.tgz にアーカイブが置いてあるものとします。

mkdir ~/kkr/20211124
cd ~/kkr/20211124
tar xzvf ~/Downloads/AkaiKKR/20211124/cpa2002v010.tgz
cd cpa2002v010/

makefile を編集して gfortran でコンパイルする設定にします。

gedit makefile
#######################################
# specify the fortran compiler
#fort = ifort
fort = gfortran
#######################################

他にも編集したい部分があれば、それも編集します。 ここでは、一例として source/bzmesh.f の end の前に write(*,'(3x,3(a,i3))')'nfa=',nfa,' nfb=',nfb,' nfc=',nfc を追加します。

gedit source/bzmesh.f
   80 continue
      deallocate(iwt)
      write(*,'(3x,3(a,i3))')'nfa=',nfa,'  nfb=',nfb,'  nfc=',nfc
      end
make
make gpd spc
rm ~/kkr/cpa2002v010
ln -s ~/kkr/20211124/cpa2002v010/ ~/kkr/cpa2002v010

フェルミ面の断面描画

バンド構造(ブロッホスペクトル関数)計算の応用でフェルミ面の断面の描画ができます。 このパートは標準的な AkaiKKR のインストール手順からは大きく外れているので、ある程度以上 AkaiKKR の使い方に慣れてからチャレンジするのが良いと思います。

まずは、フェルミ面の断面描画用の実行ファイルを作成する必要があります。 とりあえず、普段使いの specx をバックアップしておきます。

cd ~/kkr/20200910/cpa2002v010/
mv specx specx.back

AkaiKKRの source ディレクトリにある3つのソースコードを編集します。 まずは source/specx.f を開いて67行目ぐらいにある msex の値を 201 から 2 に変更します。

gedit source/specx.f
      data ef0/7d-1/, dex/5d-2/, emxr/1d0/, msex/2/,mse0/35/

msex は状態密度やバンド構造を計算する際の分解能です。 今回はフェルミ面の断面の描画なので、フェルミ準位近傍の計算だけすればよいという事で2点だけ計算する設定にしてあります。

つぎに source/cemesr.f の17行目ぐらいにある data ref/0.75d0/ を 0.75 から 0.5 に変更します。

gedit source/cemesr.f
      data ref/0.5d0/

このパラメータは、状態密度やバンド構造を計算する際のフェルミ準位の上下のエネルギー範囲の割合を決めています。デフォルトの値である0.75にしておくと、計算するエネルギー範囲に対して4分の3がフェルミ準位の下に、4分の1がフェルミ準位の上になるようになっています。 0.5 にすると計算するエネルギー範囲の真ん中にフェルミ準位が来るようになります。

最後に source/spmain.f の493-494行目ぐらいにある irdfmtiwrtfmt の値を両方とも 3 から 1 に変更します。

gedit source/spmain.f
      irdfmt=1
      iwrfmt=1

これら二つのパラメータは バンド構造計算(spc計算)の入出力のフォーマットを指定しています。古いバージョンの AkaiKKR では、現在の irdfmt=1, iwrtfmt=1 のフォーマットしかなかったのですが、バンド構造描画プログラム spc が追加されてから、よりバンド構造描画に適した、特徴的なk点のパスを通るような指定がやりやすいフォーマットがデフォルトになりました。 今回は、計算したいk点空間の平面をサンプリングするので、任意のk点を指定できる古いフォーマットの方が適しています。

これら3つのファイルの編集を行ったら make を実行して、新しい実行ファイルを作成します。

make

無事 specx が出来たら specxFS (など)に名前を変更して、バックアップしておいた specx を元に戻します。

mv specx specxFS
mv specx.back specx

また編集した3つのソースコードも元に戻しておいた方がいいでしょう。 これでフェルミ面の断面を描画するための AkaiKKR の実行ファイルが出来ました。

次にフェルミ面の断面描画のサンプルを見てみます。 このサンプルは GitLab で公開されている tcsh のシェルスクリプトで、内部で sed と awk を利用しています。 必要なパッケージを導入したのち、スクリプト本体を git を用いてダウンロードしてきます。

sudo apt -y install tcsh sed gawk git
git clone https://gitlab.com/HitoshiGomi/cross-section-of-fermi-surface-for-akaikkr.git
cd cross-section-of-fermi-surface-for-akaikkr/NaWO3/

なにはともあれ go 計算を行います。 in/NaWO3.in には go 計算と dos 計算の両方の計算をするように書かれているので状態密度も計算されます。

dos 計算用の bzqlty を少し大きく取りすぎた気もします。 Virtual Box 上で動かしているなど、メモリが少ない環境の場合は bzqlty を下げてもかまいません。

specx < in/NaWO3.in | tee out/NaWO3.out

go計算とdos計算が正しくできていれば、上記の様な状態密度が得られるはずです。 ここまではフェルミ面の断面描画とは無関係に実行できるはずの部分です。

次に、このパートで新しくコンパイルした specxFS を試してみます。 入力ファイルは in/NaWO3-Gamma.in です。 この入力ファイルでは、Γ点のブロッホスペクトル関数をフェルミ準位近傍だけで計算します。

specxFS < in/NaWO3-Gamma.in | tee out/NaWO3-Gamma.out

計算が正しく終了すると data/NaWO3_up.spc というファイルができているはずです。 このファイルの中身は以下のような感じになっているはずです。

#  A(E,k) for spin = 1

       0.0000000      0.0010000      0.2749075

上記の場合はΓ点だけの計算なので1行しかありません。 ここまでうまくいっていれば、次にシェルスクリプトを実行します。 このシェルスクリプトの実行には、相当な時間がかかります。

chmod +x NaWO3-FS.sh
./NaWO3-FS.sh

シェルスクリプトを実行すると specxFS が存在しないというエラーが出ることがあるようです。 その場合 NaWO3.sh の中の execfs という変数に specxFS のフルパスを入れてみてください。

gedit NaWO3.sh
## Execute file name
#set execfs="specxFS"
set execfs="~/kkr/20200910/cpa2002v010/specxFS"

シェルスクリプトが正常に修了したら in/ out/ data/ などのディレクトリに連番のファイルがたくさんできているはずです。 出来たファイルで特に重要なのが analysis/NaWO3-FS_up.dat です。 このファイルをプロットするgnuplotスクリプトが analysis/NaWO3-FS.plt です。 analysis/ に移動して gnuplot に読み込ませます。

cd analysis/
gnuplot -persist NaWO3-FS.plt

するとフェルミ面の断面が描画され、PNG形式の画像ファイルが作成されます。

上記のような画像が得られれば成功です。 NaWO3以外の物質のフェルミ面の断面を描画したい場合は NaWO3-FS.sh のコメントを読みながら Please edit FROM here. と Please edit UNTIL here. の間を編集していきます。 チュートリアルで行ったように、まずは普通にgo計算とdos計算を実行し、それらの入力ファイルから in/NaWO3-Gamma.in や template/NaWO3-FS_Template.in に相当するファイルも作る必要があります。