34 COMPLEX(dp),
INTENT(IN) :: h(:, :), s(:, :), positions(:, :, :)
35 REAL(
dp),
INTENT(OUT) :: energies(:)
36 COMPLEX(dp),
INTENT(OUT) :: current(:, :, :)
37 INTEGER,
INTENT(OUT) :: status
39 COMPLEX(dp),
ALLOCATABLE :: c(:, :), moment(:, :)
40 INTEGER :: axis, i, j, n
46 IF (n < 1 .OR.
SIZE(h, 2) /= n .OR. any(shape(s) /= [n, n]))
RETURN
47 IF (
SIZE(energies) /= n .OR. any(shape(current) /= [n, n, 3]))
RETURN
48 IF (any(shape(positions) /= [n, n, 3]))
RETURN
49 IF (.NOT. valid_hermitian(h) .OR. .NOT. valid_hermitian(s))
RETURN
51 IF (.NOT. valid_hermitian(positions(:, :, axis)))
RETURN
53 ALLOCATE (c(n, n), moment(n, n))
55 IF (status /= 0)
RETURN
58 moment(:, :) = matmul(conjg(transpose(c)), matmul(positions(:, :, axis), c))
61 current(i, j, axis) = (energies(i) - energies(j))*moment(i, j)
65 IF (.NOT. all(ieee_is_finite(real(current,
dp))))
RETURN
66 IF (.NOT. all(ieee_is_finite(aimag(current))))
RETURN
78 COMPLEX(dp),
INTENT(IN) :: h(:, :), s(:, :)
79 REAL(
dp),
INTENT(OUT) :: energies(:)
80 COMPLEX(dp),
INTENT(OUT) :: c(:, :)
81 INTEGER,
INTENT(OUT) :: status
83 COMPLEX(dp),
ALLOCATABLE :: b(:, :), work(:)
84 REAL(
dp),
ALLOCATABLE :: rwork(:)
86#if defined(__HAS_IEEE_EXCEPTIONS)
87 LOGICAL :: halt(size(ieee_all))
94 IF (n < 1 .OR.
SIZE(h, 2) /= n .OR. any(shape(s) /= [n, n]))
RETURN
95 IF (
SIZE(energies) /= n .OR. any(shape(c) /= [n, n]))
RETURN
96 IF (.NOT. valid_hermitian(h) .OR. .NOT. valid_hermitian(s))
RETURN
97 ALLOCATE (b(n, n), work(max(1, 2*n)), rwork(max(1, 3*n)))
99#if defined(__HAS_IEEE_EXCEPTIONS)
100 CALL ieee_get_halting_mode(ieee_all, halt)
101 CALL ieee_set_halting_mode(ieee_all, .false.)
103 CALL zheev(
'N',
'U', n, b, n, energies, work,
SIZE(work), rwork, info)
104#if defined(__HAS_IEEE_EXCEPTIONS)
105 CALL ieee_set_halting_mode(ieee_all, halt)
107 status = abs(info) + 1
108 IF (info /= 0 .OR. .NOT. all(ieee_is_finite(energies)))
RETURN
110 IF (maxval(energies) <= 0.0_dp)
RETURN
111 IF (minval(energies) <= 1.e-10_dp*maxval(energies))
RETURN
114#if defined(__HAS_IEEE_EXCEPTIONS)
115 CALL ieee_set_halting_mode(ieee_all, .false.)
117 CALL zhegv(1,
'V',
'U', n, c, n, b, n, energies, work,
SIZE(work), rwork, info)
118#if defined(__HAS_IEEE_EXCEPTIONS)
119 CALL ieee_set_halting_mode(ieee_all, halt)
121 status = abs(info) + 1
122 IF (info /= 0 .OR. .NOT. all(ieee_is_finite(energies)))
RETURN
123 IF (.NOT. all(ieee_is_finite(real(c,
dp))))
RETURN
124 IF (.NOT. all(ieee_is_finite(aimag(c))))
RETURN
135 valid = all(ieee_is_finite(real(a,
dp))) .AND. all(ieee_is_finite(aimag(a)))
subroutine, public projected_current(h, s, positions, energies, current, status)
Compute C^dagger (H S^-1 X - X S^-1 H) C without forming S^-1.
subroutine, public projected_eigensystem(h, s, energies, c, status)
Complete generalized eigensystem with a positive, well-conditioned AO metric.