mirror of
https://github.com/LCPQ/quantum_package
synced 2024-12-23 12:56:14 +01:00
Gained another 21% on AO integrals
This commit is contained in:
parent
56df7257af
commit
1efb1c3687
@ -136,7 +136,7 @@ double precision function ao_bielec_integral_schwartz_accel(i,j,k,l)
|
|||||||
double precision :: thresh
|
double precision :: thresh
|
||||||
thresh = ao_integrals_threshold*ao_integrals_threshold
|
thresh = ao_integrals_threshold*ao_integrals_threshold
|
||||||
|
|
||||||
allocate(schwartz_kl(ao_prim_num(k),ao_prim_num(l)))
|
allocate(schwartz_kl(0:ao_prim_num(l),0:ao_prim_num(k)))
|
||||||
|
|
||||||
|
|
||||||
if (num_i /= num_j .or. num_k /= num_l .or. num_j /= num_k)then
|
if (num_i /= num_j .or. num_k /= num_l .or. num_j /= num_k)then
|
||||||
@ -151,17 +151,23 @@ double precision function ao_bielec_integral_schwartz_accel(i,j,k,l)
|
|||||||
L_center(p) = nucl_coord(num_l,p)
|
L_center(p) = nucl_coord(num_l,p)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
schwartz_kl(0,0) = 0.d0
|
||||||
do r = 1, ao_prim_num(k)
|
do r = 1, ao_prim_num(k)
|
||||||
|
coef1 = ao_coef_transp(r,k)*ao_coef_transp(r,k)
|
||||||
|
schwartz_kl(0,r) = 0.d0
|
||||||
do s = 1, ao_prim_num(l)
|
do s = 1, ao_prim_num(l)
|
||||||
|
coef2 = coef1 * ao_coef_transp(s,l) * ao_coef_transp(s,l)
|
||||||
call give_explicit_poly_and_gaussian(Q_new,Q_center,qq,fact_q,iorder_q,&
|
call give_explicit_poly_and_gaussian(Q_new,Q_center,qq,fact_q,iorder_q,&
|
||||||
ao_expo_transp(r,k),ao_expo_transp(s,l), &
|
ao_expo_transp(r,k),ao_expo_transp(s,l), &
|
||||||
K_power,L_power,K_center,L_center,dim1)
|
K_power,L_power,K_center,L_center,dim1)
|
||||||
q_inv = 1.d0/qq
|
q_inv = 1.d0/qq
|
||||||
schwartz_kl(r,s) = general_primitive_integral(dim1, &
|
schwartz_kl(s,r) = general_primitive_integral(dim1, &
|
||||||
Q_new,Q_center,fact_q,qq,q_inv,iorder_q, &
|
Q_new,Q_center,fact_q,qq,q_inv,iorder_q, &
|
||||||
Q_new,Q_center,fact_q,qq,q_inv,iorder_q)
|
Q_new,Q_center,fact_q,qq,q_inv,iorder_q) &
|
||||||
schwartz_kl(r,s) = schwartz_kl(r,s)
|
* coef2
|
||||||
|
schwartz_kl(0,r) = max(schwartz_kl(0,r),schwartz_kl(s,r))
|
||||||
enddo
|
enddo
|
||||||
|
schwartz_kl(0,0) = max(schwartz_kl(0,r),schwartz_kl(0,0))
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do p = 1, ao_prim_num(i)
|
do p = 1, ao_prim_num(i)
|
||||||
@ -177,17 +183,23 @@ double precision function ao_bielec_integral_schwartz_accel(i,j,k,l)
|
|||||||
p_inv = 1.d0/pp
|
p_inv = 1.d0/pp
|
||||||
schwartz_ij = general_primitive_integral(dim1, &
|
schwartz_ij = general_primitive_integral(dim1, &
|
||||||
P_new,P_center,fact_p,pp,p_inv,iorder_p, &
|
P_new,P_center,fact_p,pp,p_inv,iorder_p, &
|
||||||
P_new,P_center,fact_p,pp,p_inv,iorder_p)
|
P_new,P_center,fact_p,pp,p_inv,iorder_p) * &
|
||||||
schwartz_ij = schwartz_ij
|
coef2*coef2
|
||||||
|
if (schwartz_kl(0,0)*schwartz_ij < thresh) then
|
||||||
|
cycle
|
||||||
|
endif
|
||||||
do r = 1, ao_prim_num(k)
|
do r = 1, ao_prim_num(k)
|
||||||
|
if (schwartz_kl(0,r)*schwartz_ij < thresh) then
|
||||||
|
cycle
|
||||||
|
endif
|
||||||
double precision :: coef3
|
double precision :: coef3
|
||||||
coef3 = coef2*ao_coef_transp(r,k)
|
coef3 = coef2*ao_coef_transp(r,k)
|
||||||
do s = 1, ao_prim_num(l)
|
do s = 1, ao_prim_num(l)
|
||||||
double precision :: coef4
|
double precision :: coef4
|
||||||
coef4 = coef3*ao_coef_transp(s,l)
|
if (schwartz_kl(s,r)*schwartz_ij < thresh) then
|
||||||
if (schwartz_kl(r,s)*schwartz_ij*coef4*coef4 < thresh) then
|
|
||||||
cycle
|
cycle
|
||||||
endif
|
endif
|
||||||
|
coef4 = coef3*ao_coef_transp(s,l)
|
||||||
double precision :: general_primitive_integral
|
double precision :: general_primitive_integral
|
||||||
call give_explicit_poly_and_gaussian(Q_new,Q_center,qq,fact_q,iorder_q,&
|
call give_explicit_poly_and_gaussian(Q_new,Q_center,qq,fact_q,iorder_q,&
|
||||||
ao_expo_transp(r,k),ao_expo_transp(s,l), &
|
ao_expo_transp(r,k),ao_expo_transp(s,l), &
|
||||||
@ -212,14 +224,21 @@ double precision function ao_bielec_integral_schwartz_accel(i,j,k,l)
|
|||||||
enddo
|
enddo
|
||||||
double precision :: ERI
|
double precision :: ERI
|
||||||
|
|
||||||
|
schwartz_kl(0,0) = 0.d0
|
||||||
do r = 1, ao_prim_num(k)
|
do r = 1, ao_prim_num(k)
|
||||||
|
coef1 = ao_coef_transp(r,k)*ao_coef_transp(r,k)
|
||||||
|
schwartz_kl(0,r) = 0.d0
|
||||||
do s = 1, ao_prim_num(l)
|
do s = 1, ao_prim_num(l)
|
||||||
schwartz_kl(r,s) = ERI( &
|
coef2 = coef1*ao_coef_transp(s,l)*ao_coef_transp(s,l)
|
||||||
|
schwartz_kl(s,r) = ERI( &
|
||||||
ao_expo_transp(r,k),ao_expo_transp(s,l),ao_expo_transp(r,k),ao_expo_transp(s,l),&
|
ao_expo_transp(r,k),ao_expo_transp(s,l),ao_expo_transp(r,k),ao_expo_transp(s,l),&
|
||||||
K_power(1),L_power(1),K_power(1),L_power(1), &
|
K_power(1),L_power(1),K_power(1),L_power(1), &
|
||||||
K_power(2),L_power(2),K_power(2),L_power(2), &
|
K_power(2),L_power(2),K_power(2),L_power(2), &
|
||||||
K_power(3),L_power(3),K_power(3),L_power(3))
|
K_power(3),L_power(3),K_power(3),L_power(3)) * &
|
||||||
|
coef2
|
||||||
|
schwartz_kl(0,r) = max(schwartz_kl(0,r),schwartz_kl(s,r))
|
||||||
enddo
|
enddo
|
||||||
|
schwartz_kl(0,0) = max(schwartz_kl(0,r),schwartz_kl(0,0))
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do p = 1, ao_prim_num(i)
|
do p = 1, ao_prim_num(i)
|
||||||
@ -230,14 +249,20 @@ double precision function ao_bielec_integral_schwartz_accel(i,j,k,l)
|
|||||||
ao_expo_transp(p,i),ao_expo_transp(q,j),ao_expo_transp(p,i),ao_expo_transp(q,j),&
|
ao_expo_transp(p,i),ao_expo_transp(q,j),ao_expo_transp(p,i),ao_expo_transp(q,j),&
|
||||||
I_power(1),J_power(1),I_power(1),J_power(1), &
|
I_power(1),J_power(1),I_power(1),J_power(1), &
|
||||||
I_power(2),J_power(2),I_power(2),J_power(2), &
|
I_power(2),J_power(2),I_power(2),J_power(2), &
|
||||||
I_power(3),J_power(3),I_power(3),J_power(3))
|
I_power(3),J_power(3),I_power(3),J_power(3))*coef2*coef2
|
||||||
do r = 1, ao_prim_num(k)
|
if (schwartz_kl(0,0)*schwartz_ij < thresh) then
|
||||||
coef3 = coef2*ao_coef_transp(r,k)
|
|
||||||
do s = 1, ao_prim_num(l)
|
|
||||||
coef4 = coef3*ao_coef_transp(s,l)
|
|
||||||
if (schwartz_kl(r,s)*schwartz_ij*coef4*coef4 < thresh) then
|
|
||||||
cycle
|
cycle
|
||||||
endif
|
endif
|
||||||
|
do r = 1, ao_prim_num(k)
|
||||||
|
if (schwartz_kl(0,r)*schwartz_ij < thresh) then
|
||||||
|
cycle
|
||||||
|
endif
|
||||||
|
coef3 = coef2*ao_coef_transp(r,k)
|
||||||
|
do s = 1, ao_prim_num(l)
|
||||||
|
if (schwartz_kl(s,r)*schwartz_ij < thresh) then
|
||||||
|
cycle
|
||||||
|
endif
|
||||||
|
coef4 = coef3*ao_coef_transp(s,l)
|
||||||
integral = ERI( &
|
integral = ERI( &
|
||||||
ao_expo_transp(p,i),ao_expo_transp(q,j),ao_expo_transp(r,k),ao_expo_transp(s,l),&
|
ao_expo_transp(p,i),ao_expo_transp(q,j),ao_expo_transp(r,k),ao_expo_transp(s,l),&
|
||||||
I_power(1),J_power(1),K_power(1),L_power(1), &
|
I_power(1),J_power(1),K_power(1),L_power(1), &
|
||||||
@ -663,8 +688,9 @@ double precision function ERI(alpha,beta,delta,gama,a_x,b_x,c_x,d_x,a_y,b_y,c_y,
|
|||||||
p = alpha + beta
|
p = alpha + beta
|
||||||
q = delta + gama
|
q = delta + gama
|
||||||
ASSERT (p+q >= 0.d0)
|
ASSERT (p+q >= 0.d0)
|
||||||
n_pt = n_pt_sup(a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z)
|
|
||||||
coeff = pi_5_2 / (p * q * dsqrt(p+q))
|
coeff = pi_5_2 / (p * q * dsqrt(p+q))
|
||||||
|
!DIR$ FORCEINLINE
|
||||||
|
n_pt = n_pt_sup(a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z)
|
||||||
|
|
||||||
if (n_pt == 0) then
|
if (n_pt == 0) then
|
||||||
ERI = coeff
|
ERI = coeff
|
||||||
@ -768,12 +794,12 @@ end
|
|||||||
integer function n_pt_sup(a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z)
|
integer function n_pt_sup(a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z)
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Returns the upper boundary of the degree of the polynom involved in the
|
! Returns the upper boundary of the degree of the polynomial involved in the
|
||||||
! bielctronic integral :
|
! bielctronic integral :
|
||||||
! Ix(a_x,b_x,c_x,d_x) * Iy(a_y,b_y,c_y,d_y) * Iz(a_z,b_z,c_z,d_z)
|
! Ix(a_x,b_x,c_x,d_x) * Iy(a_y,b_y,c_y,d_y) * Iz(a_z,b_z,c_z,d_z)
|
||||||
END_DOC
|
END_DOC
|
||||||
integer :: a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z
|
integer :: a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z
|
||||||
n_pt_sup = 2 * ( (a_x+b_x+c_x+d_x) + (a_y+b_y+c_y+d_y) + (a_z+b_z+c_z+d_z) )
|
n_pt_sup = ishft( a_x+b_x+c_x+d_x + a_y+b_y+c_y+d_y + a_z+b_z+c_z+d_z,1 )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user