10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-03 20:54:00 +01:00

experimental lambda

This commit is contained in:
Yann Garniron 2016-06-14 14:37:46 +02:00
parent 9b23430872
commit 5db286b027
2 changed files with 249 additions and 54 deletions

View File

@ -148,10 +148,44 @@ END_PROVIDER
END_PROVIDER END_PROVIDER
! BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ]
! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ]
! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ]
! implicit none
! BEGIN_DOC
! ! cm/<Psi_0|H|D_m> or perturbative 1/Delta_E(m)
! END_DOC
! integer :: i,ii,k
! double precision :: ihpsi_current(N_states)
! integer :: i_pert_count
! double precision :: hii, lambda_pert, phase
! integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3, degree
! integer :: exc(N_int, 2)
! histo = 0
!
! i_pert_count = 0
! lambda_mrcc = 0.d0
! N_lambda_mrcc_pt2 = 0
! N_lambda_mrcc_pt3 = 0
! lambda_mrcc_pt2(0) = 0
! lambda_mrcc_pt3(0) = 0
!
! do ii=1, N_det_ref
! do i=1,N_det_non_ref
! call get_excitation(psi_ref(1,1,II), psi_non_ref(1,1,i), exc, degree, phase, N_int)
! if(degree == -1) cycle
! call i_H_j(psi_non_ref(1,1,ii),psi_non_ref(1,1,i),N_int,hii)
!
!
! lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2
! lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3
!
! print*,'N_det_non_ref = ',N_det_non_ref
! print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1)
! print*,'lambda max = ',maxval(dabs(lambda_mrcc))
! print*,'Number of ignored determinants = ',i_pert_count
!
! END_PROVIDER
BEGIN_PROVIDER [ double precision, hij_mrcc, (N_det_non_ref,N_det_ref) ] BEGIN_PROVIDER [ double precision, hij_mrcc, (N_det_non_ref,N_det_ref) ]
@ -397,6 +431,26 @@ integer function searchDet(dets, det, n, Nint)
end function end function
integer function unsortedSearchDet(dets, det, n, Nint)
implicit none
use bitmasks
integer(bit_kind),intent(in) :: dets(Nint,2,n), det(Nint,2)
integer, intent(in) :: nint, n
integer :: l, h, c
integer, external :: detCmp
logical, external :: detEq
do l=1, n
if(detEq(det, dets(1,1,l), N_int)) then
unsortedSearchDet = l
return
end if
end do
unsortedSearchDet = -1
end function
integer function searchExc(excs, exc, n) integer function searchExc(excs, exc, n)
implicit none implicit none
use bitmasks use bitmasks
@ -617,6 +671,119 @@ END_PROVIDER
BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ]
implicit none
logical :: ok
integer :: II, pp, hh, ind, wk
integer, external :: unsortedSearchDet
integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2)
double precision, allocatable :: A(:,:)
integer :: N, IPIV(N_det_non_ref), INFO
double precision, allocatable :: WORK(:)
integer, allocatable :: IWORK(:)
print *, "TI", hh_shortcut(hh_shortcut(0)+1)-1, N_det_non_ref
allocate(A(N_det_non_ref, hh_shortcut(hh_shortcut(0)+1)-1))
A = 0d0
do II = 1, N_det_ref
do hh = 1, hh_shortcut(0)
call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int)
if(.not. ok) cycle
do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1
call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int)
if(.not. ok) cycle
ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int)
if(ind /= -1) then
A(ind, pp) += psi_ref_coef(II, 1)
end if
end do
end do
end do
double precision :: B(N_det_non_ref), S(N_det_non_ref)
integer :: rank
B = psi_non_ref_coef(:,1)
allocate(WORK(1), IWORK(1))
call DGELSD(N_det_non_ref, &
hh_shortcut(hh_shortcut(0)+1)-1, &
1, &
A, N_det_non_ref, &
B, N_det_non_ref, &
S, &
1d-6, &
rank, &
WORK, -1, &
IWORK, &
INFO )
wk = int(work(1))
print *, "WORK:", wk
deallocate(WORK, IWORK)
allocate(WORK(wk), IWORK(wk))
call DGELSD(N_det_non_ref, &
hh_shortcut(hh_shortcut(0)+1)-1, &
1, &
A, N_det_non_ref, &
B, N_det_non_ref, &
S, &
1d-6, &
rank, &
WORK, size(WORK), &
IWORK, &
INFO )
print *, INFO, size(dIj), size(B)
dIj(:size(dIj)) = B(:size(dIj))
print *, "diden"
END_PROVIDER
double precision function get_dij(det1, det2, Nint)
use bitmasks
implicit none
integer, intent(in) :: Nint
integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2)
integer :: degree, f, exc(0:2, 2, 2), t
integer*2 :: h1, h2, p1, p2, s1, s2
integer, external :: searchExc
logical, external :: excEq
double precision :: phase
get_dij = 0d0
call get_excitation(det1, det2, exc, degree, phase, Nint)
if(degree == -1) return
if(degree == 0) then
stop "get_dij"
end if
call decode_exc_int2(exc,degree,h1,p1,h2,p2,s1,s2)
if(degree == 1) then
h2 = h1
p2 = p1
s2 = s1
h1 = 0
p1 = 0
s1 = 0
end if
if(h1 + (s1-1)*mo_tot_num < h2 + (s2-1)*mo_tot_num) then
f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0))
else
f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0))
end if
if(f == -1) return
if(p1 + (s1-1)*mo_tot_num < p2 + (s2-1)*mo_tot_num) then
t = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f))
else
t = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f))
end if
if(t /= -1) then
get_dij = dIj(t - 1 + hh_shortcut(f))
end if
end function
BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_hh_exists) ] BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_hh_exists) ]
&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_hh_exists + 1) ] &BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_hh_exists + 1) ]
&BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_pp_exists) ] &BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_pp_exists) ]

