mirror of
https://gitlab.com/scemama/qmcchem.git
synced 2024-09-06 01:54:46 +02:00
371 lines
9.2 KiB
Fortran
371 lines
9.2 KiB
Fortran
BEGIN_PROVIDER [ integer, i_state ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Current state
|
|
END_DOC
|
|
i_state = 1
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, N_int ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of 64-bit integers needed to represent determinants as binary strings
|
|
END_DOC
|
|
call get_spindeterminants_n_int(N_int)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, bit_kind ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of octets per integer storing determinants
|
|
END_DOC
|
|
call get_spindeterminants_bit_kind(bit_kind)
|
|
ASSERT (bit_kind == 8)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, N_states ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of states in EZFIO file
|
|
END_DOC
|
|
call get_spindeterminants_n_states(N_states)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, det_num_input ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of Det_a x Det_b products in input file
|
|
END_DOC
|
|
call get_spindeterminants_n_det(det_num_input)
|
|
END_PROVIDER
|
|
|
|
|
|
BEGIN_PROVIDER [ double precision, det_alpha_norm, (det_alpha_num) ]
|
|
&BEGIN_PROVIDER [ double precision, det_beta_norm, (det_beta_num) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Norm of the alpha and beta spin determinants in the wave function:
|
|
!
|
|
! ||Da||_i \sum_j C_{ij}**2
|
|
END_DOC
|
|
|
|
integer :: i,j,k
|
|
double precision :: f
|
|
|
|
det_alpha_norm = 0.d0
|
|
det_beta_norm = 0.d0
|
|
do k=1,det_num
|
|
i = det_coef_matrix_rows(k)
|
|
j = det_coef_matrix_columns(k)
|
|
f = det_coef_matrix_values(k)*det_coef_matrix_values(k)
|
|
det_alpha_norm(i) += f
|
|
det_beta_norm(j) += f
|
|
enddo
|
|
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ double precision, det_coef_matrix_values, (det_num_input) ]
|
|
&BEGIN_PROVIDER [ integer, det_coef_matrix_rows, (det_num_input) ]
|
|
&BEGIN_PROVIDER [ integer, det_coef_matrix_columns, (det_num_input) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! det_coef_matrix in sparse storage (Coordinate format for sparse BLAS)
|
|
END_DOC
|
|
double precision, allocatable :: buffer(:,:)
|
|
allocate (buffer(det_num_input,N_states))
|
|
call get_spindeterminants_psi_coef_matrix_rows(det_coef_matrix_rows)
|
|
call get_spindeterminants_psi_coef_matrix_columns(det_coef_matrix_columns)
|
|
call get_spindeterminants_psi_coef_matrix_values(buffer)
|
|
det_coef_matrix_values(:) = buffer(:,i_state)
|
|
deallocate(buffer)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, det_num ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of Det_a x Det_b products. The determinant basis set is reduced with
|
|
! the CI threshold
|
|
END_DOC
|
|
integer :: i,j,k,l
|
|
double precision :: f
|
|
|
|
double precision :: d_alpha(det_alpha_num), d_beta (det_beta_num)
|
|
integer :: i_alpha(det_alpha_num), i_beta(det_beta_num)
|
|
integer :: iorder(max(det_alpha_num,det_beta_num))
|
|
double precision :: t, norm
|
|
|
|
t = ci_threshold
|
|
|
|
! Compute the norm of the alpha and beta determinants
|
|
d_alpha = 0.d0
|
|
d_beta = 0.d0
|
|
do k=1,det_num_input
|
|
i = det_coef_matrix_rows(k)
|
|
j = det_coef_matrix_columns(k)
|
|
f = det_coef_matrix_values(k)*det_coef_matrix_values(k)
|
|
d_alpha(i) += f
|
|
d_beta (j) += f
|
|
enddo
|
|
t = min(t, maxval(d_alpha))
|
|
t = min(t, maxval(d_beta))
|
|
|
|
! Reorder alpha determinants
|
|
do i=1,det_alpha_num
|
|
iorder(i) = i
|
|
if (d_alpha(i) < t) then
|
|
i_alpha(i) = det_alpha_num+i
|
|
else
|
|
i_alpha(i) = i
|
|
endif
|
|
enddo
|
|
call isort(i_alpha,iorder,det_alpha_num)
|
|
|
|
i=det_alpha_num
|
|
do while (i > 0)
|
|
if (i_alpha(i) <= det_alpha_num) then
|
|
det_alpha_num = i
|
|
exit
|
|
else
|
|
i = i-1
|
|
endif
|
|
enddo
|
|
|
|
do i=1,det_alpha_num
|
|
psi_det_alpha(:,i) = psi_det_alpha(:,iorder(i))
|
|
i_alpha(iorder(i)) = i
|
|
enddo
|
|
|
|
! Reorder beta determinants
|
|
do i=1,det_beta_num
|
|
iorder(i) = i
|
|
if (d_beta(i) < t) then
|
|
i_beta(i) = det_beta_num+i
|
|
else
|
|
i_beta(i) = i
|
|
endif
|
|
enddo
|
|
call isort(i_beta,iorder,det_beta_num)
|
|
|
|
|
|
i=det_beta_num
|
|
do while (i > 0)
|
|
if (i_beta(i) <= det_beta_num) then
|
|
det_beta_num = i
|
|
exit
|
|
else
|
|
i = i-1
|
|
endif
|
|
enddo
|
|
|
|
do i=1,det_beta_num
|
|
psi_det_beta(:,i) = psi_det_beta(:,iorder(i))
|
|
i_beta(iorder(i)) = i
|
|
enddo
|
|
|
|
|
|
! Apply the threshold to the wave function
|
|
l = 1
|
|
norm = 0.d0
|
|
do k=1,det_num_input
|
|
i = det_coef_matrix_rows(k)
|
|
j = det_coef_matrix_columns(k)
|
|
det_coef_matrix_rows(l) = i_alpha(i)
|
|
det_coef_matrix_columns(l) = i_beta(j)
|
|
det_coef_matrix_values(l) = det_coef_matrix_values(k)
|
|
if ( (d_alpha(i) >= t).and.(d_beta(j) >= t) ) then
|
|
l = l+1
|
|
norm += det_coef_matrix_values(k)*det_coef_matrix_values(k)
|
|
endif
|
|
enddo
|
|
det_num = l-1
|
|
norm = 1.d0/dsqrt(norm)
|
|
do k=1,det_num
|
|
det_coef_matrix_values(k) *= norm
|
|
enddo
|
|
|
|
SOFT_TOUCH det_alpha_num det_beta_num det_coef_matrix_values det_coef_matrix_rows det_coef_matrix_columns psi_det_beta psi_det_alpha
|
|
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, det_alpha_num ]
|
|
&BEGIN_PROVIDER [ integer, det_beta_num ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of alpha and beta determinants
|
|
END_DOC
|
|
call get_spindeterminants_n_det_alpha(det_alpha_num)
|
|
call get_spindeterminants_n_det_beta(det_beta_num)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, det_alpha_num_8 ]
|
|
&BEGIN_PROVIDER [ integer, det_beta_num_8 ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Number of alpha and beta determinants
|
|
END_DOC
|
|
integer :: mod_align
|
|
det_alpha_num_8 = max(4,mod_align(det_alpha_num)) !
|
|
det_beta_num_8 = max(4,mod_align(det_beta_num)) ! Used in 4x unrolling
|
|
END_PROVIDER
|
|
|
|
|
|
BEGIN_PROVIDER [ double precision, ci_threshold ]
|
|
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Threshold on absolute value of the CI coefficients of the wave functioE
|
|
END_DOC
|
|
ci_threshold = 0.d0
|
|
call get_simulation_ci_threshold(ci_threshold)
|
|
call dinfo(irp_here,'ci_threshold',ci_threshold)
|
|
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer*8, psi_det_alpha, (N_int,det_alpha_num) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Alpha determinants
|
|
END_DOC
|
|
call get_spindeterminants_psi_det_alpha(psi_det_alpha)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer*8, psi_det_beta, (N_int,det_beta_num) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Beta determinants
|
|
END_DOC
|
|
call get_spindeterminants_psi_det_beta(psi_det_beta)
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, present_mos, (mo_tot_num) ]
|
|
&BEGIN_PROVIDER [ integer, num_present_mos ]
|
|
&BEGIN_PROVIDER [ integer, num_present_mos_8 ]
|
|
&BEGIN_PROVIDER [ integer, mo_closed_num ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! List of used MOs to build the wf in the CI expansion
|
|
END_DOC
|
|
integer*8 :: tmp_det(N_int)
|
|
integer :: i,k
|
|
integer, external :: mod_align
|
|
PROVIDE det_num
|
|
|
|
num_present_mos = mo_tot_num
|
|
do i=1,mo_tot_num
|
|
present_mos(i) = i
|
|
enddo
|
|
|
|
!---
|
|
present_mos = 0
|
|
tmp_det = 0_8
|
|
do i=1,det_alpha_num
|
|
do k=1,N_int
|
|
tmp_det(k) = ior(tmp_det(k),psi_det_alpha(k,i))
|
|
enddo
|
|
enddo
|
|
do i=1,det_beta_num
|
|
do k=1,N_int
|
|
tmp_det(k) = ior(tmp_det(k),psi_det_beta(k,i))
|
|
enddo
|
|
enddo
|
|
call bitstring_to_list(tmp_det,present_mos,num_present_mos,N_int)
|
|
!---
|
|
|
|
num_present_mos_8 = mod_align(num_present_mos)
|
|
|
|
integer :: list(mo_tot_num), n
|
|
logical :: good
|
|
|
|
list = present_mos
|
|
mo_closed_num = elec_beta_num
|
|
do n=1,elec_beta_num
|
|
call list_to_bitstring(tmp_det,present_mos,n,N_int)
|
|
do k=1,N_int
|
|
if (tmp_det(k) == 0_8) then
|
|
exit
|
|
endif
|
|
good = .True.
|
|
do i=1,det_alpha_num
|
|
if (iand(tmp_det(k),psi_det_alpha(k,i)) /= tmp_det(k)) then
|
|
good = .False.
|
|
exit
|
|
endif
|
|
enddo
|
|
if (good) then
|
|
do i=1,det_beta_num
|
|
if (iand(tmp_det(k),psi_det_beta(k,i)) /= tmp_det(k)) then
|
|
good = .False.
|
|
exit
|
|
endif
|
|
enddo
|
|
endif
|
|
if (.not.good) then
|
|
exit
|
|
endif
|
|
enddo
|
|
if (.not.good) then
|
|
mo_closed_num = n-1
|
|
exit
|
|
endif
|
|
enddo
|
|
END_PROVIDER
|
|
|
|
subroutine list_to_bitstring( string, list, n_elements, Nint)
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Returns the physical string "string(N_int,2)" from the array of
|
|
! occupations "list(N_int*64,2)
|
|
END_DOC
|
|
integer, intent(in) :: Nint
|
|
integer*8, intent(out) :: string(Nint)
|
|
integer, intent(in) :: list(Nint*64)
|
|
integer, intent(in) :: n_elements
|
|
|
|
|
|
integer :: i, j
|
|
integer :: ipos, iint
|
|
|
|
!
|
|
! <== ipos ==>
|
|
! |
|
|
! v
|
|
!string :|------------------------|-------------------------|------------------------|
|
|
! <==== 64 ====> <==== 64 ====> <==== 64 ====>
|
|
! { iint } { iint } { iint }
|
|
!
|
|
|
|
string = 0_8
|
|
|
|
do i=1,n_elements
|
|
iint = ishft(list(i)-1,-6) + 1
|
|
ipos = list(i)-ishft((iint-1),6)-1
|
|
string(iint) = ibset( string(iint), ipos )
|
|
enddo
|
|
|
|
end
|
|
|
|
|
|
BEGIN_PROVIDER [ integer, det_alpha_order, (det_alpha_num) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Order in which to compute the alhpa determinants
|
|
END_DOC
|
|
integer :: i
|
|
! double precision :: tmp(det_alpha_num)
|
|
do i=1,det_alpha_num
|
|
det_alpha_order(i) = i
|
|
enddo
|
|
END_PROVIDER
|
|
|
|
BEGIN_PROVIDER [ integer, det_beta_order, (det_beta_num) ]
|
|
implicit none
|
|
BEGIN_DOC
|
|
! Order in which to compute the beta determinants
|
|
END_DOC
|
|
integer :: i
|
|
do i=1,det_beta_num
|
|
det_beta_order(i) = i
|
|
enddo
|
|
END_PROVIDER
|
|
|