10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-06-27 15:42:30 +02:00
quantum_package/plugins/DFT_Utils/grid_density.irp.f
2016-04-17 23:30:04 +02:00

105 lines
3.3 KiB
Fortran

BEGIN_PROVIDER [integer, n_points_angular_grid]
implicit none
n_points_angular_grid = 18
END_PROVIDER
BEGIN_PROVIDER [integer, n_points_radial_grid]
implicit none
n_points_radial_grid = 10
END_PROVIDER
BEGIN_PROVIDER [double precision, angular_quadrature_points, (n_points_angular_grid,3) ]
&BEGIN_PROVIDER [double precision, weights_angular_points, (n_points_angular_grid)]
implicit none
BEGIN_DOC
! weights and grid points for the integration on the angular variables on
! the unit sphere centered on (0,0,0)
END_DOC
call cal_quad(n_points_aangular_grid, angular_quadrature_points,weights_angular_points)
END_PROVIDER
BEGIN_PROVIDER [double precision, grid_points_per_atom, (3,n_points_angular_grid,n_points_radial_grid,nucl_num)]
BEGIN_DOC
! points for integration over space
END_DOC
implicit none
integer :: i,j,k
double precision :: dr,x_ref,y_ref,z_ref
dr = 1.d0/dble(n_points_radial_grid-1)
do i = 1, nucl_num
x_ref = nucl_coord(i,1)
y_ref = nucl_coord(i,2)
z_ref = nucl_coord(i,3)
do j = 1, n_points_radial_grid
do k = 1, n_points_angular_grid
grid_points_per_atom(1,k,j,i) = x_ref + angular_quadrature_points(k,1) * dr
grid_points_per_atom(2,k,j,i) = y_ref + angular_quadrature_points(k,2) * dr
grid_points_per_atom(3,k,j,i) = z_ref + angular_quadrature_points(k,3) * dr
enddo
enddo
enddo
END_PROVIDER
BEGIN_PROVIDER [double precision, weight_functions_at_grid_points, (nucl_num,n_points_angular_grid,n_points_radial_grid) ]
BEGIN_DOC
! Weight function at grid points : w_n(r) according to the equation (22) of Becke original paper (JCP, 88, 1988)
! the "n" discrete variable represents the nucleis (j=1,nucl_num)
END_DOC
implicit none
integer :: i,j,k,l,m
double precision :: r(3)
double precision :: accu,cell_function_becke
double precision :: tmp_array(nucl_num)
do j = 1, nucl_num
do k = 1, n_points_radial_grid
do l = 1, n_points_angular_grid
r(1) = grid_points_per_atom(1,j,k,l)
r(2) = grid_points_per_atom(2,j,k,l)
r(3) = grid_points_per_atom(3,j,k,l)
accu = 0.d0
do i = 1, nucl_num
tmp_array(i) = cell_function_becke(r,i)
accu += tmp_array(i)
enddo
accu = 1.d0/accu
do i = 1, nucl_num
weight_functions_at_grid_points(i,j,k,l) = tmp_array(i)*accu
enddo
enddo
enddo
enddo
END_PROVIDER
BEGIN_PROVIDER [double precision, one_body_dm_mo_alpha_at_grid_points, (n_points_angular_grid,n_points_radial_grid,nucl_num) ]
&BEGIN_PROVIDER [double precision, one_body_dm_mo_beta_at_grid_points, (n_points_angular_grid,n_points_radial_grid,nucl_num) ]
implicit none
integer :: i,j,k,l,m
double precision :: contrib
double precision :: r(3)
double precision :: aos_array(ao_num)
do j = 1, nucl_num
do k = 1, n_points_radial_grid
do l = 1, n_points_angular_grid
r(1) = grid_points_per_atom(1,j,k,l)
r(2) = grid_points_per_atom(2,j,k,l)
r(3) = grid_points_per_atom(3,j,k,l)
call give_all_aos_at_r(r,aos_array)
one_body_dm_mo_alpha_at_grid_points(j,k,l) = 0.d0
do i = 1, ao_num
do m = 1, ao_num
contrib = aos_array(i) * aos_array(m)
one_body_dm_mo_alpha_at_grid_points(j,k,l) += one_body_dm_ao_alpha(i,m) * contrib
one_body_dm_mo_beta_at_grid_points(j,k,l) += one_body_dm_ao_beta(i,m) * contrib
enddo
enddo
enddo
enddo
enddo
END_PROVIDER