subroutine example_becke_numerical_grid implicit none include 'constants.include.F' BEGIN_DOC ! subroutine that illustrates the main features available in becke_numerical_grid END_DOC integer :: i,j,k,ipoint double precision :: integral_1, integral_2,alpha,center(3) print*,'' print*,'**************' print*,'**************' print*,'routine that illustrates the use of the grid' print*,'**************' print*,'This grid is built as the reunion of a spherical grid around each atom' print*,'Each spherical grid contains a certain number of radial and angular points' print*,'' print*,'n_points_integration_angular = ',n_points_integration_angular print*,'n_points_radial_grid = ',n_points_radial_grid print*,'' print*,'As an example of the use of the grid, we will compute the integral of a 3D gaussian' ! parameter of the gaussian: center of the gaussian is set to the first nucleus center(1:3)=nucl_coord(1,1:3) ! alpha = exponent of the gaussian alpha = 1.d0 print*,'' print*,'The first example uses the grid points as one-dimensional array' print*,'This is the mostly used representation of the grid' print*,'It is the easyest way to use it with no drawback in terms of accuracy' integral_1 = 0.d0 ! you browse all the grid points as a one-dimensional array do i = 1, n_points_final_grid double precision :: weight, r(3) ! you get x, y and z of the ith grid point r(1) = final_grid_points(1,i) r(2) = final_grid_points(2,i) r(3) = final_grid_points(3,i) weight = final_weight_at_r_vector(i) double precision :: distance, f_r ! you compute the function to be integrated distance = dsqrt( (r(1) - center(1))**2 + (r(2) - center(2))**2 + (r(3) - center(3))**2 ) f_r = dexp(-alpha * distance*distance) ! you add the contribution of the grid point to the integral integral_1 += f_r * weight enddo print*,'integral_1 =',integral_1 print*,'(pi/alpha)**1.5 =',(pi / alpha)**1.5 print*,'' print*,'' print*,'The second example uses the grid points as a collection of spherical grids centered on each atom' print*,'This is mostly useful if one needs to split contributions between radial/angular/atomic of an integral' ! you browse the nuclei do i = 1, nucl_num ! you browse the radial points attached to each nucleus do j = 1, n_points_radial_grid ! you browse the angular points attached to each radial point of each nucleus do k = 1, n_points_integration_angular r(1) = grid_points_per_atom(1,k,j,i) r(2) = grid_points_per_atom(2,k,j,i) r(3) = grid_points_per_atom(3,k,j,i) weight = final_weight_at_r(k,j,i) distance = dsqrt( (r(1) - center(1))**2 + (r(2) - center(2))**2 + (r(3) - center(3))**2 ) f_r = dexp(-alpha * distance*distance) integral_2 += f_r * weight enddo enddo enddo print*,'integral_2 =',integral_2 print*,'(pi/alpha)**1.5 =',(pi / alpha)**1.5 print*,'' end