quantum-espresso/Modules/pw_dot.f90

38 lines
1.1 KiB
Fortran

!
! Copyright (C) 2003 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 pw_dot(sum_over_nodes,n,m,a,lda,b,ldb,c)
!-----------------------------------------------------------------------
!! Calculate m dot products \(c_i = \text{real}( a^*_{ij} b_{ji} )\)
!! using half G vectors or half PWs.
!
USE kinds, ONLY: DP
USE gvect, ONLY: gstart
USE mp_pools, ONLY: intra_pool_comm
USE mp, ONLY: mp_sum
IMPLICIT NONE
! input
INTEGER :: n, m, lda, ldb
CHARACTER(len=1) sum_over_nodes
COMPLEX(DP) :: a(lda,m), b(ldb,m)
! output
real(DP) :: c(m)
! local
INTEGER i
real(DP), EXTERNAL :: ddot
!
DO i= 1,m
c(i) = 2.d0*ddot(2*n,a(1,i),1,b(1,i),1)
IF (gstart==2) c(i) = c(i) - dble(a(1,i))*dble(b(1,i))
ENDDO
#if defined(__MPI)
IF (sum_over_nodes=='y'.or.sum_over_nodes=='Y') CALL mp_sum( c, intra_pool_comm )
#endif
RETURN
END SUBROUTINE pw_dot