サンプルコード(抜粋)¶
以下では電荷密度
\[\begin{align}
\rho(r) = 2 \sum_{n k} \theta(\varepsilon_{\rm F} - \varepsilon_{n k})
|\varphi_{n k}(r)|^2
\end{align}\]
を計算するサブルーチンを示す.
SUBROUTINE calc_rho(nr,nb,ng,nelec,bvec,eig,ef,phi,rho)
!
USE libtetrabz, ONLY : libtetrabz_fermieng
IMPLICIT NONE
!
INTEGER,INTENT(IN) :: nr ! number of r
INTEGER,INTENT(IN) :: nb ! number of bands
INTEGER,INTENT(IN) :: ng(3)
! k-point mesh
REAL(8),INTENT(IN) :: nelec ! number of electrons per spin
REAL(8),INTENT(IN) :: bvec(3,3) ! reciplocal lattice vector
REAL(8),INTENT(IN) :: eig(nb,ng(1),ng(2),ng(3)) ! Kohn-Sham eigenvalues
REAL(8),INTENT(OUT) :: ef ! Fermi energy
COMPLEX(8),INTENT(IN) :: phi(nr,nb,ng(1),ng(2),ng(3)) ! Kohn-Sham orbitals
REAL(8),INTENT(OUT) :: rho(nr) ! Charge density
!
INTEGER :: ib, i1, i2, i3, ltetra
REAL(8) :: wght(nb,ng(1),ng(2),ng(3))
!
ltetra = 2
!
CALL libtetrabz_fermieng(ltetra,bvec,nb,ng,eig,ng,wght,ef,nelec)
!
rho(1:nr) = 0d0
DO i1 = 1, ng(3)
DO i2 = 1, ng(2)
DO i1 = 1, ng(1)
DO ib = 1, nb
rho(1:nr) = rho(1:nr) + 2d0 * wght(ib,i1,i2,i3) &
& * DBLE(CONJG(phi(1:nr,ib,i1,i2,i3)) * phi(1:nr,ib,i1,i2,i3))
END DO
END DO
END DO
END DO
!
END SUBROUTINE calc_rho