45 REAL(
dp),
DIMENSION(:, :) :: matrix
47 COMPLEX(dp),
DIMENSION(:) :: evals
48 COMPLEX(dp),
DIMENSION(:, :) :: revec
50 INTEGER :: i, info, liwork, lwork, iwork(3 + 5*ndim)
51 REAL(
dp) :: tmp_array(ndim, ndim), &
52 work(1 + 6*ndim + 2*ndim**2)
53 REAL(
dp),
DIMENSION(ndim) :: eval
55 lwork = 1 + 6*ndim + 2*ndim**2
58 tmp_array(:, :) = matrix(:, :)
59 CALL dsyevd(jobvr,
"U", ndim, tmp_array, ndim, eval, work, lwork, iwork, liwork, info)
62 revec(:, i) = cmplx(tmp_array(:, i), real(0.0,
dp),
dp)
63 evals(i) = cmplx(eval(i), 0.0,
dp)
79 CHARACTER(1) :: jobvl, jobvr
80 REAL(
dp),
DIMENSION(:, :) :: matrix
82 COMPLEX(dp),
DIMENSION(:) :: evals
83 COMPLEX(dp),
DIMENSION(:, :) :: revec, levec
84#if defined (__HAS_IEEE_EXCEPTIONS)
85 LOGICAL,
DIMENSION(5) :: halt
88 REAL(
dp) :: work(20*ndim)
89 REAL(
dp),
DIMENSION(ndim) :: diag, offdiag
90 REAL(
dp),
DIMENSION(ndim, ndim) :: evec_r
94 levec(1, 1) = cmplx(0.0, 0.0,
dp)
96 diag(ndim) = matrix(ndim, ndim)
98 diag(i) = matrix(i, i)
99 offdiag(i) = matrix(i + 1, i)
103#if defined (__HAS_IEEE_EXCEPTIONS)
104 CALL ieee_get_halting_mode(ieee_all, halt)
105 CALL ieee_set_halting_mode(ieee_all, .false.)
108 CALL dstev(jobvr, ndim, diag, offdiag, evec_r, ndim, work, info)
110#if defined (__HAS_IEEE_EXCEPTIONS)
111 CALL ieee_set_halting_mode(ieee_all, halt)
117 revec(:, i) = cmplx(evec_r(:, i), real(0.0,
dp),
dp)
118 evals(i) = cmplx(diag(i), 0.0,
dp)
133 CHARACTER(1) :: jobvl, jobvr
134 REAL(
dp),
DIMENSION(:, :) :: matrix
136 COMPLEX(dp),
DIMENSION(:) :: evals
137 COMPLEX(dp),
DIMENSION(:, :) :: revec, levec
139 INTEGER :: i, info, lwork
140 LOGICAL :: selects(ndim)
141 REAL(
dp) :: norm, tmp_array(ndim, ndim), &
143 REAL(
dp),
DIMENSION(ndim) :: eval1, eval2
144 REAL(
dp),
DIMENSION(ndim, ndim) :: evec_l, evec_r
149 eval1 = real(0.0,
dp); eval2 = real(0.0,
dp)
150 tmp_array(:, :) = matrix(:, :)
153 CALL dhseqr(
'S',
'I', ndim, 1, ndim, tmp_array, ndim, eval1, eval2, evec_r, ndim, work, lwork, info)
155 lwork = min(20*ndim, int(work(1)))
156 CALL dhseqr(
'S',
'I', ndim, 1, ndim, tmp_array, ndim, eval1, eval2, evec_r, ndim, work, lwork, info)
157 CALL dtrevc(
'R',
'B', selects, ndim, tmp_array, ndim, evec_l, ndim, evec_r, ndim, ndim, ndim, work, info)
164 IF (abs(eval2(i)) < epsilon(real(0.0,
dp)))
THEN
165 evec_r(:, i) = evec_r(:, i)/norm2(evec_r(:, i))
166 revec(:, i) = cmplx(evec_r(:, i), real(0.0,
dp),
dp)
167 levec(:, i) = cmplx(evec_l(:, i), real(0.0,
dp),
dp)
169 ELSE IF (eval2(i) > epsilon(real(0.0,
dp)))
THEN
170 norm = sqrt(sum(evec_r(:, i)**2.0_dp) + sum(evec_r(:, i + 1)**2.0_dp))
171 revec(:, i) = cmplx(evec_r(:, i), evec_r(:, i + 1),
dp)/norm
172 revec(:, i + 1) = cmplx(evec_r(:, i), -evec_r(:, i + 1),
dp)/norm
173 levec(:, i) = cmplx(evec_l(:, i), evec_l(:, i + 1),
dp)
174 levec(:, i + 1) = cmplx(evec_l(:, i), -evec_l(:, i + 1),
dp)
177 cpabort(
'something went wrong while sorting the EV in arnoldi_geev')
183 evals(i) = cmplx(eval1(i), eval2(i),
dp)