Still working

This commit is contained in:
Francois Coppens 2021-10-18 12:05:41 +02:00
parent 9a16fb6003
commit 49b4dece2e
1 changed files with 278 additions and 211 deletions

View File

@ -180,8 +180,10 @@ END_PROVIDER
integer (qmckl_exit_code) :: rc
integer (qmckl_context) :: context
integer(kind=8) :: ddim, nupdates, updates_index(1)
real(c_double) :: updates(elec_alpha_num,1), breakdown
integer(kind=8) :: ddim, nupdates
real(c_double) :: breakdown
real(c_double), allocatable :: updates(:,:)
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: tmp_inv, tmp_det
@ -271,81 +273,144 @@ END_PROVIDER
ddet = 0.d0
if (n_to_do < shiftl(elec_alpha_num,1)) then
do while ( n_to_do > 0 )
ddet = det_alpha_value_curr ! remember value of det_alpha_value_curr
n_to_do_old = n_to_do ! remember n_to_do value
n_to_do = 0
do l=1,n_to_do_old
k = to_do(l) ! select electron to change
imo = mo_list_alpha_curr(k) ! select mo to change
slater_matrix_alpha_inv_det = slater_matrix_alpha_inv_det / ddet
open(unit = 2000, file = "SlaterA_old.dat")
open(unit = 3000, file = "SlaterA_old_inv.dat")
do i=1, elec_alpha_num
do j=1, elec_alpha_num
write(2000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
write(3000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
end do
write(2000,*)
write(3000,*)
ddet = det_alpha_value_curr ! set ddet to the current value
slater_matrix_alpha_inv_det = slater_matrix_alpha_inv_det / ddet
! open(unit = 2000, file = "SlaterB_old.dat")
! open(unit = 3000, file = "SlaterB_old_inv.dat")
! do i=1, elec_alpha_num
! do j=1, elec_alpha_num
! write(2000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
! write(3000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
! end do
! write(2000,*)
! write(3000,*)
! end do
! flush(2000)
! flush(3000)
! close(2000)
! close(3000)
allocate(updates(elec_alpha_num, n_to_do))
do j = 1, n_to_do ! do for all updates
k = to_do(j) ! find back the electron we need to update
imo = mo_list_alpha_curr(k) ! find column/row/MO for electron k
! write(*,*) "n_to_do : ", n_to_do
! write(*,*) "j, k = to_do(j), imo = mo_list_alpha_curr(k) : ", j, k, imo
do i = 1, elec_alpha_num ! run over all electrons
updates(i, j) = mo_value(i, imo) - slater_matrix_alpha(i, k)
slater_matrix_alpha(i, k) = mo_value(i, imo)
end do
flush(2000)
flush(3000)
close(2000)
close(3000)
do i = 1,elec_alpha_num
updates(i,1) = mo_value(i, imo) - slater_matrix_alpha(i, imo)
slater_matrix_alpha(i,imo) = mo_value(i, imo)
end do
context = qmckl_context_create()
ddim = elec_alpha_num
nupdates = 1
updates_index(1) = imo
breakdown = 1e-3
rc = qmckl_sherman_morrison_splitting(context, &
ddim, &
nupdates, &
updates, &
updates_index, &
breakdown, &
slater_matrix_alpha_inv_det(1:elec_alpha_num, 1:elec_alpha_num), &
ddet)
rc = qmckl_context_destroy(context)
open(unit = 4000, file = "SlaterA.dat")
open(unit = 5000, file = "SlaterA_inv.dat")
do i=1, elec_alpha_num
do j=1, elec_alpha_num
write(4000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
write(5000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
end do
write(4000,*)
write(5000,*)
end do
flush(4000)
flush(5000)
close(4000)
close(5000)
end do
context = qmckl_context_create()
breakdown = 1e-3
rc = qmckl_sherman_morrison_smw32s(context, &
int(elec_alpha_num, kind=8), &
int(n_to_do, kind=8), &
updates, &
int(to_do, kind=8), &
breakdown, &
slater_matrix_alpha_inv_det(1:elec_alpha_num, 1:elec_alpha_num), &
ddet)
rc = qmckl_context_destroy(context)
! open(unit = 4000, file = "SlaterB.dat")
! open(unit = 5000, file = "SlaterB_inv.dat")
! do i=1, elec_alpha_num
! do j=1, elec_alpha_num
! write(4000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
! write(5000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
! end do
! write(4000,*)
! write(5000,*)
! end do
! flush(4000)
! flush(5000)
! close(4000)
! close(5000)
slater_matrix_alpha_inv_det = slater_matrix_alpha_inv_det * ddet
det_alpha_value_curr = ddet
deallocate(updates)
if (ddet /= 0.d0) then
det_alpha_value_curr = ddet
else
n_to_do += 1
to_do(n_to_do) = k
ddet = det_alpha_value_curr
endif
enddo
if (n_to_do == n_to_do_old) then
ddet = 0.d0
exit
endif
enddo
! do while ( n_to_do > 0 )
! ddet = det_alpha_value_curr ! remember value of det_alpha_value_curr
! n_to_do_old = n_to_do ! remember n_to_do value
! n_to_do = 0
! do l=1,n_to_do_old
! k = to_do(l) ! select electron to change
! imo = mo_list_alpha_curr(k) ! select mo to change
! slater_matrix_alpha_inv_det = slater_matrix_alpha_inv_det / ddet
! open(unit = 2000, file = "SlaterA_old.dat")
! open(unit = 3000, file = "SlaterA_old_inv.dat")
! do i=1, elec_alpha_num
! do j=1, elec_alpha_num
! write(2000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
! write(3000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
! end do
! write(2000,*)
! write(3000,*)
! end do
! flush(2000)
! flush(3000)
! close(2000)
! close(3000)
! do i = 1,elec_alpha_num
! updates(i,1) = mo_value(i, imo) - slater_matrix_alpha(i, imo)
! slater_matrix_alpha(i,imo) = mo_value(i, imo)
! end do
! context = qmckl_context_create()
! ddim = elec_alpha_num
! nupdates = 1
! updates_index(1) = imo
! breakdown = 1e-3
! rc = qmckl_sherman_morrison_splitting(context, &
! ddim, &
! nupdates, &
! updates, &
! updates_index, &
! breakdown, &
! slater_matrix_alpha_inv_det(1:elec_alpha_num, 1:elec_alpha_num), &
! ddet)
! rc = qmckl_context_destroy(context)
! open(unit = 4000, file = "SlaterA.dat")
! open(unit = 5000, file = "SlaterA_inv.dat")
! do i=1, elec_alpha_num
! do j=1, elec_alpha_num
! write(4000,"(E23.15, 1X)", advance="no") slater_matrix_alpha(j,i) ! avoid transpose later
! write(5000,"(E23.15, 1X)", advance="no") slater_matrix_alpha_inv_det(i,j)
! end do
! write(4000,*)
! write(5000,*)
! end do
! flush(4000)
! flush(5000)
! close(4000)
! close(5000)
! slater_matrix_alpha_inv_det = slater_matrix_alpha_inv_det * ddet
! if (ddet /= 0.d0) then
! det_alpha_value_curr = ddet
! else
! n_to_do += 1
! to_do(n_to_do) = k
! ddet = det_alpha_value_curr
! endif
! enddo
! if (n_to_do == n_to_do_old) then
! ddet = 0.d0
! exit
! endif
! enddo
endif
@ -402,18 +467,16 @@ END_PROVIDER
double precision :: ddet
integer :: i,j,k,imo,l
integer :: to_do(elec_alpha_num-mo_closed_num), n_to_do_old, n_to_do
integer :: to_do(elec_alpha_num - mo_closed_num), n_to_do_old, n_to_do
double precision :: tmp_inv(elec_alpha_num_8)
real :: tmp_det(elec_alpha_num_8)
integer, save :: ifirst
integer (qmckl_exit_code) :: rc
integer (qmckl_context) :: context
integer(kind=8) :: ddim, nupdates
integer(c_int64_t) :: ddim, nupdates
real(c_double) :: breakdown
integer(kind=8), allocatable, dimension(:) :: updates_index
real(c_double), allocatable, dimension(:,:) :: updates
real(c_double), allocatable :: updates(:,:)
if (elec_beta_num == 0) then
det_beta_value_curr = 0.d0
@ -439,11 +502,11 @@ END_PROVIDER
enddo
! make swaps and keep 1 update
write(*,*) "Value of mo_exc_beta_curr = ", mo_exc_beta_curr
! write(*,*) "Value of mo_exc_beta_curr = ", mo_exc_beta_curr
if (n_to_do > 1 .and. mo_exc_beta_curr == 1) then
if (iand(n_to_do+1,1)==1) then
write(*,*) "Value of n_to_do+1, iand(n_to_do+1,1)", n_to_do+1, iand(n_to_do+1,1)
! write(*,*) "Value of n_to_do+1, iand(n_to_do+1,1)", n_to_do+1, iand(n_to_do+1,1)
det_beta_value_curr = -det_beta_value_curr
!DIR$ VECTOR ALWAYS
!DIR$ VECTOR ALIGNED
@ -506,148 +569,152 @@ END_PROVIDER
ddet = 0.d0
if (n_to_do < shiftl(elec_beta_num,1)) then !! Why compare to double the number of electrons?
write(*,*) "Value of elec_beta_num, shiftl(elec_beta_num,1)", elec_beta_num, shiftl(elec_beta_num,1)
! write(*,*) "Value of elec_beta_num, shiftl(elec_beta_num,1)", elec_beta_num, shiftl(elec_beta_num,1)
ddet = det_beta_value_curr ! set ddet to the current value
slater_matrix_beta_inv_det = slater_matrix_beta_inv_det / ddet
! open(unit = 2000, file = "SlaterB_old.dat")
! open(unit = 3000, file = "SlaterB_old_inv.dat")
! do i=1, elec_beta_num
! do j=1, elec_beta_num
! write(2000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
! write(3000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
! end do
! write(2000,*)
! write(3000,*)
! end do
! flush(2000)
! flush(3000)
! close(2000)
! close(3000)
allocate(updates(elec_beta_num, n_to_do))
do j = 1, n_to_do ! do for all updates
k = to_do(j) ! find back the electron we need to update
imo = mo_list_beta_curr(k) ! find column/row/MO for electron k
! write(*,*) "n_to_do : ", n_to_do
! write(*,*) "j, k = to_do(j), imo = mo_list_beta_curr(k) : ", j, k, imo
do i = 1, elec_beta_num ! run over all electrons
updates(i, j) = mo_value(elec_alpha_num + i, imo) - slater_matrix_beta(i, k)
slater_matrix_beta(i, k) = mo_value(elec_alpha_num + i, imo)
end do
end do
context = qmckl_context_create()
breakdown = 1e-3
rc = qmckl_sherman_morrison_smw32s(context, &
int(elec_beta_num, kind=8), &
int(n_to_do, kind=8), &
updates, &
int(to_do, kind=8), &
breakdown, &
slater_matrix_beta_inv_det(1:elec_beta_num, 1:elec_beta_num), &
ddet)
rc = qmckl_context_destroy(context)
! open(unit = 4000, file = "SlaterB.dat")
! open(unit = 5000, file = "SlaterB_inv.dat")
! do i=1, elec_beta_num
! do j=1, elec_beta_num
! write(4000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
! write(5000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
! end do
! write(4000,*)
! write(5000,*)
! end do
! flush(4000)
! flush(5000)
! close(4000)
! close(5000)
slater_matrix_beta_inv_det = slater_matrix_beta_inv_det * ddet
det_beta_value_curr = ddet
deallocate(updates)
! !! THIS WHOLE WHILE LOOP NEEDS TO BE REPLACED WITH 1 CALL TO QMCKL_SHERMAN_MORRISON_SMWB32S()
! do while ( n_to_do > 0 )
! ! keep doing this until there are no more updates.
! ! This can take multiple runs over the updates stored in to_do()
! ddet = det_beta_value_curr ! set ddet to the current value
! n_to_do_old = n_to_do ! remember how many updates there are
! n_to_do = 0 ! create a new list of update that need to be applied
! do l=1,n_to_do_old ! first run over all updates
! k = to_do(l) ! find back the electron we need to update
! imo = mo_list_beta_curr(k) ! find column/row/MO for electron k
! slater_matrix_beta_inv_det = slater_matrix_beta_inv_det / ddet
! open(unit = 2000, file = "SlaterB_old.dat")
! open(unit = 3000, file = "SlaterB_old_inv.dat")
! do i=1, elec_beta_num
! do j=1, elec_beta_num
! write(2000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
! write(3000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
! end do
! write(2000,*)
! write(3000,*)
! end do
! flush(2000)
! flush(3000)
! close(2000)
! close(3000)
! do i = 1,elec_beta_num
! updates(i,1) = mo_value(elec_alpha_num + i, imo) - slater_matrix_beta(i, k)
! slater_matrix_beta(i, k) = mo_value(elec_alpha_num + i, imo)
! end do
! ddet = det_beta_value_curr ! set ddet to the current value
allocate(updates(elec_beta_num, n_to_do), &
updates_index(n_to_do))
! do j = 1, n_to_do ! do for all updates
! k = to_do(j) ! find back the electron we need to update
! imo = mo_list_beta_curr(k) ! find column/row/MO for electron k
! write(*,*) "n_to_do : ", n_to_do
! write(*,*) "j, k = to_do(j), imo = mo_list_beta_curr(k) : ", j, k, imo
! do i = 1, elec_beta_num ! run over all electrons
! updates(i, j) = mo_value(elec_alpha_num + i, imo) - slater_matrix_beta(i, k)
! slater_matrix_beta(i, k) = mo_value(elec_alpha_num + i, imo)
! end do
! end do
!! THIS WHOLE WHILE LOOP NEEDS TO BE REPLACED WITH 1 CALL TO QMCKL_SHERMAN_MORRISON_SMWB32S()
do while ( n_to_do > 0 )
! keep doing this until there are no more updates.
! This can take multiple runs over the updates stored in to_do()
ddet = det_beta_value_curr ! set ddet to the current value
n_to_do_old = n_to_do ! remember how many updates there are
n_to_do = 0 ! create a new list of update that need to be applied
do l=1,n_to_do_old ! first run over all updates
k = to_do(l) ! find back the electron we need to update
imo = mo_list_beta_curr(k) ! find column/row/MO for electron k
slater_matrix_beta_inv_det = slater_matrix_beta_inv_det / ddet
open(unit = 2000, file = "SlaterB_old.dat")
open(unit = 3000, file = "SlaterB_old_inv.dat")
do i=1, elec_beta_num
do j=1, elec_beta_num
write(2000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
write(3000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
end do
write(2000,*)
write(3000,*)
end do
flush(2000)
flush(3000)
close(2000)
close(3000)
do i = 1,elec_beta_num
updates(i,1) = mo_value(elec_alpha_num + i, imo) - slater_matrix_beta(i, k)
slater_matrix_beta(i, k) = mo_value(elec_alpha_num + i, imo)
end do
context = qmckl_context_create()
ddim = elec_beta_num
nupdates = 1
updates_index(1) = k
breakdown = 1e-3
rc = qmckl_sherman_morrison_splitting(context, &
ddim, &
nupdates, &
updates, &
updates_index, &
breakdown, &
slater_matrix_beta_inv_det(1:elec_beta_num, 1:elec_beta_num), &
ddet)
rc = qmckl_context_destroy(context)
! context = qmckl_context_create()
! ddim = elec_beta_num
! nupdates = 1
! updates_index(1) = k
! breakdown = 1e-3
! rc = qmckl_sherman_morrison_splitting(context, &
! ddim, &
! nupdates, &
! updates, &
! updates_index, &
! breakdown, &
! slater_matrix_beta_inv_det(1:elec_beta_num, 1:elec_beta_num), &
! ddet)
! rc = qmckl_context_destroy(context)
open(unit = 4000, file = "SlaterB.dat")
open(unit = 5000, file = "SlaterB_inv.dat")
do i=1, elec_beta_num
do j=1, elec_beta_num
write(4000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
write(5000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
end do
write(4000,*)
write(5000,*)
end do
flush(4000)
flush(5000)
close(4000)
close(5000)
slater_matrix_beta_inv_det = slater_matrix_beta_inv_det * ddet
stop
if (ddet /= 0.d0) then
det_beta_value_curr = ddet
else
n_to_do += 1
to_do(n_to_do) = k
ddet = det_beta_value_curr
endif
enddo
if (n_to_do == n_to_do_old) then
ddet = 0.d0
exit
endif
enddo !! all updates have been done
! open(unit = 4000, file = "SlaterB.dat")
! open(unit = 5000, file = "SlaterB_inv.dat")
! do i=1, elec_beta_num
! do j=1, elec_beta_num
! write(4000,"(E23.15, 1X)", advance="no") slater_matrix_beta(j,i) ! avoid transpose later
! write(5000,"(E23.15, 1X)", advance="no") slater_matrix_beta_inv_det(i,j)
! end do
! write(4000,*)
! write(5000,*)
! end do
! flush(4000)
! flush(5000)
! close(4000)
! close(5000)
! slater_matrix_beta_inv_det = slater_matrix_beta_inv_det * ddet
! stop
! if (ddet /= 0.d0) then
! det_beta_value_curr = ddet
! else
! n_to_do += 1
! to_do(n_to_do) = k
! ddet = det_beta_value_curr
! endif
! enddo
! if (n_to_do == n_to_do_old) then
! ddet = 0.d0
! exit
! endif
! enddo !! all updates have been done