108 SUBROUTINE operator2(cps_operator2, la_max, npgfa, zeta, la_min, lc_max, npgfc, zetc, lc_min, &
109 omega, r_cutoff, rac, rac2, vac, v, maxder, vac_plus)
110 PROCEDURE(
ab_sint_os),
POINTER :: cps_operator2
111 INTEGER,
INTENT(IN) :: la_max, npgfa
112 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zeta
113 INTEGER,
INTENT(IN) :: la_min, lc_max, npgfc
114 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zetc
115 INTEGER,
INTENT(IN) :: lc_min
116 REAL(kind=dp),
INTENT(IN) :: omega, r_cutoff
117 REAL(kind=dp),
DIMENSION(3),
INTENT(IN) :: rac
118 REAL(kind=dp),
INTENT(IN) :: rac2
119 REAL(kind=dp),
DIMENSION(:, :),
INTENT(INOUT) :: vac
120 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
121 INTEGER,
INTENT(IN),
OPTIONAL :: maxder
122 REAL(kind=dp),
DIMENSION(:, :),
OPTIONAL :: vac_plus
124 CHARACTER(len=*),
PARAMETER :: routinen =
'operator2'
126 INTEGER :: ipgf, jpgf, na, nap, nc, ncp, nmax, handle
127 REAL(kind=dp) :: rho, zetp, zetq, zetw
129 CALL timeset(routinen, handle)
133 IF (
PRESENT(maxder))
THEN
137 nmax = la_max + lc_max + 1
149 zetp = 1.0_dp/zeta(ipgf)
150 zetq = 1.0_dp/zetc(jpgf)
151 zetw = 1.0_dp/(zeta(ipgf) + zetc(jpgf))
153 rho = zeta(ipgf)*zetc(jpgf)*zetw
155 CALL cps_operator2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
157 zetp, zetq, zetw, rho, rac, vac, v, na, nc, nap, ncp, &
158 maxder=maxder, vac_plus=vac_plus)
161 IF (
PRESENT(maxder))
THEN
162 na = na +
ncoset(la_max - maxder)
166 nap = nap +
ncoset(la_max)
169 CALL timestop(handle)
197 zetw, rho, rac, vac, v, na, nc, nap, ncp, maxder, vac_plus)
198 INTEGER,
INTENT(IN) :: la_max, la_min, lc_max, lc_min
199 REAL(kind=dp),
INTENT(IN) :: zeta_a, zeta_c, zetp, zetq, zetw, rho
200 REAL(kind=dp),
DIMENSION(3),
INTENT(IN) :: rac
201 REAL(kind=dp),
DIMENSION(:, :),
INTENT(INOUT) :: vac
202 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
203 INTEGER,
INTENT(IN) :: na
204 INTEGER,
INTENT(INOUT) :: nc
205 INTEGER,
INTENT(IN) :: nap
206 INTEGER,
INTENT(INOUT) :: ncp
207 INTEGER,
INTENT(IN),
OPTIONAL :: maxder
208 REAL(kind=dp),
DIMENSION(:, :),
OPTIONAL :: vac_plus
210 INTEGER :: ax, ay, az, coc, cocx, cocy, cocz, cx, &
211 cy, cz, i, j, la, lc, maxder_local, n, &
213 REAL(kind=dp) :: f1, f2, f3, f4, f5, f6, fcx, fcy, fcz
214 REAL(kind=dp),
DIMENSION(3) :: raw, rcw
217 IF (
PRESENT(maxder)) maxder_local = maxder
218 nmax = la_max + lc_max + 1
226 rcw(:) = -zeta_a*zetw*rac(:)
231 v(1, 2, n) = rcw(1)*v(1, 1, n + 1)
232 v(1, 3, n) = rcw(2)*v(1, 1, n + 1)
233 v(1, 4, n) = rcw(3)*v(1, 1, n + 1)
244 v(1,
coset(0, 0, lc), n) = &
245 rcw(3)*v(1,
coset(0, 0, lc - 1), n + 1) + &
246 f1*real(lc - 1, dp)*(v(1,
coset(0, 0, lc - 2), n) + &
247 f2*v(1,
coset(0, 0, lc - 2), n + 1))
250 v(1,
coset(0, 1, cz), n) = rcw(2)*v(1,
coset(0, 0, cz), n + 1)
254 v(1,
coset(0, cy, cz), n) = &
255 rcw(2)*v(1,
coset(0, cy - 1, cz), n + 1) + &
256 f1*real(cy - 1, dp)*(v(1,
coset(0, cy - 2, cz), n) + &
257 f2*v(1,
coset(0, cy - 2, cz), n + 1))
262 v(1,
coset(1, cy, cz), n) = rcw(1)*v(1,
coset(0, cy, cz), n + 1)
266 f6 = f1*real(cx - 1, dp)
269 v(1,
coset(cx, cy, cz), n) = &
270 rcw(1)*v(1,
coset(cx - 1, cy, cz), n + 1) + &
271 f6*(v(1,
coset(cx - 2, cy, cz), n) + &
272 f2*v(1,
coset(cx - 2, cy, cz), n + 1))
290 raw(:) = zeta_c*zetw*rac(:)
295 v(2, 1, n) = raw(1)*v(1, 1, n + 1)
296 v(3, 1, n) = raw(2)*v(1, 1, n + 1)
297 v(4, 1, n) = raw(3)*v(1, 1, n + 1)
308 v(
coset(0, 0, la), 1, n) = &
309 raw(3)*v(
coset(0, 0, la - 1), 1, n + 1) + &
310 f3*real(la - 1, dp)*(v(
coset(0, 0, la - 2), 1, n) + &
311 f4*v(
coset(0, 0, la - 2), 1, n + 1))
314 v(
coset(0, 1, az), 1, n) = raw(2)*v(
coset(0, 0, az), 1, n + 1)
318 v(
coset(0, ay, az), 1, n) = &
319 raw(2)*v(
coset(0, ay - 1, az), 1, n + 1) + &
320 f3*real(ay - 1, dp)*(v(
coset(0, ay - 2, az), 1, n) + &
321 f4*v(
coset(0, ay - 2, az), 1, n + 1))
326 v(
coset(1, ay, az), 1, n) = raw(1)*v(
coset(0, ay, az), 1, n + 1)
330 f6 = f3*real(ax - 1, dp)
333 v(
coset(ax, ay, az), 1, n) = &
334 raw(1)*v(
coset(ax - 1, ay, az), 1, n + 1) + &
335 f6*(v(
coset(ax - 2, ay, az), 1, n) + &
336 f4*v(
coset(ax - 2, ay, az), 1, n + 1))
350 coc =
coset(cx, cy, cz)
351 cocx =
coset(max(0, cx - 1), cy, cz)
352 cocy =
coset(cx, max(0, cy - 1), cz)
353 cocz =
coset(cx, cy, max(0, cz - 1))
355 fcx = f5*real(cx, dp)
356 fcy = f5*real(cy, dp)
357 fcz = f5*real(cz, dp)
362 DO n = 1, nmax - 1 - lc
363 v(2, coc, n) = raw(1)*v(1, coc, n + 1) + fcx*v(1, cocx, n + 1)
364 v(3, coc, n) = raw(2)*v(1, coc, n + 1) + fcy*v(1, cocy, n + 1)
365 v(4, coc, n) = raw(3)*v(1, coc, n + 1) + fcz*v(1, cocz, n + 1)
375 DO n = 1, nmax - la - lc
377 v(
coset(0, 0, la), coc, n) = &
378 raw(3)*v(
coset(0, 0, la - 1), coc, n + 1) + &
379 f3*real(la - 1, dp)*(v(
coset(0, 0, la - 2), coc, n) + &
380 f4*v(
coset(0, 0, la - 2), coc, n + 1)) + &
381 fcz*v(
coset(0, 0, la - 1), cocz, n + 1)
384 v(
coset(0, 1, az), coc, n) = &
385 raw(2)*v(
coset(0, 0, az), coc, n + 1) + &
386 fcy*v(
coset(0, 0, az), cocy, n + 1)
390 v(
coset(0, ay, az), coc, n) = &
391 raw(2)*v(
coset(0, ay - 1, az), coc, n + 1) + &
392 f3*real(ay - 1, dp)*(v(
coset(0, ay - 2, az), coc, n) + &
393 f4*v(
coset(0, ay - 2, az), coc, n + 1)) + &
394 fcy*v(
coset(0, ay - 1, az), cocy, n + 1)
399 v(
coset(1, ay, az), coc, n) = &
400 raw(1)*v(
coset(0, ay, az), coc, n + 1) + &
401 fcx*v(
coset(0, ay, az), cocx, n + 1)
405 f6 = f3*real(ax - 1, dp)
408 v(
coset(ax, ay, az), coc, n) = &
409 raw(1)*v(
coset(ax - 1, ay, az), coc, n + 1) + &
410 f6*(v(
coset(ax - 2, ay, az), coc, n) + &
411 f4*v(
coset(ax - 2, ay, az), coc, n + 1)) + &
412 fcx*v(
coset(ax - 1, ay, az), cocx, n + 1)
427 DO j =
ncoset(lc_min - 1) + 1,
ncoset(lc_max - maxder_local)
428 DO i =
ncoset(la_min - 1) + 1,
ncoset(la_max - maxder_local)
429 vac(na + i, nc + j) = v(i, j, 1)
433 IF (
PRESENT(maxder))
THEN
436 vac_plus(nap + i, ncp + j) = v(i, j, 1)
441 nc = nc +
ncoset(lc_max - maxder_local)
442 ncp = ncp +
ncoset(lc_max)