Skip to content

Commit

Permalink
Implemented SCI method.
Browse files Browse the repository at this point in the history
Selected Configuration Interaction (SCI) methods:
- Adaptive Sampling CI (ASCI)

Based on 10.1063/1.4955109

It's neccessary to implement an efficient sorting algorithm
  • Loading branch information
jacharrym committed Sep 3, 2024
1 parent 642e847 commit 3fdbe52
Show file tree
Hide file tree
Showing 11 changed files with 1,538 additions and 195 deletions.
3 changes: 2 additions & 1 deletion src/CI/CIInitial.f90
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ function CIInitial_calculateEnergyOne( n, thisA, thisB ) result (auxCIenergy)

end function CIInitial_calculateEnergyOne


function CIInitial_calculateEnergyTwo( n, thisA, thisB ) result (auxCIenergy)
implicit none
integer(8) :: thisA(:), thisB(:)
Expand Down Expand Up @@ -521,7 +522,7 @@ function CIInitial_calculateEnergyTwo( n, thisA, thisB ) result (auxCIenergy)

auxCIenergy = auxCIenergy + &
CIcore_instance%fourCenterIntegrals(i,j)%values(auxIndex, 1)

end if
end do
end do
Expand Down
38 changes: 22 additions & 16 deletions src/CI/CIJadamilu.f90
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,7 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)
integer :: numberOfSpecies, s
integer, allocatable :: stringAinB(:)
integer(4) :: coupling
integer(4) :: coupling2
integer(4) :: ssize,auxcoupling(3) !! 0,1,2
integer(8) :: indexConfA(:)
integer(8), allocatable :: indexConfB(:)
Expand Down Expand Up @@ -746,23 +747,27 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)
do ci = 1, size(CIcore_instance%numberOfStrings(i)%values, dim = 1)
do b = 1 + ssize , CIcore_instance%numberOfStrings(i)%values(ci) + ssize

!b = ssize + bb
do p = CIcore_instance%numberOfCoreOrbitals%values(i)+1, &
CIcore_instance%numberOfOccupiedOrbitals%values(i)
!do p = 1, &
!do p = CIcore_instance%numberOfCoreOrbitals%values(i)+1, &
! CIcore_instance%numberOfOccupiedOrbitals%values(i)
! stringAinB(p) = CIcore_instance%orbitals(i)%values( &
! CIcore_instance%strings(i)%values(p,a),b)
!end do

stringAinB(p) = CIcore_instance%orbitals(i)%values( &
CIcore_instance%strings(i)%values(p,a),b)
!coupling = CIcore_instance%numberOfOccupiedOrbitals%values(i) - sum ( stringAinB ) - CIcore_instance%numberOfCoreOrbitals%values(i)

!coupling = 0
!!$omp simd
!do p = CIcore_instance%numberOfCoreOrbitals%values(i)+1, CIcore_instance%numberOfOrbitals%values(i)
! coupling = coupling + CIcore_instance%orbitals(i)%values(p,a) * CIcore_instance%orbitals(i)%values(p,b)
!end do
!coupling = CIcore_instance%numberOfOccupiedOrbitals%values(i) - coupling - CIcore_instance%numberOfCoreOrbitals%values(i)

!stringBinA(p) = CIcore_instance%orbitals(i)%values( &
! CIcore_instance%strings(i)%values(p,b),a)
end do

coupling = CIcore_instance%numberOfOccupiedOrbitals%values(i) - sum ( stringAinB ) - &
CIcore_instance%numberOfCoreOrbitals%values(i)
coupling = CIcore_instance%numberOfOccupiedOrbitals%values(i) - sum(CIcore_instance%orbitals(i)%values(:,a) * CIcore_instance%orbitals(i)%values(:,b)) ! - CIcore_instance%numberOfCoreOrbitals%values(i)

! coupling = CIcore_instance%numberOfOccupiedOrbitals%values(i) - sum ( stringAinB )
!!$omp simd
!coupling = sum(abs(CIcore_instance%orbitals(i)%values(:,a) - CIcore_instance%orbitals(i)%values(:,b)))
!coupling = coupling / 2

