10
0
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-07-09 04:43:48 +02:00

Fixed energies of non-expected s2 (#9)

* Moved diag_algorithm in Davdison
This commit is contained in:
Anthony Scemama 2019-02-22 17:59:19 +01:00 committed by GitHub
parent f5ecf72f5c
commit ca4f8ebdca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 81 additions and 48 deletions

2
configure vendored
View File

@ -11,8 +11,6 @@ echo "QP_ROOT="$QP_ROOT
# Check if the module to create new DFT functionals exists or not # Check if the module to create new DFT functionals exists or not
if [[ ! -d ${QP_ROOT}/src/new_functionals ]] ; then if [[ ! -d ${QP_ROOT}/src/new_functionals ]] ; then
echo "${QP_ROOT}/src/new_functionals does NOT exists !!"
echo "Creating a new one ..."
cp -r ${QP_ROOT}/scripts/functionals/do_not_touch_func ${QP_ROOT}/src/new_functionals cp -r ${QP_ROOT}/scripts/functionals/do_not_touch_func ${QP_ROOT}/src/new_functionals
fi fi

2
ocaml/.gitignore vendored
View File

@ -9,6 +9,7 @@ Input_ao_two_e_erf_ints.ml
Input_ao_two_e_ints.ml Input_ao_two_e_ints.ml
Input_auto_generated.ml Input_auto_generated.ml
Input_becke_numerical_grid.ml Input_becke_numerical_grid.ml
Input_champ.ml
Input_davidson.ml Input_davidson.ml
Input_density_for_dft.ml Input_density_for_dft.ml
Input_determinants.ml Input_determinants.ml
@ -21,6 +22,7 @@ Input_nuclei.ml
Input_perturbation.ml Input_perturbation.ml
Input_pseudo.ml Input_pseudo.ml
Input_scf_utils.ml Input_scf_utils.ml
Input_variance.ml
qp_create_ezfio qp_create_ezfio
qp_create_ezfio.native qp_create_ezfio.native
qp_edit qp_edit

View File

@ -40,3 +40,9 @@ doc: If |true|, use filter out all vectors with bad |S^2| values
default: True default: True
interface: ezfio,provider,ocaml interface: ezfio,provider,ocaml
[n_det_max_full]
type: Det_number_max
doc: Maximum number of determinants where |H| is fully diagonalized
interface: ezfio,provider,ocaml
default: 1000

View File

@ -1,3 +1,20 @@
BEGIN_PROVIDER [ character*(64), diag_algorithm ]
implicit none
BEGIN_DOC
! Diagonalization algorithm (Davidson or Lapack)
END_DOC
if (N_det > N_det_max_full) then
diag_algorithm = "Davidson"
else
diag_algorithm = "Lapack"
endif
if (N_det < N_states) then
diag_algorithm = "Lapack"
endif
END_PROVIDER
BEGIN_PROVIDER [ integer, dressed_column_idx, (N_states) ] BEGIN_PROVIDER [ integer, dressed_column_idx, (N_states) ]
implicit none implicit none
BEGIN_DOC BEGIN_DOC
@ -114,7 +131,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,s2_out,energies,dim_in,sze,N_
integer :: k_pairs, kl integer :: k_pairs, kl
integer :: iter2, itertot integer :: iter2, itertot
double precision, allocatable :: y(:,:), h(:,:), lambda(:), s2(:) double precision, allocatable :: y(:,:), h(:,:), h_p(:,:), lambda(:), s2(:)
real, allocatable :: y_s(:,:) real, allocatable :: y_s(:,:)
double precision, allocatable :: s_(:,:), s_tmp(:,:) double precision, allocatable :: s_(:,:), s_tmp(:,:)
double precision :: diag_h_mat_elem double precision :: diag_h_mat_elem
@ -264,6 +281,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,s2_out,energies,dim_in,sze,N_
! Small ! Small
h(N_st_diag*itermax,N_st_diag*itermax), & h(N_st_diag*itermax,N_st_diag*itermax), &
h_p(N_st_diag*itermax,N_st_diag*itermax), &
y(N_st_diag*itermax,N_st_diag*itermax), & y(N_st_diag*itermax,N_st_diag*itermax), &
s_(N_st_diag*itermax,N_st_diag*itermax), & s_(N_st_diag*itermax,N_st_diag*itermax), &
s_tmp(N_st_diag*itermax,N_st_diag*itermax), & s_tmp(N_st_diag*itermax,N_st_diag*itermax), &
@ -408,27 +426,44 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,s2_out,energies,dim_in,sze,N_
! Compute h_kl = <u_k | W_l> = <u_k| H |u_l> ! Compute h_kl = <u_k | W_l> = <u_k| H |u_l>
! ------------------------------------------- ! -------------------------------------------
call dgemm('T','N', shift2, shift2, sze, &
1.d0, U, size(U,1), W, size(W,1), &
0.d0, h, size(h_p,1))
! Penalty method ! Penalty method
! -------------- ! --------------
if (s2_eig) then if (s2_eig) then
h = s_ h_p = s_
do k=1,shift2 do k=1,shift2
h(k,k) = h(k,k) + S_z2_Sz - expected_s2 h_p(k,k) = h_p(k,k) + S_z2_Sz - expected_s2
enddo enddo
alpha = 0.1d0 alpha = 0.1d0
h_p = h + alpha*h_p
else else
h_p = h
alpha = 0.d0 alpha = 0.d0
endif endif
call dgemm('T','N', shift2, shift2, sze, & ! Diagonalize h_p
1.d0, U, size(U,1), W, size(W,1), & ! ---------------
alpha , h, size(h,1))
! Diagonalize h call lapack_diag(lambda,y,h_p,size(h_p,1),shift2)
! -------------
call lapack_diag(lambda,y,h,size(h,1),shift2) ! Compute Energy for each eigenvector
! -----------------------------------
call dgemm('N','N',shift2,shift2,shift2, &
1.d0, h, size(h,1), y, size(y,1), &
0.d0, s_tmp, size(s_tmp,1))
call dgemm('T','N',shift2,shift2,shift2, &
1.d0, y, size(y,1), s_tmp, size(s_tmp,1), &
0.d0, h, size(h,1))
do k=1,shift2
lambda(k) = h(k,k)
enddo
! Compute S2 for each eigenvector ! Compute S2 for each eigenvector
! ------------------------------- ! -------------------------------
@ -441,8 +476,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,s2_out,energies,dim_in,sze,N_
1.d0, y, size(y,1), s_tmp, size(s_tmp,1), & 1.d0, y, size(y,1), s_tmp, size(s_tmp,1), &
0.d0, s_, size(s_,1)) 0.d0, s_, size(s_,1))
do k=1,shift2 do k=1,shift2
s2(k) = s_(k,k) + S_z2_Sz s2(k) = s_(k,k) + S_z2_Sz
enddo enddo

