LCOV - code coverage report
Current view: top level - shared/common/src/28_numeric_noabirule - abi_xhpev.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 30.4 % 46 14
Test Date: 2026-09-19 17:42:43 Functions: 33.3 % 3 1

            Line data    Source code
       1              : !{\src2tex{textfont=tt}}
       2              : !!****f* m_abi_linalg/abi_xhpev
       3              : !! NAME
       4              : !!  abi_xhpev
       5              : !!
       6              : !! FUNCTION
       7              : !!  abi_xhpev is the generic function that compute
       8              : !!  all eigenvalues and, optionally, eigenvectors of a
       9              : !!  symmetric or hermitian matrix A in packed storage
      10              : !!
      11              : !! COPYRIGHT
      12              : !!  Copyright (C) 2001-2026 ABINIT group (LNguyen,FDahm,MT)
      13              : !!  This file is distributed under the terms of the
      14              : !!  GNU General Public License, see ~abinit/COPYING
      15              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      16              : !!
      17              : !! SOURCE
      18              : 
      19              : !!***
      20              : 
      21              : !!****f* m_abi_linalg/abi_dhpev
      22              : !! NAME
      23              : !! abi_dhpev
      24              : !!
      25              : !! FUNCTION
      26              : !!
      27              : !! INPUTS
      28              : !!
      29              : !! SOURCE
      30              : 
      31       445643 :   subroutine abi_dhpev(jobz,uplo,n,a,w,z,ldz,istwf_k,use_slk,use_gpu_elpa)
      32              : 
      33              :  !Arguments ------------------------------------
      34              :  character(len=1), intent(in) :: jobz
      35              :  character(len=1), intent(in) :: uplo
      36              :  integer, intent(in) :: n,ldz
      37              :  real(dp), intent(inout) :: a(:)
      38              :  real(dp), intent(out) :: z(:,:)
      39              :  real(dp), intent(out) :: w(:)
      40              :  integer, optional, intent(in) :: istwf_k
      41              :  integer, optional, intent(in) :: use_slk,use_gpu_elpa
      42              : 
      43              : !Local variables-------------------------------
      44              :  integer :: info,use_slk_,use_gpu_elpa_,istwf_k_
      45              : #ifdef HAVE_LINALG_SCALAPACK
      46              :  type(slkmat_dp_t) :: sca_a,sca_ev
      47              :  real(dp),allocatable :: tmp_evec(:,:)
      48              :  integer :: dim_evec1,ierr
      49              : #endif
      50              : 
      51              : ! *********************************************************************
      52              : 
      53       445643 :  ABI_CHECK(lapack_packed_storage,"BUG(1) in abi_dhpev (storage)!")
      54       445643 :  ABI_CHECK(lapack_double_precision,"BUG(2) in abi_dhpev (precision)!")
      55       445643 :  ABI_CHECK(n<=eigen_d_maxsize,"BUG(3) in abi_dhpev (maxsize)!")
      56              : 
      57       445643 :  info = 0 ! to avoid unwanted warnings but scalapack doesn't check return
      58              : 
      59       445643 :  use_slk_ = 0; if (present(use_slk)) use_slk_ = use_slk
      60       445643 :  istwf_k_ = 1; if (present(istwf_k)) istwf_k_ = istwf_k
      61       445643 :  use_gpu_elpa_=0
      62              : #ifdef HAVE_LINALG_ELPA
      63              :  if (present(use_gpu_elpa)) use_gpu_elpa_=use_gpu_elpa
      64              : #endif
      65              : 
      66              : !===== SCALAPACK
      67       445643 :  if (ABI_LINALG_SCALAPACK_ISON.and.use_slk_==1.and.n>slk_minsize)  then
      68              : #if defined HAVE_LINALG_SCALAPACK
      69              :    ! if istwfk=1, then dim_evec1=2*n and if istwfk=2, dim_evec1=n
      70              :    dim_evec1= 2*n/istwf_k_
      71              :    ABI_MALLOC(tmp_evec,(dim_evec1,n))
      72              :    tmp_evec = zero
      73              :    call sca_a%init(n,n,slk_processor,istwf_k_)
      74              :    call sca_ev%init(n,n,slk_processor,istwf_k_)
      75              : #ifdef HAVE_LINALG_ELPA
      76              :    call sca_a%from_global_sym(a,istwf_k_)
      77              : #else
      78              :    call sca_a%from_global_pack(a,istwf_k_)
      79              : #endif
      80              :    call compute_eigen_problem(slk_processor,sca_a,sca_ev,w,slk_communicator,istwf_k_,&
      81              : &                             use_gpu_elpa=use_gpu_elpa_)
      82              :    call sca_a%to_global_pack(a,istwf_k_)
      83              :    call sca_ev%to_global(tmp_evec, istwf_k_)
      84              :    call xmpi_sum(tmp_evec,z,dim_evec1*n,slk_communicator,ierr)
      85              :    call sca_a%free()
      86              :    call sca_ev%free()
      87              :    ABI_FREE(tmp_evec)
      88              : #endif
      89              : 
      90              : !===== LAPACK
      91              :  else
      92       445643 :    if (istwf_k_/=2) then
      93       428858 :      call zhpev(jobz,uplo,n,a,w,z,ldz,eigen_z_work,eigen_z_rwork,info)
      94              :    else
      95        16785 :      call dspev(jobz,uplo,n,a,w,z,ldz,eigen_d_work,info)
      96              :    end if
      97              :  end if
      98              : 
      99       445643 :  ABI_CHECK(info==0,"dhpev returned info!=0")
     100              : 
     101              : #ifndef HAVE_LINALG_ELPA
     102              :  ABI_UNUSED(use_gpu_elpa)
     103              : #endif
     104              : 
     105       445643 : end subroutine abi_dhpev
     106              : !!***
     107              : 
     108              : !----------------------------------------------------------------------
     109              : 
     110              : !!****f* m_abi_linalg/abi_chpev
     111              : !! NAME
     112              : !! abi_chpev
     113              : !!
     114              : !! FUNCTION
     115              : !!
     116              : !! INPUTS
     117              : !!
     118              : !! SOURCE
     119              : 
     120            0 :   subroutine abi_chpev(jobz,uplo,n,a,w,z,ldz)
     121              : 
     122              :  !Arguments ------------------------------------
     123              :  character(len=1), intent(in) :: jobz
     124              :  character(len=1), intent(in) :: uplo
     125              :  integer, intent(in) :: n,ldz
     126              :  complex(sp), intent(inout) :: a(:,:)
     127              :  complex(sp), intent(out) :: z(:,:)
     128              :  real(sp), intent(out) :: w(:)
     129              : 
     130              : !Local variables-------------------------------
     131              :  integer :: info
     132              :  real(sp),pointer :: rwork(:)
     133              :  complex(sp),pointer :: work(:)
     134              : ! *********************************************************************
     135              : 
     136            0 :  ABI_CHECK(lapack_packed_storage,"BUG(1) in abi_chpev (storage)!")
     137            0 :  ABI_CHECK(lapack_single_precision,"BUG(2) in abi_chpev (precision)!")
     138            0 :  ABI_CHECK(n<=eigen_c_maxsize,"BUG(3) in abi_chpev (maxsize)!")
     139              : 
     140            0 :  work => eigen_c_work ; rwork => eigen_c_rwork
     141              : 
     142              : !===== LAPACK
     143            0 :  if (eigen_c_lwork==0) then
     144            0 :    ABI_MALLOC(work,(2*n-1))
     145              :  end if
     146            0 :  if (eigen_c_lrwork==0) then
     147            0 :    ABI_MALLOC(rwork,(3*n-2))
     148              :  end if
     149            0 :  call chpev(jobz,uplo,n,a,w,z,ldz,work,rwork,info)
     150            0 :  if (eigen_c_lwork==0) then
     151            0 :    ABI_FREE(work)
     152              :  end if
     153            0 :  if (eigen_c_lrwork==0) then
     154            0 :    ABI_FREE(rwork)
     155              :  end if
     156              : 
     157            0 :  ABI_CHECK(info==0,"abi_chpev returned info!=0!")
     158              : 
     159            0 : end subroutine abi_chpev
     160              : !!***
     161              : 
     162              : !----------------------------------------------------------------------
     163              : 
     164              : !!****f* m_abi_linalg/abi_zhpev
     165              : !! NAME
     166              : !! abi_zhpev
     167              : !!
     168              : !! FUNCTION
     169              : !!
     170              : !! INPUTS
     171              : !!
     172              : !! SOURCE
     173              : 
     174            0 :   subroutine abi_zhpev(jobz,uplo,n,a,w,z,ldz)
     175              : 
     176              : !Arguments ------------------------------------
     177              :  character(len=1), intent(in) :: jobz
     178              :  character(len=1), intent(in) :: uplo
     179              :  integer, intent(in) :: n,ldz
     180              :  complex(dp), intent(inout) :: a(:,:)
     181              :  complex(dp), intent(out) :: z(:,:)
     182              :  real(dp), intent(out) :: w(:)
     183              : 
     184              : !Local variables-------------------------------
     185              :  integer :: info
     186              :  real(dp),pointer :: rwork(:)
     187              :  complex(dp),pointer :: work(:)
     188              : ! *********************************************************************
     189              : 
     190            0 :  ABI_CHECK(lapack_packed_storage,"BUG(1) in abi_zhpev (storage)!")
     191            0 :  ABI_CHECK(lapack_double_precision,"BUG(2) in abi_zhpev (precision)!")
     192            0 :  ABI_CHECK(n<=eigen_z_maxsize,"BUG(3) in abi_zhpev (maxsize)!")
     193              : 
     194            0 :  work => eigen_z_work ; rwork => eigen_z_rwork
     195              : 
     196              : !===== LAPACK
     197            0 :  if (eigen_z_lwork==0) then
     198            0 :    ABI_MALLOC(work,(2*n-1))
     199              :  end if
     200            0 :  if (eigen_z_lrwork==0) then
     201            0 :    ABI_MALLOC(rwork,(3*n-2))
     202              :  end if
     203            0 :  call zhpev(jobz,uplo,n,a,w,z,ldz,work,rwork,info)
     204            0 :  if (eigen_z_lwork==0) then
     205            0 :    ABI_FREE(work)
     206              :  end if
     207            0 :  if (eigen_z_lrwork==0) then
     208            0 :    ABI_FREE(rwork)
     209              :  end if
     210              : 
     211            0 :  ABI_CHECK(info==0,"abi_zhpev returned info!=0!")
     212              : 
     213            0 : end subroutine abi_zhpev
     214              : !!***
        

Generated by: LCOV version 2.3-1