(git:ccc2433)
ai_overlap3_debug.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Three-center integrals over Cartesian Gaussian-type functions
10 !> \par Literature
11 !> S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
12 !> \par History
13 !> none
14 !> \author Dorothea Golze
15 ! **************************************************************************************************
17 
18  USE kinds, ONLY: dp
19  USE mathconstants, ONLY: pi
20 #include "../base/base_uses.f90"
21 
22  IMPLICIT NONE
23 
24  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_overlap3_debug'
25 
26  INTEGER, PARAMETER :: lmax = 5
27 
28  REAL(dp) :: xa, xb, xc
29  REAL(dp), DIMENSION(3) :: a, b, c
30  REAL(dp), DIMENSION(3) :: p, g
31  REAL(dp) :: xsi, zeta, sss
32 
33  PRIVATE
34  PUBLIC :: init_os_overlap3, os_overlap3
35 
36 CONTAINS
37 
38 ! **************************************************************************************************
39 !> \brief Calculation of three-center integrals over
40 !> Cartesian Gaussian-type functions.
41 !> \param ya ...
42 !> \param yb ...
43 !> \param yc ...
44 !> \param rA ...
45 !> \param rB ...
46 !> \param rC ...
47 ! **************************************************************************************************
48  SUBROUTINE init_os_overlap3(ya, yb, yc, rA, rB, rC)
49  REAL(dp) :: ya, yb, yc
50  REAL(dp), DIMENSION(3) :: ra, rb, rc
51 
52  REAL(dp) :: fpc, ss
53 
54  xa = ya
55  xb = yb
56  xc = yc
57  a = ra
58  b = rb
59  c = rc
60 
61  xsi = xa + xb
62  zeta = xa*xb/xsi
63 
64  p = (xa*a + xb*b)/xsi
65  g = (xsi*p + xc*c)/(xsi + xc)
66 
67  ss = (pi/xsi)**(3._dp/2._dp)*exp(-zeta*sum((a - b)**2))
68 
69  fpc = exp(-xsi*xc/(xsi + xc)*sum((p - c)**2))
70  sss = (xsi/(xsi + xc))**(3._dp/2._dp)*ss*fpc
71 
72  END SUBROUTINE init_os_overlap3
73 
74 ! **************************************************************************************************
75 
76 ! **************************************************************************************************
77 !> \brief ...
78 !> \param an ...
79 !> \param cn ...
80 !> \param bn ...
81 !> \return ...
82 ! **************************************************************************************************
83  RECURSIVE FUNCTION os_overlap3(an, cn, bn) RESULT(IACB)
84  INTEGER, DIMENSION(3) :: an, cn, bn
85  REAL(dp) :: iacb
86 
87  INTEGER, DIMENSION(3), PARAMETER :: i1 = (/1, 0, 0/), i2 = (/0, 1, 0/), &
88  i3 = (/0, 0, 1/)
89 
90  iacb = 0._dp
91  IF (any(an < 0)) RETURN
92  IF (any(bn < 0)) RETURN
93  IF (any(cn < 0)) RETURN
94 
95  IF (sum(an + cn + bn) == 0) THEN
96  iacb = sss
97  RETURN
98  END IF
99 
100  IF (bn(1) > 0) THEN
101  iacb = os_overlap3(an, cn + i1, bn - i1) + (c(1) - b(1))*os_overlap3(an, cn, bn - i1)
102  ELSEIF (bn(2) > 0) THEN
103  iacb = os_overlap3(an, cn + i2, bn - i2) + (c(2) - b(2))*os_overlap3(an, cn, bn - i2)
104  ELSEIF (bn(3) > 0) THEN
105  iacb = os_overlap3(an, cn + i3, bn - i3) + (c(3) - b(3))*os_overlap3(an, cn, bn - i3)
106  ELSE
107  IF (cn(1) > 0) THEN
108  iacb = os_overlap3(an + i1, cn - i1, bn) + (a(1) - c(1))*os_overlap3(an, cn - i1, bn)
109  ELSEIF (cn(2) > 0) THEN
110  iacb = os_overlap3(an + i2, cn - i2, bn) + (a(2) - c(2))*os_overlap3(an, cn - i2, bn)
111  ELSEIF (cn(3) > 0) THEN
112  iacb = os_overlap3(an + i3, cn - i3, bn) + (a(3) - c(3))*os_overlap3(an, cn - i3, bn)
113  ELSE
114  IF (an(1) > 0) THEN
115  iacb = (g(1) - a(1))*os_overlap3(an - i1, cn, bn) + &
116  0.5_dp*(an(1) - 1)/(xsi + xc)*os_overlap3(an - i1 - i1, cn, bn)
117  ELSEIF (an(2) > 0) THEN
118  iacb = (g(2) - a(2))*os_overlap3(an - i2, cn, bn) + &
119  0.5_dp*(an(2) - 1)/(xsi + xc)*os_overlap3(an - i2 - i2, cn, bn)
120  ELSEIF (an(3) > 0) THEN
121  iacb = (g(3) - a(3))*os_overlap3(an - i3, cn, bn) + &
122  0.5_dp*(an(3) - 1)/(xsi + xc)*os_overlap3(an - i3 - i3, cn, bn)
123  ELSE
124  cpabort("I(0000)")
125  END IF
126  END IF
127  END IF
128 
129  END FUNCTION os_overlap3
130 
131 ! **************************************************************************************************
132 
133 END MODULE ai_overlap3_debug
Three-center integrals over Cartesian Gaussian-type functions.
real(dp), dimension(3) a
subroutine, public init_os_overlap3(ya, yb, yc, rA, rB, rC)
Calculation of three-center integrals over Cartesian Gaussian-type functions.
real(dp), dimension(3) c
real(dp), dimension(3) b
integer, parameter lmax
real(dp), dimension(3) g
recursive real(dp) function, public os_overlap3(an, cn, bn)
...
real(dp), dimension(3) p
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public pi
Exchange and Correlation functional calculations.
Definition: xc.F:17