24 #include "../base/base_uses.f90"
32 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eigenvalueproblems'
35 MODULE PROCEDURE diagonalise_ssyev
36 MODULE PROCEDURE diagonalise_chpev
39 INTERFACE singular_values
40 MODULE PROCEDURE cp2k_sgesvd
41 MODULE PROCEDURE cp2k_cgesvd
54 SUBROUTINE diagonalise_ssyev(matrix, mysize, storageform, eigenvalues, &
57 REAL(KIND=
dp),
INTENT(IN) :: matrix(:, :)
58 INTEGER,
INTENT(IN) :: mysize
59 CHARACTER(LEN=*),
INTENT(IN) :: storageform
60 REAL(KIND=
dp),
INTENT(OUT) :: eigenvalues(:), eigenvectors(:, :)
62 CHARACTER,
PARAMETER :: jobz =
"V"
65 INTEGER :: info, lda, lwork
66 REAL(KIND=
dp) :: work(3*mysize - 1)
68 IF (storageform(1:5) ==
"Lower" .OR. &
69 storageform(1:5) ==
"LOWER" .OR. &
70 storageform(1:5) ==
"lower")
THEN
72 ELSE IF (storageform(1:5) ==
"Upper" .OR. &
73 storageform(1:5) ==
"upper" .OR. &
74 storageform(1:5) ==
"UPPER")
THEN
77 cpabort(
"Unknown form of storage")
85 CALL lapack_ssyev(jobz, uplo, mysize, eigenvectors, lda, eigenvalues, &
88 cpabort(
"Error in diagonalisation")
91 END SUBROUTINE diagonalise_ssyev
101 SUBROUTINE diagonalise_chpev(matrix, mysize, storageform, eigenvalues, &
104 COMPLEX(KIND=dp),
INTENT(INOUT) :: matrix(:)
105 INTEGER,
INTENT(IN) :: mysize
106 CHARACTER(LEN=*),
INTENT(IN) :: storageform
107 REAL(KIND=
dp),
INTENT(OUT) :: eigenvalues(:)
108 COMPLEX(KIND=dp),
INTENT(OUT) :: eigenvectors(:, :)
110 CHARACTER,
PARAMETER :: jobz =
"V"
114 COMPLEX(KIND=dp) :: work(2*mysize - 1)
115 REAL(KIND=
dp) :: rwork(3*mysize - 2)
117 IF (storageform(1:5) ==
"Lower" .OR. &
118 storageform(1:5) ==
"LOWER" .OR. &
119 storageform(1:5) ==
"lower")
THEN
121 ELSE IF (storageform(1:5) ==
"Upper" .OR. &
122 storageform(1:5) ==
"upper" .OR. &
123 storageform(1:5) ==
"UPPER")
THEN
126 cpabort(
"Unknown form of storage")
129 CALL lapack_chpev(jobz, uplo, mysize, matrix, eigenvalues, &
130 eigenvectors, mysize, work, rwork, info)
132 cpabort(
"Error in diagonalisation")
135 END SUBROUTINE diagonalise_chpev
146 SUBROUTINE cp2k_sgesvd(matrix, svalues, mrow, ncol, uvec, vtvec)
148 REAL(KIND=
dp),
INTENT(IN) :: matrix(:, :)
149 REAL(KIND=
dp),
INTENT(OUT) :: svalues(:)
150 INTEGER,
INTENT(IN) :: mrow, ncol
151 REAL(KIND=
dp),
INTENT(OUT) :: uvec(:, :), vtvec(:, :)
153 CHARACTER,
PARAMETER :: jobu =
"A", jobvt =
"A"
155 INTEGER :: info, lda, ldu, ldvt, lwork
156 REAL(KIND=
dp) :: work(25*(mrow + ncol))
158 lwork = 25*(mrow + ncol)
159 lda =
SIZE(matrix, 1)
161 ldvt =
SIZE(vtvec, 1)
163 CALL lapack_sgesvd(jobu, jobvt, mrow, ncol, matrix, lda, svalues, &
164 uvec, ldu, vtvec, ldvt, work, lwork, info)
166 cpabort(
"Error in singular value decomposition.")
169 END SUBROUTINE cp2k_sgesvd
180 SUBROUTINE cp2k_cgesvd(matrix, svalues, mrow, ncol, uvec, vtvec)
182 COMPLEX(KIND=dp),
INTENT(IN) :: matrix(:, :)
183 REAL(KIND=
dp),
INTENT(OUT) :: svalues(:)
184 INTEGER,
INTENT(IN) :: mrow, ncol
185 COMPLEX(KIND=dp),
INTENT(OUT) :: uvec(:, :), vtvec(:, :)
187 CHARACTER,
PARAMETER :: jobu =
"A", jobvt =
"A"
189 INTEGER :: info, lda, ldu, ldvt, lwork
190 COMPLEX(KIND=dp) :: work(25*(mrow + ncol))
191 REAL(KIND=
dp) :: rwork(25*(mrow + ncol))
193 lwork = 25*(mrow + ncol)
194 lda =
SIZE(matrix, 1)
196 ldvt =
SIZE(vtvec, 1)
198 CALL lapack_cgesvd(jobu, jobvt, mrow, ncol, matrix, lda, svalues, &
199 uvec, ldu, vtvec, ldvt, work, lwork, rwork, info)
201 cpabort(
"Error in singular value decomposition.")
204 END SUBROUTINE cp2k_cgesvd
Provides interfaces to LAPACK eigenvalue/SVD routines.
Defines the basic variable types.
integer, parameter, public dp
Interface to the LAPACK F77 library.