各サブルーチンの説明

以下のサブルーチンを任意のプログラム内で

USE libtetrabz, ONLY : libtetrabz_occ

CALL libtetrabz_occ(ltetra,bvec,nb,nge,eig,ngw,wght)

のように呼び出して使用できる. サブルーチン名はすべて libtetrabz_ からはじまる.

C言語で書かれたプログラムから呼び出す場合には次のようにする.

#include "libtetrabz.h"

libtetrabz_occ(&ltetra,bvec,&nb,nge,eig,ngw,wght)

変数はすべてポインタとして渡す. 配列はすべて1次元配列として定義し一番左の添字が内側のループとなるようにする. またMPI/ハイブリッド並列のときにライブラリに渡すコミュニケーター変数を, 次のようにC/C++のものからfortranのものに変換する。

comm_f = MPI_Comm_c2f(comm_c);

全エネルギー, 電荷密度等(占有率の計算)

\[\begin{align} \sum_{n k} \theta(\varepsilon_{\rm F} - \varepsilon_{n k}) X_{n k} \end{align}\]
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 エネルギー(占有率も同時に計算する)

\[\begin{align} \sum_{n k} \theta(\varepsilon_{\rm F} - \varepsilon_{n k}) X_{n k} \end{align}\]
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) :: ef
Fermi エネルギー
REAL(8),INTENT(IN) :: nelec
スピンあたりの(荷)電子数
INTEGER,INTENT(IN),OPTIONAL :: comm
オプショナル引数. MPIのコミニュケーター( MPI_COMM_WORLD など)を入れる. libtetrabz を内部でMPI/Hybrid並列するときのみ入力する. C言語では使用しないときには NULL を入れる.

(部分)状態密度

\[\begin{align} \sum_{n k} \delta(\omega - \varepsilon_{n k}) X_{n k}(\omega) \end{align}\]
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 を入れる.

積分状態密度

\[\begin{align} \sum_{n k} \theta(\omega - \varepsilon_{n k}) X_{n k}(\omega) \end{align}\]
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 パラメーター

\[\begin{align} \sum_{n n' k} \delta(\varepsilon_{\rm F} - \varepsilon_{n k}) \delta(\varepsilon_{\rm F} - \varepsilon'_{n' k}) X_{n n' k} \end{align}\]
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 計算の一部

\[\begin{align} \sum_{n n' k} \theta(\varepsilon_{\rm F} - \varepsilon_{n k}) \theta(\varepsilon_{n k} - \varepsilon'_{n' k}) X_{n n' k} \end{align}\]
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 を入れる.

独立分極関数(静的)

\[\begin{align} \sum_{n n' k} \frac{\theta(\varepsilon_{\rm F} - \varepsilon_{n k}) \theta(\varepsilon'_{n' k} - \varepsilon_{\rm F})} {\varepsilon'_{n' k} - \varepsilon_{n k}} X_{n n' k} \end{align}\]
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 を入れる.

フォノン線幅等

\[\begin{align} \sum_{n n' k} \theta(\varepsilon_{\rm F} - \varepsilon_{n k}) \theta(\varepsilon'_{n' k} - \varepsilon_{\rm F}) \delta(\varepsilon'_{n' k} - \varepsilon_{n k} - \omega) X_{n n' k}(\omega) \end{align}\]
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 を入れる.

分極関数(複素振動数)

\[\begin{align} \sum_{n n' k} \frac{\theta(\varepsilon_{\rm F} - \varepsilon_{n k}) \theta(\varepsilon'_{n' k} - \varepsilon_{\rm F})} {\varepsilon'_{n' k} - \varepsilon_{n k} + i \omega} X_{n n' k}(\omega) \end{align}\]
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 を入れる.