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
\(k\) グリッド数
\(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}\)
バンド本数
逆格子ベクトル1 (任意単位)
逆格子ベクトル2
逆格子ベクトル3
エネルギー (並び順は C/fortranでの入力ファイルの書き出し方 参照)
fermisurfer
はデフォルトではFermiエネルギーを0.0
としています. ただし, 後述のShift Fermi Energy
メニューを用いて Fermiエネルギーを0.0
以外の値に変更することも可能です.物理量 (並び順は 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