mirror of
https://github.com/LCPQ/quantum_package
synced 2024-09-16 17:35:42 +02:00
Better parallelization of Davidson
This commit is contained in:
parent
b51cfbcfbe
commit
23e5036718
@ -344,50 +344,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8)
|
|||||||
Vt = 0.d0
|
Vt = 0.d0
|
||||||
St = 0.d0
|
St = 0.d0
|
||||||
|
|
||||||
!$OMP DO SCHEDULE(guided)
|
!$OMP DO SCHEDULE(static,1)
|
||||||
do sh=1,shortcut(0,1)
|
|
||||||
do sh2=sh,shortcut(0,1)
|
|
||||||
exa = 0
|
|
||||||
do ni=1,Nint
|
|
||||||
exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1)))
|
|
||||||
end do
|
|
||||||
if(exa > 2) then
|
|
||||||
cycle
|
|
||||||
end if
|
|
||||||
|
|
||||||
do i=shortcut(sh,1),shortcut(sh+1,1)-1
|
|
||||||
org_i = sort_idx(i,1)
|
|
||||||
if(sh==sh2) then
|
|
||||||
endi = i-1
|
|
||||||
else
|
|
||||||
endi = shortcut(sh2+1,1)-1
|
|
||||||
end if
|
|
||||||
do ni=1,Nint
|
|
||||||
sorted_i(ni) = sorted(ni,i,1)
|
|
||||||
enddo
|
|
||||||
|
|
||||||
do j=shortcut(sh2,1),endi
|
|
||||||
org_j = sort_idx(j,1)
|
|
||||||
ext = exa
|
|
||||||
do ni=1,Nint
|
|
||||||
ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1)))
|
|
||||||
end do
|
|
||||||
if(ext <= 4) then
|
|
||||||
call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij)
|
|
||||||
call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2)
|
|
||||||
do istate=1,n_st
|
|
||||||
vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j)
|
|
||||||
vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i)
|
|
||||||
st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j)
|
|
||||||
st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i)
|
|
||||||
enddo
|
|
||||||
endif
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
!$OMP END DO
|
|
||||||
!$OMP DO SCHEDULE(guided)
|
|
||||||
do sh=1,shortcut(0,2)
|
do sh=1,shortcut(0,2)
|
||||||
do i=shortcut(sh,2),shortcut(sh+1,2)-1
|
do i=shortcut(sh,2),shortcut(sh+1,2)-1
|
||||||
org_i = sort_idx(i,2)
|
org_i = sort_idx(i,2)
|
||||||
@ -410,16 +367,67 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8)
|
|||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
enddo
|
enddo
|
||||||
!$OMP END DO
|
!$OMP END DO NOWAIT
|
||||||
|
do sh=1,shortcut(0,1)
|
||||||
|
!$OMP DO SCHEDULE(static,1)
|
||||||
|
do sh2=sh,shortcut(0,1)
|
||||||
|
exa = 0
|
||||||
|
do ni=1,Nint
|
||||||
|
exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1)))
|
||||||
|
end do
|
||||||
|
if(exa > 2) then
|
||||||
|
cycle
|
||||||
|
end if
|
||||||
|
|
||||||
!$OMP CRITICAL
|
do i=shortcut(sh,1),shortcut(sh+1,1)-1
|
||||||
|
org_i = sort_idx(i,1)
|
||||||
|
if(sh==sh2) then
|
||||||
|
endi = i-1
|
||||||
|
else
|
||||||
|
endi = shortcut(sh2+1,1)-1
|
||||||
|
end if
|
||||||
|
do ni=1,Nint
|
||||||
|
sorted_i(ni) = sorted(ni,i,1)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
do j=shortcut(sh2,1),endi
|
||||||
|
ext = exa
|
||||||
|
do ni=1,Nint
|
||||||
|
ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1)))
|
||||||
|
end do
|
||||||
|
if(ext <= 4) then
|
||||||
|
org_j = sort_idx(j,1)
|
||||||
|
call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij)
|
||||||
|
if (hij /= 0.d0) then
|
||||||
|
do istate=1,n_st
|
||||||
|
vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j)
|
||||||
|
vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i)
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
if (ext /= 2) then
|
||||||
|
call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2)
|
||||||
|
if (s2 /= 0.d0) then
|
||||||
|
do istate=1,n_st
|
||||||
|
st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j)
|
||||||
|
st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i)
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
!$OMP END DO NOWAIT
|
||||||
|
enddo
|
||||||
|
|
||||||
|
!$OMP CRITICAL (u0Hu0)
|
||||||
do istate=1,N_st
|
do istate=1,N_st
|
||||||
do i=n,1,-1
|
do i=n,1,-1
|
||||||
v_0(i,istate) = v_0(i,istate) + vt(istate,i)
|
v_0(i,istate) = v_0(i,istate) + vt(istate,i)
|
||||||
s_0(i,istate) = s_0(i,istate) + st(istate,i)
|
s_0(i,istate) = s_0(i,istate) + st(istate,i)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
!$OMP END CRITICAL
|
!$OMP END CRITICAL (u0Hu0)
|
||||||
|
|
||||||
deallocate(vt,st)
|
deallocate(vt,st)
|
||||||
!$OMP END PARALLEL
|
!$OMP END PARALLEL
|
||||||
|
Loading…
Reference in New Issue
Block a user