各サブルーチンの説明

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

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} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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'} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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'} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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'} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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'} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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'} \int_{\rm BZ} \frac{d^3 k}{V_{\rm BZ}} \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 を入れる.