Skip to content

Commit

Permalink
Extended the DDCISD method to Jadamilu diagonalizer.
Browse files Browse the repository at this point in the history
  • Loading branch information
jacharrym committed Aug 16, 2024
1 parent 71551a7 commit 1a27f5a
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 31 deletions.
6 changes: 5 additions & 1 deletion src/CI/CIJadamilu.f90
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ recursive function CIJadamilu_buildCouplingOrderRecursion( s, numberOfSpecies,

end function CIJadamilu_buildCouplingOrderRecursion

subroutine CIJadamilu_jadamiluInterface(n, maxeig, eigenValues, eigenVectors)
subroutine CIJadamilu_jadamiluInterface(n, maxeig, eigenValues, eigenVectors, timeA, timeB)
implicit none
external DPJDREVCOM
integer(8) :: maxnev
Expand Down Expand Up @@ -249,7 +249,9 @@ subroutine CIJadamilu_jadamiluInterface(n, maxeig, eigenValues, eigenVectors)
integer(8) :: I,J,K,ii,jj,jjj
integer(4) :: iiter
logical :: fullMatrix
real(8) :: timeA, timeB

!$ timeA = omp_get_wtime()
maxsp = CONTROL_instance%CI_MADSPACE
!!if ( CONTROL_instance%CI_JACOBI ) then

Expand Down Expand Up @@ -372,6 +374,8 @@ subroutine CIJadamilu_jadamiluInterface(n, maxeig, eigenValues, eigenVectors)
CALL PJDCLEANUP
if ( allocated ( x ) ) deallocate ( x )

!$ timeB = omp_get_wtime()

end subroutine CIJadamilu_jadamiluInterface

subroutine matvec2 ( nx, v, w, iter)
Expand Down
6 changes: 6 additions & 0 deletions src/CI/CIOrder.f90
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,12 @@ subroutine CIOrder_settingCILevel()

end select

if ( CONTROL_instance%CI_DIAGONAL_DRESSED_SHIFT == "CISD" .and. trim(CIcore_instance%level) /= "CISD" ) then

call CIOrder_exception( ERROR, "Configuration interactor constructor", "DDCISD shift are only valid for CISD level!")

end if


end subroutine CIOrder_settingCILevel

Expand Down
1 change: 1 addition & 0 deletions src/CI/CIcore.f90
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ module CIcore_
type(vector) :: numberOfSpatialOrbitals2
type(vector8) :: eigenvalues
type(vector) :: groundStateEnergies
type(vector) :: DDCISDTiming
type(vector) :: lambda !!Number of particles per orbital, module only works for 1 or 2 particles per orbital
type(matrix), allocatable :: fourCenterIntegrals(:,:)
type(matrix), allocatable :: twoCenterIntegrals(:)
Expand Down
143 changes: 116 additions & 27 deletions src/CI/CImod.f90
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,6 @@ subroutine CImod_run()

write (*,*) "Building initial hamiltonian..."
call CIInitial_buildInitialCIMatrix2()
!!call CIFullMatrix_buildHamiltonianMatrix() This should be modified to build the CI matrix in memory

call Matrix_constructor (CIcore_instance%eigenVectors, &
int(CIcore_instance%numberOfConfigurations,8), &
Expand All @@ -221,15 +220,76 @@ subroutine CImod_run()
write(*,*) "Computer Physics Communications, vol. 177, pp. 951-964, 2007."
write(*,*) "============================================================="

!! diagonal correction. See 10.1016/j.chemphys.2007.07.001
if ( CONTROL_instance%CI_DIAGONAL_DRESSED_SHIFT == "CISD") then

call Vector_constructor ( CIcore_instance%groundStateEnergies, 30, 0.0_8)
call Vector_constructor ( CIcore_instance%DDCISDTiming, 30, 0.0_8)

write (6,*) ""
write (6,"(T2,A50, A12)") " ITERATIVE DIAGONAL DRESSED CISD SHIFT: " , CONTROL_instance%CI_DIAGONAL_DRESSED_SHIFT
write (6,"(T2,A62)") " ( Size-extensive correction) "
write (6,"(T2,A62)") " Based on 10.1016/j.chemphys.2007.07.001 and 10.1063/5.0182498"
write (6,*) ""

ecorr = 0.0_8

call CIJadamilu_jadamiluInterface(CIcore_instance%numberOfConfigurations, &
int(CONTROL_instance%NUMBER_OF_CI_STATES,8), &
CIcore_instance%eigenvalues, &
CIcore_instance%eigenVectors )
do i = 2, 31

!! add the diagonal shift
do a = 2, CIcore_instance%numberOfConfigurations
CIcore_instance%diagonalHamiltonianMatrix%values(a) = CIcore_instance%diagonalHamiltonianMatrix%values(a) + ecorr
end do

call CIJadamilu_jadamiluInterface(CIcore_instance%numberOfConfigurations, &
int(CONTROL_instance%NUMBER_OF_CI_STATES,8), &
CIcore_instance%eigenvalues, &
CIcore_instance%eigenVectors, timeA, timeB)

!! restore the original diagonal
do a = 2, CIcore_instance%numberOfConfigurations
CIcore_instance%diagonalHamiltonianMatrix%values(a) = CIcore_instance%diagonalHamiltonianMatrix%values(a) - ecorr
end do

ecorr = CIcore_instance%eigenvalues%values(1) - HartreeFock_instance%totalEnergy
CIcore_instance%groundStateEnergies%values(i) = CIcore_instance%eigenvalues%values(1)
CIcore_instance%DDCISDTiming%values(i) = timeB - timeA

write (6,"(T2,I2, F25.12, F25.12, F25.12, F16.4 )") i-1, CIcore_instance%groundStateEnergies%values(i), ecorr, (CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i)) , timeB - timeA

!! Restart ci matrix diagonalization from previous eigenvectors
CONTROL_instance%CI_LOAD_EIGENVECTOR = .True.

if ( abs( CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i) ) <= 1e-6) exit

