10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-07-26 04:37:36 +02:00
quantum_package/src/DensityFit/aux_basis.irp.f

131 lines
3.7 KiB
Fortran

BEGIN_PROVIDER [ integer, aux_basis_num_sqrt ]
&BEGIN_PROVIDER [ integer, aux_basis_num ]
&BEGIN_PROVIDER [ integer, aux_basis_num_8 ]
implicit none
BEGIN_DOC
! Number of auxiliary basis functions
END_DOC
integer :: align_double
if (do_pseudo) then
aux_basis_num_sqrt = ao_num + ao_pseudo_num
! aux_basis_num_sqrt = ao_num
else
endif
aux_basis_num = aux_basis_num_sqrt * (aux_basis_num_sqrt+1)/2
aux_basis_num_8 = align_double(aux_basis_num)
END_PROVIDER
BEGIN_PROVIDER [ integer, aux_basis_idx, (2,aux_basis_num) ]
implicit none
BEGIN_DOC
! aux_basis_idx(k) -> i,j
END_DOC
integer :: i,j,k
k=0
do j=1,aux_basis_num_sqrt
do i=1,j
k = k+1
aux_basis_idx(1,k) = i
aux_basis_idx(2,k) = j
enddo
enddo
END_PROVIDER
BEGIN_PROVIDER [ double precision, aux_basis_expo_transp, (ao_prim_num_max_align,aux_basis_num_sqrt) ]
&BEGIN_PROVIDER [ double precision, aux_basis_coef_transp, (ao_prim_num_max_align,aux_basis_num_sqrt) ]
&BEGIN_PROVIDER [ integer, aux_basis_prim_num, (aux_basis_num_sqrt) ]
&BEGIN_PROVIDER [ integer, aux_basis_power, (aux_basis_num_sqrt,3) ]
&BEGIN_PROVIDER [ integer, aux_basis_nucl, (aux_basis_num_sqrt) ]
implicit none
BEGIN_DOC
! Exponents of the auxiliary basis
END_DOC
integer :: i,j
do j=1,ao_num
do i=1,ao_prim_num_max
aux_basis_expo_transp(i,j) = ao_expo_ordered_transp(i,j)
aux_basis_coef_transp(i,j) = ao_coef_normalized_ordered_transp(i,j)
enddo
enddo
do i=1,ao_num
aux_basis_prim_num(i) = ao_prim_num(i)
aux_basis_nucl(i) = ao_nucl(i)
aux_basis_power(i,1:3) = ao_power(i,1:3)
enddo
do j=1,ao_pseudo_num
aux_basis_expo_transp(1,ao_num+j) = 0.5d0*pseudo_ao_expo(j)
aux_basis_coef_transp(1,ao_num+j) = 1.d0
aux_basis_power(ao_num+j,1:3) = 0
aux_basis_prim_num(ao_num+j) = 1
aux_basis_nucl(ao_num+j) = pseudo_ao_nucl(j)
enddo
END_PROVIDER
BEGIN_PROVIDER [ double precision, aux_basis_overlap_matrix, (aux_basis_num_8,aux_basis_num) ]
implicit none
BEGIN_DOC
! Auxiliary basis set
END_DOC
integer :: m,n,i,j,k,l
double precision :: aux_basis_four_overlap
aux_basis_overlap_matrix(1,1) = aux_basis_four_overlap(1,1,1,1)
!$OMP PARALLEL DO PRIVATE(i,j,k,l,m,n) SCHEDULE(GUIDED)
do m=1,aux_basis_num
i = aux_basis_idx(1,m)
j = aux_basis_idx(2,m)
do n=1,m
k = aux_basis_idx(1,n)
l = aux_basis_idx(2,n)
aux_basis_overlap_matrix(m,n) = aux_basis_four_overlap(i,j,k,l)
aux_basis_overlap_matrix(n,m) = aux_basis_overlap_matrix(m,n)
enddo
enddo
!$OMP END PARALLEL DO
END_PROVIDER
BEGIN_PROVIDER [ double precision, aux_basis_expo, (aux_basis_num_sqrt,aux_basis_prim_num_max) ]
&BEGIN_PROVIDER [ double precision, aux_basis_coef, (aux_basis_num_sqrt,aux_basis_prim_num_max) ]
implicit none
BEGIN_DOC
! Exponents and coefficients of the auxiliary basis
END_DOC
integer :: i,j
aux_basis_expo = 0.d0
aux_basis_coef = 0.d0
do j=1,aux_basis_num_sqrt
do i=1,aux_basis_prim_num(j)
aux_basis_expo(j,i) = aux_basis_expo_transp(i,j)
aux_basis_coef(j,i) = aux_basis_coef_transp(i,j)
enddo
enddo
END_PROVIDER
BEGIN_PROVIDER [ integer, aux_basis_prim_num_max ]
implicit none
BEGIN_DOC
! = ao_prim_num_max
END_DOC
aux_basis_prim_num_max = ao_prim_num_max
END_PROVIDER
subroutine save_aux_basis
implicit none
call ezfio_set_aux_basis_aux_basis_num(aux_basis_num)
call ezfio_set_aux_basis_aux_basis_num_sqrt(aux_basis_num_sqrt)
call ezfio_set_aux_basis_aux_basis_idx(aux_basis_idx)
call ezfio_set_aux_basis_aux_basis_prim_num(aux_basis_prim_num)
call ezfio_set_aux_basis_aux_basis_nucl(aux_basis_nucl)
call ezfio_set_aux_basis_aux_basis_power(aux_basis_power)
call ezfio_set_aux_basis_aux_basis_coef(aux_basis_coef)
call ezfio_set_aux_basis_aux_basis_expo(aux_basis_expo)
end