29 eigenvalue, reference, energy_gap)
RESULT(weight)
31 REAL(kind=
dp),
INTENT(IN) :: eigenvalue, reference, energy_gap
33 REAL(kind=
dp) :: delta
35 delta = eigenvalue - reference
36 weight = 1.0_dp/max(energy_gap, delta)
49 degeneracy_tolerance)
RESULT(rank_used)
51 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eigenvalues
52 INTEGER,
INTENT(IN) :: nocc, max_rank
53 REAL(kind=
dp),
INTENT(IN) :: degeneracy_tolerance
55 INTEGER :: ncomplement
56 REAL(kind=
dp) :: scale
59 ncomplement =
SIZE(eigenvalues) - nocc
60 IF (nocc < 0 .OR. ncomplement <= 0 .OR. max_rank <= 0)
RETURN
62 rank_used = min(max_rank, ncomplement)
65 DO WHILE (rank_used > 0 .AND. rank_used < ncomplement)
66 scale = max(1.0_dp, abs(eigenvalues(nocc + rank_used)), &
67 abs(eigenvalues(nocc + rank_used + 1)))
68 IF (abs(eigenvalues(nocc + rank_used + 1) - eigenvalues(nocc + rank_used)) > &
69 degeneracy_tolerance*scale)
EXIT
70 rank_used = rank_used - 1
pure integer function, public low_rank_select_rank(eigenvalues, nocc, max_rank, degeneracy_tolerance)
Select a bounded spectral rank without cutting a degenerate boundary manifold.