mirror of
https://gitlab.com/scemama/qmcchem.git
synced 2024-08-30 14:53:42 +02:00
334 lines
8.2 KiB
FortranFixed
334 lines
8.2 KiB
FortranFixed
|
BEGIN_PROVIDER [ double precision, xbrown, (elec_num_8,3) ]
|
||
|
BEGIN_DOC
|
||
|
! Brownian step. Built in Brownian_step subroutine.
|
||
|
END_DOC
|
||
|
integer :: i,l
|
||
|
xbrown = 0.d0
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_alpha_num ]
|
||
|
&BEGIN_PROVIDER [ integer, elec_alpha_num_8 ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Number of alpha electrons
|
||
|
END_DOC
|
||
|
integer, external :: mod_align
|
||
|
elec_alpha_num = -1
|
||
|
call get_electrons_elec_alpha_num(elec_alpha_num)
|
||
|
if (elec_alpha_num <= 0) then
|
||
|
call abrt(irp_here,'Number of alpha electrons should be > 0')
|
||
|
endif
|
||
|
elec_alpha_num_8 = mod_align(elec_alpha_num)
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_beta_num ]
|
||
|
&BEGIN_PROVIDER [ integer, elec_beta_num_8 ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Number of beta electrons
|
||
|
END_DOC
|
||
|
integer, external :: mod_align
|
||
|
elec_beta_num = 0
|
||
|
call get_electrons_elec_beta_num(elec_beta_num)
|
||
|
if (elec_beta_num < 0) then
|
||
|
call abrt(irp_here,'Number of beta electrons should be >= 0')
|
||
|
endif
|
||
|
elec_beta_num_8 = mod_align(elec_beta_num)
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_num ]
|
||
|
&BEGIN_PROVIDER [ integer, elec_num_8 ]
|
||
|
&BEGIN_PROVIDER [ integer, elec_num_1_8 ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Number of electrons
|
||
|
END_DOC
|
||
|
integer, external :: mod_align
|
||
|
elec_num = elec_alpha_num + elec_beta_num
|
||
|
ASSERT ( elec_num > 0 )
|
||
|
elec_num_8 = mod_align(elec_num)
|
||
|
elec_num_1_8 = mod_align(elec_num+1)
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, elec_coord_full, (elec_num+1,3,walk_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Electron coordinates of all walkers
|
||
|
! Component (elec_num+1,1,walk_num) contains the length realized by the walker.
|
||
|
! Initialized in init_walkers
|
||
|
END_DOC
|
||
|
integer :: i,k
|
||
|
real, allocatable :: buffer2(:,:,:)
|
||
|
if ( is_worker ) then
|
||
|
|
||
|
call get_elec_coord_full(elec_coord_full,size(elec_coord_full,1))
|
||
|
|
||
|
else
|
||
|
|
||
|
if (.not.do_prepare) then
|
||
|
allocate ( buffer2(elec_num+1,3,elec_coord_pool_size) )
|
||
|
call get_electrons_elec_coord_pool(buffer2)
|
||
|
do k=1,walk_num
|
||
|
do i=1,elec_num+1
|
||
|
elec_coord_full(i,1,k) = buffer2(i,1,k)
|
||
|
elec_coord_full(i,2,k) = buffer2(i,2,k)
|
||
|
elec_coord_full(i,3,k) = buffer2(i,3,k)
|
||
|
enddo
|
||
|
enddo
|
||
|
deallocate ( buffer2 )
|
||
|
else
|
||
|
elec_coord_full = 0.
|
||
|
endif
|
||
|
|
||
|
endif
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_coord_pool_size ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Size of the pool of electron coordinates
|
||
|
END_DOC
|
||
|
elec_coord_pool_size = walk_num_tot
|
||
|
call get_electrons_elec_coord_pool_size(elec_coord_pool_size)
|
||
|
call iinfo(irp_here,'elec_coord_pool_size',elec_coord_pool_size)
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, elec_coord, (elec_num_1_8,3) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Electron coordinates
|
||
|
END_DOC
|
||
|
integer :: i, k
|
||
|
elec_coord = 0.
|
||
|
do k=1,3
|
||
|
do i=1,elec_num+1
|
||
|
elec_coord(i,k) = elec_coord_full(i,k,walk_i)
|
||
|
enddo
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, elec_coord_transp, (8,elec_num)
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Transposed array of elec_coord
|
||
|
END_DOC
|
||
|
integer :: i, k
|
||
|
integer, save :: ifirst = 0
|
||
|
if (ifirst == 0) then
|
||
|
ifirst = 1
|
||
|
elec_coord_transp = 0.
|
||
|
endif
|
||
|
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (200)
|
||
|
do i=1,elec_num
|
||
|
elec_coord_transp(1,i) = elec_coord(i,1)
|
||
|
elec_coord_transp(2,i) = elec_coord(i,2)
|
||
|
elec_coord_transp(3,i) = elec_coord(i,3)
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, elec_dist, (elec_num_8,elec_num) ]
|
||
|
&BEGIN_PROVIDER [ real, elec_dist_vec_x, (elec_num_8,elec_num) ]
|
||
|
&BEGIN_PROVIDER [ real, elec_dist_vec_y, ((-simd_sp+1):elec_num_8,elec_num) ]
|
||
|
&BEGIN_PROVIDER [ real, elec_dist_vec_z, ((-2*simd_sp+1):elec_num_8,elec_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Electron-electron distances
|
||
|
END_DOC
|
||
|
integer :: ie1, ie2, l
|
||
|
|
||
|
integer, save :: ifirst = 0
|
||
|
if (ifirst == 0) then
|
||
|
ifirst = 1
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
elec_dist = 0.
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
elec_dist_vec_x = 0.
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
elec_dist_vec_y = 0.
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
elec_dist_vec_z = 0.
|
||
|
endif
|
||
|
|
||
|
do ie2 = 1,elec_num
|
||
|
real :: x, y, z
|
||
|
x = elec_coord(ie2,1)
|
||
|
y = elec_coord(ie2,2)
|
||
|
z = elec_coord(ie2,3)
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (200)
|
||
|
do ie1 = 1,elec_num
|
||
|
elec_dist_vec_x(ie1,ie2) = elec_coord(ie1,1) - x
|
||
|
elec_dist_vec_y(ie1,ie2) = elec_coord(ie1,2) - y
|
||
|
elec_dist_vec_z(ie1,ie2) = elec_coord(ie1,3) - z
|
||
|
enddo
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (200)
|
||
|
do ie1 = 1,elec_num
|
||
|
elec_dist(ie1,ie2) = sqrt( &
|
||
|
elec_dist_vec_x(ie1,ie2)*elec_dist_vec_x(ie1,ie2) + &
|
||
|
elec_dist_vec_y(ie1,ie2)*elec_dist_vec_y(ie1,ie2) + &
|
||
|
elec_dist_vec_z(ie1,ie2)*elec_dist_vec_z(ie1,ie2) )
|
||
|
enddo
|
||
|
enddo
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, nucl_elec_dist, (nucl_num_8,elec_num) ]
|
||
|
&BEGIN_PROVIDER [ real, nucl_elec_dist_vec, (3,nucl_num,elec_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Electron-nucleus distances |r_elec - R_nucl|
|
||
|
END_DOC
|
||
|
integer :: i,j,l
|
||
|
integer, save :: ifirst = 0
|
||
|
|
||
|
if (ifirst == 0) then
|
||
|
ifirst = 1
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
nucl_elec_dist = 0.
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
nucl_elec_dist_vec = 0.
|
||
|
endif
|
||
|
|
||
|
do i = 1,elec_num
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (100)
|
||
|
do j = 1,nucl_num
|
||
|
nucl_elec_dist_vec(1,j,i) = elec_coord_transp(1,i) - nucl_coord(j,1)
|
||
|
nucl_elec_dist_vec(2,j,i) = elec_coord_transp(2,i) - nucl_coord(j,2)
|
||
|
nucl_elec_dist_vec(3,j,i) = elec_coord_transp(3,i) - nucl_coord(j,3)
|
||
|
enddo
|
||
|
enddo
|
||
|
|
||
|
do i = 1,elec_num
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (100)
|
||
|
do j = 1,nucl_num
|
||
|
nucl_elec_dist(j,i) = (elec_coord(i,1) - nucl_coord(j,1)) &
|
||
|
* (elec_coord(i,1) - nucl_coord(j,1)) &
|
||
|
+ (elec_coord(i,2) - nucl_coord(j,2)) &
|
||
|
* (elec_coord(i,2) - nucl_coord(j,2)) &
|
||
|
+ (elec_coord(i,3) - nucl_coord(j,3)) &
|
||
|
* (elec_coord(i,3) - nucl_coord(j,3))
|
||
|
nucl_elec_dist(j,i) = max(1.e-6,sqrt(nucl_elec_dist(j,i)))
|
||
|
enddo
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_num_2, (2) ]
|
||
|
|
||
|
BEGIN_DOC
|
||
|
! Number of alpha and beta electrons in an array
|
||
|
END_DOC
|
||
|
|
||
|
elec_num_2(1) = elec_alpha_num
|
||
|
elec_num_2(2) = elec_beta_num
|
||
|
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ integer, elec_spin, (elec_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Electron spin. +1 for alpha and -1 for beta
|
||
|
END_DOC
|
||
|
integer :: i
|
||
|
do i=1,elec_alpha_num
|
||
|
elec_spin(i) = 1
|
||
|
enddo
|
||
|
do i=elec_alpha_num+1,elec_num
|
||
|
elec_spin(i) = -1
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, elec_dist_inv, (elec_num_8,elec_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! 1/rij matrix
|
||
|
END_DOC
|
||
|
integer :: i,j
|
||
|
integer, save :: ifirst = 0
|
||
|
if (ifirst == 0) then
|
||
|
ifirst = 1
|
||
|
elec_dist_inv = 0.
|
||
|
endif
|
||
|
do i=1,elec_num
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (200)
|
||
|
do j=1,elec_num
|
||
|
elec_dist_inv(j,i) = 1./(elec_dist(j,i)+1.e-12)
|
||
|
enddo
|
||
|
elec_dist_inv(i,i) = 0.
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
BEGIN_PROVIDER [ real, nucl_elec_dist_inv, (nucl_num_8,elec_num) ]
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! 1/rij matrix
|
||
|
END_DOC
|
||
|
integer :: i,j
|
||
|
do j=1,elec_num
|
||
|
!DIR$ VECTOR ALIGNED
|
||
|
!DIR$ LOOP COUNT (100)
|
||
|
do i=1,nucl_num
|
||
|
nucl_elec_dist_inv(i,j) = 1./nucl_elec_dist(i,j)
|
||
|
enddo
|
||
|
enddo
|
||
|
END_PROVIDER
|
||
|
|
||
|
|
||
|
subroutine save_elec_coord_full
|
||
|
implicit none
|
||
|
BEGIN_DOC
|
||
|
! Save the electron coordinates to disk
|
||
|
END_DOC
|
||
|
integer :: i,k,l
|
||
|
real, allocatable :: buffer2(:,:,:)
|
||
|
|
||
|
allocate ( buffer2(elec_num+1,3,elec_coord_pool_size) )
|
||
|
k=0
|
||
|
do l=1,elec_coord_pool_size
|
||
|
k = k+1
|
||
|
if (k == walk_num+1) then
|
||
|
k=1
|
||
|
endif
|
||
|
do i=1,elec_num+1
|
||
|
buffer2(i,1,l) = elec_coord_full(i,1,k)
|
||
|
buffer2(i,2,l) = elec_coord_full(i,2,k)
|
||
|
buffer2(i,3,l) = elec_coord_full(i,3,k)
|
||
|
enddo
|
||
|
enddo
|
||
|
call ezfio_set_electrons_elec_coord_pool(buffer2)
|
||
|
deallocate ( buffer2 )
|
||
|
|
||
|
end
|
||
|
|