mirror of https://gitlab.com/QEF/q-e.git
100 lines
2.9 KiB
Fortran
100 lines
2.9 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 struc_fact (nat, tau, ntyp, ityp, ngm, g, bg, nr1, nr2, &
|
|
nr3, strf, eigts1, eigts2, eigts3)
|
|
!----------------------------------------------------------------------
|
|
!
|
|
! calculate the structure factors for each type of atoms in the unit
|
|
! cell
|
|
#include "f_defs.h"
|
|
!
|
|
USE kinds
|
|
implicit none
|
|
!
|
|
! Here the dummy variables
|
|
!
|
|
|
|
integer :: nat, ntyp, ityp (nat), ngm, nr1, nr2, nr3
|
|
! input: the number of atom in the unit cel
|
|
! input: the number of atom types
|
|
! input: for each atom gives the type
|
|
! input: the number of G vectors
|
|
! input: fft dimension along x
|
|
! input: fft dimension along y
|
|
! input: fft dimension along z
|
|
|
|
real(kind=DP) :: bg (3, 3), tau (3, nat), g (3, ngm)
|
|
! input: reciprocal crystal basis vectors
|
|
! input: the positions of the atoms in the c
|
|
! input: the coordinates of the g vectors
|
|
|
|
complex(kind=DP) :: strf (ngm, ntyp), &
|
|
eigts1 ( -nr1:nr1, nat), &
|
|
eigts2 ( -nr2:nr2, nat), &
|
|
eigts3 ( -nr3:nr3, nat)
|
|
! output: the structure factor
|
|
!
|
|
! output: the phases e^{-iG\tau_s}
|
|
!
|
|
!
|
|
! here the local variables
|
|
!
|
|
integer :: nt, na, ng, n1, n2, n3, ipol
|
|
! counter over atom type
|
|
! counter over atoms
|
|
! counter over G vectors
|
|
! counter over fft dimension along x
|
|
! counter over fft dimension along y
|
|
! counter over fft dimension along z
|
|
! counter over polarizations
|
|
|
|
real(kind=DP) :: tpi, arg, bgtau (3)
|
|
! two times pi
|
|
! the argument of the exponent
|
|
! scalar product of bg and tau
|
|
parameter (tpi = 2.0d0 * 3.14159265358979d0)
|
|
|
|
strf(:,:) = (0.d0,0.d0)
|
|
do nt = 1, ntyp
|
|
do na = 1, nat
|
|
if (ityp (na) .eq.nt) then
|
|
do ng = 1, ngm
|
|
arg = (g (1, ng) * tau (1, na) + g (2, ng) * tau (2, na) &
|
|
+ g (3, ng) * tau (3, na) ) * tpi
|
|
strf (ng, nt) = strf (ng, nt) + DCMPLX (cos (arg), -sin (arg))
|
|
enddo
|
|
endif
|
|
enddo
|
|
enddo
|
|
|
|
do na = 1, nat
|
|
do ipol = 1, 3
|
|
bgtau (ipol) = bg (1, ipol) * tau (1, na) + &
|
|
bg (2, ipol) * tau (2, na) + &
|
|
bg (3, ipol) * tau (3, na)
|
|
enddo
|
|
do n1 = - nr1, nr1
|
|
arg = tpi * n1 * bgtau (1)
|
|
eigts1 (n1, na) = DCMPLX (cos (arg), - sin (arg) )
|
|
enddo
|
|
do n2 = - nr2, nr2
|
|
arg = tpi * n2 * bgtau (2)
|
|
eigts2 (n2, na) = DCMPLX (cos (arg), - sin (arg) )
|
|
enddo
|
|
do n3 = - nr3, nr3
|
|
arg = tpi * n3 * bgtau (3)
|
|
eigts3 (n3, na) = DCMPLX (cos (arg), - sin (arg) )
|
|
enddo
|
|
enddo
|
|
|
|
return
|
|
end subroutine struc_fact
|
|
|