mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-09-01 05:33:40 +02:00
Fixed energies of non-expected s2 (#9)
* Moved diag_algorithm in Davdison
This commit is contained in:
parent
f5ecf72f5c
commit
ca4f8ebdca
2
configure
vendored
2
configure
vendored
@ -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
2
ocaml/.gitignore
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -117,6 +117,7 @@ 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))
|
||||||
|
if (only_expected_s2) then
|
||||||
do j=1,N_det
|
do j=1,N_det
|
||||||
! Select at least n_states states with S^2 values closed to "expected_s2"
|
! Select at least n_states states with S^2 values closed to "expected_s2"
|
||||||
if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then
|
if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then
|
||||||
@ -128,6 +129,12 @@ END_PROVIDER
|
|||||||
exit
|
exit
|
||||||
endif
|
endif
|
||||||
enddo
|
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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user