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
|