View File

@ -117,17 +117,24 @@ END_PROVIDER
good_state_array = .False. good_state_array = .False.
call u_0_S2_u_0(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& call u_0_S2_u_0(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,&
N_det,size(eigenvectors,1)) N_det,size(eigenvectors,1))
do j=1,N_det if (only_expected_s2) then
! Select at least n_states states with S^2 values closed to "expected_s2" do j=1,N_det
if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then ! Select at least n_states states with S^2 values closed to "expected_s2"
i_state +=1 if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then
index_good_state_array(i_state) = j i_state +=1
good_state_array(j) = .True. index_good_state_array(i_state) = j
endif good_state_array(j) = .True.
if(i_state.eq.N_states) then endif
exit if(i_state.eq.N_states) then
endif exit
enddo endif
enddo
else
do j=1,N_det
index_good_state_array(j) = j
good_state_array(j) = .True.
enddo
endif
if(i_state .ne.0)then if(i_state .ne.0)then
! Fill the first "i_state" states that have a correct S^2 value ! Fill the first "i_state" states that have a correct S^2 value
do j = 1, i_state do j = 1, i_state
@ -185,6 +192,16 @@ END_PROVIDER
CI_electronic_energy(j) = eigenvalues(j) CI_electronic_energy(j) = eigenvalues(j)
enddo enddo
endif endif
do k=1,N_states_diag
CI_electronic_energy(k) = 0.d0
do j=1,N_det
do i=1,N_det
CI_electronic_energy(k) += &
CI_eigenvectors(i,k) * CI_eigenvectors(j,k) * &
H_matrix_all_dets(i,j)
enddo
enddo
enddo
deallocate(eigenvectors,eigenvalues) deallocate(eigenvectors,eigenvalues)
endif endif

View File

@ -10,12 +10,6 @@ doc: Maximum number of determinants to be printed with the program print_wf
interface: ezfio,provider,ocaml interface: ezfio,provider,ocaml
default: 10000 default: 10000
[n_det_max_full]
type: Det_number_max
doc: Maximum number of determinants where |H| is fully diagonalized
interface: ezfio,provider,ocaml
default: 1000
[n_states] [n_states]
type: States_number type: States_number
doc: Number of states to consider doc: Number of states to consider

View File

@ -1,22 +1,5 @@
use bitmasks use bitmasks
BEGIN_PROVIDER [ character*(64), diag_algorithm ]
implicit none
BEGIN_DOC
! Diagonalization algorithm (Davidson or Lapack)
END_DOC
if (N_det > N_det_max_full) then
diag_algorithm = "Davidson"
else
diag_algorithm = "Lapack"
endif
if (N_det < N_states) then
diag_algorithm = "Lapack"
endif
END_PROVIDER
BEGIN_PROVIDER [ integer, N_det ] BEGIN_PROVIDER [ integer, N_det ]
implicit none implicit none
BEGIN_DOC BEGIN_DOC

View File

@ -59,7 +59,7 @@ function run_stoch() {
@test "H2O2" { # 12.9214s @test "H2O2" { # 12.9214s
qp set_file h2o2.ezfio qp set_file h2o2.ezfio
qp set_mo_class --core="[1-2]" --act="[3-24]" --del="[25-38]" qp set_mo_class --core="[1-2]" --act="[3-24]" --del="[25-38]"
run -151.004888189874 2.e-5 run -151.004888189874 4.e-5
} }
@test "HBO" { # 13.3144s @test "HBO" { # 13.3144s