mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2024-08-24 22:21:46 +02:00
Accelerate AOs
This commit is contained in:
parent
e9f79c144a
commit
fac03ea53b
128
org/qmckl_ao.org
128
org/qmckl_ao.org
@ -3443,7 +3443,7 @@ integer function qmckl_compute_ao_basis_shell_gaussian_vgl_f( &
|
|||||||
|
|
||||||
! Don't compute exponentials when the result will be almost zero.
|
! Don't compute exponentials when the result will be almost zero.
|
||||||
! TODO : Use numerical precision here
|
! TODO : Use numerical precision here
|
||||||
cutoff = -dlog(1.d-15)
|
cutoff = -dlog(1.d-12)
|
||||||
|
|
||||||
do inucl=1,nucl_num
|
do inucl=1,nucl_num
|
||||||
|
|
||||||
@ -4094,7 +4094,7 @@ integer function qmckl_ao_polynomial_vgl_f (context, &
|
|||||||
lmax_array(1:3) = lmax
|
lmax_array(1:3) = lmax
|
||||||
if (lmax == 0) then
|
if (lmax == 0) then
|
||||||
VGL(1,1) = 1.d0
|
VGL(1,1) = 1.d0
|
||||||
vgL(2:5,1) = 0.d0
|
VGL(2:5,1) = 0.d0
|
||||||
l(1:3,1) = 0
|
l(1:3,1) = 0
|
||||||
n=1
|
n=1
|
||||||
else if (lmax > 0) then
|
else if (lmax > 0) then
|
||||||
@ -4109,19 +4109,19 @@ integer function qmckl_ao_polynomial_vgl_f (context, &
|
|||||||
l (1:3,1:4) = 0
|
l (1:3,1:4) = 0
|
||||||
|
|
||||||
VGL(1 ,1 ) = 1.d0
|
VGL(1 ,1 ) = 1.d0
|
||||||
vgl(1:5,2:4) = 0.d0
|
VGL(1:5,2:4) = 0.d0
|
||||||
|
|
||||||
l (1,2) = 1
|
l (1,2) = 1
|
||||||
vgl(1,2) = pows(1,1)
|
VGL(1,2) = pows(1,1)
|
||||||
vgL(2,2) = 1.d0
|
VGL(2,2) = 1.d0
|
||||||
|
|
||||||
l (2,3) = 1
|
l (2,3) = 1
|
||||||
vgl(1,3) = pows(1,2)
|
VGL(1,3) = pows(1,2)
|
||||||
vgL(3,3) = 1.d0
|
VGL(3,3) = 1.d0
|
||||||
|
|
||||||
l (3,4) = 1
|
l (3,4) = 1
|
||||||
vgl(1,4) = pows(1,3)
|
VGL(1,4) = pows(1,3)
|
||||||
vgL(4,4) = 1.d0
|
VGL(4,4) = 1.d0
|
||||||
|
|
||||||
n=4
|
n=4
|
||||||
endif
|
endif
|
||||||
@ -4145,17 +4145,17 @@ integer function qmckl_ao_polynomial_vgl_f (context, &
|
|||||||
yz = pows(b,2) * pows(c,3)
|
yz = pows(b,2) * pows(c,3)
|
||||||
xz = pows(a,1) * pows(c,3)
|
xz = pows(a,1) * pows(c,3)
|
||||||
|
|
||||||
vgl(1,n) = xy * pows(c,3)
|
VGL(1,n) = xy * pows(c,3)
|
||||||
|
|
||||||
xy = dc * xy
|
xy = dc * xy
|
||||||
xz = db * xz
|
xz = db * xz
|
||||||
yz = da * yz
|
yz = da * yz
|
||||||
|
|
||||||
vgl(2,n) = pows(a-1,1) * yz
|
VGL(2,n) = pows(a-1,1) * yz
|
||||||
vgl(3,n) = pows(b-1,2) * xz
|
VGL(3,n) = pows(b-1,2) * xz
|
||||||
vgl(4,n) = pows(c-1,3) * xy
|
VGL(4,n) = pows(c-1,3) * xy
|
||||||
|
|
||||||
vgl(5,n) = &
|
VGL(5,n) = &
|
||||||
(da-1.d0) * pows(a-2,1) * yz + &
|
(da-1.d0) * pows(a-2,1) * yz + &
|
||||||
(db-1.d0) * pows(b-2,2) * xz + &
|
(db-1.d0) * pows(b-2,2) * xz + &
|
||||||
(dc-1.d0) * pows(c-2,3) * xy
|
(dc-1.d0) * pows(c-2,3) * xy
|
||||||
@ -4378,7 +4378,7 @@ integer function qmckl_compute_ao_vgl_f(context, &
|
|||||||
|
|
||||||
double precision :: e_coord(3), n_coord(3)
|
double precision :: e_coord(3), n_coord(3)
|
||||||
integer*8 :: n_poly
|
integer*8 :: n_poly
|
||||||
integer :: l, il, k
|
integer :: l, il, k, m, n
|
||||||
integer*8 :: ipoint, inucl, ishell
|
integer*8 :: ipoint, inucl, ishell
|
||||||
integer*8 :: ishell_start, ishell_end
|
integer*8 :: ishell_start, ishell_end
|
||||||
integer :: lstart(0:20)
|
integer :: lstart(0:20)
|
||||||
@ -4388,25 +4388,45 @@ integer function qmckl_compute_ao_vgl_f(context, &
|
|||||||
|
|
||||||
double precision, allocatable :: poly_vgl(:,:)
|
double precision, allocatable :: poly_vgl(:,:)
|
||||||
integer , allocatable :: powers(:,:)
|
integer , allocatable :: powers(:,:)
|
||||||
|
integer , allocatable :: kil(:), knucl(:), kshell(:)
|
||||||
|
|
||||||
allocate(poly_vgl(5,ao_num), powers(3,ao_num))
|
allocate(poly_vgl(8,ao_num), powers(8,ao_num))
|
||||||
|
allocate(kil(ao_num), kshell(ao_num), knucl(nucl_num+1))
|
||||||
|
|
||||||
! Pre-computed data
|
! Pre-computed data
|
||||||
do l=0,20
|
|
||||||
lstart(l) = l*(l+1)*(l+2)/6 +1
|
k=1
|
||||||
|
do inucl=1,nucl_num
|
||||||
|
knucl(inucl) = k
|
||||||
|
ishell_start = nucleus_index(inucl) + 1
|
||||||
|
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
|
||||||
|
do ishell = ishell_start, ishell_end
|
||||||
|
l = shell_ang_mom(ishell)
|
||||||
|
m = l*(l+1)*(l+2)/6 +1
|
||||||
|
n = (l+1)*(l+2)*(l+3)/6
|
||||||
|
do il = m, n
|
||||||
|
kil(k) = il
|
||||||
|
kshell(k) = ishell
|
||||||
|
k = k+1
|
||||||
|
end do
|
||||||
|
end do
|
||||||
end do
|
end do
|
||||||
|
knucl(nucl_num+1) = ao_num+1
|
||||||
|
|
||||||
|
|
||||||
info = QMCKL_SUCCESS
|
info = QMCKL_SUCCESS
|
||||||
|
|
||||||
! Don't compute polynomials when the radial part is zero.
|
! Don't compute polynomials when the radial part is zero.
|
||||||
! TODO : Use numerical precision here
|
! TODO : Use numerical precision here
|
||||||
cutoff = -dlog(1.d-15)
|
cutoff = -dlog(1.d-12)
|
||||||
|
|
||||||
do ipoint = 1, point_num
|
do ipoint = 1, point_num
|
||||||
e_coord(1) = coord(ipoint,1)
|
e_coord(1) = coord(ipoint,1)
|
||||||
e_coord(2) = coord(ipoint,2)
|
e_coord(2) = coord(ipoint,2)
|
||||||
e_coord(3) = coord(ipoint,3)
|
e_coord(3) = coord(ipoint,3)
|
||||||
k=1
|
|
||||||
|
! Express the radial part in the AO basis
|
||||||
|
|
||||||
do inucl=1,nucl_num
|
do inucl=1,nucl_num
|
||||||
n_coord(1) = nucl_coord(inucl,1)
|
n_coord(1) = nucl_coord(inucl,1)
|
||||||
n_coord(2) = nucl_coord(inucl,2)
|
n_coord(2) = nucl_coord(inucl,2)
|
||||||
@ -4417,62 +4437,50 @@ integer function qmckl_compute_ao_vgl_f(context, &
|
|||||||
y = e_coord(2) - n_coord(2)
|
y = e_coord(2) - n_coord(2)
|
||||||
z = e_coord(3) - n_coord(3)
|
z = e_coord(3) - n_coord(3)
|
||||||
|
|
||||||
r2 = x*x + z*z + z*z
|
r2 = x*x + y*y + z*z
|
||||||
|
|
||||||
if (r2 > cutoff*nucleus_range(inucl)) then
|
if (r2 > cutoff*nucleus_range(inucl)) then
|
||||||
|
do k = knucl(inucl), knucl(inucl+1)-1
|
||||||
|
ao_vgl(k,ipoint,1) = 0.d0
|
||||||
|
ao_vgl(k,ipoint,2) = 0.d0
|
||||||
|
ao_vgl(k,ipoint,3) = 0.d0
|
||||||
|
ao_vgl(k,ipoint,4) = 0.d0
|
||||||
|
ao_vgl(k,ipoint,5) = 0.d0
|
||||||
|
end do
|
||||||
cycle
|
cycle
|
||||||
end if
|
end if
|
||||||
|
|
||||||
! Compute polynomials
|
! Compute polynomials
|
||||||
info = qmckl_ao_polynomial_vgl_f(context, e_coord, n_coord, &
|
info = qmckl_ao_polynomial_vgl_f(context, e_coord, n_coord, &
|
||||||
nucleus_max_ang_mom(inucl), n_poly, powers, 3_8, &
|
nucleus_max_ang_mom(inucl), n_poly, powers, 8_8, poly_vgl, 8_8)
|
||||||
poly_vgl, 5_8)
|
|
||||||
|
|
||||||
! Loop over shells
|
do k = knucl(inucl), knucl(inucl+1)-1
|
||||||
ishell_start = nucleus_index(inucl) + 1
|
y = shell_vgl(kshell(k),ipoint,1) * ao_factor(k)
|
||||||
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
|
|
||||||
do ishell = ishell_start, ishell_end
|
|
||||||
l = shell_ang_mom(ishell)
|
|
||||||
do il = lstart(l), lstart(l+1)-1
|
|
||||||
! Value
|
|
||||||
ao_vgl(k,ipoint,1) = &
|
|
||||||
poly_vgl(1,il) * shell_vgl(ishell,ipoint,1) * ao_factor(k)
|
|
||||||
|
|
||||||
! Grad_x
|
ao_vgl(k,ipoint,1) = y * poly_vgl(1,kil(k))
|
||||||
ao_vgl(k,ipoint,2) = ( &
|
ao_vgl(k,ipoint,2) = y * poly_vgl(2,kil(k))
|
||||||
poly_vgl(2,il) * shell_vgl(ishell,ipoint,1) + &
|
ao_vgl(k,ipoint,3) = y * poly_vgl(3,kil(k))
|
||||||
poly_vgl(1,il) * shell_vgl(ishell,ipoint,2) &
|
ao_vgl(k,ipoint,4) = y * poly_vgl(4,kil(k))
|
||||||
) * ao_factor(k)
|
ao_vgl(k,ipoint,5) = y * poly_vgl(5,kil(k))
|
||||||
|
|
||||||
! Grad_y
|
x = poly_vgl(1,kil(k)) * ao_factor(k)
|
||||||
ao_vgl(k,ipoint,3) = ( &
|
|
||||||
poly_vgl(3,il) * shell_vgl(ishell,ipoint,1) + &
|
|
||||||
poly_vgl(1,il) * shell_vgl(ishell,ipoint,3) &
|
|
||||||
) * ao_factor(k)
|
|
||||||
|
|
||||||
! Grad_z
|
ao_vgl(k,ipoint,2) = ao_vgl(k,ipoint,2) + x * shell_vgl(kshell(k),ipoint,2)
|
||||||
ao_vgl(k,ipoint,4) = ( &
|
ao_vgl(k,ipoint,3) = ao_vgl(k,ipoint,3) + x * shell_vgl(kshell(k),ipoint,3)
|
||||||
poly_vgl(4,il) * shell_vgl(ishell,ipoint,1) + &
|
ao_vgl(k,ipoint,4) = ao_vgl(k,ipoint,4) + x * shell_vgl(kshell(k),ipoint,4)
|
||||||
poly_vgl(1,il) * shell_vgl(ishell,ipoint,4) &
|
ao_vgl(k,ipoint,5) = ao_vgl(k,ipoint,5) + x * shell_vgl(kshell(k),ipoint,5)
|
||||||
) * ao_factor(k)
|
|
||||||
|
|
||||||
! Lapl_z
|
ao_vgl(k,ipoint,5) = ao_vgl(k,ipoint,5) + &
|
||||||
ao_vgl(k,ipoint,5) = ( &
|
(ao_factor(k) + ao_factor(k)) * (&
|
||||||
poly_vgl(5,il) * shell_vgl(ishell,ipoint,1) + &
|
poly_vgl(2,kil(k)) * shell_vgl(kshell(k),ipoint,2) + &
|
||||||
poly_vgl(1,il) * shell_vgl(ishell,ipoint,5) + &
|
poly_vgl(3,kil(k)) * shell_vgl(kshell(k),ipoint,3) + &
|
||||||
2.d0 * ( &
|
poly_vgl(4,kil(k)) * shell_vgl(kshell(k),ipoint,4) )
|
||||||
poly_vgl(2,il) * shell_vgl(ishell,ipoint,2) + &
|
|
||||||
poly_vgl(3,il) * shell_vgl(ishell,ipoint,3) + &
|
|
||||||
poly_vgl(4,il) * shell_vgl(ishell,ipoint,4) ) &
|
|
||||||
) * ao_factor(k)
|
|
||||||
|
|
||||||
k = k+1
|
|
||||||
end do
|
|
||||||
end do
|
end do
|
||||||
|
|
||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
deallocate(poly_vgl, powers)
|
deallocate(poly_vgl, powers, kshell, kil, knucl)
|
||||||
end function qmckl_compute_ao_vgl_f
|
end function qmckl_compute_ao_vgl_f
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user