LCOV - code coverage report
Current view: top level - diagonalization - eigen_diag.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 13 25 52.0 %
Date: 2024-04-19 04:21:58 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_eigen_diag
       8             :   USE m_juDFT
       9             :   USE m_available_solvers
      10             :   IMPLICIT NONE
      11             :   PRIVATE
      12             :   PUBLIC :: eigen_diag
      13             : 
      14             : CONTAINS
      15             : 
      16        7342 :   SUBROUTINE eigen_diag(solver,hmat,smat,ne,eig,ev,ikpt,jsp,iter)
      17             :     USE m_lapack_diag
      18             :     USE m_lapack_singlePrec_diag
      19             :     USE m_dummy_diag
      20             :     USE m_magma
      21             :     USE m_elpa
      22             :     USE m_elpa_onenode
      23             :     USE m_scalapack
      24             :     USE m_elemental
      25             :     USE m_chase_diag
      26             :     USE m_types_mpimat
      27             :     USE m_elsi
      28             : !    USE m_matrix_copy
      29             :     USE m_cusolver_diag
      30             :     USE m_judft_usage
      31             :     USE m_writeout
      32             : #ifdef CPP_MPI
      33             :     use mpi
      34             : #endif    
      35             :     IMPLICIT NONE
      36             :     INTEGER,                   INTENT(INOUT) :: solver
      37             :     CLASS(t_mat),              INTENT(INOUT) :: smat,hmat
      38             :     CLASS(t_mat), ALLOCATABLE, INTENT(OUT)   :: ev         ! eigenvectors
      39             :     INTEGER,                   INTENT(INOUT) :: ne         ! number of eigenpairs searched (and found) on this node
      40             :                                                            !   on input, overall number of eigenpairs searched,
      41             :                                                            !   on output, local number of eigenpairs found
      42             :     REAL,                      INTENT(OUT)   :: eig(:)     ! eigenvalues
      43             : 
      44             :     !Only for chase
      45             :     INTEGER,OPTIONAL,          INTENT(IN)    :: ikpt
      46             :     INTEGER,OPTIONAL,          INTENT(IN)    :: jsp
      47             :     INTEGER,OPTIONAL,          INTENT(IN)    :: iter
      48             : 
      49             :     !Locals
      50             :     LOGICAL :: parallel
      51             : 
      52             :     SELECT TYPE(smat)
      53             :        CLASS IS (t_mpimat)
      54             : #ifdef CPP_MPI
      55        4872 :        parallel=smat%blacsdata%mpi_com/=MPI_COMM_SELF
      56             : #endif
      57             :        CLASS default
      58        2470 :        parallel=.FALSE.
      59             :     END SELECT
      60             : 
      61             : 
      62        7342 :     solver=select_solver(solver,parallel)
      63             : 
      64        7342 :     CALL timestart("Diagonalization")
      65             :     !Select the solver
      66        7342 :     CALL add_usage_data("diag-solver", solver)
      67        7342 :     SELECT CASE (solver)
      68             :     CASE (diag_elpa)
      69           0 :        CALL elpa_diag(hmat,smat,ne,eig,ev)
      70             :     CASE (diag_elpa_1node)
      71           0 :        CALL elpa_diag_onenode(hmat,smat,ne,eig,ev)
      72             :     CASE (diag_elemental)
      73             :        !CALL ELEMENTAL(hmat,smat,ne,eig,ev)
      74             :     CASE (diag_scalapack)
      75        4872 :        CALL scalapack(hmat,smat,ne,eig,ev)
      76             :     CASE (diag_magma)
      77           0 :        CALL magma_diag(hmat,smat,ne,eig,ev)
      78             :     CASE (diag_cusolver)
      79           0 :        CALL cusolver_diag(hmat,smat,ne,eig,ev)
      80             :     CASE (diag_lapack)
      81        2470 :        CALL lapack_diag(hmat,smat,ne,eig,ev)
      82             :       CASE (diag_lapack_singlePrec)
      83           0 :          CALL lapack_singlePrec_diag(hmat,smat,ne,eig,ev)
      84             :       CASE (diag_dummy)
      85           0 :          CALL dummy_diag(hmat,smat,ne,eig,ev)
      86             :       CASE (diag_elsielpa)
      87           0 :        CALL elsi_diag(1,hmat,smat,ne,eig,ev)
      88             :     CASE (diag_elsichase)
      89           0 :        CALL elsi_diag(9,hmat,smat,ne,eig,ev)
      90             :     CASE (diag_chase)
      91           0 :        IF (.NOT.(PRESENT(ikpt).AND.PRESENT(jsp).AND.PRESENT(iter))) CALL judft_error("Optional arguments must be present for chase in eigen_diag")
      92           0 :        CALL chase_diag(hmat,smat,ikpt,jsp,iter,ne,eig,ev)
      93             :     CASE (diag_debugout)
      94           0 :        CALL diag_writeout(smat,hmat)
      95             :     case (diag_stop)
      96           0 :        call JUDFT_error("FLEUR stopped as `-eig stop` is selected")   
      97             :     CASE default
      98        7342 :        CALL judft_error("No solver available to diagonalize matrix")
      99             :     END SELECT
     100        7342 :     CALL timestop("Diagonalization")
     101             : 
     102        7342 :   END SUBROUTINE eigen_diag
     103             : 
     104             : 
     105        7342 : END MODULE m_eigen_diag

Generated by: LCOV version 1.14