if ( coupling <= 2 ) then

Expand Down Expand Up @@ -823,6 +828,7 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)
do ci = 1, size(CIcore_instance%numberOfStrings(i)%values, dim = 1) !! 1 is always zero
cilevel(i) = ci - 1

if ( CIcore_instance%nCouplingOneTwo(i,nn)%values( 2,ci ) == 0 ) cycle
auxos = CIJadamilu_buildRowRecursionFirstOne( i, indexConfA, indexConfB, nn, cilevel )

end do
Expand All @@ -832,7 +838,6 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)
!!$ CIcore_instance%timeB(3) = omp_get_wtime()

!!$ CIcore_instance%timeA(4) = omp_get_wtime()

!$omp atomic
w(c) = w(c) + vc*CIcore_instance%diagonalHamiltonianMatrix%values(c)
!$omp end atomic
Expand All @@ -849,7 +854,7 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)

do ci = 1, size(CIcore_instance%numberOfStrings(i)%values, dim = 1) !! 1 is always zero
cilevel(i) = ci - 1

if ( CIcore_instance%nCouplingOneTwo(i,nn)%values( 2,ci ) == 0 ) cycle
do u = 1, CIcore_instance%sizeciorderlist
if ( sum(abs(cilevel - &
CIcore_instance%ciorderlist( CIcore_instance%auxciorderlist(u), :))) == 0 ) then
Expand Down Expand Up @@ -877,7 +882,7 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)

do ci = 1, size(CIcore_instance%numberOfStrings(i)%values, dim = 1) !! 1 is always zero
cilevel(i) = ci - 1

if ( CIcore_instance%nCouplingOneTwo(i,nn)%values( 3,ci ) == 0 ) cycle
do u = 1, CIcore_instance%sizeCiOrderList
if ( sum(abs(cilevel - &
CIcore_instance%ciOrderList( CIcore_instance%auxciOrderList(u), :))) == 0 ) then
Expand Down Expand Up @@ -911,7 +916,9 @@ subroutine CIJadamilu_buildRow( nn, indexConfA, c, w, vc, cilevelA)

do ci = 1, size(CIcore_instance%numberOfStrings(i)%values, dim = 1) !! 1 is always zero
cilevel(i) = ci - 1
if ( CIcore_instance%nCouplingOneTwo(i,nn)%values( 2,ci ) == 0 ) cycle
do cj = 1, size(CIcore_instance%numberOfStrings(j)%values, dim = 1) !! 1 is always zero
if ( CIcore_instance%nCouplingOneTwo(j,nn)%values( 2,cj ) == 0 ) cycle
cilevel(j) = cj - 1
do u = 1, CIcore_instance%sizeCiOrderList
if ( sum(abs(cilevel - &
Expand Down Expand Up @@ -1149,7 +1156,6 @@ function CIJadamilu_buildRowRecursionSecondTwoDiff( ii, jj, indexConfB, w, vc, d
auxIndex1 = CIcore_instance%couplingMatrixOrbOne(ii,nn)%values(bi)
auxIndex1 = CIcore_instance%numberOfSpatialOrbitals2%values(jj) * (auxIndex1 - 1 )

!$omp simd
do aaj = 1, CIcore_instance%nCouplingOneTwo(jj,nn)%values( 2,cj )
aj = ssizej + aaj
indexConfB(jj) = CIcore_instance%couplingMatrix(jj,nn)%values(aj, 2)
Expand Down
8 changes: 8 additions & 0 deletions src/CI/CIOrder.f90
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@ subroutine CIOrder_settingCILevel()

CIcore_instance%maxCILevel = sum(CIcore_instance%CILevel)

case ( "SCI" ) !! same as FCI

do i=1, numberOfSpecies
CIcore_instance%CILevel(i) = CIcore_instance%numberOfOccupiedOrbitals%values(i)
end do

CIcore_instance%maxCILevel = sum(CIcore_instance%CILevel)

case ( "CIS" )

do i=1, numberOfSpecies
Expand Down
Loading

0 comments on commit 3fdbe52

Please sign in to comment.