各サブルーチンの説明¶
以下のサブルーチンを任意のプログラム内で
USE libtetrabz, ONLY : libtetrabz_occ
CALL libtetrabz_occ(ltetra,bvec,nb,nge,eig,ngw,wght)
のように呼び出して使用できる.
サブルーチン名はすべて libtetrabz_
からはじまる.
C言語で書かれたプログラムから呼び出す場合には次のようにする.
#include "libtetrabz.h"
libtetrabz_occ(<etra,bvec,&nb,nge,eig,ngw,wght)
変数はすべてポインタとして渡す. 配列はすべて1次元配列として定義し一番左の添字が内側のループとなるようにする. またMPI/ハイブリッド並列のときにライブラリに渡すコミュニケーター変数を, 次のようにC/C++のものからfortranのものに変換する。
comm_f = MPI_Comm_c2f(comm_c);
全エネルギー, 電荷密度等(占有率の計算)¶
CALL libtetrabz_occ(ltetra,bvec,nb,nge,eig,ngw,wght,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermiエネルギーを基準とすること( \(\varepsilon_{\rm F} = 0\) ).
INTEGER,INTENT(IN) :: ngw(3)
ngw(3)
: (入力, 整数配列) 積分重みの \(k\) メッシュ.nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(nb,ngw(1),ngw(2),ngw(3))
wght(nb,ngw(1),ngw(2),ngw(3))
: (出力, 実数配列) 積分重みINTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
Fermi エネルギー(占有率も同時に計算する)¶
CALL libtetrabz_fermieng(ltetra,bvec,nb,nge,eig,ngw,wght,ef,nelec,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig(nb,nge(1),nge(2),nge(3))軌道エネルギー.
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(nb,ngw(1),ngw(2),ngw(3))積分重み
REAL(8),INTENT(OUT) :: efFermi エネルギー
REAL(8),INTENT(IN) :: nelecスピンあたりの(荷)電子数
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
(部分)状態密度¶
CALL libtetrabz_dos(ltetra,bvec,nb,nge,eig,ngw,wght,ne,e0,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーの \(k\) メッシュ数.
REAL(8),INTENT(IN) :: eig(nb,nge(1),nge(2),nge(3))軌道エネルギー.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(ne,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN) :: ne状態密度を計算するエネルギー点数
REAL(8),INTENT(IN) :: e0(ne)状態密度を計算するエネルギー
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
積分状態密度¶
CALL libtetrabz_intdos(ltetra,bvec,nb,nge,eig,ngw,wght,ne,e0,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーの \(k\) メッシュ数.
REAL(8),INTENT(IN) :: eig(nb,nge(1),nge(2),nge(3))軌道エネルギー.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(ne,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN) :: ne状態密度を計算するエネルギー点数
REAL(8),INTENT(IN) :: e0(ne)状態密度を計算するエネルギー
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
ネスティング関数, Fröhlich パラメーター¶
CALL libtetrabz_dbldelta(ltetra,bvec,nb,nge,eig1,eig2,ngw,wght,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーの \(k\) メッシュ数.
REAL(8),INTENT(IN) :: eig1(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermi エネルギーを基準とすること( \(\varepsilon_{\rm F}=0\) ).
eig2
も同様.REAL(8),INTENT(IN) :: eig2(nb,nge(1),nge(2),nge(3))軌道エネルギー. 移行運動量の分だけグリッドをずらしたものなど.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(nb,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
DFPT 計算の一部¶
CALL libtetrabz_dblstep(ltetra,bvec,nb,nge,eig1,eig2,ngw,wght,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig1(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermi エネルギーを基準とすること ( \(\varepsilon_{\rm F}=0\) ).
eig2
も同様.REAL(8),INTENT(IN) :: eig2(nb,nge(1),nge(2),nge(3))軌道エネルギー. 移行運動量の分だけグリッドをずらしたものなど.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(nb,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
独立分極関数(静的)¶
CALL libtetrabz_polstat(ltetra,bvec,nb,nge,eig1,eig2,ngw,wght,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig1(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermi エネルギーを基準とすること ( \(\varepsilon_{\rm F}=0\) ).
eig2
も同様.REAL(8),INTENT(IN) :: eig2(nb,nge(1),nge(2),nge(3))軌道エネルギー. 移行運動量の分だけグリッドをずらしたものなど.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(nb,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
フォノン線幅等¶
CALL libtetrabz_fermigr(ltetra,bvec,nb,nge,eig1,eig2,ngw,wght,ne,e0,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig1(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermi エネルギーを基準とすること ( \(\varepsilon_{\rm F}=0\) ).
eig2
も同様.REAL(8),INTENT(IN) :: eig2(nb,nge(1),nge(2),nge(3))軌道エネルギー. 移行運動量の分だけグリッドをずらしたものなど.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).REAL(8),INTENT(OUT) :: wght(ne,nb,nb,ngw(1),ngw(2),ngw(3))積分重み
INTEGER,INTENT(IN) :: neフォノンモード数
REAL(8),INTENT(IN) :: e0(ne)フォノン振動数
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.
分極関数(複素振動数)¶
CALL libtetrabz_polcmplx(ltetra,bvec,nb,nge,eig1,eig2,ngw,wght,ne,e0,comm)
パラメーター
INTEGER,INTENT(IN) :: ltetraテトラへドロン法の種類を決める. 1 \(\cdots\) 線形テトラへドロン法, 2 \(\cdots\) 最適化線形テトラへドロン法 [1]
REAL(8),INTENT(IN) :: bvec(3,3)逆格子ベクトル. 単位は任意で良い. 逆格子の形によって四面体の切り方を決めるため, それらの長さの比のみが必要であるため.
INTEGER,INTENT(IN) :: nbバンド本数
INTEGER,INTENT(IN) :: nge(3)軌道エネルギーのメッシュ数.
REAL(8),INTENT(IN) :: eig1(nb,nge(1),nge(2),nge(3))軌道エネルギー. Fermi エネルギーを基準とすること ( \(\varepsilon_{\rm F}=0\) ).
eig2
も同様.REAL(8),INTENT(IN) :: eig2(nb,nge(1),nge(2),nge(3))軌道エネルギー. 移行運動量の分だけグリッドをずらしたものなど.
INTEGER,INTENT(IN) :: ngw(3)積分重みの \(k\) メッシュ.
nge
と違っていても構わない(補遺 参照).COMPLEX(8),INTENT(OUT) :: wght(ne,nb,nb,ngw(1),ngw(2),ngw(3))積分重み .
INTEGER,INTENT(IN) :: ne計算を行う虚振動数の点数
COMPLEX(8),INTENT(IN) :: e0(ne)計算を行う複素振動数
INTEGER,INTENT(IN),OPTIONAL :: commオプショナル引数. MPIのコミニュケーター(
MPI_COMM_WORLD
など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときにはNULL
を入れる.