Atomic Orbitals
Table of Contents
This files contains all the routines for the computation of the values, gradients and Laplacian of the atomic basis functions.
4 files are produced:
- a header file :
qmckl_ao.h
- a source file :
qmckl_ao.f90
- a C test file :
test_qmckl_ao.c
- a Fortran test file :
test_qmckl_ao_f.f90
1 Polynomials
\[ P_l(\mathbf{r},\mathbf{R}_i) = (x-X_i)^a (y-Y_i)^b (z-Z_i)^c \]
\begin{eqnarray*} \frac{\partial }{\partial x} P_l\left(\mathbf{r},\mathbf{R}_i \right) & = & a (x-X_i)^{a-1} (y-Y_i)^b (z-Z_i)^c \\ \frac{\partial }{\partial y} P_l\left(\mathbf{r},\mathbf{R}_i \right) & = & b (x-X_i)^a (y-Y_i)^{b-1} (z-Z_i)^c \\ \frac{\partial }{\partial z} P_l\left(\mathbf{r},\mathbf{R}_i \right) & = & c (x-X_i)^a (y-Y_i)^b (z-Z_i)^{c-1} \\ \end{eqnarray*} \begin{eqnarray*} \left( \frac{\partial }{\partial x^2} + \frac{\partial }{\partial y^2} + \frac{\partial }{\partial z^2} \right) P_l \left(\mathbf{r},\mathbf{R}_i \right) & = & a(a-1) (x-X_i)^{a-2} (y-Y_i)^b (z-Z_i)^c + \\ && b(b-1) (x-X_i)^a (y-Y_i)^{b-1} (z-Z_i)^c + \\ && c(c-1) (x-X_i)^a (y-Y_i)^b (z-Z_i)^{c-1} \end{eqnarray*}1.1 qmckl_ao_powers
Computes all the powers of the n
input data up to the given
maximum value given in input for each of the \(n\) points:
\[ P_{ij} = X_j^i \]
1.1.1 Arguments
context |
input | Global state |
n |
input | Number of values |
X(n) |
input | Array containing the input values |
LMAX(n) |
input | Array containing the maximum power for each value |
P(LDP,n) |
output | Array containing all the powers of X |
LDP |
input | Leading dimension of array P |
1.1.2 Requirements
context
is not 0n
> 0X
is allocated with at least \(n \times 8\) bytesLMAX
is allocated with at least \(n \times 4\) bytesP
is allocated with at least \(n \times \max_i \text{LMAX}_i \times 8\) bytesLDP
>= \(\max_i\)LMAX[i]
1.1.3 Header
qmckl_exit_code qmckl_ao_powers(qmckl_context context, int64_t n, double *X, int32_t *LMAX, double *P, int64_t LDP);
1.1.4 Source
integer function qmckl_ao_powers_f(context, n, X, LMAX, P, ldp) result(info) implicit none integer*8 , intent(in) :: context integer*8 , intent(in) :: n real*8 , intent(in) :: X(n) integer , intent(in) :: LMAX(n) real*8 , intent(out) :: P(ldp,n) integer*8 , intent(in) :: ldp integer*8 :: i,j info = 0 if (context == 0_8) then info = -1 return endif if (LDP < MAXVAL(LMAX)) then info = -2 return endif do j=1,n P(1,j) = X(j) do i=2,LMAX(j) P(i,j) = P(i-1,j) * X(j) end do end do end function qmckl_ao_powers_f
1.2 qmckl_ao_polynomial_vgl
Computes the values, gradients and Laplacians at a given point of
all polynomials with an angular momentum up to lmax
.
1.2.1 Arguments
context |
input | Global state |
X(3) |
input | Array containing the coordinates of the points |
R(3) |
input | Array containing the x,y,z coordinates of the center |
lmax |
input | Maximum angular momentum |
n |
output | Number of computed polynomials |
L(ldl,n) |
output | Contains a,b,c for all n results |
ldl |
input | Leading dimension of L |
VGL(ldv,n) |
output | Value, gradients and Laplacian of the polynomials |
ldv |
input | Leading dimension of array VGL |
1.2.2 Requirements
context
is not 0n
> 0X
is allocated with at least \(3 \times 8\) bytesR
is allocated with at least \(3 \times 8\) byteslmax
>= 0- On output,
n
should be equal to (=lmax=+1)(=lmax=+2)(=lmax=+3)/6 L
is allocated with at least \(3 \times n \times 4\) bytesldl
>= 3VGL
is allocated with at least \(5 \times n \times 8\) bytesldv
>= 5
1.2.3 Header
qmckl_exit_code qmckl_ao_polynomial_vgl(qmckl_context context, double *X, double *R, int32_t lmax, int64_t *n, int32_t *L, int64_t ldl, double *VGL, int64_t ldv);
1.2.4 Source
integer function qmckl_ao_polynomial_vgl_f(context, X, R, lmax, n, L, ldl, VGL, ldv) result(info) implicit none integer*8 , intent(in) :: context real*8 , intent(in) :: X(3), R(3) integer , intent(in) :: lmax integer*8 , intent(out) :: n integer , intent(out) :: L(ldl,(lmax+1)*(lmax+2)*(lmax+3)/6) integer*8 , intent(in) :: ldl real*8 , intent(out) :: VGL(ldv,(lmax+1)*(lmax+2)*(lmax+3)/6) integer*8 , intent(in) :: ldv integer*8 :: i,j integer :: a,b,c,d real*8 :: Y(3) integer :: lmax_array(3) real*8 :: pows(-2:lmax,3) integer, external :: qmckl_ao_powers_f double precision :: xy, yz, xz double precision :: da, db, dc, dd info = 0 if (context == 0_8) then info = -1 return endif n = (lmax+1)*(lmax+2)*(lmax+3)/6 if (ldl < 3) then info = -2 return endif if (ldv < 5) then info = -3 return endif do i=1,3 Y(i) = X(i) - R(i) end do pows(-2:-1,1:3) = 0.d0 pows(0,1:3) = 1.d0 lmax_array(1:3) = lmax info = qmckl_ao_powers_f(context, 1_8, Y(1), (/lmax/), pows(1,1), size(pows,1,kind=8)) if (info /= 0) return info = qmckl_ao_powers_f(context, 1_8, Y(2), (/lmax/), pows(1,2), size(pows,1,kind=8)) if (info /= 0) return info = qmckl_ao_powers_f(context, 1_8, Y(3), (/lmax/), pows(1,3), size(pows,1,kind=8)) if (info /= 0) return n=1 vgl(1:5,1:n) = 0.d0 l(1:3,n) = 0 vgl(1,n) = 1.d0 dd = 1.d0 do d=1,lmax da = 0.d0 do a=0,d db = 0.d0 do b=0,d-a c = d - a - b dc = dd - da - db n = n+1 l(1,n) = a l(2,n) = b l(3,n) = c xy = pows(a,1) * pows(b,2) yz = pows(b,2) * pows(c,3) xz = pows(a,1) * pows(c,3) vgl(1,n) = xy * pows(c,3) xy = dc * xy xz = db * xz yz = da * yz vgl(2,n) = pows(a-1,1) * yz vgl(3,n) = pows(b-1,2) * xz vgl(4,n) = pows(c-1,3) * xy vgl(5,n) = & (da-1.d0) * pows(a-2,1) * yz + & (db-1.d0) * pows(b-2,2) * xz + & (dc-1.d0) * pows(c-2,3) * xy db = db + 1.d0 end do da = da + 1.d0 end do dd = dd + 1.d0 end do end function qmckl_ao_polynomial_vgl_f