mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-11-18 11:23:38 +01:00
separated providers for sorted wfn
separate psi_coef_sorted and psi_coef_sorted_bit from linked providers reuse same det_sorted and order for complex
This commit is contained in:
parent
7db223f6f3
commit
315ad54dc7
@ -280,7 +280,6 @@ END_PROVIDER
|
|||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted, (N_int,2,psi_det_size) ]
|
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted, (N_int,2,psi_det_size) ]
|
||||||
&BEGIN_PROVIDER [ double precision, psi_coef_sorted, (psi_det_size,N_states) ]
|
|
||||||
&BEGIN_PROVIDER [ double precision, psi_average_norm_contrib_sorted, (psi_det_size) ]
|
&BEGIN_PROVIDER [ double precision, psi_average_norm_contrib_sorted, (psi_det_size) ]
|
||||||
&BEGIN_PROVIDER [ integer, psi_det_sorted_order, (psi_det_size) ]
|
&BEGIN_PROVIDER [ integer, psi_det_sorted_order, (psi_det_size) ]
|
||||||
implicit none
|
implicit none
|
||||||
@ -302,9 +301,6 @@ END_PROVIDER
|
|||||||
psi_det_sorted(j,1,i) = psi_det(j,1,iorder(i))
|
psi_det_sorted(j,1,i) = psi_det(j,1,iorder(i))
|
||||||
psi_det_sorted(j,2,i) = psi_det(j,2,iorder(i))
|
psi_det_sorted(j,2,i) = psi_det(j,2,iorder(i))
|
||||||
enddo
|
enddo
|
||||||
do k=1,N_states
|
|
||||||
psi_coef_sorted(i,k) = psi_coef(iorder(i),k)
|
|
||||||
enddo
|
|
||||||
psi_average_norm_contrib_sorted(i) = -psi_average_norm_contrib_sorted(i)
|
psi_average_norm_contrib_sorted(i) = -psi_average_norm_contrib_sorted(i)
|
||||||
enddo
|
enddo
|
||||||
do i=1,N_det
|
do i=1,N_det
|
||||||
@ -312,29 +308,74 @@ END_PROVIDER
|
|||||||
enddo
|
enddo
|
||||||
|
|
||||||
psi_det_sorted(:,:,N_det+1:psi_det_size) = 0_bit_kind
|
psi_det_sorted(:,:,N_det+1:psi_det_size) = 0_bit_kind
|
||||||
psi_coef_sorted(N_det+1:psi_det_size,:) = 0.d0
|
|
||||||
psi_average_norm_contrib_sorted(N_det+1:psi_det_size) = 0.d0
|
psi_average_norm_contrib_sorted(N_det+1:psi_det_size) = 0.d0
|
||||||
psi_det_sorted_order(N_det+1:psi_det_size) = 0
|
psi_det_sorted_order(N_det+1:psi_det_size) = 0
|
||||||
|
|
||||||
deallocate(iorder)
|
deallocate(iorder)
|
||||||
|
|
||||||
|
END_PROVIDER
|
||||||
|
BEGIN_PROVIDER [ double precision, psi_coef_sorted, (psi_det_size,N_states) ]
|
||||||
|
implicit none
|
||||||
|
integer :: i,j,k
|
||||||
|
do i=1,N_det
|
||||||
|
j=psi_det_sorted_order(i)
|
||||||
|
do k=1,N_states
|
||||||
|
psi_coef_sorted(j,k) = psi_coef(i,k)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
psi_coef_sorted(N_det+1:psi_det_size,:) = 0.d0
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_bit, (N_int,2,psi_det_size) ]
|
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_bit, (N_int,2,psi_det_size) ]
|
||||||
&BEGIN_PROVIDER [ double precision, psi_coef_sorted_bit, (psi_det_size,N_states) ]
|
&BEGIN_PROVIDER [ integer, psi_det_sorted_bit_order, (psi_det_size) ]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
integer :: i,j
|
||||||
! Determinants on which we apply $\langle i|H|psi \rangle$ for perturbation.
|
integer*8, allocatable :: bit_tmp(:)
|
||||||
! They are sorted by determinants interpreted as integers. Useful
|
integer*8, external :: det_search_key
|
||||||
! to accelerate the search of a random determinant in the wave
|
|
||||||
! function.
|
|
||||||
END_DOC
|
|
||||||
|
|
||||||
call sort_dets_by_det_search_key(N_det, psi_det, psi_coef, size(psi_coef,1), &
|
allocate(bit_tmp(N_det))
|
||||||
psi_det_sorted_bit, psi_coef_sorted_bit, N_states)
|
|
||||||
|
|
||||||
|
do i=1,N_det
|
||||||
|
psi_det_sorted_bit_order(i) = i
|
||||||
|
!$DIR FORCEINLINE
|
||||||
|
bit_tmp(i) = det_search_key(psi_det(1,1,i),N_int)
|
||||||
|
enddo
|
||||||
|
call i8sort(bit_tmp,psi_det_sorted_bit_order,N_det)
|
||||||
|
do i=1,N_det
|
||||||
|
do j=1,N_int
|
||||||
|
psi_det_sorted_bit(j,1,i) = psi_det(j,1,psi_det_sorted_bit_order(i))
|
||||||
|
psi_det_sorted_bit(j,2,i) = psi_det(j,2,psi_det_sorted_bit_order(i))
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
deallocate(bit_tmp)
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
BEGIN_PROVIDER [ double precision, psi_coef_sorted_bit, (psi_det_size,N_states) ]
|
||||||
|
implicit none
|
||||||
|
integer :: i,k
|
||||||
|
do i=1,N_det
|
||||||
|
do k=1,N_states
|
||||||
|
psi_coef_sorted_bit(i,k) = psi_coef(psi_det_sorted_bit_order(i),k)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
|
! BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_bit, (N_int,2,psi_det_size) ]
|
||||||
|
!&BEGIN_PROVIDER [ double precision, psi_coef_sorted_bit, (psi_det_size,N_states) ]
|
||||||
|
! implicit none
|
||||||
|
! BEGIN_DOC
|
||||||
|
! ! Determinants on which we apply $\langle i|H|psi \rangle$ for perturbation.
|
||||||
|
! ! They are sorted by determinants interpreted as integers. Useful
|
||||||
|
! ! to accelerate the search of a random determinant in the wave
|
||||||
|
! ! function.
|
||||||
|
! END_DOC
|
||||||
|
!
|
||||||
|
! call sort_dets_by_det_search_key(N_det, psi_det, psi_coef, size(psi_coef,1), &
|
||||||
|
! psi_det_sorted_bit, psi_coef_sorted_bit, N_states)
|
||||||
|
!
|
||||||
|
!END_PROVIDER
|
||||||
|
|
||||||
subroutine sort_dets_by_det_search_key(Ndet, det_in, coef_in, sze, det_out, coef_out, N_st)
|
subroutine sort_dets_by_det_search_key(Ndet, det_in, coef_in, sze, det_out, coef_out, N_st)
|
||||||
use bitmasks
|
use bitmasks
|
||||||
implicit none
|
implicit none
|
||||||
@ -490,7 +531,7 @@ subroutine save_wavefunction_truncated(thr)
|
|||||||
if (mpi_master) then
|
if (mpi_master) then
|
||||||
if (is_complex) then
|
if (is_complex) then
|
||||||
call save_wavefunction_general_complex(N_det_save,min(N_states,N_det_save),&
|
call save_wavefunction_general_complex(N_det_save,min(N_states,N_det_save),&
|
||||||
psi_det_sorted_complex,size(psi_coef_sorted_complex,1),psi_coef_sorted_complex)
|
psi_det_sorted,size(psi_coef_sorted_complex,1),psi_coef_sorted_complex)
|
||||||
else
|
else
|
||||||
call save_wavefunction_general(N_det_save,min(N_states,N_det_save),psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted)
|
call save_wavefunction_general(N_det_save,min(N_states,N_det_save),psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted)
|
||||||
endif
|
endif
|
||||||
@ -513,7 +554,7 @@ subroutine save_wavefunction
|
|||||||
if (mpi_master) then
|
if (mpi_master) then
|
||||||
if (is_complex) then
|
if (is_complex) then
|
||||||
call save_wavefunction_general_complex(N_det,N_states,&
|
call save_wavefunction_general_complex(N_det,N_states,&
|
||||||
psi_det_sorted_complex,size(psi_coef_sorted_complex,1),psi_coef_sorted_complex)
|
psi_det_sorted,size(psi_coef_sorted_complex,1),psi_coef_sorted_complex)
|
||||||
else
|
else
|
||||||
call save_wavefunction_general(N_det,N_states,psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted)
|
call save_wavefunction_general(N_det,N_states,psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted)
|
||||||
endif
|
endif
|
||||||
|
@ -70,62 +70,69 @@ END_PROVIDER
|
|||||||
! !
|
! !
|
||||||
!==============================================================================!
|
!==============================================================================!
|
||||||
|
|
||||||
!TODO: implement for complex (new psi_det_sorted? reuse? combine complex provider with real?)
|
BEGIN_PROVIDER [ complex*16, psi_coef_sorted_complex, (psi_det_size,N_states) ]
|
||||||
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_complex, (N_int,2,psi_det_size) ]
|
implicit none
|
||||||
&BEGIN_PROVIDER [ complex*16, psi_coef_sorted_complex, (psi_det_size,N_states) ]
|
integer :: i,j,k
|
||||||
&BEGIN_PROVIDER [ double precision, psi_average_norm_contrib_sorted_complex, (psi_det_size) ]
|
do i=1,N_det
|
||||||
&BEGIN_PROVIDER [ integer, psi_det_sorted_order_complex, (psi_det_size) ]
|
j=psi_det_sorted_order(i)
|
||||||
implicit none
|
do k=1,N_states
|
||||||
BEGIN_DOC
|
psi_coef_sorted_complex(j,k) = psi_coef_complex(i,k)
|
||||||
! Wave function sorted by determinants contribution to the norm (state-averaged)
|
enddo
|
||||||
!
|
enddo
|
||||||
! psi_det_sorted_order(i) -> k : index in psi_det
|
psi_coef_sorted_complex(N_det+1:psi_det_size,:) = (0.d0,0.d0)
|
||||||
END_DOC
|
|
||||||
integer :: i,j,k
|
|
||||||
integer, allocatable :: iorder(:)
|
|
||||||
allocate ( iorder(N_det) )
|
|
||||||
do i=1,N_det
|
|
||||||
psi_average_norm_contrib_sorted_complex(i) = -psi_average_norm_contrib(i)
|
|
||||||
iorder(i) = i
|
|
||||||
enddo
|
|
||||||
call dsort(psi_average_norm_contrib_sorted_complex,iorder,N_det)
|
|
||||||
do i=1,N_det
|
|
||||||
do j=1,N_int
|
|
||||||
psi_det_sorted_complex(j,1,i) = psi_det(j,1,iorder(i))
|
|
||||||
psi_det_sorted_complex(j,2,i) = psi_det(j,2,iorder(i))
|
|
||||||
enddo
|
|
||||||
do k=1,N_states
|
|
||||||
psi_coef_sorted_complex(i,k) = psi_coef_complex(iorder(i),k)
|
|
||||||
enddo
|
|
||||||
psi_average_norm_contrib_sorted_complex(i) = -psi_average_norm_contrib_sorted_complex(i)
|
|
||||||
enddo
|
|
||||||
do i=1,N_det
|
|
||||||
psi_det_sorted_order_complex(iorder(i)) = i
|
|
||||||
enddo
|
|
||||||
|
|
||||||
psi_det_sorted_complex(:,:,N_det+1:psi_det_size) = 0_bit_kind
|
|
||||||
psi_coef_sorted_complex(N_det+1:psi_det_size,:) = (0.d0,0.d0)
|
|
||||||
psi_average_norm_contrib_sorted_complex(N_det+1:psi_det_size) = 0.d0
|
|
||||||
psi_det_sorted_order_complex(N_det+1:psi_det_size) = 0
|
|
||||||
|
|
||||||
deallocate(iorder)
|
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_bit_complex, (N_int,2,psi_det_size) ]
|
!!TODO: implement for complex (new psi_det_sorted? reuse? combine complex provider with real?)
|
||||||
&BEGIN_PROVIDER [ complex*16, psi_coef_sorted_bit_complex, (psi_det_size,N_states) ]
|
! BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_complex, (N_int,2,psi_det_size) ]
|
||||||
implicit none
|
!&BEGIN_PROVIDER [ complex*16, psi_coef_sorted_complex, (psi_det_size,N_states) ]
|
||||||
BEGIN_DOC
|
!&BEGIN_PROVIDER [ double precision, psi_average_norm_contrib_sorted_complex, (psi_det_size) ]
|
||||||
! Determinants on which we apply $\langle i|H|psi \rangle$ for perturbation.
|
!&BEGIN_PROVIDER [ integer, psi_det_sorted_order_complex, (psi_det_size) ]
|
||||||
! They are sorted by determinants interpreted as integers. Useful
|
! implicit none
|
||||||
! to accelerate the search of a random determinant in the wave
|
! BEGIN_DOC
|
||||||
! function.
|
! ! Wave function sorted by determinants contribution to the norm (state-averaged)
|
||||||
END_DOC
|
! !
|
||||||
|
! ! psi_det_sorted_order(i) -> k : index in psi_det
|
||||||
|
! END_DOC
|
||||||
|
! integer :: i,j,k
|
||||||
|
! integer, allocatable :: iorder(:)
|
||||||
|
! allocate ( iorder(N_det) )
|
||||||
|
! do i=1,N_det
|
||||||
|
! psi_average_norm_contrib_sorted_complex(i) = -psi_average_norm_contrib(i)
|
||||||
|
! iorder(i) = i
|
||||||
|
! enddo
|
||||||
|
! call dsort(psi_average_norm_contrib_sorted_complex,iorder,N_det)
|
||||||
|
! do i=1,N_det
|
||||||
|
! do j=1,N_int
|
||||||
|
! psi_det_sorted_complex(j,1,i) = psi_det(j,1,iorder(i))
|
||||||
|
! psi_det_sorted_complex(j,2,i) = psi_det(j,2,iorder(i))
|
||||||
|
! enddo
|
||||||
|
! do k=1,N_states
|
||||||
|
! psi_coef_sorted_complex(i,k) = psi_coef_complex(iorder(i),k)
|
||||||
|
! enddo
|
||||||
|
! psi_average_norm_contrib_sorted_complex(i) = -psi_average_norm_contrib_sorted_complex(i)
|
||||||
|
! enddo
|
||||||
|
! do i=1,N_det
|
||||||
|
! psi_det_sorted_order_complex(iorder(i)) = i
|
||||||
|
! enddo
|
||||||
|
!
|
||||||
|
! psi_det_sorted_complex(:,:,N_det+1:psi_det_size) = 0_bit_kind
|
||||||
|
! psi_coef_sorted_complex(N_det+1:psi_det_size,:) = (0.d0,0.d0)
|
||||||
|
! psi_average_norm_contrib_sorted_complex(N_det+1:psi_det_size) = 0.d0
|
||||||
|
! psi_det_sorted_order_complex(N_det+1:psi_det_size) = 0
|
||||||
|
!
|
||||||
|
! deallocate(iorder)
|
||||||
|
!
|
||||||
|
!END_PROVIDER
|
||||||
|
|
||||||
call sort_dets_by_det_search_key_complex(N_det, psi_det, psi_coef_complex, &
|
|
||||||
size(psi_coef_complex,1), psi_det_sorted_bit_complex, &
|
|
||||||
psi_coef_sorted_bit_complex, N_states)
|
|
||||||
|
|
||||||
|
BEGIN_PROVIDER [ complex*16, psi_coef_sorted_bit_complex, (psi_det_size,N_states) ]
|
||||||
|
implicit none
|
||||||
|
integer :: i,k
|
||||||
|
do i=1,N_det
|
||||||
|
do k=1,N_states
|
||||||
|
psi_coef_sorted_bit_complex(i,k) = psi_coef_complex(psi_det_sorted_bit_order(i),k)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
subroutine sort_dets_by_det_search_key_complex(Ndet, det_in, coef_in, sze, det_out, coef_out, N_st)
|
subroutine sort_dets_by_det_search_key_complex(Ndet, det_in, coef_in, sze, det_out, coef_out, N_st)
|
||||||
|
@ -25,11 +25,7 @@ BEGIN_PROVIDER [ logical, pruned, (N_det) ]
|
|||||||
else
|
else
|
||||||
|
|
||||||
ndet_new = max(1,int( dble(N_det) * (1.d0 - pruning) + 0.5d0 ))
|
ndet_new = max(1,int( dble(N_det) * (1.d0 - pruning) + 0.5d0 ))
|
||||||
if (is_complex) then
|
|
||||||
thr = psi_average_norm_contrib_sorted_complex(ndet_new)
|
|
||||||
else
|
|
||||||
thr = psi_average_norm_contrib_sorted(ndet_new)
|
thr = psi_average_norm_contrib_sorted(ndet_new)
|
||||||
endif
|
|
||||||
do i=1, N_det
|
do i=1, N_det
|
||||||
pruned(i) = psi_average_norm_contrib(i) < thr
|
pruned(i) = psi_average_norm_contrib(i) < thr
|
||||||
enddo
|
enddo
|
||||||
|
Loading…
Reference in New Issue
Block a user