end do


write (6,*) ""
write (6,"(T2,A42 )") " ITERATIVE DIAGONAL DRESSED CONVERGENCE "
write (6,"(T2,A95 )") "Iter Ground-State Energy Correlation Energy Energy Diff. Time(s) "
do i = 2, 31
write (6,"(T2,I2, F25.12, F25.12, F25.12, F16.4 )") i-1, CIcore_instance%groundStateEnergies%values(i), ecorr, (CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i)) , CIcore_instance%DDCISDTiming%values(i)
if ( abs( CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i) ) <= 1e-6) exit
end do

if ( CONTROL_instance%CI_SAVE_EIGENVECTOR ) then
call CImod_saveEigenVector ()
end if

else !! standard CI, no diagonal correction

call CIJadamilu_jadamiluInterface(CIcore_instance%numberOfConfigurations, &
int(CONTROL_instance%NUMBER_OF_CI_STATES,8), &
CIcore_instance%eigenvalues, &
CIcore_instance%eigenVectors, timeA, timeB )

if ( CONTROL_instance%CI_SAVE_EIGENVECTOR ) then
call CImod_saveEigenVector ()
end if

if ( CONTROL_instance%CI_SAVE_EIGENVECTOR ) then
call CImod_saveEigenVector ()
end if

case ("DSYEVX")

write (*,*) "Building Strings..."
Expand All @@ -241,9 +301,6 @@ subroutine CImod_run()
write (*,*) "Building diagonal..."
call CIDiag_buildDiagonal()

!write (*,*) "Building Hamiltonian..."
!call CIFullMatrix_buildHamiltonianMatrix()

call Matrix_constructor (CIcore_instance%eigenVectors, &
int(CIcore_instance%numberOfConfigurations,8), &
int(CONTROL_instance%NUMBER_OF_CI_STATES,8), 0.0_8)
Expand Down Expand Up @@ -289,7 +346,7 @@ subroutine CImod_run()

end do

else !! no diagonal correction
else !! standard CI, no diagonal correction

call CIFullMatrix_buildHamiltonianMatrix(timeA, timeB)
!$ write(*,"(A,E10.3,A4)") "** TOTAL Elapsed Time for building Hamiltonian Matrix : ", timeB - timeA ," (s)"
Expand All @@ -301,10 +358,6 @@ subroutine CImod_run()

end if

! call Matrix_eigen_select (CIcore_instance%hamiltonianMatrix, CIcore_instance%eigenvalues, &
! 1, CONTROL_instance%NUMBER_OF_CI_STATES, &
! flags = SYMMETRIC, dm = CIcore_instance%numberOfConfigurations )

!! deallocate transformed integrals
deallocate(CIcore_instance%twoCenterIntegrals)
deallocate(CIcore_instance%fourCenterIntegrals)
Expand All @@ -320,26 +373,62 @@ subroutine CImod_run()
write (*,*) "Building diagonal..."
call CIDiag_buildDiagonal()

write (*,*) "Building Hamiltonian..."
call CIFullMatrix_buildHamiltonianMatrix( timeA, timeB)

