10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-12-22 20:35:19 +01:00

Less memory in Davdison

This commit is contained in:
Anthony Scemama 2017-04-17 03:58:02 +02:00
parent 30d529aeb2
commit dc2481c966

View File

@ -410,6 +410,7 @@ BEGIN_PROVIDER [ double precision, psi_bilinear_matrix_values, (N_det,N_states)
integer, external :: get_index_in_psi_det_alpha_unique integer, external :: get_index_in_psi_det_alpha_unique
integer, external :: get_index_in_psi_det_beta_unique integer, external :: get_index_in_psi_det_beta_unique
allocate(to_sort(N_det)) allocate(to_sort(N_det))
!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(i,j,k,l)
do k=1,N_det do k=1,N_det
i = get_index_in_psi_det_alpha_unique(psi_det(1,1,k),N_int) i = get_index_in_psi_det_alpha_unique(psi_det(1,1,k),N_int)
j = get_index_in_psi_det_beta_unique (psi_det(1,2,k),N_int) j = get_index_in_psi_det_beta_unique (psi_det(1,2,k),N_int)
@ -422,6 +423,7 @@ BEGIN_PROVIDER [ double precision, psi_bilinear_matrix_values, (N_det,N_states)
to_sort(k) = int(N_det_alpha_unique,8) * int(j-1,8) + int(i,8) to_sort(k) = int(N_det_alpha_unique,8) * int(j-1,8) + int(i,8)
psi_bilinear_matrix_order(k) = k psi_bilinear_matrix_order(k) = k
enddo enddo
!$OMP END PARALLEL DO
call i8sort(to_sort, psi_bilinear_matrix_order, N_det) call i8sort(to_sort, psi_bilinear_matrix_order, N_det)
call iset_order(psi_bilinear_matrix_rows,psi_bilinear_matrix_order,N_det) call iset_order(psi_bilinear_matrix_rows,psi_bilinear_matrix_order,N_det)
call iset_order(psi_bilinear_matrix_columns,psi_bilinear_matrix_order,N_det) call iset_order(psi_bilinear_matrix_columns,psi_bilinear_matrix_order,N_det)
@ -439,9 +441,11 @@ BEGIN_PROVIDER [ integer, psi_bilinear_matrix_order_reverse , (N_det) ]
! Order which allors to go from psi_bilinear_matrix to psi_det ! Order which allors to go from psi_bilinear_matrix to psi_det
END_DOC END_DOC
integer :: k integer :: k
!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(k)
do k=1,N_det do k=1,N_det
psi_bilinear_matrix_order_reverse(psi_bilinear_matrix_order(k)) = k psi_bilinear_matrix_order_reverse(psi_bilinear_matrix_order(k)) = k
enddo enddo
!$OMP END PARALLEL DO
END_PROVIDER END_PROVIDER
@ -491,11 +495,15 @@ BEGIN_PROVIDER [ double precision, psi_bilinear_matrix_transp_values, (N_det,N_
integer*8, allocatable :: to_sort(:) integer*8, allocatable :: to_sort(:)
allocate(to_sort(N_det)) allocate(to_sort(N_det))
!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(i,j,k,l)
!$OMP DO COLLAPSE(2)
do l=1,N_states do l=1,N_states
do k=1,N_det do k=1,N_det
psi_bilinear_matrix_transp_values (k,l) = psi_bilinear_matrix_values (k,l) psi_bilinear_matrix_transp_values (k,l) = psi_bilinear_matrix_values (k,l)
enddo enddo
enddo enddo
!$OMP ENDDO
!$OMP DO
do k=1,N_det do k=1,N_det
psi_bilinear_matrix_transp_columns(k) = psi_bilinear_matrix_columns(k) psi_bilinear_matrix_transp_columns(k) = psi_bilinear_matrix_columns(k)
psi_bilinear_matrix_transp_rows (k) = psi_bilinear_matrix_rows (k) psi_bilinear_matrix_transp_rows (k) = psi_bilinear_matrix_rows (k)
@ -504,6 +512,8 @@ BEGIN_PROVIDER [ double precision, psi_bilinear_matrix_transp_values, (N_det,N_
to_sort(k) = int(N_det_beta_unique,8) * int(j-1,8) + int(i,8) to_sort(k) = int(N_det_beta_unique,8) * int(j-1,8) + int(i,8)
psi_bilinear_matrix_transp_order(k) = k psi_bilinear_matrix_transp_order(k) = k
enddo enddo
!$OMP ENDDO
!$OMP END PARALLEL
call i8sort(to_sort, psi_bilinear_matrix_transp_order, N_det) call i8sort(to_sort, psi_bilinear_matrix_transp_order, N_det)
call iset_order(psi_bilinear_matrix_transp_rows,psi_bilinear_matrix_transp_order,N_det) call iset_order(psi_bilinear_matrix_transp_rows,psi_bilinear_matrix_transp_order,N_det)
call iset_order(psi_bilinear_matrix_transp_columns,psi_bilinear_matrix_transp_order,N_det) call iset_order(psi_bilinear_matrix_transp_columns,psi_bilinear_matrix_transp_order,N_det)
@ -542,9 +552,11 @@ BEGIN_PROVIDER [ integer, psi_bilinear_matrix_order_transp_reverse , (N_det) ]
END_DOC END_DOC
integer :: k integer :: k
!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(k)
do k=1,N_det do k=1,N_det
psi_bilinear_matrix_order_transp_reverse(psi_bilinear_matrix_transp_order(k)) = k psi_bilinear_matrix_order_transp_reverse(psi_bilinear_matrix_transp_order(k)) = k
enddo enddo
!$OMP END PARALLEL DO
END_PROVIDER END_PROVIDER
@ -684,11 +696,10 @@ subroutine get_all_spin_singles_and_doubles(buffer, idx, spindet, Nint, size_buf
integer, intent(out) :: n_singles integer, intent(out) :: n_singles
integer, intent(out) :: n_doubles integer, intent(out) :: n_doubles
integer :: i,k,ii, imax integer :: i,k
integer, parameter :: block_size=64
include 'Utils/constants.include.F' include 'Utils/constants.include.F'
integer(bit_kind) :: xorvec(block_size,N_int_max) integer(bit_kind) :: xorvec(N_int_max)
integer :: degree(block_size) integer :: degree
integer, external :: align_double integer, external :: align_double
@ -711,76 +722,34 @@ subroutine get_all_spin_singles_and_doubles(buffer, idx, spindet, Nint, size_buf
n_singles = 1 n_singles = 1
n_doubles = 1 n_doubles = 1
!DIR$ VECTOR ALIGNED !DIR$ VECTOR ALIGNED
do i=0,size_buffer-block_size, block_size do i=1,size_buffer
do k=1,Nint do k=1,Nint
do ii=1,block_size xorvec(k) = xor( spindet(k), buffer(k,i) )
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo enddo
do ii=1,block_size if (xorvec(1) /= 0_8) then
if (xorvec(ii,1) /= 0_8) then degree = popcnt(xorvec(1))
degree(ii) = popcnt(xorvec(ii,1))
else
degree(ii) = 0
endif
do k=2,Nint
!DIR$ VECTOR ALIGNED
if ( (degree(ii) <= 4).and.(xorvec(ii,k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k))
endif
enddo
enddo
do ii=1,block_size
if ( degree(ii) == 4 ) then
doubles(n_doubles) = idx(i+ii)
n_doubles = n_doubles+1
endif
if ( degree(ii) == 2 ) then
singles(n_singles) = idx(i+ii)
n_singles = n_singles+1
endif
enddo
enddo
imax = size_buffer-i
do k=1,Nint
do ii=1,imax
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo
do ii=1,imax
if (xorvec(ii,1) /= 0_8) then
degree(ii) = popcnt(xorvec(ii,1))
else else
degree(ii) = 0 degree = 0
endif endif
do k=2,Nint do k=2,Nint
!DIR$ VECTOR ALIGNED !DIR$ VECTOR ALIGNED
if ( (degree(ii) <= 4).and.(xorvec(ii,k) /= 0_8) ) then if ( (degree <= 4).and.(xorvec(k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k)) degree = degree + popcnt(xorvec(k))
endif endif
enddo enddo
enddo
do ii=1,imax if ( degree == 4 ) then
if ( degree(ii) == 4 ) then doubles(n_doubles) = idx(i)
doubles(n_doubles) = idx(i+ii)
n_doubles = n_doubles+1 n_doubles = n_doubles+1
endif else if ( degree == 2 ) then
if ( degree(ii) == 2 ) then singles(n_singles) = idx(i)
singles(n_singles) = idx(i+ii)
n_singles = n_singles+1 n_singles = n_singles+1
endif endif
enddo
enddo
n_singles = n_singles-1 n_singles = n_singles-1
n_doubles = n_doubles-1 n_doubles = n_doubles-1
@ -802,15 +771,14 @@ subroutine get_all_spin_singles(buffer, idx, spindet, Nint, size_buffer, singles
integer, intent(out) :: singles(size_buffer) integer, intent(out) :: singles(size_buffer)
integer, intent(out) :: n_singles integer, intent(out) :: n_singles
integer :: i,k,ii, imax integer :: i,k
integer, parameter :: block_size=64
include 'Utils/constants.include.F' include 'Utils/constants.include.F'
integer(bit_kind) :: xorvec(block_size,N_int_max) integer(bit_kind) :: xorvec(N_int_max)
integer :: degree(block_size) integer :: degree
integer, external :: align_double integer, external :: align_double
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: xorvec, degree !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: xorvec
! select case (Nint) ! select case (Nint)
! case (1) ! case (1)
@ -826,64 +794,29 @@ subroutine get_all_spin_singles(buffer, idx, spindet, Nint, size_buffer, singles
n_singles = 1 n_singles = 1
!DIR$ VECTOR ALIGNED !DIR$ VECTOR ALIGNED
do i=0,size_buffer-block_size, block_size do i=1,size_buffer
do k=1,Nint do k=1,Nint
do ii=1,block_size xorvec(k) = xor( spindet(k), buffer(k,i) )
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo enddo
do ii=1,block_size if (xorvec(1) /= 0_8) then
if (xorvec(ii,1) /= 0_8) then degree = popcnt(xorvec(1))
degree(ii) = popcnt(xorvec(ii,1))
else
degree(ii) = 0
endif
do k=2,Nint
if ( (degree(ii) <= 2).and.(xorvec(ii,k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k))
endif
enddo
enddo
do ii=1,block_size
if ( degree(ii) == 2 ) then
singles(n_singles) = idx(i+ii)
n_singles = n_singles+1
endif
enddo
enddo
imax = size_buffer-i
do k=1,Nint
do ii=1,imax
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo
do ii=1,imax
if (xorvec(ii,1) /= 0_8) then
degree(ii) = popcnt(xorvec(ii,1))
else else
degree(ii) = 0 degree = 0
endif endif
do k=2,Nint do k=2,Nint
if ( (degree(ii) <= 2).and.(xorvec(ii,k) /= 0_8) ) then if ( (degree <= 4).and.(xorvec(k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k)) degree = degree + popcnt(xorvec(k))
endif endif
enddo enddo
enddo
do ii=1,imax if ( degree == 2 ) then
if ( degree(ii) == 2 ) then singles(n_singles) = idx(i)
singles(n_singles) = idx(i+ii) n_singles = n_singles+1
n_singles = n_singles+1
endif endif
enddo enddo
n_singles = n_singles-1 n_singles = n_singles-1
@ -905,13 +838,11 @@ subroutine get_all_spin_doubles(buffer, idx, spindet, Nint, size_buffer, doubles
integer, intent(out) :: doubles(size_buffer) integer, intent(out) :: doubles(size_buffer)
integer, intent(out) :: n_doubles integer, intent(out) :: n_doubles
integer :: i,k,ii, imax integer :: i,k, degree
integer, parameter :: block_size=64
include 'Utils/constants.include.F' include 'Utils/constants.include.F'
integer(bit_kind) :: xorvec(block_size,N_int_max) integer(bit_kind) :: xorvec(N_int_max)
integer :: degree(block_size)
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: xorvec, degree !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: xorvec
! select case (Nint) ! select case (Nint)
! case (1) ! case (1)
@ -927,71 +858,34 @@ subroutine get_all_spin_doubles(buffer, idx, spindet, Nint, size_buffer, doubles
n_doubles = 1 n_doubles = 1
!DIR$ VECTOR ALIGNED !DIR$ VECTOR ALIGNED
do i=0,size_buffer-block_size, block_size do i=1,size_buffer
do k=1,Nint do k=1,Nint
do ii=1,block_size xorvec(k) = xor( spindet(k), buffer(k,i) )
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo enddo
do ii=1,block_size if (xorvec(1) /= 0_8) then
if (xorvec(ii,1) /= 0_8) then degree = popcnt(xorvec(1))
degree(ii) = popcnt(xorvec(ii,1))
else
degree(ii) = 0
endif
do k=2,Nint
!DIR$ VECTOR ALIGNED
if ( (degree(ii) <= 4).and.(xorvec(ii,k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k))
endif
enddo
enddo
do ii=1,block_size
if ( degree(ii) == 4 ) then
doubles(n_doubles) = idx(i+ii)
n_doubles = n_doubles+1
endif
enddo
enddo
imax = size_buffer-i
do k=1,Nint
do ii=1,imax
xorvec(ii, k) = xor( spindet(k), buffer(k,ii+i) )
enddo
enddo
do ii=1,imax
if (xorvec(ii,1) /= 0_8) then
degree(ii) = popcnt(xorvec(ii,1))
else else
degree(ii) = 0 degree = 0
endif endif
do k=2,Nint do k=2,Nint
!DIR$ VECTOR ALIGNED !DIR$ VECTOR ALIGNED
if ( (degree(ii) <= 4).and.(xorvec(ii,k) /= 0_8) ) then if ( (degree <= 4).and.(xorvec(k) /= 0_8) ) then
degree(ii) = degree(ii) + popcnt(xorvec(ii,k)) degree = degree + popcnt(xorvec(k))
endif endif
enddo enddo
enddo
do ii=1,imax if ( degree == 4 ) then
if ( degree(ii) == 4 ) then doubles(n_doubles) = idx(i)
doubles(n_doubles) = idx(i+ii)
n_doubles = n_doubles+1 n_doubles = n_doubles+1
endif endif
enddo enddo
n_doubles = n_doubles-1 n_doubles = n_doubles-1
end end
@ -1037,7 +931,7 @@ BEGIN_PROVIDER [ integer, singles_alpha, (0:singles_alpha_size, N_det_alpha_uniq
!$OMP PARALLEL DO DEFAULT(NONE) & !$OMP PARALLEL DO DEFAULT(NONE) &
!$OMP SHARED(singles_alpha, N_det_alpha_unique, psi_det_alpha_unique, & !$OMP SHARED(singles_alpha, N_det_alpha_unique, psi_det_alpha_unique, &
!$OMP idx0, N_int) & !$OMP idx0, N_int) &
!$OMP PRIVATE(i) !$OMP PRIVATE(i) SCHEDULE(static,1)
do i=1, N_det_alpha_unique do i=1, N_det_alpha_unique
call get_all_spin_singles( & call get_all_spin_singles( &
psi_det_alpha_unique, idx0, psi_det_alpha_unique(1,i), N_int, & psi_det_alpha_unique, idx0, psi_det_alpha_unique(1,i), N_int, &