mirror of
https://github.com/LCPQ/quantum_package
synced 2025-01-09 20:48:47 +01:00
Accelerated davidson
This commit is contained in:
parent
8e47ce1a3c
commit
4d31da34ff
@ -388,8 +388,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia
|
|||||||
call random_number(r1)
|
call random_number(r1)
|
||||||
call random_number(r2)
|
call random_number(r2)
|
||||||
u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2)
|
u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2)
|
||||||
! call RANDOM_NUMBER(u_in(i,k))
|
|
||||||
! u_in(i,k) = u_in(i,k) - 0.5d0
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
! Gram-Schmidt
|
! Gram-Schmidt
|
||||||
@ -422,7 +420,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia
|
|||||||
! Compute h_kl = <u_k | W_l> = <u_k| H |u_l>
|
! Compute h_kl = <u_k | W_l> = <u_k| H |u_l>
|
||||||
! -------------------------------------------
|
! -------------------------------------------
|
||||||
|
|
||||||
!
|
|
||||||
! do l=1,N_st_diag
|
! do l=1,N_st_diag
|
||||||
! do k=1,N_st_diag
|
! do k=1,N_st_diag
|
||||||
! do iter2=1,iter-1
|
! do iter2=1,iter-1
|
||||||
@ -440,7 +438,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia
|
|||||||
1.d0, U, size(U,1), W(1,1,iter), size(W,1), &
|
1.d0, U, size(U,1), W(1,1,iter), size(W,1), &
|
||||||
0.d0, h(1,1,1,iter), size(h,1)*size(h,2))
|
0.d0, h(1,1,1,iter), size(h,1)*size(h,2))
|
||||||
|
|
||||||
|
|
||||||
! Diagonalize h
|
! Diagonalize h
|
||||||
! -------------
|
! -------------
|
||||||
call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter)
|
call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter)
|
||||||
@ -453,21 +450,23 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia
|
|||||||
U(i,k,iter+1) = 0.d0
|
U(i,k,iter+1) = 0.d0
|
||||||
W(i,k,iter+1) = 0.d0
|
W(i,k,iter+1) = 0.d0
|
||||||
enddo
|
enddo
|
||||||
do iter2=1,iter
|
|
||||||
do l=1,N_st_diag
|
|
||||||
do i=1,sze
|
|
||||||
U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1)
|
|
||||||
W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1)
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
|
! do k=1,N_st_diag
|
||||||
|
! do iter2=1,iter
|
||||||
|
! do l=1,N_st_diag
|
||||||
|
! do i=1,sze
|
||||||
|
! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1)
|
||||||
|
! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1)
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
|
||||||
|
|
||||||
! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, &
|
call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, &
|
||||||
! 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1))
|
1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1))
|
||||||
! call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, &
|
call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, &
|
||||||
! 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1))
|
1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1))
|
||||||
|
|
||||||
|
|
||||||
! Compute residual vector
|
! Compute residual vector
|
||||||
@ -544,22 +543,23 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia
|
|||||||
|
|
||||||
do k=1,N_st_diag
|
do k=1,N_st_diag
|
||||||
energies(k) = lambda(k)
|
energies(k) = lambda(k)
|
||||||
enddo
|
|
||||||
|
|
||||||
do k=1,N_st_diag
|
|
||||||
do i=1,sze
|
do i=1,sze
|
||||||
u_in(i,k) = 0.d0
|
u_in(i,k) = 0.d0
|
||||||
do iter2=1,iter
|
|
||||||
do l=1,N_st_diag
|
|
||||||
u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1)
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
! do k=1,N_st_diag
|
||||||
|
! do i=1,sze
|
||||||
|
! do iter2=1,iter
|
||||||
|
! do l=1,N_st_diag
|
||||||
|
! u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1)
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
! enddo
|
||||||
|
|
||||||
! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, &
|
call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, &
|
||||||
! U, size(U,1), y, N_st_diag*davidson_sze_max, &
|
U, size(U,1), y, N_st_diag*davidson_sze_max, &
|
||||||
! 0.d0, u_in, size(u_in,1))
|
0.d0, u_in, size(u_in,1))
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user