.. _input: Input file ========== input fileの書式 ---------------- 用意するデータは, - Brillouin領域分割数(3方向) - 逆格子ベクトル - バンド本数 - 軌道固有値(以下エネルギーと呼びます)の各バンド, :math:`k` グリッド点での値 - カラープロットしたい物理量(以下物理量と呼びます)の各バンド, :math:`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 #. :math:`k` グリッド数 #. :math:`k` グリッドの指定方法( ``0, 1, 2`` のいずれか) :math:`k` グリッドを次のように表します. .. math:: \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` は :math:`1` から各逆格子ベクトル方向の分割数 :math:`N_1, N_2, N_3` (上で読み取ったもの)とする :math:`x_i, y_j,z_k` は次の3つのとり方が可能です. - ``0`` の場合(Monkhorst-Packグリッド) : :math:`x_i = \frac{2 i - 1 - N_1}{2 N_1}` - ``1`` の場合 : :math:`x_i = \frac{i - 1}{N_1}` - ``2`` の場合 : :math:`x_i = \frac{2 i - 1}{2 N_1}` #. バンド本数 #. 逆格子ベクトル1 (任意単位) #. 逆格子ベクトル2 #. 逆格子ベクトル3 #. エネルギー (並び順は :ref:`format` 参照) ``fermisurfer`` はデフォルトではFermiエネルギーを ``0.0`` としています. ただし, 後述の ``Shift Fermi Energy`` メニューを用いて Fermiエネルギーを ``0.0`` 以外の値に変更することも可能です. #. 物理量 (並び順は :ref:`format` 参照) (オプショナル) 0個から3個のブロックで, カラープロットしたい量を入力する. 省略することも可能. BXSF形式 -------- XCrysDen用の入力ファイルを ``fermisurfer`` で読み取ることも可能. その場合は前節の「物理量」を省略した場合と同じ振る舞いになる。 .. _format: C/fortranでの入力ファイルの書き出し方 ------------------------------------- fortran .. code-block:: 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言語 .. code-block:: 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 .. code-block:: 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 .. code-block:: 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