View File

@ -476,58 +476,89 @@ END_PROVIDER
END_PROVIDER END_PROVIDER
! BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ]
! use bitmasks
! implicit none
! integer :: i,j,k
! double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall
! integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref)
!
! ! provide lambda_mrcc
! npres = 0
! delta_cas = 0d0
! call wall_time(wall)
! print *, "dcas ", wall
! do i_state = 1, N_states
! !!$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref)
! do k=1,N_det_non_ref
! if(lambda_mrcc(i_state, k) == 0d0) cycle
! npre = 0
! do i=1,N_det_ref
! call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki)
! if(Hki /= 0d0) then
! !!$OMP ATOMIC
! npres(i) += 1
! npre += 1
! ipre(npre) = i
! pre(npre) = Hki
! end if
! end do
!
!
! do i=1,npre
! do j=1,i
! !!$OMP ATOMIC
! delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k)
! end do
! end do
! end do
! !!$OMP END PARALLEL DO
! npre=0
! do i=1,N_det_ref
! npre += npres(i)
! end do
! !stop
! do i=1,N_det_ref
! do j=1,i
! delta_cas(j,i,i_state) = delta_cas(i,j,i_state)
! end do
! end do
! end do
!
! call wall_time(wall)
! print *, "dcas", wall
! ! stop
! END_PROVIDER
BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ]
use bitmasks use bitmasks
implicit none implicit none
integer :: i,j,k integer :: i,j,k
double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall double precision :: Hjk, Hki, Hij
integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref) double precision, external :: get_dij
integer i_state, degree
! provide lambda_mrcc provide lambda_mrcc
npres = 0
delta_cas = 0d0
call wall_time(wall)
print *, "dcas ", wall
do i_state = 1, N_states do i_state = 1, N_states
!!$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref)
do k=1,N_det_non_ref do i=1,N_det_ref
if(lambda_mrcc(i_state, k) == 0d0) cycle
npre = 0
do i=1,N_det_ref
call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki)
if(Hki /= 0d0) then
!!$OMP ATOMIC
npres(i) += 1
npre += 1
ipre(npre) = i
pre(npre) = Hki
end if
end do
do i=1,npre
do j=1,i do j=1,i
!!$OMP ATOMIC call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int)
delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k) delta_cas(i,j,i_state) = 0d0
end do do k=1,N_det_non_ref
end do
end do call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk)
!!$OMP END PARALLEL DO call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki)
npre=0
do i=1,N_det_ref delta_cas(i,j,i_state) += Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int) ! * Hki * lambda_mrcc(i_state, k)
npre += npres(i) !print *, Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int), Hki * get_dij(psi_ref(1,1,j), psi_non_ref(1,1,k), N_int)
end do end do
!stop
do i=1,N_det_ref
do j=1,i
delta_cas(j,i,i_state) = delta_cas(i,j,i_state) delta_cas(j,i,i_state) = delta_cas(i,j,i_state)
end do
end do end do
end do !$OMP END PARALLEL DO
end do end do
call wall_time(wall)
print *, "dcas", wall
! stop
END_PROVIDER END_PROVIDER
@ -618,7 +649,7 @@ end function
integer, allocatable :: idx_sorted_bit(:) integer, allocatable :: idx_sorted_bit(:)
integer, external :: get_index_in_psi_det_sorted_bit, searchDet integer, external :: get_index_in_psi_det_sorted_bit, searchDet
logical, external :: is_in_wavefunction, detEq logical, external :: is_in_wavefunction, detEq
double precision, external :: get_dij
integer :: II, blok integer :: II, blok
integer*8, save :: notf = 0 integer*8, save :: notf = 0
@ -659,7 +690,7 @@ end function
kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 !i kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 !i
if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle !if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle
do ni=1,N_int do ni=1,N_int
if(iand(made_hole(ni,1), det_cepa0_active(ni,1,k)) /= 0) cycle kloop if(iand(made_hole(ni,1), det_cepa0_active(ni,1,k)) /= 0) cycle kloop
@ -681,13 +712,10 @@ end function
j = sortRefIdx(j) j = sortRefIdx(j)
!$OMP ATOMIC !$OMP ATOMIC
notf = notf+1 notf = notf+1
!if(i/=k .and. dabs(psi_non_ref_coef(det_cepa0_idx(i),i_state)) < dabs(psi_non_ref_coef(det_cepa0_idx(k),i_state))) cycle
! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) > dabs(lambda_mrcc(i_state,det_cepa0_idx(k)))) cycle
! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) == dabs(lambda_mrcc(i_state,det_cepa0_idx(k))) .and. i < k) cycle
!if(.not. j==II .and. dabs(psi_ref_coef(II,i_state)) < dabs(psi_ref_coef(j,i_state))) cycle
call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk)
contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) !contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k))
contrib = delta_cas(II, J, i_state) * get_dij(psi_ref(1,1,J), psi_non_ref(1,1,det_cepa0_idx(k)), N_int)
!$OMP ATOMIC !$OMP ATOMIC
delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib