17#include "../base/base_uses.f90"
25 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eigenvalueproblems'
28 MODULE PROCEDURE diagonalise_ssyev
29 MODULE PROCEDURE diagonalise_chpev
32 INTERFACE singular_values
33 MODULE PROCEDURE cp2k_sgesvd
34 MODULE PROCEDURE cp2k_cgesvd
47 SUBROUTINE diagonalise_ssyev(matrix, mysize, uplo, eigenvalues, &
50 REAL(KIND=
dp),
INTENT(IN) :: matrix(:, :)
51 INTEGER,
INTENT(IN) :: mysize
52 CHARACTER(LEN=1),
INTENT(IN) :: uplo
53 REAL(KIND=
dp),
INTENT(OUT) :: eigenvalues(:), eigenvectors(:, :)
55 CHARACTER,
PARAMETER :: jobz =
"V"
57 INTEGER :: info, lda, lwork
58 REAL(KIND=
dp) :: work(3*mysize - 1)
65 CALL dsyev(jobz, uplo, mysize, eigenvectors, lda, eigenvalues, &
68 cpabort(
"Error in diagonalisation")
71 END SUBROUTINE diagonalise_ssyev
81 SUBROUTINE diagonalise_chpev(matrix, mysize, uplo, eigenvalues, &
84 COMPLEX(KIND=dp),
INTENT(INOUT) :: matrix(:)
85 INTEGER,
INTENT(IN) :: mysize
86 CHARACTER(LEN=1),
INTENT(IN) :: uplo
87 REAL(KIND=
dp),
INTENT(OUT) :: eigenvalues(:)
88 COMPLEX(KIND=dp),
INTENT(OUT) :: eigenvectors(:, :)
90 CHARACTER,
PARAMETER :: jobz =
"V"
93 COMPLEX(KIND=dp) :: work(2*mysize - 1)
94 REAL(KIND=
dp) :: rwork(3*mysize - 2)
96 CALL zhpev(jobz, uplo, mysize, matrix, eigenvalues, &
97 eigenvectors, mysize, work, rwork, info)
99 cpabort(
"Error in diagonalisation")
102 END SUBROUTINE diagonalise_chpev
113 SUBROUTINE cp2k_sgesvd(matrix, svalues, mrow, ncol, uvec, vtvec)
115 REAL(KIND=
dp),
INTENT(IN) :: matrix(:, :)
116 REAL(KIND=
dp),
INTENT(OUT) :: svalues(:)
117 INTEGER,
INTENT(IN) :: mrow, ncol
118 REAL(KIND=
dp),
INTENT(OUT) :: uvec(:, :), vtvec(:, :)
120 CHARACTER,
PARAMETER :: jobu =
"A", jobvt =
"A"
122 INTEGER :: info, lda, ldu, ldvt, lwork
123 REAL(KIND=
dp) :: work(25*(mrow + ncol))
125 lwork = 25*(mrow + ncol)
126 lda =
SIZE(matrix, 1)
128 ldvt =
SIZE(vtvec, 1)
130 CALL dgesvd(jobu, jobvt, mrow, ncol, matrix, lda, svalues, &
131 uvec, ldu, vtvec, ldvt, work, lwork, info)
133 cpabort(
"Error in singular value decomposition.")
136 END SUBROUTINE cp2k_sgesvd
147 SUBROUTINE cp2k_cgesvd(matrix, svalues, mrow, ncol, uvec, vtvec)
149 COMPLEX(KIND=dp),
INTENT(IN) :: matrix(:, :)
150 REAL(KIND=
dp),
INTENT(OUT) :: svalues(:)
151 INTEGER,
INTENT(IN) :: mrow, ncol
152 COMPLEX(KIND=dp),
INTENT(OUT) :: uvec(:, :), vtvec(:, :)
154 CHARACTER,
PARAMETER :: jobu =
"A", jobvt =
"A"
156 INTEGER :: info, lda, ldu, ldvt, lwork
157 COMPLEX(KIND=dp) :: work(25*(mrow + ncol))
158 REAL(KIND=
dp) :: rwork(25*(mrow + ncol))
160 lwork = 25*(mrow + ncol)
161 lda =
SIZE(matrix, 1)
163 ldvt =
SIZE(vtvec, 1)
165 CALL zgesvd(jobu, jobvt, mrow, ncol, matrix, lda, svalues, &
166 uvec, ldu, vtvec, ldvt, work, lwork, rwork, info)
168 cpabort(
"Error in singular value decomposition.")
171 END SUBROUTINE cp2k_cgesvd
Provides interfaces to LAPACK eigenvalue/SVD routines.
Defines the basic variable types.
integer, parameter, public dp