(git:b279b6b)
ai_angmom.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 Calculation of the angular momentum integrals over
10 !> Cartesian Gaussian-type functions.
11 !> \par Literature
12 !> S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
13 !> \par History
14 !> none
15 !> \author JGH (20.02.2005)
16 ! **************************************************************************************************
17 MODULE ai_angmom
18 
19  USE kinds, ONLY: dp
20  USE mathconstants, ONLY: pi
21  USE orbital_pointers, ONLY: coset,&
22  ncoset
23 #include "../base/base_uses.f90"
24 
25  IMPLICIT NONE
26 
27  PRIVATE
28 
29 ! *** Public subroutines ***
30 
31  PUBLIC :: angmom
32 
33 CONTAINS
34 
35 ! **************************************************************************************************
36 !> \brief ...
37 !> \param la_max ...
38 !> \param npgfa ...
39 !> \param zeta ...
40 !> \param rpgfa ...
41 !> \param la_min ...
42 !> \param lb_max ...
43 !> \param npgfb ...
44 !> \param zetb ...
45 !> \param rpgfb ...
46 !> \param rac ...
47 !> \param rbc ...
48 !> \param angab ...
49 ! **************************************************************************************************
50  SUBROUTINE angmom(la_max, npgfa, zeta, rpgfa, la_min, &
51  lb_max, npgfb, zetb, rpgfb, rac, rbc, angab)
52 
53  INTEGER, INTENT(IN) :: la_max, npgfa
54  REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zeta, rpgfa
55  INTEGER, INTENT(IN) :: la_min, lb_max, npgfb
56  REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zetb, rpgfb
57  REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rac, rbc
58  REAL(kind=dp), DIMENSION(:, :, :), INTENT(OUT) :: angab
59 
60  INTEGER :: ax, ay, az, bx, by, bz, i, ipgf, j, &
61  jpgf, la, la_start, lb, na, nb
62  REAL(kind=dp) :: dab, f0, f1, f2, f3, fx, fy, fz, rab2, &
63  zetp
64  REAL(kind=dp), DIMENSION(3) :: ac1, ac2, ac3, bc1, bc2, bc3, rab, rap, &
65  rbp
66  REAL(kind=dp), &
67  DIMENSION(ncoset(la_max), ncoset(lb_max)) :: s
68  REAL(kind=dp), &
69  DIMENSION(ncoset(la_max), ncoset(lb_max), 3) :: as
70 
71 ! ax,ay,az : Angular momentum index numbers of orbital a.
72 ! bx,by,bz : Angular momentum index numbers of orbital b.
73 ! coset : Cartesian orbital set pointer.
74 ! dab : Distance between the atomic centers a and b.
75 ! l{a,b} : Angular momentum quantum number of shell a or b.
76 ! l{a,b}_max: Maximum angular momentum quantum number of shell a or b.
77 ! l{a,b}_min: Minimum angular momentum quantum number of shell a or b.
78 ! rac : Distance vector between the atomic center a and C.
79 ! rbc : Distance vector between the atomic center b and C.
80 ! rpgf{a,b} : Radius of the primitive Gaussian-type function a or b.
81 ! angab : Shell set of angular momentum integrals.
82 ! zet{a,b} : Exponents of the Gaussian-type functions a or b.
83 ! zetp : Reciprocal of the sum of the exponents of orbital a and b.
84 ! *** Calculate the distance between the centers a and b ***
85 
86  rab = rbc - rac
87  rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
88  dab = sqrt(rab2)
89 
90 ! *** Loop over all pairs of primitive Gaussian-type functions ***
91  angab = 0.0_dp
92  s = 0.0_dp
93  as = 0.0_dp
94 
95  na = 0
96 
97  DO ipgf = 1, npgfa
98 
99  nb = 0
100 
101  DO jpgf = 1, npgfb
102 
103  s = 0.0_dp
104  as = 0.0_dp
105 
106 ! *** Screening ***
107 
108  IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) THEN
109  DO j = nb + 1, nb + ncoset(lb_max)
110  DO i = na + 1, na + ncoset(la_max)
111  angab(i, j, 1) = 0.0_dp
112  angab(i, j, 2) = 0.0_dp
113  angab(i, j, 3) = 0.0_dp
114  END DO
115  END DO
116  nb = nb + ncoset(lb_max)
117  cycle
118  END IF
119 
120 ! *** Calculate some prefactors ***
121 
122  zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
123 
124  f0 = (pi*zetp)**1.5_dp
125  f1 = zetb(jpgf)*zetp
126  f2 = 0.5_dp*zetp
127  !
128  bc1(1) = 0._dp
129  bc1(2) = -f1*rbc(3)
130  bc1(3) = f1*rbc(2)
131  !
132  bc2(1) = f1*rbc(3)
133  bc2(2) = 0._dp
134  bc2(3) = -f1*rbc(1)
135  !
136  bc3(1) = -f1*rbc(2)
137  bc3(2) = f1*rbc(1)
138  bc3(3) = 0._dp
139  !
140  ac1(1) = 0._dp
141  ac1(2) = zeta(ipgf)*zetp*rac(3)
142  ac1(3) = -zeta(ipgf)*zetp*rac(2)
143  !
144  ac2(1) = -zeta(ipgf)*zetp*rac(3)
145  ac2(2) = 0._dp
146  ac2(3) = zeta(ipgf)*zetp*rac(1)
147  !
148  ac3(1) = zeta(ipgf)*zetp*rac(2)
149  ac3(2) = -zeta(ipgf)*zetp*rac(1)
150  ac3(3) = 0._dp
151  !
152 ! *** Calculate the basic two-center overlap integral [s|s] ***
153 ! *** Calculate the basic two-center angular momentum integral [s|L|s] ***
154 
155  s(1, 1) = f0*exp(-zeta(ipgf)*f1*rab2)
156  as(1, 1, 1) = 2._dp*zeta(ipgf)*f1*(rac(2)*rbc(3) - rac(3)*rbc(2))*s(1, 1)
157  as(1, 1, 2) = 2._dp*zeta(ipgf)*f1*(rac(3)*rbc(1) - rac(1)*rbc(3))*s(1, 1)
158  as(1, 1, 3) = 2._dp*zeta(ipgf)*f1*(rac(1)*rbc(2) - rac(2)*rbc(1))*s(1, 1)
159 
160 ! *** Recurrence steps: [s|L|s] -> [a|L|b] ***
161 
162  IF (la_max > 0) THEN
163 
164 ! *** Vertical recurrence steps: [s|L|s] -> [a|L|s] ***
165 
166  rap(:) = f1*rab(:)
167 
168 ! *** [p|s] = (Pi - Ai)*[s|s] (i = x,y,z) ***
169 ! *** [p|Ln|s] = (Pi - Ai)*[s|Ln|s]+xb/(xa+xb)*(1i x BC)*[s|s] (i = x,y,z) ***
170 
171  s(2, 1) = rap(1)*s(1, 1)
172  s(3, 1) = rap(2)*s(1, 1)
173  s(4, 1) = rap(3)*s(1, 1)
174  as(2, 1, 1) = rap(1)*as(1, 1, 1) + bc1(1)*s(1, 1)
175  as(2, 1, 2) = rap(1)*as(1, 1, 2) + bc1(2)*s(1, 1)
176  as(2, 1, 3) = rap(1)*as(1, 1, 3) + bc1(3)*s(1, 1)
177  as(3, 1, 1) = rap(2)*as(1, 1, 1) + bc2(1)*s(1, 1)
178  as(3, 1, 2) = rap(2)*as(1, 1, 2) + bc2(2)*s(1, 1)
179  as(3, 1, 3) = rap(2)*as(1, 1, 3) + bc2(3)*s(1, 1)
180  as(4, 1, 1) = rap(3)*as(1, 1, 1) + bc3(1)*s(1, 1)
181  as(4, 1, 2) = rap(3)*as(1, 1, 2) + bc3(2)*s(1, 1)
182  as(4, 1, 3) = rap(3)*as(1, 1, 3) + bc3(3)*s(1, 1)
183 
184 ! *** [a|s] = (Pi - Ai)*[a-1i|s] + f2*Ni(a-1i)*[a-2i|s] ***
185 ! *** [a|Ln|s] = (Pi - Ai)*[a-1i|Ln|s] + f2*Ni(a-1i)*[a-2i|Ln|s] ***
186 ! *** + xb/(xa+xb)*{(1i x BC)}_n*[a-1i|s] ***
187 
188  DO la = 2, la_max
189 
190 ! *** Increase the angular momentum component z of function a ***
191 
192  s(coset(0, 0, la), 1) = rap(3)*s(coset(0, 0, la - 1), 1) + &
193  f2*real(la - 1, dp)*s(coset(0, 0, la - 2), 1)
194  as(coset(0, 0, la), 1, 1) = rap(3)*as(coset(0, 0, la - 1), 1, 1) + &
195  f2*real(la - 1, dp)*as(coset(0, 0, la - 2), 1, 1) + &
196  bc3(1)*s(coset(0, 0, la - 1), 1)
197  as(coset(0, 0, la), 1, 2) = rap(3)*as(coset(0, 0, la - 1), 1, 2) + &
198  f2*real(la - 1, dp)*as(coset(0, 0, la - 2), 1, 2) + &
199  bc3(2)*s(coset(0, 0, la - 1), 1)
200  as(coset(0, 0, la), 1, 3) = rap(3)*as(coset(0, 0, la - 1), 1, 3) + &
201  f2*real(la - 1, dp)*as(coset(0, 0, la - 2), 1, 3) + &
202  bc3(3)*s(coset(0, 0, la - 1), 1)
203 
204 ! *** Increase the angular momentum component y of function a ***
205 
206  az = la - 1
207  s(coset(0, 1, az), 1) = rap(2)*s(coset(0, 0, az), 1)
208  as(coset(0, 1, az), 1, 1) = rap(2)*as(coset(0, 0, az), 1, 1) + &
209  bc2(1)*s(coset(0, 0, az), 1)
210  as(coset(0, 1, az), 1, 2) = rap(2)*as(coset(0, 0, az), 1, 2) + &
211  bc2(2)*s(coset(0, 0, az), 1)
212  as(coset(0, 1, az), 1, 3) = rap(2)*as(coset(0, 0, az), 1, 3) + &
213  bc2(3)*s(coset(0, 0, az), 1)
214 
215  DO ay = 2, la
216  az = la - ay
217  s(coset(0, ay, az), 1) = rap(2)*s(coset(0, ay - 1, az), 1) + &
218  f2*real(ay - 1, dp)*s(coset(0, ay - 2, az), 1)
219  as(coset(0, ay, az), 1, 1) = rap(2)*as(coset(0, ay - 1, az), 1, 1) + &
220  f2*real(ay - 1, dp)*as(coset(0, ay - 2, az), 1, 1) + &
221  bc2(1)*s(coset(0, ay - 1, az), 1)
222  as(coset(0, ay, az), 1, 2) = rap(2)*as(coset(0, ay - 1, az), 1, 2) + &
223  f2*real(ay - 1, dp)*as(coset(0, ay - 2, az), 1, 2) + &
224  bc2(2)*s(coset(0, ay - 1, az), 1)
225  as(coset(0, ay, az), 1, 3) = rap(2)*as(coset(0, ay - 1, az), 1, 3) + &
226  f2*real(ay - 1, dp)*as(coset(0, ay - 2, az), 1, 3) + &
227  bc2(3)*s(coset(0, ay - 1, az), 1)
228  END DO
229 
230 ! *** Increase the angular momentum component x of function a ***
231 
232  DO ay = 0, la - 1
233  az = la - 1 - ay
234  s(coset(1, ay, az), 1) = rap(1)*s(coset(0, ay, az), 1)
235  as(coset(1, ay, az), 1, 1) = rap(1)*as(coset(0, ay, az), 1, 1) + &
236  bc1(1)*s(coset(0, ay, az), 1)
237  as(coset(1, ay, az), 1, 2) = rap(1)*as(coset(0, ay, az), 1, 2) + &
238  bc1(2)*s(coset(0, ay, az), 1)
239  as(coset(1, ay, az), 1, 3) = rap(1)*as(coset(0, ay, az), 1, 3) + &
240  bc1(3)*s(coset(0, ay, az), 1)
241  END DO
242 
243  DO ax = 2, la
244  f3 = f2*real(ax - 1, dp)
245  DO ay = 0, la - ax
246  az = la - ax - ay
247  s(coset(ax, ay, az), 1) = rap(1)*s(coset(ax - 1, ay, az), 1) + &
248  f3*s(coset(ax - 2, ay, az), 1)
249  as(coset(ax, ay, az), 1, 1) = rap(1)*as(coset(ax - 1, ay, az), 1, 1) + &
250  f3*as(coset(ax - 2, ay, az), 1, 1) + &
251  bc1(1)*s(coset(ax - 1, ay, az), 1)
252  as(coset(ax, ay, az), 1, 2) = rap(1)*as(coset(ax - 1, ay, az), 1, 2) + &
253  f3*as(coset(ax - 2, ay, az), 1, 2) + &
254  bc1(2)*s(coset(ax - 1, ay, az), 1)
255  as(coset(ax, ay, az), 1, 3) = rap(1)*as(coset(ax - 1, ay, az), 1, 3) + &
256  f3*as(coset(ax - 2, ay, az), 1, 3) + &
257  bc1(3)*s(coset(ax - 1, ay, az), 1)
258  END DO
259  END DO
260 
261  END DO
262 
263 ! *** Recurrence steps: [a|L|s] -> [a|L|b] ***
264 
265  IF (lb_max > 0) THEN
266 
267  DO j = 2, ncoset(lb_max)
268  DO i = 1, ncoset(la_max)
269  s(i, j) = 0.0_dp
270  as(i, j, 1) = 0.0_dp
271  as(i, j, 2) = 0.0_dp
272  as(i, j, 3) = 0.0_dp
273  END DO
274  END DO
275 
276 ! *** Horizontal recurrence steps ***
277 
278  rbp(:) = rap(:) - rab(:)
279 
280 ! *** [a|L|p] = [a+1i|Lm|s] - (Bi - Ai)*[a|Lm|s] ***
281 ! *** + [a+1k|s] + (Ak - Ck)*[a|s] eps(i,m,k)
282 
283  IF (lb_max == 1) THEN
284  la_start = la_min
285  ELSE
286  la_start = max(0, la_min - 1)
287  END IF
288 
289  DO la = la_start, la_max - 1
290  DO ax = 0, la
291  DO ay = 0, la - ax
292  az = la - ax - ay
293  s(coset(ax, ay, az), 2) = s(coset(ax + 1, ay, az), 1) - &
294  rab(1)*s(coset(ax, ay, az), 1)
295  s(coset(ax, ay, az), 3) = s(coset(ax, ay + 1, az), 1) - &
296  rab(2)*s(coset(ax, ay, az), 1)
297  s(coset(ax, ay, az), 4) = s(coset(ax, ay, az + 1), 1) - &
298  rab(3)*s(coset(ax, ay, az), 1)
299  as(coset(ax, ay, az), 2, 1) = as(coset(ax + 1, ay, az), 1, 1) - &
300  rab(1)*as(coset(ax, ay, az), 1, 1)
301  as(coset(ax, ay, az), 3, 1) = as(coset(ax, ay + 1, az), 1, 1) - &
302  rab(2)*as(coset(ax, ay, az), 1, 1) &
303  - s(coset(ax, ay, az + 1), 1) - rac(3)*s(coset(ax, ay, az), 1)
304  as(coset(ax, ay, az), 4, 1) = as(coset(ax, ay, az + 1), 1, 1) - &
305  rab(3)*as(coset(ax, ay, az), 1, 1) &
306  + s(coset(ax, ay + 1, az), 1) + rac(2)*s(coset(ax, ay, az), 1)
307  as(coset(ax, ay, az), 2, 2) = as(coset(ax + 1, ay, az), 1, 2) - &
308  rab(1)*as(coset(ax, ay, az), 1, 2) &
309  + s(coset(ax, ay, az + 1), 1) + rac(3)*s(coset(ax, ay, az), 1)
310  as(coset(ax, ay, az), 3, 2) = as(coset(ax, ay + 1, az), 1, 2) - &
311  rab(2)*as(coset(ax, ay, az), 1, 2)
312  as(coset(ax, ay, az), 4, 2) = as(coset(ax, ay, az + 1), 1, 2) - &
313  rab(3)*as(coset(ax, ay, az), 1, 2) &
314  - s(coset(ax + 1, ay, az), 1) - rac(1)*s(coset(ax, ay, az), 1)
315  as(coset(ax, ay, az), 2, 3) = as(coset(ax + 1, ay, az), 1, 3) - &
316  rab(1)*as(coset(ax, ay, az), 1, 3) &
317  - s(coset(ax, ay + 1, az), 1) - rac(2)*s(coset(ax, ay, az), 1)
318  as(coset(ax, ay, az), 3, 3) = as(coset(ax, ay + 1, az), 1, 3) - &
319  rab(2)*as(coset(ax, ay, az), 1, 3) &
320  + s(coset(ax + 1, ay, az), 1) + rac(1)*s(coset(ax, ay, az), 1)
321  as(coset(ax, ay, az), 4, 3) = as(coset(ax, ay, az + 1), 1, 3) - &
322  rab(3)*as(coset(ax, ay, az), 1, 3)
323  END DO
324  END DO
325  END DO
326 
327 ! *** Vertical recurrence step ***
328 
329 ! *** [a|p] = (Pi - Bi)*[a|s] + f2*Ni(a)*[a-1i|s] ***
330 ! *** [a|L|p] = (Pi - Bi)*[a|L|s] + f2*Ni(a)*[a-1i|L|s] ***
331 ! *** + xa/(xa+xb)*(AC x 1i)*[a|s] ***
332 ! *** + 0.5*zetp*SUM_k Nk(a)*(1k x 1i)*[a-1k|s] ***
333 
334  DO ax = 0, la_max
335  fx = f2*real(ax, dp)
336  DO ay = 0, la_max - ax
337  fy = f2*real(ay, dp)
338  az = la_max - ax - ay
339  fz = f2*real(az, dp)
340  IF (ax == 0) THEN
341  s(coset(ax, ay, az), 2) = rbp(1)*s(coset(ax, ay, az), 1)
342  as(coset(ax, ay, az), 2, 1) = rbp(1)*as(coset(ax, ay, az), 1, 1) + &
343  ac1(1)*s(coset(ax, ay, az), 1)
344  as(coset(ax, ay, az), 2, 2) = rbp(1)*as(coset(ax, ay, az), 1, 2) + &
345  ac1(2)*s(coset(ax, ay, az), 1)
346  as(coset(ax, ay, az), 2, 3) = rbp(1)*as(coset(ax, ay, az), 1, 3) + &
347  ac1(3)*s(coset(ax, ay, az), 1)
348  ELSE
349  s(coset(ax, ay, az), 2) = rbp(1)*s(coset(ax, ay, az), 1) + &
350  fx*s(coset(ax - 1, ay, az), 1)
351  as(coset(ax, ay, az), 2, 1) = rbp(1)*as(coset(ax, ay, az), 1, 1) + &
352  fx*as(coset(ax - 1, ay, az), 1, 1) + &
353  ac1(1)*s(coset(ax, ay, az), 1)
354  as(coset(ax, ay, az), 2, 2) = rbp(1)*as(coset(ax, ay, az), 1, 2) + &
355  fx*as(coset(ax - 1, ay, az), 1, 2) + &
356  ac1(2)*s(coset(ax, ay, az), 1)
357  as(coset(ax, ay, az), 2, 3) = rbp(1)*as(coset(ax, ay, az), 1, 3) + &
358  fx*as(coset(ax - 1, ay, az), 1, 3) + &
359  ac1(3)*s(coset(ax, ay, az), 1)
360  END IF
361  IF (az > 0) as(coset(ax, ay, az), 2, 2) = as(coset(ax, ay, az), 2, 2) + &
362  f2*real(az, dp)*s(coset(ax, ay, az - 1), 1)
363  IF (ay > 0) as(coset(ax, ay, az), 2, 3) = as(coset(ax, ay, az), 2, 3) - &
364  f2*real(ay, dp)*s(coset(ax, ay - 1, az), 1)
365  IF (ay == 0) THEN
366  s(coset(ax, ay, az), 3) = rbp(2)*s(coset(ax, ay, az), 1)
367  as(coset(ax, ay, az), 3, 1) = rbp(2)*as(coset(ax, ay, az), 1, 1) + &
368  ac2(1)*s(coset(ax, ay, az), 1)
369  as(coset(ax, ay, az), 3, 2) = rbp(2)*as(coset(ax, ay, az), 1, 2) + &
370  ac2(2)*s(coset(ax, ay, az), 1)
371  as(coset(ax, ay, az), 3, 3) = rbp(2)*as(coset(ax, ay, az), 1, 3) + &
372  ac2(3)*s(coset(ax, ay, az), 1)
373  ELSE
374  s(coset(ax, ay, az), 3) = rbp(2)*s(coset(ax, ay, az), 1) + &
375  fy*s(coset(ax, ay - 1, az), 1)
376  as(coset(ax, ay, az), 3, 1) = rbp(2)*as(coset(ax, ay, az), 1, 1) + &
377  fy*as(coset(ax, ay - 1, az), 1, 1) + &
378  ac2(1)*s(coset(ax, ay, az), 1)
379  as(coset(ax, ay, az), 3, 2) = rbp(2)*as(coset(ax, ay, az), 1, 2) + &
380  fy*as(coset(ax, ay - 1, az), 1, 2) + &
381  ac2(2)*s(coset(ax, ay, az), 1)
382  as(coset(ax, ay, az), 3, 3) = rbp(2)*as(coset(ax, ay, az), 1, 3) + &
383  fy*as(coset(ax, ay - 1, az), 1, 3) + &
384  ac2(3)*s(coset(ax, ay, az), 1)
385  END IF
386  IF (az > 0) as(coset(ax, ay, az), 3, 1) = as(coset(ax, ay, az), 3, 1) - &
387  f2*real(az, dp)*s(coset(ax, ay, az - 1), 1)
388  IF (ax > 0) as(coset(ax, ay, az), 3, 3) = as(coset(ax, ay, az), 3, 3) + &
389  f2*real(ax, dp)*s(coset(ax - 1, ay, az), 1)
390  IF (az == 0) THEN
391  s(coset(ax, ay, az), 4) = rbp(3)*s(coset(ax, ay, az), 1)
392  as(coset(ax, ay, az), 4, 1) = rbp(3)*as(coset(ax, ay, az), 1, 1) + &
393  ac3(1)*s(coset(ax, ay, az), 1)
394  as(coset(ax, ay, az), 4, 2) = rbp(3)*as(coset(ax, ay, az), 1, 2) + &
395  ac3(2)*s(coset(ax, ay, az), 1)
396  as(coset(ax, ay, az), 4, 3) = rbp(3)*as(coset(ax, ay, az), 1, 3) + &
397  ac3(3)*s(coset(ax, ay, az), 1)
398  ELSE
399  s(coset(ax, ay, az), 4) = rbp(3)*s(coset(ax, ay, az), 1) + &
400  fz*s(coset(ax, ay, az - 1), 1)
401  as(coset(ax, ay, az), 4, 1) = rbp(3)*as(coset(ax, ay, az), 1, 1) + &
402  fz*as(coset(ax, ay, az - 1), 1, 1) + &
403  ac3(1)*s(coset(ax, ay, az), 1)
404  as(coset(ax, ay, az), 4, 2) = rbp(3)*as(coset(ax, ay, az), 1, 2) + &
405  fz*as(coset(ax, ay, az - 1), 1, 2) + &
406  ac3(2)*s(coset(ax, ay, az), 1)
407  as(coset(ax, ay, az), 4, 3) = rbp(3)*as(coset(ax, ay, az), 1, 3) + &
408  fz*as(coset(ax, ay, az - 1), 1, 3) + &
409  ac3(3)*s(coset(ax, ay, az), 1)
410  END IF
411  IF (ay > 0) as(coset(ax, ay, az), 4, 1) = as(coset(ax, ay, az), 4, 1) + &
412  f2*real(ay, dp)*s(coset(ax, ay - 1, az), 1)
413  IF (ax > 0) as(coset(ax, ay, az), 4, 2) = as(coset(ax, ay, az), 4, 2) - &
414  f2*real(ax, dp)*s(coset(ax - 1, ay, az), 1)
415  END DO
416  END DO
417 
418 ! *** Recurrence steps: [a|L|p] -> [a|L|b] ***
419 
420  DO lb = 2, lb_max
421 
422 ! *** Horizontal recurrence steps ***
423 
424 ! *** [a|Lm|b] = [a+1i|Lm|b-1i] - (Bi - Ai)*[a|Lm|b-1i] ***
425 ! *** + [a+1k|b-1i] + (Ak - Ck)*[a|b-1i] eps(i,m,k)
426 
427  IF (lb == lb_max) THEN
428  la_start = la_min
429  ELSE
430  la_start = max(0, la_min - 1)
431  END IF
432 
433  DO la = la_start, la_max - 1
434  DO ax = 0, la
435  DO ay = 0, la - ax
436  az = la - ax - ay
437 
438 ! *** Shift of angular momentum component z from a to b ***
439 
440  s(coset(ax, ay, az), coset(0, 0, lb)) = &
441  s(coset(ax, ay, az + 1), coset(0, 0, lb - 1)) - &
442  rab(3)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
443  as(coset(ax, ay, az), coset(0, 0, lb), 1) = &
444  as(coset(ax, ay, az + 1), coset(0, 0, lb - 1), 1) - &
445  rab(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 1) &
446  + s(coset(ax, ay + 1, az), coset(0, 0, lb - 1)) &
447  + rac(2)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
448  as(coset(ax, ay, az), coset(0, 0, lb), 2) = &
449  as(coset(ax, ay, az + 1), coset(0, 0, lb - 1), 2) - &
450  rab(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 2) &
451  - s(coset(ax + 1, ay, az), coset(0, 0, lb - 1)) &
452  - rac(1)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
453  as(coset(ax, ay, az), coset(0, 0, lb), 3) = &
454  as(coset(ax, ay, az + 1), coset(0, 0, lb - 1), 3) - &
455  rab(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 3)
456 
457 ! *** Shift of angular momentum component y from a to b ***
458 
459  DO by = 1, lb
460  bz = lb - by
461  s(coset(ax, ay, az), coset(0, by, bz)) = &
462  s(coset(ax, ay + 1, az), coset(0, by - 1, bz)) - &
463  rab(2)*s(coset(ax, ay, az), coset(0, by - 1, bz))
464  as(coset(ax, ay, az), coset(0, by, bz), 1) = &
465  as(coset(ax, ay + 1, az), coset(0, by - 1, bz), 1) - &
466  rab(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 1) &
467  - s(coset(ax, ay, az + 1), coset(0, by - 1, bz)) &
468  - rac(3)*s(coset(ax, ay, az), coset(0, by - 1, bz))
469  as(coset(ax, ay, az), coset(0, by, bz), 2) = &
470  as(coset(ax, ay + 1, az), coset(0, by - 1, bz), 2) - &
471  rab(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 2)
472  as(coset(ax, ay, az), coset(0, by, bz), 3) = &
473  as(coset(ax, ay + 1, az), coset(0, by - 1, bz), 3) - &
474  rab(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 3) &
475  + s(coset(ax + 1, ay, az), coset(0, by - 1, bz)) &
476  + rac(1)*s(coset(ax, ay, az), coset(0, by - 1, bz))
477  END DO
478 
479 ! *** Shift of angular momentum component x from a to b ***
480 
481  DO bx = 1, lb
482  DO by = 0, lb - bx
483  bz = lb - bx - by
484  s(coset(ax, ay, az), coset(bx, by, bz)) = &
485  s(coset(ax + 1, ay, az), coset(bx - 1, by, bz)) - &
486  rab(1)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
487  as(coset(ax, ay, az), coset(bx, by, bz), 1) = &
488  as(coset(ax + 1, ay, az), coset(bx - 1, by, bz), 1) - &
489  rab(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 1)
490  as(coset(ax, ay, az), coset(bx, by, bz), 2) = &
491  as(coset(ax + 1, ay, az), coset(bx - 1, by, bz), 2) - &
492  rab(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 2) &
493  + s(coset(ax, ay, az + 1), coset(bx - 1, by, bz)) &
494  + rac(3)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
495  as(coset(ax, ay, az), coset(bx, by, bz), 3) = &
496  as(coset(ax + 1, ay, az), coset(bx - 1, by, bz), 3) - &
497  rab(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 3) &
498  - s(coset(ax, ay + 1, az), coset(bx - 1, by, bz)) &
499  - rac(2)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
500  END DO
501  END DO
502 
503  END DO
504  END DO
505  END DO
506 
507 ! *** Vertical recurrence step ***
508 
509 ! *** [a|b] = (Pi - Bi)*[a|b-1i] + f2*Ni(a)*[a-1i|b-1i] + ***
510 ! *** f2*Ni(b-1i)*[a|b-2i] ***
511 ! *** [a|L|b] = (Pi - Bi)*[a|L|b-1i] + f2*Ni(a)*[a-1i|L|b-1i] + ***
512 ! *** f2*Ni(b-1i)*[a|L|b-2i] ***
513 ! *** + xa/(xa+xb)*(AC x 1i)*[a|b-1i] ***
514 ! *** + 0.5*zetp*SUM_k Nk(a)*(1k x 1i)*[a-1k|b-1i] ***
515 
516  DO ax = 0, la_max
517  fx = f2*real(ax, dp)
518  DO ay = 0, la_max - ax
519  fy = f2*real(ay, dp)
520  az = la_max - ax - ay
521  fz = f2*real(az, dp)
522 
523 ! *** Increase the angular momentum component z of function b ***
524 
525  f3 = f2*real(lb - 1, dp)
526 
527  IF (az == 0) THEN
528  s(coset(ax, ay, az), coset(0, 0, lb)) = &
529  rbp(3)*s(coset(ax, ay, az), coset(0, 0, lb - 1)) + &
530  f3*s(coset(ax, ay, az), coset(0, 0, lb - 2))
531  as(coset(ax, ay, az), coset(0, 0, lb), 1) = &
532  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 1) + &
533  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 1) + &
534  ac3(1)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
535  as(coset(ax, ay, az), coset(0, 0, lb), 2) = &
536  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 2) + &
537  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 2) + &
538  ac3(2)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
539  as(coset(ax, ay, az), coset(0, 0, lb), 3) = &
540  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 3) + &
541  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 3) + &
542  ac3(3)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
543  ELSE
544  s(coset(ax, ay, az), coset(0, 0, lb)) = &
545  rbp(3)*s(coset(ax, ay, az), coset(0, 0, lb - 1)) + &
546  fz*s(coset(ax, ay, az - 1), coset(0, 0, lb - 1)) + &
547  f3*s(coset(ax, ay, az), coset(0, 0, lb - 2))
548  as(coset(ax, ay, az), coset(0, 0, lb), 1) = &
549  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 1) + &
550  fz*as(coset(ax, ay, az - 1), coset(0, 0, lb - 1), 1) + &
551  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 1) + &
552  ac3(1)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
553  as(coset(ax, ay, az), coset(0, 0, lb), 2) = &
554  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 2) + &
555  fz*as(coset(ax, ay, az - 1), coset(0, 0, lb - 1), 2) + &
556  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 2) + &
557  ac3(2)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
558  as(coset(ax, ay, az), coset(0, 0, lb), 3) = &
559  rbp(3)*as(coset(ax, ay, az), coset(0, 0, lb - 1), 3) + &
560  fz*as(coset(ax, ay, az - 1), coset(0, 0, lb - 1), 3) + &
561  f3*as(coset(ax, ay, az), coset(0, 0, lb - 2), 3) + &
562  ac3(3)*s(coset(ax, ay, az), coset(0, 0, lb - 1))
563  END IF
564  IF (ay > 0) as(coset(ax, ay, az), coset(0, 0, lb), 1) = &
565  as(coset(ax, ay, az), coset(0, 0, lb), 1) + &
566  f2*real(ay, dp)*s(coset(ax, ay - 1, az), coset(0, 0, lb - 1))
567  IF (ax > 0) as(coset(ax, ay, az), coset(0, 0, lb), 2) = &
568  as(coset(ax, ay, az), coset(0, 0, lb), 2) - &
569  f2*real(ax, dp)*s(coset(ax - 1, ay, az), coset(0, 0, lb - 1))
570 
571 ! *** Increase the angular momentum component y of function b ***
572 
573  IF (ay == 0) THEN
574  bz = lb - 1
575  s(coset(ax, ay, az), coset(0, 1, bz)) = &
576  rbp(2)*s(coset(ax, ay, az), coset(0, 0, bz))
577  as(coset(ax, ay, az), coset(0, 1, bz), 1) = &
578  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 1) + &
579  ac2(1)*s(coset(ax, ay, az), coset(0, 0, bz))
580  as(coset(ax, ay, az), coset(0, 1, bz), 2) = &
581  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 2) + &
582  ac2(2)*s(coset(ax, ay, az), coset(0, 0, bz))
583  as(coset(ax, ay, az), coset(0, 1, bz), 3) = &
584  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 3) + &
585  ac2(3)*s(coset(ax, ay, az), coset(0, 0, bz))
586  IF (az > 0) as(coset(ax, ay, az), coset(0, 1, bz), 1) = &
587  as(coset(ax, ay, az), coset(0, 1, bz), 1) - &
588  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, 0, bz))
589  IF (ax > 0) as(coset(ax, ay, az), coset(0, 1, bz), 3) = &
590  as(coset(ax, ay, az), coset(0, 1, bz), 3) + &
591  f2*real(ax, dp)*s(coset(ax - 1, ay, az), coset(0, 0, bz))
592  DO by = 2, lb
593  bz = lb - by
594  f3 = f2*real(by - 1, dp)
595  s(coset(ax, ay, az), coset(0, by, bz)) = &
596  rbp(2)*s(coset(ax, ay, az), coset(0, by - 1, bz)) + &
597  f3*s(coset(ax, ay, az), coset(0, by - 2, bz))
598  as(coset(ax, ay, az), coset(0, by, bz), 1) = &
599  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 1) + &
600  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 1) + &
601  ac2(1)*s(coset(ax, ay, az), coset(0, by - 1, bz))
602  as(coset(ax, ay, az), coset(0, by, bz), 2) = &
603  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 2) + &
604  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 2) + &
605  ac2(2)*s(coset(ax, ay, az), coset(0, by - 1, bz))
606  as(coset(ax, ay, az), coset(0, by, bz), 3) = &
607  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 3) + &
608  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 3) + &
609  ac2(3)*s(coset(ax, ay, az), coset(0, by - 1, bz))
610  IF (az > 0) as(coset(ax, ay, az), coset(0, by, bz), 1) = &
611  as(coset(ax, ay, az), coset(0, by, bz), 1) - &
612  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, by - 1, bz))
613  IF (ax > 0) as(coset(ax, ay, az), coset(0, by, bz), 3) = &
614  as(coset(ax, ay, az), coset(0, by, bz), 3) + &
615  f2*real(ax, dp)*s(coset(ax - 1, ay, az), coset(0, by - 1, bz))
616  END DO
617  ELSE
618  bz = lb - 1
619  s(coset(ax, ay, az), coset(0, 1, bz)) = &
620  rbp(2)*s(coset(ax, ay, az), coset(0, 0, bz)) + &
621  fy*s(coset(ax, ay - 1, az), coset(0, 0, bz))
622  as(coset(ax, ay, az), coset(0, 1, bz), 1) = &
623  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 1) + &
624  fy*as(coset(ax, ay - 1, az), coset(0, 0, bz), 1) + &
625  ac2(1)*s(coset(ax, ay, az), coset(0, 0, bz))
626  as(coset(ax, ay, az), coset(0, 1, bz), 2) = &
627  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 2) + &
628  fy*as(coset(ax, ay - 1, az), coset(0, 0, bz), 2) + &
629  ac2(2)*s(coset(ax, ay, az), coset(0, 0, bz))
630  as(coset(ax, ay, az), coset(0, 1, bz), 3) = &
631  rbp(2)*as(coset(ax, ay, az), coset(0, 0, bz), 3) + &
632  fy*as(coset(ax, ay - 1, az), coset(0, 0, bz), 3) + &
633  ac2(3)*s(coset(ax, ay, az), coset(0, 0, bz))
634  IF (az > 0) as(coset(ax, ay, az), coset(0, 1, bz), 1) = &
635  as(coset(ax, ay, az), coset(0, 1, bz), 1) - &
636  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, 0, bz))
637  IF (ax > 0) as(coset(ax, ay, az), coset(0, 1, bz), 3) = &
638  as(coset(ax, ay, az), coset(0, 1, bz), 3) + &
639  f2*real(ax, dp)*s(coset(ax - 1, ay, az), coset(0, 0, bz))
640  DO by = 2, lb
641  bz = lb - by
642  f3 = f2*real(by - 1, dp)
643  s(coset(ax, ay, az), coset(0, by, bz)) = &
644  rbp(2)*s(coset(ax, ay, az), coset(0, by - 1, bz)) + &
645  fy*s(coset(ax, ay - 1, az), coset(0, by - 1, bz)) + &
646  f3*s(coset(ax, ay, az), coset(0, by - 2, bz))
647  as(coset(ax, ay, az), coset(0, by, bz), 1) = &
648  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 1) + &
649  fy*as(coset(ax, ay - 1, az), coset(0, by - 1, bz), 1) + &
650  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 1) + &
651  ac2(1)*s(coset(ax, ay, az), coset(0, by - 1, bz))
652  as(coset(ax, ay, az), coset(0, by, bz), 2) = &
653  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 2) + &
654  fy*as(coset(ax, ay - 1, az), coset(0, by - 1, bz), 2) + &
655  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 2) + &
656  ac2(2)*s(coset(ax, ay, az), coset(0, by - 1, bz))
657  as(coset(ax, ay, az), coset(0, by, bz), 3) = &
658  rbp(2)*as(coset(ax, ay, az), coset(0, by - 1, bz), 3) + &
659  fy*as(coset(ax, ay - 1, az), coset(0, by - 1, bz), 3) + &
660  f3*as(coset(ax, ay, az), coset(0, by - 2, bz), 3) + &
661  ac2(3)*s(coset(ax, ay, az), coset(0, by - 1, bz))
662  IF (az > 0) as(coset(ax, ay, az), coset(0, by, bz), 1) = &
663  as(coset(ax, ay, az), coset(0, by, bz), 1) - &
664  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, by - 1, bz))
665  IF (ax > 0) as(coset(ax, ay, az), coset(0, by, bz), 3) = &
666  as(coset(ax, ay, az), coset(0, by, bz), 3) + &
667  f2*real(ax, dp)*s(coset(ax - 1, ay, az), coset(0, by - 1, bz))
668  END DO
669  END IF
670 
671 ! *** Increase the angular momentum component x of function b ***
672 
673  IF (ax == 0) THEN
674  DO by = 0, lb - 1
675  bz = lb - 1 - by
676  s(coset(ax, ay, az), coset(1, by, bz)) = &
677  rbp(1)*s(coset(ax, ay, az), coset(0, by, bz))
678  as(coset(ax, ay, az), coset(1, by, bz), 1) = &
679  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 1) + &
680  ac1(1)*s(coset(ax, ay, az), coset(0, by, bz))
681  as(coset(ax, ay, az), coset(1, by, bz), 2) = &
682  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 2) + &
683  ac1(2)*s(coset(ax, ay, az), coset(0, by, bz))
684  as(coset(ax, ay, az), coset(1, by, bz), 3) = &
685  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 3) + &
686  ac1(3)*s(coset(ax, ay, az), coset(0, by, bz))
687  IF (az > 0) as(coset(ax, ay, az), coset(1, by, bz), 2) = &
688  as(coset(ax, ay, az), coset(1, by, bz), 2) + &
689  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, by, bz))
690  IF (ay > 0) as(coset(ax, ay, az), coset(1, by, bz), 3) = &
691  as(coset(ax, ay, az), coset(1, by, bz), 3) - &
692  f2*real(ay, dp)*s(coset(ax, ay - 1, az), coset(0, by, bz))
693  END DO
694  DO bx = 2, lb
695  f3 = f2*real(bx - 1, dp)
696  DO by = 0, lb - bx
697  bz = lb - bx - by
698  s(coset(ax, ay, az), coset(bx, by, bz)) = &
699  rbp(1)*s(coset(ax, ay, az), coset(bx - 1, by, bz)) + &
700  f3*s(coset(ax, ay, az), coset(bx - 2, by, bz))
701  as(coset(ax, ay, az), coset(bx, by, bz), 1) = &
702  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 1) + &
703  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 1) + &
704  ac1(1)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
705  as(coset(ax, ay, az), coset(bx, by, bz), 2) = &
706  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 2) + &
707  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 2) + &
708  ac1(2)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
709  as(coset(ax, ay, az), coset(bx, by, bz), 3) = &
710  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 3) + &
711  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 3) + &
712  ac1(3)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
713  IF (az > 0) as(coset(ax, ay, az), coset(bx, by, bz), 2) = &
714  as(coset(ax, ay, az), coset(bx, by, bz), 2) + &
715  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(bx - 1, by, bz))
716  IF (ay > 0) as(coset(ax, ay, az), coset(bx, by, bz), 3) = &
717  as(coset(ax, ay, az), coset(bx, by, bz), 3) - &
718  f2*real(ay, dp)*s(coset(ax, ay - 1, az), coset(bx - 1, by, bz))
719  END DO
720  END DO
721  ELSE
722  DO by = 0, lb - 1
723  bz = lb - 1 - by
724  s(coset(ax, ay, az), coset(1, by, bz)) = &
725  rbp(1)*s(coset(ax, ay, az), coset(0, by, bz)) + &
726  fx*s(coset(ax - 1, ay, az), coset(0, by, bz))
727  as(coset(ax, ay, az), coset(1, by, bz), 1) = &
728  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 1) + &
729  fx*as(coset(ax - 1, ay, az), coset(0, by, bz), 1) + &
730  ac1(1)*s(coset(ax, ay, az), coset(0, by, bz))
731  as(coset(ax, ay, az), coset(1, by, bz), 2) = &
732  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 2) + &
733  fx*as(coset(ax - 1, ay, az), coset(0, by, bz), 2) + &
734  ac1(2)*s(coset(ax, ay, az), coset(0, by, bz))
735  as(coset(ax, ay, az), coset(1, by, bz), 3) = &
736  rbp(1)*as(coset(ax, ay, az), coset(0, by, bz), 3) + &
737  fx*as(coset(ax - 1, ay, az), coset(0, by, bz), 3) + &
738  ac1(3)*s(coset(ax, ay, az), coset(0, by, bz))
739  IF (az > 0) as(coset(ax, ay, az), coset(1, by, bz), 2) = &
740  as(coset(ax, ay, az), coset(1, by, bz), 2) + &
741  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(0, by, bz))
742  IF (ay > 0) as(coset(ax, ay, az), coset(1, by, bz), 3) = &
743  as(coset(ax, ay, az), coset(1, by, bz), 3) - &
744  f2*real(ay, dp)*s(coset(ax, ay - 1, az), coset(0, by, bz))
745  END DO
746  DO bx = 2, lb
747  f3 = f2*real(bx - 1, dp)
748  DO by = 0, lb - bx
749  bz = lb - bx - by
750  s(coset(ax, ay, az), coset(bx, by, bz)) = &
751  rbp(1)*s(coset(ax, ay, az), coset(bx - 1, by, bz)) + &
752  fx*s(coset(ax - 1, ay, az), coset(bx - 1, by, bz)) + &
753  f3*s(coset(ax, ay, az), coset(bx - 2, by, bz))
754  as(coset(ax, ay, az), coset(bx, by, bz), 1) = &
755  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 1) + &
756  fx*as(coset(ax - 1, ay, az), coset(bx - 1, by, bz), 1) + &
757  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 1) + &
758  ac1(1)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
759  as(coset(ax, ay, az), coset(bx, by, bz), 2) = &
760  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 2) + &
761  fx*as(coset(ax - 1, ay, az), coset(bx - 1, by, bz), 2) + &
762  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 2) + &
763  ac1(2)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
764  as(coset(ax, ay, az), coset(bx, by, bz), 3) = &
765  rbp(1)*as(coset(ax, ay, az), coset(bx - 1, by, bz), 3) + &
766  fx*as(coset(ax - 1, ay, az), coset(bx - 1, by, bz), 3) + &
767  f3*as(coset(ax, ay, az), coset(bx - 2, by, bz), 3) + &
768  ac1(3)*s(coset(ax, ay, az), coset(bx - 1, by, bz))
769  IF (az > 0) as(coset(ax, ay, az), coset(bx, by, bz), 2) = &
770  as(coset(ax, ay, az), coset(bx, by, bz), 2) + &
771  f2*real(az, dp)*s(coset(ax, ay, az - 1), coset(bx - 1, by, bz))
772  IF (ay > 0) as(coset(ax, ay, az), coset(bx, by, bz), 3) = &
773  as(coset(ax, ay, az), coset(bx, by, bz), 3) - &
774  f2*real(ay, dp)*s(coset(ax, ay - 1, az), coset(bx - 1, by, bz))
775  END DO
776  END DO
777  END IF
778 
779  END DO
780  END DO
781 
782  END DO
783 
784  END IF
785 
786  ELSE
787 
788  IF (lb_max > 0) THEN
789 
790 ! *** Vertical recurrence steps: [s|L|s] -> [s|L|b] ***
791 
792  rbp(:) = (f1 - 1.0_dp)*rab(:)
793 
794 ! *** [s|p] = (Pi - Bi)*[s|s] ***
795 ! *** [s|L|p] = (Pi - Bi)*[s|L|s] + xa/(xa+xb)*(AC x 1i)*[s|s] ***
796 
797  s(1, 2) = rbp(1)*s(1, 1)
798  s(1, 3) = rbp(2)*s(1, 1)
799  s(1, 4) = rbp(3)*s(1, 1)
800  as(1, 2, 1) = rbp(1)*as(1, 1, 1) + ac1(1)*s(1, 1)
801  as(1, 2, 2) = rbp(1)*as(1, 1, 2) + ac1(2)*s(1, 1)
802  as(1, 2, 3) = rbp(1)*as(1, 1, 3) + ac1(3)*s(1, 1)
803  as(1, 3, 1) = rbp(2)*as(1, 1, 1) + ac2(1)*s(1, 1)
804  as(1, 3, 2) = rbp(2)*as(1, 1, 2) + ac2(2)*s(1, 1)
805  as(1, 3, 3) = rbp(2)*as(1, 1, 3) + ac2(3)*s(1, 1)
806  as(1, 4, 1) = rbp(3)*as(1, 1, 1) + ac3(1)*s(1, 1)
807  as(1, 4, 2) = rbp(3)*as(1, 1, 2) + ac3(2)*s(1, 1)
808  as(1, 4, 3) = rbp(3)*as(1, 1, 3) + ac3(3)*s(1, 1)
809 
810 ! *** [s|b] = (Pi - Bi)*[s|b-1i] + f2*Ni(b-1i)*[s|b-2i] ***
811 ! *** [s|L|b] = (Pi - Bi)*[s|L|b-1i] + f2*Ni(b-1i)*[s|L|b-2i] ***
812 ! *** + xa/(xa+xb)*(AC x 1i)*[s|s-1i] ***
813 
814  DO lb = 2, lb_max
815 
816 ! *** Increase the angular momentum component z of function b ***
817 
818  s(1, coset(0, 0, lb)) = rbp(3)*s(1, coset(0, 0, lb - 1)) + &
819  f2*real(lb - 1, dp)*s(1, coset(0, 0, lb - 2))
820  as(1, coset(0, 0, lb), 1) = rbp(3)*as(1, coset(0, 0, lb - 1), 1) + &
821  f2*real(lb - 1, dp)*as(1, coset(0, 0, lb - 2), 1) + &
822  ac3(1)*s(1, coset(0, 0, lb - 1))
823  as(1, coset(0, 0, lb), 2) = rbp(3)*as(1, coset(0, 0, lb - 1), 2) + &
824  f2*real(lb - 1, dp)*as(1, coset(0, 0, lb - 2), 2) + &
825  ac3(2)*s(1, coset(0, 0, lb - 1))
826  as(1, coset(0, 0, lb), 3) = rbp(3)*as(1, coset(0, 0, lb - 1), 3) + &
827  f2*real(lb - 1, dp)*as(1, coset(0, 0, lb - 2), 3) + &
828  ac3(3)*s(1, coset(0, 0, lb - 1))
829 
830 ! *** Increase the angular momentum component y of function b ***
831 
832  bz = lb - 1
833  s(1, coset(0, 1, bz)) = rbp(2)*s(1, coset(0, 0, bz))
834  as(1, coset(0, 1, bz), 1) = rbp(2)*as(1, coset(0, 0, bz), 1) + &
835  ac2(1)*s(1, coset(0, 0, bz))
836  as(1, coset(0, 1, bz), 2) = rbp(2)*as(1, coset(0, 0, bz), 2) + &
837  ac2(2)*s(1, coset(0, 0, bz))
838  as(1, coset(0, 1, bz), 3) = rbp(2)*as(1, coset(0, 0, bz), 3) + &
839  ac2(3)*s(1, coset(0, 0, bz))
840 
841  DO by = 2, lb
842  bz = lb - by
843  s(1, coset(0, by, bz)) = rbp(2)*s(1, coset(0, by - 1, bz)) + &
844  f2*real(by - 1, dp)*s(1, coset(0, by - 2, bz))
845  as(1, coset(0, by, bz), 1) = rbp(2)*as(1, coset(0, by - 1, bz), 1) + &
846  f2*real(by - 1, dp)*as(1, coset(0, by - 2, bz), 1) + &
847  ac2(1)*s(1, coset(0, by - 1, bz))
848  as(1, coset(0, by, bz), 2) = rbp(2)*as(1, coset(0, by - 1, bz), 2) + &
849  f2*real(by - 1, dp)*as(1, coset(0, by - 2, bz), 2) + &
850  ac2(2)*s(1, coset(0, by - 1, bz))
851  as(1, coset(0, by, bz), 3) = rbp(2)*as(1, coset(0, by - 1, bz), 3) + &
852  f2*real(by - 1, dp)*as(1, coset(0, by - 2, bz), 3) + &
853  ac2(3)*s(1, coset(0, by - 1, bz))
854  END DO
855 
856 ! *** Increase the angular momentum component x of function b ***
857 
858  DO by = 0, lb - 1
859  bz = lb - 1 - by
860  s(1, coset(1, by, bz)) = rbp(1)*s(1, coset(0, by, bz))
861  as(1, coset(1, by, bz), 1) = rbp(1)*as(1, coset(0, by, bz), 1) + &
862  ac1(1)*s(1, coset(0, by, bz))
863  as(1, coset(1, by, bz), 2) = rbp(1)*as(1, coset(0, by, bz), 2) + &
864  ac1(2)*s(1, coset(0, by, bz))
865  as(1, coset(1, by, bz), 3) = rbp(1)*as(1, coset(0, by, bz), 3) + &
866  ac1(3)*s(1, coset(0, by, bz))
867  END DO
868 
869  DO bx = 2, lb
870  f3 = f2*real(bx - 1, dp)
871  DO by = 0, lb - bx
872  bz = lb - bx - by
873  s(1, coset(bx, by, bz)) = rbp(1)*s(1, coset(bx - 1, by, bz)) + &
874  f3*s(1, coset(bx - 2, by, bz))
875  as(1, coset(bx, by, bz), 1) = rbp(1)*as(1, coset(bx - 1, by, bz), 1) + &
876  f3*as(1, coset(bx - 2, by, bz), 1) + &
877  ac1(1)*s(1, coset(bx - 1, by, bz))
878  as(1, coset(bx, by, bz), 2) = rbp(1)*as(1, coset(bx - 1, by, bz), 2) + &
879  f3*as(1, coset(bx - 2, by, bz), 2) + &
880  ac1(2)*s(1, coset(bx - 1, by, bz))
881  as(1, coset(bx, by, bz), 3) = rbp(1)*as(1, coset(bx - 1, by, bz), 3) + &
882  f3*as(1, coset(bx - 2, by, bz), 3) + &
883  ac1(3)*s(1, coset(bx - 1, by, bz))
884  END DO
885  END DO
886 
887  END DO
888 
889  END IF
890 
891  END IF
892 
893  DO j = 1, ncoset(lb_max)
894  DO i = 1, ncoset(la_max)
895  angab(na + i, nb + j, 1) = as(i, j, 1)
896  angab(na + i, nb + j, 2) = as(i, j, 2)
897  angab(na + i, nb + j, 3) = as(i, j, 3)
898  END DO
899  END DO
900 
901  nb = nb + ncoset(lb_max)
902 
903  END DO
904 
905  na = na + ncoset(la_max)
906 
907  END DO
908 
909  END SUBROUTINE angmom
910 
911 END MODULE ai_angmom
Calculation of the angular momentum integrals over Cartesian Gaussian-type functions.
Definition: ai_angmom.F:17
subroutine, public angmom(la_max, npgfa, zeta, rpgfa, la_min, lb_max, npgfb, zetb, rpgfb, rac, rbc, angab)
...
Definition: ai_angmom.F:52
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
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :, :), allocatable, public coset