LCOV - code coverage report
Current view: top level - eigen - orthoglo.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 23 23 100.0 %
Date: 2024-04-26 04:44:34 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
       3             : ! This file is part of FLEUR and available as free software under the conditions
       4             : ! of the MIT license as expressed in the LICENSE file in more detail.
       5             : !--------------------------------------------------------------------------------
       6             : 
       7             : MODULE m_orthoglo
       8             :   USE m_juDFT
       9             :   !*********************************************************************
      10             :   ! Each G-vector corresponds to a vector of C-coeff. These vectors must
      11             :   ! be linearly independent. This is checked by this soubroutine for an
      12             :   ! atom that doesn't have an inversion partner.
      13             :   ! Philipp Kurz 99/04
      14             :   !*********************************************************************
      15             : CONTAINS
      16       98442 :   SUBROUTINE orthoglo(l_real,atoms, nkvec,lo,l,linindq,l_lo2, cwork, linind)
      17             :     !
      18             :     !*************** ABBREVIATIONS ***************************************
      19             :     ! cwork   : contains the vectors of C-coeff.
      20             :     ! l_lo2   : changes this routine to old 'orthoglo2': same as orthoglo, 
      21             :     !           but for a pair of atoms that can be mapped onto eachother 
      22             :     !           by inversion.
      23             :     ! CF Replaced (unstable) Gram-Schmidt by diagonalization.
      24             :     !*********************************************************************
      25             : 
      26             :     USE m_types_fleurinput
      27             :     IMPLICIT NONE
      28             :     TYPE(t_atoms),INTENT(IN)   :: atoms
      29             :     !     ..
      30             :     !     .. Scalar Arguments ..
      31             :     INTEGER, INTENT (IN) :: l,lo,nkvec
      32             :     REAL,    INTENT (IN) :: linindq
      33             :     LOGICAL, INTENT (IN) :: l_lo2,l_real
      34             :     LOGICAL, INTENT (OUT) :: linind
      35             :     !     ..
      36             :     !     .. Array Arguments ..
      37             :     COMPLEX,INTENT (INOUT):: cwork(-2*atoms%llod:2*atoms%llod+1,2*(2*atoms%llod+1) ,atoms%nlod)
      38             :     !     ..
      39             :     !     .. Local Scalars ..
      40             :     INTEGER dim,low,i,j
      41             :     !     ..
      42             :     !     .. Local Arrays ..
      43       98442 :     REAL eig(nkvec),rwork(3*nkvec)
      44       98442 :     REAL olap_r(nkvec,nkvec)
      45             :     EXTERNAL dsyev
      46       98442 :     COMPLEX olap_c(nkvec,nkvec),work(2*nkvec)
      47             :     EXTERNAL zheev
      48             : 
      49       98442 :     IF (l_lo2) THEN
      50        1202 :        dim = 2* (2*l+1)
      51        1202 :        low = -2*l
      52             :     ELSE
      53       97240 :        dim = 2*l+1
      54       97240 :        low = -l
      55             :     ENDIF
      56             : 
      57      304974 :     DO i = 1,nkvec
      58      845130 :        DO j = 1,nkvec
      59      746688 :           IF (l_real) THEN
      60      775846 :              olap_r(i,j) = DOT_PRODUCT(cwork(low:low+dim-1,i,lo), cwork(low:low+dim-1,j,lo))
      61             :           ELSE
      62     1730732 :              olap_c(i,j) = DOT_PRODUCT(cwork(low:low+dim-1,i,lo), cwork(low:low+dim-1,j,lo))
      63             :           ENDIF
      64             :        ENDDO
      65             :     ENDDO
      66       98442 :     IF (l_real) THEN
      67       37400 :        CALL dsyev('N','U',nkvec,olap_r,nkvec,eig, rwork,3*nkvec,i)
      68       37400 :        IF(i/=0)  CALL juDFT_error("(S,D)SYEV failed.","orthoglo")
      69             :     ELSE
      70       61042 :        CALL zheev('N','U',nkvec,olap_c,nkvec,eig, work,2*nkvec,rwork,i)
      71       61042 :        IF(i/=0)  CALL juDFT_error("(C,Z)HEEV failed.","orthoglo")
      72             :     ENDIF
      73       98442 :     IF(eig(1).LT.linindq) THEN
      74        9518 :        linind = .FALSE.
      75             :     ELSE
      76       88924 :        linind = .TRUE.
      77             :     ENDIF
      78       98442 :     RETURN
      79             : 
      80             :   END SUBROUTINE orthoglo
      81             : END MODULE m_orthoglo

Generated by: LCOV version 1.14