LCOV - code coverage report
Current view: top level - diagonalization - lapack_diag.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 25 25 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             : MODULE m_lapack_diag
       7             :   USE m_types_mat
       8             :   USE m_judft
       9             : IMPLICIT NONE
      10             :   CONTAINS
      11        2470 :   SUBROUTINE lapack_diag(hmat,smat,ne,eig,zmat)
      12             :     !Simple driver to solve Generalized Eigenvalue Problem using LAPACK routine
      13             :     IMPLICIT NONE
      14             :     TYPE(t_mat),INTENT(INOUT)  :: hmat,smat
      15             :     INTEGER,INTENT(INOUT)      :: ne
      16             :     CLASS(t_mat),ALLOCATABLE,INTENT(OUT)    :: zmat
      17             :     REAL,INTENT(OUT)           :: eig(:)
      18             : 
      19             :     INTEGER            :: lwork,info,m
      20        2470 :     INTEGER,ALLOCATABLE:: ifail(:),iwork(:)
      21        2470 :     COMPLEX,ALLOCATABLE:: work(:)
      22        2470 :     REAL,ALLOCATABLE   :: rwork(:)
      23             :     REAL               :: dumrwork(1),abstol
      24             :     COMPLEX            :: dumwork(1)
      25             :     REAL,external      :: dlamch
      26        2470 :     REAL               :: eigTemp(hmat%matsize1)
      27             : 
      28             :     
      29        2470 :     ALLOCATE(t_mat::zmat)
      30        2470 :     CALL zmat%alloc(hmat%l_real,hmat%matsize1,ne)
      31        2470 :     abstol=2*dlamch('S')
      32        2470 :     IF (hmat%l_real) THEN
      33        1570 :        ALLOCATE(iwork(5*hmat%matsize1),ifail(hmat%matsize1))
      34             :        CALL dsygvx(1,'V','I','U', hmat%matsize1,hmat%data_r,SIZE(hmat%data_r,1),smat%data_r,SIZE(smat%data_r,1),&
      35         314 :             0.0,0.0,1,ne,abstol,m,eigTemp,zmat%data_r,SIZE(zmat%data_r,1),dumrwork,-1, iwork, ifail, info)
      36         314 :        lwork=dumrwork(1)
      37         942 :        ALLOCATE(rwork(lwork))
      38         314 :        IF (info.NE.0) CALL judft_error("Diagonalization via LAPACK failed (Workspace)",no=info)
      39             :        CALL dsygvx(1,'V','I','U', hmat%matsize1,hmat%data_r,SIZE(hmat%data_r,1),smat%data_r,SIZE(smat%data_r,1),&
      40         314 :             0.0,0.0,1,ne,abstol,m,eigTemp,zmat%data_r,SIZE(zmat%data_r,1),rwork, lwork, iwork, ifail, info)
      41             :     ELSE
      42       15092 :        ALLOCATE(rwork(7*hmat%matsize1),iwork(5*hmat%matsize1),ifail(hmat%matsize1))
      43             :        !Do a workspace query
      44             :        CALL zhegvx(1,'V','I','U',hmat%matsize1,hmat%data_c,SIZE(hmat%data_c,1),smat%data_c,SIZE(smat%data_c,1),&
      45        2156 :             0.0,0.0,1,ne,abstol,m,eigTemp,zmat%data_c,SIZE(zmat%data_c,1),dumwork,-1,rwork,iwork,ifail,info)
      46        2156 :        lwork=dumwork(1)
      47        6468 :        ALLOCATE(work(lwork))
      48        2156 :        IF (info.NE.0) CALL judft_error("Diagonalization via LAPACK failed (Workspace)",no=info)
      49             :        !Perform diagonalization
      50             :        CALL zhegvx(1,'V','I','U',hmat%matsize1,hmat%data_c,SIZE(hmat%data_c,1),smat%data_c,SIZE(smat%data_c,1),&
      51        2156 :             0.0,0.0,1,ne,abstol,m,eigTemp,zmat%data_c,SIZE(zmat%data_c,1),work,lwork,rwork,iwork,ifail,info)
      52             :     ENDIF
      53       50090 :     eig(:MIN(SIZE(eig),SIZE(eigTemp))) = eigTemp(:MIN(SIZE(eig),SIZE(eigTemp)))
      54        2470 :     IF (info.NE.0) CALL judft_error("Diagonalization via LAPACK failed(zhegvx/dsygvx)",no=info)
      55        2470 :     IF (m.NE.ne) CALL judft_error("Diagonalization via LAPACK failed failed without explicit errorcode.")
      56        2470 :   END SUBROUTINE lapack_diag
      57             : END MODULE m_lapack_diag

Generated by: LCOV version 1.14