40 REAL(
dp),
DIMENSION(:, :) :: matrix
42 COMPLEX(dp),
DIMENSION(:) :: evals
43 COMPLEX(dp),
DIMENSION(:, :) :: revec
45 INTEGER :: i, info, liwork, lwork, iwork(3 + 5*ndim)
46 REAL(
dp) :: tmp_array(ndim, ndim), &
47 work(1 + 6*ndim + 2*ndim**2)
48 REAL(
dp),
DIMENSION(ndim) :: eval
50 lwork = 1 + 6*ndim + 2*ndim**2
53 tmp_array(:, :) = matrix(:, :)
54 CALL dsyevd(jobvr,
"U", ndim, tmp_array, ndim, eval, work, lwork, iwork, liwork, info)
57 revec(:, i) = cmplx(tmp_array(:, i), real(0.0,
dp),
dp)
58 evals(i) = cmplx(eval(i), 0.0,
dp)
74 CHARACTER(1) :: jobvl, jobvr
75 REAL(
dp),
DIMENSION(:, :) :: matrix
77 COMPLEX(dp),
DIMENSION(:) :: evals
78 COMPLEX(dp),
DIMENSION(:, :) :: revec, levec
81 REAL(
dp) :: work(20*ndim)
82 REAL(
dp),
DIMENSION(ndim) :: diag, offdiag
83 REAL(
dp),
DIMENSION(ndim, ndim) :: evec_r
87 levec(1, 1) = cmplx(0.0, 0.0,
dp)
89 diag(ndim) = matrix(ndim, ndim)
91 diag(i) = matrix(i, i)
92 offdiag(i) = matrix(i + 1, i)
96 CALL dstev(jobvr, ndim, diag, offdiag, evec_r, ndim, work, info)
99 revec(:, i) = cmplx(evec_r(:, i), real(0.0,
dp),
dp)
100 evals(i) = cmplx(diag(i), 0.0,
dp)
115 CHARACTER(1) :: jobvl, jobvr
116 REAL(
dp),
DIMENSION(:, :) :: matrix
118 COMPLEX(dp),
DIMENSION(:) :: evals
119 COMPLEX(dp),
DIMENSION(:, :) :: revec, levec
121 INTEGER :: i, info, lwork
122 LOGICAL :: selects(ndim)
123 REAL(
dp) :: norm, tmp_array(ndim, ndim), &
125 REAL(
dp),
DIMENSION(ndim) :: eval1, eval2
126 REAL(
dp),
DIMENSION(ndim, ndim) :: evec_l, evec_r
131 eval1 = real(0.0,
dp); eval2 = real(0.0,
dp)
132 tmp_array(:, :) = matrix(:, :)
135 CALL dhseqr(
'S',
'I', ndim, 1, ndim, tmp_array, ndim, eval1, eval2, evec_r, ndim, work, lwork, info)
137 lwork = min(20*ndim, int(work(1)))
138 CALL dhseqr(
'S',
'I', ndim, 1, ndim, tmp_array, ndim, eval1, eval2, evec_r, ndim, work, lwork, info)
139 CALL dtrevc(
'R',
'B', selects, ndim, tmp_array, ndim, evec_l, ndim, evec_r, ndim, ndim, ndim, work, info)
145 DO WHILE (i .LE. ndim)
146 IF (abs(eval2(i)) .LT. epsilon(real(0.0,
dp)))
THEN
147 evec_r(:, i) = evec_r(:, i)/sqrt(dot_product(evec_r(:, i), evec_r(:, i)))
148 revec(:, i) = cmplx(evec_r(:, i), real(0.0,
dp),
dp)
149 levec(:, i) = cmplx(evec_l(:, i), real(0.0,
dp),
dp)
151 ELSE IF (eval2(i) .GT. epsilon(real(0.0,
dp)))
THEN
152 norm = sqrt(sum(evec_r(:, i)**2.0_dp) + sum(evec_r(:, i + 1)**2.0_dp))
153 revec(:, i) = cmplx(evec_r(:, i), evec_r(:, i + 1),
dp)/norm
154 revec(:, i + 1) = cmplx(evec_r(:, i), -evec_r(:, i + 1),
dp)/norm
155 levec(:, i) = cmplx(evec_l(:, i), evec_l(:, i + 1),
dp)
156 levec(:, i + 1) = cmplx(evec_l(:, i), -evec_l(:, i + 1),
dp)
159 cpabort(
'something went wrong while sorting the EV in arnoldi_geev')
165 evals(i) = cmplx(eval1(i), eval2(i),
dp)