Input file

input fileの書式

用意するデータは,

  • Brillouin領域分割数(3方向)

  • 逆格子ベクトル

  • バンド本数

  • 軌道固有値(以下エネルギーと呼びます)の各バンド, \(k\) グリッド点での値

  • カラープロットしたい物理量(以下物理量と呼びます)の各バンド, \(k\) グリッド点での値

です.

上記データを次のとおりの書式で並べます(サンプルファイル mgb2_vfz.frmsf の中身).

40          40          36        (1)
0                                 (2)
3                                 (3)
1.0000000      0.57735026      -0.0000000 (4)
0.0000000       1.1547005       0.0000000 (5)
0.0000000      -0.0000000      0.87206507 (6)
2.91340202E-02                            (7)
2.93242838E-02
2.98905596E-02
3.08193434E-02
:
:
0.14393796
0.12800488
0.0000000                                 (8)
0.36269817
0.71675694
1.0535113
1.3644149
:
:
-26.409407
-19.318560
-10.315671
  1. \(k\) グリッド数

  2. \(k\) グリッドの指定方法( 0, 1, 2 のいずれか)

    \(k\) グリッドを次のように表します.

    \[\begin{align} {\boldsymbol k}_{i,j,k} = x_i {\boldsymbol b}_1 + y_j {\boldsymbol b}_2 + z_k {\boldsymbol b}_3 \end{align}\]

    ただし:math:i, j, k\(1\) から各逆格子ベクトル方向の分割数 \(N_1, N_2, N_3\) (上で読み取ったもの)とする

    \(x_i, y_j,z_k\) は次の3つのとり方が可能です.

    • 0 の場合(Monkhorst-Packグリッド) : \(x_i = \frac{2 i - 1 - N_1}{2 N_1}\)

    • 1 の場合 : \(x_i = \frac{i - 1}{N_1}\)

    • 2 の場合 : \(x_i = \frac{2 i - 1}{2 N_1}\)

  3. バンド本数

  4. 逆格子ベクトル1 (任意単位)

  5. 逆格子ベクトル2

  6. 逆格子ベクトル3

  7. エネルギー (並び順は C/fortranでの入力ファイルの書き出し方 参照)

    fermisurfer はデフォルトではFermiエネルギーを 0.0 としています. ただし, 後述の Shift Fermi Energy メニューを用いて Fermiエネルギーを 0.0 以外の値に変更することも可能です.

  8. 物理量 (並び順は C/fortranでの入力ファイルの書き出し方 参照) (オプショナル)

    0個から3個のブロックで, カラープロットしたい量を入力する. 省略することも可能.

BXSF形式

XCrysDen用の入力ファイルを fermisurfer で読み取ることも可能. その場合は前節の「物理量」を省略した場合と同じ振る舞いになる。

C/fortranでの入力ファイルの書き出し方

fortran

real(4) :: bvec1(3), bvec2(3), bvec3(3) !逆格子ベクトル
INTEGER :: nk1, nk2, nk3 !各逆格子ベクトルの方向の分割数
integer :: ishift !グリットをシフトさせるか(=1)否か(=0)
integer :: nbnd !バンド数
real(4) :: eig(nk3,nk2,nk1,nbnd) !エネルギー
real(4) :: x(nk3,nk2,nk1,nbnd) !物理量

integer :: ik1, ik2, ik3, ibnd, fo

open(fo, file = "sample.frmsf")
write(fo,*) nk1, nk2, nk3
write(fo,*) ishift
write(fo,*) nbnd
write(fo,*) real(bvec1(1:3))
write(fo,*) real(bvec2(1:3))
write(fo,*) real(bvec3(1:3))
do ibnd = 1, nbnd
   do ik1 = 1, nk1
      do ik2 = 1, nk2
         do ik3 = 1, nk3
            write(fo,*) real(eig(ik3,ik2,ik1,ibnd))
         end do
      end do
   end do
end do
do ibnd = 1, nbnd
   do ik1 = 1, nk1
      do ik2 = 1, nk2
         do ik3 = 1, nk3
            write(fo,*) real(x(ik3,ik2,ik1,ibnd))
         end do
      end do
   end do
end do
close(fo)

C言語