call Matrix_constructor (CIcore_instance%eigenVectors, &
int(CIcore_instance%numberOfConfigurations,8), &
int(CONTROL_instance%NUMBER_OF_CI_STATES,8), 0.0_8)

!! diagonal correction. See 10.1016/j.chemphys.2007.07.001
if ( CONTROL_instance%CI_DIAGONAL_DRESSED_SHIFT == "CISD") then

call Vector_constructor ( CIcore_instance%groundStateEnergies, 30, 0.0_8)

write (6,*) ""
write (6,"(T2,A50, A12)") " ITERATIVE DIAGONAL DRESSED CISD SHIFT: " , CONTROL_instance%CI_DIAGONAL_DRESSED_SHIFT
write (6,"(T2,A62)") " ( Size-extensive correction) "
write (6,"(T2,A62)") " Based on 10.1016/j.chemphys.2007.07.001 and 10.1063/5.0182498"
write (6,*) ""
write (6,"(T2,A95 )") "Iter Ground-State Energy Correlation Energy Energy Diff. Time(s) "

ecorr = 0.0_8

do i = 2, 31

call CIFullMatrix_buildHamiltonianMatrix( timeA, timeB)

do a = 2, CIcore_instance%numberOfConfigurations
CIcore_instance%hamiltonianMatrix%values(a,a) = CIcore_instance%hamiltonianMatrix%values(a,a) + ecorr
end do

call Matrix_eigen_dsyevr (CIcore_instance%hamiltonianMatrix, CIcore_instance%eigenvalues, &
1, CONTROL_instance%NUMBER_OF_CI_STATES, &
eigenVectors = CIcore_instance%eigenVectors, &
flags = SYMMETRIC)

ecorr = CIcore_instance%eigenvalues%values(1) - HartreeFock_instance%totalEnergy
CIcore_instance%groundStateEnergies%values(i) = CIcore_instance%eigenvalues%values(1)

write (6,"(T2,I2, F25.12, F25.12, F25.12, F16.4 )") i-1, CIcore_instance%groundStateEnergies%values(i), ecorr, (CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i)) , timeB - timeA

if ( abs( CIcore_instance%groundStateEnergies%values(i-1) - CIcore_instance%groundStateEnergies%values(i) ) <= 1e-6) exit

end do

else !! standard CI, no diagonal correction

call CIFullMatrix_buildHamiltonianMatrix(timeA, timeB)
!$ write(*,"(A,E10.3,A4)") "** TOTAL Elapsed Time for building Hamiltonian Matrix : ", timeB - timeA ," (s)"

call Matrix_eigen_dsyevr (CIcore_instance%hamiltonianMatrix, CIcore_instance%eigenvalues, &
1, CONTROL_instance%NUMBER_OF_CI_STATES, &
eigenVectors = CIcore_instance%eigenVectors, &
flags = SYMMETRIC)

end if

!! deallocate transformed integrals
deallocate(CIcore_instance%twoCenterIntegrals)
deallocate(CIcore_instance%fourCenterIntegrals)

call Matrix_eigen_dsyevr (CIcore_instance%hamiltonianMatrix, CIcore_instance%eigenvalues, &
1, CONTROL_instance%NUMBER_OF_CI_STATES, &
eigenVectors = CIcore_instance%eigenVectors, &
flags = SYMMETRIC)

! call Matrix_eigen_dsyevr (CIcore_instance%hamiltonianMatrix, CIcore_instance%eigenvalues, &
! 1, CONTROL_instance%NUMBER_OF_CI_STATES, &
! flags = SYMMETRIC, dm = CIcore_instance%numberOfConfigurations )

case default

call CImod_exception( ERROR, "CImod run", "Diagonalization method not implemented")
Expand Down
4 changes: 2 additions & 2 deletions test/H-e+H-.DD-CISD.lowdin
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ END TASKS
CONTROL
readCoefficients=F
numberOfCIstates=1
CIdiagonalizationMethod = "DSYEVX"
!CIdiagonalizationMethod = "JADAMILU"
!CIdiagonalizationMethod = "DSYEVX"
CIdiagonalizationMethod = "JADAMILU"
CIdiagonalDressedShift = "CISD"
END CONTROL

Expand Down
2 changes: 1 addition & 1 deletion test/H-e+H-.DD-CISD.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

refValues = {
"HF energy" : [-1.165428966723,1E-8],
"CISD energy" : [-1.284366244580,1E-8],
"CISD energy" : [-1.284366244580,1E-7],
}

testValues = dict(refValues) #copy
Expand Down

0 comments on commit 1a27f5a

Please sign in to comment.