Skip to content

Commit e0ef3e1

Browse files
committed
Initial implementation of Cholesky
1 parent a9ce4b2 commit e0ef3e1

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

src/dirac.f90

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module dirac
1616
nlsf2focc, get_atomic_states_rel, nlf2focc, get_atomic_states_nonrel
1717
use energies, only: thomas_fermi_potential
1818
use iso_c_binding, only: c_double, c_int
19+
use lapack, only: dpotrf
1920
implicit none
2021
private
2122
public solve_dirac, csolve_dirac, solve_dirac_eigenproblem
@@ -37,7 +38,8 @@ subroutine solve_dirac_eigenproblem(Nb, Nq, Lmin, Lmax, alpha, alpha_j, xe, xiq_
3738
real(dp), intent(out) :: V(:,:)
3839
integer, intent(out) :: idx
3940
real(dp), intent(in) :: E_dirac_shift
40-
integer :: kappa, i
41+
real(dp) :: SU(size(S,1),size(S,2))
42+
integer :: kappa, i, info, j
4143
idx = 0
4244
do kappa = Lmin, Lmax
4345
if (kappa == 0) cycle
@@ -58,6 +60,13 @@ subroutine solve_dirac_eigenproblem(Nb, Nq, Lmin, Lmax, alpha, alpha_j, xe, xiq_
5860
! we still need two seperate eigensolves for 1e-8 accuracy:
5961
!H = (H + transpose(H))/2
6062
!S = (S + transpose(S))/2
63+
SU = S
64+
do j = 1, size(SU,1)
65+
SU(j+1:,j) = 0
66+
end do
67+
call dpotrf('U', size(SU,1), SU, size(SU,1), info)
68+
if (info /= 0) error stop
69+
S = matmul(transpose(SU), SU)
6170

6271
if (accurate_eigensolver) then
6372
call eigh(H, S, lam)

src/lapack.f90

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ SUBROUTINE DSYGVX( ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, &
8989
Z( LDZ, * )
9090
END SUBROUTINE
9191

92+
SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO )
93+
import :: dp
94+
CHARACTER UPLO
95+
INTEGER INFO, LDA, N
96+
REAL(dp) A( LDA, * )
97+
END SUBROUTINE
98+
9299
REAL(dp) FUNCTION DLAMCH( CMACH )
93100
import :: dp
94101
CHARACTER CMACH

0 commit comments

Comments
 (0)