float bvec1[3], bvec2[3], bvec3[3]; /*逆格子ベクトル*/
int nk1, nk2, nk3; /*各逆格子ベクトルの方向の分割数*/
int ishift; /*グリットをシフトさせるか(=1)否か(=0)*/
int nbnd; /*バンド数*/
float eig[nbnd][nk1][nk2][nk3]; /*エネルギー*/
float x[nbnd][nk1][nk2][nk3]; /*物理量*/

FILE* fo;
int ibnd, ik1, ik2, ik3;

fo = fopen("sample.frmsf", "w");
ierr = fprintf(fo, "%d %d %d\n", nk1, nk2, nk3);
ierr = fprintf(fo, "%d\n", iswitch);
ierr = fprintf(fo, "%d\n", nbnd);
ierr = fprintf(fo, "%e %e %e\n", bvec1[0], bvec1[1], bvec1[2]);
ierr = fprintf(fo, "%e %e %e\n", bvec2[0], bvec2[1], bvec2[2]);
ierr = fprintf(fo, "%e %e %e\n", bvec3[0], bvec3[1], bvec3[2]);
for (ibnd = 0; ibnd < nbnd; ++ibnd) {
   for (ik1 = 0; ik1 < nk1; ++ik1) {
      for (ik2 = 0; ik2 < nk2; ++ik2) {
         for (ik3 = 0; ik3 < nk3; ++ik3) {
            ierr = fprintf(fo, "%e\n", eig[ibnd][ik1][ik2][ik3]);
         }
      }
   }
}
for (ibnd = 0; ibnd < nbnd; ++ibnd) {
   for (ik1 = 0; ik1 < nk1; ++ik1) {
      for (ik2 = 0; ik2 < nk2; ++ik2) {
         for (ik3 = 0; ik3 < nk3; ++ik3) {
            ierr = fprintf(fo, "%e\n", x[ibnd][ik1][ik2][ik3]);
         }
      }
   }
}
fclose(fo);

2次元量のカラープロットを行う場合

fortran

real(4) :: bvec1(3), bvec2(3), bvec3(3) !逆格子ベクトル
INTEGER :: nk1, nk2, nk3 !各逆格子ベクトルの方向の分割数
integer :: ishift !グリットをシフトさせるか(=1)否か(=0)
integer :: nbnd !バンド数
real(4) :: eig(nk3,nk2,nk1,nbnd) !エネルギー
real(4) :: x(nk3,nk2,nk1,nbnd,2) !物理量 (2次元量、複素数など)

integer :: ik1, ik2, ik3, ibnd, fo, ii

open(fo, file = "sample.frmsf")
write(fo,*) nk1, nk2, nk3
write(fo,*) ishift
write(fo,*) nbnd
write(fo,*) real(bvec1(1:3))
write(fo,*) real(bvec2(1:3))
write(fo,*) real(bvec3(1:3))
do ibnd = 1, nbnd
   do ik1 = 1, nk1
      do ik2 = 1, nk2
         do ik3 = 1, nk3
            write(fo,*) real(eig(ik3,ik2,ik1,ibnd))
         end do
      end do
   end do
end do
do ii = 1, 2
   do ibnd = 1, nbnd
      do ik1 = 1, nk1
         do ik2 = 1, nk2
            do ik3 = 1, nk3
               write(fo,*) real(x(ik3,ik2,ik1,ibnd,ii))
            end do
         end do
      end do
   end do
close(fo)

カラープロットしたい量を省略する場合

fortran

real(4) :: bvec1(3), bvec2(3), bvec3(3) !逆格子ベクトル
INTEGER :: nk1, nk2, nk3 !各逆格子ベクトルの方向の分割数
integer :: ishift !グリットをシフトさせるか(=1)否か(=0)
integer :: nbnd !バンド数
real(4) :: eig(nk3,nk2,nk1,nbnd) !エネルギー

integer :: ik1, ik2, ik3, ibnd, fo, ii

open(fo, file = "sample.frmsf")
write(fo,*) nk1, nk2, nk3
write(fo,*) ishift
write(fo,*) nbnd
write(fo,*) real(bvec1(1:3))
write(fo,*) real(bvec2(1:3))
write(fo,*) real(bvec3(1:3))
do ibnd = 1, nbnd
   do ik1 = 1, nk1
      do ik2 = 1, nk2
         do ik3 = 1, nk3
            write(fo,*) real(eig(ik3,ik2,ik1,ibnd))
         end do
      end do
   end do
end do