Changed code to treat the dataset as replacement updates, instead of additive updates. Before the updates are used to compute the inverse they are transformed accordingly.

However, this breaks the 4x4 example in update cycle 8169.
This commit is contained in:
François Coppens 2021-03-12 12:38:50 +01:00
parent 4c7a567750
commit ef97b40196
5 changed files with 41 additions and 20 deletions

View File

@ -1,18 +1,18 @@
## Compilers ## Compilers
ARCH = ARCH =
H5CXX = h5c++ -std=gnu++11 CXX = icpc
CXX = g++ FC = ifort
FC = gfortran H5CXX = h5c++
## Compiler flags ## Compiler flags
H5CXXFLAGS = -O0 -g CXXFLAGS = -O0 -debug full -traceback
CXXFLAGS = -O0 -g FFLAGS = $(CXXFLAGS)
FFLAGS = -O0 -g H5CXXFLAGS = $(CXXFLAGS) -fPIC
FLIBS = -lstdc++
INCLUDE = -I $(INC_DIR)/ INCLUDE = -I $(INC_DIR)/
DEPS_CXX = $(OBJ_DIR)/SM_MaponiA3.o $(OBJ_DIR)/SM_Standard.o DEPS_CXX = $(OBJ_DIR)/SM_MaponiA3.o $(OBJ_DIR)/SM_Standard.o
DEPS_F = $(DEPS_CXX) $(OBJ_DIR)/SM_MaponiA3_mod.o $(OBJ_DIR)/Helpers_mod.o DEPS_F = $(DEPS_CXX) $(OBJ_DIR)/SM_MaponiA3_mod.o $(OBJ_DIR)/Helpers_mod.o
FLIBS = -lstdc++
SRC_DIR := src SRC_DIR := src
TST_DIR := tests TST_DIR := tests

View File

@ -17,4 +17,22 @@ printf("--------------------------------------\n")
printf("Determinant of S x S_inv : %f\n", det(S*S_inv)) printf("Determinant of S x S_inv : %f\n", det(S*S_inv))
printf("Trace of S x S_inv : %f\n", trace(S*S_inv)) printf("Trace of S x S_inv : %f\n", trace(S*S_inv))
printf("Norm of S x S_inv : %f\n", norm(S*S_inv)) printf("Norm of S x S_inv : %f\n", norm(S*S_inv))
printf("======================================\n")
cutoff = 1e-6;
printf("\n")
printf("Cutoff set to %e: S x S_inv = \n", cutoff)
printf(" -----------------------------------------\n")
dim = columns(S);
res=S*S_inv;
for i = 1:dim
for j = 1:dim
if (res(i,j) < cutoff)
res(i,j) = 0;
elseif (S(i,j)-1 < cutoff)
res(i,j) = 1;
endif
endfor
endfor
format free;
disp(res);
printf(" =========================================\n")

View File

@ -1,3 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
export HDF5_CXX=icpc
export HDF5_CXXLINKER=icpc
export PATH=$PWD/bin:$PATH export PATH=$PWD/bin:$PATH

View File

@ -970,7 +970,7 @@ subroutine det_update_general(n,LDS,m,l,S,S_inv,d)
!DIR$ ASSUME (MOD(LDS,$IRP_ALIGN/8) == 0) !DIR$ ASSUME (MOD(LDS,$IRP_ALIGN/8) == 0)
!DIR$ ASSUME (n>150) !DIR$ ASSUME (n>150)
integer :: i,j,n4 integer :: i,j,n4
double precision :: zl double precision :: zl
!DIR$ NOPREFETCH !DIR$ NOPREFETCH
@ -1309,9 +1309,6 @@ END_PROVIDER
write(501,10007) write(501,10007)
write(502,10007) write(502,10007)
cycle_id = cycle_id + 1 cycle_id = cycle_id + 1
!close(501) !! Close file
!close(502) !! Close file
!stop
else else

View File

@ -6,7 +6,7 @@ program QMCChem_dataset_test
integer :: i, j, col !! Iterators integer :: i, j, col !! Iterators
integer :: cycle_id, dim, n_updates integer :: cycle_id, dim, n_updates
integer(c_int), dimension(:), allocatable :: Updates_index integer(c_int), dimension(:), allocatable :: Updates_index
real(c_double), dimension(:,:), allocatable :: Updates real(c_double), dimension(:,:), allocatable :: Updates, U
real(c_double), dimension(:,:), allocatable :: S, S_inv, S_inv_t real(c_double), dimension(:,:), allocatable :: S, S_inv, S_inv_t
call Read_dataset("datasets/update_cycle_8169.dat", & call Read_dataset("datasets/update_cycle_8169.dat", &
@ -17,7 +17,7 @@ program QMCChem_dataset_test
S_inv, & S_inv, &
Updates_index, & Updates_index, &
Updates) Updates)
allocate(S_inv_t(dim,dim)) allocate(S_inv_t(dim,dim), U(dim,n_updates))
!! Write current S and S_inv to file for check in Octave !! Write current S and S_inv to file for check in Octave
open(unit = 2000, file = "Slater_old.dat") open(unit = 2000, file = "Slater_old.dat")
@ -43,11 +43,13 @@ program QMCChem_dataset_test
end do end do
close(2000) close(2000)
!! Update S !! Update S & transform replacement updates 'Updates'
!! into additive updates 'U' to compute the inverse
do j=1,n_updates do j=1,n_updates
do i=1,dim do i=1,dim
col = Updates_index(j) col = Updates_index(j)
S(i,col) = S(i,col) + Updates(i,j) U(i,j) = Updates(i,j) - S(i,col)
S(i,col) = Updates(i,j)
end do end do
end do end do
@ -55,11 +57,12 @@ program QMCChem_dataset_test
!! S_inv needs to be transposed first before it !! S_inv needs to be transposed first before it
!! goes to MaponiA3 !! goes to MaponiA3
call Transpose(S_inv, S_inv_t, dim) call Transpose(S_inv, S_inv_t, dim)
call MaponiA3(S_inv_t, dim, n_updates, Updates, Updates_index) call MaponiA3(S_inv_t, dim, n_updates, U, Updates_index)
!! S_inv_t needs to be transposed back before we !! S_inv_t needs to be transposed back before it
!! can multiply it with S to test unity !! can be multiplied with S to test unity
call Transpose(S_inv_t, S_inv, dim) call Transpose(S_inv_t, S_inv, dim)
!! Write new S and S_inv to file for check in Octave !! Write new S and S_inv to file for check in Octave
open(unit = 4000, file = "Slater.dat") open(unit = 4000, file = "Slater.dat")
open(unit = 5000, file = "Slater_inv.dat") open(unit = 5000, file = "Slater_inv.dat")