mirror of https://gitlab.com/QEF/q-e.git
109 lines
3.5 KiB
Fortran
109 lines
3.5 KiB
Fortran
!
|
|
! Copyright (C) 2001 PWSCF group
|
|
! This file is distributed under the terms of the
|
|
! GNU General Public License. See the file `License'
|
|
! in the root directory of the present distribution,
|
|
! or http://www.gnu.org/copyleft/gpl.txt .
|
|
!
|
|
!
|
|
!----------------------------------------------------------------------
|
|
subroutine stress
|
|
!----------------------------------------------------------------------
|
|
!
|
|
#include "machine.h"
|
|
!
|
|
use pwcom
|
|
implicit none
|
|
!
|
|
real(kind=DP) :: sigmakin (3, 3), sigmaloc (3, 3), sigmahar (3, 3), &
|
|
sigmaxc (3, 3), sigmaxcc (3, 3), sigmaewa (3, 3), sigmanlc (3, 3), &
|
|
sigmabare (3, 3), sigmah (3, 3)
|
|
|
|
integer :: l, m
|
|
call start_clock ('stress')
|
|
write (6, '(//5x,"entering subroutine stress ..."/)')
|
|
|
|
!
|
|
! contribution from local potential
|
|
!
|
|
call stres_loc (sigmaloc)
|
|
!
|
|
! hartree contribution
|
|
!
|
|
call stres_har (sigmahar)
|
|
!
|
|
! xc contribution (diagonal)
|
|
!
|
|
sigmaxc(:,:) = 0.d0
|
|
do l = 1, 3
|
|
sigmaxc (l, l) = - (etxc - vtxc) / omega
|
|
enddo
|
|
!
|
|
! xc contribution: add gradient corrections (non diagonal)
|
|
!
|
|
call stres_gradcorr (rho, rho_core, nspin, nr1, nr2, nr3, nrx1, &
|
|
nrx2, nrx3, nrxx, nl, ngm, g, alat, omega, sigmaxc)
|
|
!
|
|
! core correction contribution
|
|
!
|
|
call stres_cc (sigmaxcc)
|
|
!
|
|
! ewald contribution
|
|
!
|
|
call stres_ewa (alat, nat, ntyp, ityp, zv, at, bg, tau, omega, g, &
|
|
gg, ngm, gstart, gamma_only, gcutm, sigmaewa)
|
|
!
|
|
! kinetic + nonlocal contribuition
|
|
!
|
|
call stres_knl (sigmanlc, sigmakin)
|
|
!
|
|
do l = 1, 3
|
|
do m = 1, 3
|
|
sigmabare (l, m) = sigmaloc (l, m) + sigmanlc (l, m)
|
|
enddo
|
|
enddo
|
|
!
|
|
! Hubbard contribution
|
|
!
|
|
sigmah(:,:) = 0.d0
|
|
if (lda_plus_u) call stres_hub(sigmah)
|
|
!
|
|
sigma(:,:) = sigmakin(:,:) + sigmaloc(:,:) + sigmahar(:,:) + &
|
|
sigmaxc(:,:) + sigmaxcc(:,:) + sigmaewa(:,:) + &
|
|
sigmanlc(:,:) + sigmah(:,:)
|
|
!
|
|
! write results in Ryd/(a.u.)^3 and in kbar
|
|
!
|
|
|
|
write (6, 9000) (sigma(1,1) + sigma(2,2) + sigma(3,3)) * uakbar / 3d0, &
|
|
(sigma(l,1), sigma(l,2), sigma(l,3), &
|
|
sigma(l,1)*uakbar, sigma(l,2)*uakbar, sigma(l,3)*uakbar, l=1,3)
|
|
|
|
if (iverbosity.ge.1) write (6, 9005) &
|
|
(sigmakin(l,1)*uakbar,sigmakin(l,2)*uakbar,sigmakin(l,3)*uakbar, l=1,3),&
|
|
(sigmaloc(l,1)*uakbar,sigmaloc(l,2)*uakbar,sigmaloc(l,3)*uakbar, l=1,3),&
|
|
(sigmanlc(l,1)*uakbar,sigmanlc(l,2)*uakbar,sigmanlc(l,3)*uakbar, l=1,3),&
|
|
(sigmahar(l,1)*uakbar,sigmahar(l,2)*uakbar,sigmahar(l,3)*uakbar, l=1,3),&
|
|
(sigmaxc (l,1)*uakbar,sigmaxc (l,2)*uakbar,sigmaxc (l,3)*uakbar, l=1,3),&
|
|
(sigmaxcc(l,1)*uakbar,sigmaxcc(l,2)*uakbar,sigmaxcc(l,3)*uakbar, l=1,3),&
|
|
(sigmaewa(l,1)*uakbar,sigmaewa(l,2)*uakbar,sigmaewa(l,3)*uakbar, l=1,3),&
|
|
(sigmah (l,1)*uakbar,sigmah (l,2)*uakbar,sigmah (l,3)*uakbar, l=1,3)
|
|
|
|
call stop_clock ('stress')
|
|
|
|
return
|
|
9000 format (10x,'total stress (a.u.)',25x,'(kbar)', &
|
|
&5x,'P=',f8.2/3 (3f13.8,4x,3f10.2/))
|
|
9005 format &
|
|
& (5x,'kinetic stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'local stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'nonloc. stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'hartree stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'exc-cor stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'corecor stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'ewald stress (kbar)',3f10.2/2(26x,3f10.2/)/ &
|
|
& 5x,'hubbard stress (kbar)',3f10.2/2(26x,3f10.2/)/ )
|
|
|
|
end subroutine stress
|
|
|